Fix E4200 bricking
[tomato.git] / release / src / router / rc / init.c
blob8c09510abcf5f8eb38d84bf46cc145b51036e3fb
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 if (nvram_match("vlan1ports", "0 5u")) // 520GU or WL500GE?
381 dirty |= check_nv("vlan1ports", "0 5");
382 else if (nvram_match("vlan1ports", "4 5u"))
383 dirty |= check_nv("vlan1ports", "4 5");
384 break;
385 case MODEL_WL500GD:
386 dirty |= check_nv("vlan0ports", "1 2 3 4 5*");
387 dirty |= check_nv("vlan1ports", "0 5");
388 break;
389 case MODEL_DIR320:
390 case MODEL_H618B:
391 dirty |= (nvram_get("vlan2ports") != NULL);
392 nvram_unset("vlan2ports");
393 dirty |= check_nv("vlan1ports", "0 5");
394 break;
395 case MODEL_WRT310Nv1:
396 dirty |= check_nv("vlan1ports", "1 2 3 4 8*");
397 dirty |= check_nv("vlan2ports", "0 8");
398 break;
399 case MODEL_WL1600GL:
400 dirty |= check_nv("vlan0ports", "0 1 2 3 5*");
401 dirty |= check_nv("vlan1ports", "4 5");
402 break;
403 #ifdef CONFIG_BCMWL5
404 case MODEL_WNR3500L:
405 case MODEL_WRT320N:
406 case MODEL_WNR3500LV2:
407 case MODEL_RTN16:
408 case MODEL_RTN66U:
409 dirty |= check_nv("vlan1ports", "4 3 2 1 8*");
410 dirty |= check_nv("vlan2ports", "0 8");
411 break;
412 case MODEL_RTN53:
413 dirty |= check_nv("vlan2ports", "0 1 2 3 5*");
414 dirty |= check_nv("vlan1ports", "4 5");
415 break;
416 case MODEL_WNR2000v2:
417 dirty |= check_nv("vlan1ports", "4 3 2 1 5*");
418 dirty |= check_nv("vlan2ports", "0 5");
419 break;
420 case MODEL_RTN10:
421 dirty |= check_nv("vlan1ports", "4 5");
422 break;
423 case MODEL_E1000v2:
424 dirty |= check_nv("vlan1ports", "1 2 3 4 5*");
425 dirty |= check_nv("vlan2ports", "0 5");
426 break;
427 case MODEL_RTN10U:
428 dirty |= check_nv("vlan0ports", "1 2 3 4 5*");
429 dirty |= check_nv("vlan1ports", "0 5");
430 break;
431 case MODEL_RTN12:
432 case MODEL_RTN12B1:
433 dirty |= check_nv("vlan0ports", "3 2 1 0 5*");
434 dirty |= check_nv("vlan1ports", "4 5");
435 break;
436 case MODEL_WRT610Nv2:
437 case MODEL_F5D8235v3:
438 dirty |= check_nv("vlan1ports", "1 2 3 4 8*");
439 dirty |= check_nv("vlan2ports", "0 8");
440 break;
441 case MODEL_F7D3301:
442 case MODEL_F7D4301:
443 dirty |= check_nv("vlan1ports", "3 2 1 0 8*");
444 dirty |= check_nv("vlan2ports", "4 8");
445 break;
446 case MODEL_E900:
447 case MODEL_E1500:
448 case MODEL_E2500:
449 case MODEL_F7D3302:
450 case MODEL_F7D4302:
451 dirty |= check_nv("vlan1ports", "0 1 2 3 5*");
452 dirty |= check_nv("vlan2ports", "4 5");
453 break;
454 case MODEL_RTN15U:
455 case MODEL_E1550:
456 case MODEL_E3200:
457 case MODEL_E4200:
458 dirty |= check_nv("vlan1ports", "0 1 2 3 8*");
459 dirty |= check_nv("vlan2ports", "4 8");
460 break;
461 case MODEL_WRT160Nv3:
462 if (nvram_match("vlan1ports", "1 2 3 4 5*")) {
463 // fix lan port numbering on CSE41, CSE51
464 dirty |= check_nv("vlan1ports", "4 3 2 1 5*");
466 else if (nvram_match("vlan1ports", "1 2 3 4 8*")) {
467 // WRT310Nv2 ?
468 dirty |= check_nv("vlan1ports", "4 3 2 1 8*");
470 break;
471 #endif
474 return dirty;
477 static void check_bootnv(void)
479 int dirty;
480 int hardware;
481 int model;
482 char mac[18];
484 model = get_model();
485 dirty = check_nv("wl0_leddc", "0x640000") | check_nv("wl1_leddc", "0x640000");
487 switch (model) {
488 case MODEL_WTR54GS:
489 dirty |= check_nv("vlan0hwname", "et0");
490 dirty |= check_nv("vlan1hwname", "et0");
491 break;
492 case MODEL_WBRG54:
493 dirty |= check_nv("wl0gpio0", "130");
494 break;
495 case MODEL_WR850GV1:
496 case MODEL_WR850GV2:
497 // need to cleanup some variables...
498 if ((nvram_get("t_model") == NULL) && (nvram_get("MyFirmwareVersion") != NULL)) {
499 nvram_unset("MyFirmwareVersion");
500 nvram_set("restore_defaults", "1");
502 break;
503 case MODEL_WL500W:
504 /* fix WL500W mac adresses for WAN port */
505 if (invalid_mac(nvram_get("et1macaddr"))) {
506 strcpy(mac, nvram_safe_get("et0macaddr"));
507 inc_mac(mac, 1);
508 dirty |= check_nv("et1macaddr", mac);
510 dirty |= check_nv("wl0gpio0", "0x88");
511 break;
512 case MODEL_WL500GP:
513 dirty |= check_nv("sdram_init", "0x0009"); // 32MB; defaults: 0x000b, 0x0009
514 dirty |= check_nv("wl0gpio0", "136");
515 break;
516 case MODEL_WL500GPv2:
517 case MODEL_WL520GU:
518 dirty |= check_nv("wl0gpio1", "136");
519 break;
520 case MODEL_WL500GD:
521 dirty |= check_nv("vlan0hwname", "et0");
522 dirty |= check_nv("vlan1hwname", "et0");
523 dirty |= check_nv("boardflags", "0x00000100"); // set BFL_ENETVLAN
524 nvram_unset("wl0gpio0");
525 break;
526 case MODEL_DIR320:
527 if (strlen(nvram_safe_get("et0macaddr")) == 12 ||
528 strlen(nvram_safe_get("il0macaddr")) == 12) {
529 dirty |= find_dir320_mac_addr();
531 if (nvram_get("vlan2hwname") != NULL) {
532 nvram_unset("vlan2hwname");
533 dirty = 1;
535 dirty |= check_nv("wandevs", "vlan1");
536 dirty |= check_nv("vlan1hwname", "et0");
537 dirty |= check_nv("wl0gpio0", "8");
538 dirty |= check_nv("wl0gpio1", "0");
539 dirty |= check_nv("wl0gpio2", "0");
540 dirty |= check_nv("wl0gpio3", "0");
541 case MODEL_WL1600GL:
542 if (invalid_mac(nvram_get("et0macaddr"))) {
543 dirty |= find_sercom_mac_addr();
545 break;
546 case MODEL_WRT160Nv1:
547 case MODEL_WRT310Nv1:
548 case MODEL_WRT300N:
549 dirty |= check_nv("wl0gpio0", "8");
550 break;
551 #ifdef CONFIG_BCMWL5
552 case MODEL_WNR3500L:
553 dirty |= check_nv("boardflags", "0x00000710"); // needed to enable USB
554 dirty |= check_nv("vlan2hwname", "et0");
555 dirty |= check_nv("ledbh0", "7");
556 break;
557 case MODEL_WNR3500LV2:
558 dirty |= check_nv("vlan2hwname", "et0");
559 break;
560 case MODEL_WNR2000v2:
561 dirty |= check_nv("ledbh5", "8");
562 break;
563 case MODEL_WRT320N:
564 dirty |= check_nv("reset_gpio", "5");
565 dirty |= check_nv("ledbh0", "136");
566 dirty |= check_nv("ledbh1", "11");
567 /* fall through, same as RT-N16 */
568 case MODEL_RTN16:
569 dirty |= check_nv("vlan2hwname", "et0");
570 break;
571 case MODEL_WRT610Nv2:
572 dirty |= check_nv("vlan2hwname", "et0");
573 dirty |= check_nv("pci/1/1/ledbh2", "8");
574 dirty |= check_nv("sb/1/ledbh1", "8");
575 if (invalid_mac(nvram_get("pci/1/1/macaddr"))) {
576 strcpy(mac, nvram_safe_get("et0macaddr"));
577 inc_mac(mac, 3);
578 dirty |= check_nv("pci/1/1/macaddr", mac);
580 break;
581 case MODEL_F7D3301:
582 case MODEL_F7D3302:
583 case MODEL_F7D4301:
584 case MODEL_F7D4302:
585 case MODEL_F5D8235v3:
586 if (nvram_match("sb/1/macaddr", nvram_safe_get("et0macaddr"))) {
587 strcpy(mac, nvram_safe_get("et0macaddr"));
588 inc_mac(mac, 2);
589 dirty |= check_nv("sb/1/macaddr", mac);
590 inc_mac(mac, 1);
591 dirty |= check_nv("pci/1/1/macaddr", mac);
593 case MODEL_E4200:
594 dirty |= check_nv("vlan2hwname", "et0");
595 if (invalid_mac(nvram_get("pci/1/1/macaddr")) == 0 ||
596 invalid_mac(nvram_get("sb/1/macaddr"))) {
597 strcpy(mac, nvram_safe_get("et0macaddr"));
598 inc_mac(mac, 2);
599 dirty |= check_nv("sb/1/macaddr", mac);
600 inc_mac(mac, 1);
601 dirty |= check_nv("pci/1/1/macaddr", mac);
603 break;
604 case MODEL_E900:
605 case MODEL_E1000v2:
606 case MODEL_E1500:
607 case MODEL_E1550:
608 case MODEL_E2500:
609 case MODEL_E3200:
610 case MODEL_WRT160Nv3:
611 dirty |= check_nv("vlan2hwname", "et0");
612 break;
613 #endif
615 case MODEL_WRT54G:
616 if (strncmp(nvram_safe_get("pmon_ver"), "CFE", 3) != 0) return;
618 hardware = check_hw_type();
619 if (!nvram_get("boardtype") ||
620 !nvram_get("boardnum") ||
621 !nvram_get("boardflags") ||
622 !nvram_get("clkfreq") ||
623 !nvram_get("os_flash_addr") ||
624 !nvram_get("dl_ram_addr") ||
625 !nvram_get("os_ram_addr") ||
626 !nvram_get("scratch") ||
627 !nvram_get("et0macaddr") ||
628 ((hardware != HW_BCM4704_BCM5325F) && (!nvram_get("vlan0ports") || !nvram_get("vlan0hwname")))) {
629 _dprintf("Unable to find critical settings, erasing NVRAM\n");
630 mtd_erase("nvram");
631 goto REBOOT;
634 dirty |= check_nv("aa0", "3");
635 dirty |= check_nv("wl0gpio0", "136");
636 dirty |= check_nv("wl0gpio2", "0");
637 dirty |= check_nv("wl0gpio3", "0");
638 dirty |= check_nv("cctl", "0");
639 dirty |= check_nv("ccode", "0");
641 switch (hardware) {
642 case HW_BCM5325E:
643 /* Lower the DDR ram drive strength , the value will be stable for all boards
644 Latency 3 is more stable for all ddr 20050420 by honor */
645 dirty |= check_nv("sdram_init", "0x010b");
646 dirty |= check_nv("sdram_config", "0x0062");
647 if (!nvram_match("debug_clkfix", "0")) {
648 dirty |= check_nv("clkfreq", "216");
650 if (dirty) {
651 nvram_set("sdram_ncdl", "0x0");
653 dirty |= check_nv("pa0itssit", "62");
654 dirty |= check_nv("pa0b0", "0x15eb");
655 dirty |= check_nv("pa0b1", "0xfa82");
656 dirty |= check_nv("pa0b2", "0xfe66");
657 //dirty |= check_nv("pa0maxpwr", "0x4e");
658 break;
659 case HW_BCM5352E: // G v4, GS v3, v4
660 dirty |= check_nv("sdram_init", "0x010b");
661 dirty |= check_nv("sdram_config", "0x0062");
662 if (dirty) {
663 nvram_set("sdram_ncdl", "0x0");
665 dirty |= check_nv("pa0itssit", "62");
666 dirty |= check_nv("pa0b0", "0x168b");
667 dirty |= check_nv("pa0b1", "0xfabf");
668 dirty |= check_nv("pa0b2", "0xfeaf");
669 //dirty |= check_nv("pa0maxpwr", "0x4e");
670 break;
671 case HW_BCM5354G:
672 dirty |= check_nv("pa0itssit", "62");
673 dirty |= check_nv("pa0b0", "0x1326");
674 dirty |= check_nv("pa0b1", "0xFB51");
675 dirty |= check_nv("pa0b2", "0xFE87");
676 //dirty |= check_nv("pa0maxpwr", "0x4e");
677 break;
678 case HW_BCM4704_BCM5325F:
679 // nothing to do
680 break;
681 default:
682 dirty |= check_nv("pa0itssit", "62");
683 dirty |= check_nv("pa0b0", "0x170c");
684 dirty |= check_nv("pa0b1", "0xfa24");
685 dirty |= check_nv("pa0b2", "0xfe70");
686 //dirty |= check_nv("pa0maxpwr", "0x48");
687 break;
689 break;
691 } // switch (model)
693 dirty |= init_vlan_ports();
695 if (dirty) {
696 nvram_commit();
697 REBOOT: // do a simple reboot
698 sync();
699 reboot(RB_AUTOBOOT);
700 exit(0);
704 static int init_nvram(void)
706 unsigned long features;
707 int model;
708 const char *mfr;
709 const char *name;
710 const char *ver;
711 char s[256];
712 unsigned long bf;
713 unsigned long n;
715 model = get_model();
716 sprintf(s, "%d", model);
717 nvram_set("t_model", s);
719 mfr = "Broadcom";
720 name = NULL;
721 features = 0;
722 switch (model) {
723 case MODEL_WRT54G:
724 mfr = "Linksys";
725 name = "WRT54G/GS/GL";
726 switch (check_hw_type()) {
727 case HW_BCM4712:
728 nvram_set("gpio2", "adm_eecs");
729 nvram_set("gpio3", "adm_eesk");
730 nvram_unset("gpio4");
731 nvram_set("gpio5", "adm_eedi");
732 nvram_set("gpio6", "adm_rc");
733 break;
734 case HW_BCM4702:
735 nvram_unset("gpio2");
736 nvram_unset("gpio3");
737 nvram_unset("gpio4");
738 nvram_unset("gpio5");
739 nvram_unset("gpio6");
740 break;
741 case HW_BCM5352E:
742 nvram_set("opo", "0x0008");
743 nvram_set("ag0", "0x02");
744 // drop
745 default:
746 nvram_set("gpio2", "ses_led");
747 nvram_set("gpio3", "ses_led2");
748 nvram_set("gpio4", "ses_button");
749 features = SUP_SES | SUP_WHAM_LED;
750 break;
752 break;
753 case MODEL_WTR54GS:
754 mfr = "Linksys";
755 name = "WTR54GS";
756 if (!nvram_match("t_fix1", (char *)name)) {
757 nvram_set("lan_ifnames", "vlan0 eth1");
758 nvram_set("gpio2", "ses_button");
759 nvram_set("reset_gpio", "7");
761 nvram_set("pa0itssit", "62");
762 nvram_set("pa0b0", "0x1542");
763 nvram_set("pa0b1", "0xfacb");
764 nvram_set("pa0b2", "0xfec7");
765 //nvram_set("pa0maxpwr", "0x4c");
766 features = SUP_SES;
767 break;
768 case MODEL_WRTSL54GS:
769 mfr = "Linksys";
770 name = "WRTSL54GS";
771 features = SUP_SES | SUP_WHAM_LED;
772 break;
773 case MODEL_WHRG54S:
774 mfr = "Buffalo";
775 name = "WHR-G54S";
776 features = SUP_SES | SUP_AOSS_LED | SUP_BRAU;
777 break;
778 case MODEL_WHRHPG54:
779 case MODEL_WZRRSG54HP:
780 case MODEL_WZRHPG54:
781 mfr = "Buffalo";
782 features = SUP_SES | SUP_AOSS_LED | SUP_HPAMP;
783 switch (model) {
784 case MODEL_WZRRSG54HP:
785 name = "WZR-RS-G54HP";
786 break;
787 case MODEL_WZRHPG54:
788 name = "WZR-HP-G54";
789 break;
790 default:
791 name = "WHR-HP-G54";
792 features = SUP_SES | SUP_AOSS_LED | SUP_BRAU | SUP_HPAMP;
793 break;
796 bf = strtoul(nvram_safe_get("boardflags"), NULL, 0);
797 switch (bf) {
798 case 0x0758:
799 case 0x1758:
800 case 0x2758:
801 case 0x3758:
802 if (nvram_match("wlx_hpamp", "")) {
803 if (nvram_get_int("wl_txpwr") > 10) nvram_set("wl_txpwr", "10");
804 nvram_set("wlx_hpamp", "1");
805 nvram_set("wlx_hperx", "0");
808 n = bf;
809 if (nvram_match("wlx_hpamp", "0")) {
810 n &= ~0x2000UL;
812 else {
813 n |= 0x2000UL;
815 if (nvram_match("wlx_hperx", "0")) {
816 n |= 0x1000UL;
818 else {
819 n &= ~0x1000UL;
821 if (bf != n) {
822 sprintf(s, "0x%lX", n);
823 nvram_set("boardflags", s);
825 break;
826 default:
827 syslog(LOG_WARNING, "Unexpected: boardflag=%lX", bf);
828 break;
830 break;
831 case MODEL_WBRG54:
832 mfr = "Buffalo";
833 name = "WBR-G54";
834 break;
835 case MODEL_WBR2G54:
836 mfr = "Buffalo";
837 name = "WBR2-G54";
838 features = SUP_SES | SUP_AOSS_LED;
839 break;
840 case MODEL_WHR2A54G54:
841 mfr = "Buffalo";
842 name = "WHR2-A54G54";
843 features = SUP_SES | SUP_AOSS_LED | SUP_BRAU;
844 break;
845 case MODEL_WHR3AG54:
846 mfr = "Buffalo";
847 name = "WHR3-AG54";
848 features = SUP_SES | SUP_AOSS_LED;
849 break;
850 case MODEL_WZRG54:
851 mfr = "Buffalo";
852 name = "WZR-G54";
853 features = SUP_SES | SUP_AOSS_LED;
854 break;
855 case MODEL_WZRRSG54:
856 mfr = "Buffalo";
857 name = "WZR-RS-G54";
858 features = SUP_SES | SUP_AOSS_LED;
859 break;
860 case MODEL_WVRG54NF:
861 mfr = "Buffalo";
862 name = "WVR-G54-NF";
863 features = SUP_SES;
864 break;
865 case MODEL_WZRG108:
866 mfr = "Buffalo";
867 name = "WZR-G108";
868 features = SUP_SES | SUP_AOSS_LED;
869 break;
870 case MODEL_RT390W:
871 mfr = "Fuji";
872 name = "RT390W";
873 break;
874 case MODEL_WR850GV1:
875 mfr = "Motorola";
876 name = "WR850G v1";
877 features = SUP_NONVE;
878 break;
879 case MODEL_WR850GV2:
880 mfr = "Motorola";
881 name = "WR850G v2/v3";
882 features = SUP_NONVE;
883 break;
884 case MODEL_WL500GP:
885 mfr = "Asus";
886 name = "WL-500gP";
887 features = SUP_SES;
888 #ifdef TCONFIG_USB
889 nvram_set("usb_ohci", "-1");
890 #endif
891 if (!nvram_match("t_fix1", (char *)name)) {
892 nvram_set("lan_ifnames", "vlan0 eth1 eth2 eth3"); // set to "vlan0 eth2" by DD-WRT; default: vlan0 eth1
894 break;
895 case MODEL_WL500W:
896 mfr = "Asus";
897 name = "WL-500W";
898 features = SUP_SES | SUP_80211N;
899 #ifdef TCONFIG_USB
900 nvram_set("usb_ohci", "-1");
901 #endif
902 break;
903 case MODEL_WL500GE:
904 mfr = "Asus";
905 name = "WL-550gE";
906 // features = ?
907 #ifdef TCONFIG_USB
908 nvram_set("usb_uhci", "-1");
909 #endif
910 break;
911 case MODEL_WX6615GT:
912 mfr = "SparkLAN";
913 name = "WX-6615GT";
914 // features = ?
915 break;
916 case MODEL_MN700:
917 mfr = "Microsoft";
918 name = "MN-700";
919 break;
920 case MODEL_WR100:
921 mfr = "Viewsonic";
922 name = "WR100";
923 break;
924 case MODEL_WLA2G54L:
925 mfr = "Buffalo";
926 name = "WLA2-G54L";
927 if (!nvram_match("t_fix1", (char *)name)) {
928 nvram_set("lan_ifnames", "vlan0 eth1 eth2");
929 nvram_set("wl_ifname", "eth1");
930 nvram_set("wan_ifname", "none");
932 break;
933 case MODEL_TM2300:
934 mfr = "Dell";
935 name = "TrueMobile 2300";
936 break;
944 #ifndef WL_BSS_INFO_VERSION
945 #error WL_BSS_INFO_VERSION
946 #endif
947 #if WL_BSS_INFO_VERSION >= 108
949 case MODEL_WRH54G:
950 mfr = "Linksys";
951 name = "WRH54G";
953 nvram_set("opo", "12");
954 break;
956 case MODEL_WHRG125:
957 mfr = "Buffalo";
958 name = "WHR-G125";
959 features = SUP_SES | SUP_AOSS_LED | SUP_BRAU;
961 nvram_set("opo", "0x0008");
962 nvram_set("ag0", "0x0C");
963 break;
964 #ifdef CONFIG_BCMWL5
965 case MODEL_RTN10:
966 mfr = "Asus";
967 name = "RT-N10";
968 features = SUP_SES | SUP_80211N;
969 if (!nvram_match("t_fix1", (char *)name)) {
970 nvram_set("lan_ifnames", "vlan0 eth1");
971 nvram_set("wan_ifnameX", "vlan1");
972 nvram_set("wl_ifname", "eth1");
974 break;
975 case MODEL_RTN10U:
976 mfr = "Asus";
977 name = "RT-N10U";
978 features = SUP_SES | SUP_80211N;
979 #ifdef TCONFIG_USB
980 nvram_set("usb_uhci", "-1");
981 #endif
982 if (!nvram_match("t_fix1", (char *)name)) {
983 nvram_set("lan_ifnames", "vlan0 eth1");
984 nvram_set("wan_ifnameX", "vlan1");
985 nvram_set("wl_ifname", "eth1");
987 break;
988 case MODEL_RTN12:
989 mfr = "Asus";
990 name = "RT-N12";
991 features = SUP_SES | SUP_BRAU | SUP_80211N;
992 if (!nvram_match("t_fix1", (char *)name)) {
993 nvram_set("lan_ifnames", "vlan0 eth1");
994 nvram_set("wan_ifnameX", "vlan1");
995 nvram_set("wl_ifname", "eth1");
997 break;
998 case MODEL_RTN12B1:
999 mfr = "Asus";
1000 name = "RT-N12 B1";
1001 features = SUP_80211N;
1002 if (!nvram_match("t_fix1", (char *)name)) {
1003 nvram_set("lan_ifnames", "vlan0 eth1");
1004 nvram_set("wan_ifnameX", "vlan1");
1005 nvram_set("wl_ifname", "eth1");
1007 break;
1008 case MODEL_RTN15U:
1009 mfr = "Asus";
1010 name = "RT-N15U";
1011 features = SUP_SES | SUP_80211N | SUP_1000ET;
1012 #ifdef TCONFIG_USB
1013 nvram_set("usb_uhci", "-1");
1014 #endif
1015 if (!nvram_match("t_fix1", (char *)name)) {
1016 nvram_set("lan_ifnames", "vlan1 eth1");
1017 nvram_set("wan_iface", "vlan2");
1018 nvram_set("wan_ifname", "vlan2");
1019 nvram_set("wan_ifnameX", "vlan2");
1020 nvram_set("wan_ifnames", "vlan2");
1021 nvram_set("wl_ifname", "eth1");
1023 break;
1024 case MODEL_RTN16:
1025 mfr = "Asus";
1026 name = "RT-N16";
1027 features = SUP_SES | SUP_80211N | SUP_1000ET;
1028 #ifdef TCONFIG_USB
1029 nvram_set("usb_uhci", "-1");
1030 #endif
1031 if (!nvram_match("t_fix1", (char *)name)) {
1032 nvram_set("lan_ifnames", "vlan1 eth1");
1033 nvram_set("wan_ifnameX", "vlan2");
1034 nvram_set("wl_ifname", "eth1");
1035 nvram_set("vlan_enable", "1");
1037 break;
1038 case MODEL_RTN53:
1039 mfr = "Asus";
1040 name = "RT-N53";
1041 features = SUP_SES | SUP_80211N;
1042 if (!nvram_match("t_fix1", (char *)name)) {
1043 nvram_set("lan_ifnames", "vlan2 eth1");
1044 nvram_set("wan_ifnameX", "vlan1");
1045 nvram_set("landevs", "vlan2 wl0");
1046 nvram_set("wandevs", "vlan1");
1047 nvram_unset("vlan0ports");
1049 break;
1050 case MODEL_RTN66U:
1051 mfr = "Asus";
1052 name = "RT-N66U";
1053 features = SUP_SES | SUP_80211N | SUP_1000ET;
1054 #ifdef TCONFIG_USB
1055 nvram_set("usb_uhci", "-1");
1056 #if defined(LINUX26) && defined(TCONFIG_USB_EXTRAS)
1057 if (nvram_get_int("usb_mmc") == -1) nvram_set("usb_mmc", "0");
1058 #endif
1059 #endif
1060 if (!nvram_match("t_fix1", (char *)name)) {
1061 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1062 nvram_set("wan_ifnameX", "vlan2");
1063 nvram_set("wl_ifnames", "eth1 eth2");
1064 nvram_set("landevs", "vlan1 wl0 wl1");
1065 nvram_set("wandevs", "vlan2");
1066 #if defined(LINUX26) && defined(TCONFIG_USB)
1067 nvram_set("usb_noled", "1-1.4"); /* SD/MMC Card */
1068 #endif
1070 break;
1071 case MODEL_WNR3500L:
1072 mfr = "Netgear";
1073 name = "WNR3500L/U/v2";
1074 features = SUP_SES | SUP_AOSS_LED | SUP_80211N | SUP_1000ET;
1075 if (!nvram_match("t_fix1", (char *)name)) {
1076 nvram_set("sromrev", "3");
1077 nvram_set("lan_ifnames", "vlan1 eth1");
1078 nvram_set("wan_ifnameX", "vlan2");
1079 nvram_set("wl_ifname", "eth1");
1081 break;
1082 case MODEL_WNR3500LV2:
1083 mfr = "Netgear";
1084 name = "WNR3500L v2";
1085 features = SUP_SES | SUP_AOSS_LED | SUP_80211N | SUP_1000ET;
1086 if (!nvram_match("t_fix1", (char *)name)) {
1087 nvram_set("lan_ifnames", "vlan1 eth1");
1088 nvram_set("wan_ifnameX", "vlan2");
1089 nvram_set("wl_ifname", "eth1");
1091 break;
1092 case MODEL_WNR2000v2:
1093 mfr = "Netgear";
1094 name = "WNR2000 v2";
1095 features = SUP_SES | SUP_AOSS_LED | SUP_80211N;
1096 if (!nvram_match("t_fix1", (char *)name)) {
1097 nvram_set("lan_ifnames", "vlan0 eth1");
1098 nvram_set("wan_ifnameX", "vlan1");
1099 nvram_set("wl_ifname", "eth1");
1101 break;
1102 case MODEL_F7D3301:
1103 case MODEL_F7D3302:
1104 case MODEL_F7D4301:
1105 case MODEL_F7D4302:
1106 case MODEL_F5D8235v3:
1107 mfr = "Belkin";
1108 features = SUP_SES | SUP_80211N;
1109 switch (model) {
1110 case MODEL_F7D3301:
1111 name = "Share Max N300 (F7D3301/F7D7301) v1";
1112 break;
1113 case MODEL_F7D3302:
1114 name = "Share N300 (F7D3302/F7D7302) v1";
1115 break;
1116 case MODEL_F7D4301:
1117 name = "Play Max / N600 HD (F7D4301/F7D8301) v1";
1118 break;
1119 case MODEL_F7D4302:
1120 name = "Play N600 (F7D4302/F7D8302) v1";
1121 break;
1122 case MODEL_F5D8235v3:
1123 name = "N F5D8235-4 v3";
1124 break;
1126 #ifdef TCONFIG_USB
1127 nvram_set("usb_uhci", "-1");
1128 #endif
1129 if (!nvram_match("t_fix1", (char *)name)) {
1130 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1131 nvram_set("wan_ifnameX", "vlan2");
1132 nvram_set("landevs", "vlan1 wl0 wl1");
1133 nvram_set("wandevs", "vlan2");
1135 break;
1136 case MODEL_E900:
1137 case MODEL_E1500:
1138 mfr = "Linksys";
1139 name = nvram_safe_get("boot_hw_model");
1140 ver = nvram_safe_get("boot_hw_ver");
1141 features = SUP_SES | SUP_80211N;
1142 if (!nvram_match("t_fix1", (char *)name)) {
1143 nvram_set("lan_ifnames", "vlan1 eth1");
1144 nvram_set("wan_ifnameX", "vlan2");
1145 nvram_set("wl_ifname", "eth1");
1147 break;
1148 case MODEL_E1550:
1149 mfr = "Linksys";
1150 name = nvram_safe_get("boot_hw_model");
1151 ver = nvram_safe_get("boot_hw_ver");
1152 features = SUP_SES | SUP_80211N;
1153 #ifdef TCONFIG_USB
1154 nvram_set("usb_uhci", "-1");
1155 #endif
1156 if (!nvram_match("t_fix1", (char *)name)) {
1157 nvram_set("lan_ifnames", "vlan1 eth1");
1158 nvram_set("wan_ifnameX", "vlan2");
1159 nvram_set("wl_ifname", "eth1");
1161 break;
1162 case MODEL_E2500:
1163 mfr = "Linksys";
1164 name = nvram_safe_get("boot_hw_model");
1165 ver = nvram_safe_get("boot_hw_ver");
1166 features = SUP_SES | SUP_80211N;
1167 if (!nvram_match("t_fix1", (char *)name)) {
1168 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1169 nvram_set("wan_ifnameX", "vlan2");
1170 nvram_set("wl_ifname", "eth1");
1172 break;
1173 case MODEL_E3200:
1174 mfr = "Linksys";
1175 name = nvram_safe_get("boot_hw_model");
1176 ver = nvram_safe_get("boot_hw_ver");
1177 features = SUP_SES | SUP_80211N | SUP_1000ET;
1178 #ifdef TCONFIG_USB
1179 nvram_set("usb_uhci", "-1");
1180 #endif
1181 if (!nvram_match("t_fix1", (char *)name)) {
1182 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1183 nvram_set("wan_ifnameX", "vlan2");
1184 nvram_set("wl_ifname", "eth1");
1186 break;
1187 case MODEL_E1000v2:
1188 case MODEL_WRT160Nv3:
1189 // same as M10, M20, WRT310Nv2, E1000v1
1190 mfr = "Linksys";
1191 name = nvram_safe_get("boot_hw_model");
1192 ver = nvram_safe_get("boot_hw_ver");
1193 if (nvram_match("boot_hw_model", "E100")){
1194 name = "E1000";
1196 if (nvram_match("boot_hw_model", "M10") || nvram_match("boot_hw_model", "M20")){
1197 mfr = "Cisco";
1199 features = SUP_SES | SUP_80211N | SUP_WHAM_LED;
1200 if (!nvram_match("t_fix1", (char *)name)) {
1201 nvram_set("lan_ifnames", "vlan1 eth1");
1202 nvram_set("wan_ifnameX", "vlan2");
1203 nvram_set("wl_ifname", "eth1");
1205 break;
1206 case MODEL_WRT320N:
1207 mfr = "Linksys";
1208 name = nvram_match("boardrev", "0x1307") ? "E2000" : "WRT320N";
1209 features = SUP_SES | SUP_80211N | SUP_WHAM_LED | SUP_1000ET;
1210 if (!nvram_match("t_fix1", (char *)name)) {
1211 nvram_set("lan_ifnames", "vlan1 eth1");
1212 nvram_set("wan_ifnameX", "vlan2");
1213 nvram_set("wl_ifname", "eth1");
1215 break;
1216 case MODEL_WRT610Nv2:
1217 mfr = "Linksys";
1218 name = nvram_match("boot_hw_model", "E300") ? "E3000" : "WRT610N v2";
1219 features = SUP_SES | SUP_80211N | SUP_WHAM_LED | SUP_1000ET;
1220 #ifdef TCONFIG_USB
1221 nvram_set("usb_uhci", "-1");
1222 #endif
1223 if (!nvram_match("t_fix1", (char *)name)) {
1224 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1225 nvram_set("wan_ifnameX", "vlan2");
1226 nvram_set("wl_ifname", "eth1");
1228 break;
1229 case MODEL_E4200:
1230 mfr = "Linksys";
1231 name = "E4200 v1";
1232 features = SUP_SES | SUP_80211N | SUP_1000ET;
1233 #ifdef TCONFIG_USB
1234 nvram_set("usb_uhci", "-1");
1235 #endif
1236 if (!nvram_match("t_fix1", (char *)name)) {
1237 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1238 nvram_set("wan_ifnameX", "vlan2");
1239 nvram_set("wl_ifname", "eth1");
1241 break;
1242 #endif // CONFIG_BCMWL5
1243 case MODEL_WL500GPv2:
1244 mfr = "Asus";
1245 name = "WL-500gP v2";
1246 features = SUP_SES;
1247 #ifdef TCONFIG_USB
1248 nvram_set("usb_uhci", "-1");
1249 #endif
1250 break;
1251 case MODEL_WL520GU:
1252 mfr = "Asus";
1253 name = "WL-520GU";
1254 features = SUP_SES;
1255 #ifdef TCONFIG_USB
1256 nvram_set("usb_uhci", "-1");
1257 #endif
1258 break;
1259 case MODEL_WL500GD:
1260 mfr = "Asus";
1261 name = "WL-500g Deluxe";
1262 // features = SUP_SES;
1263 #ifdef TCONFIG_USB
1264 nvram_set("usb_ohci", "-1");
1265 #endif
1266 if (!nvram_match("t_fix1", (char *)name)) {
1267 nvram_set("wl_ifname", "eth1");
1268 nvram_set("lan_ifnames", "vlan0 eth1");
1269 nvram_set("wan_ifnameX", "vlan1");
1270 nvram_unset("wl0gpio0");
1272 break;
1273 case MODEL_DIR320:
1274 mfr = "D-Link";
1275 name = "DIR-320";
1276 features = SUP_SES;
1277 if (!nvram_match("t_fix1", (char *)name)) {
1278 nvram_set("wan_ifnameX", "vlan1");
1279 nvram_set("wl_ifname", "eth1");
1281 break;
1282 case MODEL_H618B:
1283 mfr = "ZTE";
1284 name = "ZXV10 H618B";
1285 features = SUP_SES | SUP_AOSS_LED;
1286 break;
1287 case MODEL_WL1600GL:
1288 mfr = "Ovislink";
1289 name = "WL1600GL";
1290 features = SUP_SES;
1291 break;
1292 #endif // WL_BSS_INFO_VERSION >= 108
1293 case MODEL_WZRG300N:
1294 mfr = "Buffalo";
1295 name = "WZR-G300N";
1296 features = SUP_SES | SUP_AOSS_LED | SUP_BRAU | SUP_80211N;
1297 break;
1298 case MODEL_WRT160Nv1:
1299 case MODEL_WRT300N:
1300 mfr = "Linksys";
1301 name = (model == MODEL_WRT300N) ? "WRT300N v1" : "WRT160N v1";
1302 features = SUP_SES | SUP_80211N;
1303 if (!nvram_match("t_fix1", (char *)name)) {
1304 nvram_set("wan_ifnameX", "eth1");
1305 nvram_set("lan_ifnames", "eth0 eth2");
1307 break;
1308 case MODEL_WRT310Nv1:
1309 mfr = "Linksys";
1310 name = "WRT310N v1";
1311 features = SUP_SES | SUP_80211N | SUP_WHAM_LED | SUP_1000ET;
1312 if (!nvram_match("t_fix1", (char *)name)) {
1313 nvram_set("lan_ifnames", "vlan1 eth1");
1314 nvram_set("wan_ifnameX", "vlan2");
1315 nvram_set("wl_ifname", "eth1");
1317 break;
1320 if (name) {
1321 nvram_set("t_fix1", name);
1322 if (strcmp(nvram_safe_get("boot_hw_ver"), "") != 0) {
1323 sprintf(s, "%s %s %s", mfr, name);
1324 // sprintf(s, "%s %s %s", mfr, name, ver);
1325 } else {
1326 sprintf(s, "%s %s", mfr, name);
1328 else {
1329 snprintf(s, sizeof(s), "%s %d/%s/%s/%s/%s", mfr, check_hw_type(),
1330 nvram_safe_get("boardtype"), nvram_safe_get("boardnum"), nvram_safe_get("boardrev"), nvram_safe_get("boardflags"));
1331 s[64] = 0;
1333 nvram_set("t_model_name", s);
1335 nvram_set("pa0maxpwr", "400"); // allow Tx power up tp 400 mW, needed for ND only
1337 sprintf(s, "0x%lX", features);
1338 nvram_set("t_features", s);
1341 note: set wan_ifnameX if wan_ifname needs to be overriden
1344 if (nvram_is_empty("wan_ifnameX")) {
1345 #if 1
1346 nvram_set("wan_ifnameX", ((strtoul(nvram_safe_get("boardflags"), NULL, 0) & BFL_ENETVLAN) ||
1347 (check_hw_type() == HW_BCM4712)) ? "vlan1" : "eth1");
1348 #else
1349 p = nvram_safe_get("wan_ifname");
1350 if ((*p == 0) || (nvram_match("wl_ifname", p))) {
1351 p = ((strtoul(nvram_safe_get("boardflags"), NULL, 0) & BFL_ENETVLAN) ||
1352 (check_hw_type() == HW_BCM4712)) ? "vlan1" : "eth1";
1354 nvram_set("wan_ifnameX", p);
1355 #endif
1358 nvram_set("wl_hwaddr", ""); // zzz- when disabling wireless, we must get null wireless mac ??
1360 //!!TB - do not force country code here to allow nvram override
1361 //nvram_set("wl_country", "JP");
1362 //nvram_set("wl_country_code", "JP");
1363 nvram_set("wan_get_dns", "");
1364 nvram_set("wan_get_domain", "");
1365 nvram_set("ppp_get_ip", "");
1366 nvram_set("action_service", "");
1367 nvram_set("jffs2_format", "0");
1368 nvram_set("rrules_radio", "-1");
1369 nvram_unset("https_crt_gen");
1370 nvram_unset("log_wmclear");
1371 #ifdef TCONFIG_IPV6
1372 nvram_set("ipv6_get_dns", "");
1373 #endif
1374 #ifdef TCONFIG_MEDIA_SERVER
1375 nvram_unset("ms_rescan");
1376 #endif
1377 if (nvram_get_int("http_id_gen") == 1) nvram_unset("http_id");
1379 nvram_unset("sch_rboot_last");
1380 nvram_unset("sch_rcon_last");
1381 nvram_unset("sch_c1_last");
1382 nvram_unset("sch_c2_last");
1383 nvram_unset("sch_c3_last");
1385 nvram_set("brau_state", "");
1386 if ((features & SUP_BRAU) == 0) nvram_set("script_brau", "");
1387 if ((features & SUP_SES) == 0) nvram_set("sesx_script", "");
1389 if ((features & SUP_1000ET) == 0) nvram_set("jumbo_frame_enable", "0");
1391 // compatibility with old versions
1392 if (nvram_match("wl_net_mode", "disabled")) {
1393 nvram_set("wl_radio", "0");
1394 nvram_set("wl_net_mode", "mixed");
1397 return 0;
1400 /* Get the special files from nvram and copy them to disc.
1401 * These were files saved with "nvram setfile2nvram <filename>".
1402 * Better hope that they were saved with full pathname.
1404 static void load_files_from_nvram(void)
1406 char *name, *cp;
1407 int ar_loaded = 0;
1408 char buf[NVRAM_SPACE];
1410 if (nvram_getall(buf, sizeof(buf)) != 0)
1411 return;
1413 for (name = buf; *name; name += strlen(name) + 1) {
1414 if (strncmp(name, "FILE:", 5) == 0) { /* This special name marks a file to get. */
1415 if ((cp = strchr(name, '=')) == NULL)
1416 continue;
1417 *cp = 0;
1418 syslog(LOG_INFO, "Loading file '%s' from nvram", name + 5);
1419 nvram_nvram2file(name, name + 5);
1420 if (memcmp(".autorun", cp - 8, 9) == 0)
1421 ++ar_loaded;
1424 /* Start any autorun files that may have been loaded into one of the standard places. */
1425 if (ar_loaded != 0)
1426 run_nvscript(".autorun", NULL, 3);
1429 #if defined(LINUX26) && defined(TCONFIG_USB)
1430 static inline void tune_min_free_kbytes(void)
1432 struct sysinfo info;
1434 memset(&info, 0, sizeof(struct sysinfo));
1435 sysinfo(&info);
1436 if (info.totalram >= 55 * 1024 * 1024) {
1437 // If we have 64MB+ RAM, tune min_free_kbytes
1438 // to reduce page allocation failure errors.
1439 f_write_string("/proc/sys/vm/min_free_kbytes", "8192", 0, 0);
1442 #endif
1444 static void sysinit(void)
1446 static int noconsole = 0;
1447 static const time_t tm = 0;
1448 int hardware;
1449 int i;
1450 DIR *d;
1451 struct dirent *de;
1452 char s[256];
1453 char t[256];
1454 int model;
1456 mount("proc", "/proc", "proc", 0, NULL);
1457 mount("tmpfs", "/tmp", "tmpfs", 0, NULL);
1459 #ifdef LINUX26
1460 mount("devfs", "/dev", "tmpfs", MS_MGC_VAL | MS_NOATIME, NULL);
1461 mknod("/dev/null", S_IFCHR | 0666, makedev(1, 3));
1462 mknod("/dev/console", S_IFCHR | 0600, makedev(5, 1));
1463 mount("sysfs", "/sys", "sysfs", MS_MGC_VAL, NULL);
1464 mkdir("/dev/shm", 0777);
1465 mkdir("/dev/pts", 0777);
1466 mknod("/dev/pts/ptmx", S_IRWXU|S_IFCHR, makedev(5, 2));
1467 mknod("/dev/pts/0", S_IRWXU|S_IFCHR, makedev(136, 0));
1468 mknod("/dev/pts/1", S_IRWXU|S_IFCHR, makedev(136, 1));
1469 mount("devpts", "/dev/pts", "devpts", MS_MGC_VAL, NULL);
1470 #endif
1472 if (console_init()) noconsole = 1;
1474 stime(&tm);
1476 static const char *mkd[] = {
1477 "/tmp/etc", "/tmp/var", "/tmp/home", "/tmp/mnt",
1478 "/tmp/splashd", //!!Victek
1479 "/tmp/share", "/var/webmon", // !!TB
1480 "/var/log", "/var/run", "/var/tmp", "/var/lib", "/var/lib/misc",
1481 "/var/spool", "/var/spool/cron", "/var/spool/cron/crontabs",
1482 "/tmp/var/wwwext", "/tmp/var/wwwext/cgi-bin", // !!TB - CGI support
1483 NULL
1485 umask(0);
1486 for (i = 0; mkd[i]; ++i) {
1487 mkdir(mkd[i], 0755);
1489 mkdir("/var/lock", 0777);
1490 mkdir("/var/tmp/dhcp", 0777);
1491 mkdir("/home/root", 0700);
1492 chmod("/tmp", 0777);
1493 f_write("/etc/hosts", NULL, 0, 0, 0644); // blank
1494 f_write("/etc/fstab", NULL, 0, 0, 0644); // !!TB - blank
1495 simple_unlock("cron");
1496 simple_unlock("firewall");
1497 simple_unlock("restrictions");
1498 umask(022);
1500 if ((d = opendir("/rom/etc")) != NULL) {
1501 while ((de = readdir(d)) != NULL) {
1502 if (de->d_name[0] == '.') continue;
1503 snprintf(s, sizeof(s), "%s/%s", "/rom/etc", de->d_name);
1504 snprintf(t, sizeof(t), "%s/%s", "/etc", de->d_name);
1505 symlink(s, t);
1507 closedir(d);
1509 symlink("/proc/mounts", "/etc/mtab");
1511 #ifdef TCONFIG_SAMBASRV
1512 if ((d = opendir("/usr/codepages")) != NULL) {
1513 while ((de = readdir(d)) != NULL) {
1514 if (de->d_name[0] == '.') continue;
1515 snprintf(s, sizeof(s), "/usr/codepages/%s", de->d_name);
1516 snprintf(t, sizeof(t), "/usr/share/%s", de->d_name);
1517 symlink(s, t);
1519 closedir(d);
1521 #endif
1523 #ifdef LINUX26
1524 eval("hotplug2", "--coldplug");
1525 start_hotplug2();
1527 static const char *dn[] = {
1528 "null", "zero", "random", "urandom", "full", "ptmx", "nvram",
1529 NULL
1531 for (i = 0; dn[i]; ++i) {
1532 snprintf(s, sizeof(s), "/dev/%s", dn[i]);
1533 chmod(s, 0666);
1535 chmod("/dev/gpio", 0660);
1536 #endif
1538 set_action(ACT_IDLE);
1540 for (i = 0; defenv[i]; ++i) {
1541 putenv(defenv[i]);
1544 if (!noconsole) {
1545 printf("\n\nHit ENTER for console...\n\n");
1546 run_shell(1, 0);
1549 check_bootnv();
1551 #ifdef TCONFIG_IPV6
1552 // disable IPv6 by default on all interfaces
1553 f_write_string("/proc/sys/net/ipv6/conf/default/disable_ipv6", "1", 0, 0);
1554 #endif
1556 for (i = 0; i < sizeof(fatalsigs) / sizeof(fatalsigs[0]); i++) {
1557 signal(fatalsigs[i], handle_fatalsigs);
1559 signal(SIGCHLD, handle_reap);
1561 switch (model = get_model()) {
1562 case MODEL_WR850GV1:
1563 case MODEL_WR850GV2:
1564 // need to cleanup some variables...
1565 if ((nvram_get("t_model") == NULL) && (nvram_get("MyFirmwareVersion") != NULL)) {
1566 nvram_unset("MyFirmwareVersion");
1567 nvram_set("restore_defaults", "1");
1569 break;
1572 #ifdef CONFIG_BCMWL5
1573 // ctf must be loaded prior to any other modules
1574 if (nvram_invmatch("ctf_disable", "1"))
1575 modprobe("ctf");
1576 #endif
1578 #ifdef TCONFIG_EMF
1579 modprobe("emf");
1580 modprobe("igs");
1581 #endif
1583 switch (hardware = check_hw_type()) {
1584 case HW_BCM4785:
1585 modprobe("bcm57xx");
1586 break;
1587 default:
1588 modprobe("et");
1589 break;
1592 modprobe("wl");
1594 config_loopback();
1596 eval("nvram", "defaults", "--initcheck");
1597 init_nvram();
1599 // set the packet size
1600 if (nvram_get_int("jumbo_frame_enable")) {
1601 // only set the size here - 'enable' flag is set by the driver
1602 // eval("et", "robowr", "0x40", "0x01", "0x1F"); // (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4)
1603 eval("et", "robowr", "0x40", "0x05", nvram_safe_get("jumbo_frame_size"));
1606 klogctl(8, NULL, nvram_get_int("console_loglevel"));
1608 #if defined(LINUX26) && defined(TCONFIG_USB)
1609 tune_min_free_kbytes();
1610 #endif
1611 setup_conntrack();
1612 set_host_domain_name();
1614 set_tz();
1616 eval("buttons");
1618 if (!noconsole) xstart("console");
1620 i = nvram_get_int("sesx_led");
1621 led(LED_AMBER, (i & 1) != 0);
1622 led(LED_WHITE, (i & 2) != 0);
1623 led(LED_AOSS, (i & 4) != 0);
1624 led(LED_BRIDGE, (i & 8) != 0);
1625 led(LED_DIAG, 1);
1628 int init_main(int argc, char *argv[])
1630 int state, i;
1631 sigset_t sigset;
1633 // AB - failsafe?
1634 nvram_unset("debug_rc_svc");
1636 sysinit();
1638 sigemptyset(&sigset);
1639 for (i = 0; i < sizeof(initsigs) / sizeof(initsigs[0]); i++) {
1640 sigaddset(&sigset, initsigs[i]);
1642 sigprocmask(SIG_BLOCK, &sigset, NULL);
1644 #if defined(DEBUG_NOISY)
1645 nvram_set("debug_logeval", "1");
1646 nvram_set("debug_cprintf", "1");
1647 nvram_set("debug_cprintf_file", "1");
1648 nvram_set("debug_ddns", "1");
1649 #endif
1651 start_jffs2();
1653 state = SIGUSR2; /* START */
1655 for (;;) {
1656 TRACE_PT("main loop signal/state=%d\n", state);
1658 switch (state) {
1659 case SIGUSR1: /* USER1: service handler */
1660 exec_service();
1661 break;
1663 case SIGHUP: /* RESTART */
1664 case SIGINT: /* STOP */
1665 case SIGQUIT: /* HALT */
1666 case SIGTERM: /* REBOOT */
1667 led(LED_DIAG, 1);
1668 unlink("/var/notice/sysup");
1670 run_nvscript("script_shut", NULL, 10);
1672 stop_services();
1673 stop_wan();
1674 stop_lan();
1675 stop_vlan();
1676 stop_syslog();
1678 if ((state == SIGTERM /* REBOOT */) ||
1679 (state == SIGQUIT /* HALT */)) {
1680 remove_storage_main(1);
1681 stop_usb();
1683 shutdn(state == SIGTERM /* REBOOT */);
1684 exit(0);
1686 if (state == SIGINT /* STOP */) {
1687 break;
1690 // SIGHUP (RESTART) falls through
1692 case SIGUSR2: /* START */
1693 SET_LED(RELEASE_WAN_CONTROL);
1694 start_syslog();
1696 load_files_from_nvram();
1698 int fd = -1;
1699 fd = file_lock("usb"); // hold off automount processing
1700 start_usb();
1702 run_nvscript("script_init", NULL, 2);
1704 file_unlock(fd); // allow to process usb hotplug events
1705 #ifdef TCONFIG_USB
1707 * On RESTART some partitions can stay mounted if they are busy at the moment.
1708 * In that case USB drivers won't unload, and hotplug won't kick off again to
1709 * remount those drives that actually got unmounted. Make sure to remount ALL
1710 * partitions here by simulating hotplug event.
1712 if (state == SIGHUP /* RESTART */)
1713 add_remove_usbhost("-1", 1);
1714 #endif
1716 create_passwd();
1717 start_vlan();
1718 start_lan();
1719 start_arpbind();
1720 start_wan(BOOT);
1721 start_services();
1722 start_wl();
1724 #ifdef CONFIG_BCMWL5
1725 if (wds_enable()) {
1726 /* Restart NAS one more time - for some reason without
1727 * this the new driver doesn't always bring WDS up.
1729 stop_nas();
1730 start_nas();
1732 #else
1733 #ifdef TCONFIG_VLAN
1734 if (wl_security_on()) {
1735 stop_nas();
1736 start_nas();
1738 #endif /* TCONFIG_VLAN */
1739 #endif
1741 syslog(LOG_INFO, "%s: Tomato %s", nvram_safe_get("t_model_name"), tomato_version);
1743 led(LED_DIAG, 0);
1744 notice_set("sysup", "");
1745 break;
1748 chld_reap(0); /* Periodically reap zombies. */
1749 check_services();
1750 sigwait(&sigset, &state);
1753 return 0;
1756 int reboothalt_main(int argc, char *argv[])
1758 int reboot = (strstr(argv[0], "reboot") != NULL);
1759 puts(reboot ? "Rebooting..." : "Shutting down...");
1760 fflush(stdout);
1761 sleep(1);
1762 kill(1, reboot ? SIGTERM : SIGQUIT);
1764 /* In the case we're hung, we'll get stuck and never actually reboot.
1765 * The only way out is to pull power.
1766 * So after 'reset_wait' seconds (default: 20), forcibly crash & restart.
1768 if (fork() == 0) {
1769 int wait = nvram_get_int("reset_wait") ? : 20;
1770 if ((wait < 10) || (wait > 120)) wait = 10;
1772 f_write("/proc/sysrq-trigger", "s", 1, 0 , 0); /* sync disks */
1773 sleep(wait);
1774 puts("Still running... Doing machine reset.");
1775 fflush(stdout);
1776 f_write("/proc/sysrq-trigger", "s", 1, 0 , 0); /* sync disks */
1777 sleep(1);
1778 f_write("/proc/sysrq-trigger", "b", 1, 0 , 0); /* machine reset */
1781 return 0;