aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/staging/rt2860/2860_main_dev.c7
-rw-r--r--drivers/staging/rt2860/common/cmm_data.c4
-rw-r--r--drivers/staging/rt2860/common/cmm_data_2860.c144
-rw-r--r--drivers/staging/rt2860/common/cmm_sync.c2
-rw-r--r--drivers/staging/rt2860/common/cmm_wpa.c40
-rw-r--r--drivers/staging/rt2860/common/mlme.c238
-rw-r--r--drivers/staging/rt2860/common/rtmp_init.c128
-rw-r--r--drivers/staging/rt2860/oid.h2
-rw-r--r--drivers/staging/rt2860/rt2860.h4
-rw-r--r--drivers/staging/rt2860/rt_linux.h13
-rw-r--r--drivers/staging/rt2860/rt_main_dev.c30
-rw-r--r--drivers/staging/rt2860/rt_profile.c2
-rw-r--r--drivers/staging/rt2860/rtmp.h37
-rw-r--r--drivers/staging/rt2860/rtmp_def.h27
-rw-r--r--drivers/staging/rt2860/sta/assoc.c23
-rw-r--r--drivers/staging/rt2860/sta/connect.c33
-rw-r--r--drivers/staging/rt2860/sta/rtmp_data.c23
-rw-r--r--drivers/staging/rt2860/sta/sync.c6
-rw-r--r--drivers/staging/rt2860/sta/wpa.c10
-rw-r--r--drivers/staging/rt2860/sta_ioctl.c80
-rw-r--r--drivers/staging/rt2860/wpa.h1
21 files changed, 704 insertions, 150 deletions
diff --git a/drivers/staging/rt2860/2860_main_dev.c b/drivers/staging/rt2860/2860_main_dev.c
index e2f94809ca7..ff7f8338073 100644
--- a/drivers/staging/rt2860/2860_main_dev.c
+++ b/drivers/staging/rt2860/2860_main_dev.c
@@ -746,6 +746,7 @@ rt2860_interrupt(int irq, void *dev_instance)
746 PRTMP_ADAPTER pAd = net_dev->ml_priv; 746 PRTMP_ADAPTER pAd = net_dev->ml_priv;
747 INT_SOURCE_CSR_STRUC IntSource; 747 INT_SOURCE_CSR_STRUC IntSource;
748 POS_COOKIE pObj; 748 POS_COOKIE pObj;
749 BOOLEAN bOldValue;
749 750
750 pObj = (POS_COOKIE) pAd->OS_Cookie; 751 pObj = (POS_COOKIE) pAd->OS_Cookie;
751 752
@@ -778,10 +779,13 @@ rt2860_interrupt(int irq, void *dev_instance)
778 // RT2661 => when ASIC is sleeping, MAC register cannot be read and written. 779 // RT2661 => when ASIC is sleeping, MAC register cannot be read and written.
779 // RT2860 => when ASIC is sleeping, MAC register can be read and written. 780 // RT2860 => when ASIC is sleeping, MAC register can be read and written.
780 781
782 bOldValue = pAd->bPCIclkOff;
783 pAd->bPCIclkOff = FALSE;
781 { 784 {
782 RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IntSource.word); 785 RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IntSource.word);
783 RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, IntSource.word); // write 1 to clear 786 RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, IntSource.word); // write 1 to clear
784 } 787 }
788 pAd->bPCIclkOff = bOldValue;
785 789
786 // Do nothing if Reset in progress 790 // Do nothing if Reset in progress
787 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) || 791 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) ||
@@ -796,8 +800,6 @@ rt2860_interrupt(int irq, void *dev_instance)
796 // The priority can be adjust by altering processing if statement 800 // The priority can be adjust by altering processing if statement
797 // 801 //
798 802
799 pAd->bPCIclkOff = FALSE;
800
801 // If required spinlock, each interrupt service routine has to acquire 803 // If required spinlock, each interrupt service routine has to acquire
802 // and release itself. 804 // and release itself.
803 // 805 //
@@ -806,6 +808,7 @@ rt2860_interrupt(int irq, void *dev_instance)
806 if (IntSource.word == 0xffffffff) 808 if (IntSource.word == 0xffffffff)
807 { 809 {
808 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS); 810 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS);
811 printk("snowpin - IntSource.word == 0xffffffff\n");
809 return IRQ_HANDLED; 812 return IRQ_HANDLED;
810 } 813 }
811 814
diff --git a/drivers/staging/rt2860/common/cmm_data.c b/drivers/staging/rt2860/common/cmm_data.c
index b67b9eba722..14a99b3e321 100644
--- a/drivers/staging/rt2860/common/cmm_data.c
+++ b/drivers/staging/rt2860/common/cmm_data.c
@@ -366,7 +366,7 @@ NDIS_STATUS MlmeHardTransmitTxRing(
366 { 366 {
367 // outgoing frame always wakeup PHY to prevent frame lost 367 // outgoing frame always wakeup PHY to prevent frame lost
368 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) 368 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
369 AsicForceWakeup(pAd, TRUE); 369 AsicForceWakeup(pAd, FROM_TX);
370 } 370 }
371#endif // CONFIG_STA_SUPPORT // 371#endif // CONFIG_STA_SUPPORT //
372 pFirstTxWI =(PTXWI_STRUC)pSrcBufVA; 372 pFirstTxWI =(PTXWI_STRUC)pSrcBufVA;
@@ -541,7 +541,7 @@ NDIS_STATUS MlmeHardTransmitMgmtRing(
541 { 541 {
542 // outgoing frame always wakeup PHY to prevent frame lost 542 // outgoing frame always wakeup PHY to prevent frame lost
543 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) 543 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
544 AsicForceWakeup(pAd, TRUE); 544 AsicForceWakeup(pAd, FROM_TX);
545 } 545 }
546#endif // CONFIG_STA_SUPPORT // 546#endif // CONFIG_STA_SUPPORT //
547 547
diff --git a/drivers/staging/rt2860/common/cmm_data_2860.c b/drivers/staging/rt2860/common/cmm_data_2860.c
index 419e50c3fc4..fae741e4bee 100644
--- a/drivers/staging/rt2860/common/cmm_data_2860.c
+++ b/drivers/staging/rt2860/common/cmm_data_2860.c
@@ -634,7 +634,7 @@ VOID RT28xxPciAsicRadioOff(
634 } 634 }
635 635
636 // Once go into this function, disable tx because don't want too many packets in queue to prevent HW stops. 636 // Once go into this function, disable tx because don't want too many packets in queue to prevent HW stops.
637 pAd->bPCIclkOffDisableTx = TRUE; 637 RTMP_SET_PSFLAG(pAd, fRTMP_PS_DISABLE_TX);
638 638
639 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) 639 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
640 { 640 {
@@ -651,7 +651,7 @@ VOID RT28xxPciAsicRadioOff(
651 { 651 {
652 DBGPRINT(RT_DEBUG_TRACE, ("TbTTTime = 0x%x , give up this sleep. \n", TbTTTime)); 652 DBGPRINT(RT_DEBUG_TRACE, ("TbTTTime = 0x%x , give up this sleep. \n", TbTTTime));
653 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE); 653 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
654 pAd->bPCIclkOffDisableTx = FALSE; 654 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_DISABLE_TX);
655 return; 655 return;
656 } 656 }
657 else 657 else
@@ -688,18 +688,25 @@ VOID RT28xxPciAsicRadioOff(
688 if (i >= 50) 688 if (i >= 50)
689 { 689 {
690 DBGPRINT(RT_DEBUG_TRACE, ("DMA keeps busy. return on RT28xxPciAsicRadioOff ()\n")); 690 DBGPRINT(RT_DEBUG_TRACE, ("DMA keeps busy. return on RT28xxPciAsicRadioOff ()\n"));
691 pAd->bPCIclkOffDisableTx = FALSE;
692 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &DmaCfg.word); 691 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &DmaCfg.word);
693 DmaCfg.field.EnableTxDMA = 1; 692 DmaCfg.field.EnableTxDMA = 1;
694 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, DmaCfg.word); 693 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, DmaCfg.word);
694 pAd->CheckDmaBusyCount++;
695 return; 695 return;
696 } 696 }
697 else
698 {
699 pAd->CheckDmaBusyCount = 0;
700 }
697 701
698 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF); 702 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF);
699 703
700 // Set to 1R. 704 // Set to 1R.
701 tempBBP_R3 = (pAd->StaCfg.BBPR3 & 0xE7); 705 if (pAd->Antenna.field.RxPath > 1)
702 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, tempBBP_R3); 706 {
707 tempBBP_R3 = (pAd->StaCfg.BBPR3 & 0xE7);
708 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, tempBBP_R3);
709 }
703 710
704 // In Radio Off, we turn off RF clk, So now need to call ASICSwitchChannel again. 711 // In Radio Off, we turn off RF clk, So now need to call ASICSwitchChannel again.
705 if (INFRA_ON(pAd) && (pAd->CommonCfg.CentralChannel != pAd->CommonCfg.Channel) 712 if (INFRA_ON(pAd) && (pAd->CommonCfg.CentralChannel != pAd->CommonCfg.Channel)
@@ -714,8 +721,15 @@ VOID RT28xxPciAsicRadioOff(
714 AsicTurnOffRFClk(pAd, pAd->CommonCfg.Channel); 721 AsicTurnOffRFClk(pAd, pAd->CommonCfg.Channel);
715 } 722 }
716 723
717 // When PCI clock is off, don't want to service interrupt. 724 if (Level != RTMP_HALT)
718 RTMP_IO_WRITE32(pAd, INT_MASK_CSR, AutoWakeupInt); 725 {
726 // Change Interrupt bitmask.
727 RTMP_IO_WRITE32(pAd, INT_MASK_CSR, AutoWakeupInt);
728 }
729 else
730 {
731 NICDisableInterrupt(pAd);
732 }
719 733
720 RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx); 734 RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx);
721 // Disable MAC Rx 735 // Disable MAC Rx
@@ -726,7 +740,8 @@ VOID RT28xxPciAsicRadioOff(
726 // 2. Send Sleep command 740 // 2. Send Sleep command
727 RTMP_IO_WRITE32(pAd, H2M_MAILBOX_STATUS, 0xffffffff); 741 RTMP_IO_WRITE32(pAd, H2M_MAILBOX_STATUS, 0xffffffff);
728 RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CID, 0xffffffff); 742 RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CID, 0xffffffff);
729 AsicSendCommandToMcu(pAd, 0x30, PowerSafeCID, 0xff, 0x00); // send POWER-SAVE command to MCU. Timeout unit:40us. 743 // send POWER-SAVE command to MCU. high-byte = 1 save power as much as possible. high byte = 0 save less power
744 AsicSendCommandToMcu(pAd, 0x30, PowerSafeCID, 0xff, 0x1);
730 // 2-1. Wait command success 745 // 2-1. Wait command success
731 // Status = 1 : success, Status = 2, already sleep, Status = 3, Maybe MAC is busy so can't finish this task. 746 // Status = 1 : success, Status = 2, already sleep, Status = 3, Maybe MAC is busy so can't finish this task.
732 brc = AsicCheckCommanOk(pAd, PowerSafeCID); 747 brc = AsicCheckCommanOk(pAd, PowerSafeCID);
@@ -734,7 +749,7 @@ VOID RT28xxPciAsicRadioOff(
734 if (brc == FALSE) 749 if (brc == FALSE)
735 { 750 {
736 // try again 751 // try again
737 AsicSendCommandToMcu(pAd, 0x30, PowerSafeCID, 0xff, 0x00); // send POWER-SAVE command to MCU. Timeout unit:40us. 752 AsicSendCommandToMcu(pAd, 0x30, PowerSafeCID, 0xff, 0x01); // send POWER-SAVE command to MCU. Timeout unit:40us.
738 //RTMPusecDelay(200); 753 //RTMPusecDelay(200);
739 brc = AsicCheckCommanOk(pAd, PowerSafeCID); 754 brc = AsicCheckCommanOk(pAd, PowerSafeCID);
740 } 755 }
@@ -759,7 +774,7 @@ VOID RT28xxPciAsicRadioOff(
759 do 774 do
760 { 775 {
761 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &DmaCfg.word); 776 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &DmaCfg.word);
762 if (DmaCfg.field.RxDMABusy == 0) 777 if ((DmaCfg.field.RxDMABusy == 0) && (DmaCfg.field.TxDMABusy == 0))
763 break; 778 break;
764 RTMPusecDelay(20); 779 RTMPusecDelay(20);
765 i++; 780 i++;
@@ -767,13 +782,12 @@ VOID RT28xxPciAsicRadioOff(
767 782
768 if (i >= 50) 783 if (i >= 50)
769 { 784 {
785 pAd->CheckDmaBusyCount++;
770 DBGPRINT(RT_DEBUG_TRACE, ("DMA Rx keeps busy. on RT28xxPciAsicRadioOff ()\n")); 786 DBGPRINT(RT_DEBUG_TRACE, ("DMA Rx keeps busy. on RT28xxPciAsicRadioOff ()\n"));
771 } 787 }
772 // disable DMA Rx. 788 else
773 { 789 {
774 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &DmaCfg.word); 790 pAd->CheckDmaBusyCount = 0;
775 DmaCfg.field.EnableRxDMA = 0;
776 RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, DmaCfg.word);
777 } 791 }
778 792
779 if (Level == DOT11POWERSAVE) 793 if (Level == DOT11POWERSAVE)
@@ -799,7 +813,7 @@ VOID RT28xxPciAsicRadioOff(
799 if (Level == RTMP_HALT) 813 if (Level == RTMP_HALT)
800 { 814 {
801 if ((brc == TRUE) && (i < 50)) 815 if ((brc == TRUE) && (i < 50))
802 RTMPPCIeLinkCtrlSetting(pAd, 1); 816 RTMPPCIeLinkCtrlSetting(pAd, 0);
803 } 817 }
804 // 4. Set PCI configuration Space Link Comtrol fields. Only Radio Off needs to call this function 818 // 4. Set PCI configuration Space Link Comtrol fields. Only Radio Off needs to call this function
805 else 819 else
@@ -808,7 +822,7 @@ VOID RT28xxPciAsicRadioOff(
808 RTMPPCIeLinkCtrlSetting(pAd, 3); 822 RTMPPCIeLinkCtrlSetting(pAd, 3);
809 } 823 }
810 824
811 pAd->bPCIclkOffDisableTx = FALSE; 825 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_DISABLE_TX);
812} 826}
813 827
814 828
@@ -835,7 +849,8 @@ BOOLEAN RT28xxPciAsicRadioOn(
835 { 849 {
836 pAd->Mlme.bPsPollTimerRunning = FALSE; 850 pAd->Mlme.bPsPollTimerRunning = FALSE;
837 RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled); 851 RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);
838 if ((Level == GUIRADIO_OFF) || (Level == GUI_IDLE_POWER_SAVE)) 852 if ((Level == GUIRADIO_OFF) || (Level == GUI_IDLE_POWER_SAVE)
853 || (RTMP_TEST_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND)))
839 { 854 {
840 DBGPRINT(RT_DEBUG_TRACE, ("RT28xxPciAsicRadioOn ()\n")); 855 DBGPRINT(RT_DEBUG_TRACE, ("RT28xxPciAsicRadioOn ()\n"));
841 // 1. Set PCI Link Control in Configuration Space. 856 // 1. Set PCI Link Control in Configuration Space.
@@ -845,15 +860,14 @@ BOOLEAN RT28xxPciAsicRadioOn(
845 } 860 }
846 861
847 pAd->bPCIclkOff = FALSE; 862 pAd->bPCIclkOff = FALSE;
848 863 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0x3a80);
849 // 2. Send wake up command. 864 // 2. Send wake up command.
850 AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x00); 865 AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x02);
851 866
852 // 2-1. wait command ok. 867 // 2-1. wait command ok.
853 brv = AsicCheckCommanOk(pAd, PowerWakeCID); 868 brv = AsicCheckCommanOk(pAd, PowerWakeCID);
854 if (brv) 869 if (brv)
855 { 870 {
856 //RTMP_IO_WRITE32(pAd, INT_MASK_CSR, (DELAYINTMASK|RxINT));
857 NICEnableInterrupt(pAd); 871 NICEnableInterrupt(pAd);
858 872
859 // 3. Enable Tx DMA. 873 // 3. Enable Tx DMA.
@@ -893,13 +907,10 @@ BOOLEAN RT28xxPciAsicRadioOn(
893 907
894VOID RT28xxPciStaAsicForceWakeup( 908VOID RT28xxPciStaAsicForceWakeup(
895 IN PRTMP_ADAPTER pAd, 909 IN PRTMP_ADAPTER pAd,
896 IN BOOLEAN bFromTx) 910 IN UCHAR Level)
897{ 911{
898 AUTO_WAKEUP_STRUC AutoWakeupCfg; 912 AUTO_WAKEUP_STRUC AutoWakeupCfg;
899 913
900 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
901 return;
902
903 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WAKEUP_NOW)) 914 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WAKEUP_NOW))
904 { 915 {
905 DBGPRINT(RT_DEBUG_TRACE, ("waking up now!\n")); 916 DBGPRINT(RT_DEBUG_TRACE, ("waking up now!\n"));
@@ -907,38 +918,48 @@ VOID RT28xxPciStaAsicForceWakeup(
907 } 918 }
908 919
909 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_WAKEUP_NOW); 920 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_WAKEUP_NOW);
921 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW);
910 922
911 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) 923 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
912 { 924 {
913 // Support PCIe Advance Power Save 925 // Support PCIe Advance Power Save
914 if (bFromTx == TRUE) 926 if (((Level == FROM_TX) && (pAd->Mlme.bPsPollTimerRunning == TRUE)) ||
927 (Level == RTMP_HALT))
915 { 928 {
916 pAd->Mlme.bPsPollTimerRunning = FALSE; 929 pAd->Mlme.bPsPollTimerRunning = FALSE;
917 RTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_WAKEUP); 930 RTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_WAKEUP);
918 RTMPusecDelay(3000); 931 RTMPusecDelay(5000);
919 DBGPRINT(RT_DEBUG_TRACE, ("=======AsicForceWakeup===bFromTx\n")); 932 DBGPRINT(RT_DEBUG_TRACE, ("=======AsicForceWakeup===bFromTx\n"));
920 } 933 }
921 934
922 AutoWakeupCfg.word = 0; 935 AutoWakeupCfg.word = 0;
923 RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word); 936 RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
924 937
925 if (RT28xxPciAsicRadioOn(pAd, DOT11POWERSAVE)) 938 // If this is called from Halt. ALWAYS force wakeup!!!
926 { 939 if (Level == RTMP_HALT)
927 // In Radio Off, we turn off RF clk, So now need to call ASICSwitchChannel again. 940 {
928 if (INFRA_ON(pAd) && (pAd->CommonCfg.CentralChannel != pAd->CommonCfg.Channel) 941 RT28xxPciAsicRadioOn(pAd, RTMP_HALT);
929 && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)) 942 }
930 { 943 else
931 // Must using 40MHz. 944 {
932 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); 945 if (RT28xxPciAsicRadioOn(pAd, DOT11POWERSAVE))
933 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); 946 {
934 } 947 // In Radio Off, we turn off RF clk, So now need to call ASICSwitchChannel again.
935 else 948 if (INFRA_ON(pAd) && (pAd->CommonCfg.CentralChannel != pAd->CommonCfg.Channel)
936 { 949 && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
937 // Must using 20MHz. 950 {
938 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); 951 // Must using 40MHz.
939 AsicLockChannel(pAd, pAd->CommonCfg.Channel); 952 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
940 } 953 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
941 } 954 }
955 else
956 {
957 // Must using 20MHz.
958 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
959 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
960 }
961 }
962 }
942 } 963 }
943 else 964 else
944 { 965 {
@@ -1122,6 +1143,7 @@ VOID RT28xxPciMlmeRadioOn(
1122 { 1143 {
1123 NICResetFromError(pAd); 1144 NICResetFromError(pAd);
1124 1145
1146 /*
1125 RTMPRingCleanUp(pAd, QID_AC_BK); 1147 RTMPRingCleanUp(pAd, QID_AC_BK);
1126 RTMPRingCleanUp(pAd, QID_AC_BE); 1148 RTMPRingCleanUp(pAd, QID_AC_BE);
1127 RTMPRingCleanUp(pAd, QID_AC_VI); 1149 RTMPRingCleanUp(pAd, QID_AC_VI);
@@ -1129,6 +1151,7 @@ VOID RT28xxPciMlmeRadioOn(
1129 RTMPRingCleanUp(pAd, QID_HCCA); 1151 RTMPRingCleanUp(pAd, QID_HCCA);
1130 RTMPRingCleanUp(pAd, QID_MGMT); 1152 RTMPRingCleanUp(pAd, QID_MGMT);
1131 RTMPRingCleanUp(pAd, QID_RX); 1153 RTMPRingCleanUp(pAd, QID_RX);
1154 */
1132 1155
1133 // Enable Tx/Rx 1156 // Enable Tx/Rx
1134 RTMPEnableRxTx(pAd); 1157 RTMPEnableRxTx(pAd);
@@ -1162,6 +1185,12 @@ VOID RT28xxPciMlmeRadioOFF(
1162 WPDMA_GLO_CFG_STRUC GloCfg; 1185 WPDMA_GLO_CFG_STRUC GloCfg;
1163 UINT32 i; 1186 UINT32 i;
1164 1187
1188 if (pAd->StaCfg.bRadio == TRUE)
1189 {
1190 DBGPRINT(RT_DEBUG_TRACE,("-->MlmeRadioOff() return on bRadio == TRUE; \n"));
1191 return;
1192 }
1193
1165 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) 1194 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))
1166 return; 1195 return;
1167 1196
@@ -1169,13 +1198,12 @@ VOID RT28xxPciMlmeRadioOFF(
1169 1198
1170 // Set LED 1199 // Set LED
1171 RTMPSetLED(pAd, LED_RADIO_OFF); 1200 RTMPSetLED(pAd, LED_RADIO_OFF);
1172 // Set Radio off flag
1173 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
1174 1201
1175#ifdef CONFIG_STA_SUPPORT 1202#ifdef CONFIG_STA_SUPPORT
1176 IF_DEV_CONFIG_OPMODE_ON_STA(pAd) 1203 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1177 { 1204 {
1178 BOOLEAN Cancelled; 1205 BOOLEAN Cancelled;
1206
1179 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) 1207 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
1180 { 1208 {
1181 RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled); 1209 RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);
@@ -1185,6 +1213,15 @@ VOID RT28xxPciMlmeRadioOFF(
1185 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) 1213 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
1186 { 1214 {
1187 BOOLEAN Cancelled; 1215 BOOLEAN Cancelled;
1216
1217 // Always radio on since the NIC needs to set the MCU command (LED_RADIO_OFF).
1218 if ((pAd->OpMode == OPMODE_STA) &&
1219 (IDLE_ON(pAd)) &&
1220 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)))
1221 {
1222 RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE);
1223 }
1224
1188 pAd->Mlme.bPsPollTimerRunning = FALSE; 1225 pAd->Mlme.bPsPollTimerRunning = FALSE;
1189 RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled); 1226 RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);
1190 RTMPCancelTimer(&pAd->Mlme.RadioOnOffTimer, &Cancelled); 1227 RTMPCancelTimer(&pAd->Mlme.RadioOnOffTimer, &Cancelled);
@@ -1197,9 +1234,26 @@ VOID RT28xxPciMlmeRadioOFF(
1197 //========================================== 1234 //==========================================
1198 // Clean up old bss table 1235 // Clean up old bss table
1199 BssTableInit(&pAd->ScanTab); 1236 BssTableInit(&pAd->ScanTab);
1237
1238 RTMPRingCleanUp(pAd, QID_AC_BK);
1239 RTMPRingCleanUp(pAd, QID_AC_BE);
1240 RTMPRingCleanUp(pAd, QID_AC_VI);
1241 RTMPRingCleanUp(pAd, QID_AC_VO);
1242 RTMPRingCleanUp(pAd, QID_HCCA);
1243 RTMPRingCleanUp(pAd, QID_MGMT);
1244 RTMPRingCleanUp(pAd, QID_RX);
1245
1246 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
1247 {
1248 RTMPSetTimer(&pAd->Mlme.RadioOnOffTimer, 500);
1249 return;
1250 }
1200 } 1251 }
1201#endif // CONFIG_STA_SUPPORT // 1252#endif // CONFIG_STA_SUPPORT //
1202 1253
1254 // Set Radio off flag
1255 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
1256
1203 // Disable Tx/Rx DMA 1257 // Disable Tx/Rx DMA
1204 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); // disable DMA 1258 RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); // disable DMA
1205 GloCfg.field.EnableTxDMA = 0; 1259 GloCfg.field.EnableTxDMA = 0;
diff --git a/drivers/staging/rt2860/common/cmm_sync.c b/drivers/staging/rt2860/common/cmm_sync.c
index 40e4109118e..d29e0b630e2 100644
--- a/drivers/staging/rt2860/common/cmm_sync.c
+++ b/drivers/staging/rt2860/common/cmm_sync.c
@@ -470,7 +470,7 @@ VOID ScanNextChannel(
470 { 470 {
471 // BBP and RF are not accessible in PS mode, we has to wake them up first 471 // BBP and RF are not accessible in PS mode, we has to wake them up first
472 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) 472 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
473 AsicForceWakeup(pAd, TRUE); 473 AsicForceWakeup(pAd, FROM_TX);
474 474
475 // leave PSM during scanning. otherwise we may lost ProbeRsp & BEACON 475 // leave PSM during scanning. otherwise we may lost ProbeRsp & BEACON
476 if (pAd->StaCfg.Psm == PWR_SAVE) 476 if (pAd->StaCfg.Psm == PWR_SAVE)
diff --git a/drivers/staging/rt2860/common/cmm_wpa.c b/drivers/staging/rt2860/common/cmm_wpa.c
index 81c332ac252..69baf522fa0 100644
--- a/drivers/staging/rt2860/common/cmm_wpa.c
+++ b/drivers/staging/rt2860/common/cmm_wpa.c
@@ -39,8 +39,10 @@
39// WPA OUI 39// WPA OUI
40UCHAR OUI_WPA_NONE_AKM[4] = {0x00, 0x50, 0xF2, 0x00}; 40UCHAR OUI_WPA_NONE_AKM[4] = {0x00, 0x50, 0xF2, 0x00};
41UCHAR OUI_WPA_VERSION[4] = {0x00, 0x50, 0xF2, 0x01}; 41UCHAR OUI_WPA_VERSION[4] = {0x00, 0x50, 0xF2, 0x01};
42UCHAR OUI_WPA_WEP40[4] = {0x00, 0x50, 0xF2, 0x01};
42UCHAR OUI_WPA_TKIP[4] = {0x00, 0x50, 0xF2, 0x02}; 43UCHAR OUI_WPA_TKIP[4] = {0x00, 0x50, 0xF2, 0x02};
43UCHAR OUI_WPA_CCMP[4] = {0x00, 0x50, 0xF2, 0x04}; 44UCHAR OUI_WPA_CCMP[4] = {0x00, 0x50, 0xF2, 0x04};
45UCHAR OUI_WPA_WEP104[4] = {0x00, 0x50, 0xF2, 0x05};
44UCHAR OUI_WPA_8021X_AKM[4] = {0x00, 0x50, 0xF2, 0x01}; 46UCHAR OUI_WPA_8021X_AKM[4] = {0x00, 0x50, 0xF2, 0x01};
45UCHAR OUI_WPA_PSK_AKM[4] = {0x00, 0x50, 0xF2, 0x02}; 47UCHAR OUI_WPA_PSK_AKM[4] = {0x00, 0x50, 0xF2, 0x02};
46// WPA2 OUI 48// WPA2 OUI
@@ -49,6 +51,7 @@ UCHAR OUI_WPA2_TKIP[4] = {0x00, 0x0F, 0xAC, 0x02};
49UCHAR OUI_WPA2_CCMP[4] = {0x00, 0x0F, 0xAC, 0x04}; 51UCHAR OUI_WPA2_CCMP[4] = {0x00, 0x0F, 0xAC, 0x04};
50UCHAR OUI_WPA2_8021X_AKM[4] = {0x00, 0x0F, 0xAC, 0x01}; 52UCHAR OUI_WPA2_8021X_AKM[4] = {0x00, 0x0F, 0xAC, 0x01};
51UCHAR OUI_WPA2_PSK_AKM[4] = {0x00, 0x0F, 0xAC, 0x02}; 53UCHAR OUI_WPA2_PSK_AKM[4] = {0x00, 0x0F, 0xAC, 0x02};
54UCHAR OUI_WPA2_WEP104[4] = {0x00, 0x0F, 0xAC, 0x05};
52// MSA OUI 55// MSA OUI
53UCHAR OUI_MSA_8021X_AKM[4] = {0x00, 0x0F, 0xAC, 0x05}; // Not yet final - IEEE 802.11s-D1.06 56UCHAR OUI_MSA_8021X_AKM[4] = {0x00, 0x0F, 0xAC, 0x05}; // Not yet final - IEEE 802.11s-D1.06
54UCHAR OUI_MSA_PSK_AKM[4] = {0x00, 0x0F, 0xAC, 0x06}; // Not yet final - IEEE 802.11s-D1.06 57UCHAR OUI_MSA_PSK_AKM[4] = {0x00, 0x0F, 0xAC, 0x06}; // Not yet final - IEEE 802.11s-D1.06
@@ -367,6 +370,24 @@ static VOID RTMPInsertRsnIeCipher(
367 break; 370 break;
368 } 371 }
369 372
373#ifdef CONFIG_STA_SUPPORT
374 if ((pAd->OpMode == OPMODE_STA) &&
375 (pAd->StaCfg.GroupCipher != Ndis802_11Encryption2Enabled) &&
376 (pAd->StaCfg.GroupCipher != Ndis802_11Encryption3Enabled))
377 {
378 UINT GroupCipher = pAd->StaCfg.GroupCipher;
379 switch(GroupCipher)
380 {
381 case Ndis802_11GroupWEP40Enabled:
382 NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_WEP40, 4);
383 break;
384 case Ndis802_11GroupWEP104Enabled:
385 NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_WEP104, 4);
386 break;
387 }
388 }
389#endif // CONFIG_STA_SUPPORT //
390
370 // swap for big-endian platform 391 // swap for big-endian platform
371 pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version); 392 pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version);
372 pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount); 393 pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount);
@@ -427,11 +448,28 @@ static VOID RTMPInsertRsnIeCipher(
427 break; 448 break;
428 } 449 }
429 450
451#ifdef CONFIG_STA_SUPPORT
452 if ((pAd->OpMode == OPMODE_STA) &&
453 (pAd->StaCfg.GroupCipher != Ndis802_11Encryption2Enabled) &&
454 (pAd->StaCfg.GroupCipher != Ndis802_11Encryption3Enabled))
455 {
456 UINT GroupCipher = pAd->StaCfg.GroupCipher;
457 switch(GroupCipher)
458 {
459 case Ndis802_11GroupWEP40Enabled:
460 NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_WEP40, 4);
461 break;
462 case Ndis802_11GroupWEP104Enabled:
463 NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_WEP104, 4);
464 break;
465 }
466 }
467#endif // CONFIG_STA_SUPPORT //
468
430 // swap for big-endian platform 469 // swap for big-endian platform
431 pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version); 470 pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version);
432 pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount); 471 pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount);
433 } 472 }
434
435} 473}
436 474
437/* 475/*
diff --git a/drivers/staging/rt2860/common/mlme.c b/drivers/staging/rt2860/common/mlme.c
index 229747095ae..75f810ca9ae 100644
--- a/drivers/staging/rt2860/common/mlme.c
+++ b/drivers/staging/rt2860/common/mlme.c
@@ -808,21 +808,35 @@ VOID MlmePeriodicExec(
808 ULONG TxTotalCnt; 808 ULONG TxTotalCnt;
809 PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)FunctionContext; 809 PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)FunctionContext;
810 810
811 //Baron 2008/07/10
812 //printk("Baron_Test:\t%s", RTMPGetRalinkEncryModeStr(pAd->StaCfg.WepStatus));
813 //If the STA security setting is OPEN or WEP, pAd->StaCfg.WpaSupplicantUP = 0.
814 //If the STA security setting is WPAPSK or WPA2PSK, pAd->StaCfg.WpaSupplicantUP = 1.
815 if(pAd->StaCfg.WepStatus<2)
816 {
817 pAd->StaCfg.WpaSupplicantUP = 0;
818 }
819 else
820 {
821 pAd->StaCfg.WpaSupplicantUP = 1;
822 }
823
811#ifdef CONFIG_STA_SUPPORT 824#ifdef CONFIG_STA_SUPPORT
812#ifdef RT2860 825#ifdef RT2860
813 IF_DEV_CONFIG_OPMODE_ON_STA(pAd) 826 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
814 { 827 {
815 // If Hardware controlled Radio enabled, we have to check GPIO pin2 every 2 second. 828 // If Hardware controlled Radio enabled, we have to check GPIO pin2 every 2 second.
816 // Move code to here, because following code will return when radio is off 829 // Move code to here, because following code will return when radio is off
817 if ((pAd->Mlme.PeriodicRound % (MLME_TASK_EXEC_MULTIPLE * 2) == 0) && (pAd->StaCfg.bHardwareRadio == TRUE) && 830 if ((pAd->Mlme.PeriodicRound % (MLME_TASK_EXEC_MULTIPLE * 2) == 0) &&
831 (pAd->StaCfg.bHardwareRadio == TRUE) &&
832 (RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_START_UP)) &&
818 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) && 833 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
819 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) && 834 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)))
820 (pAd->bPCIclkOff == FALSE))
821 { 835 {
822 UINT32 data = 0; 836 UINT32 data = 0;
823 837
824 // Read GPIO pin2 as Hardware controlled radio state 838 // Read GPIO pin2 as Hardware controlled radio state
825 RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data); 839 RTMP_IO_FORCE_READ32(pAd, GPIO_CTRL_CFG, &data);
826 if (data & 0x04) 840 if (data & 0x04)
827 { 841 {
828 pAd->StaCfg.bHwRadio = TRUE; 842 pAd->StaCfg.bHwRadio = TRUE;
@@ -860,6 +874,45 @@ VOID MlmePeriodicExec(
860 fRTMP_ADAPTER_RESET_IN_PROGRESS)))) 874 fRTMP_ADAPTER_RESET_IN_PROGRESS))))
861 return; 875 return;
862 876
877 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
878 {
879 if ((pAd->RalinkCounters.LastReceivedByteCount == pAd->RalinkCounters.ReceivedByteCount) && (pAd->StaCfg.bRadio == TRUE))
880 {
881 // If ReceiveByteCount doesn't change, increase SameRxByteCount by 1.
882 pAd->SameRxByteCount++;
883 }
884 else
885 pAd->SameRxByteCount = 0;
886
887 // If after BBP, still not work...need to check to reset PBF&MAC.
888 if (pAd->SameRxByteCount == 702)
889 {
890 pAd->SameRxByteCount = 0;
891 AsicResetPBF(pAd);
892 AsicResetMAC(pAd);
893 }
894
895 // If SameRxByteCount keeps happens for 2 second in infra mode, or for 60 seconds in idle mode.
896 if (((INFRA_ON(pAd)) && (pAd->SameRxByteCount > 20)) || ((IDLE_ON(pAd)) && (pAd->SameRxByteCount > 600)))
897 {
898 if ((pAd->StaCfg.bRadio == TRUE) && (pAd->SameRxByteCount < 700))
899 {
900 DBGPRINT(RT_DEBUG_TRACE, ("---> SameRxByteCount = %d !!!!!!!!!!!!!!! \n", pAd->SameRxByteCount));
901 pAd->SameRxByteCount = 700;
902 AsicResetBBP(pAd);
903 }
904 }
905
906 // Update lastReceiveByteCount.
907 pAd->RalinkCounters.LastReceivedByteCount = pAd->RalinkCounters.ReceivedByteCount;
908
909 if ((pAd->CheckDmaBusyCount > 3) && (IDLE_ON(pAd)))
910 {
911 pAd->CheckDmaBusyCount = 0;
912 AsicResetFromDMABusy(pAd);
913 }
914 }
915
863 RT28XX_MLME_PRE_SANITY_CHECK(pAd); 916 RT28XX_MLME_PRE_SANITY_CHECK(pAd);
864 917
865#ifdef RALINK_ATE 918#ifdef RALINK_ATE
@@ -1081,6 +1134,19 @@ VOID STAMlmePeriodicExec(
1081 pAd->StaCfg.bBlockAssoc = FALSE; 1134 pAd->StaCfg.bBlockAssoc = FALSE;
1082 } 1135 }
1083 1136
1137 //Baron 2008/07/10
1138 //printk("Baron_Test:\t%s", RTMPGetRalinkEncryModeStr(pAd->StaCfg.WepStatus));
1139 //If the STA security setting is OPEN or WEP, pAd->StaCfg.WpaSupplicantUP = 0.
1140 //If the STA security setting is WPAPSK or WPA2PSK, pAd->StaCfg.WpaSupplicantUP = 1.
1141 if(pAd->StaCfg.WepStatus<2)
1142 {
1143 pAd->StaCfg.WpaSupplicantUP = 0;
1144 }
1145 else
1146 {
1147 pAd->StaCfg.WpaSupplicantUP = 1;
1148 }
1149
1084 if ((pAd->PreMediaState != pAd->IndicateMediaState) && (pAd->CommonCfg.bWirelessEvent)) 1150 if ((pAd->PreMediaState != pAd->IndicateMediaState) && (pAd->CommonCfg.bWirelessEvent))
1085 { 1151 {
1086 if (pAd->IndicateMediaState == NdisMediaStateConnected) 1152 if (pAd->IndicateMediaState == NdisMediaStateConnected)
@@ -1090,6 +1156,15 @@ VOID STAMlmePeriodicExec(
1090 pAd->PreMediaState = pAd->IndicateMediaState; 1156 pAd->PreMediaState = pAd->IndicateMediaState;
1091 } 1157 }
1092 1158
1159 if ((pAd->OpMode == OPMODE_STA) && (IDLE_ON(pAd)) &&
1160 (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) &&
1161 (pAd->Mlme.SyncMachine.CurrState == SYNC_IDLE) &&
1162 (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) &&
1163 (RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_START_UP)) &&
1164 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)))
1165 {
1166 RT28xxPciAsicRadioOff(pAd, GUI_IDLE_POWER_SAVE, 0);
1167 }
1093 1168
1094 1169
1095 1170
@@ -2781,7 +2856,7 @@ VOID MlmeCheckPsmChange(
2781 if (INFRA_ON(pAd) && 2856 if (INFRA_ON(pAd) &&
2782 (PowerMode != Ndis802_11PowerModeCAM) && 2857 (PowerMode != Ndis802_11PowerModeCAM) &&
2783 (pAd->StaCfg.Psm == PWR_ACTIVE) && 2858 (pAd->StaCfg.Psm == PWR_ACTIVE) &&
2784 (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)) 2859 RTMP_TEST_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP))
2785 { 2860 {
2786 NdisGetSystemUpTime(&pAd->Mlme.LastSendNULLpsmTime); 2861 NdisGetSystemUpTime(&pAd->Mlme.LastSendNULLpsmTime);
2787 pAd->RalinkCounters.RxCountSinceLastNULL = 0; 2862 pAd->RalinkCounters.RxCountSinceLastNULL = 0;
@@ -4065,7 +4140,9 @@ VOID BssTableSsidSort(
4065 continue; 4140 continue;
4066 4141
4067 // check group cipher 4142 // check group cipher
4068 if (pAd->StaCfg.WepStatus < pInBss->WPA.GroupCipher) 4143 if ((pAd->StaCfg.WepStatus < pInBss->WPA.GroupCipher) &&
4144 (pInBss->WPA.GroupCipher != Ndis802_11GroupWEP40Enabled) &&
4145 (pInBss->WPA.GroupCipher != Ndis802_11GroupWEP104Enabled))
4069 continue; 4146 continue;
4070 4147
4071 // check pairwise cipher, skip if none matched 4148 // check pairwise cipher, skip if none matched
@@ -4084,7 +4161,9 @@ VOID BssTableSsidSort(
4084 continue; 4161 continue;
4085 4162
4086 // check group cipher 4163 // check group cipher
4087 if (pAd->StaCfg.WepStatus < pInBss->WPA2.GroupCipher) 4164 if ((pAd->StaCfg.WepStatus < pInBss->WPA.GroupCipher) &&
4165 (pInBss->WPA2.GroupCipher != Ndis802_11GroupWEP40Enabled) &&
4166 (pInBss->WPA2.GroupCipher != Ndis802_11GroupWEP104Enabled))
4088 continue; 4167 continue;
4089 4168
4090 // check pairwise cipher, skip if none matched 4169 // check pairwise cipher, skip if none matched
@@ -4371,8 +4450,10 @@ VOID BssCipherParse(
4371 switch (*pTmp) 4450 switch (*pTmp)
4372 { 4451 {
4373 case 1: 4452 case 1:
4374 case 5: // Although WEP is not allowed in WPA related auth mode, we parse it anyway 4453 pBss->WPA.GroupCipher = Ndis802_11GroupWEP40Enabled;
4375 pBss->WPA.GroupCipher = Ndis802_11Encryption1Enabled; 4454 break;
4455 case 5:
4456 pBss->WPA.GroupCipher = Ndis802_11GroupWEP104Enabled;
4376 break; 4457 break;
4377 case 2: 4458 case 2:
4378 pBss->WPA.GroupCipher = Ndis802_11Encryption2Enabled; 4459 pBss->WPA.GroupCipher = Ndis802_11Encryption2Enabled;
@@ -4489,8 +4570,10 @@ VOID BssCipherParse(
4489 switch (pCipher->Type) 4570 switch (pCipher->Type)
4490 { 4571 {
4491 case 1: 4572 case 1:
4492 case 5: // Although WEP is not allowed in WPA related auth mode, we parse it anyway 4573 pBss->WPA2.GroupCipher = Ndis802_11GroupWEP40Enabled;
4493 pBss->WPA2.GroupCipher = Ndis802_11Encryption1Enabled; 4574 break;
4575 case 5:
4576 pBss->WPA2.GroupCipher = Ndis802_11GroupWEP104Enabled;
4494 break; 4577 break;
4495 case 2: 4578 case 2:
4496 pBss->WPA2.GroupCipher = Ndis802_11Encryption2Enabled; 4579 pBss->WPA2.GroupCipher = Ndis802_11Encryption2Enabled;
@@ -6149,6 +6232,12 @@ VOID AsicAdjustTxPower(
6149 ULONG TxPwr[5]; 6232 ULONG TxPwr[5];
6150 CHAR Value; 6233 CHAR Value;
6151 6234
6235 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)
6236 || (pAd->bPCIclkOff == TRUE)
6237 || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)
6238 || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
6239 return;
6240
6152 if (pAd->CommonCfg.BBPCurrentBW == BW_40) 6241 if (pAd->CommonCfg.BBPCurrentBW == BW_40)
6153 { 6242 {
6154 if (pAd->CommonCfg.CentralChannel > 14) 6243 if (pAd->CommonCfg.CentralChannel > 14)
@@ -6493,10 +6582,10 @@ VOID AsicForceSleep(
6493 */ 6582 */
6494VOID AsicForceWakeup( 6583VOID AsicForceWakeup(
6495 IN PRTMP_ADAPTER pAd, 6584 IN PRTMP_ADAPTER pAd,
6496 IN BOOLEAN bFromTx) 6585 IN UCHAR Level)
6497{ 6586{
6498 DBGPRINT(RT_DEBUG_TRACE, ("--> AsicForceWakeup \n")); 6587 DBGPRINT(RT_DEBUG_TRACE, ("--> AsicForceWakeup \n"));
6499 RT28XX_STA_FORCE_WAKEUP(pAd, bFromTx); 6588 RT28XX_STA_FORCE_WAKEUP(pAd, Level);
6500} 6589}
6501#endif // CONFIG_STA_SUPPORT // 6590#endif // CONFIG_STA_SUPPORT //
6502/* 6591/*
@@ -7585,9 +7674,30 @@ BOOLEAN AsicSendCommandToMcu(
7585#endif // RALINK_ATE // 7674#endif // RALINK_ATE //
7586#endif // RT2860 // 7675#endif // RT2860 //
7587 { 7676 {
7677 UINT32 Data;
7678
7679 // Reset DMA
7680 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &Data);
7681 Data |= 0x2;
7682 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, Data);
7683
7684 // After Reset DMA, DMA index will become Zero. So Driver need to reset all ring indexs too.
7685 // Reset DMA/CPU ring index
7686 RTMPRingCleanUp(pAd, QID_AC_BK);
7687 RTMPRingCleanUp(pAd, QID_AC_BE);
7688 RTMPRingCleanUp(pAd, QID_AC_VI);
7689 RTMPRingCleanUp(pAd, QID_AC_VO);
7690 RTMPRingCleanUp(pAd, QID_HCCA);
7691 RTMPRingCleanUp(pAd, QID_MGMT);
7692 RTMPRingCleanUp(pAd, QID_RX);
7693
7694 // Clear Reset
7695 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &Data);
7696 Data &= 0xfffffffd;
7697 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, Data);
7588 DBGPRINT_ERR(("H2M_MAILBOX still hold by MCU. command fail\n")); 7698 DBGPRINT_ERR(("H2M_MAILBOX still hold by MCU. command fail\n"));
7589 } 7699 }
7590 return FALSE; 7700 //return FALSE;
7591 } 7701 }
7592 7702
7593#ifdef RT2860 7703#ifdef RT2860
@@ -8518,6 +8628,106 @@ VOID AsicStaBbpTuning(
8518 8628
8519 } 8629 }
8520} 8630}
8631
8632VOID AsicResetFromDMABusy(
8633 IN PRTMP_ADAPTER pAd)
8634{
8635 UINT32 Data;
8636 BOOLEAN bCtrl = FALSE;
8637
8638 DBGPRINT(RT_DEBUG_TRACE, ("---> AsicResetFromDMABusy !!!!!!!!!!!!!!!!!!!!!!! \n"));
8639
8640 // Be sure restore link control value so we can write register.
8641 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
8642 if (RTMP_TEST_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND))
8643 {
8644 DBGPRINT(RT_DEBUG_TRACE,("AsicResetFromDMABusy==>\n"));
8645 RTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_HALT);
8646 RTMPusecDelay(6000);
8647 pAd->bPCIclkOff = FALSE;
8648 bCtrl = TRUE;
8649 }
8650 // Reset DMA
8651 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &Data);
8652 Data |= 0x2;
8653 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, Data);
8654
8655 // After Reset DMA, DMA index will become Zero. So Driver need to reset all ring indexs too.
8656 // Reset DMA/CPU ring index
8657 RTMPRingCleanUp(pAd, QID_AC_BK);
8658 RTMPRingCleanUp(pAd, QID_AC_BE);
8659 RTMPRingCleanUp(pAd, QID_AC_VI);
8660 RTMPRingCleanUp(pAd, QID_AC_VO);
8661 RTMPRingCleanUp(pAd, QID_HCCA);
8662 RTMPRingCleanUp(pAd, QID_MGMT);
8663 RTMPRingCleanUp(pAd, QID_RX);
8664
8665 // Clear Reset
8666 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &Data);
8667 Data &= 0xfffffffd;
8668 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, Data);
8669
8670 // If in Radio off, should call RTMPPCIePowerLinkCtrl again.
8671 if ((bCtrl == TRUE) && (pAd->StaCfg.bRadio == FALSE))
8672 RTMPPCIeLinkCtrlSetting(pAd, 3);
8673
8674 RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
8675 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS);
8676 DBGPRINT(RT_DEBUG_TRACE, ("<--- AsicResetFromDMABusy !!!!!!!!!!!!!!!!!!!!!!! \n"));
8677}
8678
8679VOID AsicResetBBP(
8680 IN PRTMP_ADAPTER pAd)
8681{
8682 DBGPRINT(RT_DEBUG_TRACE, ("---> Asic HardReset BBP !!!!!!!!!!!!!!!!!!!!!!! \n"));
8683
8684 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
8685 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x2);
8686 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xc);
8687
8688 // After hard-reset BBP, initialize all BBP values.
8689 NICRestoreBBPValue(pAd);
8690 DBGPRINT(RT_DEBUG_TRACE, ("<--- Asic HardReset BBP !!!!!!!!!!!!!!!!!!!!!!! \n"));
8691}
8692
8693VOID AsicResetMAC(
8694 IN PRTMP_ADAPTER pAd)
8695{
8696 ULONG Data;
8697
8698 DBGPRINT(RT_DEBUG_TRACE, ("---> AsicResetMAC !!!! \n"));
8699 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &Data);
8700 Data |= 0x4;
8701 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, Data);
8702 Data &= 0xfffffffb;
8703 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, Data);
8704
8705 DBGPRINT(RT_DEBUG_TRACE, ("<--- AsicResetMAC !!!! \n"));
8706}
8707
8708VOID AsicResetPBF(
8709 IN PRTMP_ADAPTER pAd)
8710{
8711 ULONG Value1, Value2;
8712 ULONG Data;
8713
8714 RTMP_IO_READ32(pAd, TXRXQ_PCNT, &Value1);
8715 RTMP_IO_READ32(pAd, PBF_DBG, &Value2);
8716
8717 Value2 &= 0xff;
8718 // sum should be equals to 0xff, which is the total buffer size.
8719 if ((Value1 + Value2) < 0xff)
8720 {
8721 DBGPRINT(RT_DEBUG_TRACE, ("---> Asic HardReset PBF !!!! \n"));
8722 RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &Data);
8723 Data |= 0x8;
8724 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, Data);
8725 Data &= 0xfffffff7;
8726 RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, Data);
8727
8728 DBGPRINT(RT_DEBUG_TRACE, ("<--- Asic HardReset PBF !!!! \n"));
8729 }
8730}
8521#endif // CONFIG_STA_SUPPORT // 8731#endif // CONFIG_STA_SUPPORT //
8522 8732
8523VOID RTMPSetAGCInitValue( 8733VOID RTMPSetAGCInitValue(
diff --git a/drivers/staging/rt2860/common/rtmp_init.c b/drivers/staging/rt2860/common/rtmp_init.c
index 563f2c5bb85..19a21ff489a 100644
--- a/drivers/staging/rt2860/common/rtmp_init.c
+++ b/drivers/staging/rt2860/common/rtmp_init.c
@@ -2041,6 +2041,131 @@ NDIS_STATUS NICInitializeAsic(
2041 return NDIS_STATUS_SUCCESS; 2041 return NDIS_STATUS_SUCCESS;
2042} 2042}
2043 2043
2044
2045VOID NICRestoreBBPValue(
2046 IN PRTMP_ADAPTER pAd)
2047{
2048 UCHAR index;
2049 UCHAR Value;
2050 ULONG Data;
2051
2052 DBGPRINT(RT_DEBUG_TRACE, ("---> NICRestoreBBPValue !!!!!!!!!!!!!!!!!!!!!!! \n"));
2053 // Initialize BBP register to default value (rtmp_init.c)
2054 for (index = 0; index < NUM_BBP_REG_PARMS; index++)
2055 {
2056 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[index].Register, BBPRegTable[index].Value);
2057 }
2058 // copy from (rtmp_init.c)
2059 if (pAd->MACVersion == 0x28600100)
2060 {
2061 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
2062 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12);
2063 }
2064
2065 // copy from (connect.c LinkUp function)
2066 if (INFRA_ON(pAd))
2067 {
2068 // Change to AP channel
2069 if ((pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
2070 {
2071 // Must using 40MHz.
2072 pAd->CommonCfg.BBPCurrentBW = BW_40;
2073 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
2074 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
2075
2076 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
2077 Value &= (~0x18);
2078 Value |= 0x10;
2079 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
2080
2081 // RX : control channel at lower
2082 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
2083 Value &= (~0x20);
2084 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
2085 // Record BBPR3 setting, But don't keep R Antenna # information.
2086 pAd->StaCfg.BBPR3 = Value;
2087
2088 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
2089 Data &= 0xfffffffe;
2090 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
2091
2092 if (pAd->MACVersion == 0x28600100)
2093 {
2094 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
2095 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
2096 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
2097 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
2098 }
2099
2100 DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Lower LINK UP !!! Control Channel at Below. Central = %d \n", pAd->CommonCfg.CentralChannel ));
2101 }
2102 else if ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
2103 {
2104 // Must using 40MHz.
2105 pAd->CommonCfg.BBPCurrentBW = BW_40;
2106 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
2107 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
2108
2109 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
2110 Value &= (~0x18);
2111 Value |= 0x10;
2112 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
2113
2114 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
2115 Data |= 0x1;
2116 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
2117
2118 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
2119 Value |= (0x20);
2120 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
2121 // Record BBPR3 setting, But don't keep R Antenna # information.
2122 pAd->StaCfg.BBPR3 = Value;
2123
2124 if (pAd->MACVersion == 0x28600100)
2125 {
2126 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
2127 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
2128 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
2129 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
2130 }
2131
2132 DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Upper LINK UP !!! Control Channel at UpperCentral = %d \n", pAd->CommonCfg.CentralChannel ));
2133 }
2134 else
2135 {
2136 pAd->CommonCfg.BBPCurrentBW = BW_20;
2137 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
2138 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
2139
2140 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
2141 Value &= (~0x18);
2142 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
2143
2144 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
2145 Data &= 0xfffffffe;
2146 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
2147
2148 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
2149 Value &= (~0x20);
2150 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
2151 // Record BBPR3 setting, But don't keep R Antenna # information.
2152 pAd->StaCfg.BBPR3 = Value;
2153
2154 if (pAd->MACVersion == 0x28600100)
2155 {
2156 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
2157 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08);
2158 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11);
2159 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
2160 }
2161
2162 DBGPRINT(RT_DEBUG_TRACE, ("!!!20MHz LINK UP !!! \n" ));
2163 }
2164 }
2165
2166 DBGPRINT(RT_DEBUG_TRACE, ("<--- NICRestoreBBPValue !!!!!!!!!!!!!!!!!!!!!!! \n"));
2167}
2168
2044/* 2169/*
2045 ======================================================================== 2170 ========================================================================
2046 2171
@@ -3032,6 +3157,7 @@ VOID UserCfgInit(
3032 pAd->LedIndicatorStregth = 0; 3157 pAd->LedIndicatorStregth = 0;
3033 pAd->RLnkCtrlOffset = 0; 3158 pAd->RLnkCtrlOffset = 0;
3034 pAd->HostLnkCtrlOffset = 0; 3159 pAd->HostLnkCtrlOffset = 0;
3160 pAd->CheckDmaBusyCount = 0;
3035#endif // RT2860 // 3161#endif // RT2860 //
3036 3162
3037 pAd->bAutoTxAgcA = FALSE; // Default is OFF 3163 pAd->bAutoTxAgcA = FALSE; // Default is OFF
@@ -3308,7 +3434,7 @@ VOID UserCfgInit(
3308 pAd->bPCIclkOff = FALSE; 3434 pAd->bPCIclkOff = FALSE;
3309#endif // RT2860 // 3435#endif // RT2860 //
3310 3436
3311 3437 RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
3312 DBGPRINT(RT_DEBUG_TRACE, ("<-- UserCfgInit\n")); 3438 DBGPRINT(RT_DEBUG_TRACE, ("<-- UserCfgInit\n"));
3313} 3439}
3314 3440
diff --git a/drivers/staging/rt2860/oid.h b/drivers/staging/rt2860/oid.h
index f2f91b607c4..5e6ed9f62f9 100644
--- a/drivers/staging/rt2860/oid.h
+++ b/drivers/staging/rt2860/oid.h
@@ -544,6 +544,8 @@ typedef enum _NDIS_802_11_WEP_STATUS
544 Ndis802_11Encryption3KeyAbsent, 544 Ndis802_11Encryption3KeyAbsent,
545 Ndis802_11Encryption4Enabled, // TKIP or AES mix 545 Ndis802_11Encryption4Enabled, // TKIP or AES mix
546 Ndis802_11Encryption4KeyAbsent, 546 Ndis802_11Encryption4KeyAbsent,
547 Ndis802_11GroupWEP40Enabled,
548 Ndis802_11GroupWEP104Enabled,
547} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS, 549} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS,
548 NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS; 550 NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS;
549 551
diff --git a/drivers/staging/rt2860/rt2860.h b/drivers/staging/rt2860/rt2860.h
index 54bac00575f..4fbec906e10 100644
--- a/drivers/staging/rt2860/rt2860.h
+++ b/drivers/staging/rt2860/rt2860.h
@@ -315,8 +315,8 @@ rt2860_interrupt(int irq, void *dev_instance);
315 reg16 = cpu2le16(Configuration); \ 315 reg16 = cpu2le16(Configuration); \
316 pci_write_config_word(pci_dev, offset, reg16); \ 316 pci_write_config_word(pci_dev, offset, reg16); \
317 317
318#define RT28XX_STA_FORCE_WAKEUP(pAd, bFromTx) \ 318#define RT28XX_STA_FORCE_WAKEUP(pAd, Level) \
319 RT28xxPciStaAsicForceWakeup(pAd, bFromTx); 319 RT28xxPciStaAsicForceWakeup(pAd, Level);
320 320
321#define RT28XX_STA_SLEEP_THEN_AUTO_WAKEUP(pAd, TbttNumToNextWakeUp) \ 321#define RT28XX_STA_SLEEP_THEN_AUTO_WAKEUP(pAd, TbttNumToNextWakeUp) \
322 RT28xxPciStaAsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp); 322 RT28xxPciStaAsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);
diff --git a/drivers/staging/rt2860/rt_linux.h b/drivers/staging/rt2860/rt_linux.h
index 1f8cf295302..713d031c28f 100644
--- a/drivers/staging/rt2860/rt_linux.h
+++ b/drivers/staging/rt2860/rt_linux.h
@@ -93,7 +93,7 @@ typedef int (*HARD_START_XMIT_FUNC)(struct sk_buff *skb, struct net_device *net_
93#define STA_PROFILE_PATH "/etc/Wireless/RT2860STA/RT2860STA.dat" 93#define STA_PROFILE_PATH "/etc/Wireless/RT2860STA/RT2860STA.dat"
94#define STA_RTMP_FIRMWARE_FILE_NAME "/etc/Wireless/RT2860STA/RT2860STA.bin" 94#define STA_RTMP_FIRMWARE_FILE_NAME "/etc/Wireless/RT2860STA/RT2860STA.bin"
95#define STA_NIC_DEVICE_NAME "RT2860STA" 95#define STA_NIC_DEVICE_NAME "RT2860STA"
96#define STA_DRIVER_VERSION "1.8.0.0" 96#define STA_DRIVER_VERSION "1.8.1.1"
97#ifdef MULTIPLE_CARD_SUPPORT 97#ifdef MULTIPLE_CARD_SUPPORT
98#define CARD_INFO_PATH "/etc/Wireless/RT2860STA/RT2860STACard.dat" 98#define CARD_INFO_PATH "/etc/Wireless/RT2860STA/RT2860STACard.dat"
99#endif // MULTIPLE_CARD_SUPPORT // 99#endif // MULTIPLE_CARD_SUPPORT //
@@ -393,6 +393,12 @@ extern ULONG RTDebugLevel;
393 (*_pV = SWAP32(*((UINT32 *)(_pV)))); \ 393 (*_pV = SWAP32(*((UINT32 *)(_pV)))); \
394 } \ 394 } \
395} 395}
396#define RTMP_IO_FORCE_READ32(_A, _R, _pV) \
397{ \
398 (*_pV = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0))); \
399 (*_pV = readl((void *)((_A)->CSRBaseAddress + (_R)))); \
400 (*_pV = SWAP32(*((UINT32 *)(_pV)))); \
401}
396#define RTMP_IO_READ8(_A, _R, _pV) \ 402#define RTMP_IO_READ8(_A, _R, _pV) \
397{ \ 403{ \
398 (*_pV = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0))); \ 404 (*_pV = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0))); \
@@ -432,6 +438,11 @@ extern ULONG RTDebugLevel;
432 else \ 438 else \
433 *_pV = 0; \ 439 *_pV = 0; \
434} 440}
441#define RTMP_IO_FORCE_READ32(_A, _R, _pV) \
442{ \
443 (*_pV = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0))); \
444 (*_pV = readl((void *)((_A)->CSRBaseAddress + (_R)))); \
445}
435#define RTMP_IO_READ8(_A, _R, _pV) \ 446#define RTMP_IO_READ8(_A, _R, _pV) \
436{ \ 447{ \
437 (*_pV = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0))); \ 448 (*_pV = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0))); \
diff --git a/drivers/staging/rt2860/rt_main_dev.c b/drivers/staging/rt2860/rt_main_dev.c
index 246fb0a29b3..429d78d0635 100644
--- a/drivers/staging/rt2860/rt_main_dev.c
+++ b/drivers/staging/rt2860/rt_main_dev.c
@@ -224,15 +224,13 @@ int rt28xx_close(IN PNET_DEV dev)
224#ifdef CONFIG_STA_SUPPORT 224#ifdef CONFIG_STA_SUPPORT
225 IF_DEV_CONFIG_OPMODE_ON_STA(pAd) 225 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
226 { 226 {
227#ifdef RT2860
228 RTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_CLOSE);
229#endif // RT2860 //
230
231 // If dirver doesn't wake up firmware here, 227 // If dirver doesn't wake up firmware here,
232 // NICLoadFirmware will hang forever when interface is up again. 228 // NICLoadFirmware will hang forever when interface is up again.
233 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) 229 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) ||
230 RTMP_SET_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND) ||
231 RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))
234 { 232 {
235 AsicForceWakeup(pAd, TRUE); 233 AsicForceWakeup(pAd, RTMP_HALT);
236 } 234 }
237 235
238#ifdef QOS_DLS_SUPPORT 236#ifdef QOS_DLS_SUPPORT
@@ -656,26 +654,6 @@ int rt28xx_open(IN PNET_DEV dev)
656#endif // WIRELESS_EXT >= 12 // 654#endif // WIRELESS_EXT >= 12 //
657#endif // CONFIG_APSTA_MIXED_SUPPORT // 655#endif // CONFIG_APSTA_MIXED_SUPPORT //
658 656
659#ifdef CONFIG_STA_SUPPORT
660#ifdef RT2860
661 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
662 {
663 // If dirver doesn't wake up firmware here,
664 // NICLoadFirmware will hang forever when interface is up again.
665 // RT2860 PCI
666 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) &&
667 OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
668 {
669 AUTO_WAKEUP_STRUC AutoWakeupCfg;
670 AsicForceWakeup(pAd, TRUE);
671 AutoWakeupCfg.word = 0;
672 RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
673 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
674 }
675 }
676#endif // RT2860 //
677#endif // CONFIG_STA_SUPPORT //
678
679 // Init 657 // Init
680 pObj = (POS_COOKIE)pAd->OS_Cookie; 658 pObj = (POS_COOKIE)pAd->OS_Cookie;
681 659
diff --git a/drivers/staging/rt2860/rt_profile.c b/drivers/staging/rt2860/rt_profile.c
index 326a3cb52b9..62141f37697 100644
--- a/drivers/staging/rt2860/rt_profile.c
+++ b/drivers/staging/rt2860/rt_profile.c
@@ -1451,7 +1451,7 @@ NDIS_STATUS RTMPReadParametersHook(
1451 IF_DEV_CONFIG_OPMODE_ON_STA(pAd) 1451 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
1452 { 1452 {
1453 //PSMode 1453 //PSMode
1454 if (RTMPGetKeyParameter("PSMode", tmpbuf, 10, buffer)) 1454 if (RTMPGetKeyParameter("PSMode", tmpbuf, 32, buffer))
1455 { 1455 {
1456 if (pAd->StaCfg.BssType == BSS_INFRA) 1456 if (pAd->StaCfg.BssType == BSS_INFRA)
1457 { 1457 {
diff --git a/drivers/staging/rt2860/rtmp.h b/drivers/staging/rt2860/rtmp.h
index 411954206c2..bef9c199022 100644
--- a/drivers/staging/rt2860/rtmp.h
+++ b/drivers/staging/rt2860/rtmp.h
@@ -366,6 +366,13 @@ typedef struct _QUEUE_HEADER {
366#define RTMP_TEST_FLAG(_M, _F) (((_M)->Flags & (_F)) != 0) 366#define RTMP_TEST_FLAG(_M, _F) (((_M)->Flags & (_F)) != 0)
367#define RTMP_TEST_FLAGS(_M, _F) (((_M)->Flags & (_F)) == (_F)) 367#define RTMP_TEST_FLAGS(_M, _F) (((_M)->Flags & (_F)) == (_F))
368 368
369// Macro for power save flag.
370#define RTMP_SET_PSFLAG(_M, _F) ((_M)->PSFlags |= (_F))
371#define RTMP_CLEAR_PSFLAG(_M, _F) ((_M)->PSFlags &= ~(_F))
372#define RTMP_CLEAR_PSFLAGS(_M) ((_M)->PSFlags = 0)
373#define RTMP_TEST_PSFLAG(_M, _F) (((_M)->PSFlags & (_F)) != 0)
374#define RTMP_TEST_PSFLAGS(_M, _F) (((_M)->PSFlags & (_F)) == (_F))
375
369#define OPSTATUS_SET_FLAG(_pAd, _F) ((_pAd)->CommonCfg.OpStatusFlags |= (_F)) 376#define OPSTATUS_SET_FLAG(_pAd, _F) ((_pAd)->CommonCfg.OpStatusFlags |= (_F))
370#define OPSTATUS_CLEAR_FLAG(_pAd, _F) ((_pAd)->CommonCfg.OpStatusFlags &= ~(_F)) 377#define OPSTATUS_CLEAR_FLAG(_pAd, _F) ((_pAd)->CommonCfg.OpStatusFlags &= ~(_F))
371#define OPSTATUS_TEST_FLAG(_pAd, _F) (((_pAd)->CommonCfg.OpStatusFlags & (_F)) != 0) 378#define OPSTATUS_TEST_FLAG(_pAd, _F) (((_pAd)->CommonCfg.OpStatusFlags & (_F)) != 0)
@@ -919,9 +926,10 @@ typedef struct _RTMP_SCATTER_GATHER_LIST {
919#define STA_PORT_SECURED(_pAd) \ 926#define STA_PORT_SECURED(_pAd) \
920{ \ 927{ \
921 _pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; \ 928 _pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; \
922 NdisAcquireSpinLock(&_pAd->MacTabLock); \ 929 RTMP_SET_PSFLAG(_pAd, fRTMP_PS_CAN_GO_SLEEP); \
930 NdisAcquireSpinLock(&(_pAd)->MacTabLock); \
923 _pAd->MacTab.Content[BSSID_WCID].PortSecured = _pAd->StaCfg.PortSecured; \ 931 _pAd->MacTab.Content[BSSID_WCID].PortSecured = _pAd->StaCfg.PortSecured; \
924 NdisReleaseSpinLock(&_pAd->MacTabLock); \ 932 NdisReleaseSpinLock(&(_pAd)->MacTabLock); \
925} 933}
926#endif // CONFIG_STA_SUPPORT // 934#endif // CONFIG_STA_SUPPORT //
927 935
@@ -1101,6 +1109,7 @@ typedef struct _COUNTER_802_11 {
1101 1109
1102typedef struct _COUNTER_RALINK { 1110typedef struct _COUNTER_RALINK {
1103 ULONG TransmittedByteCount; // both successful and failure, used to calculate TX throughput 1111 ULONG TransmittedByteCount; // both successful and failure, used to calculate TX throughput
1112 ULONG LastReceivedByteCount;
1104 ULONG ReceivedByteCount; // both CRC okay and CRC error, used to calculate RX throughput 1113 ULONG ReceivedByteCount; // both CRC okay and CRC error, used to calculate RX throughput
1105 ULONG BeenDisassociatedCount; 1114 ULONG BeenDisassociatedCount;
1106 ULONG BadCQIAutoRecoveryCount; 1115 ULONG BadCQIAutoRecoveryCount;
@@ -2671,7 +2680,9 @@ typedef struct _RTMP_ADAPTER
2671 USHORT HostLnkCtrlOffset; 2680 USHORT HostLnkCtrlOffset;
2672 USHORT PCIePowerSaveLevel; 2681 USHORT PCIePowerSaveLevel;
2673 BOOLEAN bPCIclkOff; // flag that indicate if the PICE power status in Configuration SPace.. 2682 BOOLEAN bPCIclkOff; // flag that indicate if the PICE power status in Configuration SPace..
2674 BOOLEAN bPCIclkOffDisableTx; // 2683 ULONG CheckDmaBusyCount; // Check Interrupt Status Register Count.
2684 USHORT ThisTbttNumToNextWakeUp;
2685 ULONG SameRxByteCount;
2675 2686
2676 2687
2677/*****************************************************************************************/ 2688/*****************************************************************************************/
@@ -2895,6 +2906,7 @@ typedef struct _RTMP_ADAPTER
2895 2906
2896 // flags, see fRTMP_ADAPTER_xxx flags 2907 // flags, see fRTMP_ADAPTER_xxx flags
2897 ULONG Flags; // Represent current device status 2908 ULONG Flags; // Represent current device status
2909 ULONG PSFlags; // Power Save operation flag.
2898 2910
2899 // current TX sequence # 2911 // current TX sequence #
2900 USHORT Sequence; 2912 USHORT Sequence;
@@ -3550,6 +3562,9 @@ NDIS_STATUS NICInitializeAsic(
3550 IN PRTMP_ADAPTER pAd, 3562 IN PRTMP_ADAPTER pAd,
3551 IN BOOLEAN bHardReset); 3563 IN BOOLEAN bHardReset);
3552 3564
3565VOID NICRestoreBBPValue(
3566 IN PRTMP_ADAPTER pAd);
3567
3553VOID NICIssueReset( 3568VOID NICIssueReset(
3554 IN PRTMP_ADAPTER pAd); 3569 IN PRTMP_ADAPTER pAd);
3555 3570
@@ -4208,7 +4223,7 @@ VOID AsicForceSleep(
4208 4223
4209VOID AsicForceWakeup( 4224VOID AsicForceWakeup(
4210 IN PRTMP_ADAPTER pAd, 4225 IN PRTMP_ADAPTER pAd,
4211 IN BOOLEAN bFromTx); 4226 IN UCHAR Level);
4212#endif // CONFIG_STA_SUPPORT // 4227#endif // CONFIG_STA_SUPPORT //
4213 4228
4214VOID AsicSetBssid( 4229VOID AsicSetBssid(
@@ -7069,7 +7084,7 @@ BOOLEAN RT28xxPciAsicRadioOn(
7069 7084
7070VOID RT28xxPciStaAsicForceWakeup( 7085VOID RT28xxPciStaAsicForceWakeup(
7071 IN PRTMP_ADAPTER pAd, 7086 IN PRTMP_ADAPTER pAd,
7072 IN BOOLEAN bFromTx); 7087 IN UCHAR Level);
7073 7088
7074VOID RT28xxPciStaAsicSleepThenAutoWakeup( 7089VOID RT28xxPciStaAsicSleepThenAutoWakeup(
7075 IN PRTMP_ADAPTER pAd, 7090 IN PRTMP_ADAPTER pAd,
@@ -7132,6 +7147,18 @@ PCHAR RTMPGetRalinkEncryModeStr(
7132#ifdef CONFIG_STA_SUPPORT 7147#ifdef CONFIG_STA_SUPPORT
7133VOID AsicStaBbpTuning( 7148VOID AsicStaBbpTuning(
7134 IN PRTMP_ADAPTER pAd); 7149 IN PRTMP_ADAPTER pAd);
7150
7151VOID AsicResetFromDMABusy(
7152 IN PRTMP_ADAPTER pAd);
7153
7154VOID AsicResetBBP(
7155 IN PRTMP_ADAPTER pAd);
7156
7157VOID AsicResetMAC(
7158 IN PRTMP_ADAPTER pAd);
7159
7160VOID AsicResetPBF(
7161 IN PRTMP_ADAPTER pAd);
7135#endif // CONFIG_STA_SUPPORT // 7162#endif // CONFIG_STA_SUPPORT //
7136 7163
7137void RTMP_IndicateMediaState( 7164void RTMP_IndicateMediaState(
diff --git a/drivers/staging/rt2860/rtmp_def.h b/drivers/staging/rt2860/rtmp_def.h
index be982147883..9532eccfd9b 100644
--- a/drivers/staging/rt2860/rtmp_def.h
+++ b/drivers/staging/rt2860/rtmp_def.h
@@ -212,6 +212,19 @@
212#define fOP_STATUS_WAKEUP_NOW 0x00008000 212#define fOP_STATUS_WAKEUP_NOW 0x00008000
213#define fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE 0x00020000 213#define fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE 0x00020000
214 214
215//
216// RTMP_ADAPTER PSFlags : related to advanced power save.
217//
218// Indicate whether driver can go to sleep mode from now. This flag is useful AFTER link up
219#define fRTMP_PS_CAN_GO_SLEEP 0x00000001
220// Indicate whether driver has issue a LinkControl command to PCIe L1
221#define fRTMP_PS_SET_PCI_CLK_OFF_COMMAND 0x00000002
222// Indicate driver should disable kick off hardware to send packets from now.
223#define fRTMP_PS_DISABLE_TX 0x00000004
224// Indicate driver should IMMEDIATELY fo to sleep after receiving AP's beacon in which doesn't indicate unicate nor multicast packets for me
225//. This flag is used ONLY in RTMPHandleRxDoneInterrupt routine.
226#define fRTMP_PS_GO_TO_SLEEP_NOW 0x00000008
227
215#ifdef DOT11N_DRAFT3 228#ifdef DOT11N_DRAFT3
216#define fOP_STATUS_SCAN_2040 0x00040000 229#define fOP_STATUS_SCAN_2040 0x00040000
217#endif // DOT11N_DRAFT3 // 230#endif // DOT11N_DRAFT3 //
@@ -1514,12 +1527,14 @@
1514#define MCAST_HTMIX 3 1527#define MCAST_HTMIX 3
1515#endif // MCAST_RATE_SPECIFIC // 1528#endif // MCAST_RATE_SPECIFIC //
1516 1529
1517// For AsicRadioOff/AsicRadioOn function 1530// For AsicRadioOff/AsicRadioOn/AsicForceWakeup function
1518#define DOT11POWERSAVE 0 1531// This is to indicate from where to call this function.
1519#define GUIRADIO_OFF 1 1532#define DOT11POWERSAVE 0 // TO do .11 power save sleep
1520#define RTMP_HALT 2 1533#define GUIRADIO_OFF 1 // To perform Radio OFf command from GUI
1521#define GUI_IDLE_POWER_SAVE 3 1534#define RTMP_HALT 2 // Called from Halt handler.
1522// -- 1535#define GUI_IDLE_POWER_SAVE 3 // Call to sleep before link up with AP
1536#define FROM_TX 4 // Force wake up from Tx packet.
1537
1523 1538
1524 1539
1525// definition for WpaSupport flag 1540// definition for WpaSupport flag
diff --git a/drivers/staging/rt2860/sta/assoc.c b/drivers/staging/rt2860/sta/assoc.c
index 42db753eed7..34f1c1490f4 100644
--- a/drivers/staging/rt2860/sta/assoc.c
+++ b/drivers/staging/rt2860/sta/assoc.c
@@ -473,12 +473,7 @@ VOID MlmeAssocReqAction(
473 RSNIe = IE_WPA2; 473 RSNIe = IE_WPA2;
474 } 474 }
475 475
476#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT 476 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, BSS0);
477#ifdef SIOCSIWGENIE
478 if (pAd->StaCfg.WpaSupplicantUP != 1)
479#endif // SIOCSIWGENIE //
480#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
481 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, BSS0);
482 477
483 // Check for WPA PMK cache list 478 // Check for WPA PMK cache list
484 if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) 479 if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)
@@ -504,17 +499,6 @@ VOID MlmeAssocReqAction(
504 } 499 }
505 } 500 }
506 501
507#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
508#ifdef SIOCSIWGENIE
509 if (pAd->StaCfg.WpaSupplicantUP == 1)
510 {
511 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
512 pAd->StaCfg.RSNIE_Len, pAd->StaCfg.RSN_IE,
513 END_OF_ARGS);
514 }
515 else
516#endif
517#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
518 { 502 {
519 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 503 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
520 1, &RSNIe, 504 1, &RSNIe,
@@ -525,11 +509,6 @@ VOID MlmeAssocReqAction(
525 509
526 FrameLen += tmp; 510 FrameLen += tmp;
527 511
528#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
529#ifdef SIOCSIWGENIE
530 if (pAd->StaCfg.WpaSupplicantUP != 1)
531#endif
532#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
533 { 512 {
534 // Append Variable IE 513 // Append Variable IE
535 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &RSNIe, 1); 514 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &RSNIe, 1);
diff --git a/drivers/staging/rt2860/sta/connect.c b/drivers/staging/rt2860/sta/connect.c
index 36f28f8b4aa..bbe803312cc 100644
--- a/drivers/staging/rt2860/sta/connect.c
+++ b/drivers/staging/rt2860/sta/connect.c
@@ -337,6 +337,10 @@ VOID CntlOidSsidProc(
337 MLME_DISASSOC_REQ_STRUCT DisassocReq; 337 MLME_DISASSOC_REQ_STRUCT DisassocReq;
338 ULONG Now; 338 ULONG Now;
339 339
340 // BBP and RF are not accessible in PS mode, we has to wake them up first
341 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
342 AsicForceWakeup(pAd, RTMP_HALT);
343
340 // Step 1. record the desired user settings to MlmeAux 344 // Step 1. record the desired user settings to MlmeAux
341 NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); 345 NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
342 NdisMoveMemory(pAd->MlmeAux.Ssid, pOidSsid->Ssid, pOidSsid->SsidLength); 346 NdisMoveMemory(pAd->MlmeAux.Ssid, pOidSsid->Ssid, pOidSsid->SsidLength);
@@ -1240,6 +1244,13 @@ VOID LinkUp(
1240 UCHAR Value = 0, idx; 1244 UCHAR Value = 0, idx;
1241 MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry; 1245 MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry;
1242 1246
1247 if (RTMP_TEST_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND))
1248 {
1249 RTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_HALT);
1250 RTMPusecDelay(6000);
1251 pAd->bPCIclkOff = FALSE;
1252 }
1253
1243 pEntry = &pAd->MacTab.Content[BSSID_WCID]; 1254 pEntry = &pAd->MacTab.Content[BSSID_WCID];
1244 1255
1245 // 1256 //
@@ -1598,6 +1609,8 @@ VOID LinkUp(
1598 IV = 0; 1609 IV = 0;
1599 IV |= (pAd->StaCfg.DefaultKeyId << 30); 1610 IV |= (pAd->StaCfg.DefaultKeyId << 30);
1600 AsicUpdateWCIDIVEIV(pAd, BSSID_WCID, IV, 0); 1611 AsicUpdateWCIDIVEIV(pAd, BSSID_WCID, IV, 0);
1612
1613 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
1601 } 1614 }
1602 // NOTE: 1615 // NOTE:
1603 // the decision of using "short slot time" or not may change dynamically due to 1616 // the decision of using "short slot time" or not may change dynamically due to
@@ -1919,6 +1932,7 @@ VOID LinkUp(
1919 } 1932 }
1920 1933
1921 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS); 1934 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
1935 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW);
1922 1936
1923#ifdef DOT11_N_SUPPORT 1937#ifdef DOT11_N_SUPPORT
1924#ifdef DOT11N_DRAFT3 1938#ifdef DOT11N_DRAFT3
@@ -1961,6 +1975,7 @@ VOID LinkDown(
1961 IN BOOLEAN IsReqFromAP) 1975 IN BOOLEAN IsReqFromAP)
1962{ 1976{
1963 UCHAR i, ByteValue = 0; 1977 UCHAR i, ByteValue = 0;
1978 BOOLEAN Cancelled;
1964 1979
1965 // Do nothing if monitor mode is on 1980 // Do nothing if monitor mode is on
1966 if (MONITOR_ON(pAd)) 1981 if (MONITOR_ON(pAd))
@@ -1972,6 +1987,12 @@ VOID LinkDown(
1972 return; 1987 return;
1973#endif // RALINK_ATE // 1988#endif // RALINK_ATE //
1974 1989
1990 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW);
1991 RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);
1992
1993 // Not allow go to sleep within linkdown function.
1994 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
1995
1975 if (pAd->CommonCfg.bWirelessEvent) 1996 if (pAd->CommonCfg.bWirelessEvent)
1976 { 1997 {
1977 RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 1998 RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
@@ -1988,12 +2009,11 @@ VOID LinkDown(
1988 RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled); 2009 RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);
1989 } 2010 }
1990 2011
1991 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) 2012 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) ||
2013 RTMP_TEST_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND) ||
2014 RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))
1992 { 2015 {
1993 AUTO_WAKEUP_STRUC AutoWakeupCfg; 2016 AsicForceWakeup(pAd, RTMP_HALT);
1994 AsicForceWakeup(pAd, TRUE);
1995 AutoWakeupCfg.word = 0;
1996 RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
1997 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE); 2017 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
1998 } 2018 }
1999 2019
@@ -2266,6 +2286,9 @@ VOID LinkDown(
2266 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x1fff); 2286 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x1fff);
2267 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS); 2287 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
2268 2288
2289 // Allow go to sleep after linkdown steps.
2290 RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
2291
2269#ifdef WPA_SUPPLICANT_SUPPORT 2292#ifdef WPA_SUPPLICANT_SUPPORT
2270#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT 2293#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT
2271 if (pAd->StaCfg.WpaSupplicantUP) { 2294 if (pAd->StaCfg.WpaSupplicantUP) {
diff --git a/drivers/staging/rt2860/sta/rtmp_data.c b/drivers/staging/rt2860/sta/rtmp_data.c
index 36aff247cd9..5b3fb2deee8 100644
--- a/drivers/staging/rt2860/sta/rtmp_data.c
+++ b/drivers/staging/rt2860/sta/rtmp_data.c
@@ -811,6 +811,13 @@ BOOLEAN STARxDoneInterruptHandle(
811 } 811 }
812 } 812 }
813 813
814 // fRTMP_PS_GO_TO_SLEEP_NOW is set if receiving beacon.
815 if (RTMP_TEST_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW) && (INFRA_ON(pAd)))
816 {
817 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW);
818 AsicSleepThenAutoWakeup(pAd, pAd->ThisTbttNumToNextWakeUp);
819 bReschedule = FALSE;
820 }
814 return bReschedule; 821 return bReschedule;
815} 822}
816 823
@@ -828,7 +835,7 @@ BOOLEAN STARxDoneInterruptHandle(
828VOID RTMPHandleTwakeupInterrupt( 835VOID RTMPHandleTwakeupInterrupt(
829 IN PRTMP_ADAPTER pAd) 836 IN PRTMP_ADAPTER pAd)
830{ 837{
831 AsicForceWakeup(pAd, FALSE); 838 AsicForceWakeup(pAd, DOT11POWERSAVE);
832} 839}
833 840
834/* 841/*
@@ -1889,7 +1896,8 @@ VOID STA_AMPDU_Frame_Tx(
1889 // 1896 //
1890 // Kick out Tx 1897 // Kick out Tx
1891 // 1898 //
1892 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); 1899 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))
1900 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
1893 1901
1894 pAd->RalinkCounters.KickTxCount++; 1902 pAd->RalinkCounters.KickTxCount++;
1895 pAd->RalinkCounters.OneSecTxDoneCount++; 1903 pAd->RalinkCounters.OneSecTxDoneCount++;
@@ -2019,7 +2027,8 @@ VOID STA_AMSDU_Frame_Tx(
2019 // 2027 //
2020 // Kick out Tx 2028 // Kick out Tx
2021 // 2029 //
2022 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); 2030 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))
2031 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
2023} 2032}
2024#endif // DOT11_N_SUPPORT // 2033#endif // DOT11_N_SUPPORT //
2025 2034
@@ -2139,7 +2148,8 @@ VOID STA_Legacy_Frame_Tx(
2139 // 2148 //
2140 // Kick out Tx 2149 // Kick out Tx
2141 // 2150 //
2142 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); 2151 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))
2152 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
2143} 2153}
2144 2154
2145 2155
@@ -2249,7 +2259,8 @@ VOID STA_ARalink_Frame_Tx(
2249 // 2259 //
2250 // Kick out Tx 2260 // Kick out Tx
2251 // 2261 //
2252 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); 2262 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))
2263 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
2253 2264
2254} 2265}
2255 2266
@@ -2526,7 +2537,7 @@ NDIS_STATUS STAHardTransmit(
2526 if ((pAd->StaCfg.Psm == PWR_SAVE) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) 2537 if ((pAd->StaCfg.Psm == PWR_SAVE) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
2527 { 2538 {
2528 DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicForceWakeup At HardTx\n")); 2539 DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicForceWakeup At HardTx\n"));
2529 AsicForceWakeup(pAd, TRUE); 2540 AsicForceWakeup(pAd, FROM_TX);
2530 } 2541 }
2531 2542
2532 // It should not change PSM bit, when APSD turn on. 2543 // It should not change PSM bit, when APSD turn on.
diff --git a/drivers/staging/rt2860/sta/sync.c b/drivers/staging/rt2860/sta/sync.c
index d196f85395c..28bf929cba0 100644
--- a/drivers/staging/rt2860/sta/sync.c
+++ b/drivers/staging/rt2860/sta/sync.c
@@ -1536,7 +1536,6 @@ VOID PeerBeacon(
1536 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) 1536 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
1537 { 1537 {
1538 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3); 1538 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3);
1539 // Turn clk to 80Mhz.
1540 } 1539 }
1541#endif // RT2860 // 1540#endif // RT2860 //
1542 if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable && 1541 if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable &&
@@ -1588,7 +1587,10 @@ VOID PeerBeacon(
1588 1587
1589 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) 1588 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
1590 { 1589 {
1591 AsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp); 1590 // Set a flag to go to sleep . Then after parse this RxDoneInterrupt, will go to sleep mode.
1591 RTMP_SET_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW);
1592 pAd->ThisTbttNumToNextWakeUp = TbttNumToNextWakeUp;
1593 //AsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);
1592 } 1594 }
1593 } 1595 }
1594 } 1596 }
diff --git a/drivers/staging/rt2860/sta/wpa.c b/drivers/staging/rt2860/sta/wpa.c
index 774c6567ae5..2609d845fd5 100644
--- a/drivers/staging/rt2860/sta/wpa.c
+++ b/drivers/staging/rt2860/sta/wpa.c
@@ -1384,6 +1384,10 @@ VOID WpaGroupMsg1Action(
1384 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_TKIP; 1384 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_TKIP;
1385 else if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled) 1385 else if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled)
1386 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_AES; 1386 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_AES;
1387 else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled)
1388 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_WEP64;
1389 else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP104Enabled)
1390 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_WEP128;
1387 1391
1388 //hex_dump("Group Key :", pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, LEN_TKIP_EK); 1392 //hex_dump("Group Key :", pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, LEN_TKIP_EK);
1389 } 1393 }
@@ -1760,7 +1764,7 @@ BOOLEAN ParseKeyData(
1760 // Get GTK length - refer to IEEE 802.11i-2004 p.82 1764 // Get GTK length - refer to IEEE 802.11i-2004 p.82
1761 GTKLEN = pKDE->Len -6; 1765 GTKLEN = pKDE->Len -6;
1762 1766
1763 if (GTKLEN < LEN_AES_KEY) 1767 if (GTKLEN < MIN_LEN_OF_GTK)
1764 { 1768 {
1765 DBGPRINT(RT_DEBUG_ERROR, ("ERROR: GTK Key length is too short (%d) \n", GTKLEN)); 1769 DBGPRINT(RT_DEBUG_ERROR, ("ERROR: GTK Key length is too short (%d) \n", GTKLEN));
1766 return FALSE; 1770 return FALSE;
@@ -1786,6 +1790,10 @@ BOOLEAN ParseKeyData(
1786 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_TKIP; 1790 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_TKIP;
1787 else if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled) 1791 else if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled)
1788 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_AES; 1792 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_AES;
1793 else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled)
1794 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_WEP64;
1795 else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP104Enabled)
1796 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_WEP128;
1789 1797
1790 return TRUE; 1798 return TRUE;
1791 1799
diff --git a/drivers/staging/rt2860/sta_ioctl.c b/drivers/staging/rt2860/sta_ioctl.c
index c11eeabe660..320d9b2046b 100644
--- a/drivers/staging/rt2860/sta_ioctl.c
+++ b/drivers/staging/rt2860/sta_ioctl.c
@@ -352,6 +352,20 @@ VOID RTMPAddKey(
352 352
353 DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddKey ------>\n")); 353 DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddKey ------>\n"));
354 354
355 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
356 if (RTMP_TEST_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND))
357 {
358 if (pAd->StaCfg.bRadio == FALSE)
359 {
360 RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
361 return (NDIS_STATUS_SUCCESS);
362 }
363 DBGPRINT(RT_DEBUG_TRACE,("RTMPWPAAddKeyProc1==>\n"));
364 RTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_HALT);
365 RTMPusecDelay(6000);
366 pAd->bPCIclkOff = FALSE;
367 }
368
355 if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) 369 if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
356 { 370 {
357 if (pKey->KeyIndex & 0x80000000) 371 if (pKey->KeyIndex & 0x80000000)
@@ -545,6 +559,8 @@ VOID RTMPAddKey(
545 } 559 }
546 } 560 }
547end: 561end:
562 RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
563 DBGPRINT(RT_DEBUG_INFO, ("<------ RTMPAddKey\n"));
548 return; 564 return;
549} 565}
550 566
@@ -1028,6 +1044,15 @@ int rt_ioctl_siwscan(struct net_device *dev,
1028 return -EINVAL; 1044 return -EINVAL;
1029 } 1045 }
1030 1046
1047 if ((pAdapter->OpMode == OPMODE_STA) && (IDLE_ON(pAdapter))
1048 && (pAdapter->StaCfg.bRadio == TRUE)
1049 && (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_IDLE_RADIO_OFF)))
1050 {
1051 RT28xxPciAsicRadioOn(pAdapter, GUI_IDLE_POWER_SAVE);
1052 }
1053 // Check if still radio off.
1054 else if (pAdapter->bPCIclkOff == TRUE)
1055 return 0;
1031 1056
1032#ifdef WPA_SUPPLICANT_SUPPORT 1057#ifdef WPA_SUPPLICANT_SUPPORT
1033 if (pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) 1058 if (pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE)
@@ -2151,12 +2176,6 @@ rt_private_show(struct net_device *dev, struct iw_request_info *info,
2151 wrq->length = strlen(extra) + 1; // 1: size of '\0' 2176 wrq->length = strlen(extra) + 1; // 1: size of '\0'
2152 break; 2177 break;
2153 case RAIO_ON: 2178 case RAIO_ON:
2154 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
2155 {
2156 sprintf(extra, "Scanning\n");
2157 wrq->length = strlen(extra) + 1; // 1: size of '\0'
2158 break;
2159 }
2160 pAd->StaCfg.bSwRadio = TRUE; 2179 pAd->StaCfg.bSwRadio = TRUE;
2161 //if (pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio)) 2180 //if (pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio))
2162 { 2181 {
@@ -2440,6 +2459,20 @@ void fnSetCipherKey(
2440 IN BOOLEAN bGTK, 2459 IN BOOLEAN bGTK,
2441 IN struct iw_encode_ext *ext) 2460 IN struct iw_encode_ext *ext)
2442{ 2461{
2462 RTMP_CLEAR_PSFLAG(pAdapter, fRTMP_PS_CAN_GO_SLEEP);
2463 if (RTMP_TEST_PSFLAG(pAdapter, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND))
2464 {
2465 if (pAdapter->StaCfg.bRadio == FALSE)
2466 {
2467 RTMP_SET_PSFLAG(pAdapter, fRTMP_PS_CAN_GO_SLEEP);
2468 return (NDIS_STATUS_SUCCESS);
2469 }
2470 DBGPRINT(RT_DEBUG_TRACE,("RTMPWPAAddKeyProc1==>\n"));
2471 RTMPPCIeLinkCtrlValueRestore(pAdapter, RESTORE_HALT);
2472 RTMPusecDelay(6000);
2473 pAdapter->bPCIclkOff = FALSE;
2474 }
2475
2443 NdisZeroMemory(&pAdapter->SharedKey[BSS0][keyIdx], sizeof(CIPHER_KEY)); 2476 NdisZeroMemory(&pAdapter->SharedKey[BSS0][keyIdx], sizeof(CIPHER_KEY));
2444 pAdapter->SharedKey[BSS0][keyIdx].KeyLen = LEN_TKIP_EK; 2477 pAdapter->SharedKey[BSS0][keyIdx].KeyLen = LEN_TKIP_EK;
2445 NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, ext->key, LEN_TKIP_EK); 2478 NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, ext->key, LEN_TKIP_EK);
@@ -2470,6 +2503,8 @@ void fnSetCipherKey(
2470 keyIdx, 2503 keyIdx,
2471 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg, 2504 pAdapter->SharedKey[BSS0][keyIdx].CipherAlg,
2472 &pAdapter->MacTab.Content[BSSID_WCID]); 2505 &pAdapter->MacTab.Content[BSSID_WCID]);
2506
2507 RTMP_SET_PSFLAG(pAdapter, fRTMP_PS_CAN_GO_SLEEP);
2473} 2508}
2474 2509
2475int rt_ioctl_siwencodeext(struct net_device *dev, 2510int rt_ioctl_siwencodeext(struct net_device *dev,
@@ -2534,6 +2569,21 @@ int rt_ioctl_siwencodeext(struct net_device *dev,
2534 2569
2535 NdisZeroMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, 16); 2570 NdisZeroMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, 16);
2536 NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, ext->key, ext->key_len); 2571 NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, ext->key, ext->key_len);
2572
2573 if (pAdapter->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled ||
2574 pAdapter->StaCfg.GroupCipher == Ndis802_11GroupWEP104Enabled)
2575 {
2576 // Set Group key material to Asic
2577 AsicAddSharedKeyEntry(pAdapter, BSS0, keyIdx, pAdapter->SharedKey[BSS0][keyIdx].CipherAlg, pAdapter->SharedKey[BSS0][keyIdx].Key, NULL, NULL);
2578
2579 // Update WCID attribute table and IVEIV table for this group key table
2580 RTMPAddWcidAttributeEntry(pAdapter, BSS0, keyIdx, pAdapter->SharedKey[BSS0][keyIdx].CipherAlg, NULL);
2581
2582 STA_PORT_SECURED(pAdapter);
2583
2584 // Indicate Connected for GUI
2585 pAdapter->IndicateMediaState = NdisMediaStateConnected;
2586 }
2537 break; 2587 break;
2538 case IW_ENCODE_ALG_TKIP: 2588 case IW_ENCODE_ALG_TKIP:
2539 DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_ENCODE_ALG_TKIP - keyIdx = %d, ext->key_len = %d\n", __func__, keyIdx, ext->key_len)); 2589 DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_ENCODE_ALG_TKIP - keyIdx = %d, ext->key_len = %d\n", __func__, keyIdx, ext->key_len));
@@ -4249,7 +4299,23 @@ INT RTMPSetInformation(
4249 } 4299 }
4250 4300
4251#ifdef WPA_SUPPLICANT_SUPPORT 4301#ifdef WPA_SUPPLICANT_SUPPORT
4252 if (pAdapter->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED) 4302 if ((pAdapter->StaCfg.WpaSupplicantUP != 0) &&
4303 (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA))
4304 {
4305 Key = pWepKey->KeyMaterial;
4306
4307 // Set Group key material to Asic
4308 AsicAddSharedKeyEntry(pAdapter, BSS0, KeyIdx, CipherAlg, Key, NULL, NULL);
4309
4310 // Update WCID attribute table and IVEIV table for this group key table
4311 RTMPAddWcidAttributeEntry(pAdapter, BSS0, KeyIdx, CipherAlg, NULL);
4312
4313 STA_PORT_SECURED(pAdapter);
4314
4315 // Indicate Connected for GUI
4316 pAdapter->IndicateMediaState = NdisMediaStateConnected;
4317 }
4318 else if (pAdapter->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)
4253#endif // WPA_SUPPLICANT_SUPPORT 4319#endif // WPA_SUPPLICANT_SUPPORT
4254 { 4320 {
4255 Key = pAdapter->SharedKey[BSS0][KeyIdx].Key; 4321 Key = pAdapter->SharedKey[BSS0][KeyIdx].Key;
diff --git a/drivers/staging/rt2860/wpa.h b/drivers/staging/rt2860/wpa.h
index 88c7c8bf3fc..0134ae6097c 100644
--- a/drivers/staging/rt2860/wpa.h
+++ b/drivers/staging/rt2860/wpa.h
@@ -90,6 +90,7 @@
90#define TKIP_AP_RXMICK_OFFSET (TKIP_AP_TXMICK_OFFSET+LEN_TKIP_TXMICK) 90#define TKIP_AP_RXMICK_OFFSET (TKIP_AP_TXMICK_OFFSET+LEN_TKIP_TXMICK)
91#define TKIP_GTK_LENGTH ((LEN_TKIP_EK)+(LEN_TKIP_RXMICK)+(LEN_TKIP_TXMICK)) 91#define TKIP_GTK_LENGTH ((LEN_TKIP_EK)+(LEN_TKIP_RXMICK)+(LEN_TKIP_TXMICK))
92#define LEN_PTK ((LEN_EAP_KEY)+(LEN_TKIP_KEY)) 92#define LEN_PTK ((LEN_EAP_KEY)+(LEN_TKIP_KEY))
93#define MIN_LEN_OF_GTK 5
93 94
94// RSN IE Length definition 95// RSN IE Length definition
95#define MAX_LEN_OF_RSNIE 90 96#define MAX_LEN_OF_RSNIE 90