Merged in qinyq/tomato-arm-qin/shibby-arm-qin-ea6700 (pull request #12)
[tomato.git] / release / src-rt-6.x.4708 / router / shared / id.c
blob90ac27036e3d23ad8efc6991f5d6c6ced2c6d466
1 /*
3 Tomato Firmware
4 Copyright (C) 2006-2009 Jonathan Zarate
6 */
7 #include <string.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <unistd.h>
12 #include <bcmnvram.h>
13 #include <bcmdevs.h>
14 #include <trxhdr.h>
15 #include "shared.h"
19 HW_* boardtype boardnum boardrev boardflags others
20 --------------------- ------------ --------- --------- ----------- ---------------
21 WRT54G 1.x BCM4702 bcm94710dev 42
22 WRT54G 2.0 BCM4712 0x0101 42 0x10 0x0188
23 WRT54G 2.2, 3.x BCM5325E 0x0708 42 0x10 0x0118
24 WRT54G 4.0 BCM5352E 0x0467 42 0x10 0x2558
25 WRT54GL 1.0, 1.1 BCM5352E 0x0467 42 0x10 0x2558
26 WRT54GS 1.0 BCM4712 0x0101 42 0x10 0x0388
27 WRT54GS 1.1, 2.x BCM5325E 0x0708 42 0x10 0x0318
28 WRT54GS 3.0, 4.0 BCM5352E 0x0467 42 0x10 0x2758
29 WRT300N 1.0 BCM4704_BCM5325F_EWC 0x0472 42 0x10 0x10
30 WRTSL54GS BCM4704_BCM5325F 0x042f 42 0x10 0x0018
31 WTR54GS v1, v2 BCM5350 0x456 56 0x10 0xb18 (source: BaoWeiQuan)
32 WRT160Nv1 BCM4704_BCM5325F_EWC 0x0472 42 0x11 0x0010 boot_hw_model=WRT160N boot_hw_ver=1.0
33 WRT160Nv3, M10 BCM4716 0x04cd 42 0x1700 boot_hw_model=WRT160N boot_hw_ver=3.0 (M10: boot_hw_model=M10 boot_hw_ver=1.0)
34 E900 BCM53572 0x058e 42 0x1155 (64k/8MB flash)
35 E1000v2/E1500 BCM5357 0xf53b 42 0x1100 0x0710 E1500(64k/8MB flash)
36 E1000v2.1/E1200v1 BCM5357 0xf53a 42 0x1100 0x0710 E1200v1(64k/4MB flash)
37 E1550 BCM5358U 0xc550 42 0x1100 0x0710 (60k/16MB flash)
38 E2500 BCM5358U 0xf550 42 0x1101 0x0710 (60k/16MB)
39 E3200 BCM47186 0xf52a 42 0x1100 (60k/16MB)
40 WRT320N/E2000 BCM4717 0x04ef 42/66 0x1304/0x1305/0x1307 boardflags: 0x0040F10 / 0x00000602 (??)
41 WRT610Nv2/E3000 BCM4718 0x04cf 42/?? ?? boot_hw_model=WRT610N/E300
42 E4200 BCM4718 0xf52c 42 0x1101 boot_hw_model=E4200
43 EA6500v1 BCM4706 0xC617 ${serno} 0x1103 0x00000110 modelNumber=EA6500, serial_number=12N10C69224778
44 EA6500v2 BCM4708 0xF646 01 0x1100 0x0110 0:devid=0x4332
45 EA6700 BCM4708 0xF646 01 0x1100 0x0110 0:devid=0x4332
46 EA6900 BCM4708 0xD646 01 0x1100 0x0110
48 WHR-G54S BCM5352E 0x467 00 0x13 0x2758 melco_id=30182
49 WHR-HP-G54S BCM5352E 0x467 00 0x13 0x2758 melco_id=30189
50 WZR-G300N BCM4704_BCM5325F_EWC 0x0472 ? 0x10 0x10 melco_id=31120
51 WZR-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29115 melco_id=30061 (source: piggy)
52 WBR-G54 bcm94710ap 42 melco_id=ca020906
53 WHR2-A54G54 BCM4704_BCM5325F 0x042f 42 0x10 0x0210 melco_id=290441dd
54 WBR2-G54 BCM4712 0x0101 00 0x10 0x0188 buffalo_id=29bb0332
55 WZR-G108 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30153 melco_id=31095 (source: BaoWeiQuan)
57 WHR-G125 BCM5354G 0x048E 00 0x11 0x750 melco_id=32093
59 SE505 BCM4712 0x0101 0x10 0x0388
61 WR850G v1 BCM4702 bcm94710dev 2 GemtekPmonVer=9
62 WR850G v2 (& v3?) BCM4712 0x0101 44 0x0188 CFEver=MotoWRv203
63 WR850G ? BCM4712 0x0101 44 0x10 0x0188 CFEver=MotoWRv207
64 WR850G v3 BCM4712 0x0101 44 0x10 0x0188 CFEver=MotoWRv301
66 WL-500G Deluxe BCM5365 bcm95365r 45 0x10 hardware_version=WL500gd-01-04-01-50 regulation_domain=0x30DE sdram_init=0x2008
67 WL-500G Premium BCM4704_BCM5325F 0x042f 45 0x10 0x0110 hardware_version=WL500gp-01-02-00-00 regulation_domain=0X10US sdram_init=0x0009
68 WL-500G Premium BCM4704_BCM5325F 0x042f 45 0x10 0x0110 hardware_version=WL500gH-01-00-00-00 regulation_domain=0X30DE sdram_init=0x000b
69 WL-500W BCM4704_BCM5325F_EWC 0x0472 45 0x23 0x0010 hardware_version=WL500gW-01-00-00-00 regulation_domain=0X10US sdram_init=0x0009
71 WL-500G Premium v2 HW_BCM5354G 0x48E 45 0x10 0x0750
72 WL-330GE HW_BCM5354G 0x048e 45 0x10 0x0650 hardware_version=WL330GE-02-06-00-05 //MIPSR1, 4MB flash w/o USB
73 WL-520GU HW_BCM5354G 0x48E 45 0x10 0x0750 hardware_version=WL520GU-01-07-02-00
74 ZTE H618B HW_BCM5354G 0x048e 1105 0x35 0x0750
75 Tenda N60 BCM47186 0x052B 60 0x1400 0x00000710 //8MB/64MB/2.4/5G/USB
76 Tenda N6 BCM5357 0x0550 6 0x1444 0x710 //8MB/64MB/2.4/5G/USB
77 TENDA W1800R HW_BCM4706 0x05d8 18/21(EU)/60(CN) 0x1200 0x00000110
79 TrendNET BCM4708 0x0646 1234 0x1100 0x80001200
81 Buffalo WZR-D1800H HW_BCM4706 0xf52e 00 0x1204 0x110 //NAND/128M/128M/2.4-5G/USB
83 Ovislink WL1600GL HW_BCM5354G 0x048E 8 0x11
85 RT-N16 BCM4718 0x04cf 45 0x1218 0x0310 hardware_version=RT-N16-00-07-01-00 regulation_domain=0X10US sdram_init=0x419
86 RT-N15U BCM5357 0x052b 45 0x1204 0x80001710|0x1000
87 RT-N12 BCM4716 0x04cd 45 0x1201 0x????
88 RT-N12B1 BCM5357 0x054d 45 0x1101 0x710
89 RT-N10 BCM5356 0x04ec 45 0x1402 0x????
90 RT-N10U BCM5357 0x0550 45 0x1102 0x710
91 RT-N10P BCM53572 0x058e 45 0x1153 0x710
92 RT-N53 BCM5357 0x0550 45 0x1442 0x710
93 RT-N53A1 BCM5358U 0x0550 45 0x1446 0x710
94 RT-N66U BCM4706 0xf5b2 00 0x1100 0x0110
95 RT-N18U BCM4708 0x0646 00 0x1100 0x00000110
96 RT-AC56U BCM4708 0x0646 00 0x1100 0x00000110
97 RT-AC68U BCM4708 0x0646 <MAC> 0x1100 0x00001000
98 RT-AC68P BCM4709 0x0665 <MAC> 0x1103 0x00001000
101 WNR3500L BCM4718 0x04cf 3500 0x1213|02 0x0710|0x1710
102 WNR3500Lv2 BCM47186 0x052b 3500(L) 02 0x710|0x1000
103 WNR2000v2 BCM4716B0 0xe4cd 1 0x1700
104 R7000 BCM4709 0x0665 32 0x1301 0x1000
105 R6250 BCM4708 0x0646 679 0x1110 //same as R6300v2 well we use the same MODEL definition
106 R6300v2 BCM4708 0x0646 679 0x1110
108 DIR-868L BCM4708 0x0646 24 0x1110
109 WS880 BCM4708 0x0646 1234 0x1101
110 F7D4301 v1 BCM4718 0xd4cf 12345 0x1204
111 F7D3301/F7D3302/F7D4302 v1 BCM4718 0xa4cf 12345 0x1102
112 F5D8235-4 v3 BCM4718 0xa4cf 12345 0x1100
114 Dir-620C1 BCM5358U 0x0550 0015 0x1446 0x710 //530MHz/8MB/64MB
115 Rosewill L600N BCM5358U 0x0550 1015 0x1400 0x710 //500MHz/8MB/64MB/2.4-5GHz/USB
116 CW-5358U BCM5357 0x0550 1234 0x1100 0x710 //500MHz/8MB/32MB/2.4G/USB
117 FiberHome HG320 BCM5357 0x053d 0527 0x1202 0x610 //16MB/64MB/2.4G/USB
118 ChinaNet RG-200E BCM5357 0x053d 0504 0x1202 0x610 //16MB/64MB/2.4G/USB/FE
119 ZTE H218N BCM5357 0x053d 1234 0x1202 0x710 //16MB/64MB/2.4G/USB
121 WL-550gE BCM5352E 0x0467 45 0x10 0x0758 hardware_version=WL550gE-01-05-01-00 sdram_init=0x2000
123 *WL-700gE BCM4704_BCM5325F 0x042f 44 0x10 0x0110 hardware_version=WL700g-01-10-01-00 regulation_domain=0X30DE
124 *WL-700gE BCM4704_BCM5325F 0x042f 44 0x10 0x0110 hardware_version=WL700g-01-08-01-00 regulation_domain=0X30DE
126 WX-6615GT BCM4712 0x0101 44 0x10 0x0188 CFEver=GW_WR110G_v100
128 MN-700 bcm94710ap mn700 hardware_version=WL500-02-02-01-00 regulation_domain=0X30DE
130 source: piggy
131 WZR-HP-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30026
132 WZR-RS-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30083
133 WZR-RS-G54HP BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30103
134 WVR-G54-NF BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=28100
135 WHR2-A54-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=290441dd
136 WHR3-AG54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29130
137 ? WZR SERIES BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29115
138 RT390W generic BCM4702 bcm94710r4 100 clkfreq=264
139 WR850G v1 BCM4702 bcm94710r4 100
141 *WRH54G BCM5354G 0x048E ? 0x10 ?
143 Viewsonic WR100 BCM4712 0x0101 44 0x10 0x0188 CFEver=SparkLanv100
144 WLA2-G54L BCM4712 0x0101 00 0x10 0x0188 buffalo_id=29129
146 TrueMobile 2300 bcm94710ap 44 "ModelId=WX-5565", Rev A00
149 * not supported/not tested
152 BFL_ENETADM 0x0080
153 BFL_ENETVLAN 0x0100
158 int check_hw_type(void)
160 const char *s;
161 unsigned long bf;
163 bf = strtoul(nvram_safe_get("boardflags"), NULL, 0);
164 s = nvram_safe_get("boardtype");
165 switch (strtoul(s, NULL, 0)) {
166 case 0x467:
167 return HW_BCM5352E;
168 case 0x101:
169 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4712_BCM5325E : HW_BCM4712;
170 case 0x708:
171 return ((bf & BFL_ENETADM) == 0) ? HW_BCM5325E : HW_UNKNOWN;
172 case 0x42f:
173 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4704_BCM5325F : HW_UNKNOWN;
174 case 0x472:
175 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4704_BCM5325F_EWC : HW_UNKNOWN;
176 case 0x478:
177 return HW_BCM4705L_BCM5325E_EWC;
178 case 0x48E:
179 return HW_BCM5354G;
180 case 0x456:
181 return HW_BCM5350;
182 case 0x4ec:
183 return HW_BCM5356;
184 case 0x489:
185 return HW_BCM4785;
186 #ifdef CONFIG_BCMWL5
187 case 0x04cd:
188 case 0xe4cd:
189 case 0x04fb:
190 return HW_BCM4716;
191 case 0x04ef:
192 return HW_BCM4717;
193 case 0x04cf:
194 case 0xa4cf:
195 case 0xd4cf:
196 case 0xf52c:
197 return HW_BCM4718;
198 case 0x05d8:
199 case 0xf5b2:
200 case 0xf52e: //WZR-D1800H,D1100H
201 case 0xc617: //Linksys EA6500v1
202 return HW_BCM4706;
203 case 0x052b:
204 if (nvram_match("boardrev", "0x1204")) return HW_BCM5357; //rt-n15u
205 if (nvram_match("boardrev", "02")) return HW_BCM47186; //WNR3500Lv2
206 case 0xf53a:
207 case 0xf53b:
208 case 0x0550: //RT-N10U and RT-N53 and CW-5358U
209 if (nvram_match("boardrev", "0x1400")) return HW_BCM5358U; //L600N
210 if (nvram_match("boardrev", "0x1446")) return HW_BCM5358U; //DIR-620C1
211 if (nvram_match("boardrev", "0x1444")) return HW_BCM5357; //Tenda N6
212 case 0x054d:
213 case 0x053d:
214 return HW_BCM5357;
215 case 0xf52a:
216 return HW_BCM47186;
217 case 0xf550:
218 case 0xc500:
219 case 0xc550:
220 return HW_BCM5358U;
221 case 0x058e:
222 if (nvram_match("boardrev", "0x1153")) return HW_BCM5357; //RG100E-CA
223 if (nvram_match("boardrev", "0x1155")) return HW_BCM53572; //E900
224 #endif
225 #ifdef CONFIG_BCMWL6
226 case 0x0646:
227 case 0x0665: //R7000
228 case 0xf646: //EA6700
229 case 0xd646: //EA6900
230 return HW_BCM4708;
231 #endif
234 // WR850G may have "bcm94710dev " (extra space)
235 if ((strncmp(s, "bcm94710dev", 11) == 0) || (strcmp(s, "bcm94710r4") == 0)) {
236 return HW_BCM4702;
239 if ((strcmp(s, "bcm95365r") == 0)) {
240 return HW_BCM5365;
243 return HW_UNKNOWN;
246 int get_model(void)
248 int hw;
249 char *c;
251 hw = check_hw_type();
253 switch (strtoul(nvram_safe_get("melco_id"), NULL, 16)) {
254 case 0x29115:
255 case 0x30061:
256 return MODEL_WZRG54;
257 case 0x30182:
258 return MODEL_WHRG54S;
259 case 0x30189:
260 return MODEL_WHRHPG54;
261 case 0xCA020906:
262 return MODEL_WBRG54;
263 case 0x30026:
264 return MODEL_WZRHPG54;
265 case 0x30083:
266 return MODEL_WZRRSG54;
267 case 0x30103:
268 return MODEL_WZRRSG54HP;
269 case 0x28100:
270 return MODEL_WVRG54NF;
271 case 0x29130:
272 return MODEL_WHR3AG54;
273 case 0x290441DD:
274 return MODEL_WHR2A54G54;
275 case 0x32093:
276 return MODEL_WHRG125;
277 case 0x30153:
278 case 0x31095:
279 return MODEL_WZRG108;
280 case 0x31120:
281 return MODEL_WZRG300N;
282 case 0:
283 break;
284 default:
285 return MODEL_UNKNOWN;
288 switch (strtoul(nvram_safe_get("buffalo_id"), NULL, 16)) {
289 case 0x29BB0332:
290 return MODEL_WBR2G54;
291 case 0x29129:
292 return MODEL_WLA2G54L;
293 case 0:
294 break;
295 default:
296 return MODEL_UNKNOWN;
299 if (nvram_match("boardtype", "bcm94710ap")) {
300 if (nvram_match("boardnum", "mn700")) return MODEL_MN700;
301 if (nvram_match("ModelId", "WX-5565")) return MODEL_TM2300;
304 if (hw == HW_UNKNOWN) return MODEL_UNKNOWN;
307 if (hw == HW_BCM5354G) {
308 if (nvram_match("boardrev", "0x11")) {
309 return MODEL_WRH54G;
314 #ifdef CONFIG_BCMWL5
315 //added by bwq518
316 if (hw == HW_BCM4706) {
317 if (nvram_match("modelNumber", "EA6500")) return MODEL_EA6500V1;
318 } //bwq518 end
320 if (hw == HW_BCM4718) {
321 if (nvram_match("boot_hw_model", "WRT610N") ||
322 nvram_match("boot_hw_model", "E300"))
323 return MODEL_WRT610Nv2;
324 if (nvram_match("boot_hw_model", "E4200"))
325 return MODEL_E4200;
326 switch (strtoul(nvram_safe_get("boardtype"), NULL, 0)) {
327 case 0xd4cf:
328 if (nvram_match("boardrev", "0x1204")) return MODEL_F7D4301;
329 break;
330 case 0xa4cf:
331 if (nvram_match("boardrev", "0x1100")) return MODEL_F5D8235v3;
332 if (nvram_match("boardrev", "0x1102")) {
333 FILE *fp;
334 unsigned char s[18];
335 uint32 sig = TRX_MAGIC;
336 sprintf(s, MTD_DEV(%dro), 1);
337 if ((fp = fopen(s, "rb"))) {
338 fread(&sig, sizeof(sig), 1, fp);
339 fclose(fp);
341 #ifndef CONFIG_BCMWL6
342 switch (sig) {
343 case TRX_MAGIC_F7D3301:
344 return MODEL_F7D3301;
345 case TRX_MAGIC_F7D3302:
346 return MODEL_F7D3302;
347 default:
348 return MODEL_F7D4302;
350 #endif
352 break;
355 #endif //CONFIG_BCMWL5
356 #ifdef CONFIG_BCMWL6
357 if (hw == HW_BCM4708) {
358 if ((nvram_match("boardrev", "0x1100")) && (nvram_match("model", "RT-N18U"))) return MODEL_RTN18U;
359 if ((nvram_match("boardrev", "0x1100")) && (nvram_match("model", "RT-AC56U"))) return MODEL_RTAC56U;
360 if ((nvram_match("boardrev", "0x1100")) && (nvram_match("model", "RT-AC68U"))) return MODEL_RTAC68U;
361 //REMOVE: Same as RT-AC68U, no nvram "model=RT-AC68R" according to CFE for RT-AC68R
362 // if ((nvram_match("boardrev", "0x1100")) && (nvram_match("model", "RT-AC68R"))) return MODEL_RTAC68U;
363 if ((nvram_match("boardrev", "0x1103")) && (nvram_match("model", "RT-AC68U"))) return MODEL_RTAC68U;
364 if ((nvram_match("boardrev", "0x1110")) && (nvram_match("boardnum", "679")) && (nvram_match("board_id", "U12H245T00_NETGEAR"))) return MODEL_R6250;
365 if ((nvram_match("boardrev", "0x1110")) && (nvram_match("boardnum", "679")) && (nvram_match("board_id", "U12H240T00_NETGEAR"))) return MODEL_R6300v2;
366 if ((nvram_match("boardrev", "0x1301")) && (nvram_match("boardnum", "32"))) return MODEL_R7000;
367 if ((nvram_match("boardrev", "0x1110")) && (nvram_match("boardnum", "24"))) return MODEL_DIR868L;
368 if ((nvram_match("boardrev", "0x1101")) && (nvram_match("boardnum", "1234"))) return MODEL_WS880;
369 if ((nvram_match("boardtype","0xF646")) && (nvram_match("boardrev", "0x1100"))) return MODEL_EA6700;
370 if ((nvram_match("boardtype","0xD646")) && (nvram_match("boardrev", "0x1100"))) return MODEL_EA6900;
372 #endif
373 switch (strtoul(nvram_safe_get("boardnum"), NULL, 0)) {
374 case 42:
375 switch (hw) {
376 case HW_BCM4704_BCM5325F:
377 return MODEL_WRTSL54GS;
378 case HW_BCM4704_BCM5325F_EWC:
379 if (nvram_match("boardrev", "0x10")) return MODEL_WRT300N;
380 if (nvram_match("boardrev", "0x11")) return MODEL_WRT160Nv1;
381 break;
382 case HW_BCM4785:
383 if (nvram_match("boardrev", "0x10")) return MODEL_WRT310Nv1;
384 break;
385 #ifdef CONFIG_BCMWL5
386 case HW_BCM4716:
387 return MODEL_WRT160Nv3;
388 case HW_BCM4717:
389 return MODEL_WRT320N;
390 case HW_BCM4718:
391 return MODEL_WRT610Nv2;
392 case HW_BCM47186:
393 if (nvram_match("boot_hw_model", "E3200")) return MODEL_E3200;
394 break;
395 case HW_BCM5357:
396 if (nvram_match("boot_hw_model", "M10") && nvram_match("boot_hw_ver", "2.0"))
397 return MODEL_E1000v2;
398 if (nvram_match("boot_hw_model", "E1000")) return MODEL_E1000v2;
399 if (nvram_match("boot_hw_model", "E1200") && nvram_match("boot_hw_ver", "1.0"))
400 return MODEL_E1500;
401 if (nvram_match("boot_hw_model", "E1500")) return MODEL_E1500;
402 break;
403 case HW_BCM53572:
404 if (nvram_match("boot_hw_model", "E800")) return MODEL_E900;
405 if (nvram_match("boot_hw_model", "E900")) return MODEL_E900;
406 if (nvram_match("boot_hw_model", "E1200") && nvram_match("boot_hw_ver", "2.0"))
407 return MODEL_E900;
408 break;
409 case HW_BCM5358U:
410 if (nvram_match("boot_hw_model", "E1550")) return MODEL_E1550;
411 if (nvram_match("boot_hw_model", "E2500")) return MODEL_E2500;
412 break;
413 #endif
415 return MODEL_WRT54G;
416 case 45:
417 switch (hw) {
418 case HW_BCM4704_BCM5325F:
419 return MODEL_WL500GP;
420 case HW_BCM4704_BCM5325F_EWC:
421 return MODEL_WL500W;
422 case HW_BCM5352E:
423 return MODEL_WL500GE;
424 case HW_BCM5354G:
425 if (strncmp(nvram_safe_get("hardware_version"), "WL520GU", 7) == 0) return MODEL_WL520GU;
426 if (strncmp(nvram_safe_get("hardware_version"), "WL330GE", 7) == 0) return MODEL_WL330GE;
427 return MODEL_WL500GPv2;
428 case HW_BCM5365:
429 return MODEL_WL500GD;
430 #ifdef CONFIG_BCMWL5
431 case HW_BCM5356:
432 if (nvram_match("boardrev", "0x1402")) return MODEL_RTN10;
433 break;
434 case HW_BCM5357:
435 if (nvram_match("boardrev", "0x1102")) return MODEL_RTN10U;
436 if (nvram_match("boardrev", "0x1153")) return MODEL_RTN10P;
437 if (nvram_match("boardrev", "0x1101")) return MODEL_RTN12B1;
438 if (nvram_match("boardrev", "0x1204")) return MODEL_RTN15U;
439 if (nvram_match("boardrev", "0x1442")) return MODEL_RTN53;
440 break;
441 case HW_BCM5358U:
442 if (nvram_match("boardrev", "0x1446")) return MODEL_RTN53A1;
443 break;
444 case HW_BCM4716:
445 if (nvram_match("boardrev", "0x1201")) return MODEL_RTN12;
446 break;
447 case HW_BCM4718:
448 if (nvram_match("boardrev", "0x1218")) return MODEL_RTN16;
449 break;
450 #endif
452 break;
453 #ifdef CONFIG_BCMWL5
454 case 60:
455 switch (hw) {
456 case HW_BCM47186:
457 return MODEL_TDN60;
458 case HW_BCM4706:
459 if (nvram_match("boardrev", "0x1200")) return MODEL_W1800R;
461 break;
462 case 66:
463 switch (hw) {
464 case HW_BCM4717:
465 return MODEL_WRT320N;
467 break;
468 case 1015:
469 switch (hw) {
470 case HW_BCM5358U:
471 if (nvram_match("boardrev", "0x1400")) return MODEL_L600N;
473 break;
474 case 0015:
475 switch (hw) {
476 case HW_BCM5358U:
477 if (nvram_match("boardrev", "0x1446")) return MODEL_DIR620C1;
479 break;
480 case 1234:
481 switch (hw) {
482 case HW_BCM5357:
483 if (nvram_match("boardrev", "0x1100")) return MODEL_CW5358U;
484 if (nvram_match("boardrev", "0x1202")) return MODEL_H218N;
486 break;
487 case 6:
488 switch (hw) {
489 case HW_BCM5357:
490 if (nvram_match("boardrev", "0x1444")) return MODEL_TDN6;
492 break;
493 case 0527:
494 switch (hw) {
495 case HW_BCM5357:
496 //if (nvram_match("boardrev", "0x1202"))
497 return MODEL_HG320;
499 break;
500 case 0504: // This is the exact original CFE parameter. BWQ
501 switch (hw) {
502 case HW_BCM5357:
503 //if (nvram_match("boardrev", "0x1202"))
504 return MODEL_RG200E_CA;
506 break;
507 case 1:
508 switch (hw) {
509 case HW_BCM4716:
510 //if (nvram_match("boardrev", "0x1700"))
511 return MODEL_WNR2000v2;
512 break;
514 /* fall through */
515 case 0543:
516 switch (hw) {
517 case HW_BCM5357:
518 //if (nvram_match("boardrev", "0x1202"))
519 return MODEL_H218N;
521 break;
522 case 3500:
523 switch (hw) {
524 case HW_BCM4718:
525 //if (nvram_match("boardrev", "0x1213") || nvram_match("boardrev", "02"))
526 return MODEL_WNR3500L;
527 break;
528 case HW_BCM47186:
529 return MODEL_WNR3500LV2;
530 break;
532 break;
533 #endif
534 case 0:
535 switch (hw) {
536 case HW_BCM5354G:
537 if (nvram_match("boardrev", "0x35")) return MODEL_DIR320;
538 break;
539 case HW_BCM4706:
540 if (nvram_match("boardrev", "0x1100")) return MODEL_RTN66U;
541 if (nvram_match("boardrev", "0x1204")) return MODEL_D1800H;
542 break;
544 break;
545 case 1105:
546 if ((hw == HW_BCM5354G) && nvram_match("boardrev", "0x35")) return MODEL_H618B;
547 break;
548 case 8:
549 if ((hw == HW_BCM5354G) && nvram_match("boardrev", "0x11")) return MODEL_WL1600GL;
550 break;
551 case 2:
552 if (nvram_match("GemtekPmonVer", "9")) return MODEL_WR850GV1;
553 break;
554 case 44:
555 c = nvram_safe_get("CFEver");
556 if (strncmp(c, "MotoWRv", 7) == 0) return MODEL_WR850GV2;
557 if (strncmp(c, "GW_WR110G", 9) == 0) return MODEL_WX6615GT;
558 if (strcmp(c, "SparkLanv100") == 0) return MODEL_WR100;
559 break;
560 case 100:
561 if (strcmp(nvram_safe_get("clkfreq"), "264") == 0) return MODEL_RT390W;
562 break;
563 case 56:
564 if (hw == HW_BCM5350) return MODEL_WTR54GS;
565 break;
566 case 18:
567 case 21:
568 switch (hw) {
569 case HW_BCM4706:
570 if (nvram_match("boardrev", "0x1200")) return MODEL_W1800R;
572 break;
575 return MODEL_UNKNOWN;
578 int supports(unsigned long attr)
580 return (strtoul(nvram_safe_get("t_features"), NULL, 0) & attr) != 0;