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_domain.c
1 /*
2 ** $Id: //Department/DaVinci/BRANCHES/MT662X_593X_WIFI_DRIVER_V2_3/mgmt/rlm_domain.c#1 $
3 */
4
5 /*! \file   "rlm_domain.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_domain.c $
54  *
55  * 11 10 2011 cm.chang
56  * NULL
57  * Modify debug message for XLOG
58  *
59  * 09 29 2011 cm.chang
60  * NULL
61  * Change the function prototype of rlmDomainGetChnlList()
62  *
63  * 09 23 2011 cm.chang
64  * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code
65  * Let channel number to zero if band is illegal
66  *
67  * 09 22 2011 cm.chang
68  * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code
69  * Exclude channel list with illegal band
70  *
71  * 09 15 2011 cm.chang
72  * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code
73  * Use defined country group to have a change to add new group
74  *
75  * 09 08 2011 cm.chang
76  * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code
77  * Use new fields ucChannelListMap and ucChannelListIndex in NVRAM
78  *
79  * 08 31 2011 cm.chang
80  * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code
81  * .
82  *
83  * 06 01 2011 cm.chang
84  * [WCXRP00000756] [MT6620 Wi-Fi][Driver] 1. AIS follow channel of BOW 2. Provide legal channel function
85  * Provide legal channel function based on domain
86  *
87  * 03 19 2011 yuche.tsai
88  * [WCXRP00000584] [Volunteer Patch][MT6620][Driver] Add beacon timeout support for WiFi Direct.
89  * Add beacon timeout support for WiFi Direct Network.
90  *
91  * 03 02 2011 terry.wu
92  * [WCXRP00000505] [MT6620 Wi-Fi][Driver/FW] WiFi Direct Integration
93  * Export rlmDomainGetDomainInfo for p2p driver.
94  *
95  * 01 12 2011 cm.chang
96  * [WCXRP00000354] [MT6620 Wi-Fi][Driver][FW] Follow NVRAM bandwidth setting
97  * User-defined bandwidth is for 2.4G and 5G individually
98  *
99  * 12 07 2010 cm.chang
100  * [WCXRP00000238] MT6620 Wi-Fi][Driver][FW] Support regulation domain setting from NVRAM and supplicant
101  * 1. Country code is from NVRAM or supplicant
102  * 2. Change band definition in CMD/EVENT.
103  *
104  * 07 08 2010 cp.wu
105  *
106  * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
107  *
108  * 07 08 2010 cm.chang
109  * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
110  * Check draft RLM code for HT cap
111  *
112  * 03 25 2010 cm.chang
113  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
114  * Filter out not supported RF freq when reporting available chnl list
115  *
116  * 01 22 2010 cm.chang
117  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
118  * Support protection and bandwidth switch
119  *
120  * 01 13 2010 cm.chang
121  * [BORA00000018]Integrate WIFI part into BORA for the 1st time
122  * Provide query function about full channle list.
123  *
124  * Dec 1 2009 mtk01104
125  * [BORA00000018] Integrate WIFI part into BORA for the 1st time
126  *
127  *
128 **
129 */
130
131 /*******************************************************************************
132 *                         C O M P I L E R   F L A G S
133 ********************************************************************************
134 */
135
136 /*******************************************************************************
137 *                    E X T E R N A L   R E F E R E N C E S
138 ********************************************************************************
139 */
140 #include "precomp.h"
141
142 /*******************************************************************************
143 *                              C O N S T A N T S
144 ********************************************************************************
145 */
146
147 /*******************************************************************************
148 *                             D A T A   T Y P E S
149 ********************************************************************************
150 */
151
152 /*******************************************************************************
153 *                            P U B L I C   D A T A
154 ********************************************************************************
155 */
156
157 /* The following country or domain shall be set from host driver.
158  * And host driver should pass specified DOMAIN_INFO_ENTRY to MT6620 as
159  * the channel list of being a STA to do scanning/searching AP or being an
160  * AP to choose an adequate channel if auto-channel is set.
161  */
162
163 /* Define mapping tables between country code and its channel set
164  */
165 static const UINT_16     g_u2CountryGroup0[] =
166 {
167     COUNTRY_CODE_US, COUNTRY_CODE_BS, COUNTRY_CODE_BB, COUNTRY_CODE_BO, COUNTRY_CODE_DM,
168     COUNTRY_CODE_DO, COUNTRY_CODE_HT, COUNTRY_CODE_PR, COUNTRY_CODE_TH, COUNTRY_CODE_TW,
169     COUNTRY_CODE_AI, COUNTRY_CODE_AG, COUNTRY_CODE_AW, COUNTRY_CODE_BM, COUNTRY_CODE_CU,
170     COUNTRY_CODE_GD, COUNTRY_CODE_GY, COUNTRY_CODE_JM, COUNTRY_CODE_KN, COUNTRY_CODE_LC,
171     COUNTRY_CODE_VC, COUNTRY_CODE_TT, COUNTRY_CODE_SR
172 };
173 static const UINT_16     g_u2CountryGroup1[] =
174 {
175     COUNTRY_CODE_BR, COUNTRY_CODE_EC, COUNTRY_CODE_HK, COUNTRY_CODE_MX, COUNTRY_CODE_PE,
176     COUNTRY_CODE_CR, COUNTRY_CODE_MD, COUNTRY_CODE_NI, COUNTRY_CODE_PZ
177 };
178 static const UINT_16     g_u2CountryGroup2[] = {COUNTRY_CODE_CO, COUNTRY_CODE_PY};
179 static const UINT_16     g_u2CountryGroup3[] = {COUNTRY_CODE_JP};
180 static const UINT_16     g_u2CountryGroup4[] =
181 {
182     COUNTRY_CODE_CN, COUNTRY_CODE_UY, COUNTRY_CODE_MA
183 };
184 static const UINT_16     g_u2CountryGroup5[] = {COUNTRY_CODE_AR};
185 static const UINT_16     g_u2CountryGroup6[] = {COUNTRY_CODE_AU, COUNTRY_CODE_NZ};
186 static const UINT_16     g_u2CountryGroup7[] = {COUNTRY_CODE_RU};
187 static const UINT_16     g_u2CountryGroup8[] =
188 {
189     COUNTRY_CODE_ID, COUNTRY_CODE_HN, COUNTRY_CODE_PG, COUNTRY_CODE_PK
190 };
191 static const UINT_16     g_u2CountryGroup9[] = {COUNTRY_CODE_CA};
192 static const UINT_16     g_u2CountryGroup10[] =
193 {
194     COUNTRY_CODE_CL, COUNTRY_CODE_IN, COUNTRY_CODE_SA, COUNTRY_CODE_SG, COUNTRY_CODE_VE,
195     COUNTRY_CODE_MY, COUNTRY_CODE_VN, COUNTRY_CODE_EG
196 };
197 static const UINT_16     g_u2CountryGroup11[] = {COUNTRY_CODE_IL, COUNTRY_CODE_UA};
198 static const UINT_16     g_u2CountryGroup12[] = {COUNTRY_CODE_JO, COUNTRY_CODE_KW};
199 static const UINT_16     g_u2CountryGroup13[] = {COUNTRY_CODE_KR, COUNTRY_CODE_OM};
200 static const UINT_16     g_u2CountryGroup14[] =
201 {
202     COUNTRY_CODE_EU
203     /* When country code is not found, this domain info will be used.
204      * So mark all country codes to reduce search time. 20110908
205      */
206     /*, COUNTRY_CODE_PH, COUNTRY_CODE_TR, COUNTRY_CODE_IR, COUNTRY_CODE_BY,
207     COUNTRY_CODE_LK */
208 };
209
210
211 DOMAIN_INFO_ENTRY arSupportedRegDomains[] = {
212     {
213         (PUINT_16) g_u2CountryGroup0, sizeof(g_u2CountryGroup0) / 2,
214         {
215             {  81, BAND_2G4, CHNL_SPAN_5,    1,  11,  FALSE }, /* CH_SET_2G4_1_11 */
216
217             { 115, BAND_5G,  CHNL_SPAN_20,  36,   4,  FALSE }, /* CH_SET_UNII_LOW_36_48 */
218             { 118, BAND_5G,  CHNL_SPAN_20,  52,   4,  FALSE }, /* CH_SET_UNII_MID_52_64 */
219             { 121, BAND_5G,  CHNL_SPAN_20, 100,  11,  FALSE }, /* CH_SET_UNII_WW_100_140 */
220             { 125, BAND_5G,  CHNL_SPAN_20, 149,   5,  FALSE }, /* CH_SET_UNII_UPPER_149_165 */
221             {   0, BAND_NULL,           0,   0,   0,  FALSE }
222         }
223     },
224     {
225         (PUINT_16) g_u2CountryGroup1, sizeof(g_u2CountryGroup1) / 2,
226         {
227             {  81, BAND_2G4, CHNL_SPAN_5,    1,  13,  FALSE }, /* CH_SET_2G4_1_13 */
228
229             { 115, BAND_5G,  CHNL_SPAN_20,  36,   4,  FALSE }, /* CH_SET_UNII_LOW_36_48 */
230             { 118, BAND_5G,  CHNL_SPAN_20,  52,   4,  FALSE }, /* CH_SET_UNII_MID_52_64 */
231             { 121, BAND_5G,  CHNL_SPAN_20, 100,  11,  FALSE }, /* CH_SET_UNII_WW_100_140 */
232             { 125, BAND_5G,  CHNL_SPAN_20, 149,   5,  FALSE }, /* CH_SET_UNII_UPPER_149_165 */
233             {   0, BAND_NULL,           0,   0,   0,  FALSE }
234         }
235     },
236     {
237         (PUINT_16) g_u2CountryGroup2, sizeof(g_u2CountryGroup2) / 2,
238         {
239             {  81, BAND_2G4, CHNL_SPAN_5,    1,  13,  FALSE }, /* CH_SET_2G4_1_13 */
240
241             { 115, BAND_5G,  CHNL_SPAN_20,  36,   4,  FALSE }, /* CH_SET_UNII_LOW_36_48 */
242             { 118, BAND_5G,  CHNL_SPAN_20,  52,   4,  FALSE }, /* CH_SET_UNII_MID_52_64 */
243             { 121, BAND_5G,  CHNL_SPAN_20, 100,  11,  FALSE }, /* CH_SET_UNII_WW_100_140 */
244             { 125, BAND_NULL,           0,   0,   0,  FALSE }, /* CH_SET_UNII_UPPER_NA */
245             {   0, BAND_NULL,           0,   0,   0,  FALSE }
246         }
247     },
248     {
249         (PUINT_16) g_u2CountryGroup3, sizeof(g_u2CountryGroup3) / 2,
250         {
251             {  81, BAND_2G4, CHNL_SPAN_5,    1,  13,  FALSE }, /* CH_SET_2G4_1_14 */
252             {  82, BAND_2G4, CHNL_SPAN_5,   14,   1,  FALSE },
253
254             { 115, BAND_5G,  CHNL_SPAN_20,  36,   4,  FALSE }, /* CH_SET_UNII_LOW_36_48 */
255             { 118, BAND_5G,  CHNL_SPAN_20,  52,   4,  FALSE }, /* CH_SET_UNII_MID_52_64 */
256             { 121, BAND_5G,  CHNL_SPAN_20, 100,  11,  FALSE }, /* CH_SET_UNII_WW_100_140 */
257             { 125, BAND_NULL,           0,   0,   0,  FALSE }  /* CH_SET_UNII_UPPER_NA */
258         }
259     },
260     {
261         (PUINT_16) g_u2CountryGroup4, sizeof(g_u2CountryGroup4) / 2,
262         {
263             {  81, BAND_2G4, CHNL_SPAN_5,    1,  13,  FALSE }, /* CH_SET_2G4_1_13 */
264
265             { 115, BAND_NULL,           0,   0,   0,  FALSE }, /* CH_SET_UNII_LOW_NA */
266             { 118, BAND_5G,  CHNL_SPAN_20,  52,   4,  FALSE }, /* CH_SET_UNII_MID_52_64 */
267             { 121, BAND_5G,  CHNL_SPAN_20, 100,  11,  FALSE }, /* CH_SET_UNII_WW_100_140 */
268             { 125, BAND_5G,  CHNL_SPAN_20, 149,   5,  FALSE }, /* CH_SET_UNII_UPPER_149_165 */
269             {   0, BAND_NULL,           0,   0,   0,  FALSE }
270         }
271     },
272     {
273         (PUINT_16) g_u2CountryGroup5, sizeof(g_u2CountryGroup5) / 2,
274         {
275             {  81, BAND_2G4, CHNL_SPAN_5,    1,  13,  FALSE }, /* CH_SET_2G4_1_13 */
276
277             { 115, BAND_NULL,           0,   0,   0,  FALSE }, /* CH_SET_UNII_LOW_NA */
278             { 118, BAND_5G,  CHNL_SPAN_20,  52,   4,  FALSE }, /* CH_SET_UNII_MID_52_64 */
279             { 121, BAND_NULL,           0,   0,   0,  FALSE }, /* CH_SET_UNII_WW_NA */
280             { 125, BAND_5G,  CHNL_SPAN_20, 149,   5,  FALSE }, /* CH_SET_UNII_UPPER_149_165 */
281             {   0, BAND_NULL,           0,   0,   0,  FALSE }
282         }
283     },
284     {
285         (PUINT_16) g_u2CountryGroup6, sizeof(g_u2CountryGroup6) / 2,
286         {
287             {  81, BAND_2G4, CHNL_SPAN_5,    1,  11,  FALSE }, /* CH_SET_2G4_1_11 */
288
289             { 115, BAND_5G,  CHNL_SPAN_20,  36,   4,  FALSE }, /* CH_SET_UNII_LOW_36_48 */
290             { 118, BAND_5G,  CHNL_SPAN_20,  52,   4,  FALSE }, /* CH_SET_UNII_MID_52_64 */
291             { 121, BAND_5G,  CHNL_SPAN_20, 100,  11,  FALSE }, /* CH_SET_UNII_WW_100_140 */
292             { 125, BAND_5G,  CHNL_SPAN_20, 149,   4,  FALSE }, /* CH_SET_UNII_UPPER_149_161 */
293             {   0, BAND_NULL,           0,   0,   0,  FALSE }
294         }
295     },
296     {
297         (PUINT_16) g_u2CountryGroup7, sizeof(g_u2CountryGroup7) / 2,
298         {
299             {  81, BAND_2G4, CHNL_SPAN_5,    1,  13,  FALSE }, /* CH_SET_2G4_1_13 */
300
301             { 115, BAND_5G,  CHNL_SPAN_20,  36,   4,  FALSE }, /* CH_SET_UNII_LOW_36_48 */
302             { 118, BAND_5G,  CHNL_SPAN_20,  52,   4,  FALSE }, /* CH_SET_UNII_MID_52_64 */
303             { 121, BAND_5G,  CHNL_SPAN_20, 100,  11,  FALSE }, /* CH_SET_UNII_WW_100_140 */
304             { 125, BAND_5G,  CHNL_SPAN_20, 149,   4,  FALSE }, /* CH_SET_UNII_UPPER_149_161 */
305             {   0, BAND_NULL,           0,   0,   0,  FALSE }
306         }
307     },
308     {
309         (PUINT_16) g_u2CountryGroup8, sizeof(g_u2CountryGroup8) / 2,
310         {
311             {  81, BAND_2G4, CHNL_SPAN_5,    1,  13,  FALSE }, /* CH_SET_2G4_1_13 */
312
313             { 115, BAND_NULL,           0,   0,   0,  FALSE }, /* CH_SET_UNII_LOW_NA */
314             { 118, BAND_NULL,           0,   0,   0,  FALSE }, /* CH_SET_UNII_MID_NA */
315             { 121, BAND_NULL,           0,   0,   0,  FALSE }, /* CH_SET_UNII_WW_NA */
316             { 125, BAND_5G,  CHNL_SPAN_20, 149,   4,  FALSE }, /* CH_SET_UNII_UPPER_149_161 */
317             {   0, BAND_NULL,           0,   0,   0,  FALSE }
318         }
319     },
320     {
321         (PUINT_16) g_u2CountryGroup9, sizeof(g_u2CountryGroup9) / 2,
322         {
323             {  81, BAND_2G4, CHNL_SPAN_5,    1,  11,  FALSE }, /* CH_SET_2G4_1_11 */
324
325             { 115, BAND_5G,  CHNL_SPAN_20,  36,   4,  FALSE }, /* CH_SET_UNII_LOW_36_48 */
326             { 118, BAND_5G,  CHNL_SPAN_20,  52,   4,  FALSE }, /* CH_SET_UNII_MID_52_64 */
327             { 121, BAND_5G,  CHNL_SPAN_20, 100,   5,  FALSE }, /* CH_SET_UNII_WW_100_116_132_140 */
328             { 121, BAND_5G,  CHNL_SPAN_20, 132,   5,  FALSE },
329             { 125, BAND_5G,  CHNL_SPAN_20, 149,   5,  FALSE }, /* CH_SET_UNII_UPPER_149_165 */
330         }
331     },
332     {
333         (PUINT_16) g_u2CountryGroup10, sizeof(g_u2CountryGroup10) / 2,
334         {
335             {  81, BAND_2G4, CHNL_SPAN_5,    1,  13,  FALSE }, /* CH_SET_2G4_1_13 */
336
337             { 115, BAND_5G,  CHNL_SPAN_20,  36,   4,  FALSE }, /* CH_SET_UNII_LOW_36_48 */
338             { 118, BAND_5G,  CHNL_SPAN_20,  52,   4,  FALSE }, /* CH_SET_UNII_MID_52_64 */
339             { 121, BAND_NULL,           0,   0,   0,  FALSE }, /* CH_SET_UNII_WW_NA */
340             { 125, BAND_5G,  CHNL_SPAN_20, 149,   5,  FALSE }, /* CH_SET_UNII_UPPER_149_165 */
341             {   0, BAND_NULL,           0,   0,   0,  FALSE }
342         }
343     },
344     {
345         (PUINT_16) g_u2CountryGroup11, sizeof(g_u2CountryGroup11) / 2,
346         {
347             {  81, BAND_2G4, CHNL_SPAN_5,    1,  13,  FALSE }, /* CH_SET_2G4_1_13 */
348
349             { 115, BAND_5G,  CHNL_SPAN_20,  36,   4,  FALSE }, /* CH_SET_UNII_LOW_36_48 */
350             { 118, BAND_5G,  CHNL_SPAN_20,  52,   4,  FALSE }, /* CH_SET_UNII_MID_52_64 */
351             { 121, BAND_NULL,           0,   0,   0,  FALSE }, /* CH_SET_UNII_WW_NA */
352             { 125, BAND_NULL,           0,   0,   0,  FALSE }, /* CH_SET_UNII_UPPER_NA */
353             {   0, BAND_NULL,           0,   0,   0,  FALSE }
354         }
355     },
356     {
357         (PUINT_16) g_u2CountryGroup12, sizeof(g_u2CountryGroup12) / 2,
358         {
359             {  81, BAND_2G4, CHNL_SPAN_5,    1,  13,  FALSE }, /* CH_SET_2G4_1_13 */
360
361             { 115, BAND_5G,  CHNL_SPAN_20,  36,   4,  FALSE }, /* CH_SET_UNII_LOW_36_48 */
362             { 118, BAND_NULL,           0,   0,   0,  FALSE }, /* CH_SET_UNII_MID_NA */
363             { 121, BAND_NULL,           0,   0,   0,  FALSE }, /* CH_SET_UNII_WW_NA */
364             { 125, BAND_NULL,           0,   0,   0,  FALSE }, /* CH_SET_UNII_UPPER_NA */
365             {   0, BAND_NULL,           0,   0,   0,  FALSE }
366         }
367     },
368     {
369         (PUINT_16) g_u2CountryGroup13, sizeof(g_u2CountryGroup13) / 2,
370         {
371             {  81, BAND_2G4, CHNL_SPAN_5,    1,  13,  FALSE }, /* CH_SET_2G4_1_13 */
372
373             { 115, BAND_5G,  CHNL_SPAN_20,  36,   4,  FALSE }, /* CH_SET_UNII_LOW_36_48 */
374             { 118, BAND_5G,  CHNL_SPAN_20,  52,   4,  FALSE }, /* CH_SET_UNII_MID_52_64 */
375             { 121, BAND_5G,  CHNL_SPAN_20, 100,   8,  FALSE }, /* CH_SET_UNII_WW_100_128 */
376             { 125, BAND_5G,  CHNL_SPAN_20, 149,   5,  FALSE }, /* CH_SET_UNII_UPPER_149_165 */
377             {   0, BAND_NULL,           0,   0,   0,  FALSE }
378         }
379     },
380     {
381         /* Note: The final one is for Europe union now. */
382         (PUINT_16) g_u2CountryGroup14, sizeof(g_u2CountryGroup14) / 2,
383         {
384             {  81, BAND_2G4, CHNL_SPAN_5,    1,  13,  FALSE }, /* CH_SET_2G4_1_13 */
385
386             { 115, BAND_5G,  CHNL_SPAN_20,  36,   4,  FALSE }, /* CH_SET_UNII_LOW_36_48 */
387             { 118, BAND_5G,  CHNL_SPAN_20,  52,   4,  FALSE }, /* CH_SET_UNII_MID_52_64 */
388             { 121, BAND_5G,  CHNL_SPAN_20, 100,  11,  FALSE }, /* CH_SET_UNII_WW_100_140 */
389             { 125, BAND_5G,  CHNL_SPAN_20, 149,   7,  FALSE }, /* CH_SET_UNII_UPPER_149_173 */
390             {   0, BAND_NULL,           0,   0,   0,  FALSE }
391         }
392     }
393 };
394
395 #if 0
396 COUNTRY_CH_SET_T arCountryChSets[] = {
397     /* idx=0: US, Bahamas, Barbados, Bolivia(Voluntary), Dominica (the Commonwealth of Dominica),
398        The Dominican Republic, Haiti */
399     {CH_SET_2G4_1_11,           CH_SET_UNII_LOW_36_48,          CH_SET_UNII_MID_52_64,
400      CH_SET_UNII_WW_100_140,    CH_SET_UNII_UPPER_149_165},
401     /* idx=1: Brazil, Ecuador, Hong Kong, Mexico, Peru */
402     {CH_SET_2G4_1_13,           CH_SET_UNII_LOW_36_48,          CH_SET_UNII_MID_52_64,
403      CH_SET_UNII_WW_100_140,    CH_SET_UNII_UPPER_149_165},
404     /* idx=2: JP1, Colombia(Voluntary), Paraguay */
405     {CH_SET_2G4_1_13,           CH_SET_UNII_LOW_36_48,          CH_SET_UNII_MID_52_64,
406      CH_SET_UNII_WW_100_140,    CH_SET_UNII_UPPER_NA},
407     /* idx=3: JP2 */
408     {CH_SET_2G4_1_14,           CH_SET_UNII_LOW_36_48,          CH_SET_UNII_MID_52_64,
409      CH_SET_UNII_WW_100_140,    CH_SET_UNII_UPPER_NA},
410     /* idx=4: CN, Uruguay, Morocco */
411     {CH_SET_2G4_1_13,           CH_SET_UNII_LOW_NA,             CH_SET_UNII_MID_NA,
412      CH_SET_UNII_WW_NA,         CH_SET_UNII_UPPER_149_165},
413     /* idx=5: Argentina */
414     {CH_SET_2G4_1_13,           CH_SET_UNII_LOW_NA,             CH_SET_UNII_MID_52_64,
415      CH_SET_UNII_WW_NA,         CH_SET_UNII_UPPER_149_165},
416     /* idx=6: Australia, New Zealand */
417     {CH_SET_2G4_1_11,           CH_SET_UNII_LOW_36_48,          CH_SET_UNII_MID_52_64,
418      CH_SET_UNII_WW_100_140,    CH_SET_UNII_UPPER_149_161},
419     /* idx=7: Russia */
420     {CH_SET_2G4_1_13,           CH_SET_UNII_LOW_36_48,          CH_SET_UNII_MID_52_64,
421      CH_SET_UNII_WW_100_140,    CH_SET_UNII_UPPER_149_161},
422     /* idx=8: Indonesia */
423     {CH_SET_2G4_1_13,           CH_SET_UNII_LOW_NA,             CH_SET_UNII_MID_NA,
424      CH_SET_UNII_WW_NA,         CH_SET_UNII_UPPER_149_161},
425     /* idx=9: Canada */
426     {CH_SET_2G4_1_11,           CH_SET_UNII_LOW_36_48,          CH_SET_UNII_MID_52_64,
427      CH_SET_UNII_WW_100_116_132_140,    CH_SET_UNII_UPPER_149_165},
428     /* idx=10: Chile, India, Saudi Arabia, Singapore */
429     {CH_SET_2G4_1_13,           CH_SET_UNII_LOW_36_48,          CH_SET_UNII_MID_52_64,
430      CH_SET_UNII_WW_NA,         CH_SET_UNII_UPPER_149_165},
431     /* idx=11: Israel, Ukraine */
432     {CH_SET_2G4_1_13,           CH_SET_UNII_LOW_36_48,          CH_SET_UNII_MID_52_64,
433      CH_SET_UNII_WW_NA,         CH_SET_UNII_UPPER_NA},
434     /* idx=12: Jordan, Kuwait */
435     {CH_SET_2G4_1_13,           CH_SET_UNII_LOW_36_48,          CH_SET_UNII_MID_NA,
436      CH_SET_UNII_WW_NA,         CH_SET_UNII_UPPER_NA},
437     /* idx=13: South Korea */
438     {CH_SET_2G4_1_13,           CH_SET_UNII_LOW_36_48,          CH_SET_UNII_MID_52_64,
439      CH_SET_UNII_WW_100_128,    CH_SET_UNII_UPPER_149_165},
440     /* idx=14: Taiwan */
441     {CH_SET_2G4_1_11,           CH_SET_UNII_LOW_NA,             CH_SET_UNII_MID_52_64,
442      CH_SET_UNII_WW_100_140,    CH_SET_UNII_UPPER_149_165},
443     /* idx=15: EU all countries */
444     {CH_SET_2G4_1_13,           CH_SET_UNII_LOW_36_48,          CH_SET_UNII_MID_52_64,
445      CH_SET_UNII_WW_100_140,    CH_SET_UNII_UPPER_149_173}
446 };
447 #endif
448
449
450 /*******************************************************************************
451 *                           P R I V A T E   D A T A
452 ********************************************************************************
453 */
454
455 /*******************************************************************************
456 *                                 M A C R O S
457 ********************************************************************************
458 */
459
460 /*******************************************************************************
461 *                   F U N C T I O N   D E C L A R A T I O N S
462 ********************************************************************************
463 */
464
465 /*******************************************************************************
466 *                              F U N C T I O N S
467 ********************************************************************************
468 */
469
470 /*----------------------------------------------------------------------------*/
471 /*!
472 * \brief
473 *
474 * \param[in/out]
475 *
476 * \return none
477 */
478 /*----------------------------------------------------------------------------*/
479 P_DOMAIN_INFO_ENTRY
480 rlmDomainGetDomainInfo (
481     P_ADAPTER_T     prAdapter
482     )
483 {
484 #define REG_DOMAIN_DEF_IDX          14  /* EU (Europe Union) */
485 #define REG_DOMAIN_GROUP_NUM \
486         (sizeof(arSupportedRegDomains) / sizeof(DOMAIN_INFO_ENTRY))
487
488     UINT_16                 i, j;
489     P_DOMAIN_INFO_ENTRY     prDomainInfo;
490     P_REG_INFO_T            prRegInfo;
491     UINT_16                 u2TargetCountryCode;
492
493     ASSERT(prAdapter);
494
495     if (prAdapter->prDomainInfo) {
496         return prAdapter->prDomainInfo;
497     }
498
499     prRegInfo = &prAdapter->prGlueInfo->rRegInfo;
500
501     DBGLOG(RLM, INFO, ("Domain: map=%d, idx=%d, code=0x%04x\n",
502         prRegInfo->eRegChannelListMap, prRegInfo->ucRegChannelListIndex,
503         prAdapter->rWifiVar.rConnSettings.u2CountryCode));
504
505     if (prRegInfo->eRegChannelListMap == REG_CH_MAP_TBL_IDX &&
506         prRegInfo->ucRegChannelListIndex < REG_DOMAIN_GROUP_NUM) {
507         prDomainInfo = &arSupportedRegDomains[prRegInfo->ucRegChannelListIndex];
508         goto L_set_domain_info;
509     }
510     else if (prRegInfo->eRegChannelListMap == REG_CH_MAP_CUSTOMIZED) {
511         prDomainInfo = &prRegInfo->rDomainInfo;
512         goto L_set_domain_info;
513     }
514
515     u2TargetCountryCode = prAdapter->rWifiVar.rConnSettings.u2CountryCode;
516
517     /* If no matched country code, the final one will be used
518      * The final one is for Europe union now.
519      */
520     for (i = 0; i < REG_DOMAIN_GROUP_NUM; i++) {
521         prDomainInfo = &arSupportedRegDomains[i];
522
523         ASSERT((prDomainInfo->u4CountryNum && prDomainInfo->pu2CountryGroup) ||
524                prDomainInfo->u4CountryNum == 0);
525
526         for (j = 0; j < prDomainInfo->u4CountryNum; j++) {
527             if (prDomainInfo->pu2CountryGroup[j] == u2TargetCountryCode) {
528                 break;
529             }
530         }
531         if (j < prDomainInfo->u4CountryNum) {
532             break; /* Found */
533         }
534     }
535
536     DATA_STRUC_INSPECTING_ASSERT(REG_DOMAIN_DEF_IDX < REG_DOMAIN_GROUP_NUM);
537
538     if (i >= REG_DOMAIN_GROUP_NUM) {
539         prDomainInfo = &arSupportedRegDomains[REG_DOMAIN_DEF_IDX];
540     }
541
542 L_set_domain_info:
543
544     prAdapter->prDomainInfo = prDomainInfo;
545     return prDomainInfo;
546 }
547
548 /*----------------------------------------------------------------------------*/
549 /*!
550 * \brief
551 *
552 * \param[in/out] The input variable pointed by pucNumOfChannel is the max
553 *                arrary size. The return value indciates meaning list size.
554 *
555 * \return none
556 */
557 /*----------------------------------------------------------------------------*/
558 VOID
559 rlmDomainGetChnlList (
560     P_ADAPTER_T             prAdapter,
561     ENUM_BAND_T             eSpecificBand,
562     UINT_8                  ucMaxChannelNum,
563     PUINT_8                 pucNumOfChannel,
564     P_RF_CHANNEL_INFO_T     paucChannelList
565     )
566 {
567     UINT_8                  i, j, ucNum;
568     P_DOMAIN_SUBBAND_INFO   prSubband;
569     P_DOMAIN_INFO_ENTRY     prDomainInfo;
570
571     ASSERT(prAdapter);
572     ASSERT(paucChannelList);
573     ASSERT(pucNumOfChannel);
574
575     /* If no matched country code, the final one will be used */
576     prDomainInfo = rlmDomainGetDomainInfo(prAdapter);
577     ASSERT(prDomainInfo);
578
579     ucNum = 0;
580     for (i = 0; i < MAX_SUBBAND_NUM; i++) {
581         prSubband = &prDomainInfo->rSubBand[i];
582
583         if (prSubband->ucBand == BAND_NULL || prSubband->ucBand >= BAND_NUM ||
584             (prSubband->ucBand == BAND_5G && !prAdapter->fgEnable5GBand)) {
585             continue;
586         }
587
588         if (eSpecificBand == BAND_NULL || prSubband->ucBand == eSpecificBand) {
589             for (j = 0; j < prSubband->ucNumChannels; j++) {
590                 if (ucNum >= ucMaxChannelNum) {
591                     break;
592                 }
593                 paucChannelList[ucNum].eBand = prSubband->ucBand;
594                 paucChannelList[ucNum].ucChannelNum =
595                     prSubband->ucFirstChannelNum + j * prSubband->ucChannelSpan;
596                 ucNum++;
597             }
598         }
599     }
600
601     *pucNumOfChannel = ucNum;
602 }
603
604 /*----------------------------------------------------------------------------*/
605 /*!
606 * @brief
607 *
608 * @param[in]
609 *
610 * @return (none)
611 */
612 /*----------------------------------------------------------------------------*/
613 VOID
614 rlmDomainSendCmd (
615     P_ADAPTER_T     prAdapter,
616     BOOLEAN         fgIsOid
617     )
618 {
619     P_DOMAIN_INFO_ENTRY     prDomainInfo;
620     P_CMD_SET_DOMAIN_INFO_T prCmd;
621     WLAN_STATUS             rStatus;
622     UINT_8                  i;
623     P_DOMAIN_SUBBAND_INFO   prSubBand;
624
625     prDomainInfo = rlmDomainGetDomainInfo(prAdapter);
626     ASSERT(prDomainInfo);
627
628     prCmd = cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_SET_DOMAIN_INFO_T));
629     ASSERT(prCmd);
630
631     /* To do: exception handle */
632     if (!prCmd) {
633         DBGLOG(RLM, ERROR, ("Domain: no buf to send cmd\n"));
634         return;
635     }
636     kalMemZero(prCmd, sizeof(CMD_SET_DOMAIN_INFO_T));
637
638     prCmd->u2CountryCode = prAdapter->rWifiVar.rConnSettings.u2CountryCode;
639     prCmd->u2Reserved = 0;
640     prCmd->uc2G4Bandwidth =
641             prAdapter->rWifiVar.rConnSettings.uc2G4BandwidthMode;
642     prCmd->uc5GBandwidth =
643             prAdapter->rWifiVar.rConnSettings.uc5GBandwidthMode;
644
645     for (i = 0; i < 6; i++) {
646         prSubBand = &prDomainInfo->rSubBand[i];
647
648         prCmd->rSubBand[i].ucRegClass = prSubBand->ucRegClass;
649         prCmd->rSubBand[i].ucBand = prSubBand->ucBand;
650
651         if (prSubBand->ucBand != BAND_NULL && prSubBand->ucBand < BAND_NUM) {
652             prCmd->rSubBand[i].ucChannelSpan = prSubBand->ucChannelSpan;
653             prCmd->rSubBand[i].ucFirstChannelNum = prSubBand->ucFirstChannelNum;
654             prCmd->rSubBand[i].ucNumChannels = prSubBand->ucNumChannels;
655         }
656     }
657
658     /* Update domain info to chip */
659     rStatus = wlanSendSetQueryCmd (
660                 prAdapter,                  /* prAdapter */
661                 CMD_ID_SET_DOMAIN_INFO,     /* ucCID */
662                 TRUE,                       /* fgSetQuery */
663                 FALSE,                      /* fgNeedResp */
664                 fgIsOid,                    /* fgIsOid */
665                 NULL,                       /* pfCmdDoneHandler*/
666                 NULL,                       /* pfCmdTimeoutHandler */
667                 sizeof(CMD_SET_DOMAIN_INFO_T),    /* u4SetQueryInfoLen */
668                 (PUINT_8) prCmd,            /* pucInfoBuffer */
669                 NULL,                       /* pvSetQueryBuffer */
670                 0                           /* u4SetQueryBufferLen */
671                 );
672
673     ASSERT(rStatus == WLAN_STATUS_PENDING);
674
675     cnmMemFree(prAdapter, prCmd);
676 }
677
678 /*----------------------------------------------------------------------------*/
679 /*!
680 * \brief
681 *
682 * \param[in/out]
683 *
684 * \return TRUE  Legal channel
685 *         FALSE Illegal channel for current regulatory domain
686 */
687 /*----------------------------------------------------------------------------*/
688 BOOLEAN
689 rlmDomainIsLegalChannel (
690     P_ADAPTER_T     prAdapter,
691     ENUM_BAND_T     eBand,
692     UINT_8          ucChannel
693     )
694 {
695     UINT_8                  i, j;
696     P_DOMAIN_SUBBAND_INFO   prSubband;
697     P_DOMAIN_INFO_ENTRY     prDomainInfo;
698
699     prDomainInfo = rlmDomainGetDomainInfo(prAdapter);
700     ASSERT(prDomainInfo);
701
702     for (i = 0; i < MAX_SUBBAND_NUM; i++) {
703         prSubband = &prDomainInfo->rSubBand[i];
704
705         if (prSubband->ucBand == BAND_5G && !prAdapter->fgEnable5GBand) {
706             continue;
707         }
708
709         if (prSubband->ucBand == eBand) {
710             for (j = 0; j < prSubband->ucNumChannels; j++) {
711                 if ((prSubband->ucFirstChannelNum + j*prSubband->ucChannelSpan)
712                     == ucChannel) {
713                     return TRUE;
714                 }
715             }
716         }
717     }
718
719     return FALSE;
720 }