1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Customer code to add GPIO control during WLAN start/stop
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (C) 2020, Broadcom.
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Unless you and Broadcom execute a separate written software license
7*4882a593Smuzhiyun * agreement governing use of this software, this software is licensed to you
8*4882a593Smuzhiyun * under the terms of the GNU General Public License version 2 (the "GPL"),
9*4882a593Smuzhiyun * available at http://www.broadcom.com/licenses/GPLv2.php, with the
10*4882a593Smuzhiyun * following added to such license:
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun * As a special exception, the copyright holders of this software give you
13*4882a593Smuzhiyun * permission to link this software with independent modules, and to copy and
14*4882a593Smuzhiyun * distribute the resulting executable under terms of your choice, provided that
15*4882a593Smuzhiyun * you also meet, for each linked independent module, the terms and conditions of
16*4882a593Smuzhiyun * the license of that module. An independent module is a module which is not
17*4882a593Smuzhiyun * derived from this software. The special exception does not apply to any
18*4882a593Smuzhiyun * modifications of the software.
19*4882a593Smuzhiyun *
20*4882a593Smuzhiyun *
21*4882a593Smuzhiyun * <<Broadcom-WL-IPTag/Open:>>
22*4882a593Smuzhiyun *
23*4882a593Smuzhiyun * $Id$
24*4882a593Smuzhiyun */
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun #include <typedefs.h>
27*4882a593Smuzhiyun #include <linuxver.h>
28*4882a593Smuzhiyun #include <osl.h>
29*4882a593Smuzhiyun #include <bcmutils.h>
30*4882a593Smuzhiyun #include <dngl_stats.h>
31*4882a593Smuzhiyun #include <dhd.h>
32*4882a593Smuzhiyun #include <dhd_linux.h>
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun #include <wlioctl.h>
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun #ifndef BCMDONGLEHOST
37*4882a593Smuzhiyun #include <wlc_pub.h>
38*4882a593Smuzhiyun #include <wl_dbg.h>
39*4882a593Smuzhiyun #else
40*4882a593Smuzhiyun #define WL_ERROR(x) printf x
41*4882a593Smuzhiyun #define WL_TRACE(x)
42*4882a593Smuzhiyun #endif
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun #if defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID)
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun #if defined(BCMLXSDMMC)
47*4882a593Smuzhiyun extern int sdioh_mmc_irq(int irq);
48*4882a593Smuzhiyun #endif /* (BCMLXSDMMC) */
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun /* Customer specific Host GPIO defintion */
51*4882a593Smuzhiyun static int dhd_oob_gpio_num = -1;
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun module_param(dhd_oob_gpio_num, int, 0644);
54*4882a593Smuzhiyun MODULE_PARM_DESC(dhd_oob_gpio_num, "DHD oob gpio number");
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun /* This function will return:
57*4882a593Smuzhiyun * 1) return : Host gpio interrupt number per customer platform
58*4882a593Smuzhiyun * 2) irq_flags_ptr : Type of Host interrupt as Level or Edge
59*4882a593Smuzhiyun *
60*4882a593Smuzhiyun * NOTE :
61*4882a593Smuzhiyun * Customer should check his platform definitions
62*4882a593Smuzhiyun * and his Host Interrupt spec
63*4882a593Smuzhiyun * to figure out the proper setting for his platform.
64*4882a593Smuzhiyun * Broadcom provides just reference settings as example.
65*4882a593Smuzhiyun *
66*4882a593Smuzhiyun */
dhd_customer_oob_irq_map(void * adapter,unsigned long * irq_flags_ptr)67*4882a593Smuzhiyun int dhd_customer_oob_irq_map(void *adapter, unsigned long *irq_flags_ptr)
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun int host_oob_irq = 0;
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun #if defined(CUSTOMER_HW2) || defined(CUSTOMER_HW4) || defined(BOARD_HIKEY)
72*4882a593Smuzhiyun host_oob_irq = wifi_platform_get_irq_number(adapter, irq_flags_ptr);
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun #else
75*4882a593Smuzhiyun #if defined(CUSTOM_OOB_GPIO_NUM)
76*4882a593Smuzhiyun if (dhd_oob_gpio_num < 0) {
77*4882a593Smuzhiyun dhd_oob_gpio_num = CUSTOM_OOB_GPIO_NUM;
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun #endif /* CUSTOMER_OOB_GPIO_NUM */
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun if (dhd_oob_gpio_num < 0) {
82*4882a593Smuzhiyun WL_ERROR(("%s: ERROR customer specific Host GPIO is NOT defined \n",
83*4882a593Smuzhiyun __FUNCTION__));
84*4882a593Smuzhiyun return (dhd_oob_gpio_num);
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun WL_ERROR(("%s: customer specific Host GPIO number is (%d)\n",
88*4882a593Smuzhiyun __FUNCTION__, dhd_oob_gpio_num));
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun #endif /* CUSTOMER_HW2 || CUSTOMER_HW4 || BOARD_HIKEY */
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun return (host_oob_irq);
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun #endif /* defined(OOB_INTR_ONLY) || defined(BCMSPI_ANDROID) */
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun /* Customer function to control hw specific wlan gpios */
97*4882a593Smuzhiyun int
dhd_customer_gpio_wlan_ctrl(void * adapter,int onoff)98*4882a593Smuzhiyun dhd_customer_gpio_wlan_ctrl(void *adapter, int onoff)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun int err = 0;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun return err;
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun #if 0
106*4882a593Smuzhiyun /* Function to get custom MAC address */
107*4882a593Smuzhiyun int
108*4882a593Smuzhiyun dhd_custom_get_mac_address(void *adapter, unsigned char *buf)
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun int ret = 0;
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun WL_TRACE(("%s Enter\n", __FUNCTION__));
113*4882a593Smuzhiyun if (!buf)
114*4882a593Smuzhiyun return -EINVAL;
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun /* Customer access to MAC address stored outside of DHD driver */
117*4882a593Smuzhiyun #if (defined(CUSTOMER_HW2) || defined(CUSTOMER_HW10) || defined(BOARD_HIKEY)) && \
118*4882a593Smuzhiyun (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35))
119*4882a593Smuzhiyun ret = wifi_platform_get_mac_addr(adapter, buf);
120*4882a593Smuzhiyun #endif
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun #ifdef EXAMPLE_GET_MAC
123*4882a593Smuzhiyun /* EXAMPLE code */
124*4882a593Smuzhiyun {
125*4882a593Smuzhiyun struct ether_addr ea_example = {{0x00, 0x11, 0x22, 0x33, 0x44, 0xFF}};
126*4882a593Smuzhiyun bcopy((char *)&ea_example, buf, sizeof(struct ether_addr));
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun #endif /* EXAMPLE_GET_MAC */
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun return ret;
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun #endif /* GET_CUSTOM_MAC_ENABLE */
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun #ifndef CUSTOMER_HW4
135*4882a593Smuzhiyun /* Customized Locale table : OPTIONAL feature */
136*4882a593Smuzhiyun const struct cntry_locales_custom translate_custom_table[] = {
137*4882a593Smuzhiyun /* Table should be filled out based on custom platform regulatory requirement */
138*4882a593Smuzhiyun #ifdef EXAMPLE_TABLE
139*4882a593Smuzhiyun {"", "XY", 4}, /* Universal if Country code is unknown or empty */
140*4882a593Smuzhiyun {"US", "US", 69}, /* input ISO "US" to : US regrev 69 */
141*4882a593Smuzhiyun {"CA", "US", 69}, /* input ISO "CA" to : US regrev 69 */
142*4882a593Smuzhiyun {"EU", "EU", 5}, /* European union countries to : EU regrev 05 */
143*4882a593Smuzhiyun {"AT", "EU", 5},
144*4882a593Smuzhiyun {"BE", "EU", 5},
145*4882a593Smuzhiyun {"BG", "EU", 5},
146*4882a593Smuzhiyun {"CY", "EU", 5},
147*4882a593Smuzhiyun {"CZ", "EU", 5},
148*4882a593Smuzhiyun {"DK", "EU", 5},
149*4882a593Smuzhiyun {"EE", "EU", 5},
150*4882a593Smuzhiyun {"FI", "EU", 5},
151*4882a593Smuzhiyun {"FR", "EU", 5},
152*4882a593Smuzhiyun {"DE", "EU", 5},
153*4882a593Smuzhiyun {"GR", "EU", 5},
154*4882a593Smuzhiyun {"HU", "EU", 5},
155*4882a593Smuzhiyun {"IE", "EU", 5},
156*4882a593Smuzhiyun {"IT", "EU", 5},
157*4882a593Smuzhiyun {"LV", "EU", 5},
158*4882a593Smuzhiyun {"LI", "EU", 5},
159*4882a593Smuzhiyun {"LT", "EU", 5},
160*4882a593Smuzhiyun {"LU", "EU", 5},
161*4882a593Smuzhiyun {"MT", "EU", 5},
162*4882a593Smuzhiyun {"NL", "EU", 5},
163*4882a593Smuzhiyun {"PL", "EU", 5},
164*4882a593Smuzhiyun {"PT", "EU", 5},
165*4882a593Smuzhiyun {"RO", "EU", 5},
166*4882a593Smuzhiyun {"SK", "EU", 5},
167*4882a593Smuzhiyun {"SI", "EU", 5},
168*4882a593Smuzhiyun {"ES", "EU", 5},
169*4882a593Smuzhiyun {"SE", "EU", 5},
170*4882a593Smuzhiyun {"GB", "EU", 5},
171*4882a593Smuzhiyun {"KR", "XY", 3},
172*4882a593Smuzhiyun {"AU", "XY", 3},
173*4882a593Smuzhiyun {"CN", "XY", 3}, /* input ISO "CN" to : XY regrev 03 */
174*4882a593Smuzhiyun {"TW", "XY", 3},
175*4882a593Smuzhiyun {"AR", "XY", 3},
176*4882a593Smuzhiyun {"MX", "XY", 3},
177*4882a593Smuzhiyun {"IL", "IL", 0},
178*4882a593Smuzhiyun {"CH", "CH", 0},
179*4882a593Smuzhiyun {"TR", "TR", 0},
180*4882a593Smuzhiyun {"NO", "NO", 0},
181*4882a593Smuzhiyun #endif /* EXMAPLE_TABLE */
182*4882a593Smuzhiyun #if (defined(CUSTOMER_HW2) || defined(BOARD_HIKEY)) && !defined(CUSTOMER_HW5)
183*4882a593Smuzhiyun #if defined(BCM4335_CHIP)
184*4882a593Smuzhiyun {"", "XZ", 11}, /* Universal if Country code is unknown or empty */
185*4882a593Smuzhiyun #endif
186*4882a593Smuzhiyun {"AE", "AE", 1},
187*4882a593Smuzhiyun {"AR", "AR", 1},
188*4882a593Smuzhiyun {"AT", "AT", 1},
189*4882a593Smuzhiyun {"AU", "AU", 2},
190*4882a593Smuzhiyun {"BE", "BE", 1},
191*4882a593Smuzhiyun {"BG", "BG", 1},
192*4882a593Smuzhiyun {"BN", "BN", 1},
193*4882a593Smuzhiyun {"CA", "CA", 2},
194*4882a593Smuzhiyun {"CH", "CH", 1},
195*4882a593Smuzhiyun {"CY", "CY", 1},
196*4882a593Smuzhiyun {"CZ", "CZ", 1},
197*4882a593Smuzhiyun {"DE", "DE", 3},
198*4882a593Smuzhiyun {"DK", "DK", 1},
199*4882a593Smuzhiyun {"EE", "EE", 1},
200*4882a593Smuzhiyun {"ES", "ES", 1},
201*4882a593Smuzhiyun {"FI", "FI", 1},
202*4882a593Smuzhiyun {"FR", "FR", 1},
203*4882a593Smuzhiyun {"GB", "GB", 1},
204*4882a593Smuzhiyun {"GR", "GR", 1},
205*4882a593Smuzhiyun {"HR", "HR", 1},
206*4882a593Smuzhiyun {"HU", "HU", 1},
207*4882a593Smuzhiyun {"IE", "IE", 1},
208*4882a593Smuzhiyun {"IS", "IS", 1},
209*4882a593Smuzhiyun {"IT", "IT", 1},
210*4882a593Smuzhiyun {"ID", "ID", 1},
211*4882a593Smuzhiyun {"JP", "JP", 8},
212*4882a593Smuzhiyun {"KR", "KR", 24},
213*4882a593Smuzhiyun {"KW", "KW", 1},
214*4882a593Smuzhiyun {"LI", "LI", 1},
215*4882a593Smuzhiyun {"LT", "LT", 1},
216*4882a593Smuzhiyun {"LU", "LU", 1},
217*4882a593Smuzhiyun {"LV", "LV", 1},
218*4882a593Smuzhiyun {"MA", "MA", 1},
219*4882a593Smuzhiyun {"MT", "MT", 1},
220*4882a593Smuzhiyun {"MX", "MX", 1},
221*4882a593Smuzhiyun {"NL", "NL", 1},
222*4882a593Smuzhiyun {"NO", "NO", 1},
223*4882a593Smuzhiyun {"PL", "PL", 1},
224*4882a593Smuzhiyun {"PT", "PT", 1},
225*4882a593Smuzhiyun {"PY", "PY", 1},
226*4882a593Smuzhiyun {"RO", "RO", 1},
227*4882a593Smuzhiyun {"SE", "SE", 1},
228*4882a593Smuzhiyun {"SI", "SI", 1},
229*4882a593Smuzhiyun {"SK", "SK", 1},
230*4882a593Smuzhiyun {"TR", "TR", 7},
231*4882a593Smuzhiyun {"TW", "TW", 1},
232*4882a593Smuzhiyun {"IR", "XZ", 11}, /* Universal if Country code is IRAN, (ISLAMIC REPUBLIC OF) */
233*4882a593Smuzhiyun {"SD", "XZ", 11}, /* Universal if Country code is SUDAN */
234*4882a593Smuzhiyun {"SY", "XZ", 11}, /* Universal if Country code is SYRIAN ARAB REPUBLIC */
235*4882a593Smuzhiyun {"GL", "XZ", 11}, /* Universal if Country code is GREENLAND */
236*4882a593Smuzhiyun {"PS", "XZ", 11}, /* Universal if Country code is PALESTINIAN TERRITORY, OCCUPIED */
237*4882a593Smuzhiyun {"TL", "XZ", 11}, /* Universal if Country code is TIMOR-LESTE (EAST TIMOR) */
238*4882a593Smuzhiyun {"MH", "XZ", 11}, /* Universal if Country code is MARSHALL ISLANDS */
239*4882a593Smuzhiyun #elif defined(CUSTOMER_HW5)
240*4882a593Smuzhiyun {"", "XZ", 11},
241*4882a593Smuzhiyun {"AE", "AE", 212},
242*4882a593Smuzhiyun {"AG", "AG", 2},
243*4882a593Smuzhiyun {"AI", "AI", 2},
244*4882a593Smuzhiyun {"AL", "AL", 2},
245*4882a593Smuzhiyun {"AN", "AN", 3},
246*4882a593Smuzhiyun {"AR", "AR", 212},
247*4882a593Smuzhiyun {"AS", "AS", 15},
248*4882a593Smuzhiyun {"AT", "AT", 4},
249*4882a593Smuzhiyun {"AU", "AU", 212},
250*4882a593Smuzhiyun {"AW", "AW", 2},
251*4882a593Smuzhiyun {"AZ", "AZ", 2},
252*4882a593Smuzhiyun {"BA", "BA", 2},
253*4882a593Smuzhiyun {"BD", "BD", 2},
254*4882a593Smuzhiyun {"BE", "BE", 4},
255*4882a593Smuzhiyun {"BG", "BG", 4},
256*4882a593Smuzhiyun {"BH", "BH", 4},
257*4882a593Smuzhiyun {"BM", "BM", 15},
258*4882a593Smuzhiyun {"BN", "BN", 4},
259*4882a593Smuzhiyun {"BR", "BR", 212},
260*4882a593Smuzhiyun {"BS", "BS", 2},
261*4882a593Smuzhiyun {"BY", "BY", 3},
262*4882a593Smuzhiyun {"BW", "BW", 1},
263*4882a593Smuzhiyun {"CA", "CA", 212},
264*4882a593Smuzhiyun {"CH", "CH", 212},
265*4882a593Smuzhiyun {"CL", "CL", 212},
266*4882a593Smuzhiyun {"CN", "CN", 212},
267*4882a593Smuzhiyun {"CO", "CO", 212},
268*4882a593Smuzhiyun {"CR", "CR", 21},
269*4882a593Smuzhiyun {"CY", "CY", 212},
270*4882a593Smuzhiyun {"CZ", "CZ", 212},
271*4882a593Smuzhiyun {"DE", "DE", 212},
272*4882a593Smuzhiyun {"DK", "DK", 4},
273*4882a593Smuzhiyun {"DZ", "DZ", 1},
274*4882a593Smuzhiyun {"EC", "EC", 23},
275*4882a593Smuzhiyun {"EE", "EE", 4},
276*4882a593Smuzhiyun {"EG", "EG", 212},
277*4882a593Smuzhiyun {"ES", "ES", 212},
278*4882a593Smuzhiyun {"ET", "ET", 2},
279*4882a593Smuzhiyun {"FI", "FI", 4},
280*4882a593Smuzhiyun {"FR", "FR", 212},
281*4882a593Smuzhiyun {"GB", "GB", 212},
282*4882a593Smuzhiyun {"GD", "GD", 2},
283*4882a593Smuzhiyun {"GF", "GF", 2},
284*4882a593Smuzhiyun {"GP", "GP", 2},
285*4882a593Smuzhiyun {"GR", "GR", 212},
286*4882a593Smuzhiyun {"GT", "GT", 0},
287*4882a593Smuzhiyun {"GU", "GU", 17},
288*4882a593Smuzhiyun {"HK", "HK", 212},
289*4882a593Smuzhiyun {"HR", "HR", 4},
290*4882a593Smuzhiyun {"HU", "HU", 4},
291*4882a593Smuzhiyun {"IN", "IN", 212},
292*4882a593Smuzhiyun {"ID", "ID", 212},
293*4882a593Smuzhiyun {"IE", "IE", 5},
294*4882a593Smuzhiyun {"IL", "IL", 7},
295*4882a593Smuzhiyun {"IN", "IN", 212},
296*4882a593Smuzhiyun {"IS", "IS", 4},
297*4882a593Smuzhiyun {"IT", "IT", 212},
298*4882a593Smuzhiyun {"JO", "JO", 3},
299*4882a593Smuzhiyun {"JP", "JP", 212},
300*4882a593Smuzhiyun {"KH", "KH", 4},
301*4882a593Smuzhiyun {"KI", "KI", 1},
302*4882a593Smuzhiyun {"KR", "KR", 212},
303*4882a593Smuzhiyun {"KW", "KW", 5},
304*4882a593Smuzhiyun {"KY", "KY", 4},
305*4882a593Smuzhiyun {"KZ", "KZ", 212},
306*4882a593Smuzhiyun {"LA", "LA", 4},
307*4882a593Smuzhiyun {"LB", "LB", 6},
308*4882a593Smuzhiyun {"LI", "LI", 4},
309*4882a593Smuzhiyun {"LK", "LK", 3},
310*4882a593Smuzhiyun {"LS", "LS", 2},
311*4882a593Smuzhiyun {"LT", "LT", 4},
312*4882a593Smuzhiyun {"LR", "LR", 2},
313*4882a593Smuzhiyun {"LU", "LU", 3},
314*4882a593Smuzhiyun {"LV", "LV", 4},
315*4882a593Smuzhiyun {"MA", "MA", 2},
316*4882a593Smuzhiyun {"MC", "MC", 1},
317*4882a593Smuzhiyun {"MD", "MD", 2},
318*4882a593Smuzhiyun {"ME", "ME", 2},
319*4882a593Smuzhiyun {"MK", "MK", 2},
320*4882a593Smuzhiyun {"MN", "MN", 0},
321*4882a593Smuzhiyun {"MO", "MO", 2},
322*4882a593Smuzhiyun {"MR", "MR", 2},
323*4882a593Smuzhiyun {"MT", "MT", 4},
324*4882a593Smuzhiyun {"MQ", "MQ", 2},
325*4882a593Smuzhiyun {"MU", "MU", 2},
326*4882a593Smuzhiyun {"MV", "MV", 3},
327*4882a593Smuzhiyun {"MX", "MX", 212},
328*4882a593Smuzhiyun {"MY", "MY", 212},
329*4882a593Smuzhiyun {"NI", "NI", 0},
330*4882a593Smuzhiyun {"NL", "NL", 212},
331*4882a593Smuzhiyun {"NO", "NO", 4},
332*4882a593Smuzhiyun {"NP", "NP", 3},
333*4882a593Smuzhiyun {"NZ", "NZ", 9},
334*4882a593Smuzhiyun {"OM", "OM", 4},
335*4882a593Smuzhiyun {"PA", "PA", 17},
336*4882a593Smuzhiyun {"PE", "PE", 212},
337*4882a593Smuzhiyun {"PG", "PG", 2},
338*4882a593Smuzhiyun {"PH", "PH", 212},
339*4882a593Smuzhiyun {"PL", "PL", 212},
340*4882a593Smuzhiyun {"PR", "PR", 25},
341*4882a593Smuzhiyun {"PT", "PT", 212},
342*4882a593Smuzhiyun {"PY", "PY", 4},
343*4882a593Smuzhiyun {"RE", "RE", 2},
344*4882a593Smuzhiyun {"RO", "RO", 212},
345*4882a593Smuzhiyun {"RS", "RS", 2},
346*4882a593Smuzhiyun {"RU", "RU", 212},
347*4882a593Smuzhiyun {"SA", "SA", 212},
348*4882a593Smuzhiyun {"SE", "SE", 212},
349*4882a593Smuzhiyun {"SG", "SG", 212},
350*4882a593Smuzhiyun {"SI", "SI", 4},
351*4882a593Smuzhiyun {"SK", "SK", 212},
352*4882a593Smuzhiyun {"SN", "SN", 2},
353*4882a593Smuzhiyun {"SV", "SV", 25},
354*4882a593Smuzhiyun {"TH", "TH", 212},
355*4882a593Smuzhiyun {"TR", "TR", 212},
356*4882a593Smuzhiyun {"TT", "TT", 5},
357*4882a593Smuzhiyun {"TW", "TW", 212},
358*4882a593Smuzhiyun {"UA", "UA", 212},
359*4882a593Smuzhiyun {"UG", "UG", 2},
360*4882a593Smuzhiyun {"US", "US", 212},
361*4882a593Smuzhiyun {"UY", "UY", 5},
362*4882a593Smuzhiyun {"VA", "VA", 2},
363*4882a593Smuzhiyun {"VE", "VE", 3},
364*4882a593Smuzhiyun {"VG", "VG", 2},
365*4882a593Smuzhiyun {"VI", "VI", 18},
366*4882a593Smuzhiyun {"VN", "VN", 4},
367*4882a593Smuzhiyun {"YT", "YT", 2},
368*4882a593Smuzhiyun {"ZA", "ZA", 212},
369*4882a593Smuzhiyun {"ZM", "ZM", 2},
370*4882a593Smuzhiyun {"XT", "XT", 212},
371*4882a593Smuzhiyun {"XZ", "XZ", 11},
372*4882a593Smuzhiyun {"XV", "XV", 17},
373*4882a593Smuzhiyun {"Q1", "Q1", 77},
374*4882a593Smuzhiyun #endif /* (CUSTOMER_HW2 || BOARD_HIKEY) && CUSTOMER_HW5 */
375*4882a593Smuzhiyun };
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun /* Customized Locale convertor
378*4882a593Smuzhiyun * input : ISO 3166-1 country abbreviation
379*4882a593Smuzhiyun * output: customized cspec
380*4882a593Smuzhiyun */
381*4882a593Smuzhiyun void
382*4882a593Smuzhiyun #ifdef CUSTOM_COUNTRY_CODE
get_customized_country_code(void * adapter,char * country_iso_code,wl_country_t * cspec,u32 flags)383*4882a593Smuzhiyun get_customized_country_code(void *adapter, char *country_iso_code,
384*4882a593Smuzhiyun wl_country_t *cspec, u32 flags)
385*4882a593Smuzhiyun #else
386*4882a593Smuzhiyun get_customized_country_code(void *adapter, char *country_iso_code, wl_country_t *cspec)
387*4882a593Smuzhiyun #endif /* CUSTOM_COUNTRY_CODE */
388*4882a593Smuzhiyun {
389*4882a593Smuzhiyun #if defined(OEM_ANDROID)
390*4882a593Smuzhiyun #if (defined(CUSTOMER_HW) || defined(CUSTOMER_HW2)) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 39))
391*4882a593Smuzhiyun
392*4882a593Smuzhiyun struct cntry_locales_custom *cloc_ptr;
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun if (!cspec)
395*4882a593Smuzhiyun return;
396*4882a593Smuzhiyun #ifdef CUSTOM_COUNTRY_CODE
397*4882a593Smuzhiyun cloc_ptr = wifi_platform_get_country_code(adapter, country_iso_code, flags);
398*4882a593Smuzhiyun #else
399*4882a593Smuzhiyun cloc_ptr = wifi_platform_get_country_code(adapter, country_iso_code);
400*4882a593Smuzhiyun #endif /* CUSTOM_COUNTRY_CODE */
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun if (cloc_ptr) {
403*4882a593Smuzhiyun strlcpy(cspec->ccode, cloc_ptr->custom_locale, WLC_CNTRY_BUF_SZ);
404*4882a593Smuzhiyun cspec->rev = cloc_ptr->custom_locale_rev;
405*4882a593Smuzhiyun }
406*4882a593Smuzhiyun return;
407*4882a593Smuzhiyun #else
408*4882a593Smuzhiyun int size, i;
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun size = ARRAYSIZE(translate_custom_table);
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun if (cspec == 0)
413*4882a593Smuzhiyun return;
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun if (size == 0)
416*4882a593Smuzhiyun return;
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun for (i = 0; i < size; i++) {
419*4882a593Smuzhiyun if (strcmp(country_iso_code, translate_custom_table[i].iso_abbrev) == 0) {
420*4882a593Smuzhiyun memcpy(cspec->ccode,
421*4882a593Smuzhiyun translate_custom_table[i].custom_locale, WLC_CNTRY_BUF_SZ);
422*4882a593Smuzhiyun cspec->rev = translate_custom_table[i].custom_locale_rev;
423*4882a593Smuzhiyun return;
424*4882a593Smuzhiyun }
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun #ifdef EXAMPLE_TABLE
427*4882a593Smuzhiyun /* if no country code matched return first universal code from translate_custom_table */
428*4882a593Smuzhiyun memcpy(cspec->ccode, translate_custom_table[0].custom_locale, WLC_CNTRY_BUF_SZ);
429*4882a593Smuzhiyun cspec->rev = translate_custom_table[0].custom_locale_rev;
430*4882a593Smuzhiyun #endif /* EXMAPLE_TABLE */
431*4882a593Smuzhiyun return;
432*4882a593Smuzhiyun #endif /* (defined(CUSTOMER_HW2) || defined(BOARD_HIKEY)) &&
433*4882a593Smuzhiyun * (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36))
434*4882a593Smuzhiyun */
435*4882a593Smuzhiyun #endif /* OEM_ANDROID */
436*4882a593Smuzhiyun }
437*4882a593Smuzhiyun #endif /* !CUSTOMER_HW4 */
438