2 ** $Id: //Department/DaVinci/BRANCHES/MT662X_593X_WIFI_DRIVER_V2_3/mgmt/rlm_domain.c#1 $
5 /*! \file "rlm_domain.c"
10 /*******************************************************************************
11 * Copyright (c) 2009 MediaTek Inc.
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
17 ********************************************************************************
20 /*******************************************************************************
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.
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.
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
49 ********************************************************************************
53 ** $Log: rlm_domain.c $
57 * Modify debug message for XLOG
61 * Change the function prototype of rlmDomainGetChnlList()
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
68 * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code
69 * Exclude channel list with illegal band
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
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
80 * [WCXRP00000969] [MT6620 Wi-Fi][Driver][FW] Channel list for 5G band based on country code
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
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.
92 * [WCXRP00000505] [MT6620 Wi-Fi][Driver/FW] WiFi Direct Integration
93 * Export rlmDomainGetDomainInfo for p2p driver.
96 * [WCXRP00000354] [MT6620 Wi-Fi][Driver][FW] Follow NVRAM bandwidth setting
97 * User-defined bandwidth is for 2.4G and 5G individually
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.
106 * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
108 * 07 08 2010 cm.chang
109 * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
110 * Check draft RLM code for HT cap
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
116 * 01 22 2010 cm.chang
117 * [BORA00000018]Integrate WIFI part into BORA for the 1st time
118 * Support protection and bandwidth switch
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.
124 * Dec 1 2009 mtk01104
125 * [BORA00000018] Integrate WIFI part into BORA for the 1st time
131 /*******************************************************************************
132 * C O M P I L E R F L A G S
133 ********************************************************************************
136 /*******************************************************************************
137 * E X T E R N A L R E F E R E N C E S
138 ********************************************************************************
142 /*******************************************************************************
144 ********************************************************************************
147 /*******************************************************************************
149 ********************************************************************************
152 /*******************************************************************************
153 * P U B L I C D A T A
154 ********************************************************************************
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.
163 /* Define mapping tables between country code and its channel set
165 static const UINT_16 g_u2CountryGroup0[] =
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
173 static const UINT_16 g_u2CountryGroup1[] =
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
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[] =
182 COUNTRY_CODE_CN, COUNTRY_CODE_UY, COUNTRY_CODE_MA
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[] =
189 COUNTRY_CODE_ID, COUNTRY_CODE_HN, COUNTRY_CODE_PG, COUNTRY_CODE_PK
191 static const UINT_16 g_u2CountryGroup9[] = {COUNTRY_CODE_CA};
192 static const UINT_16 g_u2CountryGroup10[] =
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
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[] =
203 /* When country code is not found, this domain info will be used.
204 * So mark all country codes to reduce search time. 20110908
206 /*, COUNTRY_CODE_PH, COUNTRY_CODE_TR, COUNTRY_CODE_IR, COUNTRY_CODE_BY,
211 DOMAIN_INFO_ENTRY arSupportedRegDomains[] = {
213 (PUINT_16) g_u2CountryGroup0, sizeof(g_u2CountryGroup0) / 2,
215 { 81, BAND_2G4, CHNL_SPAN_5, 1, 11, FALSE }, /* CH_SET_2G4_1_11 */
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 }
225 (PUINT_16) g_u2CountryGroup1, sizeof(g_u2CountryGroup1) / 2,
227 { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_13 */
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 }
237 (PUINT_16) g_u2CountryGroup2, sizeof(g_u2CountryGroup2) / 2,
239 { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_13 */
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 }
249 (PUINT_16) g_u2CountryGroup3, sizeof(g_u2CountryGroup3) / 2,
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 },
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 */
261 (PUINT_16) g_u2CountryGroup4, sizeof(g_u2CountryGroup4) / 2,
263 { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_13 */
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 }
273 (PUINT_16) g_u2CountryGroup5, sizeof(g_u2CountryGroup5) / 2,
275 { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_13 */
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 }
285 (PUINT_16) g_u2CountryGroup6, sizeof(g_u2CountryGroup6) / 2,
287 { 81, BAND_2G4, CHNL_SPAN_5, 1, 11, FALSE }, /* CH_SET_2G4_1_11 */
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 }
297 (PUINT_16) g_u2CountryGroup7, sizeof(g_u2CountryGroup7) / 2,
299 { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_13 */
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 }
309 (PUINT_16) g_u2CountryGroup8, sizeof(g_u2CountryGroup8) / 2,
311 { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_13 */
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 }
321 (PUINT_16) g_u2CountryGroup9, sizeof(g_u2CountryGroup9) / 2,
323 { 81, BAND_2G4, CHNL_SPAN_5, 1, 11, FALSE }, /* CH_SET_2G4_1_11 */
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 */
333 (PUINT_16) g_u2CountryGroup10, sizeof(g_u2CountryGroup10) / 2,
335 { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_13 */
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 }
345 (PUINT_16) g_u2CountryGroup11, sizeof(g_u2CountryGroup11) / 2,
347 { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_13 */
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 }
357 (PUINT_16) g_u2CountryGroup12, sizeof(g_u2CountryGroup12) / 2,
359 { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_13 */
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 }
369 (PUINT_16) g_u2CountryGroup13, sizeof(g_u2CountryGroup13) / 2,
371 { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_13 */
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 }
381 /* Note: The final one is for Europe union now. */
382 (PUINT_16) g_u2CountryGroup14, sizeof(g_u2CountryGroup14) / 2,
384 { 81, BAND_2G4, CHNL_SPAN_5, 1, 13, FALSE }, /* CH_SET_2G4_1_13 */
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 }
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},
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},
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},
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},
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}
450 /*******************************************************************************
451 * P R I V A T E D A T A
452 ********************************************************************************
455 /*******************************************************************************
457 ********************************************************************************
460 /*******************************************************************************
461 * F U N C T I O N D E C L A R A T I O N S
462 ********************************************************************************
465 /*******************************************************************************
467 ********************************************************************************
470 /*----------------------------------------------------------------------------*/
478 /*----------------------------------------------------------------------------*/
480 rlmDomainGetDomainInfo (
481 P_ADAPTER_T prAdapter
484 #define REG_DOMAIN_DEF_IDX 14 /* EU (Europe Union) */
485 #define REG_DOMAIN_GROUP_NUM \
486 (sizeof(arSupportedRegDomains) / sizeof(DOMAIN_INFO_ENTRY))
489 P_DOMAIN_INFO_ENTRY prDomainInfo;
490 P_REG_INFO_T prRegInfo;
491 UINT_16 u2TargetCountryCode;
495 if (prAdapter->prDomainInfo) {
496 return prAdapter->prDomainInfo;
499 prRegInfo = &prAdapter->prGlueInfo->rRegInfo;
501 DBGLOG(RLM, INFO, ("Domain: map=%d, idx=%d, code=0x%04x\n",
502 prRegInfo->eRegChannelListMap, prRegInfo->ucRegChannelListIndex,
503 prAdapter->rWifiVar.rConnSettings.u2CountryCode));
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;
510 else if (prRegInfo->eRegChannelListMap == REG_CH_MAP_CUSTOMIZED) {
511 prDomainInfo = &prRegInfo->rDomainInfo;
512 goto L_set_domain_info;
515 u2TargetCountryCode = prAdapter->rWifiVar.rConnSettings.u2CountryCode;
517 /* If no matched country code, the final one will be used
518 * The final one is for Europe union now.
520 for (i = 0; i < REG_DOMAIN_GROUP_NUM; i++) {
521 prDomainInfo = &arSupportedRegDomains[i];
523 ASSERT((prDomainInfo->u4CountryNum && prDomainInfo->pu2CountryGroup) ||
524 prDomainInfo->u4CountryNum == 0);
526 for (j = 0; j < prDomainInfo->u4CountryNum; j++) {
527 if (prDomainInfo->pu2CountryGroup[j] == u2TargetCountryCode) {
531 if (j < prDomainInfo->u4CountryNum) {
536 DATA_STRUC_INSPECTING_ASSERT(REG_DOMAIN_DEF_IDX < REG_DOMAIN_GROUP_NUM);
538 if (i >= REG_DOMAIN_GROUP_NUM) {
539 prDomainInfo = &arSupportedRegDomains[REG_DOMAIN_DEF_IDX];
544 prAdapter->prDomainInfo = prDomainInfo;
548 /*----------------------------------------------------------------------------*/
552 * \param[in/out] The input variable pointed by pucNumOfChannel is the max
553 * arrary size. The return value indciates meaning list size.
557 /*----------------------------------------------------------------------------*/
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
568 P_DOMAIN_SUBBAND_INFO prSubband;
569 P_DOMAIN_INFO_ENTRY prDomainInfo;
572 ASSERT(paucChannelList);
573 ASSERT(pucNumOfChannel);
575 /* If no matched country code, the final one will be used */
576 prDomainInfo = rlmDomainGetDomainInfo(prAdapter);
577 ASSERT(prDomainInfo);
580 for (i = 0; i < MAX_SUBBAND_NUM; i++) {
581 prSubband = &prDomainInfo->rSubBand[i];
583 if (prSubband->ucBand == BAND_NULL || prSubband->ucBand >= BAND_NUM ||
584 (prSubband->ucBand == BAND_5G && !prAdapter->fgEnable5GBand)) {
588 if (eSpecificBand == BAND_NULL || prSubband->ucBand == eSpecificBand) {
589 for (j = 0; j < prSubband->ucNumChannels; j++) {
590 if (ucNum >= ucMaxChannelNum) {
593 paucChannelList[ucNum].eBand = prSubband->ucBand;
594 paucChannelList[ucNum].ucChannelNum =
595 prSubband->ucFirstChannelNum + j * prSubband->ucChannelSpan;
601 *pucNumOfChannel = ucNum;
604 /*----------------------------------------------------------------------------*/
612 /*----------------------------------------------------------------------------*/
615 P_ADAPTER_T prAdapter,
619 P_DOMAIN_INFO_ENTRY prDomainInfo;
620 P_CMD_SET_DOMAIN_INFO_T prCmd;
623 P_DOMAIN_SUBBAND_INFO prSubBand;
625 prDomainInfo = rlmDomainGetDomainInfo(prAdapter);
626 ASSERT(prDomainInfo);
628 prCmd = cnmMemAlloc(prAdapter, RAM_TYPE_BUF, sizeof(CMD_SET_DOMAIN_INFO_T));
631 /* To do: exception handle */
633 DBGLOG(RLM, ERROR, ("Domain: no buf to send cmd\n"));
636 kalMemZero(prCmd, sizeof(CMD_SET_DOMAIN_INFO_T));
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;
645 for (i = 0; i < 6; i++) {
646 prSubBand = &prDomainInfo->rSubBand[i];
648 prCmd->rSubBand[i].ucRegClass = prSubBand->ucRegClass;
649 prCmd->rSubBand[i].ucBand = prSubBand->ucBand;
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;
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 */
673 ASSERT(rStatus == WLAN_STATUS_PENDING);
675 cnmMemFree(prAdapter, prCmd);
678 /*----------------------------------------------------------------------------*/
684 * \return TRUE Legal channel
685 * FALSE Illegal channel for current regulatory domain
687 /*----------------------------------------------------------------------------*/
689 rlmDomainIsLegalChannel (
690 P_ADAPTER_T prAdapter,
696 P_DOMAIN_SUBBAND_INFO prSubband;
697 P_DOMAIN_INFO_ENTRY prDomainInfo;
699 prDomainInfo = rlmDomainGetDomainInfo(prAdapter);
700 ASSERT(prDomainInfo);
702 for (i = 0; i < MAX_SUBBAND_NUM; i++) {
703 prSubband = &prDomainInfo->rSubBand[i];
705 if (prSubband->ucBand == BAND_5G && !prAdapter->fgEnable5GBand) {
709 if (prSubband->ucBand == eBand) {
710 for (j = 0; j < prSubband->ucNumChannels; j++) {
711 if ((prSubband->ucFirstChannelNum + j*prSubband->ucChannelSpan)