2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 *************************************************************************
34 -------- ---------- ----------------------------------------------
35 John Chang 2004-09-01 modified for rt2561/2661
37 #include "../rt_config.h"
39 // 2.4 Ghz channel plan index in the TxPower arrays.
40 #define BG_BAND_REGION_0_START 0 // 1,2,3,4,5,6,7,8,9,10,11
41 #define BG_BAND_REGION_0_SIZE 11
42 #define BG_BAND_REGION_1_START 0 // 1,2,3,4,5,6,7,8,9,10,11,12,13
43 #define BG_BAND_REGION_1_SIZE 13
44 #define BG_BAND_REGION_2_START 9 // 10,11
45 #define BG_BAND_REGION_2_SIZE 2
46 #define BG_BAND_REGION_3_START 9 // 10,11,12,13
47 #define BG_BAND_REGION_3_SIZE 4
48 #define BG_BAND_REGION_4_START 13 // 14
49 #define BG_BAND_REGION_4_SIZE 1
50 #define BG_BAND_REGION_5_START 0 // 1,2,3,4,5,6,7,8,9,10,11,12,13,14
51 #define BG_BAND_REGION_5_SIZE 14
52 #define BG_BAND_REGION_6_START 2 // 3,4,5,6,7,8,9
53 #define BG_BAND_REGION_6_SIZE 7
54 #define BG_BAND_REGION_7_START 4 // 5,6,7,8,9,10,11,12,13
55 #define BG_BAND_REGION_7_SIZE 9
56 #define BG_BAND_REGION_31_START 0 // 1,2,3,4,5,6,7,8,9,10,11,12,13,14
57 #define BG_BAND_REGION_31_SIZE 14
59 // 5 Ghz channel plan index in the TxPower arrays.
60 UCHAR A_BAND_REGION_0_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165};
61 UCHAR A_BAND_REGION_1_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};
62 UCHAR A_BAND_REGION_2_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64};
63 UCHAR A_BAND_REGION_3_CHANNEL_LIST[]={52, 56, 60, 64, 149, 153, 157, 161};
64 UCHAR A_BAND_REGION_4_CHANNEL_LIST[]={149, 153, 157, 161, 165};
65 UCHAR A_BAND_REGION_5_CHANNEL_LIST[]={149, 153, 157, 161};
66 UCHAR A_BAND_REGION_6_CHANNEL_LIST[]={36, 40, 44, 48};
67 UCHAR A_BAND_REGION_7_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165};
68 UCHAR A_BAND_REGION_8_CHANNEL_LIST[]={52, 56, 60, 64};
69 UCHAR A_BAND_REGION_9_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165};
70 UCHAR A_BAND_REGION_10_CHANNEL_LIST[]={36, 40, 44, 48, 149, 153, 157, 161, 165};
71 UCHAR A_BAND_REGION_11_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153, 157, 161};
73 //BaSizeArray follows the 802.11n definition as MaxRxFactor. 2^(13+factor) bytes. When factor =0, it's about Ba buffer size =8.
74 UCHAR BaSizeArray[4] = {8,16,32,64};
77 ==========================================================================
79 Update StaCfg->ChannelList[] according to 1) Country Region 2) RF IC type,
80 and 3) PHY-mode user selected.
81 The outcome is used by driver when doing site survey.
86 ==========================================================================
88 VOID BuildChannelList(
91 UCHAR i, j, index=0, num=0;
92 PUCHAR pChannelList = NULL;
94 NdisZeroMemory(pAd->ChannelList, MAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER));
96 // if not 11a-only mode, channel list starts from 2.4Ghz band
97 if ((pAd->CommonCfg.PhyMode != PHY_11A)
98 && (pAd->CommonCfg.PhyMode != PHY_11AN_MIXED) && (pAd->CommonCfg.PhyMode != PHY_11N_5G)
101 switch (pAd->CommonCfg.CountryRegion & 0x7f)
103 case REGION_0_BG_BAND: // 1 -11
104 NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_0_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_0_SIZE);
105 index += BG_BAND_REGION_0_SIZE;
107 case REGION_1_BG_BAND: // 1 - 13
108 NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_1_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_1_SIZE);
109 index += BG_BAND_REGION_1_SIZE;
111 case REGION_2_BG_BAND: // 10 - 11
112 NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_2_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_2_SIZE);
113 index += BG_BAND_REGION_2_SIZE;
115 case REGION_3_BG_BAND: // 10 - 13
116 NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_3_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_3_SIZE);
117 index += BG_BAND_REGION_3_SIZE;
119 case REGION_4_BG_BAND: // 14
120 NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_4_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_4_SIZE);
121 index += BG_BAND_REGION_4_SIZE;
123 case REGION_5_BG_BAND: // 1 - 14
124 NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_5_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_5_SIZE);
125 index += BG_BAND_REGION_5_SIZE;
127 case REGION_6_BG_BAND: // 3 - 9
128 NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_6_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_6_SIZE);
129 index += BG_BAND_REGION_6_SIZE;
131 case REGION_7_BG_BAND: // 5 - 13
132 NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_7_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_7_SIZE);
133 index += BG_BAND_REGION_7_SIZE;
135 case REGION_31_BG_BAND: // 1 - 14
136 NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_31_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_31_SIZE);
137 index += BG_BAND_REGION_31_SIZE;
139 default: // Error. should never happen
142 for (i=0; i<index; i++)
143 pAd->ChannelList[i].MaxTxPwr = 20;
146 if ((pAd->CommonCfg.PhyMode == PHY_11A) || (pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED)
147 || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED)
148 || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11N_5G)
151 switch (pAd->CommonCfg.CountryRegionForABand & 0x7f)
153 case REGION_0_A_BAND:
154 num = sizeof(A_BAND_REGION_0_CHANNEL_LIST)/sizeof(UCHAR);
155 pChannelList = A_BAND_REGION_0_CHANNEL_LIST;
157 case REGION_1_A_BAND:
158 num = sizeof(A_BAND_REGION_1_CHANNEL_LIST)/sizeof(UCHAR);
159 pChannelList = A_BAND_REGION_1_CHANNEL_LIST;
161 case REGION_2_A_BAND:
162 num = sizeof(A_BAND_REGION_2_CHANNEL_LIST)/sizeof(UCHAR);
163 pChannelList = A_BAND_REGION_2_CHANNEL_LIST;
165 case REGION_3_A_BAND:
166 num = sizeof(A_BAND_REGION_3_CHANNEL_LIST)/sizeof(UCHAR);
167 pChannelList = A_BAND_REGION_3_CHANNEL_LIST;
169 case REGION_4_A_BAND:
170 num = sizeof(A_BAND_REGION_4_CHANNEL_LIST)/sizeof(UCHAR);
171 pChannelList = A_BAND_REGION_4_CHANNEL_LIST;
173 case REGION_5_A_BAND:
174 num = sizeof(A_BAND_REGION_5_CHANNEL_LIST)/sizeof(UCHAR);
175 pChannelList = A_BAND_REGION_5_CHANNEL_LIST;
177 case REGION_6_A_BAND:
178 num = sizeof(A_BAND_REGION_6_CHANNEL_LIST)/sizeof(UCHAR);
179 pChannelList = A_BAND_REGION_6_CHANNEL_LIST;
181 case REGION_7_A_BAND:
182 num = sizeof(A_BAND_REGION_7_CHANNEL_LIST)/sizeof(UCHAR);
183 pChannelList = A_BAND_REGION_7_CHANNEL_LIST;
185 case REGION_8_A_BAND:
186 num = sizeof(A_BAND_REGION_8_CHANNEL_LIST)/sizeof(UCHAR);
187 pChannelList = A_BAND_REGION_8_CHANNEL_LIST;
189 case REGION_9_A_BAND:
190 num = sizeof(A_BAND_REGION_9_CHANNEL_LIST)/sizeof(UCHAR);
191 pChannelList = A_BAND_REGION_9_CHANNEL_LIST;
194 case REGION_10_A_BAND:
195 num = sizeof(A_BAND_REGION_10_CHANNEL_LIST)/sizeof(UCHAR);
196 pChannelList = A_BAND_REGION_10_CHANNEL_LIST;
199 case REGION_11_A_BAND:
200 num = sizeof(A_BAND_REGION_11_CHANNEL_LIST)/sizeof(UCHAR);
201 pChannelList = A_BAND_REGION_11_CHANNEL_LIST;
204 default: // Error. should never happen
205 DBGPRINT(RT_DEBUG_WARN,("countryregion=%d not support", pAd->CommonCfg.CountryRegionForABand));
211 UCHAR RadarCh[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};
212 for (i=0; i<num; i++)
214 for (j=0; j<MAX_NUM_OF_CHANNELS; j++)
216 if (pChannelList[i] == pAd->TxPower[j].Channel)
217 NdisMoveMemory(&pAd->ChannelList[index+i], &pAd->TxPower[j], sizeof(CHANNEL_TX_POWER));
221 if (pChannelList[i] == RadarCh[j])
222 pAd->ChannelList[index+i].DfsReq = TRUE;
224 pAd->ChannelList[index+i].MaxTxPwr = 20;
230 pAd->ChannelListNum = index;
231 DBGPRINT(RT_DEBUG_TRACE,("country code=%d/%d, RFIC=%d, PHY mode=%d, support %d channels\n",
232 pAd->CommonCfg.CountryRegion, pAd->CommonCfg.CountryRegionForABand, pAd->RfIcType, pAd->CommonCfg.PhyMode, pAd->ChannelListNum));
234 for (i=0;i<pAd->ChannelListNum;i++)
236 DBGPRINT_RAW(RT_DEBUG_TRACE,("BuildChannel # %d :: Pwr0 = %d, Pwr1 =%d, \n ", pAd->ChannelList[i].Channel, pAd->ChannelList[i].Power, pAd->ChannelList[i].Power2));
242 ==========================================================================
244 This routine return the first channel number according to the country
245 code selection and RF IC selection (signal band or dual band). It is called
246 whenever driver need to start a site survey of all supported channels.
248 ch - the first channel number of current country code setting
252 ==========================================================================
255 IN PRTMP_ADAPTER pAd)
257 return pAd->ChannelList[0].Channel;
261 ==========================================================================
263 This routine returns the next channel number. This routine is called
264 during driver need to start a site survey of all supported channels.
266 next_channel - the next channel number valid in current country code setting.
268 return 0 if no more next channel
269 ==========================================================================
272 IN PRTMP_ADAPTER pAd,
276 UCHAR next_channel = 0;
278 for (i = 0; i < (pAd->ChannelListNum - 1); i++)
279 if (channel == pAd->ChannelList[i].Channel)
281 next_channel = pAd->ChannelList[i+1].Channel;
288 ==========================================================================
290 This routine is for Cisco Compatible Extensions 2.X
291 Spec31. AP Control of Client Transmit Power
295 Required by Aironet dBm(mW)
296 0dBm(1mW), 1dBm(5mW), 13dBm(20mW), 15dBm(30mW),
297 17dBm(50mw), 20dBm(100mW)
300 3dBm(Lowest), 6dBm(10%), 9dBm(25%), 12dBm(50%),
301 14dBm(75%), 15dBm(100%)
303 The client station's actual transmit power shall be within +/- 5dB of
304 the minimum value or next lower value.
305 ==========================================================================
307 VOID ChangeToCellPowerLimit(
308 IN PRTMP_ADAPTER pAd,
309 IN UCHAR AironetCellPowerLimit)
311 //valud 0xFF means that hasn't found power limit information
312 //from the AP's Beacon/Probe response.
313 if (AironetCellPowerLimit == 0xFF)
316 if (AironetCellPowerLimit < 6) //Used Lowest Power Percentage.
317 pAd->CommonCfg.TxPowerPercentage = 6;
318 else if (AironetCellPowerLimit < 9)
319 pAd->CommonCfg.TxPowerPercentage = 10;
320 else if (AironetCellPowerLimit < 12)
321 pAd->CommonCfg.TxPowerPercentage = 25;
322 else if (AironetCellPowerLimit < 14)
323 pAd->CommonCfg.TxPowerPercentage = 50;
324 else if (AironetCellPowerLimit < 15)
325 pAd->CommonCfg.TxPowerPercentage = 75;
327 pAd->CommonCfg.TxPowerPercentage = 100; //else used maximum
329 if (pAd->CommonCfg.TxPowerPercentage > pAd->CommonCfg.TxPowerDefault)
330 pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;
335 IN PRTMP_ADAPTER pAd,
339 UCHAR RssiOffset, LNAGain;
341 // Rssi equals to zero should be an invalid value
345 LNAGain = GET_LNA_GAIN(pAd);
346 if (pAd->LatchRfRegs.Channel > 14)
349 RssiOffset = pAd->ARssiOffset0;
350 else if (RssiNumber == 1)
351 RssiOffset = pAd->ARssiOffset1;
353 RssiOffset = pAd->ARssiOffset2;
358 RssiOffset = pAd->BGRssiOffset0;
359 else if (RssiNumber == 1)
360 RssiOffset = pAd->BGRssiOffset1;
362 RssiOffset = pAd->BGRssiOffset2;
365 return (-12 - RssiOffset - LNAGain - Rssi);
369 ==========================================================================
372 ==========================================================================
374 VOID ScanNextChannel(
375 IN PRTMP_ADAPTER pAd)
377 HEADER_802_11 Hdr80211;
378 PUCHAR pOutBuffer = NULL;
381 UCHAR SsidLen = 0, ScanType = pAd->MlmeAux.ScanType, BBPValue = 0;
383 PHEADER_802_11 pHdr80211;
384 UINT ScanTimeIn5gChannel = SHORT_CHANNEL_TIME;
386 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
392 if (pAd->MlmeAux.Channel == 0)
394 if ((pAd->CommonCfg.BBPCurrentBW == BW_40)
396 || (pAd->OpMode == OPMODE_AP))
399 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
400 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
401 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
404 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
405 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - End of SCAN, restore to 40MHz channel %d, Total BSS[%02d]\n",pAd->CommonCfg.CentralChannel, pAd->ScanTab.BssNr));
409 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
410 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
411 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - End of SCAN, restore to channel %d, Total BSS[%02d]\n",pAd->CommonCfg.Channel, pAd->ScanTab.BssNr));
414 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
417 // To prevent data lost.
418 // Send an NULL data with turned PSM bit on to current associated AP before SCAN progress.
419 // Now, we need to send an NULL data with turned PSM bit off to AP, when scan progress done
421 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd)))
423 NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);
424 if (NStatus == NDIS_STATUS_SUCCESS)
426 pHdr80211 = (PHEADER_802_11) pOutBuffer;
427 MgtMacHeaderInit(pAd, pHdr80211, SUBTYPE_NULL_FUNC, 1, pAd->CommonCfg.Bssid, pAd->CommonCfg.Bssid);
428 pHdr80211->Duration = 0;
429 pHdr80211->FC.Type = BTYPE_DATA;
430 pHdr80211->FC.PwrMgmt = (pAd->StaCfg.Psm == PWR_SAVE);
432 // Send using priority queue
433 MiniportMMRequest(pAd, 0, pOutBuffer, sizeof(HEADER_802_11));
434 DBGPRINT(RT_DEBUG_TRACE, ("MlmeScanReqAction -- Send PSM Data frame\n"));
435 MlmeFreeMemory(pAd, pOutBuffer);
440 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
441 Status = MLME_SUCCESS;
442 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);
445 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
448 else if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST) && (pAd->OpMode == OPMODE_STA))
450 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
451 MlmeCntlConfirm(pAd, MT2_SCAN_CONF, MLME_FAIL_NO_RESOURCE);
456 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
458 // BBP and RF are not accessible in PS mode, we has to wake them up first
459 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
460 AsicForceWakeup(pAd, TRUE);
462 // leave PSM during scanning. otherwise we may lost ProbeRsp & BEACON
463 if (pAd->StaCfg.Psm == PWR_SAVE)
464 MlmeSetPsmBit(pAd, PWR_ACTIVE);
467 AsicSwitchChannel(pAd, pAd->MlmeAux.Channel, TRUE);
468 AsicLockChannel(pAd, pAd->MlmeAux.Channel);
470 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
472 if (pAd->MlmeAux.Channel > 14)
474 if ((pAd->CommonCfg.bIEEE80211H == 1) && RadarChannelCheck(pAd, pAd->MlmeAux.Channel))
476 ScanType = SCAN_PASSIVE;
477 ScanTimeIn5gChannel = MIN_CHANNEL_TIME;
482 //Global country domain(ch1-11:active scan, ch12-14 passive scan)
483 if ((pAd->MlmeAux.Channel <= 14) && (pAd->MlmeAux.Channel >= 12) && ((pAd->CommonCfg.CountryRegion & 0x7f) == REGION_31_BG_BAND))
485 ScanType = SCAN_PASSIVE;
488 // We need to shorten active scan time in order for WZC connect issue
489 // Chnage the channel scan time for CISCO stuff based on its IAPP announcement
490 if (ScanType == FAST_SCAN_ACTIVE)
491 RTMPSetTimer(&pAd->MlmeAux.ScanTimer, FAST_ACTIVE_SCAN_TIME);
492 else if (((ScanType == SCAN_CISCO_ACTIVE) ||
493 (ScanType == SCAN_CISCO_PASSIVE) ||
494 (ScanType == SCAN_CISCO_CHANNEL_LOAD) ||
495 (ScanType == SCAN_CISCO_NOISE)) && (pAd->OpMode == OPMODE_STA))
497 if (pAd->StaCfg.CCXScanTime < 25)
498 RTMPSetTimer(&pAd->MlmeAux.ScanTimer, pAd->StaCfg.CCXScanTime * 2);
500 RTMPSetTimer(&pAd->MlmeAux.ScanTimer, pAd->StaCfg.CCXScanTime);
502 else // must be SCAN_PASSIVE or SCAN_ACTIVE
504 if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED)
505 || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED)
508 if (pAd->MlmeAux.Channel > 14)
509 RTMPSetTimer(&pAd->MlmeAux.ScanTimer, ScanTimeIn5gChannel);
511 RTMPSetTimer(&pAd->MlmeAux.ScanTimer, MIN_CHANNEL_TIME);
514 RTMPSetTimer(&pAd->MlmeAux.ScanTimer, MAX_CHANNEL_TIME);
517 if ((ScanType == SCAN_ACTIVE) || (ScanType == FAST_SCAN_ACTIVE) ||
518 (ScanType == SCAN_CISCO_ACTIVE))
520 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory
521 if (NStatus != NDIS_STATUS_SUCCESS)
523 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - ScanNextChannel() allocate memory fail\n"));
525 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
527 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
528 Status = MLME_FAIL_NO_RESOURCE;
529 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);
535 // There is no need to send broadcast probe request if active scan is in effect.
536 if ((ScanType == SCAN_ACTIVE) || (ScanType == FAST_SCAN_ACTIVE)
538 SsidLen = pAd->MlmeAux.SsidLen;
542 MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, BROADCAST_ADDR);
543 MakeOutgoingFrame(pOutBuffer, &FrameLen,
544 sizeof(HEADER_802_11), &Hdr80211,
547 SsidLen, pAd->MlmeAux.Ssid,
549 1, &pAd->CommonCfg.SupRateLen,
550 pAd->CommonCfg.SupRateLen, pAd->CommonCfg.SupRate,
553 if (pAd->CommonCfg.ExtRateLen)
556 MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp,
558 1, &pAd->CommonCfg.ExtRateLen,
559 pAd->CommonCfg.ExtRateLen, pAd->CommonCfg.ExtRate,
564 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
568 UCHAR BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33};
570 if (pAd->bBroadComHT == TRUE)
572 HtLen = pAd->MlmeAux.HtCapabilityLen + 4;
574 MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp,
578 pAd->MlmeAux.HtCapabilityLen, &pAd->MlmeAux.HtCapability,
583 HtLen = pAd->MlmeAux.HtCapabilityLen;
585 MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp,
588 HtLen, &pAd->CommonCfg.HtCapability,
594 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
595 MlmeFreeMemory(pAd, pOutBuffer);
598 // For SCAN_CISCO_PASSIVE, do nothing and silently wait for beacon or other probe reponse
600 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
601 pAd->Mlme.SyncMachine.CurrState = SCAN_LISTEN;
605 VOID MgtProbReqMacHeaderInit(
606 IN PRTMP_ADAPTER pAd,
607 IN OUT PHEADER_802_11 pHdr80211,
613 NdisZeroMemory(pHdr80211, sizeof(HEADER_802_11));
615 pHdr80211->FC.Type = BTYPE_MGMT;
616 pHdr80211->FC.SubType = SubType;
617 if (SubType == SUBTYPE_ACK)
618 pHdr80211->FC.Type = BTYPE_CNTL;
619 pHdr80211->FC.ToDs = ToDs;
620 COPY_MAC_ADDR(pHdr80211->Addr1, pDA);
621 COPY_MAC_ADDR(pHdr80211->Addr2, pAd->CurrentAddress);
622 COPY_MAC_ADDR(pHdr80211->Addr3, pBssid);