2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_2/mgmt/cnm.c#1 $
6 \brief Module of Concurrent Network Management
8 Module of Concurrent Network Management
11 /*******************************************************************************
12 * Copyright (c) 2010 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 ********************************************************************************
58 * Fix possible wrong message when P2P is unregistered
60 * 11 14 2011 yuche.tsai
61 * [WCXRP00001107] [Volunteer Patch][Driver] Large Network Type index assert in FW issue.
62 * Large Network Type index assert.
63 * Fix NULL prDev issue.
67 * Modify debug message for XLOG
71 * Add RLM and CNM debug message for XLOG
74 * [WCXRP00001077] [All Wi-Fi][Driver] Fix wrong preferred channel for AP and BOW
75 * Only check AIS channel for P2P and BOW
78 * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
81 * 10 19 2011 yuche.tsai
82 * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
84 * Davinci Maintrunk Label: MT6620_WIFI_DRIVER_FW_TRUNK_MT6620E5_111019_0926.
87 * [WCXRP00000937] [MT6620 Wi-Fi][Driver][FW] cnm.c line #848 assert when doing monkey test
88 * Print out net type index for ch request/abourt message
91 * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
92 * follow-ups for frequency-shifted WAPI AP support
95 * [WCXRP00000756] [MT6620 Wi-Fi][Driver] 1. AIS follow channel of BOW 2. Provide legal channel function
96 * Limit AIS channel same with BOW when BOW is active
99 * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
103 * [WCXRP00000577] [MT6620 Wi-Fi][Driver][FW] Create V2.0 branch for firmware and driver
104 * create V2.0 driver release based on label "MT6620_WIFI_DRIVER_V2_0_110318_1600" from main trunk
106 * 03 10 2011 cm.chang
107 * [WCXRP00000358] [MT6620 Wi-Fi][Driver] Provide concurrent information for each module
108 * Check if P2P network index is Tethering AP
110 * 03 10 2011 cm.chang
111 * [WCXRP00000358] [MT6620 Wi-Fi][Driver] Provide concurrent information for each module
112 * Add some functions to let AIS/Tethering or AIS/BOW be the same channel
114 * 02 17 2011 cm.chang
115 * [WCXRP00000358] [MT6620 Wi-Fi][Driver] Provide concurrent information for each module
116 * When P2P registried, invoke BOW deactivate function
118 * 01 12 2011 cm.chang
119 * [WCXRP00000358] [MT6620 Wi-Fi][Driver] Provide concurrent information for each module
120 * Provide function to decide if BSS can be activated or not
122 * 12 07 2010 cm.chang
123 * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
124 * 1. BSSINFO include RLM parameter
125 * 2. free all sta records when network is disconnected
127 * 12 07 2010 cm.chang
128 * [WCXRP00000238] MT6620 Wi-Fi][Driver][FW] Support regulation domain setting from NVRAM and supplicant
129 * 1. Country code is from NVRAM or supplicant
130 * 2. Change band definition in CMD/EVENT.
132 * 11 08 2010 cm.chang
133 * [WCXRP00000169] [MT6620 Wi-Fi][Driver][FW] Remove unused CNM recover message ID
134 * Remove CNM channel reover message ID
136 * 10 13 2010 cm.chang
137 * [WCXRP00000094] [MT6620 Wi-Fi][Driver] Connect to 2.4GHz AP, Driver crash.
138 * Add exception handle when cmd buffer is not available
140 * 08 24 2010 cm.chang
142 * Support RLM initail channel of Ad-hoc, P2P and BOW
146 * update for security supporting.
148 * 07 19 2010 cm.chang
150 * Set RLM parameters and enable CNM channel manager
154 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
156 * 07 08 2010 cm.chang
157 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
158 * Rename MID_MNY_CNM_CH_RELEASE to MID_MNY_CNM_CH_ABORT
160 * 07 01 2010 cm.chang
161 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
162 * Fix wrong message ID for channel grant to requester
164 * 07 01 2010 cm.chang
165 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
166 * Modify CNM message handler for new flow
168 * 06 07 2010 cm.chang
169 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
170 * Set 20/40M bandwidth of AP HT OP before association process
172 * 05 31 2010 yarco.yang
173 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
174 * Add RX TSF Log Feature and ADDBA Rsp with DECLINE handling
176 * 05 21 2010 yarco.yang
177 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
178 * Support TCP/UDP/IP Checksum offload feature
180 * 05 12 2010 kevin.huang
181 * [BORA00000794][WIFISYS][New Feature]Power Management Support
182 * Add Power Management - Legacy PS-POLL support.
184 * 05 05 2010 cm.chang
185 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
186 * Add a new function to send abort message
188 * 04 27 2010 cm.chang
189 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
190 * BMC mac address shall be ignored in basic config command
192 * 04 24 2010 cm.chang
193 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
194 * g_aprBssInfo[] depends on CFG_SUPPORT_P2P and CFG_SUPPORT_BOW
196 * 04 22 2010 cm.chang
197 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
198 * Support change of MAC address by host command
201 * [BORA00000680][MT6620] Support the statistic for Microsoft os query
202 * adding the wpa-none for ibss beacon.
204 * 04 07 2010 cm.chang
205 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
206 * Fix bug for OBSS scan
208 * 03 30 2010 cm.chang
209 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
210 * Support 2.4G OBSS scan
212 * 03 16 2010 kevin.huang
213 * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
216 * 03 10 2010 kevin.huang
217 * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
219 * * * * * * * * * * Add Channel Manager for arbitration of JOIN and SCAN Req
222 * [BORA00000605][WIFISYS] Phase3 Integration
223 * use the Rx0 dor event indicate.
225 * 02 08 2010 cm.chang
226 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
227 * Support partial part about cmd basic configuration
229 * Dec 10 2009 mtk01104
230 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
231 * Remove conditional compiling FPGA_V5
233 * Nov 18 2009 mtk01104
234 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
235 * Add function cnmFsmEventInit()
237 * Nov 2 2009 mtk01104
238 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
243 /*******************************************************************************
244 * C O M P I L E R F L A G S
245 ********************************************************************************
248 /*******************************************************************************
249 * E X T E R N A L R E F E R E N C E S
250 ********************************************************************************
254 /*******************************************************************************
256 ********************************************************************************
259 /*******************************************************************************
261 ********************************************************************************
264 /*******************************************************************************
265 * P U B L I C D A T A
266 ********************************************************************************
269 /*******************************************************************************
270 * P R I V A T E D A T A
271 ********************************************************************************
274 /*******************************************************************************
276 ********************************************************************************
279 /*******************************************************************************
280 * F U N C T I O N D E C L A R A T I O N S
281 ********************************************************************************
284 /*******************************************************************************
286 ********************************************************************************
289 /*----------------------------------------------------------------------------*/
291 * @brief This function is used to initialize variables in CNM_INFO_T.
297 /*----------------------------------------------------------------------------*/
300 P_ADAPTER_T prAdapter
304 } /* end of cnmInit() */
306 /*----------------------------------------------------------------------------*/
308 * @brief This function is used to initialize variables in CNM_INFO_T.
314 /*----------------------------------------------------------------------------*/
317 P_ADAPTER_T prAdapter
321 } /* end of cnmUninit() */
323 /*----------------------------------------------------------------------------*/
325 * @brief Before handle the message from other module, it need to obtain
326 * the Channel privilege from Channel Manager
328 * @param[in] prMsgHdr The message need to be handled.
332 /*----------------------------------------------------------------------------*/
334 cnmChMngrRequestPrivilege (
335 P_ADAPTER_T prAdapter,
339 P_MSG_CH_REQ_T prMsgChReq;
340 P_CMD_CH_PRIVILEGE_T prCmdBody;
346 prMsgChReq = (P_MSG_CH_REQ_T) prMsgHdr;
348 prCmdBody = (P_CMD_CH_PRIVILEGE_T)
349 cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_CH_PRIVILEGE_T));
352 /* To do: exception handle */
354 DBGLOG(CNM, ERROR, ("ChReq: fail to get buf (net=%d, token=%d)\n",
355 prMsgChReq->ucNetTypeIndex, prMsgChReq->ucTokenID));
357 cnmMemFree(prAdapter, prMsgHdr);
361 DBGLOG(CNM, INFO, ("ChReq net=%d token=%d b=%d c=%d s=%d\n",
362 prMsgChReq->ucNetTypeIndex, prMsgChReq->ucTokenID,
363 prMsgChReq->eRfBand, prMsgChReq->ucPrimaryChannel,
364 prMsgChReq->eRfSco));
366 prCmdBody->ucNetTypeIndex = prMsgChReq->ucNetTypeIndex;
367 prCmdBody->ucTokenID = prMsgChReq->ucTokenID;
368 prCmdBody->ucAction = CMD_CH_ACTION_REQ; /* Request */
369 prCmdBody->ucPrimaryChannel = prMsgChReq->ucPrimaryChannel;
370 prCmdBody->ucRfSco = (UINT_8) prMsgChReq->eRfSco;
371 prCmdBody->ucRfBand = (UINT_8) prMsgChReq->eRfBand;
372 prCmdBody->ucReqType = (UINT_8) prMsgChReq->eReqType;
373 prCmdBody->ucReserved = 0;
374 prCmdBody->u4MaxInterval= prMsgChReq->u4MaxInterval;
375 COPY_MAC_ADDR(prCmdBody->aucBSSID, prMsgChReq->aucBSSID);
377 ASSERT(prCmdBody->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
379 /* For monkey testing 20110901 */
380 if (prCmdBody->ucNetTypeIndex >= NETWORK_TYPE_INDEX_NUM) {
381 DBGLOG(CNM, ERROR, ("CNM: ChReq with wrong netIdx=%d\n\n",
382 prCmdBody->ucNetTypeIndex));
385 rStatus = wlanSendSetQueryCmd (
386 prAdapter, /* prAdapter */
387 CMD_ID_CH_PRIVILEGE, /* ucCID */
388 TRUE, /* fgSetQuery */
389 FALSE, /* fgNeedResp */
391 NULL, /* pfCmdDoneHandler */
392 NULL, /* pfCmdTimeoutHandler */
393 sizeof(CMD_CH_PRIVILEGE_T), /* u4SetQueryInfoLen */
394 (PUINT_8) prCmdBody, /* pucInfoBuffer */
395 NULL, /* pvSetQueryBuffer */
396 0 /* u4SetQueryBufferLen */
399 ASSERT(rStatus == WLAN_STATUS_PENDING);
401 cnmMemFree(prAdapter, prCmdBody);
402 cnmMemFree(prAdapter, prMsgHdr);
405 } /* end of cnmChMngrRequestPrivilege() */
407 /*----------------------------------------------------------------------------*/
409 * @brief Before deliver the message to other module, it need to release
410 * the Channel privilege to Channel Manager.
412 * @param[in] prMsgHdr The message need to be delivered
416 /*----------------------------------------------------------------------------*/
418 cnmChMngrAbortPrivilege (
419 P_ADAPTER_T prAdapter,
423 P_MSG_CH_ABORT_T prMsgChAbort;
424 P_CMD_CH_PRIVILEGE_T prCmdBody;
430 prMsgChAbort = (P_MSG_CH_ABORT_T) prMsgHdr;
432 prCmdBody = (P_CMD_CH_PRIVILEGE_T)
433 cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_CH_PRIVILEGE_T));
436 /* To do: exception handle */
438 DBGLOG(CNM, ERROR, ("ChAbort: fail to get buf (net=%d, token=%d)\n",
439 prMsgChAbort->ucNetTypeIndex, prMsgChAbort->ucTokenID));
441 cnmMemFree(prAdapter, prMsgHdr);
445 DBGLOG(CNM, INFO, ("ChAbort net=%d token=%d\n",
446 prMsgChAbort->ucNetTypeIndex, prMsgChAbort->ucTokenID));
448 prCmdBody->ucNetTypeIndex = prMsgChAbort->ucNetTypeIndex;
449 prCmdBody->ucTokenID = prMsgChAbort->ucTokenID;
450 prCmdBody->ucAction = CMD_CH_ACTION_ABORT; /* Abort */
452 ASSERT(prCmdBody->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
454 /* For monkey testing 20110901 */
455 if (prCmdBody->ucNetTypeIndex >= NETWORK_TYPE_INDEX_NUM) {
456 DBGLOG(CNM, ERROR, ("CNM: ChAbort with wrong netIdx=%d\n\n",
457 prCmdBody->ucNetTypeIndex));
460 rStatus = wlanSendSetQueryCmd (
461 prAdapter, /* prAdapter */
462 CMD_ID_CH_PRIVILEGE, /* ucCID */
463 TRUE, /* fgSetQuery */
464 FALSE, /* fgNeedResp */
466 NULL, /* pfCmdDoneHandler */
467 NULL, /* pfCmdTimeoutHandler */
468 sizeof(CMD_CH_PRIVILEGE_T), /* u4SetQueryInfoLen */
469 (PUINT_8) prCmdBody, /* pucInfoBuffer */
470 NULL, /* pvSetQueryBuffer */
471 0 /* u4SetQueryBufferLen */
474 ASSERT(rStatus == WLAN_STATUS_PENDING);
476 cnmMemFree(prAdapter, prCmdBody);
477 cnmMemFree(prAdapter, prMsgHdr);
480 } /* end of cnmChMngrAbortPrivilege() */
482 /*----------------------------------------------------------------------------*/
490 /*----------------------------------------------------------------------------*/
492 cnmChMngrHandleChEvent (
493 P_ADAPTER_T prAdapter,
494 P_WIFI_EVENT_T prEvent
497 P_EVENT_CH_PRIVILEGE_T prEventBody;
498 P_MSG_CH_GRANT_T prChResp;
503 prEventBody = (P_EVENT_CH_PRIVILEGE_T) (prEvent->aucBuffer);
504 prChResp = (P_MSG_CH_GRANT_T)
505 cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_GRANT_T));
508 /* To do: exception handle */
510 DBGLOG(CNM, ERROR, ("ChGrant: fail to get buf (net=%d, token=%d)\n",
511 prEventBody->ucNetTypeIndex, prEventBody->ucTokenID));
516 DBGLOG(CNM, INFO, ("ChGrant net=%d token=%d ch=%d sco=%d\n",
517 prEventBody->ucNetTypeIndex, prEventBody->ucTokenID,
518 prEventBody->ucPrimaryChannel, prEventBody->ucRfSco));
520 ASSERT(prEventBody->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
521 ASSERT(prEventBody->ucStatus == EVENT_CH_STATUS_GRANT);
523 /* Decide message ID based on network and response status */
524 if (prEventBody->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX) {
525 prChResp->rMsgHdr.eMsgId = MID_CNM_AIS_CH_GRANT;
527 #if CFG_ENABLE_WIFI_DIRECT
528 else if ((prAdapter->fgIsP2PRegistered) &&
529 (prEventBody->ucNetTypeIndex == NETWORK_TYPE_P2P_INDEX)) {
530 prChResp->rMsgHdr.eMsgId = MID_CNM_P2P_CH_GRANT;
533 #if CFG_ENABLE_BT_OVER_WIFI
534 else if (prEventBody->ucNetTypeIndex == NETWORK_TYPE_BOW_INDEX) {
535 prChResp->rMsgHdr.eMsgId = MID_CNM_BOW_CH_GRANT;
539 cnmMemFree(prAdapter, prChResp);
543 prChResp->ucNetTypeIndex = prEventBody->ucNetTypeIndex;
544 prChResp->ucTokenID = prEventBody->ucTokenID;
545 prChResp->ucPrimaryChannel = prEventBody->ucPrimaryChannel;
546 prChResp->eRfSco = (ENUM_CHNL_EXT_T) prEventBody->ucRfSco;
547 prChResp->eRfBand = (ENUM_BAND_T) prEventBody->ucRfBand;
548 prChResp->eReqType = (ENUM_CH_REQ_TYPE_T) prEventBody->ucReqType;
549 prChResp->u4GrantInterval = prEventBody->u4GrantInterval;
551 mboxSendMsg(prAdapter,
553 (P_MSG_HDR_T) prChResp,
554 MSG_SEND_METHOD_BUF);
557 /*----------------------------------------------------------------------------*/
559 * @brief This function is invoked for P2P or BOW networks
563 * @return TRUE: suggest to adopt the returned preferred channel
564 * FALSE: No suggestion. Caller should adopt its preference
566 /*----------------------------------------------------------------------------*/
568 cnmPreferredChannel (
569 P_ADAPTER_T prAdapter,
570 P_ENUM_BAND_T prBand,
571 PUINT_8 pucPrimaryChannel,
572 P_ENUM_CHNL_EXT_T prBssSCO
575 P_BSS_INFO_T prBssInfo;
579 ASSERT(pucPrimaryChannel);
582 prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
584 if (RLM_NET_PARAM_VALID(prBssInfo)) {
585 *prBand = prBssInfo->eBand;
586 *pucPrimaryChannel = prBssInfo->ucPrimaryChannel;
587 *prBssSCO = prBssInfo->eBssSCO;
595 /*----------------------------------------------------------------------------*/
601 * @return TRUE: available channel is limited to return value
604 /*----------------------------------------------------------------------------*/
606 cnmAisInfraChannelFixed (
607 P_ADAPTER_T prAdapter,
608 P_ENUM_BAND_T prBand,
609 PUINT_8 pucPrimaryChannel
612 #if CFG_ENABLE_WIFI_DIRECT ||(CFG_ENABLE_BT_OVER_WIFI && CFG_BOW_LIMIT_AIS_CHNL)
613 P_BSS_INFO_T prBssInfo;
616 #if CFG_ENABLE_WIFI_DIRECT
617 if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX) &&
618 prAdapter->rP2pFuncLkr.prP2pFuncIsApMode &&
619 prAdapter->rP2pFuncLkr.prP2pFuncIsApMode(
620 prAdapter->rWifiVar.prP2pFsmInfo)) {
622 ASSERT(prAdapter->fgIsP2PRegistered);
624 prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX];
626 *prBand = prBssInfo->eBand;
627 *pucPrimaryChannel = prBssInfo->ucPrimaryChannel;
633 #if CFG_ENABLE_BT_OVER_WIFI && CFG_BOW_LIMIT_AIS_CHNL
634 if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX)) {
636 prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX];
638 *prBand = prBssInfo->eBand;
639 *pucPrimaryChannel = prBssInfo->ucPrimaryChannel;
648 /*----------------------------------------------------------------------------*/
656 /*----------------------------------------------------------------------------*/
658 cnmAisInfraConnectNotify (
659 P_ADAPTER_T prAdapter
662 #if CFG_ENABLE_BT_OVER_WIFI
663 P_BSS_INFO_T prAisBssInfo, prBowBssInfo;
665 prAisBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
666 prBowBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX];
668 if (RLM_NET_PARAM_VALID(prAisBssInfo) && RLM_NET_PARAM_VALID(prBowBssInfo)){
669 if (prAisBssInfo->eBand != prBowBssInfo->eBand ||
670 prAisBssInfo->ucPrimaryChannel != prBowBssInfo->ucPrimaryChannel) {
672 /* Notify BOW to do deactivation */
673 bowNotifyAllLinkDisconnected(prAdapter);
679 /*----------------------------------------------------------------------------*/
685 * @return TRUE: permitted
686 * FALSE: Not permitted
688 /*----------------------------------------------------------------------------*/
690 cnmAisIbssIsPermitted (
691 P_ADAPTER_T prAdapter
694 #if CFG_ENABLE_WIFI_DIRECT
695 if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX)) {
700 #if CFG_ENABLE_BT_OVER_WIFI
701 if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX)) {
709 /*----------------------------------------------------------------------------*/
715 * @return TRUE: permitted
716 * FALSE: Not permitted
718 /*----------------------------------------------------------------------------*/
721 P_ADAPTER_T prAdapter
724 P_BSS_INFO_T prBssInfo;
726 prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
728 if (IS_BSS_ACTIVE(prBssInfo) &&
729 prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
733 #if CFG_ENABLE_BT_OVER_WIFI
734 if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX)) {
735 /* Notify BOW to do deactivation */
736 bowNotifyAllLinkDisconnected(prAdapter);
743 /*----------------------------------------------------------------------------*/
749 * @return TRUE: permitted
750 * FALSE: Not permitted
752 /*----------------------------------------------------------------------------*/
755 P_ADAPTER_T prAdapter
758 P_BSS_INFO_T prBssInfo;
760 prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
762 if (IS_BSS_ACTIVE(prBssInfo) &&
763 prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
767 #if CFG_ENABLE_WIFI_DIRECT
768 if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX)) {
776 /*----------------------------------------------------------------------------*/
782 * @return TRUE: permitted
783 * FALSE: Not permitted
785 /*----------------------------------------------------------------------------*/
787 cnmBss40mBwPermitted (
788 P_ADAPTER_T prAdapter,
789 ENUM_NETWORK_TYPE_INDEX_T eNetTypeIdx
792 P_BSS_INFO_T prBssInfo;
795 /* Note: To support real-time decision instead of current activated-time,
796 * the STA roaming case shall be considered about synchronization
797 * problem. Another variable fgAssoc40mBwAllowed is added to
798 * represent HT capability when association
800 for (i = 0; i < NETWORK_TYPE_INDEX_NUM; i++) {
801 if (i != (UINT_8) eNetTypeIdx) {
802 prBssInfo = &prAdapter->rWifiVar.arBssInfo[i];
804 if (IS_BSS_ACTIVE(prBssInfo) && (prBssInfo->fg40mBwAllowed ||
805 prBssInfo->fgAssoc40mBwAllowed)) {