wifi: renew patch drivers/net/wireless
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / mt5931_kk / drv_wlan / mgmt / rlm_obss.c
1 /*
2 ** $Id: //Department/DaVinci/BRANCHES/MT662X_593X_WIFI_DRIVER_V2_3/mgmt/rlm_obss.c#1 $
3 */
4
5 /*! \file   "rlm_obss.c"
6     \brief
7
8 */
9
10 /*******************************************************************************
11 * Copyright (c) 2009 MediaTek Inc.
12 *
13 * All rights reserved. Copying, compilation, modification, distribution
14 * or any other use whatsoever of this material is strictly prohibited
15 * except in accordance with a Software License Agreement with
16 * MediaTek Inc.
17 ********************************************************************************
18 */
19
20 /*******************************************************************************
21 * LEGAL DISCLAIMER
22 *
23 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
24 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
25 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
26 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
27 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
28 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
29 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
30 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
31 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
32 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
33 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
34 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
35 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
36 *
37 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
38 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
39 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
40 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
41 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
42 *
43 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
44 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
45 * OF LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
46 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
47 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
48 * (ICC).
49 ********************************************************************************
50 */
51
52 /*
53 ** $Log: rlm_obss.c $
54  *
55  * 07 17 2012 yuche.tsai
56  * NULL
57  * Compile no error before trial run.
58  *
59  * 11 15 2011 cm.chang
60  * NULL
61  * Avoid possible OBSS scan when BSS is switched
62  *
63  * 11 08 2011 cm.chang
64  * NULL
65  * Add RLM and CNM debug message for XLOG
66  *
67  * 10 25 2011 cm.chang
68  * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
69  * Regulation class is changed to 81 in 20_40_coexistence action frame
70  *
71  * 04 12 2011 cm.chang
72  * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
73  * .
74  *
75  * 03 29 2011 cm.chang
76  * [WCXRP00000606] [MT6620 Wi-Fi][Driver][FW] Fix klocwork warning
77  * As CR title
78  *
79  * 01 24 2011 cm.chang
80  * [WCXRP00000384] [MT6620 Wi-Fi][Driver][FW] Handle 20/40 action frame in AP mode and stop ampdu timer when sta_rec is freed
81  * Process received 20/40 coexistence action frame for AP mode
82  *
83  * 01 13 2011 cm.chang
84  * [WCXRP00000358] [MT6620 Wi-Fi][Driver] Provide concurrent information for each module
85  * Refine function when rcv a 20/40M public action frame
86  *
87  * 01 13 2011 cm.chang
88  * [WCXRP00000354] [MT6620 Wi-Fi][Driver][FW] Follow NVRAM bandwidth setting
89  * Use SCO of BSS_INFO to replace user-defined setting variables
90  *
91  * 01 12 2011 cm.chang
92  * [WCXRP00000354] [MT6620 Wi-Fi][Driver][FW] Follow NVRAM bandwidth setting
93  * User-defined bandwidth is for 2.4G and 5G individually
94  *
95  * 10 18 2010 cp.wu
96  * [WCXRP00000052] [MT6620 Wi-Fi][Driver] Eliminate Linux Compile Warning
97  * use definition macro to replace hard-coded constant
98  *
99  * 09 16 2010 cm.chang
100  * NULL
101  * Change conditional compiling options for BOW
102  *
103  * 09 10 2010 cm.chang
104  * NULL
105  * Always update Beacon content if FW sync OBSS info
106  *
107  * 08 24 2010 cm.chang
108  * NULL
109  * Support RLM initail channel of Ad-hoc, P2P and BOW
110  *
111  * 08 20 2010 cm.chang
112  * NULL
113  * Migrate RLM code to host from FW
114  *
115  * 07 26 2010 yuche.tsai
116  *
117  * Fix compile error while enabling WiFi Direct function.
118  *
119  * 07 21 2010 yuche.tsai
120  *
121  * Add P2P Scan & Scan Result Parsing & Saving.
122  *
123  * 07 08 2010 cp.wu
124  *
125  * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
126  *
127  * 07 08 2010 cm.chang
128  * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
129  * Check draft RLM code for HT cap
130  *
131  * 05 07 2010 cm.chang
132  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
133  * Process 20/40 coexistence public action frame in AP mode
134  *
135  * 05 05 2010 cm.chang
136  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
137  * First draft support for 20/40M bandwidth for AP mode
138  *
139  * 04 24 2010 cm.chang
140  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
141  * g_aprBssInfo[] depends on CFG_SUPPORT_P2P and CFG_SUPPORT_BOW
142  *
143  * 04 13 2010 cm.chang
144  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
145  * Add more ASSERT to check exception
146  *
147  * 04 07 2010 cm.chang
148  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
149  * Add virtual test for OBSS scan
150  *
151  * 03 30 2010 cm.chang
152  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
153  * Support 2.4G OBSS scan
154  *
155  * 03 03 2010 cm.chang
156  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
157  * To support CFG_SUPPORT_BCM_STP
158  *
159  * 02 13 2010 cm.chang
160  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
161  * Support PCO in STA mode
162  *
163  * 02 12 2010 cm.chang
164  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
165  * Use bss info array for concurrent handle
166  *
167  * 02 05 2010 kevin.huang
168  * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
169  * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
170  *
171  * 01 25 2010 cm.chang
172  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
173  * Support protection and bandwidth switch
174 */
175
176 /*******************************************************************************
177 *                         C O M P I L E R   F L A G S
178 ********************************************************************************
179 */
180
181 /*******************************************************************************
182 *                    E X T E R N A L   R E F E R E N C E S
183 ********************************************************************************
184 */
185 #include "precomp.h"
186
187 /*******************************************************************************
188 *                              C O N S T A N T S
189 ********************************************************************************
190 */
191
192 /*******************************************************************************
193 *                             D A T A   T Y P E S
194 ********************************************************************************
195 */
196
197 /*******************************************************************************
198 *                            P U B L I C   D A T A
199 ********************************************************************************
200 */
201
202 /*******************************************************************************
203 *                           P R I V A T E   D A T A
204 ********************************************************************************
205 */
206
207 /*******************************************************************************
208 *                                 M A C R O S
209 ********************************************************************************
210 */
211
212 /*******************************************************************************
213 *                   F U N C T I O N   D E C L A R A T I O N S
214 ********************************************************************************
215 */
216 static VOID
217 rlmObssScanTimeout (
218     P_ADAPTER_T prAdapter,
219     UINT_32     u4Data
220     );
221
222 /*******************************************************************************
223 *                              F U N C T I O N S
224 ********************************************************************************
225 */
226
227 /*----------------------------------------------------------------------------*/
228 /*!
229 * \brief
230 *
231 * \param[in]
232 *
233 * \return none
234 */
235 /*----------------------------------------------------------------------------*/
236 VOID
237 rlmObssInit (
238     P_ADAPTER_T     prAdapter
239     )
240 {
241     P_BSS_INFO_T    prBssInfo;
242     UINT_8          ucNetIdx;
243
244     RLM_NET_FOR_EACH(ucNetIdx) {
245         prBssInfo = &prAdapter->rWifiVar.arBssInfo[ucNetIdx];
246         ASSERT(prBssInfo);
247
248         cnmTimerInitTimer(prAdapter, &prBssInfo->rObssScanTimer,
249             rlmObssScanTimeout, (UINT_32) prBssInfo);
250     } /* end of RLM_NET_FOR_EACH */
251 }
252
253 /*----------------------------------------------------------------------------*/
254 /*!
255 * \brief
256 *
257 * \param[in]
258 *
259 * \return none
260 */
261 /*----------------------------------------------------------------------------*/
262 BOOLEAN
263 rlmObssUpdateChnlLists (
264     P_ADAPTER_T prAdapter,
265     P_SW_RFB_T  prSwRfb
266     )
267 {
268     return TRUE;
269 }
270
271 /*----------------------------------------------------------------------------*/
272 /*!
273 * \brief
274 *
275 * \param[in]
276 *
277 * \return none
278 */
279 /*----------------------------------------------------------------------------*/
280 VOID
281 rlmObssScanDone (
282     P_ADAPTER_T prAdapter,
283     P_MSG_HDR_T prMsgHdr
284     )
285 {
286     P_MSG_SCN_SCAN_DONE             prScanDoneMsg;
287     P_BSS_INFO_T                    prBssInfo;
288     P_MSDU_INFO_T                   prMsduInfo;
289     P_ACTION_20_40_COEXIST_FRAME    prTxFrame;
290     UINT_16                         i, u2PayloadLen;
291
292     ASSERT(prMsgHdr);
293
294     prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) prMsgHdr;
295     prBssInfo = &prAdapter->rWifiVar.arBssInfo[prScanDoneMsg->ucNetTypeIndex];
296     ASSERT(prBssInfo);
297
298     DBGLOG(RLM, INFO, ("OBSS Scan Done (NetIdx=%d, Mode=%d)\n",
299         prScanDoneMsg->ucNetTypeIndex, prBssInfo->eCurrentOPMode));
300
301     cnmMemFree(prAdapter, prMsgHdr);
302
303 #if CFG_ENABLE_WIFI_DIRECT
304     /* AP mode */
305     if ((prAdapter->fgIsP2PRegistered) &&
306         (IS_NET_ACTIVE(prAdapter, prBssInfo->ucNetTypeIndex)) &&
307         (prBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT)) {
308         return;
309     }
310 #endif
311
312     /* STA mode */
313     if (prBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE ||
314         !RLM_NET_PARAM_VALID(prBssInfo) || prBssInfo->u2ObssScanInterval == 0) {
315         DBGLOG(RLM, WARN, ("OBSS Scan Done (NetIdx=%d) -- Aborted!!\n",
316             prBssInfo->ucNetTypeIndex));
317         return;
318     }
319
320     /* To do: check 2.4G channel list to decide if obss mgmt should be
321      *        sent to associated AP. Note: how to handle concurrent network?
322      * To do: invoke rlmObssChnlLevel() to decide if 20/40 BSS coexistence
323      *        management frame is needed.
324      */
325     if ((prBssInfo->auc2G_20mReqChnlList[0] > 0 ||
326          prBssInfo->auc2G_NonHtChnlList[0] > 0) &&
327         (prMsduInfo = (P_MSDU_INFO_T) cnmMgtPktAlloc(prAdapter,
328                       MAC_TX_RESERVED_FIELD + PUBLIC_ACTION_MAX_LEN)) != NULL) {
329
330         DBGLOG(RLM, INFO, ("Send 20/40 coexistence mgmt(20mReq=%d, NonHt=%d)\n",
331             prBssInfo->auc2G_20mReqChnlList[0],
332             prBssInfo->auc2G_NonHtChnlList[0]));
333
334         prTxFrame = (P_ACTION_20_40_COEXIST_FRAME)
335             ((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
336
337         prTxFrame->u2FrameCtrl = MAC_FRAME_ACTION;
338         COPY_MAC_ADDR(prTxFrame->aucDestAddr, prBssInfo->aucBSSID);
339         COPY_MAC_ADDR(prTxFrame->aucSrcAddr, prBssInfo->aucOwnMacAddr);
340         COPY_MAC_ADDR(prTxFrame->aucBSSID, prBssInfo->aucBSSID);
341
342         prTxFrame->ucCategory = CATEGORY_PUBLIC_ACTION;
343         prTxFrame->ucAction = ACTION_PUBLIC_20_40_COEXIST;
344
345         /* To do: find correct algorithm */
346         prTxFrame->rBssCoexist.ucId = ELEM_ID_20_40_BSS_COEXISTENCE;
347         prTxFrame->rBssCoexist.ucLength = 1;
348         prTxFrame->rBssCoexist.ucData =
349             (prBssInfo->auc2G_20mReqChnlList[0] > 0) ? BSS_COEXIST_20M_REQ : 0;
350
351         u2PayloadLen = 2 + 3;
352
353         if (prBssInfo->auc2G_NonHtChnlList[0] > 0) {
354             ASSERT(prBssInfo->auc2G_NonHtChnlList[0] <= CHNL_LIST_SZ_2G);
355
356             prTxFrame->rChnlReport.ucId = ELEM_ID_20_40_INTOLERANT_CHNL_REPORT;
357             prTxFrame->rChnlReport.ucLength =
358                 prBssInfo->auc2G_NonHtChnlList[0] + 1;
359             prTxFrame->rChnlReport.ucRegulatoryClass = 81; /* 2.4GHz, ch1~13 */
360             for (i = 0; i < prBssInfo->auc2G_NonHtChnlList[0] &&
361                  i < CHNL_LIST_SZ_2G; i++) {
362                 prTxFrame->rChnlReport.aucChannelList[i] =
363                     prBssInfo->auc2G_NonHtChnlList[i+1];
364             }
365
366             u2PayloadLen += IE_SIZE(&prTxFrame->rChnlReport);
367         }
368         ASSERT((WLAN_MAC_HEADER_LEN + u2PayloadLen) <= PUBLIC_ACTION_MAX_LEN);
369
370         /* Clear up channel lists in 2.4G band */
371         prBssInfo->auc2G_20mReqChnlList[0] = 0;
372         prBssInfo->auc2G_NonHtChnlList[0] = 0;
373
374
375         //4 Update information of MSDU_INFO_T
376         prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;   /* Management frame */
377         prMsduInfo->ucStaRecIndex = prBssInfo->prStaRecOfAP->ucIndex;
378         prMsduInfo->ucNetworkType = prBssInfo->ucNetTypeIndex;
379         prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
380         prMsduInfo->fgIs802_1x = FALSE;
381         prMsduInfo->fgIs802_11 = TRUE;
382         prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
383         prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
384         prMsduInfo->pfTxDoneHandler = NULL;
385         prMsduInfo->fgIsBasicRate = FALSE;
386
387         //4 Enqueue the frame to send this action frame.
388         nicTxEnqueueMsdu(prAdapter, prMsduInfo);
389     } /* end of prMsduInfo != NULL */
390
391     if (prBssInfo->u2ObssScanInterval > 0) {
392         DBGLOG(RLM, INFO, ("Set OBSS timer (NetIdx=%d, %d sec)\n",
393             prBssInfo->ucNetTypeIndex, prBssInfo->u2ObssScanInterval));
394
395         cnmTimerStartTimer(prAdapter, &prBssInfo->rObssScanTimer,
396             prBssInfo->u2ObssScanInterval * MSEC_PER_SEC);
397     }
398 }
399
400 /*----------------------------------------------------------------------------*/
401 /*!
402 * \brief
403 *
404 * \param[in]
405 *
406 * \return none
407 */
408 /*----------------------------------------------------------------------------*/
409 static VOID
410 rlmObssScanTimeout (
411     P_ADAPTER_T prAdapter,
412     UINT_32     u4Data
413     )
414 {
415     P_BSS_INFO_T        prBssInfo;
416
417     prBssInfo = (P_BSS_INFO_T) u4Data;
418     ASSERT(prBssInfo);
419
420 #if CFG_ENABLE_WIFI_DIRECT
421     /* AP mode */
422     if (prAdapter->fgIsP2PRegistered &&
423         (IS_NET_ACTIVE(prAdapter, prBssInfo->ucNetTypeIndex)) &&
424         (prBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT)) {
425
426         prBssInfo->fgObssActionForcedTo20M = FALSE;
427
428         /* Check if Beacon content need to be updated */
429         rlmUpdateParamsForAP(prAdapter, prBssInfo, FALSE);
430         
431         return;
432     }
433 #endif /* end of CFG_ENABLE_WIFI_DIRECT */
434
435
436     /* STA mode */
437     if (prBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE ||
438         !RLM_NET_PARAM_VALID(prBssInfo) || prBssInfo->u2ObssScanInterval == 0) {
439         DBGLOG(RLM, WARN, ("OBSS Scan timeout (NetIdx=%d) -- Aborted!!\n",
440             prBssInfo->ucNetTypeIndex));
441         return;
442     }
443
444     rlmObssTriggerScan(prAdapter, prBssInfo);
445 }
446
447 /*----------------------------------------------------------------------------*/
448 /*!
449 * \brief
450 *
451 * \param[in]
452 *
453 * \return none
454 */
455 /*----------------------------------------------------------------------------*/
456 VOID
457 rlmObssTriggerScan (
458     P_ADAPTER_T         prAdapter,
459     P_BSS_INFO_T        prBssInfo
460     )
461 {
462     P_MSG_SCN_SCAN_REQ  prScanReqMsg;
463
464     ASSERT(prBssInfo);
465
466     prScanReqMsg = (P_MSG_SCN_SCAN_REQ)
467             cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SCN_SCAN_REQ));
468     ASSERT(prScanReqMsg);
469
470     if (!prScanReqMsg) {
471         DBGLOG(RLM, WARN, ("No buf for OBSS scan (NetIdx=%d)!!\n",
472             prBssInfo->ucNetTypeIndex));
473
474         cnmTimerStartTimer(prAdapter, &prBssInfo->rObssScanTimer,
475             prBssInfo->u2ObssScanInterval * MSEC_PER_SEC);
476         return;
477     }
478
479     /* It is ok that ucSeqNum is set to fixed value because the same network
480      * OBSS scan interval is limited to OBSS_SCAN_MIN_INTERVAL (min 10 sec)
481      * and scan module don't care seqNum of OBSS scanning
482      */
483     prScanReqMsg->rMsgHdr.eMsgId = MID_RLM_SCN_SCAN_REQ;
484     prScanReqMsg->ucSeqNum = 0x33;
485     prScanReqMsg->ucNetTypeIndex = prBssInfo->ucNetTypeIndex;
486     prScanReqMsg->eScanType = SCAN_TYPE_ACTIVE_SCAN;
487     prScanReqMsg->ucSSIDType = SCAN_REQ_SSID_WILDCARD;
488     prScanReqMsg->ucSSIDLength = 0;
489     prScanReqMsg->eScanChannel = SCAN_CHANNEL_2G4;
490     prScanReqMsg->u2IELen = 0;
491
492     mboxSendMsg(prAdapter,
493                 MBOX_ID_0,
494                 (P_MSG_HDR_T) prScanReqMsg,
495                 MSG_SEND_METHOD_BUF);
496
497     DBGLOG(RLM, INFO, ("Timeout to trigger OBSS scan (NetIdx=%d)!!\n",
498         prBssInfo->ucNetTypeIndex));
499 }
500
501