diff options
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 | ||
894 | VOID RT28xxPciStaAsicForceWakeup( | 908 | VOID 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 |
40 | UCHAR OUI_WPA_NONE_AKM[4] = {0x00, 0x50, 0xF2, 0x00}; | 40 | UCHAR OUI_WPA_NONE_AKM[4] = {0x00, 0x50, 0xF2, 0x00}; |
41 | UCHAR OUI_WPA_VERSION[4] = {0x00, 0x50, 0xF2, 0x01}; | 41 | UCHAR OUI_WPA_VERSION[4] = {0x00, 0x50, 0xF2, 0x01}; |
42 | UCHAR OUI_WPA_WEP40[4] = {0x00, 0x50, 0xF2, 0x01}; | ||
42 | UCHAR OUI_WPA_TKIP[4] = {0x00, 0x50, 0xF2, 0x02}; | 43 | UCHAR OUI_WPA_TKIP[4] = {0x00, 0x50, 0xF2, 0x02}; |
43 | UCHAR OUI_WPA_CCMP[4] = {0x00, 0x50, 0xF2, 0x04}; | 44 | UCHAR OUI_WPA_CCMP[4] = {0x00, 0x50, 0xF2, 0x04}; |
45 | UCHAR OUI_WPA_WEP104[4] = {0x00, 0x50, 0xF2, 0x05}; | ||
44 | UCHAR OUI_WPA_8021X_AKM[4] = {0x00, 0x50, 0xF2, 0x01}; | 46 | UCHAR OUI_WPA_8021X_AKM[4] = {0x00, 0x50, 0xF2, 0x01}; |
45 | UCHAR OUI_WPA_PSK_AKM[4] = {0x00, 0x50, 0xF2, 0x02}; | 47 | UCHAR 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}; | |||
49 | UCHAR OUI_WPA2_CCMP[4] = {0x00, 0x0F, 0xAC, 0x04}; | 51 | UCHAR OUI_WPA2_CCMP[4] = {0x00, 0x0F, 0xAC, 0x04}; |
50 | UCHAR OUI_WPA2_8021X_AKM[4] = {0x00, 0x0F, 0xAC, 0x01}; | 52 | UCHAR OUI_WPA2_8021X_AKM[4] = {0x00, 0x0F, 0xAC, 0x01}; |
51 | UCHAR OUI_WPA2_PSK_AKM[4] = {0x00, 0x0F, 0xAC, 0x02}; | 53 | UCHAR OUI_WPA2_PSK_AKM[4] = {0x00, 0x0F, 0xAC, 0x02}; |
54 | UCHAR OUI_WPA2_WEP104[4] = {0x00, 0x0F, 0xAC, 0x05}; | ||
52 | // MSA OUI | 55 | // MSA OUI |
53 | UCHAR OUI_MSA_8021X_AKM[4] = {0x00, 0x0F, 0xAC, 0x05}; // Not yet final - IEEE 802.11s-D1.06 | 56 | UCHAR OUI_MSA_8021X_AKM[4] = {0x00, 0x0F, 0xAC, 0x05}; // Not yet final - IEEE 802.11s-D1.06 |
54 | UCHAR OUI_MSA_PSK_AKM[4] = {0x00, 0x0F, 0xAC, 0x06}; // Not yet final - IEEE 802.11s-D1.06 | 57 | UCHAR 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 | */ |
6494 | VOID AsicForceWakeup( | 6583 | VOID 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 | |||
8632 | VOID 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 | |||
8679 | VOID 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 | |||
8693 | VOID 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 | |||
8708 | VOID 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 | ||
8523 | VOID RTMPSetAGCInitValue( | 8733 | VOID 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 | |||
2045 | VOID 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 | ||
1102 | typedef struct _COUNTER_RALINK { | 1110 | typedef 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 | ||
3565 | VOID NICRestoreBBPValue( | ||
3566 | IN PRTMP_ADAPTER pAd); | ||
3567 | |||
3553 | VOID NICIssueReset( | 3568 | VOID NICIssueReset( |
3554 | IN PRTMP_ADAPTER pAd); | 3569 | IN PRTMP_ADAPTER pAd); |
3555 | 3570 | ||
@@ -4208,7 +4223,7 @@ VOID AsicForceSleep( | |||
4208 | 4223 | ||
4209 | VOID AsicForceWakeup( | 4224 | VOID 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 | ||
4214 | VOID AsicSetBssid( | 4229 | VOID AsicSetBssid( |
@@ -7069,7 +7084,7 @@ BOOLEAN RT28xxPciAsicRadioOn( | |||
7069 | 7084 | ||
7070 | VOID RT28xxPciStaAsicForceWakeup( | 7085 | VOID RT28xxPciStaAsicForceWakeup( |
7071 | IN PRTMP_ADAPTER pAd, | 7086 | IN PRTMP_ADAPTER pAd, |
7072 | IN BOOLEAN bFromTx); | 7087 | IN UCHAR Level); |
7073 | 7088 | ||
7074 | VOID RT28xxPciStaAsicSleepThenAutoWakeup( | 7089 | VOID 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 |
7133 | VOID AsicStaBbpTuning( | 7148 | VOID AsicStaBbpTuning( |
7134 | IN PRTMP_ADAPTER pAd); | 7149 | IN PRTMP_ADAPTER pAd); |
7150 | |||
7151 | VOID AsicResetFromDMABusy( | ||
7152 | IN PRTMP_ADAPTER pAd); | ||
7153 | |||
7154 | VOID AsicResetBBP( | ||
7155 | IN PRTMP_ADAPTER pAd); | ||
7156 | |||
7157 | VOID AsicResetMAC( | ||
7158 | IN PRTMP_ADAPTER pAd); | ||
7159 | |||
7160 | VOID AsicResetPBF( | ||
7161 | IN PRTMP_ADAPTER pAd); | ||
7135 | #endif // CONFIG_STA_SUPPORT // | 7162 | #endif // CONFIG_STA_SUPPORT // |
7136 | 7163 | ||
7137 | void RTMP_IndicateMediaState( | 7164 | void 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( | |||
828 | VOID RTMPHandleTwakeupInterrupt( | 835 | VOID 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 | } |
547 | end: | 561 | end: |
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 | ||
2475 | int rt_ioctl_siwencodeext(struct net_device *dev, | 2510 | int 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 |