add MTK-combo-module,continue with commit 17f39ed917874e77e80411f33faba1b7ee8138c8
[firefly-linux-kernel-4.4.55.git] / drivers / mtk_wcn_combo / drv_wlan / wlan / mgmt / cnm.c
1 /*
2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_2/mgmt/cnm.c#1 $
3 */
4
5 /*! \file   "cnm.c"
6     \brief  Module of Concurrent Network Management
7
8     Module of Concurrent Network Management
9 */
10
11 /*******************************************************************************
12 * Copyright (c) 2010 MediaTek Inc.
13 *
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
17 * MediaTek Inc.
18 ********************************************************************************
19 */
20
21 /*******************************************************************************
22 * LEGAL DISCLAIMER
23 *
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.
37 *
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.
43 *
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
49 * (ICC).
50 ********************************************************************************
51 */
52
53 /*
54 ** $Log: cnm.c $
55  *
56  * 11 15 2011 cm.chang
57  * NULL
58  * Fix possible wrong message when P2P is unregistered
59  *
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.
64  *
65  * 11 10 2011 cm.chang
66  * NULL
67  * Modify debug message for XLOG
68  *
69  * 11 08 2011 cm.chang
70  * NULL
71  * Add RLM and CNM debug message for XLOG
72  *
73  * 11 01 2011 cm.chang
74  * [WCXRP00001077] [All Wi-Fi][Driver] Fix wrong preferred channel for AP and BOW
75  * Only check AIS channel for P2P and BOW
76  *
77  * 10 25 2011 cm.chang
78  * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
79  * .
80  *
81  * 10 19 2011 yuche.tsai
82  * [WCXRP00001045] [WiFi Direct][Driver] Check 2.1 branch.
83  * Branch 2.1
84  * Davinci Maintrunk Label: MT6620_WIFI_DRIVER_FW_TRUNK_MT6620E5_111019_0926.
85  *
86  * 08 17 2011 cm.chang
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
89  *
90  * 06 23 2011 cp.wu
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
93  *
94  * 06 01 2011 cm.chang
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
97  *
98  * 04 12 2011 cm.chang
99  * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
100  * .
101  *
102  * 03 18 2011 cp.wu
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
105  *
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
109  *
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
113  *
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
117  *
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
121  *
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
126  *
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.
131  *
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
135  *
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
139  *
140  * 08 24 2010 cm.chang
141  * NULL
142  * Support RLM initail channel of Ad-hoc, P2P and BOW
143  *
144  * 07 19 2010 wh.su
145  *
146  * update for security supporting.
147  *
148  * 07 19 2010 cm.chang
149  *
150  * Set RLM parameters and enable CNM channel manager
151  *
152  * 07 08 2010 cp.wu
153  *
154  * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
155  *
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
159  *
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
163  *
164  * 07 01 2010 cm.chang
165  * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
166  * Modify CNM message handler for new flow
167  *
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
171  *
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
175  *
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
179  *
180  * 05 12 2010 kevin.huang
181  * [BORA00000794][WIFISYS][New Feature]Power Management Support
182  * Add Power Management - Legacy PS-POLL support.
183  *
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
187  *
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
191  *
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
195  *
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
199  *
200  * 04 16 2010 wh.su
201  * [BORA00000680][MT6620] Support the statistic for Microsoft os query
202  * adding the wpa-none for ibss beacon.
203  *
204  * 04 07 2010 cm.chang
205  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
206  * Fix bug for OBSS scan
207  *
208  * 03 30 2010 cm.chang
209  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
210  * Support 2.4G OBSS scan
211  *
212  * 03 16 2010 kevin.huang
213  * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
214  * Add AdHoc Mode
215  *
216  * 03 10 2010 kevin.huang
217  * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
218  *
219  *  *  *  *  *  *  *  *  *  * Add Channel Manager for arbitration of JOIN and SCAN Req
220  *
221  * 02 25 2010 wh.su
222  * [BORA00000605][WIFISYS] Phase3 Integration
223  * use the Rx0 dor event indicate.
224  *
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
228  *
229  * Dec 10 2009 mtk01104
230  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
231  * Remove conditional compiling FPGA_V5
232  *
233  * Nov 18 2009 mtk01104
234  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
235  * Add function cnmFsmEventInit()
236  *
237  * Nov 2 2009 mtk01104
238  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
239  *
240 **
241 */
242
243 /*******************************************************************************
244 *                         C O M P I L E R   F L A G S
245 ********************************************************************************
246 */
247
248 /*******************************************************************************
249 *                    E X T E R N A L   R E F E R E N C E S
250 ********************************************************************************
251 */
252 #include "precomp.h"
253
254 /*******************************************************************************
255 *                              C O N S T A N T S
256 ********************************************************************************
257 */
258
259 /*******************************************************************************
260 *                             D A T A   T Y P E S
261 ********************************************************************************
262 */
263
264 /*******************************************************************************
265 *                            P U B L I C   D A T A
266 ********************************************************************************
267 */
268
269 /*******************************************************************************
270 *                           P R I V A T E   D A T A
271 ********************************************************************************
272 */
273
274 /*******************************************************************************
275 *                                 M A C R O S
276 ********************************************************************************
277 */
278
279 /*******************************************************************************
280 *                   F U N C T I O N   D E C L A R A T I O N S
281 ********************************************************************************
282 */
283
284 /*******************************************************************************
285 *                              F U N C T I O N S
286 ********************************************************************************
287 */
288
289 /*----------------------------------------------------------------------------*/
290 /*!
291 * @brief This function is used to initialize variables in CNM_INFO_T.
292 *
293 * @param (none)
294 *
295 * @return (none)
296 */
297 /*----------------------------------------------------------------------------*/
298 VOID
299 cnmInit (
300     P_ADAPTER_T     prAdapter
301     )
302 {
303     return;
304 } /* end of cnmInit() */
305
306 /*----------------------------------------------------------------------------*/
307 /*!
308 * @brief This function is used to initialize variables in CNM_INFO_T.
309 *
310 * @param (none)
311 *
312 * @return (none)
313 */
314 /*----------------------------------------------------------------------------*/
315 VOID
316 cnmUninit (
317     P_ADAPTER_T     prAdapter
318     )
319 {
320     return;
321 } /* end of cnmUninit() */
322
323 /*----------------------------------------------------------------------------*/
324 /*!
325 * @brief Before handle the message from other module, it need to obtain
326 *        the Channel privilege from Channel Manager
327 *
328 * @param[in] prMsgHdr   The message need to be handled.
329 *
330 * @return (none)
331 */
332 /*----------------------------------------------------------------------------*/
333 VOID
334 cnmChMngrRequestPrivilege (
335     P_ADAPTER_T     prAdapter,
336     P_MSG_HDR_T     prMsgHdr
337     )
338 {
339     P_MSG_CH_REQ_T          prMsgChReq;
340     P_CMD_CH_PRIVILEGE_T    prCmdBody;
341     WLAN_STATUS             rStatus;
342
343     ASSERT(prAdapter);
344     ASSERT(prMsgHdr);
345
346     prMsgChReq = (P_MSG_CH_REQ_T) prMsgHdr;
347
348     prCmdBody = (P_CMD_CH_PRIVILEGE_T)
349             cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_CH_PRIVILEGE_T));
350     ASSERT(prCmdBody);
351
352     /* To do: exception handle */
353     if (!prCmdBody) {
354         DBGLOG(CNM, ERROR, ("ChReq: fail to get buf (net=%d, token=%d)\n",
355             prMsgChReq->ucNetTypeIndex, prMsgChReq->ucTokenID));
356
357         cnmMemFree(prAdapter, prMsgHdr);
358         return;
359     }
360
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));
365
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);
376
377     ASSERT(prCmdBody->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
378
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));
383     }
384
385     rStatus = wlanSendSetQueryCmd (
386                 prAdapter,                  /* prAdapter */
387                 CMD_ID_CH_PRIVILEGE,        /* ucCID */
388                 TRUE,                       /* fgSetQuery */
389                 FALSE,                      /* fgNeedResp */
390                 FALSE,                      /* fgIsOid */
391                 NULL,                       /* pfCmdDoneHandler */
392                 NULL,                       /* pfCmdTimeoutHandler */
393                 sizeof(CMD_CH_PRIVILEGE_T), /* u4SetQueryInfoLen */
394                 (PUINT_8) prCmdBody,        /* pucInfoBuffer */
395                 NULL,                       /* pvSetQueryBuffer */
396                 0                           /* u4SetQueryBufferLen */
397                 );
398
399     ASSERT(rStatus == WLAN_STATUS_PENDING);
400
401     cnmMemFree(prAdapter, prCmdBody);
402     cnmMemFree(prAdapter, prMsgHdr);
403
404     return;
405 } /* end of cnmChMngrRequestPrivilege() */
406
407 /*----------------------------------------------------------------------------*/
408 /*!
409 * @brief Before deliver the message to other module, it need to release
410 *        the Channel privilege to Channel Manager.
411 *
412 * @param[in] prMsgHdr   The message need to be delivered
413 *
414 * @return (none)
415 */
416 /*----------------------------------------------------------------------------*/
417 VOID
418 cnmChMngrAbortPrivilege (
419     P_ADAPTER_T prAdapter,
420     P_MSG_HDR_T prMsgHdr
421     )
422 {
423     P_MSG_CH_ABORT_T        prMsgChAbort;
424     P_CMD_CH_PRIVILEGE_T    prCmdBody;
425     WLAN_STATUS             rStatus;
426
427     ASSERT(prAdapter);
428     ASSERT(prMsgHdr);
429
430     prMsgChAbort = (P_MSG_CH_ABORT_T) prMsgHdr;
431
432     prCmdBody = (P_CMD_CH_PRIVILEGE_T)
433             cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_CH_PRIVILEGE_T));
434     ASSERT(prCmdBody);
435
436     /* To do: exception handle */
437     if (!prCmdBody) {
438         DBGLOG(CNM, ERROR, ("ChAbort: fail to get buf (net=%d, token=%d)\n",
439             prMsgChAbort->ucNetTypeIndex, prMsgChAbort->ucTokenID));
440
441         cnmMemFree(prAdapter, prMsgHdr);
442         return;
443     }
444
445     DBGLOG(CNM, INFO, ("ChAbort net=%d token=%d\n",
446         prMsgChAbort->ucNetTypeIndex, prMsgChAbort->ucTokenID));
447
448     prCmdBody->ucNetTypeIndex = prMsgChAbort->ucNetTypeIndex;
449     prCmdBody->ucTokenID = prMsgChAbort->ucTokenID;
450     prCmdBody->ucAction = CMD_CH_ACTION_ABORT;  /* Abort */
451
452     ASSERT(prCmdBody->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
453
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));
458     }
459
460     rStatus = wlanSendSetQueryCmd (
461                 prAdapter,                  /* prAdapter */
462                 CMD_ID_CH_PRIVILEGE,        /* ucCID */
463                 TRUE,                       /* fgSetQuery */
464                 FALSE,                      /* fgNeedResp */
465                 FALSE,                      /* fgIsOid */
466                 NULL,                       /* pfCmdDoneHandler */
467                 NULL,                       /* pfCmdTimeoutHandler */
468                 sizeof(CMD_CH_PRIVILEGE_T), /* u4SetQueryInfoLen */
469                 (PUINT_8) prCmdBody,        /* pucInfoBuffer */
470                 NULL,                       /* pvSetQueryBuffer */
471                 0                           /* u4SetQueryBufferLen */
472                 );
473
474     ASSERT(rStatus == WLAN_STATUS_PENDING);
475
476     cnmMemFree(prAdapter, prCmdBody);
477     cnmMemFree(prAdapter, prMsgHdr);
478
479     return;
480 } /* end of cnmChMngrAbortPrivilege() */
481
482 /*----------------------------------------------------------------------------*/
483 /*!
484 * @brief
485 *
486 * @param (none)
487 *
488 * @return (none)
489 */
490 /*----------------------------------------------------------------------------*/
491 VOID
492 cnmChMngrHandleChEvent (
493     P_ADAPTER_T     prAdapter,
494     P_WIFI_EVENT_T  prEvent
495     )
496 {
497     P_EVENT_CH_PRIVILEGE_T  prEventBody;
498     P_MSG_CH_GRANT_T        prChResp;
499
500     ASSERT(prAdapter);
501     ASSERT(prEvent);
502
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));
506     ASSERT(prChResp);
507
508     /* To do: exception handle */
509     if (!prChResp) {
510         DBGLOG(CNM, ERROR, ("ChGrant: fail to get buf (net=%d, token=%d)\n",
511             prEventBody->ucNetTypeIndex, prEventBody->ucTokenID));
512
513         return;
514     }
515
516     DBGLOG(CNM, INFO, ("ChGrant net=%d token=%d ch=%d sco=%d\n",
517         prEventBody->ucNetTypeIndex, prEventBody->ucTokenID,
518         prEventBody->ucPrimaryChannel, prEventBody->ucRfSco));
519
520     ASSERT(prEventBody->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
521     ASSERT(prEventBody->ucStatus == EVENT_CH_STATUS_GRANT);
522
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;
526     }
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;
531     }
532 #endif
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;
536     }
537 #endif
538     else {
539         cnmMemFree(prAdapter, prChResp);
540         return;
541     }
542
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;
550
551     mboxSendMsg(prAdapter,
552                 MBOX_ID_0,
553                 (P_MSG_HDR_T) prChResp,
554                 MSG_SEND_METHOD_BUF);
555 }
556
557 /*----------------------------------------------------------------------------*/
558 /*!
559 * @brief This function is invoked for P2P or BOW networks
560 *
561 * @param (none)
562 *
563 * @return TRUE: suggest to adopt the returned preferred channel
564 *         FALSE: No suggestion. Caller should adopt its preference
565 */
566 /*----------------------------------------------------------------------------*/
567 BOOLEAN
568 cnmPreferredChannel (
569     P_ADAPTER_T         prAdapter,
570     P_ENUM_BAND_T       prBand,
571     PUINT_8             pucPrimaryChannel,
572     P_ENUM_CHNL_EXT_T   prBssSCO
573     )
574 {
575     P_BSS_INFO_T    prBssInfo;
576
577     ASSERT(prAdapter);
578     ASSERT(prBand);
579     ASSERT(pucPrimaryChannel);
580     ASSERT(prBssSCO);
581
582     prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
583
584     if (RLM_NET_PARAM_VALID(prBssInfo)) {
585         *prBand = prBssInfo->eBand;
586         *pucPrimaryChannel = prBssInfo->ucPrimaryChannel;
587         *prBssSCO = prBssInfo->eBssSCO;
588
589         return TRUE;
590     }
591
592     return FALSE;
593 }
594
595 /*----------------------------------------------------------------------------*/
596 /*!
597 * @brief
598 *
599 * @param (none)
600 *
601 * @return TRUE: available channel is limited to return value
602 *         FALSE: no limited
603 */
604 /*----------------------------------------------------------------------------*/
605 BOOLEAN
606 cnmAisInfraChannelFixed (
607     P_ADAPTER_T         prAdapter,
608     P_ENUM_BAND_T       prBand,
609     PUINT_8             pucPrimaryChannel
610     )
611 {
612 #if CFG_ENABLE_WIFI_DIRECT ||(CFG_ENABLE_BT_OVER_WIFI && CFG_BOW_LIMIT_AIS_CHNL)
613     P_BSS_INFO_T    prBssInfo;
614 #endif
615
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)) {
621
622         ASSERT(prAdapter->fgIsP2PRegistered);
623
624         prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX];
625
626         *prBand = prBssInfo->eBand;
627         *pucPrimaryChannel = prBssInfo->ucPrimaryChannel;
628
629         return TRUE;
630     }
631 #endif
632
633 #if CFG_ENABLE_BT_OVER_WIFI && CFG_BOW_LIMIT_AIS_CHNL
634     if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX)) {
635
636         prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX];
637
638         *prBand = prBssInfo->eBand;
639         *pucPrimaryChannel = prBssInfo->ucPrimaryChannel;
640
641         return TRUE;
642     }
643 #endif
644
645     return FALSE;
646 }
647
648 /*----------------------------------------------------------------------------*/
649 /*!
650 * @brief
651 *
652 * @param (none)
653 *
654 * @return (none)
655 */
656 /*----------------------------------------------------------------------------*/
657 VOID
658 cnmAisInfraConnectNotify (
659     P_ADAPTER_T         prAdapter
660     )
661 {
662 #if CFG_ENABLE_BT_OVER_WIFI
663     P_BSS_INFO_T    prAisBssInfo, prBowBssInfo;
664
665     prAisBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
666     prBowBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX];
667
668     if (RLM_NET_PARAM_VALID(prAisBssInfo) && RLM_NET_PARAM_VALID(prBowBssInfo)){
669         if (prAisBssInfo->eBand != prBowBssInfo->eBand ||
670             prAisBssInfo->ucPrimaryChannel != prBowBssInfo->ucPrimaryChannel) {
671
672             /* Notify BOW to do deactivation */
673             bowNotifyAllLinkDisconnected(prAdapter);
674         }
675     }
676 #endif
677 }
678
679 /*----------------------------------------------------------------------------*/
680 /*!
681 * @brief
682 *
683 * @param (none)
684 *
685 * @return TRUE: permitted
686 *         FALSE: Not permitted
687 */
688 /*----------------------------------------------------------------------------*/
689 BOOLEAN
690 cnmAisIbssIsPermitted (
691     P_ADAPTER_T     prAdapter
692     )
693 {
694 #if CFG_ENABLE_WIFI_DIRECT
695     if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX)) {
696         return FALSE;
697     }
698 #endif
699
700 #if CFG_ENABLE_BT_OVER_WIFI
701     if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX)) {
702         return FALSE;
703     }
704 #endif
705
706     return TRUE;
707 }
708
709 /*----------------------------------------------------------------------------*/
710 /*!
711 * @brief
712 *
713 * @param (none)
714 *
715 * @return TRUE: permitted
716 *         FALSE: Not permitted
717 */
718 /*----------------------------------------------------------------------------*/
719 BOOLEAN
720 cnmP2PIsPermitted (
721     P_ADAPTER_T     prAdapter
722     )
723 {
724     P_BSS_INFO_T    prBssInfo;
725
726     prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
727
728     if (IS_BSS_ACTIVE(prBssInfo) &&
729         prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
730         return FALSE;
731     }
732
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);
737     }
738 #endif
739
740     return TRUE;
741 }
742
743 /*----------------------------------------------------------------------------*/
744 /*!
745 * @brief
746 *
747 * @param (none)
748 *
749 * @return TRUE: permitted
750 *         FALSE: Not permitted
751 */
752 /*----------------------------------------------------------------------------*/
753 BOOLEAN
754 cnmBowIsPermitted (
755     P_ADAPTER_T     prAdapter
756     )
757 {
758     P_BSS_INFO_T    prBssInfo;
759
760     prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
761
762     if (IS_BSS_ACTIVE(prBssInfo) &&
763         prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
764         return FALSE;
765     }
766
767 #if CFG_ENABLE_WIFI_DIRECT
768     if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX)) {
769         return FALSE;
770     }
771 #endif
772
773     return TRUE;
774 }
775
776 /*----------------------------------------------------------------------------*/
777 /*!
778 * @brief
779 *
780 * @param (none)
781 *
782 * @return TRUE: permitted
783 *         FALSE: Not permitted
784 */
785 /*----------------------------------------------------------------------------*/
786 BOOLEAN
787 cnmBss40mBwPermitted (
788     P_ADAPTER_T                 prAdapter,
789     ENUM_NETWORK_TYPE_INDEX_T   eNetTypeIdx
790     )
791 {
792     P_BSS_INFO_T    prBssInfo;
793     UINT_8          i;
794
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
799      */
800     for (i = 0; i < NETWORK_TYPE_INDEX_NUM; i++) {
801         if (i != (UINT_8) eNetTypeIdx) {
802             prBssInfo = &prAdapter->rWifiVar.arBssInfo[i];
803
804             if (IS_BSS_ACTIVE(prBssInfo) && (prBssInfo->fg40mBwAllowed ||
805                 prBssInfo->fgAssoc40mBwAllowed)) {
806                 return FALSE;
807             }
808         }
809     }
810
811     return TRUE;
812 }
813
814