diff options
Diffstat (limited to 'drivers/staging/rt2860/sta/sync.c')
-rw-r--r-- | drivers/staging/rt2860/sta/sync.c | 398 |
1 files changed, 106 insertions, 292 deletions
diff --git a/drivers/staging/rt2860/sta/sync.c b/drivers/staging/rt2860/sta/sync.c index a6e4362fc5c..f72f11a8ec2 100644 --- a/drivers/staging/rt2860/sta/sync.c +++ b/drivers/staging/rt2860/sta/sync.c | |||
@@ -37,45 +37,8 @@ | |||
37 | */ | 37 | */ |
38 | #include "../rt_config.h" | 38 | #include "../rt_config.h" |
39 | 39 | ||
40 | #ifdef RT2860 | ||
41 | #define AC0_DEF_TXOP 0 | ||
42 | #define AC1_DEF_TXOP 0 | ||
43 | #define AC2_DEF_TXOP 94 | ||
44 | #define AC3_DEF_TXOP 47 | ||
45 | 40 | ||
46 | VOID AdhocTurnOnQos( | ||
47 | IN PRTMP_ADAPTER pAd) | ||
48 | { | ||
49 | // Turn on QOs if use HT rate. | ||
50 | if (pAd->CommonCfg.APEdcaParm.bValid == FALSE) | ||
51 | { | ||
52 | pAd->CommonCfg.APEdcaParm.bValid = TRUE; | ||
53 | pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3; | ||
54 | pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7; | ||
55 | pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1; | ||
56 | pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1; | ||
57 | |||
58 | pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4; | ||
59 | pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4; | ||
60 | pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3; | ||
61 | pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2; | ||
62 | |||
63 | pAd->CommonCfg.APEdcaParm.Cwmax[0] = 10; | ||
64 | pAd->CommonCfg.APEdcaParm.Cwmax[1] = 6; | ||
65 | pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4; | ||
66 | pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3; | ||
67 | |||
68 | pAd->CommonCfg.APEdcaParm.Txop[0] = 0; | ||
69 | pAd->CommonCfg.APEdcaParm.Txop[1] = 0; | ||
70 | pAd->CommonCfg.APEdcaParm.Txop[2] = AC2_DEF_TXOP; | ||
71 | pAd->CommonCfg.APEdcaParm.Txop[3] = AC3_DEF_TXOP; | ||
72 | } | ||
73 | AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm); | ||
74 | } | ||
75 | #endif /* RT2860 */ | ||
76 | #ifdef RT2870 | ||
77 | #define ADHOC_ENTRY_BEACON_LOST_TIME (2*OS_HZ) // 2 sec | 41 | #define ADHOC_ENTRY_BEACON_LOST_TIME (2*OS_HZ) // 2 sec |
78 | #endif | ||
79 | 42 | ||
80 | /* | 43 | /* |
81 | ========================================================================== | 44 | ========================================================================== |
@@ -160,7 +123,7 @@ VOID BeaconTimeout( | |||
160 | } | 123 | } |
161 | 124 | ||
162 | MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_BEACON_TIMEOUT, 0, NULL); | 125 | MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_BEACON_TIMEOUT, 0, NULL); |
163 | RT28XX_MLME_HANDLER(pAd); | 126 | RTMP_MLME_HANDLER(pAd); |
164 | } | 127 | } |
165 | 128 | ||
166 | /* | 129 | /* |
@@ -188,8 +151,8 @@ VOID ScanTimeout( | |||
188 | 151 | ||
189 | if (MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_SCAN_TIMEOUT, 0, NULL)) | 152 | if (MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_SCAN_TIMEOUT, 0, NULL)) |
190 | { | 153 | { |
191 | RT28XX_MLME_HANDLER(pAd); | 154 | RTMP_MLME_HANDLER(pAd); |
192 | } | 155 | } |
193 | else | 156 | else |
194 | { | 157 | { |
195 | // To prevent SyncMachine.CurrState is SCAN_LISTEN forever. | 158 | // To prevent SyncMachine.CurrState is SCAN_LISTEN forever. |
@@ -231,7 +194,7 @@ VOID MlmeScanReqAction( | |||
231 | // Increase the scan retry counters. | 194 | // Increase the scan retry counters. |
232 | pAd->StaCfg.ScanCnt++; | 195 | pAd->StaCfg.ScanCnt++; |
233 | 196 | ||
234 | #ifdef RT2860 | 197 | #ifdef RTMP_MAC_PCI |
235 | if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) && | 198 | if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) && |
236 | (IDLE_ON(pAd)) && | 199 | (IDLE_ON(pAd)) && |
237 | (pAd->StaCfg.bRadio == TRUE) && | 200 | (pAd->StaCfg.bRadio == TRUE) && |
@@ -239,30 +202,22 @@ VOID MlmeScanReqAction( | |||
239 | { | 202 | { |
240 | RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE); | 203 | RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE); |
241 | } | 204 | } |
242 | #endif | 205 | #endif // RTMP_MAC_PCI // |
243 | 206 | ||
244 | // first check the parameter sanity | 207 | // first check the parameter sanity |
245 | if (MlmeScanReqSanity(pAd, | 208 | if (MlmeScanReqSanity(pAd, |
246 | Elem->Msg, | 209 | Elem->Msg, |
247 | Elem->MsgLen, | 210 | Elem->MsgLen, |
248 | &BssType, | 211 | &BssType, |
249 | Ssid, | 212 | (PCHAR)Ssid, |
250 | &SsidLen, | 213 | &SsidLen, |
251 | &ScanType)) | 214 | &ScanType)) |
252 | { | 215 | { |
253 | 216 | ||
254 | // Check for channel load and noise hist request | 217 | // Check for channel load and noise hist request |
255 | // Suspend MSDU only at scan request, not the last two mentioned | 218 | // Suspend MSDU only at scan request, not the last two mentioned |
256 | if ((ScanType == SCAN_CISCO_NOISE) || (ScanType == SCAN_CISCO_CHANNEL_LOAD)) | ||
257 | { | ||
258 | if (pAd->StaCfg.CCXScanChannel != pAd->CommonCfg.Channel) | ||
259 | RTMPSuspendMsduTransmission(pAd); // Suspend MSDU transmission here | ||
260 | } | ||
261 | else | ||
262 | { | ||
263 | // Suspend MSDU transmission here | 219 | // Suspend MSDU transmission here |
264 | RTMPSuspendMsduTransmission(pAd); | 220 | RTMPSuspendMsduTransmission(pAd); |
265 | } | ||
266 | 221 | ||
267 | // | 222 | // |
268 | // To prevent data lost. | 223 | // To prevent data lost. |
@@ -304,11 +259,6 @@ VOID MlmeScanReqAction( | |||
304 | // start from the first channel | 259 | // start from the first channel |
305 | pAd->MlmeAux.Channel = FirstChannel(pAd); | 260 | pAd->MlmeAux.Channel = FirstChannel(pAd); |
306 | 261 | ||
307 | // Change the scan channel when dealing with CCX beacon report | ||
308 | if ((ScanType == SCAN_CISCO_PASSIVE) || (ScanType == SCAN_CISCO_ACTIVE) || | ||
309 | (ScanType == SCAN_CISCO_CHANNEL_LOAD) || (ScanType == SCAN_CISCO_NOISE)) | ||
310 | pAd->MlmeAux.Channel = pAd->StaCfg.CCXScanChannel; | ||
311 | |||
312 | // Let BBP register at 20MHz to do scan | 262 | // Let BBP register at 20MHz to do scan |
313 | RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); | 263 | RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); |
314 | BBPValue &= (~0x18); | 264 | BBPValue &= (~0x18); |
@@ -352,7 +302,7 @@ VOID MlmeJoinReqAction( | |||
352 | 302 | ||
353 | DBGPRINT(RT_DEBUG_TRACE, ("SYNC - MlmeJoinReqAction(BSS #%ld)\n", pInfo->BssIdx)); | 303 | DBGPRINT(RT_DEBUG_TRACE, ("SYNC - MlmeJoinReqAction(BSS #%ld)\n", pInfo->BssIdx)); |
354 | 304 | ||
355 | #ifdef RT2860 | 305 | #ifdef RTMP_MAC_PCI |
356 | if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) && | 306 | if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) && |
357 | (IDLE_ON(pAd)) && | 307 | (IDLE_ON(pAd)) && |
358 | (pAd->StaCfg.bRadio == TRUE) && | 308 | (pAd->StaCfg.bRadio == TRUE) && |
@@ -360,7 +310,7 @@ VOID MlmeJoinReqAction( | |||
360 | { | 310 | { |
361 | RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE); | 311 | RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE); |
362 | } | 312 | } |
363 | #endif | 313 | #endif // RTMP_MAC_PCI // |
364 | 314 | ||
365 | // reset all the timers | 315 | // reset all the timers |
366 | RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled); | 316 | RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled); |
@@ -374,6 +324,7 @@ VOID MlmeJoinReqAction( | |||
374 | // If AP's SSID is not hidden, it is OK for updating ssid to MlmeAux again. | 324 | // If AP's SSID is not hidden, it is OK for updating ssid to MlmeAux again. |
375 | if (pBss->Hidden == 0) | 325 | if (pBss->Hidden == 0) |
376 | { | 326 | { |
327 | RTMPZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); | ||
377 | NdisMoveMemory(pAd->MlmeAux.Ssid, pBss->Ssid, pBss->SsidLen); | 328 | NdisMoveMemory(pAd->MlmeAux.Ssid, pBss->Ssid, pBss->SsidLen); |
378 | pAd->MlmeAux.SsidLen = pBss->SsidLen; | 329 | pAd->MlmeAux.SsidLen = pBss->SsidLen; |
379 | } | 330 | } |
@@ -382,10 +333,14 @@ VOID MlmeJoinReqAction( | |||
382 | pAd->MlmeAux.Channel = pBss->Channel; | 333 | pAd->MlmeAux.Channel = pBss->Channel; |
383 | pAd->MlmeAux.CentralChannel = pBss->CentralChannel; | 334 | pAd->MlmeAux.CentralChannel = pBss->CentralChannel; |
384 | 335 | ||
336 | |||
385 | // Let BBP register at 20MHz to do scan | 337 | // Let BBP register at 20MHz to do scan |
386 | RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); | 338 | RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); |
387 | BBPValue &= (~0x18); | 339 | BBPValue &= (~0x18); |
388 | RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); | 340 | RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); |
341 | #ifdef RT2860 | ||
342 | pAd->CommonCfg.BBPCurrentBW = BW_20; | ||
343 | #endif // RT2860 // | ||
389 | DBGPRINT(RT_DEBUG_TRACE, ("SYNC - BBP R4 to 20MHz.l\n")); | 344 | DBGPRINT(RT_DEBUG_TRACE, ("SYNC - BBP R4 to 20MHz.l\n")); |
390 | 345 | ||
391 | // switch channel and waiting for beacon timer | 346 | // switch channel and waiting for beacon timer |
@@ -494,7 +449,7 @@ VOID MlmeStartReqAction( | |||
494 | TimeStamp.u.LowPart = 0; | 449 | TimeStamp.u.LowPart = 0; |
495 | TimeStamp.u.HighPart = 0; | 450 | TimeStamp.u.HighPart = 0; |
496 | 451 | ||
497 | if (MlmeStartReqSanity(pAd, Elem->Msg, Elem->MsgLen, Ssid, &SsidLen)) | 452 | if (MlmeStartReqSanity(pAd, Elem->Msg, Elem->MsgLen, (PCHAR)Ssid, &SsidLen)) |
498 | { | 453 | { |
499 | // reset all the timers | 454 | // reset all the timers |
500 | RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled); | 455 | RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled); |
@@ -541,6 +496,7 @@ VOID MlmeStartReqAction( | |||
541 | { | 496 | { |
542 | pAd->MlmeAux.HtCapabilityLen = 0; | 497 | pAd->MlmeAux.HtCapabilityLen = 0; |
543 | pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE; | 498 | pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE; |
499 | NdisZeroMemory(&pAd->StaActive.SupportedPhyInfo.MCSSet[0], 16); | ||
544 | } | 500 | } |
545 | // temporarily not support QOS in IBSS | 501 | // temporarily not support QOS in IBSS |
546 | NdisZeroMemory(&pAd->MlmeAux.APEdcaParm, sizeof(EDCA_PARM)); | 502 | NdisZeroMemory(&pAd->MlmeAux.APEdcaParm, sizeof(EDCA_PARM)); |
@@ -601,6 +557,8 @@ VOID PeerBeaconAtScanAction( | |||
601 | UCHAR AddHtInfoLen; | 557 | UCHAR AddHtInfoLen; |
602 | UCHAR NewExtChannelOffset = 0xff; | 558 | UCHAR NewExtChannelOffset = 0xff; |
603 | 559 | ||
560 | |||
561 | // NdisFillMemory(Ssid, MAX_LEN_OF_SSID, 0x00); | ||
604 | pFrame = (PFRAME_802_11) Elem->Msg; | 562 | pFrame = (PFRAME_802_11) Elem->Msg; |
605 | // Init Variable IE structure | 563 | // Init Variable IE structure |
606 | pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; | 564 | pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; |
@@ -615,7 +573,7 @@ VOID PeerBeaconAtScanAction( | |||
615 | Elem->Channel, | 573 | Elem->Channel, |
616 | Addr2, | 574 | Addr2, |
617 | Bssid, | 575 | Bssid, |
618 | Ssid, | 576 | (PCHAR)Ssid, |
619 | &SsidLen, | 577 | &SsidLen, |
620 | &BssType, | 578 | &BssType, |
621 | &BeaconPeriod, | 579 | &BeaconPeriod, |
@@ -661,24 +619,7 @@ VOID PeerBeaconAtScanAction( | |||
661 | if ((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0)) | 619 | if ((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0)) |
662 | HtCapabilityLen = SIZE_HT_CAP_IE; | 620 | HtCapabilityLen = SIZE_HT_CAP_IE; |
663 | 621 | ||
664 | if ((pAd->StaCfg.CCXReqType != MSRN_TYPE_UNUSED) && (Channel == pAd->StaCfg.CCXScanChannel)) | 622 | Idx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, (PCHAR)Ssid, SsidLen, BssType, BeaconPeriod, |
665 | { | ||
666 | Idx = BssTableSetEntry(pAd, &pAd->StaCfg.CCXBssTab, Bssid, Ssid, SsidLen, BssType, BeaconPeriod, | ||
667 | &CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen,ExtRate, ExtRateLen, &HtCapability, | ||
668 | &AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, Rssi, TimeStamp, CkipFlag, | ||
669 | &EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE); | ||
670 | if (Idx != BSS_NOT_FOUND) | ||
671 | { | ||
672 | NdisMoveMemory(pAd->StaCfg.CCXBssTab.BssEntry[Idx].PTSF, &Elem->Msg[24], 4); | ||
673 | NdisMoveMemory(&pAd->StaCfg.CCXBssTab.BssEntry[Idx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4); | ||
674 | NdisMoveMemory(&pAd->StaCfg.CCXBssTab.BssEntry[Idx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4); | ||
675 | if (pAd->StaCfg.CCXReqType == MSRN_TYPE_BEACON_REQ) | ||
676 | AironetAddBeaconReport(pAd, Idx, Elem); | ||
677 | } | ||
678 | } | ||
679 | else | ||
680 | { | ||
681 | Idx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, Ssid, SsidLen, BssType, BeaconPeriod, | ||
682 | &CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability, | 623 | &CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability, |
683 | &AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, Rssi, TimeStamp, CkipFlag, | 624 | &AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, Rssi, TimeStamp, CkipFlag, |
684 | &EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE); | 625 | &EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE); |
@@ -689,7 +630,7 @@ VOID PeerBeaconAtScanAction( | |||
689 | NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4); | 630 | NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4); |
690 | NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4); | 631 | NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4); |
691 | } | 632 | } |
692 | } | 633 | |
693 | } | 634 | } |
694 | // sanity check fail, ignored | 635 | // sanity check fail, ignored |
695 | } | 636 | } |
@@ -731,6 +672,7 @@ VOID PeerBeaconAtJoinAction( | |||
731 | UCHAR AddHtInfoLen; | 672 | UCHAR AddHtInfoLen; |
732 | UCHAR NewExtChannelOffset = 0xff; | 673 | UCHAR NewExtChannelOffset = 0xff; |
733 | UCHAR CentralChannel; | 674 | UCHAR CentralChannel; |
675 | BOOLEAN bAllowNrate = FALSE; | ||
734 | 676 | ||
735 | // Init Variable IE structure | 677 | // Init Variable IE structure |
736 | pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; | 678 | pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; |
@@ -745,7 +687,7 @@ VOID PeerBeaconAtJoinAction( | |||
745 | Elem->Channel, | 687 | Elem->Channel, |
746 | Addr2, | 688 | Addr2, |
747 | Bssid, | 689 | Bssid, |
748 | Ssid, | 690 | (PCHAR)Ssid, |
749 | &SsidLen, | 691 | &SsidLen, |
750 | &BssType, | 692 | &BssType, |
751 | &BeaconPeriod, | 693 | &BeaconPeriod, |
@@ -818,8 +760,24 @@ VOID PeerBeaconAtJoinAction( | |||
818 | { | 760 | { |
819 | Idx = BssSsidTableSearch(&pAd->ScanTab, Bssid, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, Channel); | 761 | Idx = BssSsidTableSearch(&pAd->ScanTab, Bssid, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, Channel); |
820 | 762 | ||
763 | if (Idx == BSS_NOT_FOUND) | ||
764 | { | ||
765 | CHAR Rssi = 0; | ||
766 | Rssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0), ConvertToRssi(pAd, Elem->Rssi1, RSSI_1), ConvertToRssi(pAd, Elem->Rssi2, RSSI_2)); | ||
767 | Idx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, (CHAR *) Ssid, SsidLen, BssType, BeaconPeriod, | ||
768 | &Cf, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability, | ||
769 | &AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, Rssi, TimeStamp, CkipFlag, | ||
770 | &EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE); | ||
821 | if (Idx != BSS_NOT_FOUND) | 771 | if (Idx != BSS_NOT_FOUND) |
822 | { | 772 | { |
773 | NdisMoveMemory(pAd->ScanTab.BssEntry[Idx].PTSF, &Elem->Msg[24], 4); | ||
774 | NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4); | ||
775 | NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4); | ||
776 | CapabilityInfo = pAd->ScanTab.BssEntry[Idx].CapabilityInfo; | ||
777 | } | ||
778 | } | ||
779 | else | ||
780 | { | ||
823 | // | 781 | // |
824 | // Multiple SSID case, used correct CapabilityInfo | 782 | // Multiple SSID case, used correct CapabilityInfo |
825 | // | 783 | // |
@@ -847,13 +805,21 @@ VOID PeerBeaconAtJoinAction( | |||
847 | 805 | ||
848 | NdisZeroMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, 16); | 806 | NdisZeroMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, 16); |
849 | 807 | ||
808 | |||
809 | if (((pAd->StaCfg.WepStatus != Ndis802_11WEPEnabled) && (pAd->StaCfg.WepStatus != Ndis802_11Encryption2Enabled)) | ||
810 | || (pAd->CommonCfg.HT_DisallowTKIP == FALSE)) | ||
811 | { | ||
812 | bAllowNrate = TRUE; | ||
813 | } | ||
814 | |||
850 | pAd->MlmeAux.NewExtChannelOffset = NewExtChannelOffset; | 815 | pAd->MlmeAux.NewExtChannelOffset = NewExtChannelOffset; |
851 | pAd->MlmeAux.HtCapabilityLen = HtCapabilityLen; | 816 | pAd->MlmeAux.HtCapabilityLen = HtCapabilityLen; |
852 | 817 | ||
818 | RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE); | ||
853 | // filter out un-supported ht rates | 819 | // filter out un-supported ht rates |
854 | if (((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0)) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) | 820 | if (((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0)) && |
821 | ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (bAllowNrate))) | ||
855 | { | 822 | { |
856 | RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE); | ||
857 | RTMPMoveMemory(&pAd->MlmeAux.AddHtInfo, &AddHtInfo, SIZE_ADD_HT_INFO_IE); | 823 | RTMPMoveMemory(&pAd->MlmeAux.AddHtInfo, &AddHtInfo, SIZE_ADD_HT_INFO_IE); |
858 | 824 | ||
859 | // StaActive.SupportedHtPhy.MCSSet stores Peer AP's 11n Rx capability | 825 | // StaActive.SupportedHtPhy.MCSSet stores Peer AP's 11n Rx capability |
@@ -897,7 +863,9 @@ VOID PeerBeaconAtJoinAction( | |||
897 | pAd->MlmeAux.CentralChannel = pAd->MlmeAux.Channel; | 863 | pAd->MlmeAux.CentralChannel = pAd->MlmeAux.Channel; |
898 | 864 | ||
899 | pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE; | 865 | pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE; |
866 | pAd->MlmeAux.NewExtChannelOffset = 0xff; | ||
900 | RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE); | 867 | RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE); |
868 | pAd->MlmeAux.HtCapabilityLen = 0; | ||
901 | RTMPZeroMemory(&pAd->MlmeAux.AddHtInfo, SIZE_ADD_HT_INFO_IE); | 869 | RTMPZeroMemory(&pAd->MlmeAux.AddHtInfo, SIZE_ADD_HT_INFO_IE); |
902 | } | 870 | } |
903 | 871 | ||
@@ -930,6 +898,8 @@ VOID PeerBeaconAtJoinAction( | |||
930 | else //Used the default TX Power Percentage. | 898 | else //Used the default TX Power Percentage. |
931 | pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault; | 899 | pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault; |
932 | 900 | ||
901 | InitChannelRelatedValue(pAd); | ||
902 | |||
933 | pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; | 903 | pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; |
934 | Status = MLME_SUCCESS; | 904 | Status = MLME_SUCCESS; |
935 | MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status); | 905 | MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status); |
@@ -1116,8 +1086,6 @@ VOID PeerBeacon( | |||
1116 | // Add the safeguard against the mismatch of adhoc wep status | 1086 | // Add the safeguard against the mismatch of adhoc wep status |
1117 | if (pAd->StaCfg.WepStatus != pAd->ScanTab.BssEntry[Bssidx].WepStatus) | 1087 | if (pAd->StaCfg.WepStatus != pAd->ScanTab.BssEntry[Bssidx].WepStatus) |
1118 | { | 1088 | { |
1119 | DBGPRINT(RT_DEBUG_TRACE, ("SYNC - Not matched wep status %d %d\n", pAd->StaCfg.WepStatus, pAd->ScanTab.BssEntry[Bssidx].WepStatus)); | ||
1120 | DBGPRINT(RT_DEBUG_TRACE, ("bssid=%s\n", pAd->ScanTab.BssEntry[Bssidx].Bssid)); | ||
1121 | return; | 1089 | return; |
1122 | } | 1090 | } |
1123 | 1091 | ||
@@ -1181,200 +1149,8 @@ VOID PeerBeacon( | |||
1181 | pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault; | 1149 | pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault; |
1182 | } | 1150 | } |
1183 | 1151 | ||
1184 | #ifdef RT2860 | ||
1185 | // at least one 11b peer joined. downgrade the MaxTxRate to 11Mbps | ||
1186 | // after last 11b peer left for several seconds, we'll auto switch back to 11G rate | ||
1187 | // in MlmePeriodicExec() | ||
1188 | #endif | ||
1189 | if (ADHOC_ON(pAd) && (CAP_IS_IBSS_ON(CapabilityInfo))) | 1152 | if (ADHOC_ON(pAd) && (CAP_IS_IBSS_ON(CapabilityInfo))) |
1190 | { | 1153 | { |
1191 | #ifdef RT2860 | ||
1192 | BOOLEAN bRestart; | ||
1193 | BOOLEAN bnRestart; | ||
1194 | |||
1195 | bRestart = FALSE; | ||
1196 | bnRestart = FALSE; | ||
1197 | |||
1198 | do | ||
1199 | { | ||
1200 | if ((SupRateLen+ExtRateLen <= 4) && (pAd->CommonCfg.MaxTxRate > RATE_11)) | ||
1201 | { | ||
1202 | if (pAd->StaCfg.AdhocBOnlyJoined == FALSE) | ||
1203 | { | ||
1204 | DBGPRINT(RT_DEBUG_TRACE, ("SYNC - 11b peer joined. down-grade to 11b TX rates \n")); | ||
1205 | bRestart = TRUE; | ||
1206 | NdisMoveMemory(pAd->StaActive.SupRate, SupRate, MAX_LEN_OF_SUPPORTED_RATES); | ||
1207 | pAd->StaActive.SupRateLen = SupRateLen; | ||
1208 | NdisMoveMemory(pAd->StaActive.ExtRate, ExtRate, MAX_LEN_OF_SUPPORTED_RATES); | ||
1209 | pAd->StaActive.ExtRateLen = ExtRateLen; | ||
1210 | pAd->StaCfg.AdhocBOnlyJoined = TRUE; | ||
1211 | pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE; | ||
1212 | AsicSetEdcaParm(pAd, NULL); | ||
1213 | } | ||
1214 | |||
1215 | // this timestamp is for MlmePeriodicExec() to check if all 11B peers have left | ||
1216 | pAd->StaCfg.Last11bBeaconRxTime = Now; | ||
1217 | break; | ||
1218 | } | ||
1219 | |||
1220 | // Update Ht Phy. | ||
1221 | if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) | ||
1222 | { | ||
1223 | if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && | ||
1224 | !pAd->StaCfg.AdhocBGJoined && | ||
1225 | !pAd->StaCfg.AdhocBOnlyJoined) | ||
1226 | AdhocTurnOnQos(pAd); | ||
1227 | |||
1228 | // Handle rate switch issue when Adhoc mode | ||
1229 | if ((SupRateLen+ExtRateLen >= 8) && (HtCapability.MCSSet[0] == 0) && (HtCapability.MCSSet[1] == 0)) | ||
1230 | { | ||
1231 | if (pAd->StaCfg.AdhocBGJoined == FALSE) | ||
1232 | { | ||
1233 | DBGPRINT(RT_DEBUG_TRACE, ("SYNC - 11g peer joined. down-grade to 11g TX rates \n")); | ||
1234 | bRestart = TRUE; | ||
1235 | NdisMoveMemory(pAd->StaActive.SupRate, SupRate, MAX_LEN_OF_SUPPORTED_RATES); | ||
1236 | pAd->StaActive.SupRateLen = SupRateLen; | ||
1237 | NdisMoveMemory(pAd->StaActive.ExtRate, ExtRate, MAX_LEN_OF_SUPPORTED_RATES); | ||
1238 | pAd->StaActive.ExtRateLen = ExtRateLen; | ||
1239 | pAd->StaCfg.AdhocBGJoined = TRUE; | ||
1240 | pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE; | ||
1241 | AsicSetEdcaParm(pAd, NULL); | ||
1242 | } | ||
1243 | |||
1244 | // this timestamp is for MlmePeriodicExec() to check if all 11g peers have left | ||
1245 | pAd->StaCfg.Last11gBeaconRxTime = Now; | ||
1246 | break; | ||
1247 | } | ||
1248 | else if (!pAd->StaCfg.AdhocBGJoined && | ||
1249 | !pAd->StaCfg.AdhocBOnlyJoined && | ||
1250 | (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) && | ||
1251 | (HtCapability.HtCapInfo.ChannelWidth == BW_20)) | ||
1252 | { | ||
1253 | if (pAd->StaCfg.Adhoc20NJoined == FALSE) | ||
1254 | { | ||
1255 | pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel; | ||
1256 | |||
1257 | pAd->StaCfg.Adhoc20NJoined = TRUE; | ||
1258 | NdisMoveMemory(&pAd->MlmeAux.HtCapability, &HtCapability, SIZE_HT_CAP_IE); | ||
1259 | if (AddHtInfoLen != 0) | ||
1260 | NdisMoveMemory(&pAd->MlmeAux.AddHtInfo, &AddHtInfo, AddHtInfoLen); | ||
1261 | NdisMoveMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, HtCapability.MCSSet, 16); | ||
1262 | |||
1263 | RTMPCheckHt(pAd, Elem->Wcid, &pAd->MlmeAux.HtCapability, &pAd->MlmeAux.AddHtInfo); | ||
1264 | COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd); | ||
1265 | pAd->StaActive.SupportedPhyInfo.bHtEnable = TRUE; | ||
1266 | bRestart = TRUE; | ||
1267 | bnRestart = TRUE; | ||
1268 | } | ||
1269 | // this timestamp is for MlmePeriodicExec() to check if all 20MHz N peers have left | ||
1270 | pAd->StaCfg.Last20NBeaconRxTime = Now; | ||
1271 | } | ||
1272 | |||
1273 | } | ||
1274 | else | ||
1275 | { | ||
1276 | RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE); | ||
1277 | RTMPZeroMemory(&pAd->MlmeAux.AddHtInfo, SIZE_ADD_HT_INFO_IE); | ||
1278 | } | ||
1279 | }while (FALSE); | ||
1280 | |||
1281 | // If peer Adhoc is legacy mode, I don't need to call MlmeUpdateHtTxRates no matter I support HT or not | ||
1282 | if ((bRestart == TRUE) && (bnRestart == FALSE)) | ||
1283 | { | ||
1284 | MlmeUpdateTxRates(pAd, FALSE, 0); | ||
1285 | MakeIbssBeacon(pAd); // re-build BEACON frame | ||
1286 | AsicEnableIbssSync(pAd); // copy to on-chip memory | ||
1287 | } | ||
1288 | else if ((bRestart == TRUE) && (bnRestart == TRUE)) | ||
1289 | { | ||
1290 | MlmeUpdateTxRates(pAd, FALSE, BSS0); | ||
1291 | MlmeUpdateHtTxRates(pAd, BSS0); | ||
1292 | MakeIbssBeacon(pAd); // re-build BEACON frame | ||
1293 | AsicEnableIbssSync(pAd); // copy to on-chip memory | ||
1294 | } | ||
1295 | |||
1296 | // At least another peer in this IBSS, declare MediaState as CONNECTED | ||
1297 | if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) | ||
1298 | { | ||
1299 | OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); | ||
1300 | |||
1301 | pAd->IndicateMediaState = NdisMediaStateConnected; | ||
1302 | RTMP_IndicateMediaState(pAd); | ||
1303 | pAd->ExtraInfo = GENERAL_LINK_UP; | ||
1304 | AsicSetBssid(pAd, pAd->CommonCfg.Bssid); | ||
1305 | |||
1306 | // 2003/03/12 - john | ||
1307 | // Make sure this entry in "ScanTab" table, thus complies to Microsoft's policy that | ||
1308 | // "site survey" result should always include the current connected network. | ||
1309 | // | ||
1310 | Bssidx = BssTableSearch(&pAd->ScanTab, Bssid, Channel); | ||
1311 | if (Bssidx == BSS_NOT_FOUND) | ||
1312 | { | ||
1313 | Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, Ssid, SsidLen, BssType, BeaconPeriod, | ||
1314 | &CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability, | ||
1315 | &AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, RealRssi, TimeStamp, 0, | ||
1316 | &EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE); | ||
1317 | } | ||
1318 | DBGPRINT(RT_DEBUG_TRACE, ("ADHOC fOP_STATUS_MEDIA_STATE_CONNECTED.\n")); | ||
1319 | } | ||
1320 | |||
1321 | // Ad-hoc mode is using MAC address as BA session. So we need to continuously find newly joined adhoc station by receiving beacon. | ||
1322 | // To prevent always check this, we use wcid == RESERVED_WCID to recognize it as newly joined adhoc station. | ||
1323 | if (ADHOC_ON(pAd) && (Elem->Wcid == RESERVED_WCID)) | ||
1324 | { | ||
1325 | UCHAR idx; | ||
1326 | MAC_TABLE_ENTRY *pEntry; | ||
1327 | |||
1328 | // look up the existing table | ||
1329 | pEntry = MacTableLookup(pAd, Addr2); | ||
1330 | if (pEntry == NULL) | ||
1331 | { | ||
1332 | // Another adhoc joining, add to our MAC table. | ||
1333 | pEntry = MacTableInsertEntry(pAd, Addr2, BSS0, FALSE); | ||
1334 | if (pEntry) | ||
1335 | { | ||
1336 | pEntry->Sst = SST_ASSOC; | ||
1337 | idx = pAd->StaCfg.DefaultKeyId; | ||
1338 | // After InsertEntry, Write to ASIC on-chip table. | ||
1339 | RT28XX_STA_SECURITY_INFO_ADD(pAd, BSS0, idx, pEntry); | ||
1340 | DBGPRINT(RT_DEBUG_TRACE, ("ADHOC %x:%x:%x:%x:%x:%x join in.Entry=%d\n", Addr2[0],Addr2[1],Addr2[2],Addr2[3],Addr2[4],Addr2[5], pEntry->Aid)); | ||
1341 | |||
1342 | pEntry->HTPhyMode.word = pAd->StaCfg.HTPhyMode.word; | ||
1343 | if (HtCapabilityLen <= 0) | ||
1344 | { | ||
1345 | pEntry->HTPhyMode.field.STBC = 0; | ||
1346 | pEntry->HTPhyMode.field.BW = 0; | ||
1347 | pEntry->HTPhyMode.field.ShortGI = 0; | ||
1348 | if ((SupRateLen+ExtRateLen <= 4) && (pAd->CommonCfg.Channel <= 14)) | ||
1349 | { | ||
1350 | pEntry->HTPhyMode.field.MODE = MODE_CCK; | ||
1351 | } | ||
1352 | else | ||
1353 | { | ||
1354 | pEntry->HTPhyMode.field.MODE = MODE_OFDM; | ||
1355 | } | ||
1356 | MlmeUpdateTxRates(pAd, FALSE, 0); | ||
1357 | } | ||
1358 | else | ||
1359 | { | ||
1360 | MlmeUpdateTxRates(pAd, FALSE, 0); | ||
1361 | MlmeUpdateHtTxRates(pAd, BSS0); | ||
1362 | } | ||
1363 | |||
1364 | { | ||
1365 | union iwreq_data wrqu; | ||
1366 | wext_notify_event_assoc(pAd); | ||
1367 | |||
1368 | memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN); | ||
1369 | memcpy(wrqu.ap_addr.sa_data, pAd->MlmeAux.Bssid, MAC_ADDR_LEN); | ||
1370 | wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL); | ||
1371 | |||
1372 | } | ||
1373 | } | ||
1374 | } | ||
1375 | } | ||
1376 | #endif /* RT2860 */ | ||
1377 | #ifdef RT2870 | ||
1378 | UCHAR MaxSupportedRateIn500Kbps = 0; | 1154 | UCHAR MaxSupportedRateIn500Kbps = 0; |
1379 | UCHAR idx; | 1155 | UCHAR idx; |
1380 | MAC_TABLE_ENTRY *pEntry; | 1156 | MAC_TABLE_ENTRY *pEntry; |
@@ -1404,7 +1180,14 @@ VOID PeerBeacon( | |||
1404 | // Another adhoc joining, add to our MAC table. | 1180 | // Another adhoc joining, add to our MAC table. |
1405 | pEntry = MacTableInsertEntry(pAd, Addr2, BSS0, FALSE); | 1181 | pEntry = MacTableInsertEntry(pAd, Addr2, BSS0, FALSE); |
1406 | 1182 | ||
1407 | if (StaAddMacTableEntry(pAd, pEntry, MaxSupportedRateIn500Kbps, &HtCapability, HtCapabilityLen, CapabilityInfo) == FALSE) | 1183 | if (StaAddMacTableEntry(pAd, |
1184 | pEntry, | ||
1185 | MaxSupportedRateIn500Kbps, | ||
1186 | &HtCapability, | ||
1187 | HtCapabilityLen, | ||
1188 | &AddHtInfo, | ||
1189 | AddHtInfoLen, | ||
1190 | CapabilityInfo) == FALSE) | ||
1408 | { | 1191 | { |
1409 | DBGPRINT(RT_DEBUG_TRACE, ("ADHOC - Add Entry failed.\n")); | 1192 | DBGPRINT(RT_DEBUG_TRACE, ("ADHOC - Add Entry failed.\n")); |
1410 | return; | 1193 | return; |
@@ -1414,7 +1197,7 @@ VOID PeerBeacon( | |||
1414 | (Elem->Wcid == RESERVED_WCID)) | 1197 | (Elem->Wcid == RESERVED_WCID)) |
1415 | { | 1198 | { |
1416 | idx = pAd->StaCfg.DefaultKeyId; | 1199 | idx = pAd->StaCfg.DefaultKeyId; |
1417 | RT28XX_STA_SECURITY_INFO_ADD(pAd, BSS0, idx, pEntry); | 1200 | RTMP_STA_SECURITY_INFO_ADD(pAd, BSS0, idx, pEntry); |
1418 | } | 1201 | } |
1419 | } | 1202 | } |
1420 | 1203 | ||
@@ -1445,7 +1228,6 @@ VOID PeerBeacon( | |||
1445 | } | 1228 | } |
1446 | DBGPRINT(RT_DEBUG_TRACE, ("ADHOC fOP_STATUS_MEDIA_STATE_CONNECTED.\n")); | 1229 | DBGPRINT(RT_DEBUG_TRACE, ("ADHOC fOP_STATUS_MEDIA_STATE_CONNECTED.\n")); |
1447 | } | 1230 | } |
1448 | #endif /* RT2870 */ | ||
1449 | } | 1231 | } |
1450 | 1232 | ||
1451 | if (INFRA_ON(pAd)) | 1233 | if (INFRA_ON(pAd)) |
@@ -1534,28 +1316,32 @@ VOID PeerBeacon( | |||
1534 | // 5. otherwise, put PHY back to sleep to save battery. | 1316 | // 5. otherwise, put PHY back to sleep to save battery. |
1535 | if (MessageToMe) | 1317 | if (MessageToMe) |
1536 | { | 1318 | { |
1537 | #ifdef RT2860 | 1319 | #ifdef RTMP_MAC_PCI |
1538 | if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) | 1320 | if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) |
1539 | { | 1321 | { |
1322 | // Restore to correct BBP R3 value | ||
1323 | if (pAd->Antenna.field.RxPath > 1) | ||
1540 | RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3); | 1324 | RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3); |
1325 | // Turn clk to 80Mhz. | ||
1541 | } | 1326 | } |
1542 | #endif | 1327 | #endif // RTMP_MAC_PCI // |
1543 | if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable && | 1328 | if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable && |
1544 | pAd->CommonCfg.bAPSDAC_BE && pAd->CommonCfg.bAPSDAC_BK && pAd->CommonCfg.bAPSDAC_VI && pAd->CommonCfg.bAPSDAC_VO) | 1329 | pAd->CommonCfg.bAPSDAC_BE && pAd->CommonCfg.bAPSDAC_BK && pAd->CommonCfg.bAPSDAC_VI && pAd->CommonCfg.bAPSDAC_VO) |
1545 | { | 1330 | { |
1546 | pAd->CommonCfg.bNeedSendTriggerFrame = TRUE; | 1331 | pAd->CommonCfg.bNeedSendTriggerFrame = TRUE; |
1547 | } | 1332 | } |
1548 | else | 1333 | else |
1549 | RT28XX_PS_POLL_ENQUEUE(pAd); | 1334 | RTMP_PS_POLL_ENQUEUE(pAd); |
1550 | } | 1335 | } |
1551 | else if (BcastFlag && (DtimCount == 0) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM)) | 1336 | else if (BcastFlag && (DtimCount == 0) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM)) |
1552 | { | 1337 | { |
1553 | #ifdef RT2860 | 1338 | #ifdef RTMP_MAC_PCI |
1554 | if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) | 1339 | if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) |
1555 | { | 1340 | { |
1341 | if (pAd->Antenna.field.RxPath > 1) | ||
1556 | RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3); | 1342 | RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3); |
1557 | } | 1343 | } |
1558 | #endif | 1344 | #endif // RTMP_MAC_PCI // |
1559 | } | 1345 | } |
1560 | else if ((pAd->TxSwQueue[QID_AC_BK].Number != 0) || | 1346 | else if ((pAd->TxSwQueue[QID_AC_BK].Number != 0) || |
1561 | (pAd->TxSwQueue[QID_AC_BE].Number != 0) || | 1347 | (pAd->TxSwQueue[QID_AC_BE].Number != 0) || |
@@ -1569,12 +1355,42 @@ VOID PeerBeacon( | |||
1569 | { | 1355 | { |
1570 | // TODO: consider scheduled HCCA. might not be proper to use traditional DTIM-based power-saving scheme | 1356 | // TODO: consider scheduled HCCA. might not be proper to use traditional DTIM-based power-saving scheme |
1571 | // can we cheat here (i.e. just check MGMT & AC_BE) for better performance? | 1357 | // can we cheat here (i.e. just check MGMT & AC_BE) for better performance? |
1572 | #ifdef RT2860 | 1358 | #ifdef RTMP_MAC_PCI |
1573 | if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) | 1359 | if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) |
1574 | { | 1360 | { |
1361 | if (pAd->Antenna.field.RxPath > 1) | ||
1575 | RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3); | 1362 | RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3); |
1576 | } | 1363 | } |
1577 | #endif | 1364 | #endif // RTMP_MAC_PCI // |
1365 | } | ||
1366 | else | ||
1367 | { | ||
1368 | if ((pAd->CommonCfg.bACMAPSDTr[QID_AC_VO]) || | ||
1369 | (pAd->CommonCfg.bACMAPSDTr[QID_AC_VI]) || | ||
1370 | (pAd->CommonCfg.bACMAPSDTr[QID_AC_BK]) || | ||
1371 | (pAd->CommonCfg.bACMAPSDTr[QID_AC_BE])) | ||
1372 | { | ||
1373 | /* | ||
1374 | WMM Spec v1.0 3.6.2.4, | ||
1375 | The WMM STA shall remain awake until it receives a | ||
1376 | QoS Data or Null frame addressed to it, with the | ||
1377 | EOSP subfield in QoS Control field set to 1. | ||
1378 | |||
1379 | So we can not sleep here or we will suffer a case: | ||
1380 | |||
1381 | PS Management Frame --> | ||
1382 | Trigger frame --> | ||
1383 | Beacon (TIM=0) (Beacon is closer to Trig frame) --> | ||
1384 | Station goes to sleep --> | ||
1385 | AP delivery queued UAPSD packets --> | ||
1386 | Station can NOT receive the reply | ||
1387 | |||
1388 | Maybe we need a timeout timer to avoid that we do | ||
1389 | NOT receive the EOSP frame. | ||
1390 | |||
1391 | We can not use More Data to check if SP is ended | ||
1392 | due to MaxSPLength. | ||
1393 | */ | ||
1578 | } | 1394 | } |
1579 | else | 1395 | else |
1580 | { | 1396 | { |
@@ -1589,14 +1405,10 @@ VOID PeerBeacon( | |||
1589 | 1405 | ||
1590 | if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) | 1406 | if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) |
1591 | { | 1407 | { |
1592 | #ifdef RT2860 | ||
1593 | // Set a flag to go to sleep . Then after parse this RxDoneInterrupt, will go to sleep mode. | 1408 | // Set a flag to go to sleep . Then after parse this RxDoneInterrupt, will go to sleep mode. |
1594 | RTMP_SET_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW); | ||
1595 | pAd->ThisTbttNumToNextWakeUp = TbttNumToNextWakeUp; | 1409 | pAd->ThisTbttNumToNextWakeUp = TbttNumToNextWakeUp; |
1596 | #endif | 1410 | AsicSleepThenAutoWakeup(pAd, pAd->ThisTbttNumToNextWakeUp); |
1597 | #ifdef RT2870 | 1411 | } |
1598 | AsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp); | ||
1599 | #endif | ||
1600 | } | 1412 | } |
1601 | } | 1413 | } |
1602 | } | 1414 | } |
@@ -1825,6 +1637,8 @@ VOID InvalidStateWhenStart( | |||
1825 | VOID EnqueuePsPoll( | 1637 | VOID EnqueuePsPoll( |
1826 | IN PRTMP_ADAPTER pAd) | 1638 | IN PRTMP_ADAPTER pAd) |
1827 | { | 1639 | { |
1640 | |||
1641 | |||
1828 | if (pAd->StaCfg.WindowsPowerMode == Ndis802_11PowerModeLegacy_PSP) | 1642 | if (pAd->StaCfg.WindowsPowerMode == Ndis802_11PowerModeLegacy_PSP) |
1829 | pAd->PsPollFrame.FC.PwrMgmt = PWR_SAVE; | 1643 | pAd->PsPollFrame.FC.PwrMgmt = PWR_SAVE; |
1830 | MiniportMMRequest(pAd, 0, (PUCHAR)&pAd->PsPollFrame, sizeof(PSPOLL_FRAME)); | 1644 | MiniportMMRequest(pAd, 0, (PUCHAR)&pAd->PsPollFrame, sizeof(PSPOLL_FRAME)); |