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 2004-08-08 Major modification from RT2560
37 #include "../rt_config.h"
39 UCHAR CipherSuiteWpaNoneTkip[] = {
40 0x00, 0x50, 0xf2, 0x01, /* oui */
41 0x01, 0x00, /* Version */
42 0x00, 0x50, 0xf2, 0x02, /* Multicast */
43 0x01, 0x00, /* Number of unicast */
44 0x00, 0x50, 0xf2, 0x02, /* unicast */
45 0x01, 0x00, /* number of authentication method */
46 0x00, 0x50, 0xf2, 0x00 /* authentication */
49 UCHAR CipherSuiteWpaNoneTkipLen =
50 (sizeof(CipherSuiteWpaNoneTkip) / sizeof(UCHAR));
52 UCHAR CipherSuiteWpaNoneAes[] = {
53 0x00, 0x50, 0xf2, 0x01, /* oui */
54 0x01, 0x00, /* Version */
55 0x00, 0x50, 0xf2, 0x04, /* Multicast */
56 0x01, 0x00, /* Number of unicast */
57 0x00, 0x50, 0xf2, 0x04, /* unicast */
58 0x01, 0x00, /* number of authentication method */
59 0x00, 0x50, 0xf2, 0x00 /* authentication */
62 UCHAR CipherSuiteWpaNoneAesLen =
63 (sizeof(CipherSuiteWpaNoneAes) / sizeof(UCHAR));
65 /* The following MACRO is called after 1. starting an new IBSS, 2. succesfully JOIN an IBSS, */
66 /* or 3. succesfully ASSOCIATE to a BSS, 4. successfully RE_ASSOCIATE to a BSS */
67 /* All settings successfuly negotiated furing MLME state machines become final settings */
68 /* and are copied to pAd->StaActive */
69 #define COPY_SETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(_pAd) \
71 NdisZeroMemory((_pAd)->CommonCfg.Ssid, MAX_LEN_OF_SSID); \
72 (_pAd)->CommonCfg.SsidLen = (_pAd)->MlmeAux.SsidLen; \
73 NdisMoveMemory((_pAd)->CommonCfg.Ssid, (_pAd)->MlmeAux.Ssid, (_pAd)->MlmeAux.SsidLen); \
74 COPY_MAC_ADDR((_pAd)->CommonCfg.Bssid, (_pAd)->MlmeAux.Bssid); \
75 (_pAd)->CommonCfg.Channel = (_pAd)->MlmeAux.Channel; \
76 (_pAd)->CommonCfg.CentralChannel = (_pAd)->MlmeAux.CentralChannel; \
77 (_pAd)->StaActive.Aid = (_pAd)->MlmeAux.Aid; \
78 (_pAd)->StaActive.AtimWin = (_pAd)->MlmeAux.AtimWin; \
79 (_pAd)->StaActive.CapabilityInfo = (_pAd)->MlmeAux.CapabilityInfo; \
80 (_pAd)->CommonCfg.BeaconPeriod = (_pAd)->MlmeAux.BeaconPeriod; \
81 (_pAd)->StaActive.CfpMaxDuration = (_pAd)->MlmeAux.CfpMaxDuration; \
82 (_pAd)->StaActive.CfpPeriod = (_pAd)->MlmeAux.CfpPeriod; \
83 (_pAd)->StaActive.SupRateLen = (_pAd)->MlmeAux.SupRateLen; \
84 NdisMoveMemory((_pAd)->StaActive.SupRate, (_pAd)->MlmeAux.SupRate, (_pAd)->MlmeAux.SupRateLen);\
85 (_pAd)->StaActive.ExtRateLen = (_pAd)->MlmeAux.ExtRateLen; \
86 NdisMoveMemory((_pAd)->StaActive.ExtRate, (_pAd)->MlmeAux.ExtRate, (_pAd)->MlmeAux.ExtRateLen);\
87 NdisMoveMemory(&(_pAd)->CommonCfg.APEdcaParm, &(_pAd)->MlmeAux.APEdcaParm, sizeof(EDCA_PARM));\
88 NdisMoveMemory(&(_pAd)->CommonCfg.APQosCapability, &(_pAd)->MlmeAux.APQosCapability, sizeof(QOS_CAPABILITY_PARM));\
89 NdisMoveMemory(&(_pAd)->CommonCfg.APQbssLoad, &(_pAd)->MlmeAux.APQbssLoad, sizeof(QBSS_LOAD_PARM));\
90 COPY_MAC_ADDR((_pAd)->MacTab.Content[BSSID_WCID].Addr, (_pAd)->MlmeAux.Bssid); \
91 (_pAd)->MacTab.Content[BSSID_WCID].Aid = (_pAd)->MlmeAux.Aid; \
92 (_pAd)->MacTab.Content[BSSID_WCID].PairwiseKey.CipherAlg = (_pAd)->StaCfg.PairCipher;\
93 COPY_MAC_ADDR((_pAd)->MacTab.Content[BSSID_WCID].PairwiseKey.BssId, (_pAd)->MlmeAux.Bssid);\
94 (_pAd)->MacTab.Content[BSSID_WCID].RateLen = (_pAd)->StaActive.SupRateLen + (_pAd)->StaActive.ExtRateLen;\
98 ==========================================================================
103 ==========================================================================
105 VOID MlmeCntlInit(IN PRTMP_ADAPTER pAd,
106 IN STATE_MACHINE * S, OUT STATE_MACHINE_FUNC Trans[])
108 /* Control state machine differs from other state machines, the interface */
109 /* follows the standard interface */
110 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
114 ==========================================================================
117 IRQL = DISPATCH_LEVEL
119 ==========================================================================
121 VOID MlmeCntlMachinePerformAction(IN PRTMP_ADAPTER pAd,
122 IN STATE_MACHINE * S,
123 IN MLME_QUEUE_ELEM * Elem)
125 switch (pAd->Mlme.CntlMachine.CurrState) {
127 CntlIdleProc(pAd, Elem);
129 case CNTL_WAIT_DISASSOC:
130 CntlWaitDisassocProc(pAd, Elem);
133 CntlWaitJoinProc(pAd, Elem);
136 /* CNTL_WAIT_REASSOC is the only state in CNTL machine that does */
137 /* not triggered directly or indirectly by "RTMPSetInformation(OID_xxx)". */
138 /* Therefore not protected by NDIS's "only one outstanding OID request" */
139 /* rule. Which means NDIS may SET OID in the middle of ROAMing attempts. */
140 /* Current approach is to block new SET request at RTMPSetInformation() */
141 /* when CntlMachine.CurrState is not CNTL_IDLE */
142 case CNTL_WAIT_REASSOC:
143 CntlWaitReassocProc(pAd, Elem);
146 case CNTL_WAIT_START:
147 CntlWaitStartProc(pAd, Elem);
150 CntlWaitAuthProc(pAd, Elem);
152 case CNTL_WAIT_AUTH2:
153 CntlWaitAuthProc2(pAd, Elem);
155 case CNTL_WAIT_ASSOC:
156 CntlWaitAssocProc(pAd, Elem);
159 case CNTL_WAIT_OID_LIST_SCAN:
160 if (Elem->MsgType == MT2_SCAN_CONF) {
161 /* Resume TxRing after SCANING complete. We hope the out-of-service time */
162 /* won't be too long to let upper layer time-out the waiting frames */
163 RTMPResumeMsduTransmission(pAd);
165 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
168 /* Set LED status to previous status. */
170 if (pAd->bLedOnScanning) {
171 pAd->bLedOnScanning = FALSE;
172 RTMPSetLED(pAd, pAd->LedStatus);
177 case CNTL_WAIT_OID_DISASSOC:
178 if (Elem->MsgType == MT2_DISASSOC_CONF) {
179 LinkDown(pAd, FALSE);
180 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
185 /* This state is for that we want to connect to an AP but */
186 /* it didn't find on BSS List table. So we need to scan the air first, */
187 /* after that we can try to connect to the desired AP if available. */
189 case CNTL_WAIT_SCAN_FOR_CONNECT:
190 if (Elem->MsgType == MT2_SCAN_CONF) {
191 /* Resume TxRing after SCANING complete. We hope the out-of-service time */
192 /* won't be too long to let upper layer time-out the waiting frames */
193 RTMPResumeMsduTransmission(pAd);
195 if (pAd->StaCfg.CCXReqType != MSRN_TYPE_UNUSED) {
196 /* Cisco scan request is finished, prepare beacon report */
197 MlmeEnqueue(pAd, AIRONET_STATE_MACHINE,
198 MT2_AIRONET_SCAN_DONE, 0, NULL);
200 #endif /* CCX_SUPPORT // */
201 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
204 /* Check if we can connect to. */
206 BssTableSsidSort(pAd, &pAd->MlmeAux.SsidBssTab,
207 (CHAR *) pAd->MlmeAux.
209 pAd->MlmeAux.AutoReconnectSsidLen);
210 if (pAd->MlmeAux.SsidBssTab.BssNr > 0) {
211 MlmeAutoReconnectLastSSID(pAd);
215 #endif /* RTMP_MAC_USB // */
217 DBGPRINT_ERR(("!ERROR! CNTL - Illegal message type(=%ld)",
224 ==========================================================================
227 IRQL = DISPATCH_LEVEL
229 ==========================================================================
231 VOID CntlIdleProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
233 MLME_DISASSOC_REQ_STRUCT DisassocReq;
235 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))
238 switch (Elem->MsgType) {
239 case OID_802_11_SSID:
240 CntlOidSsidProc(pAd, Elem);
243 case OID_802_11_BSSID:
244 CntlOidRTBssidProc(pAd, Elem);
247 case OID_802_11_BSSID_LIST_SCAN:
248 CntlOidScanProc(pAd, Elem);
251 case OID_802_11_DISASSOCIATE:
252 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid,
253 REASON_DISASSOC_STA_LEAVING);
254 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ,
255 sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq);
256 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC;
258 if (pAd->StaCfg.WpaSupplicantUP !=
259 WPA_SUPPLICANT_ENABLE_WITH_WEB_UI) {
260 /* Set the AutoReconnectSsid to prevent it reconnect to old SSID */
261 /* Since calling this indicate user don't want to connect to that SSID anymore. */
262 pAd->MlmeAux.AutoReconnectSsidLen = 32;
263 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid,
264 pAd->MlmeAux.AutoReconnectSsidLen);
268 case MT2_MLME_ROAMING_REQ:
269 CntlMlmeRoamingProc(pAd, Elem);
272 case OID_802_11_MIC_FAILURE_REPORT_FRAME:
273 WpaMicFailureReportFrame(pAd, Elem);
277 DBGPRINT(RT_DEBUG_TRACE,
278 ("CNTL - Illegal message in CntlIdleProc(MsgType=%ld)\n",
284 VOID CntlOidScanProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
286 MLME_SCAN_REQ_STRUCT ScanReq;
287 ULONG BssIdx = BSS_NOT_FOUND;
290 /* record current BSS if network is connected. */
291 /* 2003-2-13 do not include current IBSS if this is the only STA in this IBSS. */
292 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) {
294 BssSsidTableSearch(&pAd->ScanTab, pAd->CommonCfg.Bssid,
295 (PUCHAR) pAd->CommonCfg.Ssid,
296 pAd->CommonCfg.SsidLen,
297 pAd->CommonCfg.Channel);
298 if (BssIdx != BSS_NOT_FOUND) {
299 NdisMoveMemory(&CurrBss, &pAd->ScanTab.BssEntry[BssIdx],
303 /* clean up previous SCAN result, add current BSS back to table if any */
304 BssTableInit(&pAd->ScanTab);
305 if (BssIdx != BSS_NOT_FOUND) {
306 /* DDK Note: If the NIC is associated with a particular BSSID and SSID */
307 /* that are not contained in the list of BSSIDs generated by this scan, the */
308 /* BSSID description of the currently associated BSSID and SSID should be */
309 /* appended to the list of BSSIDs in the NIC's database. */
310 /* To ensure this, we append this BSS as the first entry in SCAN result */
311 NdisMoveMemory(&pAd->ScanTab.BssEntry[0], &CurrBss,
313 pAd->ScanTab.BssNr = 1;
316 ScanParmFill(pAd, &ScanReq, (PSTRING) Elem->Msg, Elem->MsgLen, BSS_ANY,
318 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ,
319 sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq);
320 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;
324 ==========================================================================
326 Before calling this routine, user desired SSID should already been
327 recorded in CommonCfg.Ssid[]
328 IRQL = DISPATCH_LEVEL
330 ==========================================================================
332 VOID CntlOidSsidProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
334 PNDIS_802_11_SSID pOidSsid = (NDIS_802_11_SSID *) Elem->Msg;
335 MLME_DISASSOC_REQ_STRUCT DisassocReq;
338 /* Step 1. record the desired user settings to MlmeAux */
339 NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
340 NdisMoveMemory(pAd->MlmeAux.Ssid, pOidSsid->Ssid, pOidSsid->SsidLength);
341 pAd->MlmeAux.SsidLen = (UCHAR) pOidSsid->SsidLength;
342 NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
343 pAd->MlmeAux.BssType = pAd->StaCfg.BssType;
345 pAd->StaCfg.bAutoConnectByBssid = FALSE;
348 /* Update Reconnect Ssid, that user desired to connect. */
350 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID);
351 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.Ssid,
352 pAd->MlmeAux.SsidLen);
353 pAd->MlmeAux.AutoReconnectSsidLen = pAd->MlmeAux.SsidLen;
355 /* step 2. find all matching BSS in the lastest SCAN result (inBssTab) */
356 /* & log them into MlmeAux.SsidBssTab for later-on iteration. Sort by RSSI order */
357 BssTableSsidSort(pAd, &pAd->MlmeAux.SsidBssTab,
358 (PCHAR) pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);
360 DBGPRINT(RT_DEBUG_TRACE,
361 ("CntlOidSsidProc():CNTL - %d BSS of %d BSS match the desire (%d)SSID - %s\n",
362 pAd->MlmeAux.SsidBssTab.BssNr, pAd->ScanTab.BssNr,
363 pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid));
364 NdisGetSystemUpTime(&Now);
366 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) &&
367 (pAd->CommonCfg.SsidLen ==
368 pAd->MlmeAux.SsidBssTab.BssEntry[0].SsidLen)
369 && NdisEqualMemory(pAd->CommonCfg.Ssid,
370 pAd->MlmeAux.SsidBssTab.BssEntry[0].Ssid,
371 pAd->CommonCfg.SsidLen)
372 && MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid,
373 pAd->MlmeAux.SsidBssTab.BssEntry[0].Bssid)) {
374 /* Case 1. already connected with an AP who has the desired SSID */
375 /* with highest RSSI */
377 /* Add checking Mode "LEAP" for CCX 1.0 */
378 if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) ||
379 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
380 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) ||
381 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)
383 (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) {
384 /* case 1.1 For WPA, WPA-PSK, if the 1x port is not secured, we have to redo */
385 /* connection process */
386 DBGPRINT(RT_DEBUG_TRACE,
387 ("CntlOidSsidProc():CNTL - disassociate with current AP...\n"));
388 DisassocParmFill(pAd, &DisassocReq,
389 pAd->CommonCfg.Bssid,
390 REASON_DISASSOC_STA_LEAVING);
391 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE,
392 MT2_MLME_DISASSOC_REQ,
393 sizeof(MLME_DISASSOC_REQ_STRUCT),
395 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
396 } else if (pAd->bConfigChanged == TRUE) {
397 /* case 1.2 Important Config has changed, we have to reconnect to the same AP */
398 DBGPRINT(RT_DEBUG_TRACE,
399 ("CntlOidSsidProc():CNTL - disassociate with current AP Because config changed...\n"));
400 DisassocParmFill(pAd, &DisassocReq,
401 pAd->CommonCfg.Bssid,
402 REASON_DISASSOC_STA_LEAVING);
403 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE,
404 MT2_MLME_DISASSOC_REQ,
405 sizeof(MLME_DISASSOC_REQ_STRUCT),
407 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
409 /* case 1.3. already connected to the SSID with highest RSSI. */
410 DBGPRINT(RT_DEBUG_TRACE,
411 ("CntlOidSsidProc():CNTL - already with this BSSID. ignore this SET_SSID request\n"));
413 /* (HCT 12.1) 1c_wlan_mediaevents required */
414 /* media connect events are indicated when associating with the same AP */
418 /* Since MediaState already is NdisMediaStateConnected */
419 /* We just indicate the connect event again to meet the WHQL required. */
421 pAd->IndicateMediaState =
422 NdisMediaStateConnected;
423 RTMP_IndicateMediaState(pAd);
424 pAd->ExtraInfo = GENERAL_LINK_UP; /* Update extra information to link is up */
427 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
428 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1,
429 &pAd->MlmeAux.Bssid[0], NULL,
432 } else if (INFRA_ON(pAd)) {
435 /* [88888] OID_802_11_SSID should have returned NDTEST_WEP_AP2(Returned: ) */
436 /* RT61 may lost SSID, and not connect to NDTEST_WEP_AP2 and will connect to NDTEST_WEP_AP2 by Autoreconnect */
437 /* But media status is connected, so the SSID not report correctly. */
440 (pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen,
441 pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen)) {
443 /* Different SSID means not Roaming case, so we let LinkDown() to Indicate a disconnect event. */
445 pAd->MlmeAux.CurrReqIsFromNdis = TRUE;
447 /* case 2. active INFRA association existent */
448 /* roaming is done within miniport driver, nothing to do with configuration */
449 /* utility. so upon a new SET(OID_802_11_SSID) is received, we just */
450 /* disassociate with the current associated AP, */
451 /* then perform a new association with this new SSID, no matter the */
452 /* new/old SSID are the same or not. */
453 DBGPRINT(RT_DEBUG_TRACE,
454 ("CntlOidSsidProc():CNTL - disassociate with current AP...\n"));
455 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid,
456 REASON_DISASSOC_STA_LEAVING);
457 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ,
458 sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq);
459 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
462 DBGPRINT(RT_DEBUG_TRACE,
463 ("CntlOidSsidProc():CNTL - drop current ADHOC\n"));
464 LinkDown(pAd, FALSE);
465 OPSTATUS_CLEAR_FLAG(pAd,
466 fOP_STATUS_MEDIA_STATE_CONNECTED);
467 pAd->IndicateMediaState = NdisMediaStateDisconnected;
468 RTMP_IndicateMediaState(pAd);
469 pAd->ExtraInfo = GENERAL_LINK_DOWN;
470 DBGPRINT(RT_DEBUG_TRACE,
471 ("CntlOidSsidProc():NDIS_STATUS_MEDIA_DISCONNECT Event C!\n"));
474 if ((pAd->MlmeAux.SsidBssTab.BssNr == 0) &&
475 (pAd->StaCfg.bAutoReconnect == TRUE) &&
476 (pAd->MlmeAux.BssType == BSS_INFRA) &&
477 (MlmeValidateSSID(pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen)
480 MLME_SCAN_REQ_STRUCT ScanReq;
482 DBGPRINT(RT_DEBUG_TRACE,
483 ("CntlOidSsidProc():CNTL - No matching BSS, start a new scan\n"));
484 ScanParmFill(pAd, &ScanReq, (PSTRING) pAd->MlmeAux.Ssid,
485 pAd->MlmeAux.SsidLen, BSS_ANY,
487 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ,
488 sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq);
489 pAd->Mlme.CntlMachine.CurrState =
490 CNTL_WAIT_OID_LIST_SCAN;
491 /* Reset Missed scan number */
492 pAd->StaCfg.LastScanTime = Now;
494 pAd->MlmeAux.BssIdx = 0;
495 IterateOnBssTab(pAd);
501 ==========================================================================
504 IRQL = DISPATCH_LEVEL
506 ==========================================================================
508 VOID CntlOidRTBssidProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
511 PUCHAR pOidBssid = (PUCHAR) Elem->Msg;
512 MLME_DISASSOC_REQ_STRUCT DisassocReq;
513 MLME_JOIN_REQ_STRUCT JoinReq;
515 /* record user desired settings */
516 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, pOidBssid);
517 pAd->MlmeAux.BssType = pAd->StaCfg.BssType;
519 /* find the desired BSS in the latest SCAN result table */
520 BssIdx = BssTableSearch(&pAd->ScanTab, pOidBssid, pAd->MlmeAux.Channel);
521 if (BssIdx == BSS_NOT_FOUND) {
522 MLME_SCAN_REQ_STRUCT ScanReq;
524 DBGPRINT(RT_DEBUG_TRACE,
525 ("CNTL - BSSID not found. reply NDIS_STATUS_NOT_ACCEPTED\n"));
526 /*pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; */
528 DBGPRINT(RT_DEBUG_TRACE,
529 ("CNTL - BSSID not found. start a new scan\n"));
530 ScanParmFill(pAd, &ScanReq, (PSTRING) pAd->MlmeAux.Ssid,
531 pAd->MlmeAux.SsidLen, BSS_ANY, SCAN_ACTIVE);
532 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ,
533 sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq);
534 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;
535 /* Reset Missed scan number */
536 NdisGetSystemUpTime(&pAd->StaCfg.LastScanTime);
540 /* Update Reconnect Ssid, that user desired to connect. */
542 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID);
543 pAd->MlmeAux.AutoReconnectSsidLen =
544 pAd->ScanTab.BssEntry[BssIdx].SsidLen;
545 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid,
546 pAd->ScanTab.BssEntry[BssIdx].Ssid,
547 pAd->ScanTab.BssEntry[BssIdx].SsidLen);
549 /* copy the matched BSS entry from ScanTab to MlmeAux.SsidBssTab. Why? */
550 /* Because we need this entry to become the JOIN target in later on SYNC state machine */
551 pAd->MlmeAux.BssIdx = 0;
552 pAd->MlmeAux.SsidBssTab.BssNr = 1;
553 NdisMoveMemory(&pAd->MlmeAux.SsidBssTab.BssEntry[0],
554 &pAd->ScanTab.BssEntry[BssIdx], sizeof(BSS_ENTRY));
556 /* Add SSID into MlmeAux for site surey joining hidden SSID */
557 pAd->MlmeAux.SsidLen = pAd->ScanTab.BssEntry[BssIdx].SsidLen;
558 NdisMoveMemory(pAd->MlmeAux.Ssid, pAd->ScanTab.BssEntry[BssIdx].Ssid,
559 pAd->MlmeAux.SsidLen);
563 /* disassoc from current AP first */
564 DBGPRINT(RT_DEBUG_TRACE,
565 ("CNTL - disassociate with current AP ...\n"));
566 DisassocParmFill(pAd, &DisassocReq,
567 pAd->CommonCfg.Bssid,
568 REASON_DISASSOC_STA_LEAVING);
569 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE,
570 MT2_MLME_DISASSOC_REQ,
571 sizeof(MLME_DISASSOC_REQ_STRUCT),
574 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
577 DBGPRINT(RT_DEBUG_TRACE,
578 ("CNTL - drop current ADHOC\n"));
579 LinkDown(pAd, FALSE);
580 OPSTATUS_CLEAR_FLAG(pAd,
581 fOP_STATUS_MEDIA_STATE_CONNECTED);
582 pAd->IndicateMediaState =
583 NdisMediaStateDisconnected;
584 RTMP_IndicateMediaState(pAd);
585 pAd->ExtraInfo = GENERAL_LINK_DOWN;
586 DBGPRINT(RT_DEBUG_TRACE,
587 ("NDIS_STATUS_MEDIA_DISCONNECT Event C!\n"));
589 /* Change the wepstatus to original wepstatus */
590 pAd->StaCfg.WepStatus = pAd->StaCfg.OrigWepStatus;
591 pAd->StaCfg.PairCipher = pAd->StaCfg.OrigWepStatus;
592 pAd->StaCfg.GroupCipher = pAd->StaCfg.OrigWepStatus;
594 /* Check cipher suite, AP must have more secured cipher than station setting */
595 /* Set the Pairwise and Group cipher to match the intended AP setting */
596 /* We can only connect to AP with less secured cipher setting */
597 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA)
598 || (pAd->StaCfg.AuthMode ==
599 Ndis802_11AuthModeWPAPSK)) {
600 pAd->StaCfg.GroupCipher =
601 pAd->ScanTab.BssEntry[BssIdx].WPA.
604 if (pAd->StaCfg.WepStatus ==
605 pAd->ScanTab.BssEntry[BssIdx].WPA.
607 pAd->StaCfg.PairCipher =
608 pAd->ScanTab.BssEntry[BssIdx].WPA.
610 else if (pAd->ScanTab.BssEntry[BssIdx].WPA.
611 PairCipherAux != Ndis802_11WEPDisabled)
612 pAd->StaCfg.PairCipher =
613 pAd->ScanTab.BssEntry[BssIdx].WPA.
615 else /* There is no PairCipher Aux, downgrade our capability to TKIP */
616 pAd->StaCfg.PairCipher =
617 Ndis802_11Encryption2Enabled;
619 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)
620 || (pAd->StaCfg.AuthMode ==
621 Ndis802_11AuthModeWPA2PSK)) {
622 pAd->StaCfg.GroupCipher =
623 pAd->ScanTab.BssEntry[BssIdx].WPA2.
626 if (pAd->StaCfg.WepStatus ==
627 pAd->ScanTab.BssEntry[BssIdx].WPA2.
629 pAd->StaCfg.PairCipher =
630 pAd->ScanTab.BssEntry[BssIdx].WPA2.
632 else if (pAd->ScanTab.BssEntry[BssIdx].WPA2.
633 PairCipherAux != Ndis802_11WEPDisabled)
634 pAd->StaCfg.PairCipher =
635 pAd->ScanTab.BssEntry[BssIdx].WPA2.
637 else /* There is no PairCipher Aux, downgrade our capability to TKIP */
638 pAd->StaCfg.PairCipher =
639 Ndis802_11Encryption2Enabled;
642 pAd->StaCfg.RsnCapability =
643 pAd->ScanTab.BssEntry[BssIdx].WPA2.
646 /* Set Mix cipher flag */
647 pAd->StaCfg.bMixCipher =
648 (pAd->StaCfg.PairCipher ==
649 pAd->StaCfg.GroupCipher) ? FALSE : TRUE;
650 /*if (pAd->StaCfg.bMixCipher == TRUE)
652 // If mix cipher, re-build RSNIE
653 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0);
655 /* No active association, join the BSS immediately */
656 DBGPRINT(RT_DEBUG_TRACE,
657 ("CNTL - joining %02x:%02x:%02x:%02x:%02x:%02x ...\n",
658 pOidBssid[0], pOidBssid[1], pOidBssid[2],
659 pOidBssid[3], pOidBssid[4], pOidBssid[5]));
661 JoinParmFill(pAd, &JoinReq, pAd->MlmeAux.BssIdx);
662 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_JOIN_REQ,
663 sizeof(MLME_JOIN_REQ_STRUCT), &JoinReq);
665 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN;
670 /* Roaming is the only external request triggering CNTL state machine */
671 /* despite of other "SET OID" operation. All "SET OID" related oerations */
672 /* happen in sequence, because no other SET OID will be sent to this device */
673 /* until the the previous SET operation is complete (successful o failed). */
674 /* So, how do we quarantee this ROAMING request won't corrupt other "SET OID"? */
675 /* or been corrupted by other "SET OID"? */
677 /* IRQL = DISPATCH_LEVEL */
678 VOID CntlMlmeRoamingProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
682 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Roaming in MlmeAux.RoamTab...\n"));
685 /*Let BBP register at 20MHz to do (fast) roaming. */
686 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
688 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
690 NdisMoveMemory(&pAd->MlmeAux.SsidBssTab, &pAd->MlmeAux.RoamTab,
691 sizeof(pAd->MlmeAux.RoamTab));
692 pAd->MlmeAux.SsidBssTab.BssNr = pAd->MlmeAux.RoamTab.BssNr;
694 BssTableSortByRssi(&pAd->MlmeAux.SsidBssTab);
695 pAd->MlmeAux.BssIdx = 0;
696 IterateOnBssTab(pAd);
701 ==========================================================================
704 IRQL = DISPATCH_LEVEL
706 ==========================================================================
708 VOID CntlWaitDisassocProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
710 MLME_START_REQ_STRUCT StartReq;
712 if (Elem->MsgType == MT2_DISASSOC_CONF) {
713 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Dis-associate successful\n"));
715 if (pAd->CommonCfg.bWirelessEvent) {
716 RTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG,
717 pAd->MacTab.Content[BSSID_WCID].
721 LinkDown(pAd, FALSE);
723 /* case 1. no matching BSS, and user wants ADHOC, so we just start a new one */
724 if ((pAd->MlmeAux.SsidBssTab.BssNr == 0)
725 && (pAd->StaCfg.BssType == BSS_ADHOC)) {
726 DBGPRINT(RT_DEBUG_TRACE,
727 ("CNTL - No matching BSS, start a new ADHOC (Ssid=%s)...\n",
729 StartParmFill(pAd, &StartReq, (PCHAR) pAd->MlmeAux.Ssid,
730 pAd->MlmeAux.SsidLen);
731 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ,
732 sizeof(MLME_START_REQ_STRUCT), &StartReq);
733 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START;
735 /* case 2. try each matched BSS */
737 pAd->MlmeAux.BssIdx = 0;
739 IterateOnBssTab(pAd);
745 ==========================================================================
748 IRQL = DISPATCH_LEVEL
750 ==========================================================================
752 VOID CntlWaitJoinProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
755 MLME_AUTH_REQ_STRUCT AuthReq;
757 if (Elem->MsgType == MT2_JOIN_CONF) {
758 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT));
759 if (Reason == MLME_SUCCESS) {
760 /* 1. joined an IBSS, we are pretty much done here */
761 if (pAd->MlmeAux.BssType == BSS_ADHOC) {
763 /* 5G bands rules of Japan: */
764 /* Ad hoc must be disabled in W53(ch52,56,60,64) channels. */
766 if ((pAd->CommonCfg.bIEEE80211H == 1) &&
767 RadarChannelCheck(pAd,
768 pAd->CommonCfg.Channel)
770 pAd->Mlme.CntlMachine.CurrState =
772 DBGPRINT(RT_DEBUG_TRACE,
773 ("CNTL - Channel=%d, Join adhoc on W53(52,56,60,64) Channels are not accepted\n",
774 pAd->CommonCfg.Channel));
778 LinkUp(pAd, BSS_ADHOC);
779 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
780 DBGPRINT(RT_DEBUG_TRACE,
781 ("CNTL - join the IBSS = %02x:%02x:%02x:%02x:%02x:%02x ...\n",
782 pAd->CommonCfg.Bssid[0],
783 pAd->CommonCfg.Bssid[1],
784 pAd->CommonCfg.Bssid[2],
785 pAd->CommonCfg.Bssid[3],
786 pAd->CommonCfg.Bssid[4],
787 pAd->CommonCfg.Bssid[5]));
789 pAd->IndicateMediaState =
790 NdisMediaStateConnected;
791 pAd->ExtraInfo = GENERAL_LINK_UP;
793 /* 2. joined a new INFRA network, start from authentication */
796 /* either Ndis802_11AuthModeShared or Ndis802_11AuthModeAutoSwitch, try shared key first */
797 if ((pAd->StaCfg.AuthMode ==
798 Ndis802_11AuthModeShared)
799 || (pAd->StaCfg.AuthMode ==
800 Ndis802_11AuthModeAutoSwitch)) {
801 AuthParmFill(pAd, &AuthReq,
805 AuthParmFill(pAd, &AuthReq,
809 MlmeEnqueue(pAd, AUTH_STATE_MACHINE,
812 (MLME_AUTH_REQ_STRUCT),
816 pAd->Mlme.CntlMachine.CurrState =
820 /* 3. failed, try next BSS */
821 pAd->MlmeAux.BssIdx++;
822 IterateOnBssTab(pAd);
828 ==========================================================================
831 IRQL = DISPATCH_LEVEL
833 ==========================================================================
835 VOID CntlWaitStartProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
839 if (Elem->MsgType == MT2_START_CONF) {
840 NdisMoveMemory(&Result, Elem->Msg, sizeof(USHORT));
841 if (Result == MLME_SUCCESS) {
843 /* 5G bands rules of Japan: */
844 /* Ad hoc must be disabled in W53(ch52,56,60,64) channels. */
846 if ((pAd->CommonCfg.bIEEE80211H == 1) &&
847 RadarChannelCheck(pAd, pAd->CommonCfg.Channel)
849 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
850 DBGPRINT(RT_DEBUG_TRACE,
851 ("CNTL - Channel=%d, Start adhoc on W53(52,56,60,64) Channels are not accepted\n",
852 pAd->CommonCfg.Channel));
855 NdisZeroMemory(&pAd->StaActive.SupportedPhyInfo.
857 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) {
860 NdisMoveMemory(&pAd->MlmeAux.AddHtInfo,
861 &pAd->CommonCfg.AddHTInfo,
862 sizeof(ADD_HT_INFO_IE));
863 RTMPCheckHt(pAd, BSSID_WCID,
864 &pAd->CommonCfg.HtCapability,
865 &pAd->CommonCfg.AddHTInfo);
866 pAd->StaActive.SupportedPhyInfo.bHtEnable =
868 NdisMoveMemory(&pAd->StaActive.SupportedPhyInfo.
870 &pAd->CommonCfg.HtCapability.
872 COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG
875 if ((pAd->CommonCfg.HtCapability.HtCapInfo.
876 ChannelWidth == BW_40)
877 && (pAd->CommonCfg.AddHTInfo.AddHtInfo.
878 ExtChanOffset == EXTCHA_ABOVE)) {
879 pAd->MlmeAux.CentralChannel =
880 pAd->CommonCfg.Channel + 2;
882 if ((pAd->CommonCfg.HtCapability.HtCapInfo.
883 ChannelWidth == BW_40)
884 && (pAd->CommonCfg.AddHTInfo.AddHtInfo.
885 ExtChanOffset == EXTCHA_BELOW)) {
886 pAd->MlmeAux.CentralChannel =
887 pAd->CommonCfg.Channel - 2;
890 pAd->StaActive.SupportedPhyInfo.bHtEnable =
893 LinkUp(pAd, BSS_ADHOC);
894 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
895 /* Before send beacon, driver need do radar detection */
896 if ((pAd->CommonCfg.Channel > 14)
897 && (pAd->CommonCfg.bIEEE80211H == 1)
898 && RadarChannelCheck(pAd, pAd->CommonCfg.Channel)) {
899 pAd->CommonCfg.RadarDetect.RDMode =
901 pAd->CommonCfg.RadarDetect.RDCount = 0;
904 DBGPRINT(RT_DEBUG_TRACE,
905 ("CNTL - start a new IBSS = %02x:%02x:%02x:%02x:%02x:%02x ...\n",
906 pAd->CommonCfg.Bssid[0],
907 pAd->CommonCfg.Bssid[1],
908 pAd->CommonCfg.Bssid[2],
909 pAd->CommonCfg.Bssid[3],
910 pAd->CommonCfg.Bssid[4],
911 pAd->CommonCfg.Bssid[5]));
913 DBGPRINT(RT_DEBUG_TRACE,
914 ("CNTL - Start IBSS fail. BUG!!!!!\n"));
915 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
921 ==========================================================================
924 IRQL = DISPATCH_LEVEL
926 ==========================================================================
928 VOID CntlWaitAuthProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
931 MLME_ASSOC_REQ_STRUCT AssocReq;
932 MLME_AUTH_REQ_STRUCT AuthReq;
934 if (Elem->MsgType == MT2_AUTH_CONF) {
935 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT));
936 if (Reason == MLME_SUCCESS) {
937 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH OK\n"));
938 AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid,
939 pAd->MlmeAux.CapabilityInfo,
941 pAd->StaCfg.DefaultListenCount);
944 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE,
946 sizeof(MLME_ASSOC_REQ_STRUCT),
949 pAd->Mlme.CntlMachine.CurrState =
953 /* This fail may because of the AP already keep us in its MAC table without */
954 /* ageing-out. The previous authentication attempt must have let it remove us. */
955 /* so try Authentication again may help. For D-Link DWL-900AP+ compatibility. */
956 DBGPRINT(RT_DEBUG_TRACE,
957 ("CNTL - AUTH FAIL, try again...\n"));
960 if ((pAd->StaCfg.AuthMode ==
961 Ndis802_11AuthModeShared)
962 || (pAd->StaCfg.AuthMode ==
963 Ndis802_11AuthModeAutoSwitch)) {
964 /* either Ndis802_11AuthModeShared or Ndis802_11AuthModeAutoSwitch, try shared key first */
965 AuthParmFill(pAd, &AuthReq,
969 AuthParmFill(pAd, &AuthReq,
973 MlmeEnqueue(pAd, AUTH_STATE_MACHINE,
975 sizeof(MLME_AUTH_REQ_STRUCT),
979 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_AUTH2;
985 ==========================================================================
988 IRQL = DISPATCH_LEVEL
990 ==========================================================================
992 VOID CntlWaitAuthProc2(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
995 MLME_ASSOC_REQ_STRUCT AssocReq;
996 MLME_AUTH_REQ_STRUCT AuthReq;
998 if (Elem->MsgType == MT2_AUTH_CONF) {
999 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT));
1000 if (Reason == MLME_SUCCESS) {
1001 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH OK\n"));
1002 AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid,
1003 pAd->MlmeAux.CapabilityInfo,
1005 pAd->StaCfg.DefaultListenCount);
1007 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE,
1009 sizeof(MLME_ASSOC_REQ_STRUCT),
1012 pAd->Mlme.CntlMachine.CurrState =
1016 if ((pAd->StaCfg.AuthMode ==
1017 Ndis802_11AuthModeAutoSwitch)
1018 && (pAd->MlmeAux.Alg == Ndis802_11AuthModeShared)) {
1019 DBGPRINT(RT_DEBUG_TRACE,
1020 ("CNTL - AUTH FAIL, try OPEN system...\n"));
1021 AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid,
1022 Ndis802_11AuthModeOpen);
1023 MlmeEnqueue(pAd, AUTH_STATE_MACHINE,
1025 sizeof(MLME_AUTH_REQ_STRUCT),
1028 pAd->Mlme.CntlMachine.CurrState =
1031 /* not success, try next BSS */
1032 DBGPRINT(RT_DEBUG_TRACE,
1033 ("CNTL - AUTH FAIL, give up; try next BSS\n"));
1034 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; /*??????? */
1035 pAd->MlmeAux.BssIdx++;
1036 IterateOnBssTab(pAd);
1043 ==========================================================================
1046 IRQL = DISPATCH_LEVEL
1048 ==========================================================================
1050 VOID CntlWaitAssocProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1054 if (Elem->MsgType == MT2_ASSOC_CONF) {
1055 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT));
1056 if (Reason == MLME_SUCCESS) {
1057 if (pAd->CommonCfg.bWirelessEvent) {
1058 RTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG,
1060 Content[BSSID_WCID].Addr,
1064 LinkUp(pAd, BSS_INFRA);
1065 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
1066 DBGPRINT(RT_DEBUG_TRACE,
1067 ("CNTL - Association successful on BSS #%ld\n",
1068 pAd->MlmeAux.BssIdx));
1070 /* not success, try next BSS */
1071 DBGPRINT(RT_DEBUG_TRACE,
1072 ("CNTL - Association fails on BSS #%ld\n",
1073 pAd->MlmeAux.BssIdx));
1074 pAd->MlmeAux.BssIdx++;
1075 IterateOnBssTab(pAd);
1081 ==========================================================================
1084 IRQL = DISPATCH_LEVEL
1086 ==========================================================================
1088 VOID CntlWaitReassocProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1092 if (Elem->MsgType == MT2_REASSOC_CONF) {
1093 NdisMoveMemory(&Result, Elem->Msg, sizeof(USHORT));
1094 if (Result == MLME_SUCCESS) {
1095 /* send wireless event - for association */
1096 if (pAd->CommonCfg.bWirelessEvent)
1097 RTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG,
1099 Content[BSSID_WCID].Addr,
1103 /* NDIS requires a new Link UP indication but no Link Down for RE-ASSOC */
1105 LinkUp(pAd, BSS_INFRA);
1107 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
1108 DBGPRINT(RT_DEBUG_TRACE,
1109 ("CNTL - Re-assocition successful on BSS #%ld\n",
1110 pAd->MlmeAux.RoamIdx));
1112 /* reassoc failed, try to pick next BSS in the BSS Table */
1113 DBGPRINT(RT_DEBUG_TRACE,
1114 ("CNTL - Re-assocition fails on BSS #%ld\n",
1115 pAd->MlmeAux.RoamIdx));
1117 pAd->MlmeAux.RoamIdx++;
1118 IterateOnBssTab2(pAd);
1124 VOID AdhocTurnOnQos(IN PRTMP_ADAPTER pAd)
1126 #define AC0_DEF_TXOP 0
1127 #define AC1_DEF_TXOP 0
1128 #define AC2_DEF_TXOP 94
1129 #define AC3_DEF_TXOP 47
1131 /* Turn on QOs if use HT rate. */
1132 if (pAd->CommonCfg.APEdcaParm.bValid == FALSE) {
1133 pAd->CommonCfg.APEdcaParm.bValid = TRUE;
1134 pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;
1135 pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;
1136 pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;
1137 pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;
1139 pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;
1140 pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;
1141 pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;
1142 pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;
1144 pAd->CommonCfg.APEdcaParm.Cwmax[0] = 10;
1145 pAd->CommonCfg.APEdcaParm.Cwmax[1] = 6;
1146 pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;
1147 pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;
1149 pAd->CommonCfg.APEdcaParm.Txop[0] = 0;
1150 pAd->CommonCfg.APEdcaParm.Txop[1] = 0;
1151 pAd->CommonCfg.APEdcaParm.Txop[2] = AC2_DEF_TXOP;
1152 pAd->CommonCfg.APEdcaParm.Txop[3] = AC3_DEF_TXOP;
1154 AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
1158 ==========================================================================
1161 IRQL = DISPATCH_LEVEL
1163 ==========================================================================
1165 VOID LinkUp(IN PRTMP_ADAPTER pAd, IN UCHAR BssType)
1170 UCHAR Value = 0, idx = 0, HashIdx = 0;
1171 MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry = NULL;
1173 /* Init ChannelQuality to prevent DEAD_CQI at initial LinkUp */
1174 pAd->Mlme.ChannelQuality = 50;
1176 pEntry = MacTableLookup(pAd, pAd->CommonCfg.Bssid);
1178 MacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);
1182 pEntry = &pAd->MacTab.Content[BSSID_WCID];
1185 /* ASSOC - DisassocTimeoutAction */
1186 /* CNTL - Dis-associate successful */
1187 /* !!! LINK DOWN !!! */
1188 /* [88888] OID_802_11_SSID should have returned NDTEST_WEP_AP2(Returned: ) */
1190 /* To prevent DisassocTimeoutAction to call Link down after we link up, */
1191 /* cancel the DisassocTimer no matter what it start or not. */
1193 RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled);
1195 COPY_SETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);
1197 COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);
1200 /* Before power save before link up function, We will force use 1R. */
1201 /* So after link up, check Rx antenna # again. */
1202 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
1203 if (pAd->Antenna.field.RxPath == 3) {
1205 } else if (pAd->Antenna.field.RxPath == 2) {
1207 } else if (pAd->Antenna.field.RxPath == 1) {
1210 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
1211 pAd->StaCfg.BBPR3 = Value;
1212 #endif /* RTMP_MAC_PCI // */
1214 if (BssType == BSS_ADHOC) {
1215 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_ADHOC_ON);
1216 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
1218 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
1219 AdhocTurnOnQos(pAd);
1221 DBGPRINT(RT_DEBUG_TRACE, ("!!!Adhoc LINK UP !!! \n"));
1223 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_INFRA_ON);
1224 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
1226 DBGPRINT(RT_DEBUG_TRACE, ("!!!Infra LINK UP !!! \n"));
1230 /* reset Tx beamforming bit */
1231 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
1233 Value |= pAd->CommonCfg.RegTransmitSetting.field.TxBF;
1234 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
1236 /* Change to AP channel */
1237 if ((pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel)
1238 && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)) {
1239 /* Must using 40MHz. */
1240 pAd->CommonCfg.BBPCurrentBW = BW_40;
1241 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
1242 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
1244 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
1247 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
1249 /* RX : control channel at lower */
1250 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
1252 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
1254 pAd->StaCfg.BBPR3 = Value;
1255 #endif /* RTMP_MAC_PCI // */
1257 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
1259 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
1261 if (pAd->MACVersion == 0x28600100) {
1262 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
1263 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
1264 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
1265 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n"));
1268 DBGPRINT(RT_DEBUG_TRACE,
1269 ("!!!40MHz Lower LINK UP !!! Control Channel at Below. Central = %d \n",
1270 pAd->CommonCfg.CentralChannel));
1271 } else if ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel)
1272 && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth ==
1274 /* Must using 40MHz. */
1275 pAd->CommonCfg.BBPCurrentBW = BW_40;
1276 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
1277 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
1279 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
1282 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
1284 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
1286 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
1288 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
1290 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
1292 pAd->StaCfg.BBPR3 = Value;
1293 #endif /* RTMP_MAC_PCI // */
1295 if (pAd->MACVersion == 0x28600100) {
1296 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
1297 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
1298 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
1299 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n"));
1302 DBGPRINT(RT_DEBUG_TRACE,
1303 ("!!! 40MHz Upper LINK UP !!! Control Channel at UpperCentral = %d \n",
1304 pAd->CommonCfg.CentralChannel));
1306 pAd->CommonCfg.BBPCurrentBW = BW_20;
1307 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
1308 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
1309 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
1311 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
1313 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
1315 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
1317 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
1319 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
1321 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
1323 pAd->StaCfg.BBPR3 = Value;
1324 #endif /* RTMP_MAC_PCI // */
1326 if (pAd->MACVersion == 0x28600100) {
1327 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
1328 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08);
1329 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11);
1330 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n"));
1333 DBGPRINT(RT_DEBUG_TRACE, ("!!! 20MHz LINK UP !!! \n"));
1336 RTMPSetAGCInitValue(pAd, pAd->CommonCfg.BBPCurrentBW);
1339 /* Save BBP_R66 value, it will be used in RTUSBResumeMsduTransmission */
1341 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66,
1342 &pAd->BbpTuning.R66CurrentValue);
1344 DBGPRINT(RT_DEBUG_TRACE,
1345 ("!!! LINK UP !!! (BssType=%d, AID=%d, ssid=%s, Channel=%d, CentralChannel = %d)\n",
1346 BssType, pAd->StaActive.Aid, pAd->CommonCfg.Ssid,
1347 pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));
1349 DBGPRINT(RT_DEBUG_TRACE,
1350 ("!!! LINK UP !!! (Density =%d, )\n",
1351 pAd->MacTab.Content[BSSID_WCID].MpduDensity));
1353 AsicSetBssid(pAd, pAd->CommonCfg.Bssid);
1355 AsicSetSlotTime(pAd, TRUE);
1356 AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
1358 /* Call this for RTS protectionfor legacy rate, we will always enable RTS threshold, but normally it will not hit */
1359 AsicUpdateProtect(pAd, 0, (OFDMSETPROTECT | CCKSETPROTECT), TRUE,
1362 if ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE)) {
1363 /* Update HT protectionfor based on AP's operating mode. */
1364 if (pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1) {
1365 AsicUpdateProtect(pAd,
1366 pAd->MlmeAux.AddHtInfo.AddHtInfo2.
1367 OperaionMode, ALLN_SETPROTECT, FALSE,
1370 AsicUpdateProtect(pAd,
1371 pAd->MlmeAux.AddHtInfo.AddHtInfo2.
1372 OperaionMode, ALLN_SETPROTECT, FALSE,
1376 NdisZeroMemory(&pAd->DrsCounters, sizeof(COUNTER_DRS));
1378 NdisGetSystemUpTime(&Now);
1379 pAd->StaCfg.LastBeaconRxTime = Now; /* last RX timestamp */
1381 if ((pAd->CommonCfg.TxPreamble != Rt802_11PreambleLong) &&
1382 CAP_IS_SHORT_PREAMBLE_ON(pAd->StaActive.CapabilityInfo)) {
1383 MlmeSetTxPreamble(pAd, Rt802_11PreambleShort);
1386 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);
1388 if (pAd->CommonCfg.RadarDetect.RDMode == RD_SILENCE_MODE) {
1390 pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE;
1392 if (BssType == BSS_ADHOC) {
1393 MakeIbssBeacon(pAd);
1394 if ((pAd->CommonCfg.Channel > 14)
1395 && (pAd->CommonCfg.bIEEE80211H == 1)
1396 && RadarChannelCheck(pAd, pAd->CommonCfg.Channel)) {
1399 AsicEnableIbssSync(pAd);
1402 /* In ad hoc mode, use MAC table from index 1. */
1403 /* p.s ASIC use all 0xff as termination of WCID table search.To prevent it's 0xff-ff-ff-ff-ff-ff, Write 0 here. */
1404 RTMP_IO_WRITE32(pAd, MAC_WCID_BASE, 0x00);
1405 RTMP_IO_WRITE32(pAd, 0x1808, 0x00);
1407 /* If WEP is enabled, add key material and cipherAlg into Asic */
1408 /* Fill in Shared Key Table(offset: 0x6c00) and Shared Key Mode(offset: 0x7000) */
1410 if (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) {
1414 for (idx = 0; idx < SHARE_KEY_NUM; idx++) {
1415 CipherAlg = pAd->SharedKey[BSS0][idx].CipherAlg;
1416 Key = pAd->SharedKey[BSS0][idx].Key;
1418 if (pAd->SharedKey[BSS0][idx].KeyLen > 0) {
1419 /* Set key material and cipherAlg to Asic */
1420 AsicAddSharedKeyEntry(pAd, BSS0, idx,
1424 if (idx == pAd->StaCfg.DefaultKeyId) {
1425 /* Update WCID attribute table and IVEIV table for this group key table */
1426 RTMPAddWcidAttributeEntry(pAd,
1436 /* If WPANone is enabled, add key material and cipherAlg into Asic */
1437 /* Fill in Shared Key Table(offset: 0x6c00) and Shared Key Mode(offset: 0x7000) */
1438 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) {
1439 pAd->StaCfg.DefaultKeyId = 0; /* always be zero */
1441 NdisZeroMemory(&pAd->SharedKey[BSS0][0],
1442 sizeof(CIPHER_KEY));
1443 pAd->SharedKey[BSS0][0].KeyLen = LEN_TKIP_EK;
1444 NdisMoveMemory(pAd->SharedKey[BSS0][0].Key,
1445 pAd->StaCfg.PMK, LEN_TKIP_EK);
1447 if (pAd->StaCfg.PairCipher ==
1448 Ndis802_11Encryption2Enabled) {
1449 NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic,
1450 &pAd->StaCfg.PMK[16],
1452 NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic,
1453 &pAd->StaCfg.PMK[16],
1456 /* Decide its ChiperAlg */
1457 if (pAd->StaCfg.PairCipher ==
1458 Ndis802_11Encryption2Enabled)
1459 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP;
1460 else if (pAd->StaCfg.PairCipher ==
1461 Ndis802_11Encryption3Enabled)
1462 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;
1464 DBGPRINT(RT_DEBUG_TRACE,
1465 ("Unknow Cipher (=%d), set Cipher to AES\n",
1466 pAd->StaCfg.PairCipher));
1467 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;
1470 /* Set key material and cipherAlg to Asic */
1471 AsicAddSharedKeyEntry(pAd,
1474 pAd->SharedKey[BSS0][0].CipherAlg,
1475 pAd->SharedKey[BSS0][0].Key,
1476 pAd->SharedKey[BSS0][0].TxMic,
1477 pAd->SharedKey[BSS0][0].RxMic);
1479 /* Update WCID attribute table and IVEIV table for this group key table */
1480 RTMPAddWcidAttributeEntry(pAd, BSS0, 0,
1481 pAd->SharedKey[BSS0][0].
1486 } else /* BSS_INFRA */
1488 /* Check the new SSID with last SSID */
1489 while (Cancelled == TRUE) {
1490 if (pAd->CommonCfg.LastSsidLen ==
1491 pAd->CommonCfg.SsidLen) {
1492 if (RTMPCompareMemory
1493 (pAd->CommonCfg.LastSsid,
1494 pAd->CommonCfg.Ssid,
1495 pAd->CommonCfg.LastSsidLen) == 0) {
1496 /* Link to the old one no linkdown is required. */
1500 /* Send link down event before set to link up */
1501 pAd->IndicateMediaState = NdisMediaStateDisconnected;
1502 RTMP_IndicateMediaState(pAd);
1503 pAd->ExtraInfo = GENERAL_LINK_DOWN;
1504 DBGPRINT(RT_DEBUG_TRACE,
1505 ("NDIS_STATUS_MEDIA_DISCONNECT Event AA!\n"));
1510 /* On WPA mode, Remove All Keys if not connect to the last BSSID */
1511 /* Key will be set after 4-way handshake. */
1513 if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) {
1516 /* Remove all WPA keys */
1517 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
1518 RTMPWPARemoveAllKeys(pAd);
1519 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1520 pAd->StaCfg.PrivacyFilter =
1521 Ndis802_11PrivFilter8021xWEP;
1523 /* Fixed connection failed with Range Maximizer - 515 AP (Marvell Chip) when security is WPAPSK/TKIP */
1524 /* If IV related values are too large in GroupMsg2, AP would ignore this message. */
1526 IV |= (pAd->StaCfg.DefaultKeyId << 30);
1527 AsicUpdateWCIDIVEIV(pAd, BSSID_WCID, IV, 0);
1530 /* the decision of using "short slot time" or not may change dynamically due to */
1531 /* new STA association to the AP. so we have to decide that upon parsing BEACON, not here */
1534 /* the decision to use "RTC/CTS" or "CTS-to-self" protection or not may change dynamically */
1535 /* due to new STA association to the AP. so we have to decide that upon parsing BEACON, not here */
1538 ComposeNullFrame(pAd);
1540 AsicEnableBssSync(pAd);
1542 /* Add BSSID to WCID search table */
1543 AsicUpdateRxWCIDTable(pAd, BSSID_WCID, pAd->CommonCfg.Bssid);
1545 /* If WEP is enabled, add paiewise and shared key */
1546 if (((pAd->StaCfg.WpaSupplicantUP) &&
1547 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) &&
1548 (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)) ||
1549 ((pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE) &&
1550 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled))) {
1554 for (idx = 0; idx < SHARE_KEY_NUM; idx++) {
1555 CipherAlg = pAd->SharedKey[BSS0][idx].CipherAlg;
1556 Key = pAd->SharedKey[BSS0][idx].Key;
1558 if (pAd->SharedKey[BSS0][idx].KeyLen > 0) {
1559 /* Set key material and cipherAlg to Asic */
1560 AsicAddSharedKeyEntry(pAd, BSS0, idx,
1564 if (idx == pAd->StaCfg.DefaultKeyId) {
1565 /* Assign group key info */
1566 RTMPAddWcidAttributeEntry(pAd,
1572 pEntry->Aid = BSSID_WCID;
1573 /* Assign pairwise key info */
1574 RTMPAddWcidAttributeEntry(pAd,
1583 /* only INFRASTRUCTURE mode need to indicate connectivity immediately; ADHOC mode */
1584 /* should wait until at least 2 active nodes in this BSSID. */
1585 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
1588 if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA) {
1589 pAd->IndicateMediaState = NdisMediaStateConnected;
1590 pAd->ExtraInfo = GENERAL_LINK_UP;
1591 RTMP_IndicateMediaState(pAd);
1592 } else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1593 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1595 if (pAd->StaCfg.WpaSupplicantUP ==
1596 WPA_SUPPLICANT_DISABLE)
1597 RTMPSetTimer(&pAd->Mlme.LinkDownTimer,
1602 /* Add BSSID in my MAC Table. */
1603 NdisAcquireSpinLock(&pAd->MacTabLock);
1604 /* add this MAC entry into HASH table */
1606 HashIdx = MAC_ADDR_HASH_INDEX(pAd->CommonCfg.Bssid);
1607 if (pAd->MacTab.Hash[HashIdx] == NULL) {
1608 pAd->MacTab.Hash[HashIdx] = pEntry;
1610 pCurrEntry = pAd->MacTab.Hash[HashIdx];
1611 while (pCurrEntry->pNext != NULL) {
1612 pCurrEntry = pCurrEntry->pNext;
1614 pCurrEntry->pNext = pEntry;
1617 RTMPMoveMemory(pEntry->Addr, pAd->CommonCfg.Bssid,
1619 pEntry->Aid = BSSID_WCID;
1621 pEntry->ValidAsCLI = TRUE; /*Although this is bssid..still set ValidAsCl */
1622 pAd->MacTab.Size = 1; /* infra mode always set MACtab size =1. */
1623 pEntry->Sst = SST_ASSOC;
1624 pEntry->AuthState = SST_ASSOC;
1625 pEntry->AuthMode = pAd->StaCfg.AuthMode;
1626 pEntry->WepStatus = pAd->StaCfg.WepStatus;
1627 if (pEntry->AuthMode < Ndis802_11AuthModeWPA) {
1628 pEntry->WpaState = AS_NOTUSE;
1629 pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
1631 pEntry->WpaState = AS_PTKSTART;
1632 pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
1634 NdisReleaseSpinLock(&pAd->MacTabLock);
1636 DBGPRINT(RT_DEBUG_TRACE,
1637 ("!!! LINK UP !!! ClientStatusFlags=%lx)\n",
1638 pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));
1640 MlmeUpdateTxRates(pAd, TRUE, BSS0);
1641 MlmeUpdateHtTxRates(pAd, BSS0);
1642 DBGPRINT(RT_DEBUG_TRACE,
1643 ("!!! LINK UP !! (StaActive.bHtEnable =%d, )\n",
1644 pAd->StaActive.SupportedPhyInfo.bHtEnable));
1646 if (pAd->CommonCfg.bAggregationCapable) {
1647 if ((pAd->CommonCfg.bPiggyBackCapable)
1648 && (pAd->MlmeAux.APRalinkIe & 0x00000003) == 3) {
1649 OPSTATUS_SET_FLAG(pAd,
1650 fOP_STATUS_PIGGYBACK_INUSED);
1651 OPSTATUS_SET_FLAG(pAd,
1652 fOP_STATUS_AGGREGATION_INUSED);
1653 CLIENT_STATUS_SET_FLAG(pEntry,
1654 fCLIENT_STATUS_AGGREGATION_CAPABLE);
1655 CLIENT_STATUS_SET_FLAG(pEntry,
1656 fCLIENT_STATUS_PIGGYBACK_CAPABLE);
1657 RTMPSetPiggyBack(pAd, TRUE);
1658 DBGPRINT(RT_DEBUG_TRACE,
1659 ("Turn on Piggy-Back\n"));
1660 } else if (pAd->MlmeAux.APRalinkIe & 0x00000001) {
1661 OPSTATUS_SET_FLAG(pAd,
1662 fOP_STATUS_AGGREGATION_INUSED);
1663 CLIENT_STATUS_SET_FLAG(pEntry,
1664 fCLIENT_STATUS_AGGREGATION_CAPABLE);
1665 DBGPRINT(RT_DEBUG_TRACE,
1666 ("Ralink Aggregation\n"));
1670 if (pAd->MlmeAux.APRalinkIe != 0x0) {
1671 if (CLIENT_STATUS_TEST_FLAG
1672 (pEntry, fCLIENT_STATUS_RDG_CAPABLE)) {
1675 OPSTATUS_SET_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET);
1676 CLIENT_STATUS_SET_FLAG(pEntry,
1677 fCLIENT_STATUS_RALINK_CHIPSET);
1679 OPSTATUS_CLEAR_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET);
1680 CLIENT_STATUS_CLEAR_FLAG(pEntry,
1681 fCLIENT_STATUS_RALINK_CHIPSET);
1685 DBGPRINT(RT_DEBUG_TRACE,
1686 ("NDIS_STATUS_MEDIA_CONNECT Event B!.BACapability = %x. ClientStatusFlags = %lx\n",
1687 pAd->CommonCfg.BACapability.word,
1688 pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));
1691 RTMPSetLED(pAd, LED_LINK_UP);
1693 pAd->Mlme.PeriodicRound = 0;
1694 pAd->Mlme.OneSecPeriodicRound = 0;
1695 pAd->bConfigChanged = FALSE; /* Reset config flag */
1696 pAd->ExtraInfo = GENERAL_LINK_UP; /* Update extra information to link is up */
1698 /* Set asic auto fall back */
1701 UCHAR TableSize = 0;
1703 MlmeSelectTxRateTable(pAd, &pAd->MacTab.Content[BSSID_WCID],
1704 &pTable, &TableSize,
1705 &pAd->CommonCfg.TxRateIndex);
1706 AsicUpdateAutoFallBackTable(pAd, pTable);
1709 NdisAcquireSpinLock(&pAd->MacTabLock);
1710 pEntry->HTPhyMode.word = pAd->StaCfg.HTPhyMode.word;
1711 pEntry->MaxHTPhyMode.word = pAd->StaCfg.HTPhyMode.word;
1712 if (pAd->StaCfg.bAutoTxRateSwitch == FALSE) {
1713 pEntry->bAutoTxRateSwitch = FALSE;
1715 if (pEntry->HTPhyMode.field.MCS == 32)
1716 pEntry->HTPhyMode.field.ShortGI = GI_800;
1718 if ((pEntry->HTPhyMode.field.MCS > MCS_7)
1719 || (pEntry->HTPhyMode.field.MCS == 32))
1720 pEntry->HTPhyMode.field.STBC = STBC_NONE;
1722 /* If the legacy mode is set, overwrite the transmit setting of this entry. */
1723 if (pEntry->HTPhyMode.field.MODE <= MODE_OFDM)
1724 RTMPUpdateLegacyTxSetting((UCHAR) pAd->StaCfg.
1725 DesiredTransmitSetting.field.
1726 FixedTxMode, pEntry);
1728 pEntry->bAutoTxRateSwitch = TRUE;
1729 NdisReleaseSpinLock(&pAd->MacTabLock);
1731 /* Let Link Status Page display first initial rate. */
1732 pAd->LastTxRate = (USHORT) (pEntry->HTPhyMode.word);
1733 /* Select DAC according to HT or Legacy */
1734 if (pAd->StaActive.SupportedPhyInfo.MCSSet[0] != 0x00) {
1735 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &Value);
1737 if (pAd->Antenna.field.TxPath == 2) {
1740 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value);
1742 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &Value);
1744 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value);
1747 if (pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) {
1748 } else if (pEntry->MaxRAmpduFactor == 0) {
1749 /* If HT AP doesn't support MaxRAmpduFactor = 1, we need to set max PSDU to 0. */
1750 /* Because our Init value is 1 at MACRegTable. */
1751 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x0fff);
1753 /* Patch for Marvel AP to gain high throughput */
1754 /* Need to set as following, */
1755 /* 1. Set txop in register-EDCA_AC0_CFG as 0x60 */
1756 /* 2. Set EnTXWriteBackDDONE in register-WPDMA_GLO_CFG as zero */
1757 /* 3. PBF_MAX_PCNT as 0x1F3FBF9F */
1758 /* 4. kick per two packets when dequeue */
1760 /* Txop can only be modified when RDG is off, WMM is disable and TxBurst is enable */
1762 /* if 1. Legacy AP WMM on, or 2. 11n AP, AMPDU disable. Force turn off burst no matter what bEnableTxBurst is. */
1763 if (!((pAd->CommonCfg.RxStream == 1) && (pAd->CommonCfg.TxStream == 1))
1764 && (pAd->StaCfg.bForceTxBurst == FALSE)
1766 (((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE)
1767 && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))
1768 || ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE)
1769 && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE)))) {
1770 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
1772 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);
1774 RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F);
1775 DBGPRINT(RT_DEBUG_TRACE, ("Txburst 1\n"));
1776 } else if (pAd->CommonCfg.bEnableTxBurst) {
1777 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
1780 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);
1781 pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = TRUE;
1783 RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3FBF9F);
1784 DBGPRINT(RT_DEBUG_TRACE, ("Txburst 2\n"));
1786 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
1788 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);
1790 RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F);
1791 DBGPRINT(RT_DEBUG_TRACE, ("Txburst 3\n"));
1794 /* Re-check to turn on TX burst or not. */
1795 if ((pAd->CommonCfg.IOTestParm.bLastAtheros == TRUE)
1796 && ((STA_WEP_ON(pAd)) || (STA_TKIP_ON(pAd)))) {
1797 pAd->CommonCfg.IOTestParm.bNextDisableRxBA = TRUE;
1798 if (pAd->CommonCfg.bEnableTxBurst) {
1799 UINT32 MACValue = 0;
1800 /* Force disable TXOP value in this case. The same action in MLMEUpdateProtect too. */
1801 /* I didn't change PBF_MAX_PCNT setting. */
1802 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &MACValue);
1803 MACValue &= 0xFFFFFF00;
1804 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, MACValue);
1805 pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE;
1808 pAd->CommonCfg.IOTestParm.bNextDisableRxBA = FALSE;
1811 pAd->CommonCfg.IOTestParm.bLastAtheros = FALSE;
1812 COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid);
1813 DBGPRINT(RT_DEBUG_TRACE,
1814 ("!!!pAd->bNextDisableRxBA= %d \n",
1815 pAd->CommonCfg.IOTestParm.bNextDisableRxBA));
1816 /* BSSID add in one MAC entry too. Because in Tx, ASIC need to check Cipher and IV/EIV, BAbitmap */
1817 /* Pther information in MACTab.Content[BSSID_WCID] is not necessary for driver. */
1818 /* Note: As STA, The MACTab.Content[BSSID_WCID]. PairwiseKey and Shared Key for BSS0 are the same. */
1820 if (pAd->StaCfg.WepStatus <= Ndis802_11WEPDisabled) {
1821 if (pAd->StaCfg.WpaSupplicantUP &&
1822 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) &&
1823 (pAd->StaCfg.IEEE8021X == TRUE)) ;
1825 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1826 pAd->StaCfg.PrivacyFilter =
1827 Ndis802_11PrivFilterAcceptAll;
1831 NdisAcquireSpinLock(&pAd->MacTabLock);
1832 pEntry->PortSecured = pAd->StaCfg.PortSecured;
1833 NdisReleaseSpinLock(&pAd->MacTabLock);
1836 /* Patch Atheros AP TX will breakdown issue. */
1837 /* AP Model: DLink DWL-8200AP */
1839 if (INFRA_ON(pAd) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)
1840 && STA_TKIP_ON(pAd)) {
1841 RTMP_IO_WRITE32(pAd, RX_PARSER_CFG, 0x01);
1843 RTMP_IO_WRITE32(pAd, RX_PARSER_CFG, 0x00);
1846 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
1848 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW);
1852 ==========================================================================
1854 Routine Description:
1855 Disconnect current BSSID
1858 pAd - Pointer to our adapter
1859 IsReqFromAP - Request from AP
1864 IRQL = DISPATCH_LEVEL
1867 We need more information to know it's this requst from AP.
1868 If yes! we need to do extra handling, for example, remove the WPA key.
1869 Otherwise on 4-way handshaking will faied, since the WPA key didn't be
1870 remove while auto reconnect.
1871 Disconnect request from AP, it means we will start afresh 4-way handshaking
1874 ==========================================================================
1876 VOID LinkDown(IN PRTMP_ADAPTER pAd, IN BOOLEAN IsReqFromAP)
1878 UCHAR i, ByteValue = 0;
1880 /* Do nothing if monitor mode is on */
1881 if (MONITOR_ON(pAd))
1884 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW);
1885 /*Comment the codes, beasue the line 2291 call the same function. */
1886 /*RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled); */
1887 /* Not allow go to sleep within linkdown function. */
1888 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
1890 if (pAd->CommonCfg.bWirelessEvent) {
1891 RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG,
1892 pAd->MacTab.Content[BSSID_WCID].Addr,
1896 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN !!!\n"));
1897 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);
1900 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) {
1902 pAd->Mlme.bPsPollTimerRunning = FALSE;
1903 RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);
1906 pAd->bPCIclkOff = FALSE;
1907 #endif /* RTMP_MAC_PCI // */
1909 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)
1910 || RTMP_TEST_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND)
1911 || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)) {
1912 AUTO_WAKEUP_STRUC AutoWakeupCfg;
1913 AsicForceWakeup(pAd, TRUE);
1914 AutoWakeupCfg.word = 0;
1915 RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
1916 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
1919 pAd->bPCIclkOff = FALSE;
1920 #endif /* RTMP_MAC_PCI // */
1922 if (ADHOC_ON(pAd)) /* Adhoc mode link down */
1924 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 1!!!\n"));
1926 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
1927 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
1928 pAd->IndicateMediaState = NdisMediaStateDisconnected;
1929 RTMP_IndicateMediaState(pAd);
1930 pAd->ExtraInfo = GENERAL_LINK_DOWN;
1931 BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid,
1932 pAd->CommonCfg.Channel);
1933 DBGPRINT(RT_DEBUG_TRACE,
1934 ("!!! MacTab.Size=%d !!!\n", pAd->MacTab.Size));
1935 } else /* Infra structure mode */
1937 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 2!!!\n"));
1939 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
1940 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
1942 /* Saved last SSID for linkup comparison */
1943 pAd->CommonCfg.LastSsidLen = pAd->CommonCfg.SsidLen;
1944 NdisMoveMemory(pAd->CommonCfg.LastSsid, pAd->CommonCfg.Ssid,
1945 pAd->CommonCfg.LastSsidLen);
1946 COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid);
1947 if (pAd->MlmeAux.CurrReqIsFromNdis == TRUE) {
1948 pAd->IndicateMediaState = NdisMediaStateDisconnected;
1949 RTMP_IndicateMediaState(pAd);
1950 pAd->ExtraInfo = GENERAL_LINK_DOWN;
1951 DBGPRINT(RT_DEBUG_TRACE,
1952 ("NDIS_STATUS_MEDIA_DISCONNECT Event A!\n"));
1953 pAd->MlmeAux.CurrReqIsFromNdis = FALSE;
1956 /* If disassociation request is from NDIS, then we don't need to delete BSSID from entry. */
1957 /* Otherwise lost beacon or receive De-Authentication from AP, */
1958 /* then we should delete BSSID from BssTable. */
1959 /* If we don't delete from entry, roaming will fail. */
1961 BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid,
1962 pAd->CommonCfg.Channel);
1965 /* restore back to - */
1966 /* 1. long slot (20 us) or short slot (9 us) time */
1967 /* 2. turn on/off RTS/CTS and/or CTS-to-self protection */
1968 /* 3. short preamble */
1969 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED);
1973 for (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) {
1974 if (pAd->MacTab.Content[i].ValidAsCLI == TRUE)
1975 MacTableDeleteEntry(pAd, pAd->MacTab.Content[i].Aid,
1976 pAd->MacTab.Content[i].Addr);
1979 AsicSetSlotTime(pAd, TRUE); /*FALSE); */
1980 AsicSetEdcaParm(pAd, NULL);
1983 RTMPSetLED(pAd, LED_LINK_DOWN);
1984 pAd->LedIndicatorStrength = 0xF0;
1985 RTMPSetSignalLED(pAd, -100); /* Force signal strength Led to be turned off, firmware is not done it. */
1987 AsicDisableSync(pAd);
1989 pAd->Mlme.PeriodicRound = 0;
1990 pAd->Mlme.OneSecPeriodicRound = 0;
1992 if (pAd->StaCfg.BssType == BSS_INFRA) {
1993 /* Remove StaCfg Information after link down */
1994 NdisZeroMemory(pAd->CommonCfg.Bssid, MAC_ADDR_LEN);
1995 NdisZeroMemory(pAd->CommonCfg.Ssid, MAX_LEN_OF_SSID);
1996 pAd->CommonCfg.SsidLen = 0;
1999 NdisZeroMemory(&pAd->MlmeAux.HtCapability, sizeof(HT_CAPABILITY_IE));
2000 NdisZeroMemory(&pAd->MlmeAux.AddHtInfo, sizeof(ADD_HT_INFO_IE));
2001 pAd->MlmeAux.HtCapabilityLen = 0;
2002 pAd->MlmeAux.NewExtChannelOffset = 0xff;
2004 /* Reset WPA-PSK state. Only reset when supplicant enabled */
2005 if (pAd->StaCfg.WpaState != SS_NOTUSE) {
2006 pAd->StaCfg.WpaState = SS_START;
2007 /* Clear Replay counter */
2008 NdisZeroMemory(pAd->StaCfg.ReplayCounter, 8);
2012 /* if link down come from AP, we need to remove all WPA keys on WPA mode. */
2013 /* otherwise will cause 4-way handshaking failed, since the WPA key not empty. */
2015 if ((IsReqFromAP) && (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)) {
2016 /* Remove all WPA keys */
2017 RTMPWPARemoveAllKeys(pAd);
2019 /* 802.1x port control */
2021 /* Prevent clear PortSecured here with static WEP */
2022 /* NetworkManger set security policy first then set SSID to connect AP. */
2023 if (pAd->StaCfg.WpaSupplicantUP &&
2024 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) &&
2025 (pAd->StaCfg.IEEE8021X == FALSE)) {
2026 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
2028 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
2029 pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
2032 NdisAcquireSpinLock(&pAd->MacTabLock);
2033 NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE));
2034 pAd->MacTab.Content[BSSID_WCID].PortSecured = pAd->StaCfg.PortSecured;
2035 NdisReleaseSpinLock(&pAd->MacTabLock);
2037 pAd->StaCfg.MicErrCnt = 0;
2039 pAd->IndicateMediaState = NdisMediaStateDisconnected;
2040 /* Update extra information to link is up */
2041 pAd->ExtraInfo = GENERAL_LINK_DOWN;
2043 pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
2046 pAd->bUsbTxBulkAggre = FALSE;
2047 #endif /* RTMP_MAC_USB // */
2049 /* Clean association information */
2050 NdisZeroMemory(&pAd->StaCfg.AssocInfo,
2051 sizeof(NDIS_802_11_ASSOCIATION_INFORMATION));
2052 pAd->StaCfg.AssocInfo.Length =
2053 sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
2054 pAd->StaCfg.ReqVarIELen = 0;
2055 pAd->StaCfg.ResVarIELen = 0;
2058 /* Reset RSSI value after link down */
2060 pAd->StaCfg.RssiSample.AvgRssi0 = 0;
2061 pAd->StaCfg.RssiSample.AvgRssi0X8 = 0;
2062 pAd->StaCfg.RssiSample.AvgRssi1 = 0;
2063 pAd->StaCfg.RssiSample.AvgRssi1X8 = 0;
2064 pAd->StaCfg.RssiSample.AvgRssi2 = 0;
2065 pAd->StaCfg.RssiSample.AvgRssi2X8 = 0;
2067 /* Restore MlmeRate */
2068 pAd->CommonCfg.MlmeRate = pAd->CommonCfg.BasicMlmeRate;
2069 pAd->CommonCfg.RtsRate = pAd->CommonCfg.BasicMlmeRate;
2072 /* After Link down, reset piggy-back setting in ASIC. Disable RDG. */
2074 if (pAd->CommonCfg.BBPCurrentBW == BW_40) {
2075 pAd->CommonCfg.BBPCurrentBW = BW_20;
2076 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &ByteValue);
2077 ByteValue &= (~0x18);
2078 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, ByteValue);
2081 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &ByteValue);
2082 ByteValue &= (~0x18);
2083 if (pAd->Antenna.field.TxPath == 2) {
2086 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, ByteValue);
2088 RTMPSetPiggyBack(pAd, FALSE);
2089 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_PIGGYBACK_INUSED);
2091 pAd->CommonCfg.BACapability.word = pAd->CommonCfg.REGBACapability.word;
2093 /* Restore all settings in the following. */
2094 AsicUpdateProtect(pAd, 0,
2095 (ALLN_SETPROTECT | CCKSETPROTECT | OFDMSETPROTECT),
2097 AsicDisableRDG(pAd);
2098 pAd->CommonCfg.IOTestParm.bCurrentAtheros = FALSE;
2099 pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE;
2101 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x1fff);
2102 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
2104 /* Allow go to sleep after linkdown steps. */
2105 RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
2107 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0);
2110 if ((IS_RT30xx(pAd) || IS_RT3090(pAd) || IS_RT3390(pAd))
2111 && (pAd->Antenna.field.RxPath > 1 || pAd->Antenna.field.TxPath > 1)) {
2112 RTMP_ASIC_MMPS_DISABLE(pAd);
2114 #endif /* RT30xx // */
2118 ==========================================================================
2121 IRQL = DISPATCH_LEVEL
2123 ==========================================================================
2125 VOID IterateOnBssTab(IN PRTMP_ADAPTER pAd)
2127 MLME_START_REQ_STRUCT StartReq;
2128 MLME_JOIN_REQ_STRUCT JoinReq;
2131 /* Change the wepstatus to original wepstatus */
2132 pAd->StaCfg.WepStatus = pAd->StaCfg.OrigWepStatus;
2133 pAd->StaCfg.PairCipher = pAd->StaCfg.OrigWepStatus;
2134 pAd->StaCfg.GroupCipher = pAd->StaCfg.OrigWepStatus;
2136 BssIdx = pAd->MlmeAux.BssIdx;
2137 if (BssIdx < pAd->MlmeAux.SsidBssTab.BssNr) {
2138 /* Check cipher suite, AP must have more secured cipher than station setting */
2139 /* Set the Pairwise and Group cipher to match the intended AP setting */
2140 /* We can only connect to AP with less secured cipher setting */
2141 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA)
2142 || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) {
2143 pAd->StaCfg.GroupCipher =
2144 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.
2147 if (pAd->StaCfg.WepStatus ==
2148 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.
2150 pAd->StaCfg.PairCipher =
2151 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].
2153 else if (pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.
2154 PairCipherAux != Ndis802_11WEPDisabled)
2155 pAd->StaCfg.PairCipher =
2156 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].
2158 else /* There is no PairCipher Aux, downgrade our capability to TKIP */
2159 pAd->StaCfg.PairCipher =
2160 Ndis802_11Encryption2Enabled;
2161 } else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)
2162 || (pAd->StaCfg.AuthMode ==
2163 Ndis802_11AuthModeWPA2PSK)) {
2164 pAd->StaCfg.GroupCipher =
2165 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.
2168 if (pAd->StaCfg.WepStatus ==
2169 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.
2171 pAd->StaCfg.PairCipher =
2172 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].
2174 else if (pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.
2175 PairCipherAux != Ndis802_11WEPDisabled)
2176 pAd->StaCfg.PairCipher =
2177 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].
2179 else /* There is no PairCipher Aux, downgrade our capability to TKIP */
2180 pAd->StaCfg.PairCipher =
2181 Ndis802_11Encryption2Enabled;
2183 /* RSN capability */
2184 pAd->StaCfg.RsnCapability =
2185 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.
2188 /* Set Mix cipher flag */
2189 pAd->StaCfg.bMixCipher =
2190 (pAd->StaCfg.PairCipher ==
2191 pAd->StaCfg.GroupCipher) ? FALSE : TRUE;
2192 /*if (pAd->StaCfg.bMixCipher == TRUE)
2194 // If mix cipher, re-build RSNIE
2195 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0);
2198 DBGPRINT(RT_DEBUG_TRACE,
2199 ("CNTL - iterate BSS %ld of %d\n", BssIdx,
2200 pAd->MlmeAux.SsidBssTab.BssNr));
2201 JoinParmFill(pAd, &JoinReq, BssIdx);
2202 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_JOIN_REQ,
2203 sizeof(MLME_JOIN_REQ_STRUCT), &JoinReq);
2204 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN;
2205 } else if (pAd->StaCfg.BssType == BSS_ADHOC) {
2206 DBGPRINT(RT_DEBUG_TRACE,
2207 ("CNTL - All BSS fail; start a new ADHOC (Ssid=%s)...\n",
2208 pAd->MlmeAux.Ssid));
2209 StartParmFill(pAd, &StartReq, (PCHAR) pAd->MlmeAux.Ssid,
2210 pAd->MlmeAux.SsidLen);
2211 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ,
2212 sizeof(MLME_START_REQ_STRUCT), &StartReq);
2213 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START;
2214 } else /* no more BSS */
2218 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
2219 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
2220 DBGPRINT(RT_DEBUG_TRACE,
2221 ("CNTL - All roaming failed, restore to channel %d, Total BSS[%02d]\n",
2222 pAd->CommonCfg.Channel, pAd->ScanTab.BssNr));
2225 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
2229 /* for re-association only */
2230 /* IRQL = DISPATCH_LEVEL */
2231 VOID IterateOnBssTab2(IN PRTMP_ADAPTER pAd)
2233 MLME_REASSOC_REQ_STRUCT ReassocReq;
2237 BssIdx = pAd->MlmeAux.RoamIdx;
2238 pBss = &pAd->MlmeAux.RoamTab.BssEntry[BssIdx];
2240 if (BssIdx < pAd->MlmeAux.RoamTab.BssNr) {
2241 DBGPRINT(RT_DEBUG_TRACE,
2242 ("CNTL - iterate BSS %ld of %d\n", BssIdx,
2243 pAd->MlmeAux.RoamTab.BssNr));
2245 AsicSwitchChannel(pAd, pBss->Channel, FALSE);
2246 AsicLockChannel(pAd, pBss->Channel);
2248 /* reassociate message has the same structure as associate message */
2249 AssocParmFill(pAd, &ReassocReq, pBss->Bssid,
2250 pBss->CapabilityInfo, ASSOC_TIMEOUT,
2251 pAd->StaCfg.DefaultListenCount);
2252 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_REASSOC_REQ,
2253 sizeof(MLME_REASSOC_REQ_STRUCT), &ReassocReq);
2255 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_REASSOC;
2256 } else /* no more BSS */
2260 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
2261 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
2262 DBGPRINT(RT_DEBUG_TRACE,
2263 ("CNTL - All roaming failed, restore to channel %d, Total BSS[%02d]\n",
2264 pAd->CommonCfg.Channel, pAd->ScanTab.BssNr));
2267 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
2272 ==========================================================================
2275 IRQL = DISPATCH_LEVEL
2277 ==========================================================================
2279 VOID JoinParmFill(IN PRTMP_ADAPTER pAd,
2280 IN OUT MLME_JOIN_REQ_STRUCT * JoinReq, IN ULONG BssIdx)
2282 JoinReq->BssIdx = BssIdx;
2286 ==========================================================================
2289 IRQL = DISPATCH_LEVEL
2291 ==========================================================================
2293 VOID ScanParmFill(IN PRTMP_ADAPTER pAd,
2294 IN OUT MLME_SCAN_REQ_STRUCT * ScanReq,
2296 IN UCHAR SsidLen, IN UCHAR BssType, IN UCHAR ScanType)
2298 NdisZeroMemory(ScanReq->Ssid, MAX_LEN_OF_SSID);
2299 ScanReq->SsidLen = SsidLen;
2300 NdisMoveMemory(ScanReq->Ssid, Ssid, SsidLen);
2301 ScanReq->BssType = BssType;
2302 ScanReq->ScanType = ScanType;
2306 ==========================================================================
2309 IRQL = DISPATCH_LEVEL
2311 ==========================================================================
2313 VOID StartParmFill(IN PRTMP_ADAPTER pAd,
2314 IN OUT MLME_START_REQ_STRUCT * StartReq,
2315 IN CHAR Ssid[], IN UCHAR SsidLen)
2317 ASSERT(SsidLen <= MAX_LEN_OF_SSID);
2318 NdisMoveMemory(StartReq->Ssid, Ssid, SsidLen);
2319 StartReq->SsidLen = SsidLen;
2323 ==========================================================================
2326 IRQL = DISPATCH_LEVEL
2328 ==========================================================================
2330 VOID AuthParmFill(IN PRTMP_ADAPTER pAd,
2331 IN OUT MLME_AUTH_REQ_STRUCT * AuthReq,
2332 IN PUCHAR pAddr, IN USHORT Alg)
2334 COPY_MAC_ADDR(AuthReq->Addr, pAddr);
2336 AuthReq->Timeout = AUTH_TIMEOUT;
2340 ==========================================================================
2343 IRQL = DISPATCH_LEVEL
2345 ==========================================================================
2348 VOID ComposePsPoll(IN PRTMP_ADAPTER pAd)
2350 NdisZeroMemory(&pAd->PsPollFrame, sizeof(PSPOLL_FRAME));
2351 pAd->PsPollFrame.FC.Type = BTYPE_CNTL;
2352 pAd->PsPollFrame.FC.SubType = SUBTYPE_PS_POLL;
2353 pAd->PsPollFrame.Aid = pAd->StaActive.Aid | 0xC000;
2354 COPY_MAC_ADDR(pAd->PsPollFrame.Bssid, pAd->CommonCfg.Bssid);
2355 COPY_MAC_ADDR(pAd->PsPollFrame.Ta, pAd->CurrentAddress);
2358 /* IRQL = DISPATCH_LEVEL */
2359 VOID ComposeNullFrame(IN PRTMP_ADAPTER pAd)
2361 NdisZeroMemory(&pAd->NullFrame, sizeof(HEADER_802_11));
2362 pAd->NullFrame.FC.Type = BTYPE_DATA;
2363 pAd->NullFrame.FC.SubType = SUBTYPE_NULL_FUNC;
2364 pAd->NullFrame.FC.ToDs = 1;
2365 COPY_MAC_ADDR(pAd->NullFrame.Addr1, pAd->CommonCfg.Bssid);
2366 COPY_MAC_ADDR(pAd->NullFrame.Addr2, pAd->CurrentAddress);
2367 COPY_MAC_ADDR(pAd->NullFrame.Addr3, pAd->CommonCfg.Bssid);
2369 #endif /* RTMP_MAC_PCI // */
2371 VOID MlmeCntlConfirm(IN PRTMP_ADAPTER pAd, IN ULONG MsgType, IN USHORT Msg)
2373 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MsgType, sizeof(USHORT),
2377 VOID ComposePsPoll(IN PRTMP_ADAPTER pAd)
2379 PTXINFO_STRUC pTxInfo;
2382 DBGPRINT(RT_DEBUG_TRACE, ("ComposePsPoll\n"));
2383 NdisZeroMemory(&pAd->PsPollFrame, sizeof(PSPOLL_FRAME));
2385 pAd->PsPollFrame.FC.PwrMgmt = 0;
2386 pAd->PsPollFrame.FC.Type = BTYPE_CNTL;
2387 pAd->PsPollFrame.FC.SubType = SUBTYPE_PS_POLL;
2388 pAd->PsPollFrame.Aid = pAd->StaActive.Aid | 0xC000;
2389 COPY_MAC_ADDR(pAd->PsPollFrame.Bssid, pAd->CommonCfg.Bssid);
2390 COPY_MAC_ADDR(pAd->PsPollFrame.Ta, pAd->CurrentAddress);
2392 RTMPZeroMemory(&pAd->PsPollContext.TransferBuffer->field.
2393 WirelessPacket[0], 100);
2395 (PTXINFO_STRUC) & pAd->PsPollContext.TransferBuffer->field.
2397 RTMPWriteTxInfo(pAd, pTxInfo,
2398 (USHORT) (sizeof(PSPOLL_FRAME) + TXWI_SIZE), TRUE,
2399 EpToQueue[MGMTPIPEIDX], FALSE, FALSE);
2401 (PTXWI_STRUC) & pAd->PsPollContext.TransferBuffer->field.
2402 WirelessPacket[TXINFO_SIZE];
2403 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0,
2404 BSSID_WCID, (sizeof(PSPOLL_FRAME)), 0, 0,
2405 (UCHAR) pAd->CommonCfg.MlmeTransmit.field.MCS,
2406 IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit);
2407 RTMPMoveMemory(&pAd->PsPollContext.TransferBuffer->field.
2408 WirelessPacket[TXWI_SIZE + TXINFO_SIZE],
2409 &pAd->PsPollFrame, sizeof(PSPOLL_FRAME));
2410 /* Append 4 extra zero bytes. */
2411 pAd->PsPollContext.BulkOutSize =
2412 TXINFO_SIZE + TXWI_SIZE + sizeof(PSPOLL_FRAME) + 4;
2415 /* IRQL = DISPATCH_LEVEL */
2416 VOID ComposeNullFrame(IN PRTMP_ADAPTER pAd)
2418 PTXINFO_STRUC pTxInfo;
2421 NdisZeroMemory(&pAd->NullFrame, sizeof(HEADER_802_11));
2422 pAd->NullFrame.FC.Type = BTYPE_DATA;
2423 pAd->NullFrame.FC.SubType = SUBTYPE_NULL_FUNC;
2424 pAd->NullFrame.FC.ToDs = 1;
2425 COPY_MAC_ADDR(pAd->NullFrame.Addr1, pAd->CommonCfg.Bssid);
2426 COPY_MAC_ADDR(pAd->NullFrame.Addr2, pAd->CurrentAddress);
2427 COPY_MAC_ADDR(pAd->NullFrame.Addr3, pAd->CommonCfg.Bssid);
2428 RTMPZeroMemory(&pAd->NullContext.TransferBuffer->field.
2429 WirelessPacket[0], 100);
2431 (PTXINFO_STRUC) & pAd->NullContext.TransferBuffer->field.
2433 RTMPWriteTxInfo(pAd, pTxInfo,
2434 (USHORT) (sizeof(HEADER_802_11) + TXWI_SIZE), TRUE,
2435 EpToQueue[MGMTPIPEIDX], FALSE, FALSE);
2437 (PTXWI_STRUC) & pAd->NullContext.TransferBuffer->field.
2438 WirelessPacket[TXINFO_SIZE];
2439 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0,
2440 BSSID_WCID, (sizeof(HEADER_802_11)), 0, 0,
2441 (UCHAR) pAd->CommonCfg.MlmeTransmit.field.MCS,
2442 IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit);
2443 RTMPMoveMemory(&pAd->NullContext.TransferBuffer->field.
2444 WirelessPacket[TXWI_SIZE + TXINFO_SIZE], &pAd->NullFrame,
2445 sizeof(HEADER_802_11));
2446 pAd->NullContext.BulkOutSize =
2447 TXINFO_SIZE + TXWI_SIZE + sizeof(pAd->NullFrame) + 4;
2449 #endif /* RTMP_MAC_USB // */
2452 ==========================================================================
2454 Pre-build a BEACON frame in the shared memory
2456 IRQL = PASSIVE_LEVEL
2457 IRQL = DISPATCH_LEVEL
2459 ==========================================================================
2461 ULONG MakeIbssBeacon(IN PRTMP_ADAPTER pAd)
2463 UCHAR DsLen = 1, IbssLen = 2;
2464 UCHAR LocalErpIe[3] = { IE_ERP, 1, 0x04 };
2465 HEADER_802_11 BcnHdr;
2466 USHORT CapabilityInfo;
2467 LARGE_INTEGER FakeTimestamp;
2469 PTXWI_STRUC pTxWI = &pAd->BeaconTxWI;
2470 UCHAR *pBeaconFrame = pAd->BeaconBuf;
2472 UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES];
2473 UCHAR SupRateLen = 0;
2474 UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES];
2475 UCHAR ExtRateLen = 0;
2476 UCHAR RSNIe = IE_WPA;
2478 if ((pAd->CommonCfg.PhyMode == PHY_11B)
2479 && (pAd->CommonCfg.Channel <= 14)) {
2480 SupRate[0] = 0x82; /* 1 mbps */
2481 SupRate[1] = 0x84; /* 2 mbps */
2482 SupRate[2] = 0x8b; /* 5.5 mbps */
2483 SupRate[3] = 0x96; /* 11 mbps */
2486 } else if (pAd->CommonCfg.Channel > 14) {
2487 SupRate[0] = 0x8C; /* 6 mbps, in units of 0.5 Mbps, basic rate */
2488 SupRate[1] = 0x12; /* 9 mbps, in units of 0.5 Mbps */
2489 SupRate[2] = 0x98; /* 12 mbps, in units of 0.5 Mbps, basic rate */
2490 SupRate[3] = 0x24; /* 18 mbps, in units of 0.5 Mbps */
2491 SupRate[4] = 0xb0; /* 24 mbps, in units of 0.5 Mbps, basic rate */
2492 SupRate[5] = 0x48; /* 36 mbps, in units of 0.5 Mbps */
2493 SupRate[6] = 0x60; /* 48 mbps, in units of 0.5 Mbps */
2494 SupRate[7] = 0x6c; /* 54 mbps, in units of 0.5 Mbps */
2499 /* Also Update MlmeRate & RtsRate for G only & A only */
2501 pAd->CommonCfg.MlmeRate = RATE_6;
2502 pAd->CommonCfg.RtsRate = RATE_6;
2503 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
2504 pAd->CommonCfg.MlmeTransmit.field.MCS =
2505 OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
2506 pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE =
2508 pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS =
2509 OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
2511 SupRate[0] = 0x82; /* 1 mbps */
2512 SupRate[1] = 0x84; /* 2 mbps */
2513 SupRate[2] = 0x8b; /* 5.5 mbps */
2514 SupRate[3] = 0x96; /* 11 mbps */
2517 ExtRate[0] = 0x0C; /* 6 mbps, in units of 0.5 Mbps, */
2518 ExtRate[1] = 0x12; /* 9 mbps, in units of 0.5 Mbps */
2519 ExtRate[2] = 0x18; /* 12 mbps, in units of 0.5 Mbps, */
2520 ExtRate[3] = 0x24; /* 18 mbps, in units of 0.5 Mbps */
2521 ExtRate[4] = 0x30; /* 24 mbps, in units of 0.5 Mbps, */
2522 ExtRate[5] = 0x48; /* 36 mbps, in units of 0.5 Mbps */
2523 ExtRate[6] = 0x60; /* 48 mbps, in units of 0.5 Mbps */
2524 ExtRate[7] = 0x6c; /* 54 mbps, in units of 0.5 Mbps */
2528 pAd->StaActive.SupRateLen = SupRateLen;
2529 NdisMoveMemory(pAd->StaActive.SupRate, SupRate, SupRateLen);
2530 pAd->StaActive.ExtRateLen = ExtRateLen;
2531 NdisMoveMemory(pAd->StaActive.ExtRate, ExtRate, ExtRateLen);
2533 /* compose IBSS beacon frame */
2534 MgtMacHeaderInit(pAd, &BcnHdr, SUBTYPE_BEACON, 0, BROADCAST_ADDR,
2535 pAd->CommonCfg.Bssid);
2536 Privacy = (pAd->StaCfg.WepStatus == Ndis802_11Encryption1Enabled)
2537 || (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled)
2538 || (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled);
2540 CAP_GENERATE(0, 1, Privacy,
2541 (pAd->CommonCfg.TxPreamble == Rt802_11PreambleShort),
2544 MakeOutgoingFrame(pBeaconFrame, &FrameLen,
2545 sizeof(HEADER_802_11), &BcnHdr,
2546 TIMESTAMP_LEN, &FakeTimestamp,
2547 2, &pAd->CommonCfg.BeaconPeriod,
2550 1, &pAd->CommonCfg.SsidLen,
2551 pAd->CommonCfg.SsidLen, pAd->CommonCfg.Ssid,
2554 SupRateLen, SupRate,
2557 1, &pAd->CommonCfg.Channel,
2559 1, &IbssLen, 2, &pAd->StaActive.AtimWin, END_OF_ARGS);
2561 /* add ERP_IE and EXT_RAE IE of in 802.11g */
2565 MakeOutgoingFrame(pBeaconFrame + FrameLen, &tmp,
2569 ExtRateLen, ExtRate, END_OF_ARGS);
2572 /* If adhoc secruity is set for WPA-None, append the cipher suite IE */
2573 if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) {
2575 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus,
2578 MakeOutgoingFrame(pBeaconFrame + FrameLen, &tmp,
2580 1, &pAd->StaCfg.RSNIE_Len,
2581 pAd->StaCfg.RSNIE_Len, pAd->StaCfg.RSN_IE,
2586 if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) {
2588 UCHAR HtLen, HtLen1;
2590 /* add HT Capability IE */
2591 HtLen = sizeof(pAd->CommonCfg.HtCapability);
2592 HtLen1 = sizeof(pAd->CommonCfg.AddHTInfo);
2594 MakeOutgoingFrame(pBeaconFrame + FrameLen, &TmpLen,
2597 HtLen, &pAd->CommonCfg.HtCapability,
2600 HtLen1, &pAd->CommonCfg.AddHTInfo,
2605 /*beacon use reserved WCID 0xff */
2606 if (pAd->CommonCfg.Channel > 14) {
2607 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE,
2608 TRUE, 0, 0xff, FrameLen, PID_MGMT, PID_BEACON,
2609 RATE_1, IFS_HTTXOP, FALSE,
2610 &pAd->CommonCfg.MlmeTransmit);
2612 /* Set to use 1Mbps for Adhoc beacon. */
2613 HTTRANSMIT_SETTING Transmit;
2615 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE,
2616 TRUE, 0, 0xff, FrameLen, PID_MGMT, PID_BEACON,
2617 RATE_1, IFS_HTTXOP, FALSE, &Transmit);
2620 DBGPRINT(RT_DEBUG_TRACE,
2621 ("MakeIbssBeacon (len=%ld), SupRateLen=%d, ExtRateLen=%d, Channel=%d, PhyMode=%d\n",
2622 FrameLen, SupRateLen, ExtRateLen, pAd->CommonCfg.Channel,
2623 pAd->CommonCfg.PhyMode));