2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_2/mgmt/saa_fsm.c#1 $
6 \brief This file defines the FSM for SAA MODULE.
8 This file defines the FSM for SAA MODULE.
11 /*******************************************************************************
12 * Copyright (c) 2009 MediaTek Inc.
14 * All rights reserved. Copying, compilation, modification, distribution
15 * or any other use whatsoever of this material is strictly prohibited
16 * except in accordance with a Software License Agreement with
18 ********************************************************************************
21 /*******************************************************************************
24 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
25 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
26 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
27 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
28 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
29 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
30 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
31 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
32 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
33 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
34 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
35 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
36 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
38 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
39 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
40 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
41 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
42 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
44 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
45 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
46 * OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
47 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
48 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
50 ********************************************************************************
57 * [ALPS00096191] [MT6620 Wi-Fi][Driver][Firmware] Porting to ALPS4.0_DEV branch
58 * sync to up-to-date changes including:
63 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
64 * Adjust code for DBG and CONFIG_XLOG.
67 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
68 * modify the xlog related code.
71 * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT for REASSOCIATED cases as an explicit trigger for Android framework
72 * 1. for DEAUTH/DISASSOC cases, indicate for DISCONNECTION immediately.
73 * 2. (Android only) when reassociation-and-non-roaming cases happened, indicate an extra DISCONNECT indication to Android Wi-Fi framework
76 * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
77 * Add XLOG related code and define.
79 * 10 19 2011 yuche.tsai
80 * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
82 * Davinci Maintrunk Label: MT6620_WIFI_DRIVER_FW_TRUNK_MT6620E5_111019_0926.
85 * [WCXRP00000720] [MT6620 Wi-Fi][Driver] Do not do any further operation in case STA-REC has been invalidated before SAA-FSM starts to roll
86 * check for valid STA-REC before SAA-FSM starts to roll.
89 * [WCXRP00000674] [MT6620 Wi-Fi][Driver] Refine AAA authSendAuthFrame
90 * Add network type parameter to authSendAuthFrame.
92 * 04 15 2011 chinghwa.yu
93 * [WCXRP00000065] Update BoW design and settings
94 * Add BOW short range mode.
97 * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
101 * [WCXRP00000577] [MT6620 Wi-Fi][Driver][FW] Create V2.0 branch for firmware and driver
102 * create V2.0 driver release based on label "MT6620_WIFI_DRIVER_V2_0_110318_1600" from main trunk
104 * 02 10 2011 yuche.tsai
105 * [WCXRP00000431] [Volunteer Patch][MT6620][Driver] Add MLME support for deauthentication under AP(Hot-Spot) mode.
106 * Add RX deauthentication & disassociation process under Hot-Spot mode.
108 * 01 26 2011 yuche.tsai
109 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
112 * 01 25 2011 yuche.tsai
113 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
114 * Fix compile error of after Station Type Macro modification.
116 * 01 25 2011 yuche.tsai
117 * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
118 * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
121 * [WCXRP00000210] [MT6620 Wi-Fi][Driver][FW] Set RCPI value in STA_REC for initial TX rate selection of auto-rate algorithm
122 * update ucRcpi of STA_RECORD_T for AIS when
123 * 1) Beacons for IBSS merge is received
124 * 2) Associate Response for a connecting peer is received
127 * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete and might leads to BSOD when entering RF test with AIS associated
128 * 1. remove redundant variables in STA_REC structure
129 * 2. add STA-REC uninitialization routine for clearing pending events
131 * 09 03 2010 kevin.huang
133 * Refine #include sequence and solve recursive/nested #include issue
137 * eliminate klockwork errors
139 * 08 24 2010 chinghwa.yu
141 * Update for MID_SCN_BOW_SCAN_DONE mboxDummy.
142 * Update saa_fsm for BOW.
146 * Replace CFG_SUPPORT_BOW by CFG_ENABLE_BT_OVER_WIFI.
147 * There is no CFG_SUPPORT_BOW in driver domain source.
149 * 08 02 2010 yuche.tsai
151 * Add support for P2P join event start.
155 * SAA will take a record for tracking request sequence number.
159 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
162 * [WPD00003833][MT6620 and MT5931] Driver migration
163 * AIS-FSM integration with CNM channel request messages
166 * [WPD00003833][MT6620 and MT5931] Driver migration
167 * sync. with main branch for reseting to state 1 when associating with another AP
170 * [WPD00003833][MT6620 and MT5931] Driver migration
171 * refine TX-DONE callback.
174 * [WPD00003840][MT6620 5931] Security migration
175 * remove duplicate variable for migration.
177 * 06 18 2010 cm.chang
178 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
179 * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf
182 * [WPD00003840][MT6620 5931] Security migration
183 * migration the security related function from firmware.
185 * 06 17 2010 yuche.tsai
186 * [WPD00003839][MT6620 5931][P2P] Feature migration
187 * Fix compile error when enable WiFi Direct function.
190 * [WPD00003833][MT6620 and MT5931] Driver migration
191 * saa_fsm.c is migrated.
193 * 05 12 2010 kevin.huang
194 * [BORA00000794][WIFISYS][New Feature]Power Management Support
195 * Add Power Management - Legacy PS-POLL support.
197 * 04 24 2010 cm.chang
198 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
199 * g_aprBssInfo[] depends on CFG_SUPPORT_P2P and CFG_SUPPORT_BOW
201 * 04 19 2010 kevin.huang
202 * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
204 * * * Add Connection Policy - Any and Rx Burst Deauth Support for WHQL
206 * 03 10 2010 kevin.huang
207 * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
208 * Add Channel Manager for arbitration of JOIN and SCAN Req
210 * 02 26 2010 kevin.huang
211 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
212 * Add support of Driver STA_RECORD_T activation
214 * 02 04 2010 kevin.huang
215 * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
216 * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
219 * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
220 * add and fixed some security function.
222 * 01 12 2010 kevin.huang
223 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
224 * Fix compile warning due to declared but not used
226 * 01 11 2010 kevin.huang
227 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
228 * Add Deauth and Disassoc Handler
230 * 01 08 2010 kevin.huang
231 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
234 * 12 18 2009 cm.chang
235 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
238 * Dec 3 2009 mtk01461
239 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
242 * Dec 1 2009 mtk01088
243 * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
244 * rename the function
246 * Nov 24 2009 mtk01461
247 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
248 * Revise MGMT Handler with Retain Status
250 * Nov 23 2009 mtk01461
251 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
255 /*******************************************************************************
256 * C O M P I L E R F L A G S
257 ********************************************************************************
260 /*******************************************************************************
261 * E X T E R N A L R E F E R E N C E S
262 ********************************************************************************
266 /*******************************************************************************
268 ********************************************************************************
271 /*******************************************************************************
273 ********************************************************************************
276 /*******************************************************************************
277 * P U B L I C D A T A
278 ********************************************************************************
281 /*******************************************************************************
282 * P R I V A T E D A T A
283 ********************************************************************************
286 /*lint -save -e64 Type mismatch */
287 static PUINT_8 apucDebugAAState[AA_STATE_NUM] = {
288 (PUINT_8)DISP_STRING("AA_STATE_IDLE"),
289 (PUINT_8)DISP_STRING("SAA_STATE_SEND_AUTH1"),
290 (PUINT_8)DISP_STRING("SAA_STATE_WAIT_AUTH2"),
291 (PUINT_8)DISP_STRING("SAA_STATE_SEND_AUTH3"),
292 (PUINT_8)DISP_STRING("SAA_STATE_WAIT_AUTH4"),
293 (PUINT_8)DISP_STRING("SAA_STATE_SEND_ASSOC1"),
294 (PUINT_8)DISP_STRING("SAA_STATE_WAIT_ASSOC2"),
295 (PUINT_8)DISP_STRING("AAA_STATE_SEND_AUTH2"),
296 (PUINT_8)DISP_STRING("AAA_STATE_SEND_AUTH4"),
297 (PUINT_8)DISP_STRING("AAA_STATE_SEND_ASSOC2"),
298 (PUINT_8)DISP_STRING("AA_STATE_RESOURCE")
303 /*******************************************************************************
305 ********************************************************************************
308 /*******************************************************************************
309 * F U N C T I O N D E C L A R A T I O N S
310 ********************************************************************************
313 /*******************************************************************************
315 ********************************************************************************
317 /*----------------------------------------------------------------------------*/
319 * @brief The Core FSM engine of SAA Module.
321 * @param[in] prStaRec Pointer to the STA_RECORD_T
322 * @param[in] eNextState The value of Next State
323 * @param[in] prRetainedSwRfb Pointer to the retained SW_RFB_T for JOIN Success
327 /*----------------------------------------------------------------------------*/
330 IN P_ADAPTER_T prAdapter,
331 IN P_STA_RECORD_T prStaRec,
332 IN ENUM_AA_STATE_T eNextState,
333 IN P_SW_RFB_T prRetainedSwRfb
336 ENUM_AA_STATE_T ePreviousState;
337 BOOLEAN fgIsTransition;
348 DBGLOG(SAA, STATE, ("[%d] TRANSITION: [%d] -> [%d]\n",
350 prStaRec->eAuthAssocState,
353 DBGLOG(SAA, STATE, ("TRANSITION: [%s] -> [%s]\n",
354 apucDebugAAState[prStaRec->eAuthAssocState],
355 apucDebugAAState[eNextState]));
357 ePreviousState = prStaRec->eAuthAssocState;
359 /* NOTE(Kevin): This is the only place to change the eAuthAssocState(except initial) */
360 prStaRec->eAuthAssocState = eNextState;
363 fgIsTransition = (BOOLEAN)FALSE;
364 switch (prStaRec->eAuthAssocState) {
367 if (ePreviousState != prStaRec->eAuthAssocState) { /* Only trigger this event once */
369 if (prRetainedSwRfb) {
371 if (saaFsmSendEventJoinComplete(prAdapter,
374 prRetainedSwRfb) == WLAN_STATUS_SUCCESS) {
377 eNextState = AA_STATE_RESOURCE;
378 fgIsTransition = TRUE;
382 if (saaFsmSendEventJoinComplete(prAdapter,
385 NULL) == WLAN_STATUS_RESOURCES) {
386 eNextState = AA_STATE_RESOURCE;
387 fgIsTransition = TRUE;
393 /* Free allocated TCM memory */
394 if (prStaRec->prChallengeText) {
395 cnmMemFree(prAdapter, prStaRec->prChallengeText);
396 prStaRec->prChallengeText = (P_IE_CHALLENGE_TEXT_T)NULL;
401 case SAA_STATE_SEND_AUTH1:
403 /* Do tasks in INIT STATE */
404 if (prStaRec->ucTxAuthAssocRetryCount >=
405 prStaRec->ucTxAuthAssocRetryLimit) {
407 /* Record the Status Code of Authentication Request */
408 prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT;
410 eNextState = AA_STATE_IDLE;
411 fgIsTransition = TRUE;
414 prStaRec->ucTxAuthAssocRetryCount++;
416 /* Update Station Record - Class 1 Flag */
417 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
420 if (authSendAuthFrame(prAdapter,
422 AUTH_TRANSACTION_SEQ_1) != WLAN_STATUS_SUCCESS)
424 if (authSendAuthFrame(
427 prStaRec->ucNetTypeIndex,
429 AUTH_TRANSACTION_SEQ_1,
430 STATUS_CODE_RESERVED) != WLAN_STATUS_SUCCESS)
431 #endif /* CFG_SUPPORT_AAA */
434 cnmTimerInitTimer(prAdapter,
435 &prStaRec->rTxReqDoneOrRxRespTimer,
436 (PFN_MGMT_TIMEOUT_FUNC)saaFsmRunEventTxReqTimeOut,
439 cnmTimerStartTimer(prAdapter,
440 &prStaRec->rTxReqDoneOrRxRespTimer,
441 TU_TO_MSEC(TX_AUTHENTICATION_RETRY_TIMEOUT_TU));
447 case SAA_STATE_WAIT_AUTH2:
450 case SAA_STATE_SEND_AUTH3:
452 /* Do tasks in INIT STATE */
453 if (prStaRec->ucTxAuthAssocRetryCount >=
454 prStaRec->ucTxAuthAssocRetryLimit) {
456 /* Record the Status Code of Authentication Request */
457 prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT;
459 eNextState = AA_STATE_IDLE;
460 fgIsTransition = TRUE;
463 prStaRec->ucTxAuthAssocRetryCount++;
466 if (authSendAuthFrame(prAdapter,
468 AUTH_TRANSACTION_SEQ_3) != WLAN_STATUS_SUCCESS)
470 if (authSendAuthFrame(prAdapter,
472 prStaRec->ucNetTypeIndex,
474 AUTH_TRANSACTION_SEQ_3,
475 STATUS_CODE_RESERVED) != WLAN_STATUS_SUCCESS)
476 #endif /* CFG_SUPPORT_AAA */
479 cnmTimerInitTimer(prAdapter,
480 &prStaRec->rTxReqDoneOrRxRespTimer,
481 (PFN_MGMT_TIMEOUT_FUNC)saaFsmRunEventTxReqTimeOut,
484 cnmTimerStartTimer(prAdapter,
485 &prStaRec->rTxReqDoneOrRxRespTimer,
486 TU_TO_MSEC(TX_AUTHENTICATION_RETRY_TIMEOUT_TU));
492 case SAA_STATE_WAIT_AUTH4:
495 case SAA_STATE_SEND_ASSOC1:
496 /* Do tasks in INIT STATE */
497 if (prStaRec->ucTxAuthAssocRetryCount >=
498 prStaRec->ucTxAuthAssocRetryLimit) {
500 /* Record the Status Code of Authentication Request */
501 prStaRec->u2StatusCode = STATUS_CODE_ASSOC_TIMEOUT;
503 eNextState = AA_STATE_IDLE;
504 fgIsTransition = TRUE;
507 prStaRec->ucTxAuthAssocRetryCount++;
509 if (assocSendReAssocReqFrame(prAdapter, prStaRec) != WLAN_STATUS_SUCCESS) {
511 cnmTimerInitTimer(prAdapter,
512 &prStaRec->rTxReqDoneOrRxRespTimer,
513 (PFN_MGMT_TIMEOUT_FUNC)saaFsmRunEventTxReqTimeOut,
516 cnmTimerStartTimer(prAdapter,
517 &prStaRec->rTxReqDoneOrRxRespTimer,
518 TU_TO_MSEC(TX_ASSOCIATION_RETRY_TIMEOUT_TU));
524 case SAA_STATE_WAIT_ASSOC2:
527 case AA_STATE_RESOURCE:
528 /* TODO(Kevin) Can setup a timer and send message later */
532 DBGLOG(SAA, ERROR, ("Unknown AA STATE\n"));
538 while (fgIsTransition);
542 } /* end of saaFsmSteps() */
545 /*----------------------------------------------------------------------------*/
547 * @brief This function will send Event to AIS/BOW/P2P
549 * @param[in] rJoinStatus To indicate JOIN success or failure.
550 * @param[in] prStaRec Pointer to the STA_RECORD_T
551 * @param[in] prSwRfb Pointer to the SW_RFB_T
555 /*----------------------------------------------------------------------------*/
557 saaFsmSendEventJoinComplete (
558 IN P_ADAPTER_T prAdapter,
559 IN WLAN_STATUS rJoinStatus,
560 IN P_STA_RECORD_T prStaRec,
561 IN P_SW_RFB_T prSwRfb
564 P_BSS_INFO_T prBssInfo;
568 return WLAN_STATUS_INVALID_PACKET;
571 /* Store limitation about 40Mhz bandwidth capability during association */
572 if (prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM) {
573 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
575 if (rJoinStatus == WLAN_STATUS_SUCCESS) {
576 prBssInfo->fg40mBwAllowed = prBssInfo->fgAssoc40mBwAllowed;
578 prBssInfo->fgAssoc40mBwAllowed = FALSE;
581 if(prStaRec->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX) {
582 P_MSG_SAA_FSM_COMP_T prSaaFsmCompMsg;
584 prSaaFsmCompMsg = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SAA_FSM_COMP_T));
585 if (!prSaaFsmCompMsg) {
586 return WLAN_STATUS_RESOURCES;
589 prSaaFsmCompMsg->rMsgHdr.eMsgId = MID_SAA_AIS_JOIN_COMPLETE;
590 prSaaFsmCompMsg->ucSeqNum = prStaRec->ucAuthAssocReqSeqNum;
591 prSaaFsmCompMsg->rJoinStatus = rJoinStatus;
592 prSaaFsmCompMsg->prStaRec = prStaRec;
593 prSaaFsmCompMsg->prSwRfb = prSwRfb;
595 /* NOTE(Kevin): Set to UNBUF for immediately JOIN complete */
596 mboxSendMsg(prAdapter,
598 (P_MSG_HDR_T)prSaaFsmCompMsg,
599 MSG_SEND_METHOD_UNBUF);
601 return WLAN_STATUS_SUCCESS;
603 #if CFG_ENABLE_WIFI_DIRECT
604 else if ((prAdapter->fgIsP2PRegistered) &&
605 (IS_STA_IN_P2P(prStaRec))) {
606 P_MSG_SAA_FSM_COMP_T prSaaFsmCompMsg;
608 prSaaFsmCompMsg = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SAA_FSM_COMP_T));
609 if (!prSaaFsmCompMsg) {
610 return WLAN_STATUS_RESOURCES;
613 prSaaFsmCompMsg->rMsgHdr.eMsgId = MID_SAA_P2P_JOIN_COMPLETE;
614 prSaaFsmCompMsg->ucSeqNum = prStaRec->ucAuthAssocReqSeqNum;
615 prSaaFsmCompMsg->rJoinStatus = rJoinStatus;
616 prSaaFsmCompMsg->prStaRec = prStaRec;
617 prSaaFsmCompMsg->prSwRfb = prSwRfb;
619 /* NOTE(Kevin): Set to UNBUF for immediately JOIN complete */
620 mboxSendMsg(prAdapter,
622 (P_MSG_HDR_T)prSaaFsmCompMsg,
623 MSG_SEND_METHOD_UNBUF);
625 return WLAN_STATUS_SUCCESS;
628 #if CFG_ENABLE_BT_OVER_WIFI
629 else if(prStaRec->ucNetTypeIndex == NETWORK_TYPE_BOW_INDEX) {
632 P_MSG_SAA_FSM_COMP_T prSaaFsmCompMsg;
634 prSaaFsmCompMsg = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SAA_FSM_COMP_T));
635 if (!prSaaFsmCompMsg) {
636 return WLAN_STATUS_RESOURCES;
639 prSaaFsmCompMsg->rMsgHdr.eMsgId = MID_SAA_BOW_JOIN_COMPLETE;
640 prSaaFsmCompMsg->ucSeqNum = prStaRec->ucAuthAssocReqSeqNum;
641 prSaaFsmCompMsg->rJoinStatus = rJoinStatus;
642 prSaaFsmCompMsg->prStaRec = prStaRec;
643 prSaaFsmCompMsg->prSwRfb = prSwRfb;
645 /* NOTE(Kevin): Set to UNBUF for immediately JOIN complete */
646 mboxSendMsg(prAdapter,
648 (P_MSG_HDR_T)prSaaFsmCompMsg,
649 MSG_SEND_METHOD_UNBUF);
651 return WLAN_STATUS_SUCCESS;
656 return WLAN_STATUS_FAILURE;
659 } /* end of saaFsmSendEventJoinComplete() */
662 /*----------------------------------------------------------------------------*/
664 * @brief This function will handle the Start Event to SAA FSM.
666 * @param[in] prMsgHdr Message of Join Request for a particular STA.
670 /*----------------------------------------------------------------------------*/
672 saaFsmRunEventStart (
673 IN P_ADAPTER_T prAdapter,
674 IN P_MSG_HDR_T prMsgHdr
677 P_MSG_SAA_FSM_START_T prSaaFsmStartMsg;
678 P_STA_RECORD_T prStaRec;
679 P_BSS_INFO_T prBssInfo;
684 prSaaFsmStartMsg = (P_MSG_SAA_FSM_START_T)prMsgHdr;
685 prStaRec = prSaaFsmStartMsg->prStaRec;
687 if((!prStaRec) || (prStaRec->fgIsInUse == FALSE)) {
688 cnmMemFree(prAdapter, prMsgHdr);
694 DBGLOG(SAA, LOUD, ("EVENT-START: Trigger SAA FSM.\n"));
696 /* record sequence number of request message */
697 prStaRec->ucAuthAssocReqSeqNum = prSaaFsmStartMsg->ucSeqNum;
699 cnmMemFree(prAdapter, prMsgHdr);
701 //4 <1> Validation of SAA Start Event
702 if (!IS_AP_STA(prStaRec)) {
704 DBGLOG(SAA, ERROR, ("EVENT-START: STA Type - %d was not supported.\n", prStaRec->eStaType));
706 /* Ignore the return value because don't care the prSwRfb */
707 saaFsmSendEventJoinComplete(prAdapter, WLAN_STATUS_FAILURE, prStaRec, NULL);
712 //4 <2> The previous JOIN process is not completed ?
713 if (prStaRec->eAuthAssocState != AA_STATE_IDLE) {
714 DBGLOG(SAA, ERROR, ("EVENT-START: Reentry of SAA Module.\n"));
715 prStaRec->eAuthAssocState = AA_STATE_IDLE;
718 //4 <3> Reset Status Code and Time
719 /* Update Station Record - Status/Reason Code */
720 prStaRec->u2StatusCode = STATUS_CODE_SUCCESSFUL;
722 /* Update the record join time. */
723 GET_CURRENT_SYSTIME(&prStaRec->rLastJoinTime);
725 prStaRec->ucTxAuthAssocRetryCount = 0;
727 if (prStaRec->prChallengeText) {
728 cnmMemFree(prAdapter, prStaRec->prChallengeText);
729 prStaRec->prChallengeText = (P_IE_CHALLENGE_TEXT_T)NULL;
732 cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
734 #if CFG_PRIVACY_MIGRATION
735 //4 <4> Init the sec fsm
736 secFsmInit(prAdapter, prStaRec);
739 //4 <5> Reset the STA STATE
740 /* Update Station Record - Class 1 Flag */
741 /* NOTE(Kevin): Moved to AIS FSM for Reconnect issue -
742 * We won't deactivate the same STA_RECORD_T and then activate it again for the
743 * case of reconnection.
745 //cnmStaRecChangeState(prStaRec, STA_STATE_1);
747 //4 <6> Decide if this BSS 20/40M bandwidth is allowed
748 if (prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM) {
749 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
751 if ((prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11N)
752 && (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N)) {
753 prBssInfo->fgAssoc40mBwAllowed =
754 cnmBss40mBwPermitted(prAdapter, prBssInfo->ucNetTypeIndex);
757 prBssInfo->fgAssoc40mBwAllowed = FALSE;
759 DBGLOG(RLM, INFO, ("STA 40mAllowed=%d\n", prBssInfo->fgAssoc40mBwAllowed));
762 //4 <7> Trigger SAA FSM
763 saaFsmSteps(prAdapter, prStaRec, SAA_STATE_SEND_AUTH1, (P_SW_RFB_T)NULL);
766 } /* end of saaFsmRunEventStart() */
769 /*----------------------------------------------------------------------------*/
771 * @brief This function will handle TxDone(Auth1/Auth3/AssocReq) Event of SAA FSM.
773 * @param[in] prMsduInfo Pointer to the MSDU_INFO_T.
774 * @param[in] rTxDoneStatus Return TX status of the Auth1/Auth3/AssocReq frame.
776 * @retval WLAN_STATUS_SUCCESS
778 /*----------------------------------------------------------------------------*/
780 saaFsmRunEventTxDone (
781 IN P_ADAPTER_T prAdapter,
782 IN P_MSDU_INFO_T prMsduInfo,
783 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
787 P_STA_RECORD_T prStaRec;
788 ENUM_AA_STATE_T eNextState;
793 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
796 return WLAN_STATUS_INVALID_PACKET;
801 DBGLOG(SAA, LOUD, ("EVENT-TX DONE: Current Time = %ld\n", kalGetTimeTick()));
803 eNextState = prStaRec->eAuthAssocState;
805 switch (prStaRec->eAuthAssocState) {
806 case SAA_STATE_SEND_AUTH1:
808 /* Strictly check the outgoing frame is matched with current AA STATE */
809 if (authCheckTxAuthFrame(prAdapter,
811 AUTH_TRANSACTION_SEQ_1) != WLAN_STATUS_SUCCESS) {
815 if (rTxDoneStatus == TX_RESULT_SUCCESS) {
816 eNextState = SAA_STATE_WAIT_AUTH2;
818 cnmTimerStopTimer(prAdapter,
819 &prStaRec->rTxReqDoneOrRxRespTimer);
821 cnmTimerInitTimer(prAdapter,
822 &prStaRec->rTxReqDoneOrRxRespTimer,
823 (PFN_MGMT_TIMEOUT_FUNC)saaFsmRunEventRxRespTimeOut,
826 cnmTimerStartTimer(prAdapter,
827 &prStaRec->rTxReqDoneOrRxRespTimer,
828 TU_TO_MSEC(DOT11_AUTHENTICATION_RESPONSE_TIMEOUT_TU));
831 /* if TX was successful, change to next state.
832 * if TX was failed, do retry if possible.
834 saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T)NULL);
838 case SAA_STATE_SEND_AUTH3:
840 /* Strictly check the outgoing frame is matched with current JOIN STATE */
841 if (authCheckTxAuthFrame(prAdapter,
843 AUTH_TRANSACTION_SEQ_3) != WLAN_STATUS_SUCCESS) {
847 if (rTxDoneStatus == TX_RESULT_SUCCESS) {
848 eNextState = SAA_STATE_WAIT_AUTH4;
850 cnmTimerStopTimer(prAdapter,
851 &prStaRec->rTxReqDoneOrRxRespTimer);
853 cnmTimerInitTimer(prAdapter,
854 &prStaRec->rTxReqDoneOrRxRespTimer,
855 (PFN_MGMT_TIMEOUT_FUNC)saaFsmRunEventRxRespTimeOut,
858 cnmTimerStartTimer(prAdapter,
859 &prStaRec->rTxReqDoneOrRxRespTimer,
860 TU_TO_MSEC(DOT11_AUTHENTICATION_RESPONSE_TIMEOUT_TU));
863 /* if TX was successful, change to next state.
864 * if TX was failed, do retry if possible.
866 saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T)NULL);
870 case SAA_STATE_SEND_ASSOC1:
872 /* Strictly check the outgoing frame is matched with current SAA STATE */
873 if (assocCheckTxReAssocReqFrame(prAdapter, prMsduInfo) != WLAN_STATUS_SUCCESS) {
877 if (rTxDoneStatus == TX_RESULT_SUCCESS) {
878 eNextState = SAA_STATE_WAIT_ASSOC2;
880 cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
882 cnmTimerInitTimer(prAdapter,
883 &prStaRec->rTxReqDoneOrRxRespTimer,
884 (PFN_MGMT_TIMEOUT_FUNC)saaFsmRunEventRxRespTimeOut,
887 cnmTimerStartTimer(prAdapter,
888 &(prStaRec->rTxReqDoneOrRxRespTimer),
889 TU_TO_MSEC(DOT11_ASSOCIATION_RESPONSE_TIMEOUT_TU));
892 /* if TX was successful, change to next state.
893 * if TX was failed, do retry if possible.
895 saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T)NULL);
900 break; /* Ignore other cases */
904 return WLAN_STATUS_SUCCESS;
906 } /* end of saaFsmRunEventTxDone() */
909 /*----------------------------------------------------------------------------*/
911 * @brief This function will send Tx Request Timeout Event to SAA FSM.
913 * @param[in] prStaRec Pointer to the STA_RECORD_T
917 /*----------------------------------------------------------------------------*/
919 saaFsmRunEventTxReqTimeOut (
920 IN P_ADAPTER_T prAdapter,
921 IN P_STA_RECORD_T prStaRec
929 DBGLOG(SAA, LOUD, ("EVENT-TIMER: TX REQ TIMEOUT, Current Time = %ld\n", kalGetTimeTick()));
931 switch (prStaRec->eAuthAssocState) {
932 case SAA_STATE_SEND_AUTH1:
933 case SAA_STATE_SEND_AUTH3:
934 case SAA_STATE_SEND_ASSOC1:
935 saaFsmSteps(prAdapter, prStaRec, prStaRec->eAuthAssocState, (P_SW_RFB_T)NULL);
943 } /* end of saaFsmRunEventTxReqTimeOut() */
946 /*----------------------------------------------------------------------------*/
948 * @brief This function will send Rx Response Timeout Event to SAA FSM.
950 * @param[in] prStaRec Pointer to the STA_RECORD_T
954 /*----------------------------------------------------------------------------*/
956 saaFsmRunEventRxRespTimeOut (
957 IN P_ADAPTER_T prAdapter,
958 IN P_STA_RECORD_T prStaRec
961 ENUM_AA_STATE_T eNextState;
964 DBGLOG(SAA, LOUD, ("EVENT-TIMER: RX RESP TIMEOUT, Current Time = %ld\n", kalGetTimeTick()));
971 eNextState = prStaRec->eAuthAssocState;
973 switch (prStaRec->eAuthAssocState) {
974 case SAA_STATE_WAIT_AUTH2:
975 /* Record the Status Code of Authentication Request */
976 prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT;
978 /* Pull back to earlier state to do retry */
979 eNextState = SAA_STATE_SEND_AUTH1;
982 case SAA_STATE_WAIT_AUTH4:
983 /* Record the Status Code of Authentication Request */
984 prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT;
986 /* Pull back to earlier state to do retry */
987 eNextState = SAA_STATE_SEND_AUTH3;
990 case SAA_STATE_WAIT_ASSOC2:
991 /* Record the Status Code of Authentication Request */
992 prStaRec->u2StatusCode = STATUS_CODE_ASSOC_TIMEOUT;
994 /* Pull back to earlier state to do retry */
995 eNextState = SAA_STATE_SEND_ASSOC1;
999 break; /* Ignore other cases */
1003 if (eNextState != prStaRec->eAuthAssocState) {
1004 saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T)NULL);
1008 } /* end of saaFsmRunEventRxRespTimeOut() */
1011 /*----------------------------------------------------------------------------*/
1013 * @brief This function will process the Rx Auth Response Frame and then
1016 * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
1020 /*----------------------------------------------------------------------------*/
1022 saaFsmRunEventRxAuth (
1023 IN P_ADAPTER_T prAdapter,
1024 IN P_SW_RFB_T prSwRfb
1027 P_STA_RECORD_T prStaRec;
1028 UINT_16 u2StatusCode;
1029 ENUM_AA_STATE_T eNextState;
1033 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1035 /* We should have the corresponding Sta Record. */
1041 if (!IS_AP_STA(prStaRec)) {
1045 switch(prStaRec->eAuthAssocState) {
1046 case SAA_STATE_SEND_AUTH1:
1047 case SAA_STATE_WAIT_AUTH2:
1048 /* Check if the incoming frame is what we are waiting for */
1049 if (authCheckRxAuthFrameStatus(prAdapter,
1051 AUTH_TRANSACTION_SEQ_2,
1052 &u2StatusCode) == WLAN_STATUS_SUCCESS) {
1054 cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
1056 /* Record the Status Code of Authentication Request */
1057 prStaRec->u2StatusCode = u2StatusCode;
1059 if (u2StatusCode == STATUS_CODE_SUCCESSFUL) {
1061 authProcessRxAuth2_Auth4Frame(prAdapter, prSwRfb);
1063 if (prStaRec->ucAuthAlgNum ==
1064 (UINT_8)AUTH_ALGORITHM_NUM_SHARED_KEY) {
1066 eNextState = SAA_STATE_SEND_AUTH3;
1069 /* Update Station Record - Class 2 Flag */
1070 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
1072 eNextState = SAA_STATE_SEND_ASSOC1;
1076 DBGLOG(SAA, INFO, ("Auth Req was rejected by ["MACSTR"], Status Code = %d\n",
1077 MAC2STR(prStaRec->aucMacAddr), u2StatusCode));
1079 eNextState = AA_STATE_IDLE;
1082 /* Reset Send Auth/(Re)Assoc Frame Count */
1083 prStaRec->ucTxAuthAssocRetryCount = 0;
1085 saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T)NULL);
1089 case SAA_STATE_SEND_AUTH3:
1090 case SAA_STATE_WAIT_AUTH4:
1091 /* Check if the incoming frame is what we are waiting for */
1092 if (authCheckRxAuthFrameStatus(prAdapter,
1094 AUTH_TRANSACTION_SEQ_4,
1095 &u2StatusCode) == WLAN_STATUS_SUCCESS) {
1097 cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
1099 /* Record the Status Code of Authentication Request */
1100 prStaRec->u2StatusCode = u2StatusCode;
1102 if (u2StatusCode == STATUS_CODE_SUCCESSFUL) {
1104 authProcessRxAuth2_Auth4Frame(prAdapter, prSwRfb); /* Add for 802.11r handling */
1106 /* Update Station Record - Class 2 Flag */
1107 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
1109 eNextState = SAA_STATE_SEND_ASSOC1;
1112 DBGLOG(SAA, INFO, ("Auth Req was rejected by ["MACSTR"], Status Code = %d\n",
1113 MAC2STR(prStaRec->aucMacAddr), u2StatusCode));
1115 eNextState = AA_STATE_IDLE;
1118 /* Reset Send Auth/(Re)Assoc Frame Count */
1119 prStaRec->ucTxAuthAssocRetryCount = 0;
1121 saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T)NULL);
1126 break; /* Ignore other cases */
1130 } /* end of saaFsmRunEventRxAuth() */
1133 /*----------------------------------------------------------------------------*/
1135 * @brief This function will process the Rx (Re)Association Response Frame and then
1138 * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
1140 * @retval WLAN_STATUS_SUCCESS if the status code was not success
1141 * @retval WLAN_STATUS_BUFFER_RETAINED if the status code was success
1143 /*----------------------------------------------------------------------------*/
1145 saaFsmRunEventRxAssoc (
1146 IN P_ADAPTER_T prAdapter,
1147 IN P_SW_RFB_T prSwRfb
1150 P_STA_RECORD_T prStaRec;
1151 UINT_16 u2StatusCode;
1152 ENUM_AA_STATE_T eNextState;
1153 P_SW_RFB_T prRetainedSwRfb = (P_SW_RFB_T)NULL;
1154 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
1158 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1160 /* We should have the corresponding Sta Record. */
1166 if (!IS_AP_STA(prStaRec)) {
1170 switch (prStaRec->eAuthAssocState) {
1171 case SAA_STATE_SEND_ASSOC1:
1172 case SAA_STATE_WAIT_ASSOC2:
1173 /* TRUE if the incoming frame is what we are waiting for */
1174 if (assocCheckRxReAssocRspFrameStatus(prAdapter,
1176 &u2StatusCode) == WLAN_STATUS_SUCCESS) {
1178 cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
1181 /* Record the Status Code of Authentication Request */
1182 prStaRec->u2StatusCode = u2StatusCode;
1184 if (u2StatusCode == STATUS_CODE_SUCCESSFUL) {
1186 /* Update Station Record - Class 3 Flag */
1187 /* NOTE(Kevin): Moved to AIS FSM for roaming issue -
1188 * We should deactivate the STA_RECORD_T of previous AP before
1189 * activate new one in Driver.
1191 //cnmStaRecChangeState(prStaRec, STA_STATE_3);
1193 prStaRec->ucJoinFailureCount = 0; // Clear history.
1195 prRetainedSwRfb = prSwRfb;
1196 rStatus = WLAN_STATUS_PENDING;
1199 DBGLOG(SAA, INFO, ("Assoc Req was rejected by ["MACSTR"], Status Code = %d\n",
1200 MAC2STR(prStaRec->aucMacAddr), u2StatusCode));
1203 /* Reset Send Auth/(Re)Assoc Frame Count */
1204 prStaRec->ucTxAuthAssocRetryCount = 0;
1207 prStaRec->ucRCPI = prSwRfb->prHifRxHdr->ucRcpi;
1209 eNextState = AA_STATE_IDLE;
1211 saaFsmSteps(prAdapter, prStaRec, eNextState, prRetainedSwRfb);
1216 break; /* Ignore other cases */
1221 } /* end of saaFsmRunEventRxAssoc() */
1224 /*----------------------------------------------------------------------------*/
1226 * @brief This function will check the incoming Deauth Frame.
1228 * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
1230 * @retval WLAN_STATUS_SUCCESS Always not retain deauthentication frames
1232 /*----------------------------------------------------------------------------*/
1234 saaFsmRunEventRxDeauth (
1235 IN P_ADAPTER_T prAdapter,
1236 IN P_SW_RFB_T prSwRfb
1239 P_STA_RECORD_T prStaRec;
1241 P_WLAN_DEAUTH_FRAME_T prDeauthFrame;
1246 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1249 prDeauthFrame = (P_WLAN_DEAUTH_FRAME_T) prSwRfb->pvHeader;
1251 DBGLOG(SAA, INFO, ("Rx Deauth frame from BSSID=["MACSTR"].\n",
1252 MAC2STR(prDeauthFrame->aucBSSID)));
1257 /* We should have the corresponding Sta Record. */
1262 if (IS_STA_IN_AIS(prStaRec)) {
1263 P_AIS_BSS_INFO_T prAisBssInfo;
1266 if (!IS_AP_STA(prStaRec)) {
1270 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1272 if (prStaRec->ucStaState > STA_STATE_1) {
1274 /* Check if this is the AP we are associated or associating with */
1275 if (authProcessRxDeauthFrame(prSwRfb,
1276 prStaRec->aucMacAddr,
1277 &prStaRec->u2ReasonCode) == WLAN_STATUS_SUCCESS) {
1279 if (STA_STATE_3 == prStaRec->ucStaState) {
1280 P_MSG_AIS_ABORT_T prAisAbortMsg;
1282 /* NOTE(Kevin): Change state immediately to avoid starvation of
1283 * MSG buffer because of too many deauth frames before changing
1286 cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
1288 prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
1289 if (!prAisAbortMsg) {
1293 prAisAbortMsg->rMsgHdr.eMsgId = MID_SAA_AIS_FSM_ABORT;
1294 prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_DEAUTHENTICATED;
1295 prAisAbortMsg->fgDelayIndication = FALSE;
1297 mboxSendMsg(prAdapter,
1299 (P_MSG_HDR_T) prAisAbortMsg,
1300 MSG_SEND_METHOD_BUF);
1304 /* TODO(Kevin): Joining Abort */
1312 #if CFG_ENABLE_WIFI_DIRECT
1313 else if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1315 prAdapter->rP2pFuncLkr.prP2pFsmRunEventRxDeauthentication(prAdapter, prStaRec, prSwRfb);
1318 #if CFG_ENABLE_BT_OVER_WIFI
1319 else if (IS_STA_IN_BOW(prStaRec)) {
1320 bowRunEventRxDeAuth(prAdapter, prStaRec, prSwRfb);
1329 return WLAN_STATUS_SUCCESS;
1331 } /* end of saaFsmRunEventRxDeauth() */
1334 /*----------------------------------------------------------------------------*/
1336 * @brief This function will check the incoming Disassociation Frame.
1338 * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
1340 * @retval WLAN_STATUS_SUCCESS Always not retain disassociation frames
1342 /*----------------------------------------------------------------------------*/
1344 saaFsmRunEventRxDisassoc (
1345 IN P_ADAPTER_T prAdapter,
1346 IN P_SW_RFB_T prSwRfb
1349 P_STA_RECORD_T prStaRec;
1351 P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
1356 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1359 prDisassocFrame = (P_WLAN_DISASSOC_FRAME_T) prSwRfb->pvHeader;
1361 DBGLOG(SAA, INFO, ("Rx Disassoc frame from BSSID=["MACSTR"].\n",
1362 MAC2STR(prDisassocFrame->aucBSSID)));
1367 /* We should have the corresponding Sta Record. */
1372 if (IS_STA_IN_AIS(prStaRec)) {
1373 P_AIS_BSS_INFO_T prAisBssInfo;
1376 if (!IS_AP_STA(prStaRec)) {
1380 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
1382 if (prStaRec->ucStaState > STA_STATE_1) {
1384 /* Check if this is the AP we are associated or associating with */
1385 if (assocProcessRxDisassocFrame(prAdapter,
1387 prStaRec->aucMacAddr,
1388 &prStaRec->u2ReasonCode) == WLAN_STATUS_SUCCESS) {
1390 if (STA_STATE_3 == prStaRec->ucStaState) {
1391 P_MSG_AIS_ABORT_T prAisAbortMsg;
1393 prAisAbortMsg = (P_MSG_AIS_ABORT_T)cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_AIS_ABORT_T));
1394 if (!prAisAbortMsg) {
1398 prAisAbortMsg->rMsgHdr.eMsgId = MID_SAA_AIS_FSM_ABORT;
1399 prAisAbortMsg->ucReasonOfDisconnect = DISCONNECT_REASON_CODE_DISASSOCIATED;
1400 prAisAbortMsg->fgDelayIndication = FALSE;
1402 mboxSendMsg(prAdapter,
1404 (P_MSG_HDR_T) prAisAbortMsg,
1405 MSG_SEND_METHOD_BUF);
1409 /* TODO(Kevin): Joining Abort */
1417 #if CFG_ENABLE_WIFI_DIRECT
1418 else if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
1420 prAdapter->rP2pFuncLkr.prP2pFsmRunEventRxDisassociation(prAdapter, prStaRec, prSwRfb);
1423 #if CFG_ENABLE_BT_OVER_WIFI
1424 else if (IS_STA_IN_BOW(prStaRec)) {
1434 return WLAN_STATUS_SUCCESS;
1436 } /* end of saaFsmRunEventRxDisassoc() */
1439 /*----------------------------------------------------------------------------*/
1441 * @brief This function will handle the Abort Event to SAA FSM.
1443 * @param[in] prMsgHdr Message of Abort Request for a particular STA.
1447 /*----------------------------------------------------------------------------*/
1449 saaFsmRunEventAbort (
1450 IN P_ADAPTER_T prAdapter,
1451 IN P_MSG_HDR_T prMsgHdr
1454 P_MSG_SAA_FSM_ABORT_T prSaaFsmAbortMsg;
1455 P_STA_RECORD_T prStaRec;
1460 prSaaFsmAbortMsg = (P_MSG_SAA_FSM_ABORT_T)prMsgHdr;
1461 prStaRec = prSaaFsmAbortMsg->prStaRec;
1465 cnmMemFree(prAdapter, prMsgHdr);
1469 DBGLOG(SAA, LOUD, ("EVENT-ABORT: Stop SAA FSM.\n"));
1471 cnmMemFree(prAdapter, prMsgHdr);
1474 /* Reset Send Auth/(Re)Assoc Frame Count */
1475 prStaRec->ucTxAuthAssocRetryCount = 0;
1477 /* Cancel JOIN relative Timer */
1478 cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
1480 if (prStaRec->eAuthAssocState != AA_STATE_IDLE) {
1482 DBGLOG(SAA, LOUD, ("EVENT-ABORT: Previous Auth/Assoc State == %s.\n",
1483 apucDebugAAState[prStaRec->eAuthAssocState]));
1485 DBGLOG(SAA, LOUD, ("EVENT-ABORT: Previous Auth/Assoc State == %d.\n",
1486 prStaRec->eAuthAssocState));
1490 /* For the Auth/Assoc State to IDLE */
1491 prStaRec->eAuthAssocState = AA_STATE_IDLE;
1494 } /* end of saaFsmRunEventAbort() */
1497 /* TODO(Kevin): following code will be modified and move to AIS FSM */
1499 /*----------------------------------------------------------------------------*/
1501 * \brief This function will send Join Timeout Event to JOIN FSM.
1503 * \param[in] prAdapter Pointer to the Adapter structure.
1505 * \retval WLAN_STATUS_FAILURE Fail because of Join Timeout
1507 /*----------------------------------------------------------------------------*/
1509 joinFsmRunEventJoinTimeOut (
1510 IN P_ADAPTER_T prAdapter
1513 P_JOIN_INFO_T prJoinInfo;
1514 P_STA_RECORD_T prStaRec;
1516 DEBUGFUNC("joinFsmRunEventJoinTimeOut");
1520 prJoinInfo = &prAdapter->rJoinInfo;
1522 DBGLOG(JOIN, EVENT, ("JOIN EVENT: JOIN TIMEOUT\n"));
1524 /* Get a Station Record if possible, TA == BSSID for AP */
1525 prStaRec = staRecGetStaRecordByAddr(prAdapter,
1526 prJoinInfo->prBssDesc->aucBSSID);
1528 /* We have renew this Sta Record when in JOIN_STATE_INIT */
1531 /* Record the Status Code of Authentication Request */
1532 prStaRec->u2StatusCode = STATUS_CODE_JOIN_TIMEOUT;
1534 /* Increase Failure Count */
1535 prStaRec->ucJoinFailureCount++;
1537 /* Reset Send Auth/(Re)Assoc Frame Count */
1538 prJoinInfo->ucTxAuthAssocRetryCount = 0;
1540 /* Cancel other JOIN relative Timer */
1541 ARB_CANCEL_TIMER(prAdapter,
1542 prJoinInfo->rTxRequestTimer);
1544 ARB_CANCEL_TIMER(prAdapter,
1545 prJoinInfo->rRxResponseTimer);
1547 /* Restore original setting from current BSS_INFO_T */
1548 if (prAdapter->eConnectionState == MEDIA_STATE_CONNECTED) {
1549 joinAdoptParametersFromCurrentBss(prAdapter);
1552 /* Pull back to IDLE */
1553 joinFsmSteps(prAdapter, JOIN_STATE_IDLE);
1555 return WLAN_STATUS_FAILURE;
1557 } /* end of joinFsmRunEventJoinTimeOut() */
1559 /*----------------------------------------------------------------------------*/
1561 * \brief This function will adopt the parameters from Peer BSS.
1563 * \param[in] prAdapter Pointer to the Adapter structure.
1567 /*----------------------------------------------------------------------------*/
1569 joinAdoptParametersFromPeerBss (
1570 IN P_ADAPTER_T prAdapter
1573 P_JOIN_INFO_T prJoinInfo;
1574 P_BSS_DESC_T prBssDesc;
1576 DEBUGFUNC("joinAdoptParametersFromPeerBss");
1580 prJoinInfo = &prAdapter->rJoinInfo;
1581 prBssDesc = prJoinInfo->prBssDesc;
1583 //4 <1> Adopt Peer BSS' PHY TYPE
1584 prAdapter->eCurrentPhyType = prBssDesc->ePhyType;
1586 DBGLOG(JOIN, INFO, ("Target BSS[%s]'s PhyType = %s\n",
1587 prBssDesc->aucSSID, (prBssDesc->ePhyType == PHY_TYPE_ERP_INDEX) ? "ERP" : "HR_DSSS"));
1590 //4 <2> Adopt Peer BSS' Frequency(Band/Channel)
1591 DBGLOG(JOIN, INFO, ("Target BSS's Channel = %d, Band = %d\n",
1592 prBssDesc->ucChannelNum, prBssDesc->eBand));
1594 nicSwitchChannel(prAdapter,
1596 prBssDesc->ucChannelNum,
1599 prJoinInfo->fgIsParameterAdopted = TRUE;
1602 } /* end of joinAdoptParametersFromPeerBss() */
1605 /*----------------------------------------------------------------------------*/
1607 * \brief This function will adopt the parameters from current associated BSS.
1609 * \param[in] prAdapter Pointer to the Adapter structure.
1613 /*----------------------------------------------------------------------------*/
1615 joinAdoptParametersFromCurrentBss (
1616 IN P_ADAPTER_T prAdapter
1619 //P_JOIN_INFO_T prJoinInfo = &prAdapter->rJoinInfo;
1620 P_BSS_INFO_T prBssInfo;
1624 prBssInfo = &prAdapter->rBssInfo;
1626 //4 <1> Adopt current BSS' PHY TYPE
1627 prAdapter->eCurrentPhyType = prBssInfo->ePhyType;
1629 //4 <2> Adopt current BSS' Frequency(Band/Channel)
1630 DBGLOG(JOIN, INFO, ("Current BSS's Channel = %d, Band = %d\n",
1631 prBssInfo->ucChnl, prBssInfo->eBand));
1633 nicSwitchChannel(prAdapter,
1638 } /* end of joinAdoptParametersFromCurrentBss() */
1641 /*----------------------------------------------------------------------------*/
1643 * \brief This function will update all the SW variables and HW MCR registers after
1644 * the association with target BSS.
1646 * \param[in] prAdapter Pointer to the Adapter structure.
1650 /*----------------------------------------------------------------------------*/
1653 IN P_ADAPTER_T prAdapter
1656 P_JOIN_INFO_T prJoinInfo;
1657 P_BSS_DESC_T prBssDesc;
1658 P_PEER_BSS_INFO_T prPeerBssInfo;
1659 P_BSS_INFO_T prBssInfo;
1660 P_CONNECTION_SETTINGS_T prConnSettings;
1661 P_STA_RECORD_T prStaRec;
1662 P_TX_CTRL_T prTxCtrl;
1663 #if CFG_SUPPORT_802_11D
1664 P_IE_COUNTRY_T prIECountry;
1667 DEBUGFUNC("joinComplete");
1671 prJoinInfo = &prAdapter->rJoinInfo;
1672 prBssDesc = prJoinInfo->prBssDesc;
1673 prPeerBssInfo = &prAdapter->rPeerBssInfo;
1674 prBssInfo = &prAdapter->rBssInfo;
1675 prConnSettings = &prAdapter->rConnSettings;
1676 prTxCtrl = &prAdapter->rTxCtrl;
1678 //4 <1> Update Connecting & Connected Flag of BSS_DESC_T.
1679 /* Remove previous AP's Connection Flags if have */
1680 scanRemoveConnectionFlagOfBssDescByBssid(prAdapter, prBssInfo->aucBSSID);
1682 prBssDesc->fgIsConnected = TRUE; /* Mask as Connected */
1684 if (prBssDesc->fgIsHiddenSSID) {
1685 /* NOTE(Kevin): This is for the case of Passive Scan and the target BSS didn't
1686 * broadcast SSID on its Beacon Frame.
1688 COPY_SSID(prBssDesc->aucSSID,
1689 prBssDesc->ucSSIDLen,
1690 prAdapter->rConnSettings.aucSSID,
1691 prAdapter->rConnSettings.ucSSIDLen);
1693 if (prBssDesc->ucSSIDLen) {
1694 prBssDesc->fgIsHiddenSSID = FALSE;
1702 DBGLOG(JOIN, INFO, ("Hidden SSID! - Update SSID : %s\n", prBssDesc->aucSSID));
1706 //4 <2> Update BSS_INFO_T from BSS_DESC_T
1708 prBssInfo->ePhyType = prBssDesc->ePhyType;
1711 prBssInfo->eBSSType = BSS_TYPE_INFRASTRUCTURE;
1714 COPY_MAC_ADDR(prBssInfo->aucBSSID, prBssDesc->aucBSSID);
1716 DBGLOG(JOIN, INFO, ("JOIN to BSSID: ["MACSTR"]\n", MAC2STR(prBssDesc->aucBSSID)));
1720 COPY_SSID(prBssInfo->aucSSID,
1721 prBssInfo->ucSSIDLen,
1723 prBssDesc->ucSSIDLen);
1725 //4 <2.E> Channel / Band information.
1726 prBssInfo->eBand = prBssDesc->eBand;
1727 prBssInfo->ucChnl = prBssDesc->ucChannelNum;
1729 //4 <2.F> RSN/WPA information.
1730 secFsmRunEventStart(prAdapter);
1731 prBssInfo->u4RsnSelectedPairwiseCipher = prBssDesc->u4RsnSelectedPairwiseCipher;
1732 prBssInfo->u4RsnSelectedGroupCipher = prBssDesc->u4RsnSelectedGroupCipher;
1733 prBssInfo->u4RsnSelectedAKMSuite = prBssDesc->u4RsnSelectedAKMSuite;
1735 if (secRsnKeyHandshakeEnabled()) {
1736 prBssInfo->fgIsWPAorWPA2Enabled = TRUE;
1739 prBssInfo->fgIsWPAorWPA2Enabled = FALSE;
1742 //4 <2.G> Beacon interval.
1743 prBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
1745 //4 <2.H> DTIM period.
1746 prBssInfo->ucDtimPeriod = prBssDesc->ucDTIMPeriod;
1748 //4 <2.I> ERP Information
1749 if ((prBssInfo->ePhyType == PHY_TYPE_ERP_INDEX) && // Our BSS's PHY_TYPE is ERP now.
1750 (prBssDesc->fgIsERPPresent)) {
1752 prBssInfo->fgIsERPPresent = TRUE;
1753 prBssInfo->ucERP = prBssDesc->ucERP; /* Save the ERP for later check */
1755 else { /* Some AP, may send ProbeResp without ERP IE. Thus prBssDesc->fgIsERPPresent is FALSE. */
1756 prBssInfo->fgIsERPPresent = FALSE;
1757 prBssInfo->ucERP = 0;
1760 #if CFG_SUPPORT_802_11D
1761 //4 <2.J> Country inforamtion of the associated AP
1762 if (prConnSettings->fgMultiDomainCapabilityEnabled) {
1763 DOMAIN_INFO_ENTRY rDomainInfo;
1764 if (domainGetDomainInfoByScanResult(prAdapter, &rDomainInfo)) {
1765 if (prBssDesc->prIECountry) {
1766 prIECountry = prBssDesc->prIECountry;
1768 domainParseCountryInfoElem(prIECountry, &prBssInfo->rDomainInfo);
1770 /* use the domain get from the BSS info */
1771 prBssInfo->fgIsCountryInfoPresent = TRUE;
1772 nicSetupOpChnlList(prAdapter, prBssInfo->rDomainInfo.u2CountryCode, FALSE);
1774 /* use the domain get from the scan result */
1775 prBssInfo->fgIsCountryInfoPresent = TRUE;
1776 nicSetupOpChnlList(prAdapter, rDomainInfo.u2CountryCode, FALSE);
1782 //4 <2.K> Signal Power of the associated AP
1783 prBssInfo->rRcpi = prBssDesc->rRcpi;
1784 prBssInfo->rRssi = RCPI_TO_dBm(prBssInfo->rRcpi);
1785 GET_CURRENT_SYSTIME(&prBssInfo->rRssiLastUpdateTime);
1787 //4 <2.L> Capability Field of the associated AP
1788 prBssInfo->u2CapInfo = prBssDesc->u2CapInfo;
1790 DBGLOG(JOIN, INFO, ("prBssInfo-> fgIsERPPresent = %d, ucERP = %02x, rRcpi = %d, rRssi = %ld\n",
1791 prBssInfo->fgIsERPPresent, prBssInfo->ucERP, prBssInfo->rRcpi, prBssInfo->rRssi));
1794 //4 <3> Update BSS_INFO_T from PEER_BSS_INFO_T & NIC RATE FUNC
1795 //4 <3.A> Association ID
1796 prBssInfo->u2AssocId = prPeerBssInfo->u2AssocId;
1798 //4 <3.B> WMM Infomation
1799 if (prAdapter->fgIsEnableWMM &&
1800 (prPeerBssInfo->rWmmInfo.ucWmmFlag & WMM_FLAG_SUPPORT_WMM)) {
1802 prBssInfo->fgIsWmmAssoc = TRUE;
1803 prTxCtrl->rTxQForVoipAccess = TXQ_AC3;
1805 qosWmmInfoInit(&prBssInfo->rWmmInfo, (prBssInfo->ePhyType == PHY_TYPE_HR_DSSS_INDEX) ? TRUE : FALSE);
1807 if (prPeerBssInfo->rWmmInfo.ucWmmFlag & WMM_FLAG_AC_PARAM_PRESENT) {
1808 kalMemCopy(&prBssInfo->rWmmInfo,
1809 &prPeerBssInfo->rWmmInfo,
1810 sizeof(WMM_INFO_T));
1813 kalMemCopy(&prBssInfo->rWmmInfo,
1814 &prPeerBssInfo->rWmmInfo,
1815 sizeof(WMM_INFO_T) - sizeof(prPeerBssInfo->rWmmInfo.arWmmAcParams));
1819 prBssInfo->fgIsWmmAssoc = FALSE;
1820 prTxCtrl->rTxQForVoipAccess = TXQ_AC1;
1822 kalMemZero(&prBssInfo->rWmmInfo, sizeof(WMM_INFO_T));
1826 //4 <3.C> Operational Rate Set & BSS Basic Rate Set
1827 prBssInfo->u2OperationalRateSet = prPeerBssInfo->u2OperationalRateSet;
1828 prBssInfo->u2BSSBasicRateSet = prPeerBssInfo->u2BSSBasicRateSet;
1831 //4 <3.D> Short Preamble
1832 if (prBssInfo->fgIsERPPresent) {
1834 /* NOTE(Kevin 2007/12/24): Truth Table.
1835 * Short Preamble Bit in
1836 * <AssocReq> <AssocResp w/i ERP> <BARKER(Long)> Final Driver Setting(Short)
1837 * TRUE FALSE FALSE FALSE(shouldn't have such case, use the AssocResp)
1838 * TRUE FALSE TRUE FALSE
1839 * FALSE FALSE FALSE FALSE(shouldn't have such case, use the AssocResp)
1840 * FALSE FALSE TRUE FALSE
1841 * TRUE TRUE FALSE TRUE(follow ERP)
1842 * TRUE TRUE TRUE FALSE(follow ERP)
1843 * FALSE TRUE FALSE FALSE(shouldn't have such case, and we should set to FALSE)
1844 * FALSE TRUE TRUE FALSE(we should set to FALSE)
1846 if ((prPeerBssInfo->fgIsShortPreambleAllowed) &&
1847 ((prConnSettings->ePreambleType == PREAMBLE_TYPE_SHORT) || /* Short Preamble Option Enable is TRUE */
1848 ((prConnSettings->ePreambleType == PREAMBLE_TYPE_AUTO) &&
1849 (prBssDesc->u2CapInfo & CAP_INFO_SHORT_PREAMBLE)))) {
1851 prBssInfo->fgIsShortPreambleAllowed = TRUE;
1853 if (prBssInfo->ucERP & ERP_INFO_BARKER_PREAMBLE_MODE) {
1854 prBssInfo->fgUseShortPreamble = FALSE;
1857 prBssInfo->fgUseShortPreamble = TRUE;
1861 prBssInfo->fgIsShortPreambleAllowed = FALSE;
1862 prBssInfo->fgUseShortPreamble = FALSE;
1866 /* NOTE(Kevin 2007/12/24): Truth Table.
1867 * Short Preamble Bit in
1868 * <AssocReq> <AssocResp w/o ERP> Final Driver Setting(Short)
1872 * FALSE TRUE(status success) TRUE
1873 * --> Honor the result of prPeerBssInfo.
1876 prBssInfo->fgIsShortPreambleAllowed = prBssInfo->fgUseShortPreamble =
1877 prPeerBssInfo->fgIsShortPreambleAllowed;
1880 DBGLOG(JOIN, INFO, ("prBssInfo->fgIsShortPreambleAllowed = %d, prBssInfo->fgUseShortPreamble = %d\n",
1881 prBssInfo->fgIsShortPreambleAllowed, prBssInfo->fgUseShortPreamble));
1884 //4 <3.E> Short Slot Time
1885 prBssInfo->fgUseShortSlotTime =
1886 prPeerBssInfo->fgUseShortSlotTime; /* AP support Short Slot Time */
1888 DBGLOG(JOIN, INFO, ("prBssInfo->fgUseShortSlotTime = %d\n",
1889 prBssInfo->fgUseShortSlotTime));
1891 nicSetSlotTime(prAdapter,
1892 prBssInfo->ePhyType,
1893 ((prConnSettings->fgIsShortSlotTimeOptionEnable &&
1894 prBssInfo->fgUseShortSlotTime) ? TRUE : FALSE));
1897 //4 <3.F> Update Tx Rate for Control Frame
1898 bssUpdateTxRateForControlFrame(prAdapter);
1901 //4 <3.G> Save the available Auth Types during Roaming (Design for Fast BSS Transition).
1902 //if (prAdapter->fgIsEnableRoaming) /* NOTE(Kevin): Always prepare info for roaming */
1905 if (prJoinInfo->ucCurrAuthAlgNum == AUTH_ALGORITHM_NUM_OPEN_SYSTEM) {
1906 prJoinInfo->ucRoamingAuthTypes |= AUTH_TYPE_OPEN_SYSTEM;
1908 else if (prJoinInfo->ucCurrAuthAlgNum == AUTH_ALGORITHM_NUM_SHARED_KEY) {
1909 prJoinInfo->ucRoamingAuthTypes |= AUTH_TYPE_SHARED_KEY;
1912 prBssInfo->ucRoamingAuthTypes = prJoinInfo->ucRoamingAuthTypes;
1915 /* Set the stable time of the associated BSS. We won't do roaming decision
1916 * during the stable time.
1918 SET_EXPIRATION_TIME(prBssInfo->rRoamingStableExpirationTime,
1919 SEC_TO_SYSTIME(ROAMING_STABLE_TIMEOUT_SEC));
1923 //4 <3.H> Update Parameter for TX Fragmentation Threshold
1925 txFragInfoUpdate(prAdapter);
1926 #endif /* CFG_TX_FRAGMENT */
1929 //4 <4> Update STA_RECORD_T
1930 /* Get a Station Record if possible */
1931 prStaRec = staRecGetStaRecordByAddr(prAdapter,
1932 prBssDesc->aucBSSID);
1935 UINT_16 u2OperationalRateSet, u2DesiredRateSet;
1937 //4 <4.A> Desired Rate Set
1938 u2OperationalRateSet = (rPhyAttributes[prBssInfo->ePhyType].u2SupportedRateSet &
1939 prBssInfo->u2OperationalRateSet);
1941 u2DesiredRateSet = (u2OperationalRateSet & prConnSettings->u2DesiredRateSet);
1942 if (u2DesiredRateSet) {
1943 prStaRec->u2DesiredRateSet = u2DesiredRateSet;
1946 /* For Error Handling - The Desired Rate Set is not covered in Operational Rate Set. */
1947 prStaRec->u2DesiredRateSet = u2OperationalRateSet;
1950 /* Try to set the best initial rate for this entry */
1951 if (!rateGetBestInitialRateIndex(prStaRec->u2DesiredRateSet,
1953 &prStaRec->ucCurrRate1Index)) {
1955 if (!rateGetLowestRateIndexFromRateSet(prStaRec->u2DesiredRateSet,
1956 &prStaRec->ucCurrRate1Index)) {
1961 DBGLOG(JOIN, INFO, ("prStaRec->ucCurrRate1Index = %d\n",
1962 prStaRec->ucCurrRate1Index));
1964 //4 <4.B> Preamble Mode
1965 prStaRec->fgIsShortPreambleOptionEnable =
1966 prBssInfo->fgUseShortPreamble;
1969 prStaRec->fgIsQoS = prBssInfo->fgIsWmmAssoc;
1979 //4 <5.A> Update BSSID & Operation Mode
1980 nicSetupBSS(prAdapter, prBssInfo);
1982 //4 <5.B> Update WLAN Table.
1983 if (nicSetHwBySta(prAdapter, prStaRec) == FALSE) {
1987 //4 <5.C> Update Desired Rate Set for BT.
1989 if (prConnSettings->fgIsEnableTxAutoFragmentForBT) {
1990 txRateSetInitForBT(prAdapter, prStaRec);
1992 #endif /* CFG_TX_FRAGMENT */
1994 //4 <5.D> TX AC Parameter and TX/RX Queue Control
1995 if (prBssInfo->fgIsWmmAssoc) {
1997 #if CFG_TX_AGGREGATE_HW_FIFO
1998 nicTxAggregateTXQ(prAdapter, FALSE);
1999 #endif /* CFG_TX_AGGREGATE_HW_FIFO */
2001 qosUpdateWMMParametersAndAssignAllowedACI(prAdapter, &prBssInfo->rWmmInfo);
2005 #if CFG_TX_AGGREGATE_HW_FIFO
2006 nicTxAggregateTXQ(prAdapter, TRUE);
2007 #endif /* CFG_TX_AGGREGATE_HW_FIFO */
2009 nicTxNonQoSAssignDefaultAdmittedTXQ(prAdapter);
2011 nicTxNonQoSUpdateTXQParameters(prAdapter,
2012 prBssInfo->ePhyType);
2015 #if CFG_TX_STOP_WRITE_TX_FIFO_UNTIL_JOIN
2017 prTxCtrl->fgBlockTxDuringJoin = FALSE;
2019 #if !CFG_TX_AGGREGATE_HW_FIFO /* TX FIFO AGGREGATE already do flush once */
2020 nicTxFlushStopQueues(prAdapter, (UINT_8)TXQ_DATA_MASK, (UINT_8)NULL);
2021 #endif /* CFG_TX_AGGREGATE_HW_FIFO */
2023 nicTxRetransmitOfSendWaitQue(prAdapter);
2025 if (prTxCtrl->fgIsPacketInOsSendQueue) {
2026 nicTxRetransmitOfOsSendQue(prAdapter);
2029 #if CFG_SDIO_TX_ENHANCE
2030 halTxLeftClusteredMpdu(prAdapter);
2031 #endif /* CFG_SDIO_TX_ENHANCE */
2034 #endif /* CFG_TX_STOP_WRITE_TX_FIFO_UNTIL_JOIN */
2037 //4 <6> Setup CONNECTION flag.
2038 prAdapter->eConnectionState = MEDIA_STATE_CONNECTED;
2039 prAdapter->eConnectionStateIndicated = MEDIA_STATE_CONNECTED;
2041 if (prJoinInfo->fgIsReAssoc) {
2042 prAdapter->fgBypassPortCtrlForRoaming = TRUE;
2045 prAdapter->fgBypassPortCtrlForRoaming = FALSE;
2048 kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
2049 WLAN_STATUS_MEDIA_CONNECT,
2054 } /* end of joinComplete() */