xref: /OK3568_Linux_fs/external/rkwifibt/drivers/bcmdhd/dhd_ccode.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun 
2*4882a593Smuzhiyun #ifdef CCODE_LIST
3*4882a593Smuzhiyun #ifdef CONFIG_COMPAT
4*4882a593Smuzhiyun #include <linux/compat.h>
5*4882a593Smuzhiyun #endif /* COMFIG_COMPAT */
6*4882a593Smuzhiyun #include <typedefs.h>
7*4882a593Smuzhiyun #include <dhd_config.h>
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifdef BCMSDIO
10*4882a593Smuzhiyun #define CCODE_43438
11*4882a593Smuzhiyun #define CCODE_43436
12*4882a593Smuzhiyun #define CCODE_43455C0
13*4882a593Smuzhiyun #endif
14*4882a593Smuzhiyun #if defined(BCMSDIO) || defined(BCMPCIE)
15*4882a593Smuzhiyun #define CCODE_4356A2
16*4882a593Smuzhiyun #define CCODE_4359C0
17*4882a593Smuzhiyun #endif
18*4882a593Smuzhiyun #if defined(BCMPCIE)
19*4882a593Smuzhiyun //#define CCODE_4375B4
20*4882a593Smuzhiyun #endif
21*4882a593Smuzhiyun #ifdef BCMDBUS
22*4882a593Smuzhiyun #define CCODE_4358U
23*4882a593Smuzhiyun #endif
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #ifdef BCMSDIO
26*4882a593Smuzhiyun #ifdef CCODE_43438
27*4882a593Smuzhiyun const char ccode_43438[] = "RU/13";
28*4882a593Smuzhiyun #else
29*4882a593Smuzhiyun const char ccode_43438[] = "";
30*4882a593Smuzhiyun #endif
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #ifdef CCODE_43436
33*4882a593Smuzhiyun const char ccode_43436[] = \
34*4882a593Smuzhiyun "AE/1 AR/1 AT/1 AU/2 "\
35*4882a593Smuzhiyun "BE/1 BG/1 BN/1 "\
36*4882a593Smuzhiyun "CA/2 CH/1 CN/38 CY/1 CZ/1 "\
37*4882a593Smuzhiyun "DE/3 DK/1 "\
38*4882a593Smuzhiyun "EE/1 ES/1 "\
39*4882a593Smuzhiyun "FI/1 FR/1 "\
40*4882a593Smuzhiyun "GB/1 GR/1 "\
41*4882a593Smuzhiyun "HR/1 HU/1 "\
42*4882a593Smuzhiyun "ID/5 IE/1 IS/1 IT/1 "\
43*4882a593Smuzhiyun "JP/3 "\
44*4882a593Smuzhiyun "KR/4 KW/1 "\
45*4882a593Smuzhiyun "LI/1 LT/1 LU/1 LV/1 "\
46*4882a593Smuzhiyun "MA/1 MT/1 MX/1 "\
47*4882a593Smuzhiyun "NL/1 NO/1 "\
48*4882a593Smuzhiyun "PL/1 PT/1 PY/1 "\
49*4882a593Smuzhiyun "RO/1 RU/5 "\
50*4882a593Smuzhiyun "SE/1 SI/1 SK/1 "\
51*4882a593Smuzhiyun "TR/7 TW/2 "\
52*4882a593Smuzhiyun "US/26 "\
53*4882a593Smuzhiyun "XZ/11";
54*4882a593Smuzhiyun #else
55*4882a593Smuzhiyun const char ccode_43436[] = "";
56*4882a593Smuzhiyun #endif
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #ifdef CCODE_43455C0
59*4882a593Smuzhiyun const char ccode_43455c0[] = \
60*4882a593Smuzhiyun "AE/6 AG/2 AI/1 AL/2 AS/12 AT/4 AU/6 AW/2 AZ/2 "\
61*4882a593Smuzhiyun "BA/2 BD/1 BE/4 BG/4 BH/4 BM/12 BN/4 BR/2 BS/2 BY/3 "\
62*4882a593Smuzhiyun "CA/2 CH/4 CN/38 CO/17 CR/17 CY/4 CZ/4 "\
63*4882a593Smuzhiyun "DE/7 DK/4 "\
64*4882a593Smuzhiyun "EC/21 EE/4 EG/13 ES/4 ET/2 "\
65*4882a593Smuzhiyun "FI/4 FR/5 "\
66*4882a593Smuzhiyun "GB/6 GD/2 GF/2 GP/2 GR/4 GT/1 GU/30 "\
67*4882a593Smuzhiyun "HK/2 HR/4 HU/4 "\
68*4882a593Smuzhiyun "ID/1 IE/5 IL/14 IN/3 IS/4 IT/4 "\
69*4882a593Smuzhiyun "JO/3 JP/45 "\
70*4882a593Smuzhiyun "KH/2 KR/96 KW/5 KY/3 "\
71*4882a593Smuzhiyun "LA/2 LB/5 LI/4 LK/1 LS/2 LT/4 LU/3 LV/4 "\
72*4882a593Smuzhiyun "MA/2 MC/1 MD/2 ME/2 MK/2 MN/1 MQ/2 MR/2 MT/4 MU/2 MV/3 MW/1 MX/44 MY/3 "\
73*4882a593Smuzhiyun "NI/2 NL/4 NO/4 NZ/4 "\
74*4882a593Smuzhiyun "OM/4 "\
75*4882a593Smuzhiyun "PA/17 PE/20 PH/5 PL/4 PR/38 PT/4 PY/2 "\
76*4882a593Smuzhiyun "Q2/993 "\
77*4882a593Smuzhiyun "RE/2 RO/4 RS/2 RU/13 "\
78*4882a593Smuzhiyun "SE/4 SI/4 SK/4 SV/25 "\
79*4882a593Smuzhiyun "TH/5 TN/1 TR/7 TT/3 TW/65 "\
80*4882a593Smuzhiyun "UA/8 US/988 "\
81*4882a593Smuzhiyun "VA/2 VE/3 VG/2 VN/4 "\
82*4882a593Smuzhiyun "XZ/11 "\
83*4882a593Smuzhiyun "YT/2 "\
84*4882a593Smuzhiyun "ZA/6";
85*4882a593Smuzhiyun #else
86*4882a593Smuzhiyun const char ccode_43455c0[] = "";
87*4882a593Smuzhiyun #endif
88*4882a593Smuzhiyun #endif
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun #ifdef CCODE_4356A2
91*4882a593Smuzhiyun const char ccode_4356a2[] = \
92*4882a593Smuzhiyun "AE/6 AG/2 AI/1 AL/2 AN/2 AR/21 AS/12 AT/4 AU/6 AW/2 AZ/2 "\
93*4882a593Smuzhiyun "BA/2 BD/2 BE/4 BG/4 BH/4 BM/12 BN/4 BR/4 BS/2 BY/3 "\
94*4882a593Smuzhiyun "CA/31 CH/4 CN/38 CO/17 CR/17 CY/4 CZ/4 "\
95*4882a593Smuzhiyun "DE/7 DK/4 DZ/1 "\
96*4882a593Smuzhiyun "EC/21 EE/4 ES/4 ET/2 "\
97*4882a593Smuzhiyun "FI/4 FR/5 "\
98*4882a593Smuzhiyun "GB/6 GD/2 GF/2 GP/2 GR/4 GT/1 GU/12 "\
99*4882a593Smuzhiyun "HK/2 HR/4 HU/4 "\
100*4882a593Smuzhiyun "ID/13 IE/5 IL/7 IN/28 IS/4 IT/4 "\
101*4882a593Smuzhiyun "JO/3 JP/45 "\
102*4882a593Smuzhiyun "KH/2 KR/57 KW/5 KY/3 "\
103*4882a593Smuzhiyun "LA/2 LB/5 LI/4 LK/1 LS/2 LT/4 LU/3 LV/4 "\
104*4882a593Smuzhiyun "MA/2 MC/1 MD/2 ME/2 MK/2 MN/1 MO/2 MR/2 MT/4 MQ/2 MU/2 MV/3 MW/1 MX/20 MY/16 "\
105*4882a593Smuzhiyun "NI/2 NL/4 NO/4 NP/3 NZ/4 "\
106*4882a593Smuzhiyun "OM/4 "\
107*4882a593Smuzhiyun "PA/17 PE/20 PG/2 PH/5 PL/4 PR/20 PT/4 PY/2 "\
108*4882a593Smuzhiyun "RE/2 RO/4 RS/2 RU/986 "\
109*4882a593Smuzhiyun "SE/4 SG/19 SI/4 SK/4 SN/2 SV/19 "\
110*4882a593Smuzhiyun "TH/9 TN/1 TR/7 TT/3 TW/1 "\
111*4882a593Smuzhiyun "UA/8 UG/2 US/1 UY/1 "\
112*4882a593Smuzhiyun "VA/2 VE/3 VG/2 VI/13 VN/4 "\
113*4882a593Smuzhiyun "XZ/11 "\
114*4882a593Smuzhiyun "YT/2 "\
115*4882a593Smuzhiyun "ZM/2 "\
116*4882a593Smuzhiyun "E0/32";
117*4882a593Smuzhiyun #else
118*4882a593Smuzhiyun const char ccode_4356a2[] = "";
119*4882a593Smuzhiyun #endif
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun #ifdef CCODE_4359C0
122*4882a593Smuzhiyun const char ccode_4359c0[] = \
123*4882a593Smuzhiyun "AD/1 AE/6 AG/2 AI/1 AL/3 AS/12 AT/21 AU/6 AW/2 AZ/8 "\
124*4882a593Smuzhiyun "BA/4 BD/1 BE/19 BG/18 BH/4 BM/12 BN/4 BR/2 BS/2 BY/3 "\
125*4882a593Smuzhiyun "CA/2 CN/38 CO/17 CR/17 CY/18 CZ/18 "\
126*4882a593Smuzhiyun "DE/30 DK/19 "\
127*4882a593Smuzhiyun "E0/32 EC/21 EE/18 EG/13 ES/21 ET/2 "\
128*4882a593Smuzhiyun "FI/19 FR/21 "\
129*4882a593Smuzhiyun "GB/996 GD/2 GE/1 GF/2 GP/2 GR/18 GT/1 GU/30 "\
130*4882a593Smuzhiyun "HK/2 HR/18 HU/18 "\
131*4882a593Smuzhiyun "ID/1 IE/21 IL/276 IN/3 IS/17 IT/20 "\
132*4882a593Smuzhiyun "JO/3 JP/967 "\
133*4882a593Smuzhiyun "KH/2 KR/70 KW/5 KY/3 "\
134*4882a593Smuzhiyun "LA/2 LB/5 LI/17 LK/1 LS/2 LT/18 LU/18 LV/18 "\
135*4882a593Smuzhiyun "MA/2 MC/2 MD/3 ME/5 MK/4 MN/1 MQ/2 MR/2 MT/18 MU/2 MV/3 MW/1 MX/44 MY/3 "\
136*4882a593Smuzhiyun "NI/2 NL/19 NO/18 NZ/4 "\
137*4882a593Smuzhiyun "OM/4 "\
138*4882a593Smuzhiyun "PA/17 PE/20 PH/5 PL/18 PR/38 PT/20 PY/2 "\
139*4882a593Smuzhiyun "Q1/947 Q2/993 "\
140*4882a593Smuzhiyun "RE/2 RO/18 RS/4 RU/986 "\
141*4882a593Smuzhiyun "SE/19 SI/18 SK/18 SM/1 SV/25 "\
142*4882a593Smuzhiyun "TH/5 TN/1 TR/18 TT/3 TW/980 "\
143*4882a593Smuzhiyun "UA/16 US/988 "\
144*4882a593Smuzhiyun "VA/3 VE/3 VG/2 VN/4 "\
145*4882a593Smuzhiyun "XZ/11 "\
146*4882a593Smuzhiyun "YT/2 "\
147*4882a593Smuzhiyun "ZA/6";
148*4882a593Smuzhiyun #else
149*4882a593Smuzhiyun const char ccode_4359c0[] = "";
150*4882a593Smuzhiyun #endif
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun #ifdef CCODE_4375B4
153*4882a593Smuzhiyun const char ccode_4375b4[] = \
154*4882a593Smuzhiyun "AE/6 AL/2 AM/1 AN/5 AR/21 AT/4 AU/6 AZ/2 "\
155*4882a593Smuzhiyun "BA/2 BE/4 BG/4 BH/4 BN/4 BO/5 BR/17 BY/3 "\
156*4882a593Smuzhiyun "CA/2 CH/4 CL/7 CN/38 CO/17 CR/17 CY/4 CZ/4 "\
157*4882a593Smuzhiyun "DE/7 DK/4 DZ/2 EC/18 EE/4 EG/13 ES/4 "\
158*4882a593Smuzhiyun "FI/4 FR/5 "\
159*4882a593Smuzhiyun "GB/6 GR/4 "\
160*4882a593Smuzhiyun "HK/999 HN/8 HR/4 HU/4 "\
161*4882a593Smuzhiyun "ID/5 IE/5 IL/7 IN/3 IS/4 IT/4 "\
162*4882a593Smuzhiyun "JO/3 JP/72 "\
163*4882a593Smuzhiyun "KE/1 KR/96 KW/5 KZ/5 "\
164*4882a593Smuzhiyun "LA/2 LB/5 LI/4 LK/2 LT/4 LU/4 LV/4 "\
165*4882a593Smuzhiyun "MA/7 MC/1 ME/2 MK/2 MO/4 MT/4 MX/20 MY/19 "\
166*4882a593Smuzhiyun "NL/4 NO/4 NZ/4 "\
167*4882a593Smuzhiyun "OM/4 "\
168*4882a593Smuzhiyun "PA/17 PE/20 PH/5 PK/2 PL/4 PR/20 PT/4 "\
169*4882a593Smuzhiyun "RO/4 RU/62 "\
170*4882a593Smuzhiyun "SA/5 SE/4 SG/12 SI/4 SK/4 SV/17 "\
171*4882a593Smuzhiyun "TH/5 TN/1 TR/7 TT/3 TW/65 "\
172*4882a593Smuzhiyun "UA/16 US/140 UY/10 "\
173*4882a593Smuzhiyun "VE/3 VN/4 "\
174*4882a593Smuzhiyun "XZ/11 "\
175*4882a593Smuzhiyun "ZA/19";
176*4882a593Smuzhiyun #else
177*4882a593Smuzhiyun const char ccode_4375b4[] = "";
178*4882a593Smuzhiyun #endif
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun #ifdef CCODE_4358U
181*4882a593Smuzhiyun const char ccode_4358u[] = \
182*4882a593Smuzhiyun "BE/4 BR/4 "\
183*4882a593Smuzhiyun "CA/2 CH/4 CN/38 CY/4 "\
184*4882a593Smuzhiyun "DE/7 DK/4 "\
185*4882a593Smuzhiyun "ES/4 "\
186*4882a593Smuzhiyun "FI/4 FR/5 "\
187*4882a593Smuzhiyun "GB/6 GR/4 "\
188*4882a593Smuzhiyun "HK/2 HU/4 "\
189*4882a593Smuzhiyun "IE/5 IL/7 IS/4 IT/4 "\
190*4882a593Smuzhiyun "JP/72 "\
191*4882a593Smuzhiyun "KE/0 KR/4 "\
192*4882a593Smuzhiyun "MY/3 "\
193*4882a593Smuzhiyun "NL/4 "\
194*4882a593Smuzhiyun "PT/4 "\
195*4882a593Smuzhiyun "SA/5 SE/4 SG/0 SZ/0 "\
196*4882a593Smuzhiyun "TH/5 TR/7 TW/230 "\
197*4882a593Smuzhiyun "US/0 "\
198*4882a593Smuzhiyun "VN/4";
199*4882a593Smuzhiyun #else
200*4882a593Smuzhiyun const char ccode_4358u[] = "";
201*4882a593Smuzhiyun #endif
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun typedef struct ccode_list_map_t {
204*4882a593Smuzhiyun 	uint chip;
205*4882a593Smuzhiyun 	uint chiprev;
206*4882a593Smuzhiyun 	const char *ccode_list;
207*4882a593Smuzhiyun 	const char *ccode_ww;
208*4882a593Smuzhiyun } ccode_list_map_t;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun extern const char ccode_43438[];
211*4882a593Smuzhiyun extern const char ccode_43455c0[];
212*4882a593Smuzhiyun extern const char ccode_4356a2[];
213*4882a593Smuzhiyun extern const char ccode_4359c0[];
214*4882a593Smuzhiyun extern const char ccode_4358u[];
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun const ccode_list_map_t ccode_list_map[] = {
217*4882a593Smuzhiyun 	/* ChipID		Chiprev		ccode  */
218*4882a593Smuzhiyun #ifdef BCMSDIO
219*4882a593Smuzhiyun 	{BCM43430_CHIP_ID,	0,	ccode_43438,	""},
220*4882a593Smuzhiyun 	{BCM43430_CHIP_ID,	1,	ccode_43438,	""},
221*4882a593Smuzhiyun 	{BCM43430_CHIP_ID,	2,	ccode_43436,	""},
222*4882a593Smuzhiyun 	{BCM4345_CHIP_ID,	6,	ccode_43455c0,	"XZ/11"},
223*4882a593Smuzhiyun 	{BCM43454_CHIP_ID,	6,	ccode_43455c0,	"XZ/11"},
224*4882a593Smuzhiyun 	{BCM4345_CHIP_ID,	9,	ccode_43455c0,	"XZ/11"},
225*4882a593Smuzhiyun 	{BCM43454_CHIP_ID,	9,	ccode_43455c0,	"XZ/11"},
226*4882a593Smuzhiyun 	{BCM4354_CHIP_ID,	2,	ccode_4356a2,	"XZ/11"},
227*4882a593Smuzhiyun 	{BCM4356_CHIP_ID,	2,	ccode_4356a2,	"XZ/11"},
228*4882a593Smuzhiyun 	{BCM4371_CHIP_ID,	2,	ccode_4356a2,	"XZ/11"},
229*4882a593Smuzhiyun 	{BCM4359_CHIP_ID,	9,	ccode_4359c0,	"XZ/11"},
230*4882a593Smuzhiyun #endif
231*4882a593Smuzhiyun #ifdef BCMPCIE
232*4882a593Smuzhiyun 	{BCM4354_CHIP_ID,	2,	ccode_4356a2,	"XZ/11"},
233*4882a593Smuzhiyun 	{BCM4356_CHIP_ID,	2,	ccode_4356a2,	"XZ/11"},
234*4882a593Smuzhiyun 	{BCM4359_CHIP_ID,	9,	ccode_4359c0,	"XZ/11"},
235*4882a593Smuzhiyun 	{BCM4375_CHIP_ID,	5,	ccode_4375b4,	""},
236*4882a593Smuzhiyun #endif
237*4882a593Smuzhiyun #ifdef BCMDBUS
238*4882a593Smuzhiyun 	{BCM43569_CHIP_ID,	2,	ccode_4358u, "XW/0"},
239*4882a593Smuzhiyun #endif
240*4882a593Smuzhiyun };
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun int
dhd_ccode_map_country_list(dhd_pub_t * dhd,wl_country_t * cspec)243*4882a593Smuzhiyun dhd_ccode_map_country_list(dhd_pub_t *dhd, wl_country_t *cspec)
244*4882a593Smuzhiyun {
245*4882a593Smuzhiyun 	int bcmerror = -1, i;
246*4882a593Smuzhiyun 	uint chip = dhd->conf->chip, chiprev = dhd->conf->chiprev;
247*4882a593Smuzhiyun 	const char *ccode_list = NULL, *ccode_ww = NULL;
248*4882a593Smuzhiyun 	char *pch;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	for (i=0; i<sizeof(ccode_list_map)/sizeof(ccode_list_map[0]); i++) {
251*4882a593Smuzhiyun 		const ccode_list_map_t* row = &ccode_list_map[i];
252*4882a593Smuzhiyun 		if (row->chip == chip && row->chiprev == chiprev) {
253*4882a593Smuzhiyun 			ccode_list = row->ccode_list;
254*4882a593Smuzhiyun 			ccode_ww = row->ccode_ww;
255*4882a593Smuzhiyun 			break;
256*4882a593Smuzhiyun 		}
257*4882a593Smuzhiyun 	}
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun 	if (ccode_list) {
260*4882a593Smuzhiyun 		pch = strstr(ccode_list, cspec->ccode);
261*4882a593Smuzhiyun 		if (pch) {
262*4882a593Smuzhiyun 			cspec->rev = (int)simple_strtol(pch+strlen(cspec->ccode)+1, NULL, 0);
263*4882a593Smuzhiyun 			bcmerror = 0;
264*4882a593Smuzhiyun 		}
265*4882a593Smuzhiyun 	}
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	if (dhd->op_mode != DHD_FLAG_MFG_MODE) {
268*4882a593Smuzhiyun 		if (bcmerror && ccode_ww && strlen(ccode_ww)>=4) {
269*4882a593Smuzhiyun 			memcpy(cspec->ccode, ccode_ww, 2);
270*4882a593Smuzhiyun 			cspec->rev = (int)simple_strtol(ccode_ww+3, NULL, 0);
271*4882a593Smuzhiyun 		}
272*4882a593Smuzhiyun 	}
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 	return bcmerror;
275*4882a593Smuzhiyun }
276*4882a593Smuzhiyun #endif
277