usbmodeswitch: Updated to v.1.2.6 from shibby's branch.
[tomato.git] / release / src / router / rc / init.c
blob9e2f937d50d6c084bd628e9971eff2126717d15a
1 /*
3 Copyright 2005, Broadcom Corporation
4 All Rights Reserved.
6 THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
7 KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
8 SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
9 FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
13 #include "rc.h"
15 #include <termios.h>
16 #include <dirent.h>
17 #include <sys/ioctl.h>
18 #include <sys/mount.h>
19 #include <time.h>
20 #include <errno.h>
21 #include <paths.h>
22 #include <sys/wait.h>
23 #include <sys/reboot.h>
24 #include <sys/klog.h>
25 #ifdef LINUX26
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <sys/sysinfo.h>
29 #endif
30 #include <wlutils.h>
31 #include <bcmdevs.h>
33 #define SHELL "/bin/sh"
35 static int fatalsigs[] = {
36 SIGILL,
37 SIGABRT,
38 SIGFPE,
39 SIGPIPE,
40 SIGBUS,
41 SIGSYS,
42 SIGTRAP,
43 SIGPWR
46 static int initsigs[] = {
47 SIGHUP,
48 SIGUSR1,
49 SIGUSR2,
50 SIGINT,
51 SIGQUIT,
52 SIGALRM,
53 SIGTERM
56 static char *defenv[] = {
57 "TERM=vt100",
58 "HOME=/",
59 "PATH=/usr/bin:/bin:/usr/sbin:/sbin",
60 "SHELL=" SHELL,
61 "USER=root",
62 NULL
65 /* Set terminal settings to reasonable defaults */
66 static void set_term(int fd)
68 struct termios tty;
70 tcgetattr(fd, &tty);
72 /* set control chars */
73 tty.c_cc[VINTR] = 3; /* C-c */
74 tty.c_cc[VQUIT] = 28; /* C-\ */
75 tty.c_cc[VERASE] = 127; /* C-? */
76 tty.c_cc[VKILL] = 21; /* C-u */
77 tty.c_cc[VEOF] = 4; /* C-d */
78 tty.c_cc[VSTART] = 17; /* C-q */
79 tty.c_cc[VSTOP] = 19; /* C-s */
80 tty.c_cc[VSUSP] = 26; /* C-z */
82 /* use line dicipline 0 */
83 tty.c_line = 0;
85 /* Make it be sane */
86 tty.c_cflag &= CBAUD|CBAUDEX|CSIZE|CSTOPB|PARENB|PARODD;
87 tty.c_cflag |= CREAD|HUPCL|CLOCAL;
90 /* input modes */
91 tty.c_iflag = ICRNL | IXON | IXOFF;
93 /* output modes */
94 tty.c_oflag = OPOST | ONLCR;
96 /* local modes */
97 tty.c_lflag =
98 ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHOCTL | ECHOKE | IEXTEN;
100 tcsetattr(fd, TCSANOW, &tty);
103 static int console_init(void)
105 int fd;
107 /* Clean up */
108 ioctl(0, TIOCNOTTY, 0);
109 close(0);
110 close(1);
111 close(2);
112 setsid();
114 /* Reopen console */
115 if ((fd = open(_PATH_CONSOLE, O_RDWR)) < 0) {
116 /* Avoid debug messages is redirected to socket packet if no exist a UART chip, added by honor, 2003-12-04 */
117 open("/dev/null", O_RDONLY);
118 open("/dev/null", O_WRONLY);
119 open("/dev/null", O_WRONLY);
120 perror(_PATH_CONSOLE);
121 return errno;
123 dup2(fd, 0);
124 dup2(fd, 1);
125 dup2(fd, 2);
127 ioctl(0, TIOCSCTTY, 1);
128 tcsetpgrp(0, getpgrp());
129 set_term(0);
131 return 0;
135 * Waits for a file descriptor to change status or unblocked signal
136 * @param fd file descriptor
137 * @param timeout seconds to wait before timing out or 0 for no timeout
138 * @return 1 if descriptor changed status or 0 if timed out or -1 on error
140 static int waitfor(int fd, int timeout)
142 fd_set rfds;
143 struct timeval tv = { timeout, 0 };
145 FD_ZERO(&rfds);
146 FD_SET(fd, &rfds);
147 return select(fd + 1, &rfds, NULL, NULL, (timeout > 0) ? &tv : NULL);
150 static pid_t run_shell(int timeout, int nowait)
152 pid_t pid;
153 int sig;
155 /* Wait for user input */
156 if (waitfor(STDIN_FILENO, timeout) <= 0) return 0;
158 switch (pid = fork()) {
159 case -1:
160 perror("fork");
161 return 0;
162 case 0:
163 /* Reset signal handlers set for parent process */
164 for (sig = 0; sig < (_NSIG-1); sig++)
165 signal(sig, SIG_DFL);
167 /* Reopen console */
168 console_init();
169 printf("\n\nTomato %s\n\n", tomato_version);
171 /* Now run it. The new program will take over this PID,
172 * so nothing further in init.c should be run. */
173 execve(SHELL, (char *[]) { SHELL, NULL }, defenv);
175 /* We're still here? Some error happened. */
176 perror(SHELL);
177 exit(errno);
178 default:
179 if (nowait) {
180 return pid;
182 else {
183 waitpid(pid, NULL, 0);
184 return 0;
189 int console_main(int argc, char *argv[])
191 for (;;) run_shell(0, 0);
193 return 0;
196 static void shutdn(int rb)
198 int i;
199 int act;
200 sigset_t ss;
202 _dprintf("shutdn rb=%d\n", rb);
204 sigemptyset(&ss);
205 for (i = 0; i < sizeof(fatalsigs) / sizeof(fatalsigs[0]); i++)
206 sigaddset(&ss, fatalsigs[i]);
207 for (i = 0; i < sizeof(initsigs) / sizeof(initsigs[0]); i++)
208 sigaddset(&ss, initsigs[i]);
209 sigprocmask(SIG_BLOCK, &ss, NULL);
211 for (i = 30; i > 0; --i) {
212 if (((act = check_action()) == ACT_IDLE) || (act == ACT_REBOOT)) break;
213 _dprintf("Busy with %d. Waiting before shutdown... %d\n", act, i);
214 sleep(1);
216 set_action(ACT_REBOOT);
218 // Disconnect pppd - need this for PPTP/L2TP to finish gracefully
219 stop_pptp();
220 stop_l2tp();
222 _dprintf("TERM\n");
223 kill(-1, SIGTERM);
224 sleep(3);
225 sync();
227 _dprintf("KILL\n");
228 kill(-1, SIGKILL);
229 sleep(1);
230 sync();
232 umount("/jffs"); // may hang if not
233 sleep(1);
235 if (rb != -1) {
236 led(LED_WLAN, 0);
237 if (rb == 0) {
238 for (i = 4; i > 0; --i) {
239 led(LED_DMZ, 1);
240 led(LED_WHITE, 1);
241 usleep(250000);
242 led(LED_DMZ, 0);
243 led(LED_WHITE, 0);
244 usleep(250000);
249 reboot(rb ? RB_AUTOBOOT : RB_HALT_SYSTEM);
251 do {
252 sleep(1);
253 } while (1);
256 static void handle_fatalsigs(int sig)
258 _dprintf("fatal sig=%d\n", sig);
259 shutdn(-1);
262 /* Fixed the race condition & incorrect code by using sigwait()
263 * instead of pause(). But SIGCHLD is a problem, since other
264 * code: 1) messes with it and 2) depends on CHLD being caught so
265 * that the pid gets immediately reaped instead of left a zombie.
266 * Pidof still shows the pid, even though it's in zombie state.
267 * So this SIGCHLD handler reaps and then signals the mainline by
268 * raising ALRM.
270 static void handle_reap(int sig)
272 chld_reap(sig);
273 raise(SIGALRM);
276 static int check_nv(const char *name, const char *value)
278 const char *p;
279 if (!nvram_match("manual_boot_nv", "1")) {
280 if (((p = nvram_get(name)) == NULL) || (strcmp(p, value) != 0)) {
281 _dprintf("Error: Critical variable %s is invalid. Resetting.\n", name);
282 nvram_set(name, value);
283 return 1;
286 return 0;
289 static inline int invalid_mac(const char *mac)
291 return (!mac || !(*mac) || strncasecmp(mac, "00:90:4c", 8) == 0);
294 static int find_sercom_mac_addr(void)
296 FILE *fp;
297 unsigned char m[6], s[18];
299 sprintf(s, MTD_DEV(%dro), 0);
300 if ((fp = fopen(s, "rb"))) {
301 fseek(fp, 0x1ffa0, SEEK_SET);
302 fread(m, sizeof(m), 1, fp);
303 fclose(fp);
304 sprintf(s, "%02X:%02X:%02X:%02X:%02X:%02X",
305 m[0], m[1], m[2], m[3], m[4], m[5]);
306 nvram_set("et0macaddr", s);
307 return !invalid_mac(s);
309 return 0;
312 static int find_dir320_mac_addr(void)
314 FILE *fp;
315 char *buffer, s[18];
316 int i, part, size, found = 0;
318 if (!mtd_getinfo("board_data", &part, &size))
319 goto out;
320 sprintf(s, MTD_DEV(%dro), part);
322 if ((fp = fopen(s, "rb"))) {
323 buffer = malloc(size);
324 memset(buffer, 0, size);
325 fread(buffer, size, 1, fp);
326 if (!memcmp(buffer, "RGCFG1", 6)) {
327 for (i = 6; i < size - 24; i++) {
328 if (!memcmp(buffer + i, "lanmac=", 7)) {
329 memcpy(s, buffer + i + 7, 17);
330 s[17] = 0;
331 nvram_set("et0macaddr", s);
332 found = 1;
334 else if (!memcmp(buffer + i, "wanmac=", 7)) {
335 memcpy(s, buffer + i + 7, 17);
336 s[17] = 0;
337 nvram_set("il0macaddr", s);
338 if (!found) {
339 inc_mac(s, -1);
340 nvram_set("et0macaddr", s);
342 found = 1;
346 free(buffer);
347 fclose(fp);
349 out:
350 if (!found) {
351 strcpy(s, nvram_safe_get("wl0_hwaddr"));
352 inc_mac(s, -2);
353 nvram_set("et0macaddr", s);
355 return 1;
358 static int init_vlan_ports(void)
360 int dirty = 0;
361 int model = get_model();
363 switch (model) {
364 case MODEL_WRT54G:
365 switch (check_hw_type()) {
366 case HW_BCM5352E: // G v4, GS v3, v4
367 dirty |= check_nv("vlan0ports", "3 2 1 0 5*");
368 break;
370 break;
371 case MODEL_WTR54GS:
372 dirty |= check_nv("vlan0ports", "0 5*");
373 dirty |= check_nv("vlan1ports", "1 5");
374 dirty |= check_nv("vlan_enable", "1");
375 break;
376 case MODEL_WL500GP:
377 case MODEL_WL500GE:
378 case MODEL_WL500GPv2:
379 case MODEL_WL520GU:
380 case MODEL_WL330GE:
381 if (nvram_match("vlan1ports", "0 5u")) // 520GU or 330GE or WL500GE?
382 dirty |= check_nv("vlan1ports", "0 5");
383 else if (nvram_match("vlan1ports", "4 5u"))
384 dirty |= check_nv("vlan1ports", "4 5");
385 break;
386 case MODEL_WL500GD:
387 dirty |= check_nv("vlan0ports", "1 2 3 4 5*");
388 dirty |= check_nv("vlan1ports", "0 5");
389 break;
390 case MODEL_DIR320:
391 case MODEL_H618B:
392 dirty |= (nvram_get("vlan2ports") != NULL);
393 nvram_unset("vlan2ports");
394 dirty |= check_nv("vlan1ports", "0 5");
395 break;
396 case MODEL_WRT310Nv1:
397 dirty |= check_nv("vlan1ports", "1 2 3 4 8*");
398 dirty |= check_nv("vlan2ports", "0 8");
399 break;
400 case MODEL_WL1600GL:
401 dirty |= check_nv("vlan0ports", "0 1 2 3 5*");
402 dirty |= check_nv("vlan1ports", "4 5");
403 break;
404 #ifdef CONFIG_BCMWL5
405 case MODEL_WNR3500L:
406 case MODEL_WRT320N:
407 case MODEL_WNR3500LV2:
408 case MODEL_RTN16:
409 case MODEL_RTN66U:
410 dirty |= check_nv("vlan1ports", "4 3 2 1 8*");
411 dirty |= check_nv("vlan2ports", "0 8");
412 break;
413 case MODEL_RTN53:
414 dirty |= check_nv("vlan2ports", "0 1 2 3 5*");
415 dirty |= check_nv("vlan1ports", "4 5");
416 break;
417 case MODEL_WNR2000v2:
418 dirty |= check_nv("vlan1ports", "4 3 2 1 5*");
419 dirty |= check_nv("vlan2ports", "0 5");
420 break;
421 case MODEL_RG200E_CA:
422 dirty |= check_nv("vlan0ports", "4 3 2 1 5*");
423 dirty |= check_nv("vlan1ports", "0 5");
424 break;
425 case MODEL_RTN10:
426 dirty |= check_nv("vlan1ports", "4 5");
427 break;
428 case MODEL_E1000v2:
429 case MODEL_L600N:
430 dirty |= check_nv("vlan1ports", "1 2 3 4 5*");
431 dirty |= check_nv("vlan2ports", "0 5");
432 break;
433 case MODEL_RTN10U:
434 case MODEL_CW5358U:
435 case MODEL_HG320:
436 dirty |= check_nv("vlan0ports", "1 2 3 4 5*");
437 dirty |= check_nv("vlan1ports", "0 5");
438 break;
439 case MODEL_RTN12:
440 case MODEL_RTN12B1:
441 dirty |= check_nv("vlan0ports", "3 2 1 0 5*");
442 dirty |= check_nv("vlan1ports", "4 5");
443 break;
444 case MODEL_WRT610Nv2:
445 case MODEL_F5D8235v3:
446 dirty |= check_nv("vlan1ports", "1 2 3 4 8*");
447 dirty |= check_nv("vlan2ports", "0 8");
448 break;
449 case MODEL_F7D3301:
450 case MODEL_F7D4301:
451 dirty |= check_nv("vlan1ports", "3 2 1 0 8*");
452 dirty |= check_nv("vlan2ports", "4 8");
453 break;
454 case MODEL_E900:
455 case MODEL_E1500:
456 case MODEL_E1550:
457 case MODEL_E2500:
458 case MODEL_F7D3302:
459 case MODEL_F7D4302:
460 dirty |= check_nv("vlan1ports", "0 1 2 3 5*");
461 dirty |= check_nv("vlan2ports", "4 5");
462 break;
463 case MODEL_RTN15U:
464 case MODEL_E3200:
465 case MODEL_E4200:
466 dirty |= check_nv("vlan1ports", "0 1 2 3 8*");
467 dirty |= check_nv("vlan2ports", "4 8");
468 break;
469 case MODEL_WRT160Nv3:
470 if (nvram_match("vlan1ports", "1 2 3 4 5*")) {
471 // fix lan port numbering on CSE41, CSE51
472 dirty |= check_nv("vlan1ports", "4 3 2 1 5*");
474 else if (nvram_match("vlan1ports", "1 2 3 4 8*")) {
475 // WRT310Nv2 ?
476 dirty |= check_nv("vlan1ports", "4 3 2 1 8*");
478 break;
479 #endif
482 return dirty;
485 static void check_bootnv(void)
487 int dirty;
488 int hardware;
489 int model;
490 char mac[18];
492 model = get_model();
493 dirty = check_nv("wl0_leddc", "0x640000") | check_nv("wl1_leddc", "0x640000");
495 switch (model) {
496 case MODEL_WTR54GS:
497 dirty |= check_nv("vlan0hwname", "et0");
498 dirty |= check_nv("vlan1hwname", "et0");
499 break;
500 case MODEL_WBRG54:
501 dirty |= check_nv("wl0gpio0", "130");
502 break;
503 case MODEL_WL330GE:
504 dirty |= check_nv("wl0gpio1", "0x02");
505 break;
506 case MODEL_WR850GV1:
507 case MODEL_WR850GV2:
508 // need to cleanup some variables...
509 if ((nvram_get("t_model") == NULL) && (nvram_get("MyFirmwareVersion") != NULL)) {
510 nvram_unset("MyFirmwareVersion");
511 nvram_set("restore_defaults", "1");
513 break;
514 case MODEL_WL500W:
515 /* fix WL500W mac adresses for WAN port */
516 if (invalid_mac(nvram_get("et1macaddr"))) {
517 strcpy(mac, nvram_safe_get("et0macaddr"));
518 inc_mac(mac, 1);
519 dirty |= check_nv("et1macaddr", mac);
521 dirty |= check_nv("wl0gpio0", "0x88");
522 break;
523 case MODEL_WL500GP:
524 dirty |= check_nv("sdram_init", "0x0009"); // 32MB; defaults: 0x000b, 0x0009
525 dirty |= check_nv("wl0gpio0", "136");
526 break;
527 case MODEL_WL500GPv2:
528 case MODEL_WL520GU:
529 dirty |= check_nv("wl0gpio1", "136");
530 break;
531 case MODEL_WL500GD:
532 dirty |= check_nv("vlan0hwname", "et0");
533 dirty |= check_nv("vlan1hwname", "et0");
534 dirty |= check_nv("boardflags", "0x00000100"); // set BFL_ENETVLAN
535 nvram_unset("wl0gpio0");
536 break;
537 case MODEL_DIR320:
538 if (strlen(nvram_safe_get("et0macaddr")) == 12 ||
539 strlen(nvram_safe_get("il0macaddr")) == 12) {
540 dirty |= find_dir320_mac_addr();
542 if (nvram_get("vlan2hwname") != NULL) {
543 nvram_unset("vlan2hwname");
544 dirty = 1;
546 dirty |= check_nv("wandevs", "vlan1");
547 dirty |= check_nv("vlan1hwname", "et0");
548 dirty |= check_nv("wl0gpio0", "8");
549 dirty |= check_nv("wl0gpio1", "0");
550 dirty |= check_nv("wl0gpio2", "0");
551 dirty |= check_nv("wl0gpio3", "0");
552 case MODEL_WL1600GL:
553 if (invalid_mac(nvram_get("et0macaddr"))) {
554 dirty |= find_sercom_mac_addr();
556 break;
557 case MODEL_WRT160Nv1:
558 case MODEL_WRT310Nv1:
559 case MODEL_WRT300N:
560 dirty |= check_nv("wl0gpio0", "8");
561 break;
562 #ifdef CONFIG_BCMWL5
563 case MODEL_WNR3500L:
564 dirty |= check_nv("boardflags", "0x00000710"); // needed to enable USB
565 dirty |= check_nv("vlan2hwname", "et0");
566 dirty |= check_nv("ledbh0", "7");
567 break;
568 case MODEL_WNR3500LV2:
569 dirty |= check_nv("vlan2hwname", "et0");
570 break;
571 case MODEL_WNR2000v2:
572 dirty |= check_nv("ledbh5", "8");
573 break;
574 case MODEL_WRT320N:
575 dirty |= check_nv("reset_gpio", "5");
576 dirty |= check_nv("ledbh0", "136");
577 dirty |= check_nv("ledbh1", "11");
578 /* fall through, same as RT-N16 */
579 case MODEL_RTN16:
580 dirty |= check_nv("vlan2hwname", "et0");
581 break;
582 case MODEL_WRT610Nv2:
583 dirty |= check_nv("vlan2hwname", "et0");
584 dirty |= check_nv("pci/1/1/ledbh2", "8");
585 dirty |= check_nv("sb/1/ledbh1", "8");
586 if (invalid_mac(nvram_get("pci/1/1/macaddr"))) {
587 strcpy(mac, nvram_safe_get("et0macaddr"));
588 inc_mac(mac, 3);
589 dirty |= check_nv("pci/1/1/macaddr", mac);
591 break;
592 case MODEL_F7D3301:
593 case MODEL_F7D3302:
594 case MODEL_F7D4301:
595 case MODEL_F7D4302:
596 case MODEL_F5D8235v3:
597 if (nvram_match("sb/1/macaddr", nvram_safe_get("et0macaddr"))) {
598 strcpy(mac, nvram_safe_get("et0macaddr"));
599 inc_mac(mac, 2);
600 dirty |= check_nv("sb/1/macaddr", mac);
601 inc_mac(mac, 1);
602 dirty |= check_nv("pci/1/1/macaddr", mac);
604 case MODEL_E4200:
605 dirty |= check_nv("vlan2hwname", "et0");
606 if (strncasecmp(nvram_safe_get("pci/1/1/macaddr"), "00:90:4c", 8) == 0 ||
607 strncasecmp(nvram_safe_get("sb/1/macaddr"), "00:90:4c", 8) == 0) {
608 strcpy(mac, nvram_safe_get("et0macaddr"));
609 inc_mac(mac, 2);
610 dirty |= check_nv("sb/1/macaddr", mac);
611 inc_mac(mac, 1);
612 dirty |= check_nv("pci/1/1/macaddr", mac);
614 break;
615 case MODEL_E900:
616 case MODEL_E1000v2:
617 case MODEL_E1500:
618 case MODEL_E1550:
619 case MODEL_E2500:
620 case MODEL_E3200:
621 case MODEL_WRT160Nv3:
622 dirty |= check_nv("vlan2hwname", "et0");
623 break;
624 #endif
626 case MODEL_WRT54G:
627 if (strncmp(nvram_safe_get("pmon_ver"), "CFE", 3) != 0) return;
629 hardware = check_hw_type();
630 if (!nvram_get("boardtype") ||
631 !nvram_get("boardnum") ||
632 !nvram_get("boardflags") ||
633 !nvram_get("clkfreq") ||
634 !nvram_get("os_flash_addr") ||
635 !nvram_get("dl_ram_addr") ||
636 !nvram_get("os_ram_addr") ||
637 !nvram_get("scratch") ||
638 !nvram_get("et0macaddr") ||
639 ((hardware != HW_BCM4704_BCM5325F) && (!nvram_get("vlan0ports") || !nvram_get("vlan0hwname")))) {
640 _dprintf("Unable to find critical settings, erasing NVRAM\n");
641 mtd_erase("nvram");
642 goto REBOOT;
645 dirty |= check_nv("aa0", "3");
646 dirty |= check_nv("wl0gpio0", "136");
647 dirty |= check_nv("wl0gpio2", "0");
648 dirty |= check_nv("wl0gpio3", "0");
649 dirty |= check_nv("cctl", "0");
650 dirty |= check_nv("ccode", "0");
652 switch (hardware) {
653 case HW_BCM5325E:
654 /* Lower the DDR ram drive strength , the value will be stable for all boards
655 Latency 3 is more stable for all ddr 20050420 by honor */
656 dirty |= check_nv("sdram_init", "0x010b");
657 dirty |= check_nv("sdram_config", "0x0062");
658 if (!nvram_match("debug_clkfix", "0")) {
659 dirty |= check_nv("clkfreq", "216");
661 if (dirty) {
662 nvram_set("sdram_ncdl", "0x0");
664 dirty |= check_nv("pa0itssit", "62");
665 dirty |= check_nv("pa0b0", "0x15eb");
666 dirty |= check_nv("pa0b1", "0xfa82");
667 dirty |= check_nv("pa0b2", "0xfe66");
668 //dirty |= check_nv("pa0maxpwr", "0x4e");
669 break;
670 case HW_BCM5352E: // G v4, GS v3, v4
671 dirty |= check_nv("sdram_init", "0x010b");
672 dirty |= check_nv("sdram_config", "0x0062");
673 if (dirty) {
674 nvram_set("sdram_ncdl", "0x0");
676 dirty |= check_nv("pa0itssit", "62");
677 dirty |= check_nv("pa0b0", "0x168b");
678 dirty |= check_nv("pa0b1", "0xfabf");
679 dirty |= check_nv("pa0b2", "0xfeaf");
680 //dirty |= check_nv("pa0maxpwr", "0x4e");
681 break;
682 case HW_BCM5354G:
683 dirty |= check_nv("pa0itssit", "62");
684 dirty |= check_nv("pa0b0", "0x1326");
685 dirty |= check_nv("pa0b1", "0xFB51");
686 dirty |= check_nv("pa0b2", "0xFE87");
687 //dirty |= check_nv("pa0maxpwr", "0x4e");
688 break;
689 case HW_BCM4704_BCM5325F:
690 // nothing to do
691 break;
692 default:
693 dirty |= check_nv("pa0itssit", "62");
694 dirty |= check_nv("pa0b0", "0x170c");
695 dirty |= check_nv("pa0b1", "0xfa24");
696 dirty |= check_nv("pa0b2", "0xfe70");
697 //dirty |= check_nv("pa0maxpwr", "0x48");
698 break;
700 break;
702 } // switch (model)
704 dirty |= init_vlan_ports();
706 if (dirty) {
707 nvram_commit();
708 REBOOT: // do a simple reboot
709 sync();
710 reboot(RB_AUTOBOOT);
711 exit(0);
715 static int init_nvram(void)
717 unsigned long features;
718 int model;
719 const char *mfr;
720 const char *name;
721 const char *ver;
722 char s[256];
723 unsigned long bf;
724 unsigned long n;
726 model = get_model();
727 sprintf(s, "%d", model);
728 nvram_set("t_model", s);
730 mfr = "Broadcom";
731 name = NULL;
732 ver = NULL;
733 features = 0;
734 switch (model) {
735 case MODEL_WRT54G:
736 mfr = "Linksys";
737 name = "WRT54G/GS/GL";
738 switch (check_hw_type()) {
739 case HW_BCM4712:
740 nvram_set("gpio2", "adm_eecs");
741 nvram_set("gpio3", "adm_eesk");
742 nvram_unset("gpio4");
743 nvram_set("gpio5", "adm_eedi");
744 nvram_set("gpio6", "adm_rc");
745 break;
746 case HW_BCM4702:
747 nvram_unset("gpio2");
748 nvram_unset("gpio3");
749 nvram_unset("gpio4");
750 nvram_unset("gpio5");
751 nvram_unset("gpio6");
752 break;
753 case HW_BCM5352E:
754 nvram_set("opo", "0x0008");
755 nvram_set("ag0", "0x02");
756 // drop
757 default:
758 nvram_set("gpio2", "ses_led");
759 nvram_set("gpio3", "ses_led2");
760 nvram_set("gpio4", "ses_button");
761 features = SUP_SES | SUP_WHAM_LED;
762 break;
764 break;
765 case MODEL_WTR54GS:
766 mfr = "Linksys";
767 name = "WTR54GS";
768 if (!nvram_match("t_fix1", (char *)name)) {
769 nvram_set("lan_ifnames", "vlan0 eth1");
770 nvram_set("gpio2", "ses_button");
771 nvram_set("reset_gpio", "7");
773 nvram_set("pa0itssit", "62");
774 nvram_set("pa0b0", "0x1542");
775 nvram_set("pa0b1", "0xfacb");
776 nvram_set("pa0b2", "0xfec7");
777 //nvram_set("pa0maxpwr", "0x4c");
778 features = SUP_SES;
779 break;
780 case MODEL_WRTSL54GS:
781 mfr = "Linksys";
782 name = "WRTSL54GS";
783 features = SUP_SES | SUP_WHAM_LED;
784 break;
785 case MODEL_WHRG54S:
786 mfr = "Buffalo";
787 name = "WHR-G54S";
788 features = SUP_SES | SUP_AOSS_LED | SUP_BRAU;
789 break;
790 case MODEL_WHRHPG54:
791 case MODEL_WZRRSG54HP:
792 case MODEL_WZRHPG54:
793 mfr = "Buffalo";
794 features = SUP_SES | SUP_AOSS_LED | SUP_HPAMP;
795 switch (model) {
796 case MODEL_WZRRSG54HP:
797 name = "WZR-RS-G54HP";
798 break;
799 case MODEL_WZRHPG54:
800 name = "WZR-HP-G54";
801 break;
802 default:
803 name = "WHR-HP-G54";
804 features = SUP_SES | SUP_AOSS_LED | SUP_BRAU | SUP_HPAMP;
805 break;
808 bf = strtoul(nvram_safe_get("boardflags"), NULL, 0);
809 switch (bf) {
810 case 0x0758:
811 case 0x1758:
812 case 0x2758:
813 case 0x3758:
814 if (nvram_match("wlx_hpamp", "")) {
815 if (nvram_get_int("wl_txpwr") > 10) nvram_set("wl_txpwr", "10");
816 nvram_set("wlx_hpamp", "1");
817 nvram_set("wlx_hperx", "0");
820 n = bf;
821 if (nvram_match("wlx_hpamp", "0")) {
822 n &= ~0x2000UL;
824 else {
825 n |= 0x2000UL;
827 if (nvram_match("wlx_hperx", "0")) {
828 n |= 0x1000UL;
830 else {
831 n &= ~0x1000UL;
833 if (bf != n) {
834 sprintf(s, "0x%lX", n);
835 nvram_set("boardflags", s);
837 break;
838 default:
839 syslog(LOG_WARNING, "Unexpected: boardflag=%lX", bf);
840 break;
842 break;
843 case MODEL_WBRG54:
844 mfr = "Buffalo";
845 name = "WBR-G54";
846 break;
847 case MODEL_WBR2G54:
848 mfr = "Buffalo";
849 name = "WBR2-G54";
850 features = SUP_SES | SUP_AOSS_LED;
851 break;
852 case MODEL_WHR2A54G54:
853 mfr = "Buffalo";
854 name = "WHR2-A54G54";
855 features = SUP_SES | SUP_AOSS_LED | SUP_BRAU;
856 break;
857 case MODEL_WHR3AG54:
858 mfr = "Buffalo";
859 name = "WHR3-AG54";
860 features = SUP_SES | SUP_AOSS_LED;
861 break;
862 case MODEL_WZRG54:
863 mfr = "Buffalo";
864 name = "WZR-G54";
865 features = SUP_SES | SUP_AOSS_LED;
866 break;
867 case MODEL_WZRRSG54:
868 mfr = "Buffalo";
869 name = "WZR-RS-G54";
870 features = SUP_SES | SUP_AOSS_LED;
871 break;
872 case MODEL_WVRG54NF:
873 mfr = "Buffalo";
874 name = "WVR-G54-NF";
875 features = SUP_SES;
876 break;
877 case MODEL_WZRG108:
878 mfr = "Buffalo";
879 name = "WZR-G108";
880 features = SUP_SES | SUP_AOSS_LED;
881 break;
882 case MODEL_RT390W:
883 mfr = "Fuji";
884 name = "RT390W";
885 break;
886 case MODEL_WR850GV1:
887 mfr = "Motorola";
888 name = "WR850G v1";
889 features = SUP_NONVE;
890 break;
891 case MODEL_WR850GV2:
892 mfr = "Motorola";
893 name = "WR850G v2/v3";
894 features = SUP_NONVE;
895 break;
896 case MODEL_WL500GP:
897 mfr = "Asus";
898 name = "WL-500gP";
899 features = SUP_SES;
900 #ifdef TCONFIG_USB
901 nvram_set("usb_ohci", "-1");
902 #endif
903 if (!nvram_match("t_fix1", (char *)name)) {
904 nvram_set("lan_ifnames", "vlan0 eth1 eth2 eth3"); // set to "vlan0 eth2" by DD-WRT; default: vlan0 eth1
906 break;
907 case MODEL_WL500W:
908 mfr = "Asus";
909 name = "WL-500W";
910 features = SUP_SES | SUP_80211N;
911 #ifdef TCONFIG_USB
912 nvram_set("usb_ohci", "-1");
913 #endif
914 break;
915 case MODEL_WL500GE:
916 mfr = "Asus";
917 name = "WL-550gE";
918 // features = ?
919 #ifdef TCONFIG_USB
920 nvram_set("usb_uhci", "-1");
921 #endif
922 break;
923 case MODEL_WX6615GT:
924 mfr = "SparkLAN";
925 name = "WX-6615GT";
926 // features = ?
927 break;
928 case MODEL_MN700:
929 mfr = "Microsoft";
930 name = "MN-700";
931 break;
932 case MODEL_WR100:
933 mfr = "Viewsonic";
934 name = "WR100";
935 break;
936 case MODEL_WLA2G54L:
937 mfr = "Buffalo";
938 name = "WLA2-G54L";
939 if (!nvram_match("t_fix1", (char *)name)) {
940 nvram_set("lan_ifnames", "vlan0 eth1 eth2");
941 nvram_set("wl_ifname", "eth1");
942 nvram_set("wan_ifname", "none");
944 break;
945 case MODEL_TM2300:
946 mfr = "Dell";
947 name = "TrueMobile 2300";
948 break;
956 #ifndef WL_BSS_INFO_VERSION
957 #error WL_BSS_INFO_VERSION
958 #endif
959 #if WL_BSS_INFO_VERSION >= 108
961 case MODEL_WRH54G:
962 mfr = "Linksys";
963 name = "WRH54G";
965 nvram_set("opo", "12");
966 break;
968 case MODEL_WHRG125:
969 mfr = "Buffalo";
970 name = "WHR-G125";
971 features = SUP_SES | SUP_AOSS_LED | SUP_BRAU;
973 nvram_set("opo", "0x0008");
974 nvram_set("ag0", "0x0C");
975 break;
976 #ifdef CONFIG_BCMWL5
977 case MODEL_CW5358U:
978 mfr = "Catchtech";
979 name = "CW-5358U";
980 features = SUP_SES | SUP_80211N;
981 #ifdef TCONFIG_USB
982 nvram_set("usb_uhci", "-1");
983 #endif
984 if (!nvram_match("t_fix1", (char *)name)) {
985 nvram_set("lan_ifnames", "vlan0 eth1");
986 nvram_set("wan_ifnameX", "vlan1");
987 nvram_set("wl_ifname", "eth1");
989 break;
990 case MODEL_HG320:
991 mfr = "FiberHome";
992 name = "HG320";
993 features = SUP_SES | SUP_80211N;
994 #ifdef TCONFIG_USB
995 nvram_set("usb_uhci", "-1");
996 #endif
997 if (!nvram_match("t_fix1", (char *)name)) {
998 nvram_set("lan_ifnames", "vlan0 eth1");
999 nvram_set("wan_ifnameX", "vlan1");
1000 nvram_set("wl_ifname", "eth1");
1002 break;
1003 case MODEL_RG200E_CA:
1004 mfr = "ChinaNet";
1005 name = "RG200E-CA";
1006 features = SUP_SES | SUP_80211N;
1007 #ifdef TCONFIG_USB
1008 nvram_set("usb_uhci", "-1");
1009 #endif
1010 if (!nvram_match("t_fix1", (char *)name)) {
1011 nvram_set("lan_ifnames", "vlan0 eth1");
1012 nvram_set("wan_ifnameX", "vlan1");
1013 nvram_set("wl_ifname", "eth1");
1015 break;
1016 case MODEL_RTN10:
1017 mfr = "Asus";
1018 name = "RT-N10";
1019 features = SUP_SES | SUP_80211N;
1020 if (!nvram_match("t_fix1", (char *)name)) {
1021 nvram_set("lan_ifnames", "vlan0 eth1");
1022 nvram_set("wan_ifnameX", "vlan1");
1023 nvram_set("wl_ifname", "eth1");
1025 break;
1026 case MODEL_RTN10U:
1027 mfr = "Asus";
1028 name = "RT-N10U";
1029 features = SUP_SES | SUP_80211N;
1030 #ifdef TCONFIG_USB
1031 nvram_set("usb_uhci", "-1");
1032 #endif
1033 if (!nvram_match("t_fix1", (char *)name)) {
1034 nvram_set("lan_ifnames", "vlan0 eth1");
1035 nvram_set("wan_ifnameX", "vlan1");
1036 nvram_set("wl_ifname", "eth1");
1038 break;
1039 case MODEL_RTN12:
1040 mfr = "Asus";
1041 name = "RT-N12";
1042 features = SUP_SES | SUP_BRAU | SUP_80211N;
1043 if (!nvram_match("t_fix1", (char *)name)) {
1044 nvram_set("lan_ifnames", "vlan0 eth1");
1045 nvram_set("wan_ifnameX", "vlan1");
1046 nvram_set("wl_ifname", "eth1");
1048 break;
1049 case MODEL_RTN12B1:
1050 mfr = "Asus";
1051 name = "RT-N12 B1";
1052 features = SUP_80211N;
1053 if (!nvram_match("t_fix1", (char *)name)) {
1054 nvram_set("lan_ifnames", "vlan0 eth1");
1055 nvram_set("wan_ifnameX", "vlan1");
1056 nvram_set("wl_ifname", "eth1");
1058 break;
1059 case MODEL_RTN15U:
1060 mfr = "Asus";
1061 name = "RT-N15U";
1062 features = SUP_SES | SUP_80211N | SUP_1000ET;
1063 #ifdef TCONFIG_USB
1064 nvram_set("usb_uhci", "-1");
1065 #endif
1066 if (!nvram_match("t_fix1", (char *)name)) {
1067 nvram_set("lan_ifnames", "vlan1 eth1");
1068 nvram_set("wan_iface", "vlan2");
1069 nvram_set("wan_ifname", "vlan2");
1070 nvram_set("wan_ifnameX", "vlan2");
1071 nvram_set("wan_ifnames", "vlan2");
1072 nvram_set("wl_ifname", "eth1");
1074 break;
1075 case MODEL_RTN16:
1076 mfr = "Asus";
1077 name = "RT-N16";
1078 features = SUP_SES | SUP_80211N | SUP_1000ET;
1079 #ifdef TCONFIG_USB
1080 nvram_set("usb_uhci", "-1");
1081 #endif
1082 if (!nvram_match("t_fix1", (char *)name)) {
1083 nvram_set("lan_ifnames", "vlan1 eth1");
1084 nvram_set("wan_ifnameX", "vlan2");
1085 nvram_set("wl_ifname", "eth1");
1086 nvram_set("vlan_enable", "1");
1088 break;
1089 case MODEL_RTN53:
1090 mfr = "Asus";
1091 name = "RT-N53";
1092 features = SUP_SES | SUP_80211N;
1093 #if defined(LINUX26) && defined(TCONFIG_USBAP)
1094 if (nvram_get_int("usb_storage") == 1) nvram_set("usb_storage", "-1");
1095 #endif
1096 if (!nvram_match("t_fix1", (char *)name)) {
1097 #ifdef TCONFIG_USBAP
1098 nvram_set("lan_ifnames", "vlan2 eth1 eth2");
1099 nvram_set("landevs", "vlan2 wl0 wl1");
1100 nvram_set("wl1_ifname", "eth2");
1101 #else
1102 nvram_set("lan_ifnames", "vlan2 eth1");
1103 nvram_set("landevs", "vlan2 wl0");
1104 #endif
1105 nvram_set("wl_ifname", "eth1");
1106 nvram_set("wl0_ifname", "eth1");
1107 nvram_set("wan_ifnameX", "vlan1");
1108 nvram_set("wandevs", "vlan1");
1109 nvram_unset("vlan0ports");
1111 break;
1112 case MODEL_L600N:
1113 mfr = "Rosewill";
1114 name = "L600N";
1115 features = SUP_SES | SUP_80211N;
1116 #if defined(LINUX26) && defined(TCONFIG_USBAP)
1117 if (nvram_get_int("usb_storage") == 1) nvram_set("usb_storage", "-1");
1118 #endif
1119 if (!nvram_match("t_fix1", (char *)name)) {
1120 #ifdef TCONFIG_USBAP
1121 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1122 nvram_set("landevs", "vlan1 wl0 wl1");
1123 nvram_set("wl0_ifname", "wl0");
1124 nvram_set("wl1_ifname", "wl1");
1125 #else
1126 nvram_set("lan_ifnames", "vlan1 eth1");
1127 nvram_set("landevs", "vlan1 wl0");
1128 #endif
1129 nvram_set("wl_ifname", "eth1");
1130 nvram_set("wan_ifnameX", "vlan2");
1131 nvram_set("wandevs", "vlan2");
1132 nvram_set("vlan2hwname", "et0");
1133 nvram_set("gpio7", "wps_led");
1134 nvram_set("gpio8", "usb_led");
1135 nvram_set("gpio10", "wlan_button");
1136 nvram_set("gpio20", "wps_button");
1137 nvram_set("gpio21", "reset_button");
1138 nvram_set("gpio22", "wombo_reset");
1139 nvram_set("clkfreq", "500,200,100");
1140 nvram_set("sdram_init", "0x0000");
1141 nvram_set("xtalfreq", "20000");
1142 nvram_set("boot_wait", "on");
1143 nvram_set("wait_time", "3");
1144 nvram_set("boardflags2", "0x0");
1145 nvram_set("boardpwrctl", "0xC00");
1146 nvram_set("boardtype", "0x0550");
1147 nvram_set("watchdog", "0");
1149 break;
1150 case MODEL_RTN66U:
1151 mfr = "Asus";
1152 name = "RT-N66U";
1153 features = SUP_SES | SUP_80211N | SUP_1000ET;
1154 #ifdef TCONFIG_USB
1155 nvram_set("usb_uhci", "-1");
1156 #if defined(LINUX26) && defined(TCONFIG_USB_EXTRAS)
1157 if (nvram_get_int("usb_mmc") == -1) nvram_set("usb_mmc", "0");
1158 #endif
1159 #endif
1160 if (!nvram_match("t_fix1", (char *)name)) {
1161 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1162 nvram_set("wan_ifnameX", "vlan2");
1163 nvram_set("wl_ifnames", "eth1 eth2");
1164 nvram_set("landevs", "vlan1 wl0 wl1");
1165 nvram_set("wandevs", "vlan2");
1166 #if defined(LINUX26) && defined(TCONFIG_USB)
1167 nvram_set("usb_noled", "1-1.4"); /* SD/MMC Card */
1168 #endif
1170 break;
1171 case MODEL_WNR3500L:
1172 mfr = "Netgear";
1173 name = "WNR3500L/U/v2";
1174 features = SUP_SES | SUP_AOSS_LED | SUP_80211N | SUP_1000ET;
1175 if (!nvram_match("t_fix1", (char *)name)) {
1176 nvram_set("sromrev", "3");
1177 nvram_set("lan_ifnames", "vlan1 eth1");
1178 nvram_set("wan_ifnameX", "vlan2");
1179 nvram_set("wl_ifname", "eth1");
1181 break;
1182 case MODEL_WNR3500LV2:
1183 mfr = "Netgear";
1184 name = "WNR3500L v2";
1185 features = SUP_SES | SUP_AOSS_LED | SUP_80211N | SUP_1000ET;
1186 if (!nvram_match("t_fix1", (char *)name)) {
1187 nvram_set("lan_ifnames", "vlan1 eth1");
1188 nvram_set("wan_ifnameX", "vlan2");
1189 nvram_set("wl_ifname", "eth1");
1191 break;
1192 case MODEL_WNR2000v2:
1193 mfr = "Netgear";
1194 name = "WNR2000 v2";
1195 features = SUP_SES | SUP_AOSS_LED | SUP_80211N;
1196 if (!nvram_match("t_fix1", (char *)name)) {
1197 nvram_set("lan_ifnames", "vlan0 eth1");
1198 nvram_set("wan_ifnameX", "vlan1");
1199 nvram_set("wl_ifname", "eth1");
1201 break;
1202 case MODEL_F7D3301:
1203 case MODEL_F7D3302:
1204 case MODEL_F7D4301:
1205 case MODEL_F7D4302:
1206 case MODEL_F5D8235v3:
1207 mfr = "Belkin";
1208 features = SUP_SES | SUP_80211N;
1209 switch (model) {
1210 case MODEL_F7D3301:
1211 name = "Share Max N300 (F7D3301/F7D7301) v1";
1212 break;
1213 case MODEL_F7D3302:
1214 name = "Share N300 (F7D3302/F7D7302) v1";
1215 break;
1216 case MODEL_F7D4301:
1217 name = "Play Max / N600 HD (F7D4301/F7D8301) v1";
1218 break;
1219 case MODEL_F7D4302:
1220 name = "Play N600 (F7D4302/F7D8302) v1";
1221 break;
1222 case MODEL_F5D8235v3:
1223 name = "N F5D8235-4 v3";
1224 break;
1226 #ifdef TCONFIG_USB
1227 nvram_set("usb_uhci", "-1");
1228 #endif
1229 if (!nvram_match("t_fix1", (char *)name)) {
1230 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1231 nvram_set("wan_ifnameX", "vlan2");
1232 nvram_set("landevs", "vlan1 wl0 wl1");
1233 nvram_set("wandevs", "vlan2");
1235 break;
1236 case MODEL_E900:
1237 case MODEL_E1500:
1238 mfr = "Linksys";
1239 name = nvram_safe_get("boot_hw_model");
1240 ver = nvram_safe_get("boot_hw_ver");
1241 features = SUP_SES | SUP_80211N;
1242 if (!nvram_match("t_fix1", (char *)name)) {
1243 nvram_set("lan_ifnames", "vlan1 eth1");
1244 nvram_set("wan_ifnameX", "vlan2");
1245 nvram_set("wl_ifname", "eth1");
1247 break;
1248 case MODEL_E1550:
1249 mfr = "Linksys";
1250 name = nvram_safe_get("boot_hw_model");
1251 ver = nvram_safe_get("boot_hw_ver");
1252 features = SUP_SES | SUP_80211N;
1253 #ifdef TCONFIG_USB
1254 nvram_set("usb_uhci", "-1");
1255 #endif
1256 if (!nvram_match("t_fix1", (char *)name)) {
1257 nvram_set("lan_ifnames", "vlan1 eth1");
1258 nvram_set("wan_ifnameX", "vlan2");
1259 nvram_set("wl_ifname", "eth1");
1261 break;
1262 case MODEL_E2500:
1263 mfr = "Linksys";
1264 name = nvram_safe_get("boot_hw_model");
1265 ver = nvram_safe_get("boot_hw_ver");
1266 features = SUP_SES | SUP_80211N;
1267 #if defined(LINUX26) && defined(TCONFIG_USBAP)
1268 if (nvram_get_int("usb_storage") == 1) nvram_set("usb_storage", "-1");
1269 #endif
1270 if (!nvram_match("t_fix1", (char *)name)) {
1271 #ifdef TCONFIG_USBAP
1272 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1273 nvram_set("landevs", "vlan1 wl0 wl1");
1274 nvram_set("wl0_ifname", "eth1");
1275 nvram_set("wl1_ifname", "eth2");
1276 #else
1277 nvram_set("lan_ifnames", "vlan1 eth1");
1278 nvram_set("landevs", "vlan1 wl0");
1279 #endif
1280 nvram_set("wan_ifnameX", "vlan2");
1281 nvram_set("wl_ifname", "eth1");
1284 break;
1285 case MODEL_E3200:
1286 mfr = "Linksys";
1287 name = nvram_safe_get("boot_hw_model");
1288 ver = nvram_safe_get("boot_hw_ver");
1289 features = SUP_SES | SUP_80211N | SUP_1000ET;
1290 #ifdef TCONFIG_USB
1291 nvram_set("usb_uhci", "-1");
1292 #endif
1293 if (!nvram_match("t_fix1", (char *)name)) {
1294 #ifdef TCONFIG_USBAP
1295 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1296 nvram_set("landevs", "vlan1 wl0 wl1");
1297 nvram_set("wl0_ifname", "eth1");
1298 nvram_set("wl1_ifname", "eth2");
1299 #else
1300 nvram_set("lan_ifnames", "vlan1 eth1");
1301 nvram_set("landevs", "vlan1 wl0");
1302 #endif
1303 nvram_set("wl_ifname", "eth1");
1304 nvram_set("wan_ifnameX", "vlan2");
1306 break;
1307 case MODEL_E1000v2:
1308 case MODEL_WRT160Nv3:
1309 // same as M10, M20, WRT310Nv2, E1000v1
1310 mfr = "Linksys";
1311 name = nvram_safe_get("boot_hw_model");
1312 ver = nvram_safe_get("boot_hw_ver");
1313 if (nvram_match("boot_hw_model", "E100")){
1314 name = "E1000";
1316 if (nvram_match("boot_hw_model", "M10") || nvram_match("boot_hw_model", "M20")){
1317 mfr = "Cisco";
1319 features = SUP_SES | SUP_80211N | SUP_WHAM_LED;
1320 if (!nvram_match("t_fix1", (char *)name)) {
1321 nvram_set("lan_ifnames", "vlan1 eth1");
1322 nvram_set("wan_ifnameX", "vlan2");
1323 nvram_set("wl_ifname", "eth1");
1325 break;
1326 case MODEL_WRT320N:
1327 mfr = "Linksys";
1328 name = nvram_match("boardrev", "0x1307") ? "E2000" : "WRT320N";
1329 features = SUP_SES | SUP_80211N | SUP_WHAM_LED | SUP_1000ET;
1330 if (!nvram_match("t_fix1", (char *)name)) {
1331 nvram_set("lan_ifnames", "vlan1 eth1");
1332 nvram_set("wan_ifnameX", "vlan2");
1333 nvram_set("wl_ifname", "eth1");
1335 break;
1336 case MODEL_WRT610Nv2:
1337 mfr = "Linksys";
1338 name = nvram_match("boot_hw_model", "E300") ? "E3000" : "WRT610N v2";
1339 features = SUP_SES | SUP_80211N | SUP_WHAM_LED | SUP_1000ET;
1340 #ifdef TCONFIG_USB
1341 nvram_set("usb_uhci", "-1");
1342 #endif
1343 if (!nvram_match("t_fix1", (char *)name)) {
1344 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1345 nvram_set("wan_ifnameX", "vlan2");
1346 nvram_set("wl_ifname", "eth1");
1348 break;
1349 case MODEL_E4200:
1350 mfr = "Linksys";
1351 name = "E4200 v1";
1352 features = SUP_SES | SUP_80211N | SUP_1000ET;
1353 #ifdef TCONFIG_USB
1354 nvram_set("usb_uhci", "-1");
1355 #endif
1356 if (!nvram_match("t_fix1", (char *)name)) {
1357 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1358 nvram_set("wan_ifnameX", "vlan2");
1359 nvram_set("wl_ifname", "eth1");
1361 break;
1362 #endif // CONFIG_BCMWL5
1364 case MODEL_WL330GE:
1365 mfr = "Asus";
1366 name = "WL-330gE";
1367 // The 330gE has only one wired port which can act either as WAN or LAN.
1368 // Failsafe mode is to have it start as a LAN port so you can get an IP
1369 // address via DHCP and access the router config page.
1370 if (!nvram_match("t_fix1", (char *)name)) {
1371 nvram_set("wl_ifname", "eth1");
1372 nvram_set("lan_ifnames", "eth1");
1373 nvram_set("wan_ifnameX", "eth0");
1374 nvram_set("wan_islan", "1");
1375 nvram_set("wan_proto", "disabled");
1377 break;
1378 case MODEL_WL500GPv2:
1379 mfr = "Asus";
1380 name = "WL-500gP v2";
1381 features = SUP_SES;
1382 #ifdef TCONFIG_USB
1383 nvram_set("usb_uhci", "-1");
1384 #endif
1385 break;
1386 case MODEL_WL520GU:
1387 mfr = "Asus";
1388 name = "WL-520GU";
1389 features = SUP_SES;
1390 #ifdef TCONFIG_USB
1391 nvram_set("usb_uhci", "-1");
1392 #endif
1393 break;
1394 case MODEL_WL500GD:
1395 mfr = "Asus";
1396 name = "WL-500g Deluxe";
1397 // features = SUP_SES;
1398 #ifdef TCONFIG_USB
1399 nvram_set("usb_ohci", "-1");
1400 #endif
1401 if (!nvram_match("t_fix1", (char *)name)) {
1402 nvram_set("wl_ifname", "eth1");
1403 nvram_set("lan_ifnames", "vlan0 eth1");
1404 nvram_set("wan_ifnameX", "vlan1");
1405 nvram_unset("wl0gpio0");
1407 break;
1408 case MODEL_DIR320:
1409 mfr = "D-Link";
1410 name = "DIR-320";
1411 features = SUP_SES;
1412 if (!nvram_match("t_fix1", (char *)name)) {
1413 nvram_set("wan_ifnameX", "vlan1");
1414 nvram_set("wl_ifname", "eth1");
1416 break;
1417 case MODEL_H618B:
1418 mfr = "ZTE";
1419 name = "ZXV10 H618B";
1420 features = SUP_SES | SUP_AOSS_LED;
1421 break;
1422 case MODEL_WL1600GL:
1423 mfr = "Ovislink";
1424 name = "WL1600GL";
1425 features = SUP_SES;
1426 break;
1427 #endif // WL_BSS_INFO_VERSION >= 108
1428 case MODEL_WZRG300N:
1429 mfr = "Buffalo";
1430 name = "WZR-G300N";
1431 features = SUP_SES | SUP_AOSS_LED | SUP_BRAU | SUP_80211N;
1432 break;
1433 case MODEL_WRT160Nv1:
1434 case MODEL_WRT300N:
1435 mfr = "Linksys";
1436 name = (model == MODEL_WRT300N) ? "WRT300N v1" : "WRT160N v1";
1437 features = SUP_SES | SUP_80211N;
1438 if (!nvram_match("t_fix1", (char *)name)) {
1439 nvram_set("wan_ifnameX", "eth1");
1440 nvram_set("lan_ifnames", "eth0 eth2");
1442 break;
1443 case MODEL_WRT310Nv1:
1444 mfr = "Linksys";
1445 name = "WRT310N v1";
1446 features = SUP_SES | SUP_80211N | SUP_WHAM_LED | SUP_1000ET;
1447 if (!nvram_match("t_fix1", (char *)name)) {
1448 nvram_set("lan_ifnames", "vlan1 eth1");
1449 nvram_set("wan_ifnameX", "vlan2");
1450 nvram_set("wl_ifname", "eth1");
1452 break;
1455 if (name) {
1456 nvram_set("t_fix1", name);
1457 /* Don't show the version information if it's empty (null or empty string) */
1458 if (ver == NULL || strcmp(ver, "") == 0) {
1459 sprintf(s, "%s %s", mfr, name);
1460 } else {
1461 sprintf(s, "%s %s v%s", mfr, name, ver);
1464 else {
1465 snprintf(s, sizeof(s), "%s %d/%s/%s/%s/%s", mfr, check_hw_type(),
1466 nvram_safe_get("boardtype"), nvram_safe_get("boardnum"), nvram_safe_get("boardrev"), nvram_safe_get("boardflags"));
1467 s[64] = 0;
1470 nvram_set("t_model_name", s);
1472 nvram_set("pa0maxpwr", "400"); // allow Tx power up tp 400 mW, needed for ND only
1474 sprintf(s, "0x%lX", features);
1475 nvram_set("t_features", s);
1478 note: set wan_ifnameX if wan_ifname needs to be overriden
1481 if (nvram_is_empty("wan_ifnameX")) {
1482 #if 1
1483 nvram_set("wan_ifnameX", ((strtoul(nvram_safe_get("boardflags"), NULL, 0) & BFL_ENETVLAN) ||
1484 (check_hw_type() == HW_BCM4712)) ? "vlan1" : "eth1");
1485 #else
1486 p = nvram_safe_get("wan_ifname");
1487 if ((*p == 0) || (nvram_match("wl_ifname", p))) {
1488 p = ((strtoul(nvram_safe_get("boardflags"), NULL, 0) & BFL_ENETVLAN) ||
1489 (check_hw_type() == HW_BCM4712)) ? "vlan1" : "eth1";
1491 nvram_set("wan_ifnameX", p);
1492 #endif
1495 //!!TB - do not force country code here to allow nvram override
1496 //nvram_set("wl_country", "JP");
1497 //nvram_set("wl_country_code", "JP");
1498 nvram_set("wan_get_dns", "");
1499 nvram_set("wan_get_domain", "");
1500 nvram_set("ppp_get_ip", "");
1501 nvram_set("action_service", "");
1502 nvram_set("jffs2_format", "0");
1503 nvram_set("rrules_radio", "-1");
1504 nvram_unset("https_crt_gen");
1505 nvram_unset("log_wmclear");
1506 #ifdef TCONFIG_IPV6
1507 nvram_set("ipv6_get_dns", "");
1508 #endif
1509 #ifdef TCONFIG_MEDIA_SERVER
1510 nvram_unset("ms_rescan");
1511 #endif
1512 if (nvram_get_int("http_id_gen") == 1) nvram_unset("http_id");
1514 nvram_unset("sch_rboot_last");
1515 nvram_unset("sch_rcon_last");
1516 nvram_unset("sch_c1_last");
1517 nvram_unset("sch_c2_last");
1518 nvram_unset("sch_c3_last");
1520 nvram_set("brau_state", "");
1521 if ((features & SUP_BRAU) == 0) nvram_set("script_brau", "");
1522 if ((features & SUP_SES) == 0) nvram_set("sesx_script", "");
1524 if ((features & SUP_1000ET) == 0) nvram_set("jumbo_frame_enable", "0");
1526 // compatibility with old versions
1527 if (nvram_match("wl_net_mode", "disabled")) {
1528 nvram_set("wl_radio", "0");
1529 nvram_set("wl_net_mode", "mixed");
1532 return 0;
1535 /* Get the special files from nvram and copy them to disc.
1536 * These were files saved with "nvram setfile2nvram <filename>".
1537 * Better hope that they were saved with full pathname.
1539 static void load_files_from_nvram(void)
1541 char *name, *cp;
1542 int ar_loaded = 0;
1543 char buf[NVRAM_SPACE];
1545 if (nvram_getall(buf, sizeof(buf)) != 0)
1546 return;
1548 for (name = buf; *name; name += strlen(name) + 1) {
1549 if (strncmp(name, "FILE:", 5) == 0) { /* This special name marks a file to get. */
1550 if ((cp = strchr(name, '=')) == NULL)
1551 continue;
1552 *cp = 0;
1553 syslog(LOG_INFO, "Loading file '%s' from nvram", name + 5);
1554 nvram_nvram2file(name, name + 5);
1555 if (memcmp(".autorun", cp - 8, 9) == 0)
1556 ++ar_loaded;
1559 /* Start any autorun files that may have been loaded into one of the standard places. */
1560 if (ar_loaded != 0)
1561 run_nvscript(".autorun", NULL, 3);
1564 #if defined(LINUX26) && defined(TCONFIG_USB)
1565 static inline void tune_min_free_kbytes(void)
1567 struct sysinfo info;
1569 memset(&info, 0, sizeof(struct sysinfo));
1570 sysinfo(&info);
1571 if (info.totalram >= 55 * 1024 * 1024) {
1572 // If we have 64MB+ RAM, tune min_free_kbytes
1573 // to reduce page allocation failure errors.
1574 f_write_string("/proc/sys/vm/min_free_kbytes", "8192", 0, 0);
1577 #endif
1579 static void sysinit(void)
1581 static int noconsole = 0;
1582 static const time_t tm = 0;
1583 int hardware;
1584 int i;
1585 DIR *d;
1586 struct dirent *de;
1587 char s[256];
1588 char t[256];
1589 int model;
1591 mount("proc", "/proc", "proc", 0, NULL);
1592 mount("tmpfs", "/tmp", "tmpfs", 0, NULL);
1594 #ifdef LINUX26
1595 mount("devfs", "/dev", "tmpfs", MS_MGC_VAL | MS_NOATIME, NULL);
1596 mknod("/dev/null", S_IFCHR | 0666, makedev(1, 3));
1597 mknod("/dev/console", S_IFCHR | 0600, makedev(5, 1));
1598 mount("sysfs", "/sys", "sysfs", MS_MGC_VAL, NULL);
1599 mkdir("/dev/shm", 0777);
1600 mkdir("/dev/pts", 0777);
1601 mknod("/dev/pts/ptmx", S_IRWXU|S_IFCHR, makedev(5, 2));
1602 mknod("/dev/pts/0", S_IRWXU|S_IFCHR, makedev(136, 0));
1603 mknod("/dev/pts/1", S_IRWXU|S_IFCHR, makedev(136, 1));
1604 mount("devpts", "/dev/pts", "devpts", MS_MGC_VAL, NULL);
1605 #endif
1607 if (console_init()) noconsole = 1;
1609 stime(&tm);
1611 static const char *mkd[] = {
1612 "/tmp/etc", "/tmp/var", "/tmp/home", "/tmp/mnt",
1613 "/tmp/splashd", //!!Victek
1614 "/tmp/share", "/var/webmon", // !!TB
1615 "/var/log", "/var/log/nginx", "/var/run", "/var/tmp", "/var/lib", "/var/lib/misc",
1616 "/var/spool", "/var/spool/cron", "/var/spool/cron/crontabs",
1617 "/tmp/var/wwwext", "/tmp/var/wwwext/cgi-bin", // !!TB - CGI support
1618 NULL
1620 umask(0);
1621 for (i = 0; mkd[i]; ++i) {
1622 mkdir(mkd[i], 0755);
1624 mkdir("/var/lock", 0777);
1625 mkdir("/var/tmp/dhcp", 0777);
1626 mkdir("/home/root", 0700);
1627 chmod("/tmp", 0777);
1628 f_write("/etc/hosts", NULL, 0, 0, 0644); // blank
1629 f_write("/etc/fstab", NULL, 0, 0, 0644); // !!TB - blank
1630 simple_unlock("cron");
1631 simple_unlock("firewall");
1632 simple_unlock("restrictions");
1633 umask(022);
1635 if ((d = opendir("/rom/etc")) != NULL) {
1636 while ((de = readdir(d)) != NULL) {
1637 if (de->d_name[0] == '.') continue;
1638 snprintf(s, sizeof(s), "%s/%s", "/rom/etc", de->d_name);
1639 snprintf(t, sizeof(t), "%s/%s", "/etc", de->d_name);
1640 symlink(s, t);
1642 closedir(d);
1644 symlink("/proc/mounts", "/etc/mtab");
1646 #ifdef TCONFIG_SAMBASRV
1647 if ((d = opendir("/usr/codepages")) != NULL) {
1648 while ((de = readdir(d)) != NULL) {
1649 if (de->d_name[0] == '.') continue;
1650 snprintf(s, sizeof(s), "/usr/codepages/%s", de->d_name);
1651 snprintf(t, sizeof(t), "/usr/share/%s", de->d_name);
1652 symlink(s, t);
1654 closedir(d);
1656 #endif
1658 #ifdef LINUX26
1659 eval("hotplug2", "--coldplug");
1660 start_hotplug2();
1662 static const char *dn[] = {
1663 "null", "zero", "random", "urandom", "full", "ptmx", "nvram",
1664 NULL
1666 for (i = 0; dn[i]; ++i) {
1667 snprintf(s, sizeof(s), "/dev/%s", dn[i]);
1668 chmod(s, 0666);
1670 chmod("/dev/gpio", 0660);
1671 #endif
1673 set_action(ACT_IDLE);
1675 for (i = 0; defenv[i]; ++i) {
1676 putenv(defenv[i]);
1679 if (!noconsole) {
1680 printf("\n\nHit ENTER for console...\n\n");
1681 run_shell(1, 0);
1684 check_bootnv();
1686 #ifdef TCONFIG_IPV6
1687 // disable IPv6 by default on all interfaces
1688 f_write_string("/proc/sys/net/ipv6/conf/default/disable_ipv6", "1", 0, 0);
1689 #endif
1691 for (i = 0; i < sizeof(fatalsigs) / sizeof(fatalsigs[0]); i++) {
1692 signal(fatalsigs[i], handle_fatalsigs);
1694 signal(SIGCHLD, handle_reap);
1696 switch (model = get_model()) {
1697 case MODEL_WR850GV1:
1698 case MODEL_WR850GV2:
1699 // need to cleanup some variables...
1700 if ((nvram_get("t_model") == NULL) && (nvram_get("MyFirmwareVersion") != NULL)) {
1701 nvram_unset("MyFirmwareVersion");
1702 nvram_set("restore_defaults", "1");
1704 break;
1707 #ifdef CONFIG_BCMWL5
1708 // ctf must be loaded prior to any other modules
1709 if (nvram_invmatch("ctf_disable", "1"))
1710 modprobe("ctf");
1711 #endif
1713 #ifdef TCONFIG_EMF
1714 modprobe("emf");
1715 modprobe("igs");
1716 #endif
1718 switch (hardware = check_hw_type()) {
1719 case HW_BCM4785:
1720 modprobe("bcm57xx");
1721 break;
1722 default:
1723 modprobe("et");
1724 break;
1727 load_wl();
1729 config_loopback();
1731 eval("nvram", "defaults", "--initcheck");
1732 init_nvram();
1734 // set the packet size
1735 if (nvram_get_int("jumbo_frame_enable")) {
1736 // only set the size here - 'enable' flag is set by the driver
1737 // eval("et", "robowr", "0x40", "0x01", "0x1F"); // (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4)
1738 eval("et", "robowr", "0x40", "0x05", nvram_safe_get("jumbo_frame_size"));
1741 klogctl(8, NULL, nvram_get_int("console_loglevel"));
1743 #if defined(LINUX26) && defined(TCONFIG_USB)
1744 tune_min_free_kbytes();
1745 #endif
1746 setup_conntrack();
1747 set_host_domain_name();
1749 set_tz();
1751 eval("buttons");
1753 if (!noconsole) xstart("console");
1755 i = nvram_get_int("sesx_led");
1756 led(LED_AMBER, (i & 1) != 0);
1757 led(LED_WHITE, (i & 2) != 0);
1758 led(LED_AOSS, (i & 4) != 0);
1759 led(LED_BRIDGE, (i & 8) != 0);
1760 led(LED_DIAG, 1);
1763 int init_main(int argc, char *argv[])
1765 int state, i;
1766 sigset_t sigset;
1768 // AB - failsafe?
1769 nvram_unset("debug_rc_svc");
1771 sysinit();
1773 sigemptyset(&sigset);
1774 for (i = 0; i < sizeof(initsigs) / sizeof(initsigs[0]); i++) {
1775 sigaddset(&sigset, initsigs[i]);
1777 sigprocmask(SIG_BLOCK, &sigset, NULL);
1779 #if defined(DEBUG_NOISY)
1780 nvram_set("debug_logeval", "1");
1781 nvram_set("debug_cprintf", "1");
1782 nvram_set("debug_cprintf_file", "1");
1783 nvram_set("debug_ddns", "1");
1784 #endif
1786 start_jffs2();
1788 state = SIGUSR2; /* START */
1790 for (;;) {
1791 TRACE_PT("main loop signal/state=%d\n", state);
1793 switch (state) {
1794 case SIGUSR1: /* USER1: service handler */
1795 exec_service();
1796 break;
1798 case SIGHUP: /* RESTART */
1799 case SIGINT: /* STOP */
1800 case SIGQUIT: /* HALT */
1801 case SIGTERM: /* REBOOT */
1802 led(LED_DIAG, 1);
1803 unlink("/var/notice/sysup");
1805 run_nvscript("script_shut", NULL, 10);
1807 stop_services();
1808 stop_wan();
1809 stop_lan();
1810 stop_vlan();
1811 stop_syslog();
1813 if ((state == SIGTERM /* REBOOT */) ||
1814 (state == SIGQUIT /* HALT */)) {
1815 remove_storage_main(1);
1816 stop_usb();
1818 shutdn(state == SIGTERM /* REBOOT */);
1819 exit(0);
1821 if (state == SIGINT /* STOP */) {
1822 break;
1825 // SIGHUP (RESTART) falls through
1827 case SIGUSR2: /* START */
1828 SET_LED(RELEASE_WAN_CONTROL);
1829 start_syslog();
1831 load_files_from_nvram();
1833 int fd = -1;
1834 fd = file_lock("usb"); // hold off automount processing
1835 start_usb();
1837 run_nvscript("script_init", NULL, 2);
1839 file_unlock(fd); // allow to process usb hotplug events
1840 #ifdef TCONFIG_USB
1842 * On RESTART some partitions can stay mounted if they are busy at the moment.
1843 * In that case USB drivers won't unload, and hotplug won't kick off again to
1844 * remount those drives that actually got unmounted. Make sure to remount ALL
1845 * partitions here by simulating hotplug event.
1847 if (state == SIGHUP /* RESTART */)
1848 add_remove_usbhost("-1", 1);
1849 #endif
1851 create_passwd();
1852 start_vlan();
1853 start_lan();
1854 start_arpbind();
1855 start_wan(BOOT);
1856 start_services();
1857 start_wl();
1859 #ifdef CONFIG_BCMWL5
1860 if (wds_enable()) {
1861 /* Restart NAS one more time - for some reason without
1862 * this the new driver doesn't always bring WDS up.
1864 stop_nas();
1865 start_nas();
1867 #endif
1869 syslog(LOG_INFO, "%s: Tomato %s", nvram_safe_get("t_model_name"), tomato_version);
1871 led(LED_DIAG, 0);
1872 notice_set("sysup", "");
1873 break;
1876 chld_reap(0); /* Periodically reap zombies. */
1877 check_services();
1878 sigwait(&sigset, &state);
1881 return 0;
1884 int reboothalt_main(int argc, char *argv[])
1886 int reboot = (strstr(argv[0], "reboot") != NULL);
1887 puts(reboot ? "Rebooting..." : "Shutting down...");
1888 fflush(stdout);
1889 sleep(1);
1890 kill(1, reboot ? SIGTERM : SIGQUIT);
1892 /* In the case we're hung, we'll get stuck and never actually reboot.
1893 * The only way out is to pull power.
1894 * So after 'reset_wait' seconds (default: 20), forcibly crash & restart.
1896 if (fork() == 0) {
1897 int wait = nvram_get_int("reset_wait") ? : 20;
1898 if ((wait < 10) || (wait > 120)) wait = 10;
1900 f_write("/proc/sysrq-trigger", "s", 1, 0 , 0); /* sync disks */
1901 sleep(wait);
1902 puts("Still running... Doing machine reset.");
1903 fflush(stdout);
1904 f_write("/proc/sysrq-trigger", "s", 1, 0 , 0); /* sync disks */
1905 sleep(1);
1906 f_write("/proc/sysrq-trigger", "b", 1, 0 , 0); /* machine reset */
1909 return 0;