Initial Changes for WNDR3400v2 (WIP)
[tomato.git] / release / src / router / shared / id.c
blobdb84506b366b6d9681001b780f239b9d7e576ad4
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"
16 #include <syslog.h>
20 HW_* boardtype boardnum boardrev boardflags others
21 --------------------- ------------ --------- --------- ----------- ---------------
22 WRT54G 1.x BCM4702 bcm94710dev 42
23 WRT54G 2.0 BCM4712 0x0101 42 0x10 0x0188
24 WRT54G 2.2, 3.x BCM5325E 0x0708 42 0x10 0x0118
25 WRT54G 4.0 BCM5352E 0x0467 42 0x10 0x2558
26 WRT54GL 1.0, 1.1 BCM5352E 0x0467 42 0x10 0x2558
27 WRT54GS 1.0 BCM4712 0x0101 42 0x10 0x0388
28 WRT54GS 1.1, 2.x BCM5325E 0x0708 42 0x10 0x0318
29 WRT54GS 3.0, 4.0 BCM5352E 0x0467 42 0x10 0x2758
30 WRT300N 1.0 BCM4704_BCM5325F_EWC 0x0472 42 0x10 0x10
31 WRTSL54GS BCM4704_BCM5325F 0x042f 42 0x10 0x0018
32 WTR54GS v1, v2 BCM5350 0x456 56 0x10 0xb18 (source: BaoWeiQuan)
33 WRT160Nv1 BCM4704_BCM5325F_EWC 0x0472 42 0x11 0x0010 boot_hw_model=WRT160N boot_hw_ver=1.0
34 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)
35 E900 BCM53572 0x058e 42 0x1155 (64k/8MB flash)
36 E1000v2/E1500 BCM5357 0xf53b 42 0x1100 0x0710 E1500(64k/8MB flash)
37 E1000v2.1/E1200v1 BCM5357 0xf53a 42 0x1100 0x0710 E1200v1(64k/4MB flash)
38 E1550 BCM5358U 0xc550 42 0x1100 0x0710 (60k/16MB flash)
39 E2500 BCM5358U 0xf550 42 0x1101 0x0710 (60k/16MB)
40 E3200 BCM47186 0xf52a 42 0x1100 (60k/16MB)
41 WRT320N/E2000 BCM4717 0x04ef 42/66 0x1304/0x1305/0x1307 boardflags: 0x0040F10 / 0x00000602 (??)
42 WRT610Nv2/E3000 BCM4718 0x04cf 42/?? ?? boot_hw_model=WRT610N/E300
43 E4200 BCM4718 0xf52c 42 0x1101 boot_hw_model=E4200
44 EA6500v1 BCM4706 0xC617 ${serno} 0x1103 0x00000110 modelNumber=EA6500, serial_number=12N10C69224778
45 WNDR4000 BCM4718 0xf52c 01 0x1101 0x00001301
46 WNDR3700v3 BCM4718 0xf52c 01 0x1101 0x00001301
47 WNDR3400 BCM4718 0xb4cf 01 0x1100 0x0310
48 WNDR3400v2 BCM5358U 0x0550 01 0x1400 0x0710
50 WHR-G54S BCM5352E 0x467 00 0x13 0x2758 melco_id=30182
51 WHR-HP-G54S BCM5352E 0x467 00 0x13 0x2758 melco_id=30189
52 WZR-G300N BCM4704_BCM5325F_EWC 0x0472 ? 0x10 0x10 melco_id=31120
53 WZR-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29115 melco_id=30061 (source: piggy)
54 WBR-G54 bcm94710ap 42 melco_id=ca020906
55 WHR2-A54G54 BCM4704_BCM5325F 0x042f 42 0x10 0x0210 melco_id=290441dd
56 WBR2-G54 BCM4712 0x0101 00 0x10 0x0188 buffalo_id=29bb0332
57 WZR-G108 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30153 melco_id=31095 (source: BaoWeiQuan)
59 WHR-G125 BCM5354G 0x048E 00 0x11 0x750 melco_id=32093
61 SE505 BCM4712 0x0101 0x10 0x0388
63 WR850G v1 BCM4702 bcm94710dev 2 GemtekPmonVer=9
64 WR850G v2 (& v3?) BCM4712 0x0101 44 0x0188 CFEver=MotoWRv203
65 WR850G ? BCM4712 0x0101 44 0x10 0x0188 CFEver=MotoWRv207
66 WR850G v3 BCM4712 0x0101 44 0x10 0x0188 CFEver=MotoWRv301
68 WL-500G Deluxe BCM5365 bcm95365r 45 0x10 hardware_version=WL500gd-01-04-01-50 regulation_domain=0x30DE sdram_init=0x2008
69 WL-500G Premium BCM4704_BCM5325F 0x042f 45 0x10 0x0110 hardware_version=WL500gp-01-02-00-00 regulation_domain=0X10US sdram_init=0x0009
70 WL-500G Premium BCM4704_BCM5325F 0x042f 45 0x10 0x0110 hardware_version=WL500gH-01-00-00-00 regulation_domain=0X30DE sdram_init=0x000b
71 WL-500W BCM4704_BCM5325F_EWC 0x0472 45 0x23 0x0010 hardware_version=WL500gW-01-00-00-00 regulation_domain=0X10US sdram_init=0x0009
73 WL-500G Premium v2 HW_BCM5354G 0x48E 45 0x10 0x0750
74 WL-330GE HW_BCM5354G 0x048e 45 0x10 0x0650 hardware_version=WL330GE-02-06-00-05 //MIPSR1, 4MB flash w/o USB
75 WL-520GU HW_BCM5354G 0x48E 45 0x10 0x0750 hardware_version=WL520GU-01-07-02-00
76 ZTE H618B HW_BCM5354G 0x048e 1105 0x35 0x0750
77 Tenda N60 BCM47186 0x052B 60 0x1400 0x00000710 //8MB/64MB/2.4/5G/USB
78 Tenda N6 BCM5357 0x0550 6 0x1444 0x710 //8MB/64MB/2.4/5G/USB
79 TENDA W1800R HW_BCM4706 0x05d8 18/21(EU)/60(CN) 0x1200 0x00000110
80 Buffalo WZR-D1800H HW_BCM4706 0xf52e 00 0x1204 0x110 //NAND/128M/128M/2.4-5G/USB
82 Ovislink WL1600GL HW_BCM5354G 0x048E 8 0x11
84 RT-N16 BCM4718 0x04cf 45 0x1218 0x0310 hardware_version=RT-N16-00-07-01-00 regulation_domain=0X10US sdram_init=0x419
85 RT-N15U BCM5357 0x052b 45 0x1204 0x80001710|0x1000
86 RT-N12 BCM4716 0x04cd 45 0x1201 0x????
87 RT-N12B1 BCM5357 0x054d 45 0x1101 0x710
88 RT-N10 BCM5356 0x04ec 45 0x1402 0x????
89 RT-N10U BCM5357 0x0550 45 0x1102 0x710
90 RT-N10P BCM53572 0x058e 45 0x1153 0x710
91 RT-N53 BCM5357 0x0550 45 0x1442 0x710
92 RT-N53A1 BCM5358U 0x0550 45 0x1446 0x710
93 RT-N66U BCM4706 0xf5b2 00 0x1100 0x0110
95 WNR3500L BCM4718 0x04cf 3500 0x1213|02 0x0710|0x1710
96 WNR3500Lv2 BCM47186 0x052b 3500(L) 02 0x710|0x1000
97 WNR2000v2 BCM4716B0 0xe4cd 1 0x1700
99 F7D4301 v1 BCM4718 0xd4cf 12345 0x1204
100 F7D3301/F7D3302/F7D4302 v1 BCM4718 0xa4cf 12345 0x1102
101 F5D8235-4 v3 BCM4718 0xa4cf 12345 0x1100
103 Dir-620C1 BCM5358U 0x0550 0015 0x1446 0x710 //530MHz/8MB/64MB
104 Rosewill L600N BCM5358U 0x0550 1015 0x1400 0x710 //500MHz/8MB/64MB/2.4-5GHz/USB
105 CW-5358U BCM5357 0x0550 1234 0x1100 0x710 //500MHz/8MB/32MB/2.4G/USB
106 FiberHome HG320 BCM5357 0x053d 0527 0x1202 0x610 //16MB/64MB/2.4G/USB
107 ChinaNet RG-200E BCM5357 0x053d 0504 0x1202 0x610 //16MB/64MB/2.4G/USB/FE
108 ZTE H218N BCM5357 0x053d 1234 0x1202 0x710 //16MB/64MB/2.4G/USB
110 WL-550gE BCM5352E 0x0467 45 0x10 0x0758 hardware_version=WL550gE-01-05-01-00 sdram_init=0x2000
112 *WL-700gE BCM4704_BCM5325F 0x042f 44 0x10 0x0110 hardware_version=WL700g-01-10-01-00 regulation_domain=0X30DE
113 *WL-700gE BCM4704_BCM5325F 0x042f 44 0x10 0x0110 hardware_version=WL700g-01-08-01-00 regulation_domain=0X30DE
115 WX-6615GT BCM4712 0x0101 44 0x10 0x0188 CFEver=GW_WR110G_v100
117 MN-700 bcm94710ap mn700 hardware_version=WL500-02-02-01-00 regulation_domain=0X30DE
119 source: piggy
120 WZR-HP-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30026
121 WZR-RS-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30083
122 WZR-RS-G54HP BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=30103
123 WVR-G54-NF BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=28100
124 WHR2-A54-G54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=290441dd
125 WHR3-AG54 BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29130
126 ? WZR SERIES BCM4704_BCM5325F 0x042f 42 0x10 0x10 melco_id=29115
127 RT390W generic BCM4702 bcm94710r4 100 clkfreq=264
128 WR850G v1 BCM4702 bcm94710r4 100
130 *WRH54G BCM5354G 0x048E ? 0x10 ?
132 Viewsonic WR100 BCM4712 0x0101 44 0x10 0x0188 CFEver=SparkLanv100
133 WLA2-G54L BCM4712 0x0101 00 0x10 0x0188 buffalo_id=29129
135 TrueMobile 2300 bcm94710ap 44 "ModelId=WX-5565", Rev A00
138 * not supported/not tested
141 BFL_ENETADM 0x0080
142 BFL_ENETVLAN 0x0100
147 int check_hw_type(void)
149 const char *s;
150 unsigned long bf;
152 bf = strtoul(nvram_safe_get("boardflags"), NULL, 0);
153 s = nvram_safe_get("boardtype");
154 switch (strtoul(s, NULL, 0)) {
155 case 0x467:
156 return HW_BCM5352E;
157 case 0x101:
158 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4712_BCM5325E : HW_BCM4712;
159 case 0x708:
160 return ((bf & BFL_ENETADM) == 0) ? HW_BCM5325E : HW_UNKNOWN;
161 case 0x42f:
162 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4704_BCM5325F : HW_UNKNOWN;
163 case 0x472:
164 return ((bf & BFL_ENETADM) == 0) ? HW_BCM4704_BCM5325F_EWC : HW_UNKNOWN;
165 case 0x478:
166 return HW_BCM4705L_BCM5325E_EWC;
167 case 0x48E:
168 return HW_BCM5354G;
169 case 0x456:
170 return HW_BCM5350;
171 case 0x4ec:
172 return HW_BCM5356;
173 case 0x489:
174 return HW_BCM4785;
175 #ifdef CONFIG_BCMWL5
176 case 0x04cd:
177 case 0xe4cd:
178 case 0x04fb:
179 return HW_BCM4716;
180 case 0x04ef:
181 return HW_BCM4717;
182 case 0x04cf:
183 case 0xa4cf:
184 case 0xb4cf:
185 case 0xd4cf:
186 case 0xf52c:
187 return HW_BCM4718;
188 case 0x05d8:
189 case 0xf5b2:
190 case 0xf52e: //WZR-D1800H,D1100H
191 case 0xc617: //Linksys EA6500v1
192 return HW_BCM4706;
193 case 0x052b:
194 if (nvram_match("boardrev", "0x1204")) return HW_BCM5357; //rt-n15u
195 if (nvram_match("boardrev", "02")) return HW_BCM47186; //WNR3500Lv2
196 case 0xf53a:
197 case 0xf53b:
198 case 0x0550: //RT-N10U and RT-N53 and CW-5358U
199 if (nvram_match("boardrev", "0x1400")) return HW_BCM5358U; //L600N, WNDR3400v2
200 if (nvram_match("boardrev", "0x1446")) return HW_BCM5358U; //DIR-620C1
201 if (nvram_match("boardrev", "0x1444")) return HW_BCM5357; //Tenda N6
202 case 0x054d:
203 case 0x053d:
204 return HW_BCM5357;
205 case 0xf52a:
206 return HW_BCM47186;
207 case 0xf550:
208 case 0xc500:
209 case 0xc550:
210 return HW_BCM5358U;
211 case 0x058e:
212 if (nvram_match("boardrev", "0x1153")) return HW_BCM5357; //RG100E-CA
213 if (nvram_match("boardrev", "0x1155")) return HW_BCM53572; //E900
215 #endif
218 // WR850G may have "bcm94710dev " (extra space)
219 if ((strncmp(s, "bcm94710dev", 11) == 0) || (strcmp(s, "bcm94710r4") == 0)) {
220 return HW_BCM4702;
223 if ((strcmp(s, "bcm95365r") == 0)) {
224 return HW_BCM5365;
227 return HW_UNKNOWN;
230 // Find partition with defined name (and return partition number as an integer). Borrorwed from DD-WRT, credit is due there!
231 int getMTD(char *name)
233 char buf[128];
234 int device;
236 sprintf(buf, "cat /proc/mtd|grep \"%s\"", name);
237 FILE *fp = popen(buf, "rb");
239 fscanf(fp, "%s", &buf[0]);
240 device = buf[3] - '0';
241 pclose(fp);
242 return device;
245 int get_model(void)
247 int hw;
248 char *c;
250 hw = check_hw_type();
252 switch (strtoul(nvram_safe_get("melco_id"), NULL, 16)) {
253 case 0x29115:
254 case 0x30061:
255 return MODEL_WZRG54;
256 case 0x30182:
257 return MODEL_WHRG54S;
258 case 0x30189:
259 return MODEL_WHRHPG54;
260 case 0xCA020906:
261 return MODEL_WBRG54;
262 case 0x30026:
263 return MODEL_WZRHPG54;
264 case 0x30083:
265 return MODEL_WZRRSG54;
266 case 0x30103:
267 return MODEL_WZRRSG54HP;
268 case 0x28100:
269 return MODEL_WVRG54NF;
270 case 0x29130:
271 return MODEL_WHR3AG54;
272 case 0x290441DD:
273 return MODEL_WHR2A54G54;
274 case 0x32093:
275 return MODEL_WHRG125;
276 case 0x30153:
277 case 0x31095:
278 return MODEL_WZRG108;
279 case 0x31120:
280 return MODEL_WZRG300N;
281 case 0:
282 break;
283 default:
284 return MODEL_UNKNOWN;
287 switch (strtoul(nvram_safe_get("buffalo_id"), NULL, 16)) {
288 case 0x29BB0332:
289 return MODEL_WBR2G54;
290 case 0x29129:
291 return MODEL_WLA2G54L;
292 case 0:
293 break;
294 default:
295 return MODEL_UNKNOWN;
298 if (nvram_match("boardtype", "bcm94710ap")) {
299 if (nvram_match("boardnum", "mn700")) return MODEL_MN700;
300 if (nvram_match("ModelId", "WX-5565")) return MODEL_TM2300;
303 if (hw == HW_UNKNOWN) return MODEL_UNKNOWN;
306 if (hw == HW_BCM5354G) {
307 if (nvram_match("boardrev", "0x11")) {
308 return MODEL_WRH54G;
313 #ifdef CONFIG_BCMWL5
314 //added by bwq518
315 if (hw == HW_BCM4706) {
316 if (nvram_match("modelNumber", "EA6500")) return MODEL_EA6500V1;
317 } //bwq518 end
319 if (hw == HW_BCM4718) {
320 if (nvram_match("boot_hw_model", "WRT610N") ||
321 nvram_match("boot_hw_model", "E300"))
322 return MODEL_WRT610Nv2;
323 if (nvram_match("boot_hw_model", "E4200"))
324 return MODEL_E4200;
326 if (nvram_match("boardmfg", "NETGEAR")) {
327 // Netgear Router ... so check board_data partition information (as at least WNDR4000 and WNDR3700v3 need this to identify)
328 // Note that boardmfg is stored in CFE - so always present!
329 int mtd = getMTD("board_data");
330 char devname[32];
331 sprintf(devname, "/dev/mtd%dro", mtd);
332 FILE *model = fopen(devname, "rb");
333 if (model) {
334 #define WNDR4000 "U12H181T00_NETGEAR"
335 #define WNDR3700v3 "U12H194T00_NETGEAR"
336 #define WNDR3400 "U12H155T00_NETGEAR"
337 char modelstr[32];
338 // Get Model string from board_data partition, null terminated in NVRAM already (checked using dd dump)
339 fread(modelstr, 1, 32, model);
340 nvram_set("board_id", modelstr);
341 fclose(model);
342 // Determine / return router model (based on Model string)
343 if (!strcmp(modelstr, WNDR3700v3)) {
344 //syslog(LOG_INFO, "NETGEAR: Model detected based on board_data model string, result = wndr3700v3\n");
345 nvram_set("netgear_model", "wndr3700v3");
346 return MODEL_WNDR3700v3;
348 if (!strcmp(modelstr, WNDR3400)) {
349 //syslog(LOG_INFO, "NETGEAR: Model detected based on board_data model string, result = wndr3400\n");
350 nvram_set("netgear_model", "wndr3400");
351 return MODEL_WNDR3400;
353 //syslog(LOG_INFO, "NETGEAR: Model detected based on board_data model string, result = wndr4000\n");
354 nvram_set("netgear_model", "wndr4000");
355 return MODEL_WNDR4000;
356 } else {
357 // Can't open board_data partition, so default to WNDR4000 ... but log to syslog
358 syslog(LOG_INFO, "NETGEAR: Cannot open board_data partition to check model string, defaulting to WNDR4000 ... but this may not be correct!\n");
359 nvram_set("netgear_model", "wndr4000");
360 return MODEL_WNDR4000;
364 switch (strtoul(nvram_safe_get("boardtype"), NULL, 0)) {
365 case 0xd4cf:
366 if (nvram_match("boardrev", "0x1204")) return MODEL_F7D4301;
367 break;
368 case 0xa4cf:
369 if (nvram_match("boardrev", "0x1100")) return MODEL_F5D8235v3;
370 if (nvram_match("boardrev", "0x1102")) {
371 FILE *fp;
372 unsigned char s[18];
373 uint32 sig = TRX_MAGIC;
374 sprintf(s, MTD_DEV(%dro), 1);
375 if ((fp = fopen(s, "rb"))) {
376 fread(&sig, sizeof(sig), 1, fp);
377 fclose(fp);
379 #ifndef CONFIG_BCMWL6
380 switch (sig) {
381 case TRX_MAGIC_F7D3301:
382 return MODEL_F7D3301;
383 case TRX_MAGIC_F7D3302:
384 return MODEL_F7D3302;
385 default:
386 return MODEL_F7D4302;
388 #endif
390 break;
393 #endif
395 switch (strtoul(nvram_safe_get("boardnum"), NULL, 0)) {
396 case 42:
397 switch (hw) {
398 case HW_BCM4704_BCM5325F:
399 return MODEL_WRTSL54GS;
400 case HW_BCM4704_BCM5325F_EWC:
401 if (nvram_match("boardrev", "0x10")) return MODEL_WRT300N;
402 if (nvram_match("boardrev", "0x11")) return MODEL_WRT160Nv1;
403 break;
404 case HW_BCM4785:
405 if (nvram_match("boardrev", "0x10")) return MODEL_WRT310Nv1;
406 break;
407 #ifdef CONFIG_BCMWL5
408 case HW_BCM4716:
409 return MODEL_WRT160Nv3;
410 case HW_BCM4717:
411 return MODEL_WRT320N;
412 case HW_BCM4718:
413 return MODEL_WRT610Nv2;
414 case HW_BCM47186:
415 if (nvram_match("boot_hw_model", "E3200")) return MODEL_E3200;
416 break;
417 case HW_BCM5357:
418 if (nvram_match("boot_hw_model", "M10") && nvram_match("boot_hw_ver", "2.0"))
419 return MODEL_E1000v2;
420 if (nvram_match("boot_hw_model", "E1000")) return MODEL_E1000v2;
421 if (nvram_match("boot_hw_model", "E1200") && nvram_match("boot_hw_ver", "1.0"))
422 return MODEL_E1500;
423 if (nvram_match("boot_hw_model", "E1500")) return MODEL_E1500;
424 break;
425 case HW_BCM53572:
426 if (nvram_match("boot_hw_model", "E800")) return MODEL_E900;
427 if (nvram_match("boot_hw_model", "E900")) return MODEL_E900;
428 if (nvram_match("boot_hw_model", "E1200") && nvram_match("boot_hw_ver", "2.0"))
429 return MODEL_E900;
430 break;
431 case HW_BCM5358U:
432 if (nvram_match("boot_hw_model", "E1550")) return MODEL_E1550;
433 if (nvram_match("boot_hw_model", "E2500")) return MODEL_E2500;
434 break;
435 #endif
437 return MODEL_WRT54G;
438 case 45:
439 switch (hw) {
440 case HW_BCM4704_BCM5325F:
441 return MODEL_WL500GP;
442 case HW_BCM4704_BCM5325F_EWC:
443 return MODEL_WL500W;
444 case HW_BCM5352E:
445 return MODEL_WL500GE;
446 case HW_BCM5354G:
447 if (strncmp(nvram_safe_get("hardware_version"), "WL520GU", 7) == 0) return MODEL_WL520GU;
448 if (strncmp(nvram_safe_get("hardware_version"), "WL330GE", 7) == 0) return MODEL_WL330GE;
449 return MODEL_WL500GPv2;
450 case HW_BCM5365:
451 return MODEL_WL500GD;
452 #ifdef CONFIG_BCMWL5
453 case HW_BCM5356:
454 if (nvram_match("boardrev", "0x1402")) return MODEL_RTN10;
455 break;
456 case HW_BCM5357:
457 if (nvram_match("boardrev", "0x1102")) return MODEL_RTN10U;
458 if (nvram_match("boardrev", "0x1153")) return MODEL_RTN10P;
459 if (nvram_match("boardrev", "0x1101")) return MODEL_RTN12B1;
460 if (nvram_match("boardrev", "0x1204")) return MODEL_RTN15U;
461 if (nvram_match("boardrev", "0x1442")) return MODEL_RTN53;
462 break;
463 case HW_BCM5358U:
464 if (nvram_match("boardrev", "0x1446")) return MODEL_RTN53A1;
465 break;
466 case HW_BCM4716:
467 if (nvram_match("boardrev", "0x1201")) return MODEL_RTN12;
468 break;
469 case HW_BCM4718:
470 if (nvram_match("boardrev", "0x1218")) return MODEL_RTN16;
471 break;
472 #endif
474 break;
475 #ifdef CONFIG_BCMWL5
476 case 60:
477 switch (hw) {
478 case HW_BCM47186:
479 return MODEL_TDN60;
480 case HW_BCM4706:
481 if (nvram_match("boardrev", "0x1200")) return MODEL_W1800R;
483 break;
484 case 66:
485 switch (hw) {
486 case HW_BCM4717:
487 return MODEL_WRT320N;
489 break;
490 case 1015:
491 switch (hw) {
492 case HW_BCM5358U:
493 if (nvram_match("boardrev", "0x1400")) return MODEL_L600N;
495 break;
496 case 0015:
497 switch (hw) {
498 case HW_BCM5358U:
499 if (nvram_match("boardrev", "0x1446")) return MODEL_DIR620C1;
501 break;
502 case 1234:
503 switch (hw) {
504 case HW_BCM5357:
505 if (nvram_match("boardrev", "0x1100")) return MODEL_CW5358U;
506 if (nvram_match("boardrev", "0x1202")) return MODEL_H218N;
508 break;
509 case 6:
510 switch (hw) {
511 case HW_BCM5357:
512 if (nvram_match("boardrev", "0x1444")) return MODEL_TDN6;
514 break;
515 case 0527:
516 switch (hw) {
517 case HW_BCM5357:
518 //if (nvram_match("boardrev", "0x1202"))
519 return MODEL_HG320;
521 break;
522 case 0504: // This is the exact original CFE parameter. BWQ
523 switch (hw) {
524 case HW_BCM5357:
525 //if (nvram_match("boardrev", "0x1202"))
526 return MODEL_RG200E_CA;
528 break;
529 case 1:
530 switch (hw) {
531 case HW_BCM4716:
532 //if (nvram_match("boardrev", "0x1700"))
533 return MODEL_WNR2000v2;
534 break;
535 case HW_BCM5358U:
536 if (nvram_match("boardrev", "0x1400")) {
537 nvram_set("netgear_model", "wndr3400v2");
538 return MODEL_WNDR3400v2;
540 break;
542 /* fall through */
543 case 0543:
544 switch (hw) {
545 case HW_BCM5357:
546 //if (nvram_match("boardrev", "0x1202"))
547 return MODEL_H218N;
549 break;
550 case 3500:
551 switch (hw) {
552 case HW_BCM4718:
553 //if (nvram_match("boardrev", "0x1213") || nvram_match("boardrev", "02"))
554 return MODEL_WNR3500L;
555 break;
556 case HW_BCM47186:
557 return MODEL_WNR3500LV2;
558 break;
560 break;
561 #endif
562 case 0:
563 switch (hw) {
564 case HW_BCM5354G:
565 if (nvram_match("boardrev", "0x35")) return MODEL_DIR320;
566 break;
567 case HW_BCM4706:
568 if (nvram_match("boardrev", "0x1100")) return MODEL_RTN66U;
569 if (nvram_match("boardrev", "0x1204")) return MODEL_D1800H;
570 break;
572 break;
573 case 1105:
574 if ((hw == HW_BCM5354G) && nvram_match("boardrev", "0x35")) return MODEL_H618B;
575 break;
576 case 8:
577 if ((hw == HW_BCM5354G) && nvram_match("boardrev", "0x11")) return MODEL_WL1600GL;
578 break;
579 case 2:
580 if (nvram_match("GemtekPmonVer", "9")) return MODEL_WR850GV1;
581 break;
582 case 44:
583 c = nvram_safe_get("CFEver");
584 if (strncmp(c, "MotoWRv", 7) == 0) return MODEL_WR850GV2;
585 if (strncmp(c, "GW_WR110G", 9) == 0) return MODEL_WX6615GT;
586 if (strcmp(c, "SparkLanv100") == 0) return MODEL_WR100;
587 break;
588 case 100:
589 if (strcmp(nvram_safe_get("clkfreq"), "264") == 0) return MODEL_RT390W;
590 break;
591 case 56:
592 if (hw == HW_BCM5350) return MODEL_WTR54GS;
593 break;
594 case 18:
595 case 21:
596 switch (hw) {
597 case HW_BCM4706:
598 if (nvram_match("boardrev", "0x1200")) return MODEL_W1800R;
600 break;
603 return MODEL_UNKNOWN;
606 int supports(unsigned long attr)
608 return (strtoul(nvram_safe_get("t_features"), NULL, 0) & attr) != 0;