aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/rt2860/sta/sync.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/rt2860/sta/sync.c')
-rw-r--r--drivers/staging/rt2860/sta/sync.c398
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
46VOID 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(
1825VOID EnqueuePsPoll( 1637VOID 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));