be1e2d99b654f99e972f1fc4de6f59f4db1bdf77
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / mt5931_kk / drv_wlan / mgmt / cnm.c
1 /*
2 ** $Id: //Department/DaVinci/BRANCHES/MT662X_593X_WIFI_DRIVER_V2_3/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  * 07 17 2012 yuche.tsai
57  * NULL
58  * Compile no error before trial run.
59  *
60  * 11 15 2011 cm.chang
61  * NULL
62  * Fix possible wrong message when P2P is unregistered
63  *
64  * 11 14 2011 yuche.tsai
65  * [WCXRP00001107] [Volunteer Patch][Driver] Large Network Type index assert in FW issue.
66  * Fix large network type index assert in FW issue.
67  *
68  * 11 10 2011 cm.chang
69  * NULL
70  * Modify debug message for XLOG
71  *
72  * 11 08 2011 cm.chang
73  * NULL
74  * Add RLM and CNM debug message for XLOG
75  *
76  * 11 01 2011 cm.chang
77  * [WCXRP00001077] [All Wi-Fi][Driver] Fix wrong preferred channel for AP and BOW
78  * Only check AIS channel for P2P and BOW
79  *
80  * 10 25 2011 cm.chang
81  * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
82  * Extension channel of some 5G AP will not follow regulation requirement
83  *
84  * 09 30 2011 cm.chang
85  * [WCXRP00001020] [MT6620 Wi-Fi][Driver] Handle secondary channel offset of AP in 5GHz band
86  * .
87  *
88  * 09 01 2011 cm.chang
89  * [WCXRP00000937] [MT6620 Wi-Fi][Driver][FW] cnm.c line #848 assert when doing monkey test
90  * Print message only in Linux platform for monkey testing
91  *
92  * 06 23 2011 cp.wu
93  * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
94  * change parameter name from PeerAddr to BSSID
95  *
96  * 06 20 2011 cp.wu
97  * [WCXRP00000798] [MT6620 Wi-Fi][Firmware] Follow-ups for WAPI frequency offset workaround in firmware SCN module
98  * 1. specify target's BSSID when requesting channel privilege.
99  * 2. pass BSSID information to firmware domain
100  *
101  * 06 01 2011 cm.chang
102  * [WCXRP00000756] [MT6620 Wi-Fi][Driver] 1. AIS follow channel of BOW 2. Provide legal channel function
103  * Limit AIS to fixed channel same with BOW
104  *
105  * 04 12 2011 cm.chang
106  * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
107  * .
108  *
109  * 03 10 2011 cm.chang
110  * [WCXRP00000358] [MT6620 Wi-Fi][Driver] Provide concurrent information for each module
111  * Check if P2P network index is Tethering AP
112  *
113  * 03 10 2011 cm.chang
114  * [WCXRP00000358] [MT6620 Wi-Fi][Driver] Provide concurrent information for each module
115  * Add some functions to let AIS/Tethering or AIS/BOW be the same channel
116  *
117  * 02 17 2011 cm.chang
118  * [WCXRP00000358] [MT6620 Wi-Fi][Driver] Provide concurrent information for each module
119  * When P2P registried, invoke BOW deactivate function
120  *
121  * 01 12 2011 cm.chang
122  * [WCXRP00000358] [MT6620 Wi-Fi][Driver] Provide concurrent information for each module
123  * Provide function to decide if BSS can be activated or not
124  *
125  * 12 07 2010 cm.chang
126  * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
127  * 1. BSSINFO include RLM parameter
128  * 2. free all sta records when network is disconnected
129  *
130  * 12 07 2010 cm.chang
131  * [WCXRP00000238] MT6620 Wi-Fi][Driver][FW] Support regulation domain setting from NVRAM and supplicant
132  * 1. Country code is from NVRAM or supplicant
133  * 2. Change band definition in CMD/EVENT.
134  *
135  * 11 08 2010 cm.chang
136  * [WCXRP00000169] [MT6620 Wi-Fi][Driver][FW] Remove unused CNM recover message ID
137  * Remove CNM channel reover message ID
138  *
139  * 10 13 2010 cm.chang
140  * [WCXRP00000094] [MT6620 Wi-Fi][Driver] Connect to 2.4GHz AP, Driver crash.
141  * Add exception handle when cmd buffer is not available
142  *
143  * 08 24 2010 cm.chang
144  * NULL
145  * Support RLM initail channel of Ad-hoc, P2P and BOW
146  *
147  * 07 19 2010 wh.su
148  *
149  * update for security supporting.
150  *
151  * 07 19 2010 cm.chang
152  *
153  * Set RLM parameters and enable CNM channel manager
154  *
155  * 07 08 2010 cp.wu
156  *
157  * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
158  *
159  * 07 08 2010 cm.chang
160  * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
161  * Rename MID_MNY_CNM_CH_RELEASE to MID_MNY_CNM_CH_ABORT
162  *
163  * 07 01 2010 cm.chang
164  * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
165  * Fix wrong message ID for channel grant to requester
166  *
167  * 07 01 2010 cm.chang
168  * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
169  * Modify CNM message handler for new flow
170  *
171  * 06 07 2010 cm.chang
172  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
173  * Set 20/40M bandwidth of AP HT OP before association process
174  *
175  * 05 31 2010 yarco.yang
176  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
177  * Add RX TSF Log Feature and ADDBA Rsp with DECLINE handling
178  *
179  * 05 21 2010 yarco.yang
180  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
181  * Support TCP/UDP/IP Checksum offload feature
182  *
183  * 05 12 2010 kevin.huang
184  * [BORA00000794][WIFISYS][New Feature]Power Management Support
185  * Add Power Management - Legacy PS-POLL support.
186  *
187  * 05 05 2010 cm.chang
188  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
189  * Add a new function to send abort message
190  *
191  * 04 27 2010 cm.chang
192  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
193  * BMC mac address shall be ignored in basic config command
194  *
195  * 04 24 2010 cm.chang
196  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
197  * g_aprBssInfo[] depends on CFG_SUPPORT_P2P and CFG_SUPPORT_BOW
198  *
199  * 04 22 2010 cm.chang
200  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
201  * Support change of MAC address by host command
202  *
203  * 04 16 2010 wh.su
204  * [BORA00000680][MT6620] Support the statistic for Microsoft os query
205  * adding the wpa-none for ibss beacon.
206  *
207  * 04 07 2010 cm.chang
208  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
209  * Fix bug for OBSS scan
210  *
211  * 03 30 2010 cm.chang
212  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
213  * Support 2.4G OBSS scan
214  *
215  * 03 16 2010 kevin.huang
216  * [BORA00000663][WIFISYS][New Feature] AdHoc Mode Support
217  * Add AdHoc Mode
218  *
219  * 03 10 2010 kevin.huang
220  * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
221  *
222  *  *  *  *  *  *  *  *  *  * Add Channel Manager for arbitration of JOIN and SCAN Req
223  *
224  * 02 25 2010 wh.su
225  * [BORA00000605][WIFISYS] Phase3 Integration
226  * use the Rx0 dor event indicate.
227  *
228  * 02 08 2010 cm.chang
229  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
230  * Support partial part about cmd basic configuration
231  *
232  * Dec 10 2009 mtk01104
233  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
234  * Remove conditional compiling FPGA_V5
235  *
236  * Nov 18 2009 mtk01104
237  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
238  * Add function cnmFsmEventInit()
239  *
240  * Nov 2 2009 mtk01104
241  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
242  *
243 **
244 */
245
246 /*******************************************************************************
247 *                         C O M P I L E R   F L A G S
248 ********************************************************************************
249 */
250
251 /*******************************************************************************
252 *                    E X T E R N A L   R E F E R E N C E S
253 ********************************************************************************
254 */
255 #include "precomp.h"
256
257 /*******************************************************************************
258 *                              C O N S T A N T S
259 ********************************************************************************
260 */
261
262 /*******************************************************************************
263 *                             D A T A   T Y P E S
264 ********************************************************************************
265 */
266
267 /*******************************************************************************
268 *                            P U B L I C   D A T A
269 ********************************************************************************
270 */
271
272 /*******************************************************************************
273 *                           P R I V A T E   D A T A
274 ********************************************************************************
275 */
276
277 /*******************************************************************************
278 *                                 M A C R O S
279 ********************************************************************************
280 */
281
282 /*******************************************************************************
283 *                   F U N C T I O N   D E C L A R A T I O N S
284 ********************************************************************************
285 */
286
287 /*******************************************************************************
288 *                              F U N C T I O N S
289 ********************************************************************************
290 */
291
292 /*----------------------------------------------------------------------------*/
293 /*!
294 * @brief This function is used to initialize variables in CNM_INFO_T.
295 *
296 * @param (none)
297 *
298 * @return (none)
299 */
300 /*----------------------------------------------------------------------------*/
301 VOID
302 cnmInit (
303     P_ADAPTER_T     prAdapter
304     )
305 {
306     return;
307 } /* end of cnmInit() */
308
309 /*----------------------------------------------------------------------------*/
310 /*!
311 * @brief This function is used to initialize variables in CNM_INFO_T.
312 *
313 * @param (none)
314 *
315 * @return (none)
316 */
317 /*----------------------------------------------------------------------------*/
318 VOID
319 cnmUninit (
320     P_ADAPTER_T     prAdapter
321     )
322 {
323     return;
324 } /* end of cnmUninit() */
325
326 /*----------------------------------------------------------------------------*/
327 /*!
328 * @brief Before handle the message from other module, it need to obtain
329 *        the Channel privilege from Channel Manager
330 *
331 * @param[in] prMsgHdr   The message need to be handled.
332 *
333 * @return (none)
334 */
335 /*----------------------------------------------------------------------------*/
336 VOID
337 cnmChMngrRequestPrivilege (
338     P_ADAPTER_T     prAdapter,
339     P_MSG_HDR_T     prMsgHdr
340     )
341 {
342     P_MSG_CH_REQ_T          prMsgChReq;
343     P_CMD_CH_PRIVILEGE_T    prCmdBody;
344     WLAN_STATUS             rStatus;
345
346     ASSERT(prAdapter);
347     ASSERT(prMsgHdr);
348
349     prMsgChReq = (P_MSG_CH_REQ_T) prMsgHdr;
350
351     prCmdBody = (P_CMD_CH_PRIVILEGE_T)
352             cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_CH_PRIVILEGE_T));
353     ASSERT(prCmdBody);
354
355     /* To do: exception handle */
356     if (!prCmdBody) {
357         DBGLOG(CNM, ERROR, ("ChReq: fail to get buf (net=%d, token=%d)\n",
358             prMsgChReq->ucNetTypeIndex, prMsgChReq->ucTokenID));
359
360         cnmMemFree(prAdapter, prMsgHdr);
361         return;
362     }
363 #if 0   // p2p have timing issue, we must ensrure print less log
364     DBGLOG(CNM, INFO, ("ChReq net=%d token=%d b=%d c=%d s=%d\n",
365         prMsgChReq->ucNetTypeIndex, prMsgChReq->ucTokenID,
366         prMsgChReq->eRfBand, prMsgChReq->ucPrimaryChannel,
367         prMsgChReq->eRfSco));
368 #endif
369     prCmdBody->ucNetTypeIndex = prMsgChReq->ucNetTypeIndex;
370     prCmdBody->ucTokenID = prMsgChReq->ucTokenID;
371     prCmdBody->ucAction = CMD_CH_ACTION_REQ;    /* Request */
372     prCmdBody->ucPrimaryChannel = prMsgChReq->ucPrimaryChannel;
373     prCmdBody->ucRfSco = (UINT_8) prMsgChReq->eRfSco;
374     prCmdBody->ucRfBand = (UINT_8) prMsgChReq->eRfBand;
375     prCmdBody->ucReqType = (UINT_8) prMsgChReq->eReqType;
376     prCmdBody->ucReserved = 0;
377     prCmdBody->u4MaxInterval= prMsgChReq->u4MaxInterval;
378     COPY_MAC_ADDR(prCmdBody->aucBSSID, prMsgChReq->aucBSSID);
379
380     ASSERT(prCmdBody->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
381
382     /* For monkey testing 20110901 */
383     if (prCmdBody->ucNetTypeIndex >= NETWORK_TYPE_INDEX_NUM) {
384         DBGLOG(CNM, ERROR, ("CNM: ChReq with wrong netIdx=%d\n\n",
385             prCmdBody->ucNetTypeIndex));
386     }
387
388     rStatus = wlanSendSetQueryCmd (
389                 prAdapter,                  /* prAdapter */
390                 CMD_ID_CH_PRIVILEGE,        /* ucCID */
391                 TRUE,                       /* fgSetQuery */
392                 FALSE,                      /* fgNeedResp */
393                 FALSE,                      /* fgIsOid */
394                 NULL,                       /* pfCmdDoneHandler */
395                 NULL,                       /* pfCmdTimeoutHandler */
396                 sizeof(CMD_CH_PRIVILEGE_T), /* u4SetQueryInfoLen */
397                 (PUINT_8) prCmdBody,        /* pucInfoBuffer */
398                 NULL,                       /* pvSetQueryBuffer */
399                 0                           /* u4SetQueryBufferLen */
400                 );
401
402     ASSERT(rStatus == WLAN_STATUS_PENDING);
403
404     cnmMemFree(prAdapter, prCmdBody);
405     cnmMemFree(prAdapter, prMsgHdr);
406
407     return;
408 } /* end of cnmChMngrRequestPrivilege() */
409
410 /*----------------------------------------------------------------------------*/
411 /*!
412 * @brief Before deliver the message to other module, it need to release
413 *        the Channel privilege to Channel Manager.
414 *
415 * @param[in] prMsgHdr   The message need to be delivered
416 *
417 * @return (none)
418 */
419 /*----------------------------------------------------------------------------*/
420 VOID
421 cnmChMngrAbortPrivilege (
422     P_ADAPTER_T prAdapter,
423     P_MSG_HDR_T prMsgHdr
424     )
425 {
426     P_MSG_CH_ABORT_T        prMsgChAbort;
427     P_CMD_CH_PRIVILEGE_T    prCmdBody;
428     WLAN_STATUS             rStatus;
429
430     ASSERT(prAdapter);
431     ASSERT(prMsgHdr);
432
433     prMsgChAbort = (P_MSG_CH_ABORT_T) prMsgHdr;
434
435     prCmdBody = (P_CMD_CH_PRIVILEGE_T)
436             cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_CH_PRIVILEGE_T));
437     ASSERT(prCmdBody);
438
439     /* To do: exception handle */
440     if (!prCmdBody) {
441         DBGLOG(CNM, ERROR, ("ChAbort: fail to get buf (net=%d, token=%d)\n",
442             prMsgChAbort->ucNetTypeIndex, prMsgChAbort->ucTokenID));
443
444         cnmMemFree(prAdapter, prMsgHdr);
445         return;
446     }
447 #if 0
448     DBGLOG(CNM, INFO, ("ChAbort net=%d token=%d\n",
449         prMsgChAbort->ucNetTypeIndex, prMsgChAbort->ucTokenID));
450 #endif
451     prCmdBody->ucNetTypeIndex = prMsgChAbort->ucNetTypeIndex;
452     prCmdBody->ucTokenID = prMsgChAbort->ucTokenID;
453     prCmdBody->ucAction = CMD_CH_ACTION_ABORT;  /* Abort */
454
455     ASSERT(prCmdBody->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
456
457     /* For monkey testing 20110901 */
458     if (prCmdBody->ucNetTypeIndex >= NETWORK_TYPE_INDEX_NUM) {
459         DBGLOG(CNM, ERROR, ("CNM: ChAbort with wrong netIdx=%d\n\n",
460             prCmdBody->ucNetTypeIndex));
461     }
462
463     rStatus = wlanSendSetQueryCmd (
464                 prAdapter,                  /* prAdapter */
465                 CMD_ID_CH_PRIVILEGE,        /* ucCID */
466                 TRUE,                       /* fgSetQuery */
467                 FALSE,                      /* fgNeedResp */
468                 FALSE,                      /* fgIsOid */
469                 NULL,                       /* pfCmdDoneHandler */
470                 NULL,                       /* pfCmdTimeoutHandler */
471                 sizeof(CMD_CH_PRIVILEGE_T), /* u4SetQueryInfoLen */
472                 (PUINT_8) prCmdBody,        /* pucInfoBuffer */
473                 NULL,                       /* pvSetQueryBuffer */
474                 0                           /* u4SetQueryBufferLen */
475                 );
476
477     ASSERT(rStatus == WLAN_STATUS_PENDING);
478
479     cnmMemFree(prAdapter, prCmdBody);
480     cnmMemFree(prAdapter, prMsgHdr);
481
482     return;
483 } /* end of cnmChMngrAbortPrivilege() */
484
485 /*----------------------------------------------------------------------------*/
486 /*!
487 * @brief
488 *
489 * @param (none)
490 *
491 * @return (none)
492 */
493 /*----------------------------------------------------------------------------*/
494 VOID
495 cnmChMngrHandleChEvent (
496     P_ADAPTER_T     prAdapter,
497     P_WIFI_EVENT_T  prEvent
498     )
499 {
500     P_EVENT_CH_PRIVILEGE_T  prEventBody;
501     P_MSG_CH_GRANT_T        prChResp;
502
503     ASSERT(prAdapter);
504     ASSERT(prEvent);
505
506     prEventBody = (P_EVENT_CH_PRIVILEGE_T) (prEvent->aucBuffer);
507     prChResp = (P_MSG_CH_GRANT_T)
508                 cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_GRANT_T));
509     ASSERT(prChResp);
510
511     /* To do: exception handle */
512     if (!prChResp) {
513         DBGLOG(CNM, ERROR, ("ChGrant: fail to get buf (net=%d, token=%d)\n",
514             prEventBody->ucNetTypeIndex, prEventBody->ucTokenID));
515
516         return;
517     }
518     DBGLOG(CNM, INFO, ("ChGrant net=%d token=%d ch=%d sco=%d\n",
519         prEventBody->ucNetTypeIndex, prEventBody->ucTokenID,
520         prEventBody->ucPrimaryChannel, prEventBody->ucRfSco));
521     ASSERT(prEventBody->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
522     ASSERT(prEventBody->ucStatus == EVENT_CH_STATUS_GRANT);
523
524     /* Decide message ID based on network and response status */
525     if (prEventBody->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX) {
526         prChResp->rMsgHdr.eMsgId = MID_CNM_AIS_CH_GRANT;
527     }
528 #if CFG_ENABLE_WIFI_DIRECT
529     else if ((prAdapter->fgIsP2PRegistered) &&
530              (prEventBody->ucNetTypeIndex == NETWORK_TYPE_P2P_INDEX)) {
531         prChResp->rMsgHdr.eMsgId = MID_CNM_P2P_CH_GRANT;
532     }
533 #endif
534 #if CFG_ENABLE_BT_OVER_WIFI
535     else if (prEventBody->ucNetTypeIndex == NETWORK_TYPE_BOW_INDEX) {
536         prChResp->rMsgHdr.eMsgId = MID_CNM_BOW_CH_GRANT;
537     }
538 #endif
539     else {
540         cnmMemFree(prAdapter, prChResp);
541         return;
542     }
543
544     prChResp->ucNetTypeIndex = prEventBody->ucNetTypeIndex;
545     prChResp->ucTokenID = prEventBody->ucTokenID;
546     prChResp->ucPrimaryChannel = prEventBody->ucPrimaryChannel;
547     prChResp->eRfSco = (ENUM_CHNL_EXT_T) prEventBody->ucRfSco;
548     prChResp->eRfBand = (ENUM_BAND_T) prEventBody->ucRfBand;
549     prChResp->eReqType = (ENUM_CH_REQ_TYPE_T) prEventBody->ucReqType;
550     prChResp->u4GrantInterval = prEventBody->u4GrantInterval;
551
552     mboxSendMsg(prAdapter,
553                 MBOX_ID_0,
554                 (P_MSG_HDR_T) prChResp,
555                 MSG_SEND_METHOD_BUF);
556 }
557
558 /*----------------------------------------------------------------------------*/
559 /*!
560 * @brief This function is invoked for P2P or BOW networks
561 *
562 * @param (none)
563 *
564 * @return TRUE: suggest to adopt the returned preferred channel
565 *         FALSE: No suggestion. Caller should adopt its preference
566 */
567 /*----------------------------------------------------------------------------*/
568 BOOLEAN
569 cnmPreferredChannel (
570     P_ADAPTER_T         prAdapter,
571     P_ENUM_BAND_T       prBand,
572     PUINT_8             pucPrimaryChannel,
573     P_ENUM_CHNL_EXT_T   prBssSCO
574     )
575 {
576     P_BSS_INFO_T    prBssInfo;
577
578     ASSERT(prAdapter);
579     ASSERT(prBand);
580     ASSERT(pucPrimaryChannel);
581     ASSERT(prBssSCO);
582
583     prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
584
585     if (RLM_NET_PARAM_VALID(prBssInfo)) {
586         *prBand = prBssInfo->eBand;
587         *pucPrimaryChannel = prBssInfo->ucPrimaryChannel;
588         *prBssSCO = prBssInfo->eBssSCO;
589
590         return TRUE;
591     }
592
593     return FALSE;
594 }
595
596 /*----------------------------------------------------------------------------*/
597 /*!
598 * @brief
599 *
600 * @param (none)
601 *
602 * @return TRUE: available channel is limited to return value
603 *         FALSE: no limited
604 */
605 /*----------------------------------------------------------------------------*/
606 BOOLEAN
607 cnmAisInfraChannelFixed (
608     P_ADAPTER_T         prAdapter,
609     P_ENUM_BAND_T       prBand,
610     PUINT_8             pucPrimaryChannel
611     )
612 {
613 #if CFG_ENABLE_WIFI_DIRECT ||(CFG_ENABLE_BT_OVER_WIFI && CFG_BOW_LIMIT_AIS_CHNL)
614     P_BSS_INFO_T    prBssInfo;
615 #endif
616
617 #if CFG_ENABLE_WIFI_DIRECT
618     if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX) &&
619         p2pFuncIsAPMode(prAdapter->rWifiVar.prP2pFsmInfo)) {
620
621         ASSERT(prAdapter->fgIsP2PRegistered);
622
623         prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX];
624
625         *prBand = prBssInfo->eBand;
626         *pucPrimaryChannel = prBssInfo->ucPrimaryChannel;
627
628         return TRUE;
629     }
630 #endif
631
632 #if CFG_ENABLE_BT_OVER_WIFI && CFG_BOW_LIMIT_AIS_CHNL
633     if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX)) {
634
635         prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX];
636
637         *prBand = prBssInfo->eBand;
638         *pucPrimaryChannel = prBssInfo->ucPrimaryChannel;
639
640         return TRUE;
641     }
642 #endif
643
644     return FALSE;
645 }
646
647 /*----------------------------------------------------------------------------*/
648 /*!
649 * @brief
650 *
651 * @param (none)
652 *
653 * @return (none)
654 */
655 /*----------------------------------------------------------------------------*/
656 VOID
657 cnmAisInfraConnectNotify (
658     P_ADAPTER_T         prAdapter
659     )
660 {
661 #if CFG_ENABLE_BT_OVER_WIFI
662     P_BSS_INFO_T    prAisBssInfo, prBowBssInfo;
663
664     prAisBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
665     prBowBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_BOW_INDEX];
666
667     if (RLM_NET_PARAM_VALID(prAisBssInfo) && RLM_NET_PARAM_VALID(prBowBssInfo)){
668         if (prAisBssInfo->eBand != prBowBssInfo->eBand ||
669             prAisBssInfo->ucPrimaryChannel != prBowBssInfo->ucPrimaryChannel) {
670
671             /* Notify BOW to do deactivation */
672             bowNotifyAllLinkDisconnected(prAdapter);
673         }
674     }
675 #endif
676 }
677
678 /*----------------------------------------------------------------------------*/
679 /*!
680 * @brief
681 *
682 * @param (none)
683 *
684 * @return TRUE: permitted
685 *         FALSE: Not permitted
686 */
687 /*----------------------------------------------------------------------------*/
688 BOOLEAN
689 cnmAisIbssIsPermitted (
690     P_ADAPTER_T     prAdapter
691     )
692 {
693 #if CFG_ENABLE_WIFI_DIRECT
694     if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX)) {
695         return FALSE;
696     }
697 #endif
698
699 #if CFG_ENABLE_BT_OVER_WIFI
700     if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX)) {
701         return FALSE;
702     }
703 #endif
704
705     return TRUE;
706 }
707
708 /*----------------------------------------------------------------------------*/
709 /*!
710 * @brief
711 *
712 * @param (none)
713 *
714 * @return TRUE: permitted
715 *         FALSE: Not permitted
716 */
717 /*----------------------------------------------------------------------------*/
718 BOOLEAN
719 cnmP2PIsPermitted (
720     P_ADAPTER_T     prAdapter
721     )
722 {
723     P_BSS_INFO_T    prBssInfo;
724
725     prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
726
727     if (IS_BSS_ACTIVE(prBssInfo) &&
728         prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
729         return FALSE;
730     }
731
732 #if CFG_ENABLE_BT_OVER_WIFI
733     if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_BOW_INDEX)) {
734         /* Notify BOW to do deactivation */
735         bowNotifyAllLinkDisconnected(prAdapter);
736     }
737 #endif
738
739     return TRUE;
740 }
741
742 /*----------------------------------------------------------------------------*/
743 /*!
744 * @brief
745 *
746 * @param (none)
747 *
748 * @return TRUE: permitted
749 *         FALSE: Not permitted
750 */
751 /*----------------------------------------------------------------------------*/
752 BOOLEAN
753 cnmBowIsPermitted (
754     P_ADAPTER_T     prAdapter
755     )
756 {
757     P_BSS_INFO_T    prBssInfo;
758
759     prBssInfo = &prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX];
760
761     if (IS_BSS_ACTIVE(prBssInfo) &&
762         prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
763         return FALSE;
764     }
765
766 #if CFG_ENABLE_WIFI_DIRECT
767     if (IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX)) {
768         return FALSE;
769     }
770 #endif
771
772     return TRUE;
773 }
774
775 /*----------------------------------------------------------------------------*/
776 /*!
777 * @brief
778 *
779 * @param (none)
780 *
781 * @return TRUE: permitted
782 *         FALSE: Not permitted
783 */
784 /*----------------------------------------------------------------------------*/
785 BOOLEAN
786 cnmBss40mBwPermitted (
787     P_ADAPTER_T                 prAdapter,
788     ENUM_NETWORK_TYPE_INDEX_T   eNetTypeIdx
789     )
790 {
791     P_BSS_INFO_T    prBssInfo;
792     UINT_8          i;
793
794     /* Note: To support real-time decision instead of current activated-time,
795      *       the STA roaming case shall be considered about synchronization
796      *       problem. Another variable fgAssoc40mBwAllowed is added to
797      *       represent HT capability when association
798      */
799     for (i = 0; i < NETWORK_TYPE_INDEX_NUM; i++) {
800         if (i != (UINT_8) eNetTypeIdx) {
801             prBssInfo = &prAdapter->rWifiVar.arBssInfo[i];
802
803             if (IS_BSS_ACTIVE(prBssInfo) && (prBssInfo->fg40mBwAllowed ||
804                 prBssInfo->fgAssoc40mBwAllowed)) {
805                 return FALSE;
806             }
807         }
808     }
809
810     return TRUE;
811 }
812
813