support different wifi bt chip auto compatible
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / mt5931_kk / drv_wlan / mgmt / rlm.c
1 /*
2 ** $Id: //Department/DaVinci/BRANCHES/MT662X_593X_WIFI_DRIVER_V2_3/mgmt/rlm.c#1 $
3 */
4
5 /*! \file   "rlm.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.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  * Check length HT cap IE about RX associate request frame
62  *
63  * 11 10 2011 cm.chang
64  * NULL
65  * Modify debug message for XLOG
66  *
67  * 11 08 2011 cm.chang
68  * NULL
69  * Add RLM and CNM debug message for XLOG
70  *
71  * 11 03 2011 cm.chang
72  * [WCXRP00000997] [MT6620 Wi-Fi][Driver][FW] Handle change of BSS preamble type and slot time
73  * Fix preamble type of STA mode
74  *
75  * 10 25 2011 cm.chang
76  * [WCXRP00001058] [All Wi-Fi][Driver] Fix sta_rec's phyTypeSet and OBSS scan in AP mode
77  * Not send ERP IE if peer STA is 802.11b-only
78  *
79  * 10 11 2011 cm.chang
80  * [WCXRP00001031] [All Wi-Fi][Driver] Check HT IE length to avoid wrong SCO parameter
81  * Ignore HT OP IE if its length field is not valid
82  *
83  * 09 28 2011 cm.chang
84  * NULL
85  * Add length check to reduce possibility to adopt wrong IE
86  *
87  * 09 20 2011 cm.chang
88  * [WCXRP00000997] [MT6620 Wi-Fi][Driver][FW] Handle change of BSS preamble type and slot time
89  * Handle client mode about preamble type and slot time
90  *
91  * 09 01 2011 cm.chang
92  * [WCXRP00000971] [MT6620 Wi-Fi][Driver][FW] Not set Beacon timeout interval when CPTT
93  * Final channel number only adopts the field from assoc response
94  *
95  * 06 10 2011 cm.chang
96  * [WCXRP00000773] [MT6620 Wi-Fi][Driver] Workaround some AP fill primary channel field with its secondary channel
97  * If DS IE exists, ignore the primary channel field in HT OP IE
98  *
99  * 05 03 2011 cm.chang
100  * [WCXRP00000691] [MT6620 Wi-Fi][Driver] Workaround about AP's wrong HT capability IE to have wrong channel number
101  * Fix compiling error
102  *
103  * 05 02 2011 cm.chang
104  * [WCXRP00000691] [MT6620 Wi-Fi][Driver] Workaround about AP's wrong HT capability IE to have wrong channel number
105  * Refine range of valid channel number
106  *
107  * 05 02 2011 cm.chang
108  * [WCXRP00000691] [MT6620 Wi-Fi][Driver] Workaround about AP's wrong HT capability IE to have wrong channel number
109  * Check if channel is valided before record ing BSS channel
110  *
111  * 04 14 2011 cm.chang
112  * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
113  * .
114  *
115  * 04 12 2011 cm.chang
116  * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
117  * .
118  *
119  * 03 29 2011 cm.chang
120  * [WCXRP00000606] [MT6620 Wi-Fi][Driver][FW] Fix klocwork warning
121  * As CR title
122  *
123  * 01 24 2011 cm.chang
124  * [WCXRP00000384] [MT6620 Wi-Fi][Driver][FW] Handle 20/40 action frame in AP mode and stop ampdu timer when sta_rec is freed
125  * Process received 20/40 coexistence action frame for AP mode
126  *
127  * 12 13 2010 cp.wu
128  * [WCXRP00000260] [MT6620 Wi-Fi][Driver][Firmware] Create V1.1 branch for both firmware and driver
129  * create branch for Wi-Fi driver v1.1
130  *
131  * 12 07 2010 cm.chang
132  * [WCXRP00000239] MT6620 Wi-Fi][Driver][FW] Merge concurrent branch back to maintrunk
133  * 1. BSSINFO include RLM parameter
134  * 2. free all sta records when network is disconnected
135  *
136  * 12 07 2010 cm.chang
137  * [WCXRP00000238] MT6620 Wi-Fi][Driver][FW] Support regulation domain setting from NVRAM and supplicant
138  * 1. Country code is from NVRAM or supplicant
139  * 2. Change band definition in CMD/EVENT.
140  *
141  * 10 15 2010 cm.chang
142  * [WCXRP00000094] [MT6620 Wi-Fi][Driver] Connect to 2.4GHz AP, Driver crash.
143  * Add exception handle when no mgmt buffer in free build
144  *
145  * 10 08 2010 cm.chang
146  * NULL
147  * When 20M only setting, ignore OBSS IE
148  *
149  * 09 16 2010 cm.chang
150  * NULL
151  * Change conditional compiling options for BOW
152  *
153  * 09 10 2010 cm.chang
154  * NULL
155  * Always update Beacon content if FW sync OBSS info
156  *
157  * 09 03 2010 kevin.huang
158  * NULL
159  * Refine #include sequence and solve recursive/nested #include issue
160  *
161  * 08 24 2010 cm.chang
162  * NULL
163  * Support RLM initail channel of Ad-hoc, P2P and BOW
164  *
165  * 08 23 2010 cp.wu
166  * NULL
167  * revise constant definitions to be matched with implementation (original cmd-event definition is deprecated)
168  *
169  * 08 23 2010 chinghwa.yu
170  * NULL
171  * Temporary add rlmUpdateParamByStaForBow() and rlmBssInitForBow().
172  *
173  * 08 23 2010 chinghwa.yu
174  * NULL
175  * Add CFG_ENABLE_BT_OVER_WIFI.
176  *
177  * 08 23 2010 chinghwa.yu
178  * NULL
179  * Update for BOW.
180  *
181  * 08 20 2010 cm.chang
182  * NULL
183  * Migrate RLM code to host from FW
184  *
185  * 08 02 2010 yuche.tsai
186  * NULL
187  * P2P Group Negotiation Code Check in.
188  *
189  * 07 26 2010 yuche.tsai
190  *
191  * Fix compile error while enabling WiFi Direct function.
192  *
193  * 07 21 2010 yuche.tsai
194  *
195  * Add P2P Scan & Scan Result Parsing & Saving.
196  *
197  * 07 19 2010 cm.chang
198  *
199  * Set RLM parameters and enable CNM channel manager
200  *
201  * 07 08 2010 cp.wu
202  *
203  * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
204  *
205  * 07 08 2010 cp.wu
206  * [WPD00003833][MT6620 and MT5931] Driver migration
207  * take use of RLM module for parsing/generating HT IEs for 11n capability
208  *
209  * 07 08 2010 cm.chang
210  * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
211  * Check draft RLM code for HT cap
212  *
213  * 06 05 2010 cm.chang
214  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
215  * Fix channel ID definition in RFB status to primary channel instead of center channel
216  *
217  * 06 02 2010 cm.chang
218  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
219  * Add TX short GI compiling option
220  *
221  * 06 02 2010 chinghwa.yu
222  * [BORA00000563]Add WiFi CoEx BCM module
223  * Roll back to remove CFG_SUPPORT_BCM_TEST.
224  *
225  * 06 01 2010 chinghwa.yu
226  * [BORA00000563]Add WiFi CoEx BCM module
227  * Update BCM Test and RW configuration.
228  *
229  * 05 31 2010 cm.chang
230  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
231  * Add some compiling options to control 11n functions
232  *
233  * 05 28 2010 cm.chang
234  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
235  * Set RTS threshold of 2K bytes initially
236  *
237  * 05 18 2010 cm.chang
238  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
239  * Ad-hoc Beacon should not carry HT OP and OBSS IEs
240  *
241  * 05 07 2010 cm.chang
242  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
243  * Process 20/40 coexistence public action frame in AP mode
244  *
245  * 05 05 2010 cm.chang
246  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
247  * First draft support for 20/40M bandwidth for AP mode
248  *
249  * 04 24 2010 cm.chang
250  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
251  * g_aprBssInfo[] depends on CFG_SUPPORT_P2P and CFG_SUPPORT_BOW
252  *
253  * 04 22 2010 cm.chang
254  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
255  * First draft code to support protection in AP mode
256  *
257  * 04 13 2010 cm.chang
258  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
259  * Utilize status of swRfb to know channel number and band
260  *
261  * 04 07 2010 cm.chang
262  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
263  * Different invoking order for WTBL entry of associated AP
264  *
265  * 04 07 2010 cm.chang
266  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
267  * Add virtual test for OBSS scan
268  *
269  * 04 02 2010 cm.chang
270  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
271  * Process Beacon only ready for infra STA now
272  *
273  * 03 30 2010 cm.chang
274  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
275  * Support 2.4G OBSS scan
276  *
277  * 03 24 2010 cm.chang
278  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
279  * Not carry  HT cap when being associated with b/g only AP
280  *
281  * 03 24 2010 wh.su
282  * [BORA00000605][WIFISYS] Phase3 Integration
283  * fixed some WHQL testing error.
284  *
285  * 03 15 2010 cm.chang
286  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
287  * Provide draft measurement and quiet functions
288  *
289  * 03 09 2010 cm.chang
290  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
291  * If bss is not 11n network, zero WTBL HT parameters
292  *
293  * 03 03 2010 cm.chang
294  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
295  * To support CFG_SUPPORT_BCM_STP
296  *
297  * 03 02 2010 cm.chang
298  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
299  * Generate HT IE only depending on own phyTypeSet
300  *
301  * 03 02 2010 cm.chang
302  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
303  * Not fill HT related IE if BssInfo does not include 11n phySet
304  *
305  * 03 01 2010 tehuang.liu
306  * [BORA00000569][WIFISYS] Phase 2 Integration Test
307  * To store field AMPDU Parameters in STA_REC
308  *
309  * 02 26 2010 cm.chang
310  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
311  * Enable RDG RX, but disable RDG TX for IOT and LongNAV
312  *
313  * 02 12 2010 cm.chang
314  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
315  * Use bss info array for concurrent handle
316  *
317  * 02 05 2010 kevin.huang
318  * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
319  * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
320  *
321  * 01 22 2010 cm.chang
322  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
323  * Support protection and bandwidth switch
324  *
325  * 01 07 2010 kevin.huang
326  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
327  * Modify the parameter of rlmRecAssocRspHtInfo function
328  *
329  * 12 18 2009 cm.chang
330  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
331  * .
332  *
333  * Dec 12 2009 mtk01104
334  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
335  * Fix prBssInfo->ucPrimaryChannel handle for assoc resp
336  *
337  * Dec 9 2009 mtk01104
338  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
339  * Add some function to process HT operation
340  *
341  * Nov 28 2009 mtk01104
342  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
343  * Call rlmStatisticsInit() to handle MIB counters
344  *
345  * Nov 18 2009 mtk01104
346  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
347  *
348  *
349 **
350 */
351
352 /*******************************************************************************
353 *                         C O M P I L E R   F L A G S
354 ********************************************************************************
355 */
356
357 /*******************************************************************************
358 *                    E X T E R N A L   R E F E R E N C E S
359 ********************************************************************************
360 */
361 #include "precomp.h"
362
363 /*******************************************************************************
364 *                              C O N S T A N T S
365 ********************************************************************************
366 */
367
368 /*******************************************************************************
369 *                             D A T A   T Y P E S
370 ********************************************************************************
371 */
372
373 /*******************************************************************************
374 *                            P U B L I C   D A T A
375 ********************************************************************************
376 */
377
378 /*******************************************************************************
379 *                           P R I V A T E   D A T A
380 ********************************************************************************
381 */
382
383 /*******************************************************************************
384 *                                 M A C R O S
385 ********************************************************************************
386 */
387
388 /*******************************************************************************
389 *                   F U N C T I O N   D E C L A R A T I O N S
390 ********************************************************************************
391 */
392 static VOID
393 rlmFillHtCapIE (
394     P_ADAPTER_T     prAdapter,
395     P_BSS_INFO_T    prBssInfo,
396     P_MSDU_INFO_T   prMsduInfo
397     );
398
399 static VOID
400 rlmFillExtCapIE (
401     P_ADAPTER_T     prAdapter,
402     P_BSS_INFO_T    prBssInfo,
403     P_MSDU_INFO_T   prMsduInfo
404     );
405
406 static VOID
407 rlmFillHtOpIE (
408     P_ADAPTER_T         prAdapter,
409     P_BSS_INFO_T        prBssInfo,
410     P_MSDU_INFO_T       prMsduInfo
411     );
412
413 static UINT_8
414 rlmRecIeInfoForClient (
415     P_ADAPTER_T         prAdapter,
416     P_BSS_INFO_T        prBssInfo,
417     PUINT_8             pucIE,
418     UINT_16             u2IELength
419     );
420
421 static BOOLEAN
422 rlmRecBcnFromNeighborForClient (
423     P_ADAPTER_T         prAdapter,
424     P_BSS_INFO_T        prBssInfo,
425     P_SW_RFB_T          prSwRfb,
426     PUINT_8             pucIE,
427     UINT_16             u2IELength
428     );
429
430 static BOOLEAN
431 rlmRecBcnInfoForClient (
432     P_ADAPTER_T         prAdapter,
433     P_BSS_INFO_T        prBssInfo,
434     P_SW_RFB_T          prSwRfb,
435     PUINT_8             pucIE,
436     UINT_16             u2IELength
437     );
438
439 static VOID
440 rlmBssReset (
441     P_ADAPTER_T         prAdapter,
442     P_BSS_INFO_T        prBssInfo
443     );
444
445 /*******************************************************************************
446 *                              F U N C T I O N S
447 ********************************************************************************
448 */
449
450 /*----------------------------------------------------------------------------*/
451 /*!
452 * \brief
453 *
454 * \param[in]
455 *
456 * \return none
457 */
458 /*----------------------------------------------------------------------------*/
459 VOID
460 rlmFsmEventInit (
461     P_ADAPTER_T     prAdapter
462     )
463 {
464     ASSERT(prAdapter);
465
466     /* Note: assume TIMER_T structures are reset to zero or stopped
467      * before invoking this function.
468      */
469
470     /* Initialize OBSS FSM */
471     rlmObssInit(prAdapter);
472 }
473
474 /*----------------------------------------------------------------------------*/
475 /*!
476 * \brief
477 *
478 * \param[in]
479 *
480 * \return none
481 */
482 /*----------------------------------------------------------------------------*/
483 VOID
484 rlmFsmEventUninit (
485     P_ADAPTER_T     prAdapter
486     )
487 {
488     P_BSS_INFO_T    prBssInfo;
489     UINT_8          ucNetIdx;
490
491     ASSERT(prAdapter);
492
493     RLM_NET_FOR_EACH(ucNetIdx) {
494         prBssInfo = &prAdapter->rWifiVar.arBssInfo[ucNetIdx];
495         ASSERT(prBssInfo);
496
497         /* Note: all RLM timers will also be stopped.
498          *       Now only one OBSS scan timer.
499          */
500         rlmBssReset(prAdapter, prBssInfo);
501     }
502 }
503
504 /*----------------------------------------------------------------------------*/
505 /*!
506 * \brief For probe request, association request
507 *
508 * \param[in]
509 *
510 * \return none
511 */
512 /*----------------------------------------------------------------------------*/
513 VOID
514 rlmReqGenerateHtCapIE (
515     P_ADAPTER_T     prAdapter,
516     P_MSDU_INFO_T   prMsduInfo
517     )
518 {
519     P_BSS_INFO_T    prBssInfo;
520     P_STA_RECORD_T  prStaRec;
521
522     ASSERT(prAdapter);
523     ASSERT(prMsduInfo);
524
525     prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
526     ASSERT(prBssInfo);
527
528     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
529
530     if ((prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11N) &&
531         (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
532
533         rlmFillHtCapIE(prAdapter, prBssInfo, prMsduInfo);
534     }
535 }
536
537 /*----------------------------------------------------------------------------*/
538 /*!
539 * \brief For probe request, association request
540 *
541 * \param[in]
542 *
543 * \return none
544 */
545 /*----------------------------------------------------------------------------*/
546 VOID
547 rlmReqGenerateExtCapIE (
548     P_ADAPTER_T     prAdapter,
549     P_MSDU_INFO_T   prMsduInfo
550     )
551 {
552     P_BSS_INFO_T    prBssInfo;
553     P_STA_RECORD_T  prStaRec;
554
555     ASSERT(prAdapter);
556     ASSERT(prMsduInfo);
557
558     prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
559     ASSERT(prBssInfo);
560
561     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
562
563     if ((prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11N) &&
564         (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
565
566         rlmFillExtCapIE(prAdapter, prBssInfo, prMsduInfo);
567     }
568 }
569
570 /*----------------------------------------------------------------------------*/
571 /*!
572 * \brief For probe response (GO, IBSS) and association response
573 *
574 * \param[in]
575 *
576 * \return none
577 */
578 /*----------------------------------------------------------------------------*/
579 VOID
580 rlmRspGenerateHtCapIE (
581     P_ADAPTER_T     prAdapter,
582     P_MSDU_INFO_T   prMsduInfo
583     )
584 {
585     P_BSS_INFO_T    prBssInfo;
586     P_STA_RECORD_T  prStaRec;
587
588     ASSERT(prAdapter);
589     ASSERT(prMsduInfo);
590     ASSERT(IS_NET_ACTIVE(prAdapter, prMsduInfo->ucNetworkType));
591
592     prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
593     ASSERT(prBssInfo);
594
595     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
596
597     if (RLM_NET_IS_11N(prBssInfo) &&
598         (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
599
600         rlmFillHtCapIE(prAdapter, prBssInfo, prMsduInfo);
601     }
602 }
603
604 /*----------------------------------------------------------------------------*/
605 /*!
606 * \brief For probe response (GO, IBSS) and association response
607 *
608 * \param[in]
609 *
610 * \return none
611 */
612 /*----------------------------------------------------------------------------*/
613 VOID
614 rlmRspGenerateExtCapIE (
615     P_ADAPTER_T     prAdapter,
616     P_MSDU_INFO_T   prMsduInfo
617     )
618 {
619     P_BSS_INFO_T    prBssInfo;
620     P_STA_RECORD_T  prStaRec;
621
622     ASSERT(prAdapter);
623     ASSERT(prMsduInfo);
624     ASSERT(IS_NET_ACTIVE(prAdapter, prMsduInfo->ucNetworkType));
625
626     prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
627     ASSERT(prBssInfo);
628
629     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
630
631     if (RLM_NET_IS_11N(prBssInfo) &&
632         (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
633
634         rlmFillExtCapIE(prAdapter, prBssInfo, prMsduInfo);
635     }
636 }
637
638 /*----------------------------------------------------------------------------*/
639 /*!
640 * \brief For probe response (GO, IBSS) and association response
641 *
642 * \param[in]
643 *
644 * \return none
645 */
646 /*----------------------------------------------------------------------------*/
647 VOID
648 rlmRspGenerateHtOpIE (
649     P_ADAPTER_T     prAdapter,
650     P_MSDU_INFO_T   prMsduInfo
651     )
652 {
653     P_BSS_INFO_T    prBssInfo;
654     P_STA_RECORD_T  prStaRec;
655
656     ASSERT(prAdapter);
657     ASSERT(prMsduInfo);
658     ASSERT(IS_NET_ACTIVE(prAdapter, prMsduInfo->ucNetworkType));
659
660     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
661
662     prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
663     ASSERT(prBssInfo);
664
665     if (RLM_NET_IS_11N(prBssInfo) &&
666         (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N))) {
667
668         rlmFillHtOpIE(prAdapter, prBssInfo, prMsduInfo);
669     }
670 }
671
672 /*----------------------------------------------------------------------------*/
673 /*!
674 * \brief For probe response (GO, IBSS) and association response
675 *
676 * \param[in]
677 *
678 * \return none
679 */
680 /*----------------------------------------------------------------------------*/
681 VOID
682 rlmRspGenerateErpIE (
683     P_ADAPTER_T     prAdapter,
684     P_MSDU_INFO_T   prMsduInfo
685     )
686 {
687     P_BSS_INFO_T    prBssInfo;
688     P_STA_RECORD_T  prStaRec;
689     P_IE_ERP_T      prErpIe;
690
691     ASSERT(prAdapter);
692     ASSERT(prMsduInfo);
693     ASSERT(IS_NET_ACTIVE(prAdapter, prMsduInfo->ucNetworkType));
694
695     prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
696
697     prBssInfo = &prAdapter->rWifiVar.arBssInfo[prMsduInfo->ucNetworkType];
698     ASSERT(prBssInfo);
699
700     if (RLM_NET_IS_11GN(prBssInfo) && prBssInfo->eBand == BAND_2G4 &&
701         (!prStaRec || (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11GN))) {
702         prErpIe = (P_IE_ERP_T)
703                 (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
704
705         /* Add ERP IE */
706         prErpIe->ucId = ELEM_ID_ERP_INFO;
707         prErpIe->ucLength = 1;
708
709         prErpIe->ucERP = prBssInfo->fgObssErpProtectMode ?
710             ERP_INFO_USE_PROTECTION : 0;
711
712         if (prBssInfo->fgErpProtectMode) {
713             prErpIe->ucERP |=
714                 (ERP_INFO_NON_ERP_PRESENT | ERP_INFO_USE_PROTECTION);
715         }
716
717         /* Handle barker preamble */
718         if (!prBssInfo->fgUseShortPreamble) {
719             prErpIe->ucERP |= ERP_INFO_BARKER_PREAMBLE_MODE;
720         }
721
722         ASSERT(IE_SIZE(prErpIe) <= (ELEM_HDR_LEN+ ELEM_MAX_LEN_ERP));
723
724         prMsduInfo->u2FrameLength += IE_SIZE(prErpIe);
725     }
726 }
727
728 /*----------------------------------------------------------------------------*/
729 /*!
730 * \brief
731 *
732 * \param[in]
733 *
734 * \return none
735 */
736 /*----------------------------------------------------------------------------*/
737 static VOID
738 rlmFillHtCapIE (
739     P_ADAPTER_T     prAdapter,
740     P_BSS_INFO_T    prBssInfo,
741     P_MSDU_INFO_T   prMsduInfo
742     )
743 {
744     P_IE_HT_CAP_T           prHtCap;
745     P_SUP_MCS_SET_FIELD     prSupMcsSet;
746     BOOLEAN                 fg40mAllowed;
747
748     ASSERT(prAdapter);
749     ASSERT(prBssInfo);
750     ASSERT(prMsduInfo);
751
752     fg40mAllowed = prBssInfo->fgAssoc40mBwAllowed;
753
754     prHtCap = (P_IE_HT_CAP_T)
755               (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
756
757     /* Add HT capabilities IE */
758     prHtCap->ucId = ELEM_ID_HT_CAP;
759     prHtCap->ucLength = sizeof(IE_HT_CAP_T) - ELEM_HDR_LEN;
760
761     prHtCap->u2HtCapInfo = HT_CAP_INFO_DEFAULT_VAL;
762     if (!fg40mAllowed) {
763         prHtCap->u2HtCapInfo &= ~(HT_CAP_INFO_SUP_CHNL_WIDTH |
764             HT_CAP_INFO_SHORT_GI_40M | HT_CAP_INFO_DSSS_CCK_IN_40M);
765     }
766     if (prAdapter->rWifiVar.rConnSettings.fgRxShortGIDisabled) {
767         prHtCap->u2HtCapInfo &=
768             ~(HT_CAP_INFO_SHORT_GI_20M | HT_CAP_INFO_SHORT_GI_40M);
769     }
770
771     prHtCap->ucAmpduParam = AMPDU_PARAM_DEFAULT_VAL;
772
773     prSupMcsSet = &prHtCap->rSupMcsSet;
774     kalMemZero((PVOID)&prSupMcsSet->aucRxMcsBitmask[0],
775                 SUP_MCS_RX_BITMASK_OCTET_NUM);
776
777     prSupMcsSet->aucRxMcsBitmask[0] = BITS(0, 7);
778
779     if (fg40mAllowed) {
780         prSupMcsSet->aucRxMcsBitmask[32/8] = BIT(0); /* MCS32 */
781     }
782     prSupMcsSet->u2RxHighestSupportedRate = SUP_MCS_RX_DEFAULT_HIGHEST_RATE;
783     prSupMcsSet->u4TxRateInfo = SUP_MCS_TX_DEFAULT_VAL;
784
785     prHtCap->u2HtExtendedCap = HT_EXT_CAP_DEFAULT_VAL;
786     if (!fg40mAllowed || prBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE) {
787         prHtCap->u2HtExtendedCap &=
788             ~(HT_EXT_CAP_PCO | HT_EXT_CAP_PCO_TRANS_TIME_NONE);
789     }
790
791     prHtCap->u4TxBeamformingCap = TX_BEAMFORMING_CAP_DEFAULT_VAL;
792
793     prHtCap->ucAselCap = ASEL_CAP_DEFAULT_VAL;
794
795
796     ASSERT(IE_SIZE(prHtCap) <= (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP));
797
798     prMsduInfo->u2FrameLength += IE_SIZE(prHtCap);
799 }
800
801 /*----------------------------------------------------------------------------*/
802 /*!
803 * \brief
804 *
805 * \param[in]
806 *
807 * \return none
808 */
809 /*----------------------------------------------------------------------------*/
810 static VOID
811 rlmFillExtCapIE (
812     P_ADAPTER_T     prAdapter,
813     P_BSS_INFO_T    prBssInfo,
814     P_MSDU_INFO_T   prMsduInfo
815     )
816 {
817     P_EXT_CAP_T     prExtCap;
818     BOOLEAN         fg40mAllowed;
819
820     ASSERT(prAdapter);
821     ASSERT(prMsduInfo);
822
823     fg40mAllowed = prBssInfo->fgAssoc40mBwAllowed;
824
825     /* Add Extended Capabilities IE */
826     prExtCap = (P_EXT_CAP_T)
827                (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
828
829     prExtCap->ucId = ELEM_ID_EXTENDED_CAP;
830     prExtCap->ucLength = 1;
831     prExtCap->aucCapabilities[0] = ELEM_EXT_CAP_DEFAULT_VAL;
832
833     if (!fg40mAllowed) {
834         prExtCap->aucCapabilities[0] &= ~ELEM_EXT_CAP_20_40_COEXIST_SUPPORT;
835     }
836
837     if (prBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE) {
838         prExtCap->aucCapabilities[0] &= ~ELEM_EXT_CAP_PSMP_CAP;
839     }
840
841     ASSERT(IE_SIZE(prExtCap) <= (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP));
842
843     prMsduInfo->u2FrameLength += IE_SIZE(prExtCap);
844 }
845
846 /*----------------------------------------------------------------------------*/
847 /*!
848 * \brief
849 *
850 * \param[in]
851 *
852 * \return none
853 */
854 /*----------------------------------------------------------------------------*/
855 static VOID
856 rlmFillHtOpIE (
857     P_ADAPTER_T     prAdapter,
858     P_BSS_INFO_T    prBssInfo,
859     P_MSDU_INFO_T   prMsduInfo
860     )
861 {
862     P_IE_HT_OP_T        prHtOp;
863     UINT_16             i;
864
865     ASSERT(prAdapter);
866     ASSERT(prBssInfo);
867     ASSERT(prMsduInfo);
868
869     prHtOp = (P_IE_HT_OP_T)
870              (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
871
872     /* Add HT operation IE */
873     prHtOp->ucId = ELEM_ID_HT_OP;
874     prHtOp->ucLength = sizeof(IE_HT_OP_T) - ELEM_HDR_LEN;
875
876     /* RIFS and 20/40 bandwidth operations are included */
877     prHtOp->ucPrimaryChannel = prBssInfo->ucPrimaryChannel;
878     prHtOp->ucInfo1 = prBssInfo->ucHtOpInfo1;
879
880     /* Decide HT protection mode field */
881     if (prBssInfo->eHtProtectMode == HT_PROTECT_MODE_NON_HT) {
882         prHtOp->u2Info2 = (UINT_8) HT_PROTECT_MODE_NON_HT;
883     }
884     else if (prBssInfo->eObssHtProtectMode == HT_PROTECT_MODE_NON_MEMBER) {
885         prHtOp->u2Info2 = (UINT_8) HT_PROTECT_MODE_NON_MEMBER;
886     }
887     else {
888         /* It may be SYS_PROTECT_MODE_NONE or SYS_PROTECT_MODE_20M */
889         prHtOp->u2Info2 = (UINT_8) prBssInfo->eHtProtectMode;
890     }
891
892     if (prBssInfo->eGfOperationMode != GF_MODE_NORMAL) {
893         /* It may be GF_MODE_PROTECT or GF_MODE_DISALLOWED
894          * Note: it will also be set in ad-hoc network
895          */
896         prHtOp->u2Info2 |= HT_OP_INFO2_NON_GF_HT_STA_PRESENT;
897     }
898
899     if (0 /* Regulatory class 16 */ &&
900         prBssInfo->eObssHtProtectMode == HT_PROTECT_MODE_NON_MEMBER) {
901         /* (TBD) It is HT_PROTECT_MODE_NON_MEMBER, so require protection
902          * although it is possible to have no protection by spec.
903          */
904         prHtOp->u2Info2 |= HT_OP_INFO2_OBSS_NON_HT_STA_PRESENT;
905     }
906
907     prHtOp->u2Info3 = prBssInfo->u2HtOpInfo3;   /* To do: handle L-SIG TXOP */
908
909     /* No basic MCSx are needed temporarily */
910     for (i = 0; i < 16; i++) {
911         prHtOp->aucBasicMcsSet[i] = 0;
912     }
913
914     ASSERT(IE_SIZE(prHtOp) <= (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_OP));
915
916     prMsduInfo->u2FrameLength += IE_SIZE(prHtOp);
917 }
918
919 /*----------------------------------------------------------------------------*/
920 /*!
921 * \brief This function should be invoked to update parameters of associated AP.
922 *        (Association response and Beacon)
923 *
924 * \param[in]
925 *
926 * \return none
927 */
928 /*----------------------------------------------------------------------------*/
929 static UINT_8
930 rlmRecIeInfoForClient (
931     P_ADAPTER_T         prAdapter,
932     P_BSS_INFO_T        prBssInfo,
933     PUINT_8             pucIE,
934     UINT_16             u2IELength
935     )
936 {
937     UINT_16                 u2Offset;
938     P_STA_RECORD_T          prStaRec;
939     P_IE_HT_CAP_T           prHtCap;
940     P_IE_HT_OP_T            prHtOp;
941     P_IE_OBSS_SCAN_PARAM_T  prObssScnParam;
942     UINT_8                  ucERP, ucPrimaryChannel;
943 #if CFG_SUPPORT_QUIET && 0
944     BOOLEAN                 fgHasQuietIE = FALSE;
945 #endif
946
947     ASSERT(prAdapter);
948     ASSERT(prBssInfo);
949     ASSERT(pucIE);
950
951     prStaRec = prBssInfo->prStaRecOfAP;
952     ASSERT(prStaRec);
953     if (!prStaRec) {
954         return 0;
955     }
956
957     prBssInfo->fgUseShortPreamble = prBssInfo->fgIsShortPreambleAllowed;
958     ucPrimaryChannel = 0;
959     prObssScnParam = NULL;
960
961     /* Note: HT-related members in staRec may not be zero before, so
962      *       if following IE does not exist, they are still not zero.
963      *       These HT-related parameters are vaild only when the corresponding
964      *       BssInfo supports 802.11n, i.e., RLM_NET_IS_11N()
965      */
966     IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
967         switch (IE_ID(pucIE)) {
968         case ELEM_ID_HT_CAP:
969             if (!RLM_NET_IS_11N(prBssInfo) ||
970                 IE_LEN(pucIE) != (sizeof(IE_HT_CAP_T) - 2)) {
971                 break;
972             }
973             prHtCap = (P_IE_HT_CAP_T) pucIE;
974             prStaRec->ucMcsSet = prHtCap->rSupMcsSet.aucRxMcsBitmask[0];
975             prStaRec->fgSupMcs32 =
976                 (prHtCap->rSupMcsSet.aucRxMcsBitmask[32/8] & BIT(0)) ?
977                 TRUE : FALSE;
978
979             prStaRec->u2HtCapInfo = prHtCap->u2HtCapInfo;
980             prStaRec->ucAmpduParam = prHtCap->ucAmpduParam;
981             prStaRec->u2HtExtendedCap = prHtCap->u2HtExtendedCap;
982             prStaRec->u4TxBeamformingCap = prHtCap->u4TxBeamformingCap;
983             prStaRec->ucAselCap = prHtCap->ucAselCap;
984             break;
985
986         case ELEM_ID_HT_OP:
987             if (!RLM_NET_IS_11N(prBssInfo) ||
988                 IE_LEN(pucIE) != (sizeof(IE_HT_OP_T) - 2)) {
989                 break;
990             }
991             prHtOp = (P_IE_HT_OP_T) pucIE;
992             /* Workaround that some APs fill primary channel field by its
993              * secondary channel, but its DS IE is correct 20110610
994              */
995             if (ucPrimaryChannel == 0) {
996                 ucPrimaryChannel = prHtOp->ucPrimaryChannel;
997             }
998             prBssInfo->ucHtOpInfo1 = prHtOp->ucInfo1;
999             prBssInfo->u2HtOpInfo2 = prHtOp->u2Info2;
1000             prBssInfo->u2HtOpInfo3 = prHtOp->u2Info3;
1001
1002             if (!prBssInfo->fg40mBwAllowed) {
1003                 prBssInfo->ucHtOpInfo1 &=
1004                     ~(HT_OP_INFO1_SCO | HT_OP_INFO1_STA_CHNL_WIDTH);
1005             }
1006
1007             if ((prBssInfo->ucHtOpInfo1 & HT_OP_INFO1_SCO) != CHNL_EXT_RES) {
1008                 prBssInfo->eBssSCO = (ENUM_CHNL_EXT_T)
1009                         (prBssInfo->ucHtOpInfo1 & HT_OP_INFO1_SCO);
1010             }
1011
1012             prBssInfo->eHtProtectMode = (ENUM_HT_PROTECT_MODE_T)
1013                 (prBssInfo->u2HtOpInfo2 & HT_OP_INFO2_HT_PROTECTION);
1014
1015             /* To do: process regulatory class 16 */
1016             if ((prBssInfo->u2HtOpInfo2 & HT_OP_INFO2_OBSS_NON_HT_STA_PRESENT)
1017                 && 0 /* && regulatory class is 16 */) {
1018                 prBssInfo->eGfOperationMode = GF_MODE_DISALLOWED;
1019             }
1020             else if (prBssInfo->u2HtOpInfo2&HT_OP_INFO2_NON_GF_HT_STA_PRESENT) {
1021                 prBssInfo->eGfOperationMode = GF_MODE_PROTECT;
1022             }
1023             else {
1024                 prBssInfo->eGfOperationMode = GF_MODE_NORMAL;
1025             }
1026
1027             prBssInfo->eRifsOperationMode =
1028                 (prBssInfo->ucHtOpInfo1 & HT_OP_INFO1_RIFS_MODE) ?
1029                 RIFS_MODE_NORMAL : RIFS_MODE_DISALLOWED;
1030
1031             break;
1032
1033         case ELEM_ID_20_40_BSS_COEXISTENCE:
1034             if (!RLM_NET_IS_11N(prBssInfo)) {
1035                 break;
1036             }
1037             /* To do: store if scanning exemption grant to BssInfo */
1038             break;
1039
1040         case ELEM_ID_OBSS_SCAN_PARAMS:
1041             if (!RLM_NET_IS_11N(prBssInfo) ||
1042                 IE_LEN(pucIE) != (sizeof(IE_OBSS_SCAN_PARAM_T) - 2)) {
1043                 break;
1044             }
1045             /* Store OBSS parameters to BssInfo */
1046             prObssScnParam = (P_IE_OBSS_SCAN_PARAM_T) pucIE;
1047             break;
1048
1049         case ELEM_ID_EXTENDED_CAP:
1050             if (!RLM_NET_IS_11N(prBssInfo)) {
1051                 break;
1052             }
1053             /* To do: store extended capability (PSMP, coexist) to BssInfo */
1054             break;
1055
1056         case ELEM_ID_ERP_INFO:
1057             if (IE_LEN(pucIE) != (sizeof(IE_ERP_T) - 2) ||
1058                 prBssInfo->eBand != BAND_2G4) {
1059                 break;
1060             }
1061             ucERP = ERP_INFO_IE(pucIE)->ucERP;
1062             prBssInfo->fgErpProtectMode =
1063                     (ucERP & ERP_INFO_USE_PROTECTION) ? TRUE : FALSE;
1064
1065             if (ucERP & ERP_INFO_BARKER_PREAMBLE_MODE) {
1066                 prBssInfo->fgUseShortPreamble = FALSE;
1067             }
1068             break;
1069
1070         case ELEM_ID_DS_PARAM_SET:
1071             if (IE_LEN(pucIE) == ELEM_MAX_LEN_DS_PARAMETER_SET) {
1072                 ucPrimaryChannel = DS_PARAM_IE(pucIE)->ucCurrChnl;
1073             }
1074             break;
1075
1076     #if CFG_SUPPORT_QUIET && 0
1077         /* Note: RRM code should be moved to independent RRM function by
1078          *       component design rule. But we attach it to RLM temporarily
1079          */
1080         case ELEM_ID_QUIET:
1081             rrmQuietHandleQuietIE(prBssInfo, (P_IE_QUIET_T) pucIE);
1082             fgHasQuietIE = TRUE;
1083             break;
1084     #endif
1085         default:
1086             break;
1087         } /* end of switch */
1088     } /* end of IE_FOR_EACH */
1089
1090     /* Some AP will have wrong channel number (255) when running time.
1091      * Check if correct channel number information. 20110501
1092      */
1093     if ((prBssInfo->eBand == BAND_2G4 && ucPrimaryChannel > 14) ||
1094         (prBssInfo->eBand != BAND_2G4 && (ucPrimaryChannel >= 200 ||
1095          ucPrimaryChannel <= 14))) {
1096         ucPrimaryChannel = 0;
1097     }
1098
1099 #if CFG_SUPPORT_QUIET && 0
1100     if (!fgHasQuietIE) {
1101         rrmQuietIeNotExist(prAdapter, prBssInfo);
1102     }
1103 #endif
1104
1105     /* Check if OBSS scan process will launch */
1106     if (!prAdapter->fgEnOnlineScan || !prObssScnParam ||
1107         !(prStaRec->u2HtCapInfo & HT_CAP_INFO_SUP_CHNL_WIDTH) ||
1108         prBssInfo->eBand != BAND_2G4 || !prBssInfo->fg40mBwAllowed) {
1109
1110         /* Note: it is ok not to stop rObssScanTimer() here */
1111         prBssInfo->u2ObssScanInterval = 0;
1112     }
1113     else {
1114         if (prObssScnParam->u2TriggerScanInterval < OBSS_SCAN_MIN_INTERVAL) {
1115             prObssScnParam->u2TriggerScanInterval = OBSS_SCAN_MIN_INTERVAL;
1116         }
1117         if (prBssInfo->u2ObssScanInterval !=
1118             prObssScnParam->u2TriggerScanInterval) {
1119
1120             prBssInfo->u2ObssScanInterval =
1121                 prObssScnParam->u2TriggerScanInterval;
1122
1123             /* Start timer to trigger OBSS scanning */
1124             cnmTimerStartTimer(prAdapter, &prBssInfo->rObssScanTimer,
1125                 prBssInfo->u2ObssScanInterval * MSEC_PER_SEC);
1126         }
1127     }
1128
1129     return ucPrimaryChannel;
1130 }
1131
1132 /*----------------------------------------------------------------------------*/
1133 /*!
1134 * \brief AIS or P2P GC.
1135 *
1136 * \param[in]
1137 *
1138 * \return none
1139 */
1140 /*----------------------------------------------------------------------------*/
1141 static BOOLEAN
1142 rlmRecBcnFromNeighborForClient (
1143     P_ADAPTER_T         prAdapter,
1144     P_BSS_INFO_T        prBssInfo,
1145     P_SW_RFB_T          prSwRfb,
1146     PUINT_8             pucIE,
1147     UINT_16             u2IELength
1148     )
1149 {
1150     UINT_16             u2Offset, i;
1151     UINT_8              ucPriChannel, ucSecChannel;
1152     ENUM_CHNL_EXT_T     eSCO;
1153     BOOLEAN             fgHtBss, fg20mReq;
1154
1155     ASSERT(prAdapter);
1156     ASSERT(prBssInfo && prSwRfb);
1157     ASSERT(pucIE);
1158
1159     /* Record it to channel list to change 20/40 bandwidth */
1160     ucPriChannel = 0;
1161     eSCO = CHNL_EXT_SCN;
1162
1163     fgHtBss = FALSE;
1164     fg20mReq = FALSE;
1165
1166     IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1167         switch (IE_ID(pucIE)) {
1168         case ELEM_ID_HT_CAP:
1169         {
1170             P_IE_HT_CAP_T           prHtCap;
1171
1172             if (IE_LEN(pucIE) != (sizeof(IE_HT_CAP_T) - 2)) {
1173                 break;
1174             }
1175
1176             prHtCap = (P_IE_HT_CAP_T) pucIE;
1177             if (prHtCap->u2HtCapInfo & HT_CAP_INFO_40M_INTOLERANT) {
1178                 fg20mReq = TRUE;
1179             }
1180             fgHtBss = TRUE;
1181             break;
1182         }
1183         case ELEM_ID_HT_OP:
1184         {
1185             P_IE_HT_OP_T        prHtOp;
1186
1187             if (IE_LEN(pucIE) != (sizeof(IE_HT_OP_T) - 2)) {
1188                 break;
1189             }
1190
1191             prHtOp = (P_IE_HT_OP_T) pucIE;
1192             /* Workaround that some APs fill primary channel field by its
1193              * secondary channel, but its DS IE is correct 20110610
1194              */
1195             if (ucPriChannel == 0) {
1196                 ucPriChannel = prHtOp->ucPrimaryChannel;
1197             }
1198
1199             if ((prHtOp->ucInfo1 & HT_OP_INFO1_SCO) != CHNL_EXT_RES) {
1200                 eSCO = (ENUM_CHNL_EXT_T) (prHtOp->ucInfo1 & HT_OP_INFO1_SCO);
1201             }
1202             break;
1203         }
1204         case ELEM_ID_20_40_BSS_COEXISTENCE:
1205         {
1206             P_IE_20_40_COEXIST_T    prCoexist;
1207
1208             if (IE_LEN(pucIE) != (sizeof(IE_20_40_COEXIST_T) - 2)) {
1209                 break;
1210             }
1211
1212             prCoexist = (P_IE_20_40_COEXIST_T) pucIE;
1213             if (prCoexist->ucData & BSS_COEXIST_40M_INTOLERANT) {
1214                 fg20mReq = TRUE;
1215             }
1216             break;
1217         }
1218         case ELEM_ID_DS_PARAM_SET:
1219             if (IE_LEN(pucIE) != (sizeof(IE_DS_PARAM_SET_T) - 2)) {
1220                 break;
1221             }
1222             ucPriChannel = DS_PARAM_IE(pucIE)->ucCurrChnl;
1223             break;
1224
1225         default:
1226             break;
1227         }
1228     }
1229
1230
1231     /* To do: Update channel list and 5G band. All channel lists have the same
1232      * update procedure. We should give it the entry pointer of desired
1233      * channel list.
1234      */
1235     if (HIF_RX_HDR_GET_RF_BAND(prSwRfb->prHifRxHdr) != BAND_2G4) {
1236         return FALSE;
1237     }
1238
1239     if (ucPriChannel == 0 || ucPriChannel > 14) {
1240         ucPriChannel = HIF_RX_HDR_GET_CHNL_NUM(prSwRfb->prHifRxHdr);
1241     }
1242
1243     if (fgHtBss) {
1244         ASSERT(prBssInfo->auc2G_PriChnlList[0] <= CHNL_LIST_SZ_2G);
1245         for (i = 1; i <= prBssInfo->auc2G_PriChnlList[0] &&
1246              i <= CHNL_LIST_SZ_2G; i++) {
1247             if (prBssInfo->auc2G_PriChnlList[i] == ucPriChannel) {
1248                 break;
1249             }
1250         }
1251         if ((i > prBssInfo->auc2G_PriChnlList[0]) && (i <= CHNL_LIST_SZ_2G)) {
1252             prBssInfo->auc2G_PriChnlList[i] = ucPriChannel;
1253             prBssInfo->auc2G_PriChnlList[0]++;
1254         }
1255
1256         /* Update secondary channel */
1257         if (eSCO != CHNL_EXT_SCN) {
1258             ucSecChannel = (eSCO == CHNL_EXT_SCA) ?
1259                 (ucPriChannel + 4) : (ucPriChannel - 4);
1260
1261             ASSERT(prBssInfo->auc2G_SecChnlList[0] <= CHNL_LIST_SZ_2G);
1262             for (i = 1; i <= prBssInfo->auc2G_SecChnlList[0] &&
1263                  i <= CHNL_LIST_SZ_2G; i++) {
1264                 if (prBssInfo->auc2G_SecChnlList[i] == ucSecChannel) {
1265                     break;
1266                 }
1267             }
1268             if ((i > prBssInfo->auc2G_SecChnlList[0])&& (i <= CHNL_LIST_SZ_2G)){
1269                 prBssInfo->auc2G_SecChnlList[i] = ucSecChannel;
1270                 prBssInfo->auc2G_SecChnlList[0]++;
1271             }
1272         }
1273
1274         /* Update 20M bandwidth request channels */
1275         if (fg20mReq) {
1276             ASSERT(prBssInfo->auc2G_20mReqChnlList[0] <= CHNL_LIST_SZ_2G);
1277             for (i = 1; i <= prBssInfo->auc2G_20mReqChnlList[0] &&
1278                  i <= CHNL_LIST_SZ_2G; i++) {
1279                 if (prBssInfo->auc2G_20mReqChnlList[i] == ucPriChannel) {
1280                     break;
1281                 }
1282             }
1283             if ((i > prBssInfo->auc2G_20mReqChnlList[0]) &&
1284                 (i <= CHNL_LIST_SZ_2G)){
1285                 prBssInfo->auc2G_20mReqChnlList[i] = ucPriChannel;
1286                 prBssInfo->auc2G_20mReqChnlList[0]++;
1287             }
1288         }
1289     }
1290     else {
1291         /* Update non-HT channel list */
1292         ASSERT(prBssInfo->auc2G_NonHtChnlList[0] <= CHNL_LIST_SZ_2G);
1293         for (i = 1; i <= prBssInfo->auc2G_NonHtChnlList[0] &&
1294              i <= CHNL_LIST_SZ_2G; i++) {
1295             if (prBssInfo->auc2G_NonHtChnlList[i] == ucPriChannel) {
1296                 break;
1297             }
1298         }
1299         if ((i > prBssInfo->auc2G_NonHtChnlList[0]) && (i <= CHNL_LIST_SZ_2G)) {
1300             prBssInfo->auc2G_NonHtChnlList[i] = ucPriChannel;
1301             prBssInfo->auc2G_NonHtChnlList[0]++;
1302         }
1303
1304     }
1305
1306     return FALSE;
1307 }
1308
1309
1310 /*----------------------------------------------------------------------------*/
1311 /*!
1312 * \brief AIS or P2P GC.
1313 *
1314 * \param[in]
1315 *
1316 * \return none
1317 */
1318 /*----------------------------------------------------------------------------*/
1319 static BOOLEAN
1320 rlmRecBcnInfoForClient (
1321     P_ADAPTER_T         prAdapter,
1322     P_BSS_INFO_T        prBssInfo,
1323     P_SW_RFB_T          prSwRfb,
1324     PUINT_8             pucIE,
1325     UINT_16             u2IELength
1326     )
1327 {
1328     ASSERT(prAdapter);
1329     ASSERT(prBssInfo && prSwRfb);
1330     ASSERT(pucIE);
1331
1332 #if 0 /* SW migration 2010/8/20 */
1333     /* Note: we shall not update parameters when scanning, otherwise
1334      *       channel and bandwidth will not be correct or asserted failure
1335      *       during scanning.
1336      * Note: remove channel checking. All received Beacons should be processed
1337      *       if measurement or other actions are executed in adjacent channels
1338      *       and Beacon content checking mechanism is not disabled.
1339      */
1340     if (IS_SCAN_ACTIVE()
1341         /* || prBssInfo->ucPrimaryChannel != CHNL_NUM_BY_SWRFB(prSwRfb) */) {
1342         return FALSE;
1343     }
1344 #endif
1345
1346     /* Handle change of slot time */
1347     prBssInfo->u2CapInfo =
1348         ((P_WLAN_BEACON_FRAME_T)(prSwRfb->pvHeader))->u2CapInfo;
1349     prBssInfo->fgUseShortSlotTime =
1350         (prBssInfo->u2CapInfo & CAP_INFO_SHORT_SLOT_TIME) ? TRUE : FALSE;
1351
1352     rlmRecIeInfoForClient(prAdapter, prBssInfo, pucIE, u2IELength);
1353
1354     return TRUE;
1355 }
1356
1357 /*----------------------------------------------------------------------------*/
1358 /*!
1359 * \brief
1360 *
1361 * \param[in]
1362 *
1363 * \return none
1364 */
1365 /*----------------------------------------------------------------------------*/
1366 VOID
1367 rlmProcessBcn (
1368     P_ADAPTER_T prAdapter,
1369     P_SW_RFB_T  prSwRfb,
1370     PUINT_8     pucIE,
1371     UINT_16     u2IELength
1372     )
1373 {
1374     P_BSS_INFO_T        prBssInfo;
1375     BOOLEAN             fgNewParameter;
1376     UINT_8              ucNetIdx;
1377
1378     ASSERT(prAdapter);
1379     ASSERT(prSwRfb);
1380     ASSERT(pucIE);
1381
1382     fgNewParameter = FALSE;
1383
1384     /* When concurrent networks exist, GO shall have the same handle as
1385      * the other BSS, so the Beacon shall be procesed for bandwidth and
1386      * protection mechanism.
1387      * Note1: we do not have 2 AP (GO) cases simultaneously now.
1388      * Note2: If we are GO, concurrent AIS AP should detect it and reflect
1389      *        action in its Beacon, so AIS STA just follows Beacon from AP.
1390      */
1391     RLM_NET_FOR_EACH_NO_BOW(ucNetIdx) {
1392         prBssInfo = &prAdapter->rWifiVar.arBssInfo[ucNetIdx];
1393         ASSERT(prBssInfo);
1394
1395         if (IS_BSS_ACTIVE(prBssInfo)) {
1396             if (prBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE &&
1397                 prBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
1398                 /* P2P client or AIS infra STA */
1399                 if (EQUAL_MAC_ADDR(prBssInfo->aucBSSID,
1400                     ((P_WLAN_MAC_MGMT_HEADER_T)
1401                       (prSwRfb->pvHeader))->aucBSSID)) {
1402
1403                     fgNewParameter = rlmRecBcnInfoForClient(prAdapter,
1404                                         prBssInfo, prSwRfb, pucIE, u2IELength);
1405                 }
1406                 else {
1407                     fgNewParameter = rlmRecBcnFromNeighborForClient(prAdapter,
1408                                         prBssInfo, prSwRfb, pucIE, u2IELength);
1409                 }
1410             }
1411         #if CFG_ENABLE_WIFI_DIRECT
1412             else if (prAdapter->fgIsP2PRegistered &&
1413                     (prBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT ||
1414                     prBssInfo->eCurrentOPMode == OP_MODE_P2P_DEVICE)) {
1415                 /* AP scan to check if 20/40M bandwidth is permitted */
1416                 rlmRecBcnFromNeighborForClient(prAdapter,
1417                         prBssInfo, prSwRfb, pucIE, u2IELength);
1418             }
1419         #endif
1420             else if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) {
1421                 /* To do: Ad-hoc */
1422             }
1423
1424             /* Appy new parameters if necessary */
1425             if (fgNewParameter) {
1426                 rlmSyncOperationParams(prAdapter, prBssInfo);
1427                 fgNewParameter = FALSE;
1428             }
1429         } /* end of IS_BSS_ACTIVE() */
1430     } /* end of RLM_NET_FOR_EACH_NO_BOW */
1431 }
1432
1433 /*----------------------------------------------------------------------------*/
1434 /*!
1435 * \brief This function should be invoked after judging successful association.
1436 *
1437 * \param[in]
1438 *
1439 * \return none
1440 */
1441 /*----------------------------------------------------------------------------*/
1442 VOID
1443 rlmProcessAssocRsp (
1444     P_ADAPTER_T prAdapter,
1445     P_SW_RFB_T  prSwRfb,
1446     PUINT_8     pucIE,
1447     UINT_16     u2IELength
1448     )
1449 {
1450     P_BSS_INFO_T        prBssInfo;
1451     P_STA_RECORD_T      prStaRec;
1452     UINT_8              ucPriChannel;
1453
1454     ASSERT(prAdapter);
1455     ASSERT(prSwRfb);
1456     ASSERT(pucIE);
1457
1458     prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1459     ASSERT(prStaRec);
1460     if (!prStaRec) {
1461         return;
1462     }
1463     ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1464
1465     prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
1466     ASSERT(prStaRec == prBssInfo->prStaRecOfAP);
1467
1468     /* To do: the invoked function is used to clear all members. It may be
1469      *        done by center mechanism in invoker.
1470      */
1471     rlmBssReset(prAdapter, prBssInfo);
1472
1473     prBssInfo->fgUseShortSlotTime =
1474         (prBssInfo->u2CapInfo & CAP_INFO_SHORT_SLOT_TIME) ? TRUE : FALSE;
1475
1476     if ((ucPriChannel =
1477          rlmRecIeInfoForClient(prAdapter, prBssInfo, pucIE, u2IELength)) > 0) {
1478         prBssInfo->ucPrimaryChannel = ucPriChannel;
1479     }
1480
1481     if (!RLM_NET_IS_11N(prBssInfo) ||
1482         !(prStaRec->u2HtCapInfo & HT_CAP_INFO_SUP_CHNL_WIDTH)) {
1483         prBssInfo->fg40mBwAllowed = FALSE;
1484     }
1485
1486     /* Note: Update its capabilities to WTBL by cnmStaRecChangeState(), which
1487      *       shall be invoked afterwards.
1488      *       Update channel, bandwidth and protection mode by nicUpdateBss()
1489      */
1490 }
1491
1492 /*----------------------------------------------------------------------------*/
1493 /*!
1494 * \brief This function should be invoked after judging successful association.
1495 *
1496 * \param[in]
1497 *
1498 * \return none
1499 */
1500 /*----------------------------------------------------------------------------*/
1501 VOID
1502 rlmFillSyncCmdParam (
1503     P_CMD_SET_BSS_RLM_PARAM_T   prCmdBody,
1504     P_BSS_INFO_T                prBssInfo
1505     )
1506 {
1507     ASSERT(prCmdBody && prBssInfo);
1508     if (!prCmdBody || !prBssInfo) {
1509         return;
1510     }
1511
1512     prCmdBody->ucNetTypeIndex = prBssInfo->ucNetTypeIndex;
1513     prCmdBody->ucRfBand = (UINT_8) prBssInfo->eBand;
1514     prCmdBody->ucPrimaryChannel = prBssInfo->ucPrimaryChannel;
1515     prCmdBody->ucRfSco = (UINT_8) prBssInfo->eBssSCO;
1516     prCmdBody->ucErpProtectMode = (UINT_8) prBssInfo->fgErpProtectMode;
1517     prCmdBody->ucHtProtectMode = (UINT_8) prBssInfo->eHtProtectMode;
1518     prCmdBody->ucGfOperationMode = (UINT_8) prBssInfo->eGfOperationMode;
1519     prCmdBody->ucTxRifsMode = (UINT_8) prBssInfo->eRifsOperationMode;
1520     prCmdBody->u2HtOpInfo3 = prBssInfo->u2HtOpInfo3;
1521     prCmdBody->u2HtOpInfo2 = prBssInfo->u2HtOpInfo2;
1522     prCmdBody->ucHtOpInfo1 = prBssInfo->ucHtOpInfo1;
1523     prCmdBody->ucUseShortPreamble = prBssInfo->fgUseShortPreamble;
1524     prCmdBody->ucUseShortSlotTime = prBssInfo->fgUseShortSlotTime;
1525     prCmdBody->ucCheckId = 0x72;
1526
1527     if (RLM_NET_PARAM_VALID(prBssInfo)) {
1528         DBGLOG(RLM, INFO, ("N=%d b=%d c=%d s=%d e=%d h=%d I=0x%02x l=%d p=%d\n",
1529             prCmdBody->ucNetTypeIndex, prCmdBody->ucRfBand,
1530             prCmdBody->ucPrimaryChannel, prCmdBody->ucRfSco,
1531             prCmdBody->ucErpProtectMode, prCmdBody->ucHtProtectMode,
1532             prCmdBody->ucHtOpInfo1, prCmdBody->ucUseShortSlotTime,
1533             prCmdBody->ucUseShortPreamble));
1534     }
1535     else {
1536         DBGLOG(RLM, INFO, ("N=%d closed\n", prCmdBody->ucNetTypeIndex));
1537     }
1538 }
1539
1540 /*----------------------------------------------------------------------------*/
1541 /*!
1542 * \brief This function will operation parameters based on situations of
1543 *        concurrent networks. Channel, bandwidth, protection mode, supported
1544 *        rate will be modified.
1545 *
1546 * \param[in]
1547 *
1548 * \return none
1549 */
1550 /*----------------------------------------------------------------------------*/
1551 VOID
1552 rlmSyncOperationParams (
1553     P_ADAPTER_T     prAdapter,
1554     P_BSS_INFO_T    prBssInfo
1555     )
1556 {
1557     P_CMD_SET_BSS_RLM_PARAM_T   prCmdBody;
1558     WLAN_STATUS                 rStatus;
1559
1560     ASSERT(prAdapter);
1561     ASSERT(prBssInfo);
1562
1563     prCmdBody = (P_CMD_SET_BSS_RLM_PARAM_T)
1564         cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_SET_BSS_RLM_PARAM_T));
1565     ASSERT(prCmdBody);
1566
1567     /* To do: exception handle */
1568     if (!prCmdBody) {
1569         DBGLOG(RLM, WARN, ("No buf for sync RLM params (Net=%d)\n",
1570             prBssInfo->ucNetTypeIndex));
1571         return;
1572     }
1573
1574     rlmFillSyncCmdParam(prCmdBody, prBssInfo);
1575
1576     rStatus = wlanSendSetQueryCmd (
1577                 prAdapter,                  /* prAdapter */
1578                 CMD_ID_SET_BSS_RLM_PARAM,   /* ucCID */
1579                 TRUE,                       /* fgSetQuery */
1580                 FALSE,                      /* fgNeedResp */
1581                 FALSE,                      /* fgIsOid */
1582                 NULL,                       /* pfCmdDoneHandler */
1583                 NULL,                       /* pfCmdTimeoutHandler */
1584                 sizeof(CMD_SET_BSS_RLM_PARAM_T),    /* u4SetQueryInfoLen */
1585                 (PUINT_8) prCmdBody,        /* pucInfoBuffer */
1586                 NULL,                       /* pvSetQueryBuffer */
1587                 0                           /* u4SetQueryBufferLen */
1588                 );
1589
1590     ASSERT(rStatus == WLAN_STATUS_PENDING);
1591
1592     cnmMemFree(prAdapter, prCmdBody);
1593 }
1594
1595 #if CFG_SUPPORT_AAA
1596 /*----------------------------------------------------------------------------*/
1597 /*!
1598 * \brief This function should be invoked after judging successful association.
1599 *
1600 * \param[in]
1601 *
1602 * \return none
1603 */
1604 /*----------------------------------------------------------------------------*/
1605 VOID
1606 rlmProcessAssocReq (
1607     P_ADAPTER_T prAdapter,
1608     P_SW_RFB_T  prSwRfb,
1609     PUINT_8     pucIE,
1610     UINT_16     u2IELength
1611     )
1612 {
1613     P_BSS_INFO_T        prBssInfo;
1614     P_STA_RECORD_T      prStaRec;
1615     UINT_16             u2Offset;
1616     P_IE_HT_CAP_T       prHtCap;
1617
1618     ASSERT(prAdapter);
1619     ASSERT(prSwRfb);
1620     ASSERT(pucIE);
1621
1622     prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
1623     ASSERT(prStaRec);
1624     if (!prStaRec) {
1625         return;
1626     }
1627     ASSERT(prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM);
1628
1629     prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
1630
1631     IE_FOR_EACH(pucIE, u2IELength, u2Offset) {
1632         switch (IE_ID(pucIE)) {
1633         case ELEM_ID_HT_CAP:
1634             if (!RLM_NET_IS_11N(prBssInfo) ||
1635                 IE_LEN(pucIE) != (sizeof(IE_HT_CAP_T) - 2)) {
1636                 break;
1637             }
1638             prHtCap = (P_IE_HT_CAP_T) pucIE;
1639             prStaRec->ucMcsSet = prHtCap->rSupMcsSet.aucRxMcsBitmask[0];
1640             prStaRec->fgSupMcs32 =
1641                 (prHtCap->rSupMcsSet.aucRxMcsBitmask[32/8] & BIT(0)) ?
1642                 TRUE : FALSE;
1643
1644             prStaRec->u2HtCapInfo = prHtCap->u2HtCapInfo;
1645             prStaRec->ucAmpduParam = prHtCap->ucAmpduParam;
1646             prStaRec->u2HtExtendedCap = prHtCap->u2HtExtendedCap;
1647             prStaRec->u4TxBeamformingCap = prHtCap->u4TxBeamformingCap;
1648             prStaRec->ucAselCap = prHtCap->ucAselCap;
1649             break;
1650
1651         default:
1652             break;
1653         } /* end of switch */
1654     } /* end of IE_FOR_EACH */
1655 }
1656 #endif /* CFG_SUPPORT_AAA */
1657
1658 /*----------------------------------------------------------------------------*/
1659 /*!
1660 * \brief It is for both STA and AP modes
1661 *
1662 * \param[in]
1663 *
1664 * \return none
1665 */
1666 /*----------------------------------------------------------------------------*/
1667 VOID
1668 rlmBssInitForAPandIbss (
1669     P_ADAPTER_T     prAdapter,
1670     P_BSS_INFO_T    prBssInfo
1671     )
1672 {
1673     ASSERT(prAdapter);
1674     ASSERT(prBssInfo);
1675
1676 #if CFG_ENABLE_WIFI_DIRECT
1677     if (prAdapter->fgIsP2PRegistered &&
1678         prBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT) {
1679
1680         rlmBssInitForAP(prAdapter, prBssInfo);
1681     }
1682 #endif
1683 }
1684
1685 /*----------------------------------------------------------------------------*/
1686 /*!
1687 * \brief It is for both STA and AP modes
1688 *
1689 * \param[in]
1690 *
1691 * \return none
1692 */
1693 /*----------------------------------------------------------------------------*/
1694 VOID
1695 rlmBssAborted (
1696     P_ADAPTER_T     prAdapter,
1697     P_BSS_INFO_T    prBssInfo
1698     )
1699 {
1700     ASSERT(prAdapter);
1701     ASSERT(prBssInfo);
1702
1703     rlmBssReset(prAdapter, prBssInfo);
1704
1705     prBssInfo->fg40mBwAllowed = FALSE;
1706     prBssInfo->fgAssoc40mBwAllowed = FALSE;
1707
1708     /* Assume FW state is updated by CMD_ID_SET_BSS_INFO, so
1709      * the sync CMD is not needed here.
1710      */
1711 }
1712
1713 /*----------------------------------------------------------------------------*/
1714 /*!
1715 * \brief All RLM timers will also be stopped.
1716 *
1717 * \param[in]
1718 *
1719 * \return none
1720 */
1721 /*----------------------------------------------------------------------------*/
1722 static VOID
1723 rlmBssReset (
1724     P_ADAPTER_T         prAdapter,
1725     P_BSS_INFO_T        prBssInfo
1726     )
1727 {
1728     ASSERT(prAdapter);
1729     ASSERT(prBssInfo);
1730
1731     /* HT related parameters */
1732     prBssInfo->ucHtOpInfo1 = 0;         /* RIFS disabled. 20MHz */
1733     prBssInfo->u2HtOpInfo2 = 0;
1734     prBssInfo->u2HtOpInfo3 = 0;
1735
1736     prBssInfo->eBssSCO = 0;
1737     prBssInfo->fgErpProtectMode = 0;
1738     prBssInfo->eHtProtectMode = 0;
1739     prBssInfo->eGfOperationMode = 0;
1740     prBssInfo->eRifsOperationMode = 0;
1741
1742     /* OBSS related parameters */
1743     prBssInfo->auc2G_20mReqChnlList[0] = 0;
1744     prBssInfo->auc2G_NonHtChnlList[0] = 0;
1745     prBssInfo->auc2G_PriChnlList[0] = 0;
1746     prBssInfo->auc2G_SecChnlList[0] = 0;
1747     prBssInfo->auc5G_20mReqChnlList[0] = 0;
1748     prBssInfo->auc5G_NonHtChnlList[0] = 0;
1749     prBssInfo->auc5G_PriChnlList[0] = 0;
1750     prBssInfo->auc5G_SecChnlList[0] = 0;
1751
1752     /* All RLM timers will also be stopped */
1753     cnmTimerStopTimer(prAdapter, &prBssInfo->rObssScanTimer);
1754     prBssInfo->u2ObssScanInterval = 0;
1755
1756     prBssInfo->fgObssErpProtectMode = 0;       /* GO only */
1757     prBssInfo->eObssHtProtectMode = 0;         /* GO only */
1758     prBssInfo->eObssGfOperationMode = 0;       /* GO only */
1759     prBssInfo->fgObssRifsOperationMode = 0;    /* GO only */
1760     prBssInfo->fgObssActionForcedTo20M = 0;    /* GO only */
1761     prBssInfo->fgObssBeaconForcedTo20M = 0;    /* GO only */
1762 }
1763