3 Copyright 2005, Broadcom Corporation
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.
17 #include <sys/ioctl.h>
18 #include <sys/mount.h>
23 #include <sys/reboot.h>
26 #include <sys/types.h>
32 #define SHELL "/bin/sh"
46 static int fatalsigs
[] = {
57 static int initsigs
[] = {
66 static char *defenv
[] = {
69 "PATH=/usr/bin:/bin:/usr/sbin:/sbin",
75 static int noconsole
= 0;
76 static volatile int state
= INIT
;
77 static volatile int signaled
= -1;
80 /* Set terminal settings to reasonable defaults */
81 static void set_term(int fd
)
87 /* set control chars */
88 tty
.c_cc
[VINTR
] = 3; /* C-c */
89 tty
.c_cc
[VQUIT
] = 28; /* C-\ */
90 tty
.c_cc
[VERASE
] = 127; /* C-? */
91 tty
.c_cc
[VKILL
] = 21; /* C-u */
92 tty
.c_cc
[VEOF
] = 4; /* C-d */
93 tty
.c_cc
[VSTART
] = 17; /* C-q */
94 tty
.c_cc
[VSTOP
] = 19; /* C-s */
95 tty
.c_cc
[VSUSP
] = 26; /* C-z */
97 /* use line dicipline 0 */
100 /* Make it be sane */
101 tty
.c_cflag
&= CBAUD
|CBAUDEX
|CSIZE
|CSTOPB
|PARENB
|PARODD
;
102 tty
.c_cflag
|= CREAD
|HUPCL
|CLOCAL
;
106 tty
.c_iflag
= ICRNL
| IXON
| IXOFF
;
109 tty
.c_oflag
= OPOST
| ONLCR
;
113 ISIG
| ICANON
| ECHO
| ECHOE
| ECHOK
| ECHOCTL
| ECHOKE
| IEXTEN
;
115 tcsetattr(fd
, TCSANOW
, &tty
);
118 static int console_init(void)
123 ioctl(0, TIOCNOTTY
, 0);
130 if ((fd
= open(_PATH_CONSOLE
, O_RDWR
)) < 0) {
131 /* Avoid debug messages is redirected to socket packet if no exist a UART chip, added by honor, 2003-12-04 */
132 open("/dev/null", O_RDONLY
);
133 open("/dev/null", O_WRONLY
);
134 open("/dev/null", O_WRONLY
);
135 perror(_PATH_CONSOLE
);
142 ioctl(0, TIOCSCTTY
, 1);
143 tcsetpgrp(0, getpgrp());
150 * Waits for a file descriptor to change status or unblocked signal
151 * @param fd file descriptor
152 * @param timeout seconds to wait before timing out or 0 for no timeout
153 * @return 1 if descriptor changed status or 0 if timed out or -1 on error
155 static int waitfor(int fd
, int timeout
)
158 struct timeval tv
= { timeout
, 0 };
162 return select(fd
+ 1, &rfds
, NULL
, NULL
, (timeout
> 0) ? &tv
: NULL
);
165 static pid_t
run_shell(int timeout
, int nowait
)
170 /* Wait for user input */
171 if (waitfor(STDIN_FILENO
, timeout
) <= 0) return 0;
173 switch (pid
= fork()) {
178 /* Reset signal handlers set for parent process */
179 for (sig
= 0; sig
< (_NSIG
-1); sig
++)
180 signal(sig
, SIG_DFL
);
184 printf("\n\nTomato %s\n\n", tomato_version
);
186 /* Now run it. The new program will take over this PID,
187 * so nothing further in init.c should be run. */
188 execve(SHELL
, (char *[]) { SHELL
, NULL
}, defenv
);
190 /* We're still here? Some error happened. */
198 waitpid(pid
, NULL
, 0);
204 static void shutdn(int rb
)
210 _dprintf("shutdn rb=%d\n", rb
);
213 for (i
= 0; i
< sizeof(fatalsigs
) / sizeof(fatalsigs
[0]); i
++)
214 sigaddset(&ss
, fatalsigs
[i
]);
215 for (i
= 0; i
< sizeof(initsigs
) / sizeof(initsigs
[0]); i
++)
216 sigaddset(&ss
, initsigs
[i
]);
217 sigaddset(&ss
, SIGCHLD
);
218 sigprocmask(SIG_BLOCK
, &ss
, NULL
);
220 for (i
= 30; i
> 0; --i
) {
221 if (((act
= check_action()) == ACT_IDLE
) || (act
== ACT_REBOOT
)) break;
222 cprintf("Busy with %d. Waiting before shutdown... %d\n", act
, i
);
225 set_action(ACT_REBOOT
);
237 umount("/jffs"); // may hang if not
243 for (i
= 4; i
> 0; --i
) {
254 reboot(rb
? RB_AUTOBOOT
: RB_HALT_SYSTEM
);
261 static void handle_fatalsigs(int sig
)
263 _dprintf("fatal sig=%d\n", sig
);
267 void handle_reap(int sig
)
269 while (waitpid(-1, NULL
, WNOHANG
) > 0) {
274 static void handle_initsigs(int sig
)
276 // TRACE_PT("sig=%d state=%d, signaled=%d\n", sig, state, signaled);
300 static int check_nv(const char *name
, const char *value
)
303 if (!nvram_match("manual_boot_nv", "1")) {
304 if (((p
= nvram_get(name
)) == NULL
) || (strcmp(p
, value
) != 0)) {
305 // cprintf("Error: Critical variable %s is invalid. Resetting.\n", name);
306 nvram_set(name
, value
);
313 static void check_bootnv(void)
324 dirty
|= check_nv("boardflags", "0x00000710"); // needed to enable USB
325 dirty
|= check_nv("vlan1ports", "4 3 2 1 8*");
326 dirty
|= check_nv("vlan2ports", "0 8");
329 dirty
|= check_nv("vlan1ports", "4 5");
332 dirty
|= check_nv("vlan0ports", "3 2 1 0 5*");
333 dirty
|= check_nv("vlan1ports", "4 5");
336 dirty
|= check_nv("vlan2hwname", "et0");
337 dirty
|= check_nv("vlan1ports", "4 3 2 1 8*");
338 dirty
|= check_nv("vlan2ports", "0 8");
342 if (strncmp(nvram_safe_get("pmon_ver"), "CFE", 3) != 0) return;
344 hardware
= check_hw_type();
345 if (!nvram_get("boardtype") ||
346 !nvram_get("boardnum") ||
347 !nvram_get("boardflags") ||
348 !nvram_get("clkfreq") ||
349 !nvram_get("os_flash_addr") ||
350 !nvram_get("dl_ram_addr") ||
351 !nvram_get("os_ram_addr") ||
352 !nvram_get("scratch") ||
353 !nvram_get("et0macaddr") ||
354 ((hardware
!= HW_BCM4704_BCM5325F
) && (!nvram_get("vlan0ports") || !nvram_get("vlan0hwname")))) {
355 cprintf("Unable to find critical settings, erasing NVRAM\n");
362 /* Lower the DDR ram drive strength , the value will be stable for all boards
363 Latency 3 is more stable for all ddr 20050420 by honor */
364 dirty
|= check_nv("sdram_init", "0x010b");
365 dirty
|= check_nv("sdram_config", "0x0062");
366 if (!nvram_match("debug_clkfix", "0")) {
367 dirty
|= check_nv("clkfreq", "216");
370 nvram_set("sdram_ncdl", "0x0");
372 dirty
|= check_nv("pa0itssit", "62");
373 dirty
|= check_nv("pa0b0", "0x15eb");
374 dirty
|= check_nv("pa0b1", "0xfa82");
375 dirty
|= check_nv("pa0b2", "0xfe66");
376 //dirty |= check_nv("pa0maxpwr", "0x4e");
378 case HW_BCM5352E
: // G v4, GS v3, v4
379 dirty
|= check_nv("sdram_init", "0x010b");
380 dirty
|= check_nv("sdram_config", "0x0062");
382 nvram_set("sdram_ncdl", "0x0");
384 dirty
|= check_nv("pa0itssit", "62");
385 dirty
|= check_nv("pa0b0", "0x168b");
386 dirty
|= check_nv("pa0b1", "0xfabf");
387 dirty
|= check_nv("pa0b2", "0xfeaf");
388 //dirty |= check_nv("pa0maxpwr", "0x4e");
389 dirty
|= check_nv("vlan0ports", "3 2 1 0 5*");
392 dirty
|= check_nv("pa0itssit", "62");
393 dirty
|= check_nv("pa0b0", "0x1326");
394 dirty
|= check_nv("pa0b1", "0xFB51");
395 dirty
|= check_nv("pa0b2", "0xFE87");
396 //dirty |= check_nv("pa0maxpwr", "0x4e");
398 case HW_BCM4704_BCM5325F
:
402 dirty
|= check_nv("pa0itssit", "62");
403 dirty
|= check_nv("pa0b0", "0x170c");
404 dirty
|= check_nv("pa0b1", "0xfa24");
405 dirty
|= check_nv("pa0b2", "0xfe70");
406 //dirty |= check_nv("pa0maxpwr", "0x48");
415 REBOOT
: // do a simple reboot
422 static int init_nvram(void)
424 unsigned long features
;
433 sprintf(s
, "%d", model
);
434 nvram_set("t_model", s
);
442 name
= "WRT54G/GS/GL";
443 switch (check_hw_type()) {
445 nvram_set("gpio2", "adm_eecs");
446 nvram_set("gpio3", "adm_eesk");
447 nvram_unset("gpio4");
448 nvram_set("gpio5", "adm_eedi");
449 nvram_set("gpio6", "adm_rc");
452 nvram_unset("gpio2");
453 nvram_unset("gpio3");
454 nvram_unset("gpio4");
455 nvram_unset("gpio5");
456 nvram_unset("gpio6");
459 nvram_set("opo", "0x0008");
460 nvram_set("ag0", "0x02");
463 nvram_set("gpio2", "ses_led");
464 nvram_set("gpio3", "ses_led2");
465 nvram_set("gpio4", "ses_button");
466 features
= SUP_SES
| SUP_WHAM_LED
;
473 if (!nvram_match("t_fix1", (char *)name
)) {
474 nvram_set ("vlan0hwname", "et0");
475 nvram_set ("vlan1hwname", "et0");
476 nvram_set("vlan0ports", "0 5*");
477 nvram_set("vlan1ports", "1 5");
478 nvram_set("vlan_enable", "1");
479 nvram_set("lan_ifnames", "vlan0 eth1");
480 nvram_set("gpio2", "ses_button");
481 nvram_set("reset_gpio", "7");
484 nvram_set("pa0itssit", "62");
485 nvram_set("pa0b0", "0x1542");
486 nvram_set("pa0b1", "0xfacb");
487 nvram_set("pa0b2", "0xfec7");
488 //nvram_set("pa0maxpwr", "0x4c");
491 case MODEL_WRTSL54GS
:
494 features
= SUP_SES
| SUP_WHAM_LED
;
499 features
= SUP_SES
| SUP_AOSS_LED
| SUP_BRAU
;
502 case MODEL_WZRRSG54HP
:
505 features
= SUP_SES
| SUP_AOSS_LED
| SUP_HPAMP
;
507 case MODEL_WZRRSG54HP
:
508 name
= "WZR-RS-G54HP";
515 features
= SUP_SES
| SUP_AOSS_LED
| SUP_BRAU
| SUP_HPAMP
;
519 bf
= strtoul(nvram_safe_get("boardflags"), NULL
, 0);
525 if (nvram_match("wlx_hpamp", "")) {
526 if (nvram_get_int("wl_txpwr") > 10) nvram_set("wl_txpwr", "10");
527 nvram_set("wlx_hpamp", "1");
528 nvram_set("wlx_hperx", "0");
532 if (nvram_match("wlx_hpamp", "0")) {
538 if (nvram_match("wlx_hperx", "0")) {
545 sprintf(s
, "0x%lX", n
);
546 nvram_set("boardflags", s
);
550 syslog(LOG_WARNING
, "Unexpected: boardflag=%lX", bf
);
557 nvram_set("wl0gpio0", "130");
562 features
= SUP_SES
| SUP_AOSS_LED
;
564 case MODEL_WHR2A54G54
:
566 name
= "WHR2-A54G54";
567 features
= SUP_SES
| SUP_AOSS_LED
| SUP_BRAU
;
572 features
= SUP_SES
| SUP_AOSS_LED
;
577 features
= SUP_SES
| SUP_AOSS_LED
;
582 features
= SUP_SES
| SUP_AOSS_LED
;
592 features
= SUP_SES
| SUP_AOSS_LED
;
601 features
= SUP_NONVE
;
605 name
= "WR850G v2/v3";
606 features
= SUP_NONVE
;
612 if (!nvram_match("t_fix1", (char *)name
)) {
613 nvram_set("t_fix1", name
);
614 nvram_set("sdram_init", "0x0009"); // 32MB; defaults: 0x000b, 0x0009
615 nvram_set("vlan1ports", "0 5"); // default: 0 5u
616 nvram_set("lan_ifnames", "vlan0 eth1 eth2 eth3"); // set to "vlan0 eth2" by DD-WRT; default: vlan0 eth1
617 // !!TB - WLAN LED fix
618 nvram_set("wl0gpio0", "136");
624 features
= SUP_SES
| SUP_80211N
;
625 /* fix WL500W mac adresses for WAN port */
626 if (nvram_match("et1macaddr", "00:90:4c:a1:00:2d"))
627 nvram_set("et1macaddr", nvram_get("et0macaddr"));
629 if (!nvram_get("wl0gpio0") || nvram_match("wl0gpio0", "2"))
630 nvram_set("wl0gpio0", "0x88");
636 if (!nvram_match("t_fix1", (char *)name
)) {
637 nvram_set("t_fix1", name
);
638 nvram_set("vlan1ports", "0 5"); // default: 0 5u
657 if (!nvram_match("t_fix1", (char *)name
)) {
658 nvram_set("t_fix1", name
);
659 nvram_set("lan_ifnames", "vlan0 eth1 eth2");
660 nvram_set("wl_ifname", "eth1");
661 nvram_set("wan_ifname", "none");
666 name
= "TrueMobile 2300";
675 #ifndef WL_BSS_INFO_VERSION
676 #error WL_BSS_INFO_VERSION
678 #if WL_BSS_INFO_VERSION >= 108
684 nvram_set("opo", "12");
690 features
= SUP_SES
| SUP_AOSS_LED
| SUP_BRAU
;
692 nvram_set("opo", "0x0008");
693 nvram_set("ag0", "0x0C");
698 features
= SUP_SES
| SUP_80211N
;
699 if (!nvram_match("t_fix1", (char *)name
)) {
700 nvram_set("lan_ifnames", "vlan0 eth1");
701 nvram_set("wan_ifnameX", "vlan1");
702 nvram_set("wl_ifname", "eth1");
703 nvram_set("t_fix1", name
);
709 features
= SUP_SES
| SUP_BRAU
| SUP_80211N
;
710 if (!nvram_match("t_fix1", (char *)name
)) {
711 nvram_set("lan_ifnames", "vlan0 eth1");
712 nvram_set("wan_ifnameX", "vlan1");
713 nvram_set("wl_ifname", "eth1");
714 nvram_set("t_fix1", name
);
720 features
= SUP_SES
| SUP_80211N
| SUP_1000ET
;
721 if (!nvram_match("t_fix1", (char *)name
)) {
722 nvram_set("lan_ifnames", "vlan1 eth1");
723 nvram_set("wan_ifnameX", "vlan2");
724 nvram_set("wl_ifname", "eth1");
725 nvram_set("vlan_enable", "1");
726 nvram_set("t_fix1", name
);
732 features
= SUP_SES
| SUP_80211N
| SUP_1000ET
;
733 if (!nvram_match("t_fix1", (char *)name
)) {
734 nvram_set("sromrev", "3");
735 nvram_set("lan_ifnames", "vlan1 eth1");
736 nvram_set("wan_ifnameX", "vlan2");
737 nvram_set("wl_ifname", "eth1");
738 nvram_set("t_fix1", name
);
741 case MODEL_WL500GPv2
:
743 name
= "WL-500gP v2";
745 if (!nvram_match("t_fix1", (char *)name
)) {
746 if (nvram_match("vlan1ports", "4 5u")) {
747 nvram_set("vlan1ports", "4 5");
749 else if (nvram_match("vlan1ports", "0 5u")) { // 520GU?
750 nvram_set("vlan1ports", "0 5");
752 nvram_set("t_fix1", name
);
755 if (nvram_match("wl0gpio1", "0x02"))
756 nvram_set("wl0gpio1", "0x88");
762 if (!nvram_match("t_fix1", (char *)name
)) {
763 nvram_set("t_fix1", name
);
764 nvram_set("vlan1ports", "0 5");
766 nvram_set("wl0gpio0", "0");
767 nvram_set("wl0gpio1", "136");
768 nvram_set("wl0gpio2", "0");
769 nvram_set("wl0gpio3", "0");
776 if (nvram_match("wl0gpio0", "255"))
778 nvram_set("wl0gpio0", "8");
779 nvram_set("wl0gpio1", "0");
780 nvram_set("wl0gpio2", "0");
781 nvram_set("wl0gpio3", "0");
783 if (!nvram_match("t_fix1", (char *)name
)) {
784 nvram_set("t_fix1", name
);
785 nvram_unset( "vlan2ports" );
786 nvram_unset( "vlan2hwname" );
787 nvram_set("vlan1hwname", "et0");
788 nvram_set("vlan1ports", "0 5");
789 nvram_set("wandevs", "vlan1");
790 nvram_set("wan_ifname", "vlan1");
791 nvram_set("wan_ifnames", "vlan1");
792 nvram_set("wan0_ifname", "vlan1");
793 nvram_set("wan0_ifnames", "vlan1");
801 features
= SUP_SES
| SUP_AOSS_LED
| SUP_BRAU
| SUP_80211N
;
806 features
= SUP_SES
| SUP_80211N
;
812 sprintf(s
, "%s %s", mfr
, name
);
815 snprintf(s
, sizeof(s
), "%s %d/%s/%s/%s/%s", mfr
, check_hw_type(),
816 nvram_safe_get("boardtype"), nvram_safe_get("boardnum"), nvram_safe_get("boardrev"), nvram_safe_get("boardflags"));
819 nvram_set("t_model_name", s
);
821 nvram_set("pa0maxpwr", "251"); // allow Tx power up tp 251 mW, needed for ND only
823 sprintf(s
, "0x%lX", features
);
824 nvram_set("t_features", s
);
829 note: set wan_ifnameX if wan_ifname needs to be overriden
832 if (nvram_is_empty("wan_ifnameX")) {
834 nvram_set("wan_ifnameX", ((strtoul(nvram_safe_get("boardflags"), NULL
, 0) & BFL_ENETVLAN
) ||
835 (check_hw_type() == HW_BCM4712
)) ? "vlan1" : "eth1");
837 p
= nvram_safe_get("wan_ifname");
838 if ((*p
== 0) || (nvram_match("wl_ifname", p
))) {
839 p
= ((strtoul(nvram_safe_get("boardflags"), NULL
, 0) & BFL_ENETVLAN
) ||
840 (check_hw_type() == HW_BCM4712
)) ? "vlan1" : "eth1";
842 nvram_set("wan_ifnameX", p
);
847 nvram_set("wl_hwaddr", ""); // when disabling wireless, we must get null wireless mac ??
848 //!!TB - do not force country code here to allow nvram override
849 //nvram_set("wl_country", "JP");
850 //nvram_set("wl_country_code", "JP");
851 nvram_set("wan_get_dns", "");
852 nvram_set("wan_get_domain", "");
853 nvram_set("pppoe_pid0", "");
854 nvram_set("action_service", "");
855 nvram_set("jffs2_format", "0");
856 nvram_set("rrules_radio", "-1");
857 nvram_unset("https_crt_gen");
858 if (nvram_get_int("http_id_gen") == 1) nvram_unset("http_id");
860 nvram_unset("sch_rboot_last");
861 nvram_unset("sch_rcon_last");
862 nvram_unset("sch_c1_last");
863 nvram_unset("sch_c2_last");
864 nvram_unset("sch_c3_last");
866 nvram_set("brau_state", "");
867 if ((features
& SUP_BRAU
) == 0) nvram_set("script_brau", "");
868 if ((features
& SUP_SES
) == 0) nvram_set("sesx_script", "");
870 if ((features
& SUP_1000ET
) == 0) nvram_set("jumbo_frame_enable", "0");
872 if (nvram_match("wl_net_mode", "disabled")) {
873 nvram_set("wl_radio", "0");
874 nvram_set("wl_net_mode", "mixed");
880 /* Get the special files from nvram and copy them to disc.
881 * These were files saved with "nvram setfile2nvram <filename>".
882 * Better hope that they were saved with full pathname.
884 static void load_files_from_nvram(void)
887 char buf
[NVRAM_SPACE
];
889 if (nvram_getall(buf
, sizeof(buf
)) != 0)
892 for (name
= buf
; *name
; name
+= strlen(name
) + 1) {
893 if (strncmp(name
, "FILE:", 5) == 0) { /* This special name marks a file to get. */
894 if ((cp
= strchr(name
, '=')) == NULL
)
897 syslog(LOG_INFO
, "Loading file '%s' from nvram", name
+ 5);
898 nvram_nvram2file(name
, name
+ 5);
903 static void sysinit(void)
905 static const time_t tm
= 0;
914 mount("proc", "/proc", "proc", 0, NULL
);
915 mount("tmpfs", "/tmp", "tmpfs", 0, NULL
);
918 mount("devfs", "/dev", "tmpfs", MS_MGC_VAL
| MS_NOATIME
, NULL
);
919 mknod("/dev/null", S_IFCHR
| 0666, makedev(1, 3));
920 mknod("/dev/console", S_IFCHR
| 0600, makedev(5, 1));
921 mount("sysfs", "/sys", "sysfs", MS_MGC_VAL
, NULL
);
922 mkdir("/dev/shm", 0777);
923 mkdir("/dev/pts", 0777);
924 mount("devpts", "/dev/pts", "devpts", MS_MGC_VAL
, NULL
);
927 if (console_init()) noconsole
= 1;
931 static const char *mkd
[] = {
932 "/tmp/etc", "/tmp/var", "/tmp/home", "/tmp/mnt",
933 "/tmp/share", // !!TB
934 "/var/log", "/var/run", "/var/tmp", "/var/lib", "/var/lib/misc",
935 "/var/spool", "/var/spool/cron", "/var/spool/cron/crontabs",
936 "/tmp/var/wwwext", "/tmp/var/wwwext/cgi-bin", // !!TB - CGI support
940 for (i
= 0; mkd
[i
]; ++i
) {
943 mkdir("/var/lock", 0777);
944 mkdir("/var/tmp/dhcp", 0777);
945 mkdir("/home/root", 0700);
947 f_write("/etc/hosts", NULL
, 0, 0, 0644); // blank
948 f_write("/etc/fstab", NULL
, 0, 0, 0644); // !!TB - blank
949 simple_unlock("cron");
950 simple_unlock("firewall");
951 simple_unlock("restrictions");
954 if ((d
= opendir("/rom/etc")) != NULL
) {
955 while ((de
= readdir(d
)) != NULL
) {
956 if (de
->d_name
[0] == '.') continue;
957 snprintf(s
, sizeof(s
), "%s/%s", "/rom/etc", de
->d_name
);
958 snprintf(t
, sizeof(t
), "%s/%s", "/etc", de
->d_name
);
963 symlink("/proc/mounts", "/etc/mtab");
965 #ifdef TCONFIG_SAMBASRV
966 if ((d
= opendir("/usr/codepages")) != NULL
) {
967 while ((de
= readdir(d
)) != NULL
) {
968 if (de
->d_name
[0] == '.') continue;
969 snprintf(s
, sizeof(s
), "/usr/codepages/%s", de
->d_name
);
970 snprintf(t
, sizeof(t
), "/usr/share/%s", de
->d_name
);
978 eval("hotplug2", "--coldplug");
982 set_action(ACT_IDLE
);
984 for (i
= 0; defenv
[i
]; ++i
) {
989 printf("\n\nHit ENTER for console...\n\n");
995 for (i
= 0; i
< sizeof(fatalsigs
) / sizeof(fatalsigs
[0]); i
++) {
996 signal(fatalsigs
[i
], handle_fatalsigs
);
998 for (i
= 0; i
< sizeof(initsigs
) / sizeof(initsigs
[0]); i
++) {
999 signal(initsigs
[i
], handle_initsigs
);
1001 signal(SIGCHLD
, handle_reap
);
1003 switch (model
= get_model()) {
1004 case MODEL_WR850GV1
:
1005 case MODEL_WR850GV2
:
1006 // need to cleanup some variables...
1007 if ((nvram_get("t_model") == NULL
) && (nvram_get("MyFirmwareVersion") != NULL
)) {
1008 nvram_unset("MyFirmwareVersion");
1009 nvram_set("restore_defaults", "1");
1014 hardware
= check_hw_type();
1015 #if WL_BSS_INFO_VERSION >= 108
1018 if ((hardware
== HW_BCM4702
) && (model
!= MODEL_WR850GV1
)) {
1027 #ifdef CONFIG_BCMWL5
1032 modprobe("tomato_ct");
1036 system("nvram defaults --initcheck");
1039 // set the packet size
1040 if (nvram_get_int("jumbo_frame_enable")) {
1041 eval("et", "robowr", "0x40", "0x01", "0x1F"); // (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4)
1042 eval("et", "robowr", "0x40", "0x05", nvram_safe_get("jumbo_frame_size"));
1045 klogctl(8, NULL
, nvram_get_int("console_loglevel"));
1048 set_host_domain_name();
1056 i
= nvram_get_int("sesx_led");
1057 led(LED_AMBER
, (i
& 1) != 0);
1058 led(LED_WHITE
, (i
& 2) != 0);
1059 led(LED_AOSS
, (i
& 4) != 0);
1060 led(LED_BRIDGE
, (i
& 8) != 0);
1064 int init_main(int argc
, char *argv
[])
1066 pid_t shell_pid
= 0;
1073 #if defined(DEBUG_NOISY)
1074 nvram_set("debug_logeval", "1");
1075 nvram_set("debug_cprintf", "1");
1076 nvram_set("debug_cprintf_file", "1");
1077 nvram_set("debug_ddns", "1");
1081 // TRACE_PT("main loop state=%d\n", state);
1094 run_nvscript("script_shut", NULL
, 10);
1102 // !!TB - USB Support
1103 remove_storage_main((state
== REBOOT
) || (state
== HALT
));
1106 if ((state
== REBOOT
) || (state
== HALT
)) {
1107 shutdn(state
== REBOOT
);
1110 if (state
== STOP
) {
1115 // RESTART falls through
1118 SET_LED(RELEASE_WAN_CONTROL
);
1121 load_files_from_nvram();
1124 fd
= file_lock("usb"); // hold off automount processing
1127 run_nvscript("script_init", NULL
, 2);
1129 file_unlock(fd
); // allow to process usb hotplug events
1132 * On RESTART some partitions can stay mounted if they are busy at the moment.
1133 * In that case USB drivers won't unload, and hotplug won't kick off again to
1134 * remount those drives that actually got unmounted. Make sure to remount ALL
1135 * partitions here by simulating hotplug event.
1137 if (state
== RESTART
) add_remove_usbhost("-1", 1);
1146 #ifdef CONFIG_BCMWL5
1147 if (nvram_match("wds_enable", "1")) {
1148 /* Restart NAS one more time - for some reason without
1149 * this the new driver doesn't always bring WDS up.
1156 syslog(LOG_INFO
, "Tomato %s", tomato_version
);
1157 syslog(LOG_INFO
, "%s", nvram_safe_get("t_model_name"));
1160 notice_set("sysup", "");
1167 while (signaled
== -1) {
1169 if ((!noconsole
) && ((!shell_pid
) || (kill(shell_pid
, 0) != 0))) {
1170 shell_pid
= run_shell(0, 1);
1183 int reboothalt_main(int argc
, char *argv
[])
1185 int reboot
= (strstr(argv
[0], "reboot") != NULL
);
1186 puts(reboot
? "Rebooting..." : "Shutting down...");
1189 kill(1, reboot
? SIGTERM
: SIGQUIT
);