aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam McDaniel <adam@array.org>2009-02-23 10:01:07 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2009-04-03 17:53:31 -0400
commited291e8051ee418de7ccd3507c1e783323fd1c35 (patch)
treec8df539e5170a8c877181db9b86312a94e33041f
parentf4b44e763d1bd1dd00213c1e5820a594b55122dc (diff)
Staging: rt2860: Ported v1.7.1.1 changes into v1.8.0.0, becoming v1.8.1.1
Staging: rt2860: Ported v1.7.1.1 changes into v1.8.0.0, becoming v1.8.1.1 When RaLink released rt2860 v1.7.0.0, it lacked proper support for both WEP and WPA/WPA2 encryption. Either was possible, but the module had to be compiled to support only one or the other, never both. Since the EeePC was the most common device with this hardware (and these users were complaining to RaLink that WPA/WPA2 encryption didn't work) RaLink released a fix as an "eeepc-specific" version of this driver, v1.7.1.1 Unfortunately, when v1.8.0.0 was released, this WPA/WPA2 fix was never included. What complicates things further is that RaLink has no interest in continuing work on this Linux driver for their hardware. This commit ports the changes introduced in v1.7.1.1 into the v1.8.0.0 release, upgrading the kernel's module to v1.8.1.1 Signed-off-by: Adam McDaniel <adam@array.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-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