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>
28 #include <sys/sysinfo.h>
33 #define SHELL "/bin/sh"
35 static int fatalsigs
[] = {
46 static int initsigs
[] = {
56 static char *defenv
[] = {
59 "PATH=/usr/bin:/bin:/usr/sbin:/sbin",
65 /* Set terminal settings to reasonable defaults */
66 static void set_term(int fd
)
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 */
86 tty
.c_cflag
&= CBAUD
|CBAUDEX
|CSIZE
|CSTOPB
|PARENB
|PARODD
;
87 tty
.c_cflag
|= CREAD
|HUPCL
|CLOCAL
;
91 tty
.c_iflag
= ICRNL
| IXON
| IXOFF
;
94 tty
.c_oflag
= OPOST
| ONLCR
;
98 ISIG
| ICANON
| ECHO
| ECHOE
| ECHOK
| ECHOCTL
| ECHOKE
| IEXTEN
;
100 tcsetattr(fd
, TCSANOW
, &tty
);
103 static int console_init(void)
108 ioctl(0, TIOCNOTTY
, 0);
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
);
127 ioctl(0, TIOCSCTTY
, 1);
128 tcsetpgrp(0, getpgrp());
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
)
143 struct timeval tv
= { timeout
, 0 };
147 return select(fd
+ 1, &rfds
, NULL
, NULL
, (timeout
> 0) ? &tv
: NULL
);
150 static pid_t
run_shell(int timeout
, int nowait
)
155 /* Wait for user input */
156 if (waitfor(STDIN_FILENO
, timeout
) <= 0) return 0;
158 switch (pid
= fork()) {
163 /* Reset signal handlers set for parent process */
164 for (sig
= 0; sig
< (_NSIG
-1); sig
++)
165 signal(sig
, SIG_DFL
);
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. */
183 waitpid(pid
, NULL
, 0);
189 int console_main(int argc
, char *argv
[])
191 for (;;) run_shell(0, 0);
196 static void shutdn(int rb
)
202 _dprintf("shutdn rb=%d\n", rb
);
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
);
216 set_action(ACT_REBOOT
);
218 // Disconnect pppd - need this for PPTP/L2TP to finish gracefully
232 umount("/jffs"); // may hang if not
238 for (i
= 4; i
> 0; --i
) {
249 reboot(rb
? RB_AUTOBOOT
: RB_HALT_SYSTEM
);
256 static void handle_fatalsigs(int sig
)
258 _dprintf("fatal sig=%d\n", sig
);
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
270 static void handle_reap(int sig
)
276 static int check_nv(const char *name
, const char *value
)
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
);
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)
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
);
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
);
312 static int find_dir320_mac_addr(void)
316 int i
, part
, size
, found
= 0;
318 if (!mtd_getinfo("board_data", &part
, &size
))
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);
331 nvram_set("et0macaddr", s
);
334 else if (!memcmp(buffer
+ i
, "wanmac=", 7)) {
335 memcpy(s
, buffer
+ i
+ 7, 17);
337 nvram_set("il0macaddr", s
);
340 nvram_set("et0macaddr", s
);
351 strcpy(s
, nvram_safe_get("wl0_hwaddr"));
353 nvram_set("et0macaddr", s
);
358 static int init_vlan_ports(void)
361 int model
= get_model();
365 switch (check_hw_type()) {
366 case HW_BCM5352E
: // G v4, GS v3, v4
367 dirty
|= check_nv("vlan0ports", "3 2 1 0 5*");
372 dirty
|= check_nv("vlan0ports", "0 5*");
373 dirty
|= check_nv("vlan1ports", "1 5");
374 dirty
|= check_nv("vlan_enable", "1");
378 case MODEL_WL500GPv2
:
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");
387 dirty
|= check_nv("vlan0ports", "1 2 3 4 5*");
388 dirty
|= check_nv("vlan1ports", "0 5");
392 dirty
|= (nvram_get("vlan2ports") != NULL
);
393 nvram_unset("vlan2ports");
394 dirty
|= check_nv("vlan1ports", "0 5");
396 case MODEL_WRT310Nv1
:
397 dirty
|= check_nv("vlan1ports", "1 2 3 4 8*");
398 dirty
|= check_nv("vlan2ports", "0 8");
401 dirty
|= check_nv("vlan0ports", "0 1 2 3 5*");
402 dirty
|= check_nv("vlan1ports", "4 5");
407 case MODEL_WNR3500LV2
:
410 dirty
|= check_nv("vlan1ports", "4 3 2 1 8*");
411 dirty
|= check_nv("vlan2ports", "0 8");
414 dirty
|= check_nv("vlan1ports", "1 2 3 4 8*");
415 dirty
|= check_nv("vlan2ports", "0 8");
418 dirty
|= check_nv("vlan2ports", "0 1 2 3 5*");
419 dirty
|= check_nv("vlan1ports", "4 5");
422 dirty
|= check_nv("vlan1ports", "4 5");
423 dirty
|= check_nv("vlan2ports", "3 2 1 0 5*");
425 case MODEL_WNR2000v2
:
426 dirty
|= check_nv("vlan1ports", "4 3 2 1 5*");
427 dirty
|= check_nv("vlan2ports", "0 5");
431 case MODEL_RG200E_CA
:
432 dirty
|= check_nv("vlan1ports", "1 2 3 4 5*");
433 dirty
|= check_nv("vlan2ports", "0 5");
436 dirty
|= check_nv("vlan1ports", "4 5");
440 dirty
|= check_nv("vlan0ports", "1 2 3 4 5*");
441 dirty
|= check_nv("vlan1ports", "0 5");
446 dirty
|= check_nv("vlan0ports", "3 2 1 0 5*");
447 dirty
|= check_nv("vlan1ports", "4 5");
449 case MODEL_WRT610Nv2
:
450 case MODEL_F5D8235v3
:
451 dirty
|= check_nv("vlan1ports", "1 2 3 4 8*");
452 dirty
|= check_nv("vlan2ports", "0 8");
456 dirty
|= check_nv("vlan1ports", "3 2 1 0 8*");
457 dirty
|= check_nv("vlan2ports", "4 8");
466 dirty
|= check_nv("vlan1ports", "0 1 2 3 5*");
467 dirty
|= check_nv("vlan2ports", "4 5");
471 dirty
|= check_nv("vlan1ports", "1 2 3 4 5*");
472 dirty
|= check_nv("vlan2ports", "0 5");
477 dirty
|= check_nv("vlan1ports", "0 1 2 3 8*");
478 dirty
|= check_nv("vlan2ports", "4 8");
480 case MODEL_WRT160Nv3
:
481 if (nvram_match("vlan1ports", "1 2 3 4 5*")) {
482 // fix lan port numbering on CSE41, CSE51
483 dirty
|= check_nv("vlan1ports", "4 3 2 1 5*");
485 else if (nvram_match("vlan1ports", "1 2 3 4 8*")) {
487 dirty
|= check_nv("vlan1ports", "4 3 2 1 8*");
496 static void check_bootnv(void)
504 dirty
= check_nv("wl0_leddc", "0x640000") | check_nv("wl1_leddc", "0x640000");
508 dirty
|= check_nv("vlan0hwname", "et0");
509 dirty
|= check_nv("vlan1hwname", "et0");
512 dirty
|= check_nv("wl0gpio0", "130");
516 // need to cleanup some variables...
517 if ((nvram_get("t_model") == NULL
) && (nvram_get("MyFirmwareVersion") != NULL
)) {
518 nvram_unset("MyFirmwareVersion");
519 nvram_set("restore_defaults", "1");
523 dirty
|= check_nv("wl0gpio1", "0x02");
526 /* fix WL500W mac adresses for WAN port */
527 if (invalid_mac(nvram_get("et1macaddr"))) {
528 strcpy(mac
, nvram_safe_get("et0macaddr"));
530 dirty
|= check_nv("et1macaddr", mac
);
532 dirty
|= check_nv("wl0gpio0", "0x88");
535 dirty
|= check_nv("sdram_init", "0x0009"); // 32MB; defaults: 0x000b, 0x0009
536 dirty
|= check_nv("wl0gpio0", "136");
538 case MODEL_WL500GPv2
:
540 dirty
|= check_nv("wl0gpio1", "136");
543 dirty
|= check_nv("vlan0hwname", "et0");
544 dirty
|= check_nv("vlan1hwname", "et0");
545 dirty
|= check_nv("boardflags", "0x00000100"); // set BFL_ENETVLAN
546 nvram_unset("wl0gpio0");
549 if (strlen(nvram_safe_get("et0macaddr")) == 12 ||
550 strlen(nvram_safe_get("il0macaddr")) == 12) {
551 dirty
|= find_dir320_mac_addr();
553 if (nvram_get("vlan2hwname") != NULL
) {
554 nvram_unset("vlan2hwname");
557 dirty
|= check_nv("wandevs", "vlan1");
558 dirty
|= check_nv("vlan1hwname", "et0");
559 dirty
|= check_nv("wl0gpio0", "8");
560 dirty
|= check_nv("wl0gpio1", "0");
561 dirty
|= check_nv("wl0gpio2", "0");
562 dirty
|= check_nv("wl0gpio3", "0");
564 if (invalid_mac(nvram_get("et0macaddr"))) {
565 dirty
|= find_sercom_mac_addr();
568 case MODEL_WRT160Nv1
:
569 case MODEL_WRT310Nv1
:
571 dirty
|= check_nv("wl0gpio0", "8");
575 dirty
|= check_nv("boardflags", "0x00000710"); // needed to enable USB
576 dirty
|= check_nv("vlan2hwname", "et0");
577 dirty
|= check_nv("ledbh0", "7");
579 case MODEL_WNR3500LV2
:
580 dirty
|= check_nv("vlan2hwname", "et0");
582 case MODEL_WNR2000v2
:
583 dirty
|= check_nv("ledbh5", "8");
586 dirty
|= check_nv("reset_gpio", "5");
587 dirty
|= check_nv("ledbh0", "136");
588 dirty
|= check_nv("ledbh1", "11");
589 /* fall through, same as RT-N16 */
591 dirty
|= check_nv("vlan2hwname", "et0");
594 case MODEL_RG200E_CA
:
596 dirty
|= check_nv("vlan1hwname", "et0");
597 dirty
|= check_nv("vlan2hwname", "et0");
598 dirty
|= check_nv("reset_gpio", "30");
600 case MODEL_WRT610Nv2
:
601 dirty
|= check_nv("vlan2hwname", "et0");
602 dirty
|= check_nv("pci/1/1/ledbh2", "8");
603 dirty
|= check_nv("sb/1/ledbh1", "8");
604 if (invalid_mac(nvram_get("pci/1/1/macaddr"))) {
605 strcpy(mac
, nvram_safe_get("et0macaddr"));
607 dirty
|= check_nv("pci/1/1/macaddr", mac
);
614 case MODEL_F5D8235v3
:
615 if (nvram_match("sb/1/macaddr", nvram_safe_get("et0macaddr"))) {
616 strcpy(mac
, nvram_safe_get("et0macaddr"));
618 dirty
|= check_nv("sb/1/macaddr", mac
);
620 dirty
|= check_nv("pci/1/1/macaddr", mac
);
623 dirty
|= check_nv("vlan2hwname", "et0");
624 if (strncasecmp(nvram_safe_get("pci/1/1/macaddr"), "00:90:4c", 8) == 0 ||
625 strncasecmp(nvram_safe_get("sb/1/macaddr"), "00:90:4c", 8) == 0) {
626 strcpy(mac
, nvram_safe_get("et0macaddr"));
628 dirty
|= check_nv("sb/1/macaddr", mac
);
630 dirty
|= check_nv("pci/1/1/macaddr", mac
);
639 case MODEL_WRT160Nv3
:
642 dirty
|= check_nv("vlan2hwname", "et0");
647 if (strncmp(nvram_safe_get("pmon_ver"), "CFE", 3) != 0) return;
649 hardware
= check_hw_type();
650 if (!nvram_get("boardtype") ||
651 !nvram_get("boardnum") ||
652 !nvram_get("boardflags") ||
653 !nvram_get("clkfreq") ||
654 !nvram_get("os_flash_addr") ||
655 !nvram_get("dl_ram_addr") ||
656 !nvram_get("os_ram_addr") ||
657 !nvram_get("scratch") ||
658 !nvram_get("et0macaddr") ||
659 ((hardware
!= HW_BCM4704_BCM5325F
) && (!nvram_get("vlan0ports") || !nvram_get("vlan0hwname")))) {
660 _dprintf("Unable to find critical settings, erasing NVRAM\n");
665 dirty
|= check_nv("aa0", "3");
666 dirty
|= check_nv("wl0gpio0", "136");
667 dirty
|= check_nv("wl0gpio2", "0");
668 dirty
|= check_nv("wl0gpio3", "0");
669 dirty
|= check_nv("cctl", "0");
670 dirty
|= check_nv("ccode", "0");
674 /* Lower the DDR ram drive strength , the value will be stable for all boards
675 Latency 3 is more stable for all ddr 20050420 by honor */
676 dirty
|= check_nv("sdram_init", "0x010b");
677 dirty
|= check_nv("sdram_config", "0x0062");
678 if (!nvram_match("debug_clkfix", "0")) {
679 dirty
|= check_nv("clkfreq", "216");
682 nvram_set("sdram_ncdl", "0x0");
684 dirty
|= check_nv("pa0itssit", "62");
685 dirty
|= check_nv("pa0b0", "0x15eb");
686 dirty
|= check_nv("pa0b1", "0xfa82");
687 dirty
|= check_nv("pa0b2", "0xfe66");
688 //dirty |= check_nv("pa0maxpwr", "0x4e");
690 case HW_BCM5352E
: // G v4, GS v3, v4
691 dirty
|= check_nv("sdram_init", "0x010b");
692 dirty
|= check_nv("sdram_config", "0x0062");
694 nvram_set("sdram_ncdl", "0x0");
696 dirty
|= check_nv("pa0itssit", "62");
697 dirty
|= check_nv("pa0b0", "0x168b");
698 dirty
|= check_nv("pa0b1", "0xfabf");
699 dirty
|= check_nv("pa0b2", "0xfeaf");
700 //dirty |= check_nv("pa0maxpwr", "0x4e");
703 dirty
|= check_nv("pa0itssit", "62");
704 dirty
|= check_nv("pa0b0", "0x1326");
705 dirty
|= check_nv("pa0b1", "0xFB51");
706 dirty
|= check_nv("pa0b2", "0xFE87");
707 //dirty |= check_nv("pa0maxpwr", "0x4e");
709 case HW_BCM4704_BCM5325F
:
713 dirty
|= check_nv("pa0itssit", "62");
714 dirty
|= check_nv("pa0b0", "0x170c");
715 dirty
|= check_nv("pa0b1", "0xfa24");
716 dirty
|= check_nv("pa0b2", "0xfe70");
717 //dirty |= check_nv("pa0maxpwr", "0x48");
724 dirty
|= init_vlan_ports();
728 REBOOT
: // do a simple reboot
735 static int init_nvram(void)
737 unsigned long features
;
747 sprintf(s
, "%d", model
);
748 nvram_set("t_model", s
);
757 name
= "WRT54G/GS/GL";
758 switch (check_hw_type()) {
760 nvram_set("gpio2", "adm_eecs");
761 nvram_set("gpio3", "adm_eesk");
762 nvram_unset("gpio4");
763 nvram_set("gpio5", "adm_eedi");
764 nvram_set("gpio6", "adm_rc");
767 nvram_unset("gpio2");
768 nvram_unset("gpio3");
769 nvram_unset("gpio4");
770 nvram_unset("gpio5");
771 nvram_unset("gpio6");
774 nvram_set("opo", "0x0008");
775 nvram_set("ag0", "0x02");
778 nvram_set("gpio2", "ses_led");
779 nvram_set("gpio3", "ses_led2");
780 nvram_set("gpio4", "ses_button");
781 features
= SUP_SES
| SUP_WHAM_LED
;
788 if (!nvram_match("t_fix1", (char *)name
)) {
789 nvram_set("lan_ifnames", "vlan0 eth1");
790 nvram_set("gpio2", "ses_button");
791 nvram_set("reset_gpio", "7");
793 nvram_set("pa0itssit", "62");
794 nvram_set("pa0b0", "0x1542");
795 nvram_set("pa0b1", "0xfacb");
796 nvram_set("pa0b2", "0xfec7");
797 //nvram_set("pa0maxpwr", "0x4c");
800 case MODEL_WRTSL54GS
:
803 features
= SUP_SES
| SUP_WHAM_LED
;
808 features
= SUP_SES
| SUP_AOSS_LED
| SUP_BRAU
;
811 case MODEL_WZRRSG54HP
:
814 features
= SUP_SES
| SUP_AOSS_LED
| SUP_HPAMP
;
816 case MODEL_WZRRSG54HP
:
817 name
= "WZR-RS-G54HP";
824 features
= SUP_SES
| SUP_AOSS_LED
| SUP_BRAU
| SUP_HPAMP
;
828 bf
= strtoul(nvram_safe_get("boardflags"), NULL
, 0);
834 if (nvram_match("wlx_hpamp", "")) {
835 if (nvram_get_int("wl_txpwr") > 10) nvram_set("wl_txpwr", "10");
836 nvram_set("wlx_hpamp", "1");
837 nvram_set("wlx_hperx", "0");
841 if (nvram_match("wlx_hpamp", "0")) {
847 if (nvram_match("wlx_hperx", "0")) {
854 sprintf(s
, "0x%lX", n
);
855 nvram_set("boardflags", s
);
859 syslog(LOG_WARNING
, "Unexpected: boardflag=%lX", bf
);
870 features
= SUP_SES
| SUP_AOSS_LED
;
872 case MODEL_WHR2A54G54
:
874 name
= "WHR2-A54G54";
875 features
= SUP_SES
| SUP_AOSS_LED
| SUP_BRAU
;
880 features
= SUP_SES
| SUP_AOSS_LED
;
885 features
= SUP_SES
| SUP_AOSS_LED
;
890 features
= SUP_SES
| SUP_AOSS_LED
;
900 features
= SUP_SES
| SUP_AOSS_LED
;
909 features
= SUP_NONVE
;
913 name
= "WR850G v2/v3";
914 features
= SUP_NONVE
;
921 nvram_set("usb_ohci", "-1");
923 if (!nvram_match("t_fix1", (char *)name
)) {
924 nvram_set("lan_ifnames", "vlan0 eth1 eth2 eth3"); // set to "vlan0 eth2" by DD-WRT; default: vlan0 eth1
930 features
= SUP_SES
| SUP_80211N
;
932 nvram_set("usb_ohci", "-1");
940 nvram_set("usb_uhci", "-1");
959 if (!nvram_match("t_fix1", (char *)name
)) {
960 nvram_set("lan_ifnames", "vlan0 eth1 eth2");
961 nvram_set("wl_ifname", "eth1");
962 nvram_set("wan_ifname", "none");
967 name
= "TrueMobile 2300";
976 #ifndef WL_BSS_INFO_VERSION
977 #error WL_BSS_INFO_VERSION
979 #if WL_BSS_INFO_VERSION >= 108
985 nvram_set("opo", "12");
991 features
= SUP_SES
| SUP_AOSS_LED
| SUP_BRAU
;
993 nvram_set("opo", "0x0008");
994 nvram_set("ag0", "0x0C");
1000 features
= SUP_SES
| SUP_80211N
;
1001 if (!nvram_match("t_fix1", (char *)name
)) {
1002 #ifdef TCONFIG_USBAP
1003 nvram_set("wl1_hwaddr", nvram_safe_get("0:macaddr"));
1004 nvram_set("ehciirqt", "3");
1005 nvram_set("qtdc_pid", "48407");
1006 nvram_set("qtdc_vid", "2652");
1007 nvram_set("qtdc0_ep", "4");
1008 nvram_set("qtdc0_sz", "0");
1009 nvram_set("qtdc1_ep", "18");
1010 nvram_set("qtdc1_sz", "10");
1011 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1012 nvram_set("landevs", "vlan1 wl0 wl1");
1013 nvram_set("wl0_ifname", "wl0");
1014 nvram_set("wl1_ifname", "wl1");
1016 nvram_set("lan_ifnames", "vlan1 eth1");
1017 nvram_set("landevs", "vlan1 wl0");
1019 nvram_set("wl_ifname", "eth1");
1020 nvram_set("wan_ifnameX", "vlan2");
1021 nvram_set("wandevs", "vlan2");
1024 case MODEL_DIR620C1
:
1026 name
= "Dir-620 C1";
1027 features
= SUP_SES
| SUP_80211N
;
1028 if (!nvram_match("t_fix1", (char *)name
)) {
1029 #ifdef TCONFIG_USBAP
1030 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1031 nvram_set("landevs", "vlan1 wl0 wl1");
1032 nvram_set("wl0_ifname", "eth1");
1033 nvram_set("wl1_ifname", "eth2");
1035 nvram_set("lan_ifnames", "vlan1 eth1");
1036 nvram_set("landevs", "vlan1 wl0");
1038 nvram_set("wan_ifnameX", "vlan2");
1039 nvram_set("wl_ifname", "eth1");
1046 features
= SUP_SES
| SUP_80211N
;
1048 nvram_set("usb_uhci", "-1");
1050 if (!nvram_match("t_fix1", (char *)name
)) {
1051 nvram_set("lan_ifnames", "vlan0 eth1");
1052 nvram_set("wan_ifnameX", "vlan1");
1053 nvram_set("wl_ifname", "eth1");
1059 features
= SUP_SES
| SUP_80211N
;
1061 nvram_set("usb_uhci", "-1");
1063 if (!nvram_match("t_fix1", (char *)name
)) {
1064 nvram_set("lan_ifnames", "vlan1 eth1");
1065 nvram_set("wan_ifname", "vlan2");
1066 nvram_set("wan_ifnames", "vlan2");
1067 nvram_set("wan_ifnameX", "vlan2");
1068 nvram_set("wl_ifname", "eth1");
1071 case MODEL_RG200E_CA
:
1074 features
= SUP_SES
| SUP_80211N
;
1076 nvram_set("usb_uhci", "-1");
1078 if (!nvram_match("t_fix1", (char *)name
)) {
1079 nvram_set("lan_ifnames", "vlan1 eth1");
1080 nvram_set("wan_ifname", "vlan2");
1081 nvram_set("wan_ifnames", "vlan2");
1082 nvram_set("wan_ifnameX", "vlan2");
1083 nvram_set("wl_ifname", "eth1");
1089 features
= SUP_SES
| SUP_80211N
;
1091 nvram_set("usb_uhci", "-1");
1093 if (!nvram_match("t_fix1", (char *)name
)) {
1094 nvram_set("lan_ifnames", "vlan1 eth1");
1095 nvram_set("wan_ifname", "vlan2");
1096 nvram_set("wan_ifnames", "vlan2");
1097 nvram_set("wan_ifnameX", "vlan2");
1098 nvram_set("wl_ifname", "eth1");
1104 name
= nvram_match("boardrev", "0x1153") ? "RT-N10P" : "RT-N10";
1105 features
= SUP_SES
| SUP_80211N
;
1106 if (!nvram_match("t_fix1", (char *)name
)) {
1107 nvram_set("lan_ifnames", "vlan0 eth1");
1108 nvram_set("wan_ifnameX", "vlan1");
1109 nvram_set("wl_ifname", "eth1");
1115 features
= SUP_SES
| SUP_80211N
;
1117 nvram_set("usb_uhci", "-1");
1119 if (!nvram_match("t_fix1", (char *)name
)) {
1120 nvram_set("lan_ifnames", "vlan0 eth1");
1121 nvram_set("wan_ifnameX", "vlan1");
1122 nvram_set("wl_ifname", "eth1");
1128 features
= SUP_SES
| SUP_BRAU
| SUP_80211N
;
1129 if (!nvram_match("t_fix1", (char *)name
)) {
1130 nvram_set("lan_ifnames", "vlan0 eth1");
1131 nvram_set("wan_ifnameX", "vlan1");
1132 nvram_set("wl_ifname", "eth1");
1138 features
= SUP_80211N
;
1139 if (!nvram_match("t_fix1", (char *)name
)) {
1140 nvram_set("lan_ifnames", "vlan0 eth1");
1141 nvram_set("wan_ifnameX", "vlan1");
1142 nvram_set("wl_ifname", "eth1");
1148 features
= SUP_SES
| SUP_80211N
| SUP_1000ET
;
1150 nvram_set("usb_uhci", "-1");
1152 if (!nvram_match("t_fix1", (char *)name
)) {
1153 nvram_set("lan_ifnames", "vlan1 eth1");
1154 nvram_set("wan_iface", "vlan2");
1155 nvram_set("wan_ifname", "vlan2");
1156 nvram_set("wan_ifnameX", "vlan2");
1157 nvram_set("wan_ifnames", "vlan2");
1158 nvram_set("wl_ifname", "eth1");
1164 features
= SUP_SES
| SUP_80211N
| SUP_1000ET
;
1166 nvram_set("usb_uhci", "-1");
1168 if (!nvram_match("t_fix1", (char *)name
)) {
1169 nvram_set("lan_ifnames", "vlan1 eth1");
1170 nvram_set("wan_ifnameX", "vlan2");
1171 nvram_set("wl_ifname", "eth1");
1172 nvram_set("vlan_enable", "1");
1178 name
= nvram_match("boardrev", "0x1446") ? "RT-N53 A1" : "RT-N53";
1179 features
= SUP_SES
| SUP_80211N
;
1180 #if defined(LINUX26) && defined(TCONFIG_USBAP)
1181 if (nvram_get_int("usb_storage") == 1) nvram_set("usb_storage", "-1");
1183 if (!nvram_match("t_fix1", (char *)name
)) {
1184 #ifdef TCONFIG_USBAP
1185 nvram_set("wl1_hwaddr", nvram_safe_get("0:macaddr"));
1186 nvram_set("ehciirqt", "3");
1187 nvram_set("qtdc_pid", "48407");
1188 nvram_set("qtdc_vid", "2652");
1189 nvram_set("qtdc0_ep", "4");
1190 nvram_set("qtdc0_sz", "0");
1191 nvram_set("qtdc1_ep", "18");
1192 nvram_set("qtdc1_sz", "10");
1193 nvram_set("lan_ifnames", "vlan2 eth1 eth2");
1194 nvram_set("landevs", "vlan2 wl0 wl1");
1195 nvram_set("wl1_ifname", "eth2");
1197 nvram_set("lan_ifnames", "vlan2 eth1");
1198 nvram_set("landevs", "vlan2 wl0");
1200 nvram_set("lan_ifname", "br0");
1201 nvram_set("wl_ifname", "eth1");
1202 nvram_set("wl0_ifname", "eth1");
1203 nvram_set("wan_ifnameX", "vlan1");
1204 nvram_set("wandevs", "vlan1");
1205 nvram_unset("vlan0ports");
1210 #ifdef TCONFIG_AC66U
1212 features
= SUP_SES
| SUP_80211N
| SUP_1000ET
| SUP_80211AC
;
1215 features
= SUP_SES
| SUP_80211N
| SUP_1000ET
;
1216 #if defined(LINUX26) && defined(TCONFIG_MICROSD)
1217 if (nvram_get_int("usb_mmc") == -1) nvram_set("usb_mmc", "1");
1222 nvram_set("usb_uhci", "-1");
1224 if (!nvram_match("t_fix1", (char *)name
)) {
1225 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1226 nvram_set("wan_ifnameX", "vlan2");
1227 nvram_set("wl_ifnames", "eth1 eth2");
1228 #ifdef TCONFIG_AC66U
1229 nvram_set("wl_ifname", "eth1");
1230 nvram_set("wl0_ifname", "eth1");
1231 nvram_set("wl1_ifname", "eth2");
1233 nvram_set("landevs", "vlan1 wl0 wl1");
1234 nvram_set("wandevs", "vlan2");
1235 #ifndef TCONFIG_AC66U
1236 #if defined(LINUX26) && defined(TCONFIG_USB)
1237 nvram_set("usb_noled", "1-1.4"); /* SD/MMC Card */
1240 nvram_set("wl1_bw_cap","7");
1241 nvram_set("wl1_chanspec","36/80");
1242 nvram_set("wl0_bw_cap","3");
1243 nvram_set("wl0_chanspec","1l");
1244 nvram_set("blink_5g_interface","eth2");
1247 strcpy(s
, nvram_safe_get("et0macaddr"));
1249 nvram_set("wl0_hwaddr", s
);
1251 nvram_set("wl1_hwaddr", s
);
1253 // bcm4360ac_defaults
1254 nvram_set("pci/2/1/aa2g", "0");
1255 nvram_set("pci/2/1/aa5g", "7");
1256 nvram_set("pci/2/1/aga0", "71");
1257 nvram_set("pci/2/1/aga1", "71");
1258 nvram_set("pci/2/1/aga2", "71");
1259 nvram_set("pci/2/1/agbg0", "133");
1260 nvram_set("pci/2/1/agbg1", "133");
1261 nvram_set("pci/2/1/agbg2", "133");
1262 nvram_set("pci/2/1/antswitch", "0");
1263 nvram_set("pci/2/1/cckbw202gpo", "0");
1264 nvram_set("pci/2/1/cckbw20ul2gpo", "0");
1265 nvram_set("pci/2/1/dot11agofdmhrbw202gpo", "0");
1266 nvram_set("pci/2/1/femctrl", "3");
1267 nvram_set("pci/2/1/papdcap2g", "0");
1268 nvram_set("pci/2/1/tworangetssi2g", "0");
1269 nvram_set("pci/2/1/pdgain2g", "4");
1270 nvram_set("pci/2/1/epagain2g", "0");
1271 nvram_set("pci/2/1/tssiposslope2g", "1");
1272 nvram_set("pci/2/1/gainctrlsph", "0");
1273 nvram_set("pci/2/1/papdcap5g", "0");
1274 nvram_set("pci/2/1/tworangetssi5g", "0");
1275 nvram_set("pci/2/1/pdgain5g", "4");
1276 nvram_set("pci/2/1/epagain5g", "0");
1277 nvram_set("pci/2/1/tssiposslope5g", "1");
1278 nvram_set("pci/2/1/maxp2ga0", "76");
1279 nvram_set("pci/2/1/maxp2ga1", "76");
1280 nvram_set("pci/2/1/maxp2ga2", "76");
1281 nvram_set("pci/2/1/mcsbw202gpo", "0");
1282 nvram_set("pci/2/1/mcsbw402gpo", "0");
1283 nvram_set("pci/2/1/measpower", "0x7f");
1284 nvram_set("pci/2/1/measpower1", "0x7f");
1285 nvram_set("pci/2/1/measpower2", "0x7f");
1286 nvram_set("pci/2/1/noiselvl2ga0", "31");
1287 nvram_set("pci/2/1/noiselvl2ga1", "31");
1288 nvram_set("pci/2/1/noiselvl2ga2", "31");
1289 nvram_set("pci/2/1/noiselvl5gha0", "31");
1290 nvram_set("pci/2/1/noiselvl5gha1", "31");
1291 nvram_set("pci/2/1/noiselvl5gha2", "31");
1292 nvram_set("pci/2/1/noiselvl5gla0", "31");
1293 nvram_set("pci/2/1/noiselvl5gla1", "31");
1294 nvram_set("pci/2/1/noiselvl5gla2", "31");
1295 nvram_set("pci/2/1/noiselvl5gma0", "31");
1296 nvram_set("pci/2/1/noiselvl5gma1", "31");
1297 nvram_set("pci/2/1/noiselvl5gma2", "31");
1298 nvram_set("pci/2/1/noiselvl5gua0", "31");
1299 nvram_set("pci/2/1/noiselvl5gua1", "31");
1300 nvram_set("pci/2/1/noiselvl5gua2", "31");
1301 nvram_set("pci/2/1/ofdmlrbw202gpo", "0");
1302 nvram_set("pci/2/1/pa2ga0", "0xfe72,0x14c0,0xfac7");
1303 nvram_set("pci/2/1/pa2ga1", "0xfe80,0x1472,0xfabc");
1304 nvram_set("pci/2/1/pa2ga2", "0xfe82,0x14bf,0xfad9");
1305 nvram_set("pci/2/1/pcieingress_war", "15");
1306 nvram_set("pci/2/1/phycal_tempdelta", "255");
1307 nvram_set("pci/2/1/rawtempsense", "0x1ff");
1308 nvram_set("pci/2/1/rxchain", "7");
1309 nvram_set("pci/2/1/rxgainerr2g", "0xffff");
1310 nvram_set("pci/2/1/rxgainerr5g", "0xffff,0xffff,0xffff,0xffff");
1311 nvram_set("pci/2/1/rxgains2gelnagaina0", "0");
1312 nvram_set("pci/2/1/rxgains2gelnagaina1", "0");
1313 nvram_set("pci/2/1/rxgains2gelnagaina2", "0");
1314 nvram_set("pci/2/1/rxgains2gtrelnabypa0", "0");
1315 nvram_set("pci/2/1/rxgains2gtrelnabypa1", "0");
1316 nvram_set("pci/2/1/rxgains2gtrelnabypa2", "0");
1317 nvram_set("pci/2/1/rxgains2gtrisoa0", "0");
1318 nvram_set("pci/2/1/rxgains2gtrisoa1", "0");
1319 nvram_set("pci/2/1/rxgains2gtrisoa2", "0");
1320 nvram_set("pci/2/1/sar2g", "18");
1321 nvram_set("pci/2/1/sar5g", "15");
1322 nvram_set("pci/2/1/sromrev", "11");
1323 nvram_set("pci/2/1/subband5gver", "0x4");
1324 nvram_set("pci/2/1/tempcorrx", "0x3f");
1325 nvram_set("pci/2/1/tempoffset", "255");
1326 nvram_set("pci/2/1/temps_hysteresis", "15");
1327 nvram_set("pci/2/1/temps_period", "15");
1328 nvram_set("pci/2/1/tempsense_option", "0x3");
1329 nvram_set("pci/2/1/tempsense_slope", "0xff");
1330 nvram_set("pci/2/1/tempthresh", "255");
1331 nvram_set("pci/2/1/txchain", "7");
1332 nvram_set("pci/2/1/ledbh0", "2");
1333 nvram_set("pci/2/1/ledbh1", "5");
1334 nvram_set("pci/2/1/ledbh2", "4");
1335 nvram_set("pci/2/1/ledbh3", "11");
1336 nvram_set("pci/2/1/ledbh10", "7");
1338 //force EU country for eth2
1339 nvram_set("pci/2/1/ccode", "EU");
1340 #endif // TCONFIG_AC66U
1343 #ifdef CONFIG_BCMWL6
1347 features
= SUP_SES
| SUP_80211N
| SUP_1000ET
| SUP_80211AC
;
1349 nvram_set("usb_uhci", "-1");
1351 if (!nvram_match("t_fix1", (char *)name
)) {
1352 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1353 nvram_set("wan_ifnameX", "vlan2");
1354 nvram_set("wl_ifnames", "eth1 eth2");
1355 nvram_set("wl_ifname", "eth1");
1356 nvram_set("wl0_ifname", "eth2");
1357 nvram_set("wl1_ifname", "eth1");
1358 nvram_set("wl0_bw_cap","7");
1359 nvram_set("wl0_chanspec","36/80");
1360 nvram_set("wl1_bw_cap","3");
1361 nvram_set("wl1_chanspec","1l");
1362 nvram_set("blink_5g_interface","eth1");
1363 //nvram_set("landevs", "vlan1 wl0 wl1");
1364 //nvram_set("wandevs", "vlan2");
1367 strcpy(s
, nvram_safe_get("et0macaddr"));
1368 nvram_set("wl0_hwaddr", nvram_safe_get("0:macaddr"));
1369 nvram_set("wl1_hwaddr", nvram_safe_get("1:macaddr"));
1372 #endif // CONFIG_BCMWL6
1373 case MODEL_WNR3500L
:
1375 name
= "WNR3500L/U/v2";
1376 features
= SUP_SES
| SUP_AOSS_LED
| SUP_80211N
| SUP_1000ET
;
1377 if (!nvram_match("t_fix1", (char *)name
)) {
1378 nvram_set("sromrev", "3");
1379 nvram_set("lan_ifnames", "vlan1 eth1");
1380 nvram_set("wan_ifnameX", "vlan2");
1381 nvram_set("wl_ifname", "eth1");
1384 case MODEL_WNR3500LV2
:
1386 name
= "WNR3500L v2";
1387 features
= SUP_SES
| SUP_AOSS_LED
| SUP_80211N
| SUP_1000ET
;
1388 if (!nvram_match("t_fix1", (char *)name
)) {
1389 nvram_set("lan_ifnames", "vlan1 eth1");
1390 nvram_set("wan_ifnameX", "vlan2");
1391 nvram_set("wl_ifname", "eth1");
1394 case MODEL_WNR2000v2
:
1396 name
= "WNR2000 v2";
1397 features
= SUP_SES
| SUP_AOSS_LED
| SUP_80211N
;
1398 if (!nvram_match("t_fix1", (char *)name
)) {
1399 nvram_set("lan_ifnames", "vlan0 eth1");
1400 nvram_set("wan_ifnameX", "vlan1");
1401 nvram_set("wl_ifname", "eth1");
1408 case MODEL_F5D8235v3
:
1410 features
= SUP_SES
| SUP_80211N
;
1413 name
= "Share Max N300 (F7D3301/F7D7301) v1";
1416 name
= "Share N300 (F7D3302/F7D7302) v1";
1419 name
= "Play Max / N600 HD (F7D4301/F7D8301) v1";
1422 name
= "Play N600 (F7D4302/F7D8302) v1";
1424 case MODEL_F5D8235v3
:
1425 name
= "N F5D8235-4 v3";
1429 nvram_set("usb_uhci", "-1");
1431 if (!nvram_match("t_fix1", (char *)name
)) {
1432 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1433 nvram_set("wan_ifnameX", "vlan2");
1434 nvram_set("landevs", "vlan1 wl0 wl1");
1435 nvram_set("wandevs", "vlan2");
1441 name
= nvram_safe_get("boot_hw_model");
1442 ver
= nvram_safe_get("boot_hw_ver");
1443 features
= SUP_SES
| SUP_80211N
;
1444 if (!nvram_match("t_fix1", (char *)name
)) {
1445 nvram_set("lan_ifnames", "vlan1 eth1");
1446 nvram_set("wan_ifnameX", "vlan2");
1447 nvram_set("wl_ifname", "eth1");
1452 name
= nvram_safe_get("boot_hw_model");
1453 ver
= nvram_safe_get("boot_hw_ver");
1454 features
= SUP_SES
| SUP_80211N
;
1456 nvram_set("usb_uhci", "-1");
1458 if (!nvram_match("t_fix1", (char *)name
)) {
1459 nvram_set("lan_ifnames", "vlan1 eth1");
1460 nvram_set("wan_ifnameX", "vlan2");
1461 nvram_set("wl_ifname", "eth1");
1466 name
= nvram_safe_get("boot_hw_model");
1467 ver
= nvram_safe_get("boot_hw_ver");
1468 features
= SUP_SES
| SUP_80211N
;
1469 #if defined(LINUX26) && defined(TCONFIG_USBAP)
1470 if (nvram_get_int("usb_storage") == 1) nvram_set("usb_storage", "-1");
1472 if (!nvram_match("t_fix1", (char *)name
)) {
1473 #ifdef TCONFIG_USBAP
1474 nvram_set("wl1_hwaddr", nvram_safe_get("0:macaddr"));
1475 nvram_set("ehciirqt", "3");
1476 nvram_set("qtdc_pid", "48407");
1477 nvram_set("qtdc_vid", "2652");
1478 nvram_set("qtdc0_ep", "4");
1479 nvram_set("qtdc0_sz", "0");
1480 nvram_set("qtdc1_ep", "18");
1481 nvram_set("qtdc1_sz", "10");
1482 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1483 nvram_set("landevs", "vlan1 wl0 wl1");
1484 nvram_set("wl0_ifname", "eth1");
1485 nvram_set("wl1_ifname", "eth2");
1487 nvram_set("lan_ifnames", "vlan1 eth1");
1488 nvram_set("landevs", "vlan1 wl0");
1490 nvram_set("wan_ifnameX", "vlan2");
1491 nvram_set("wl_ifname", "eth1");
1497 name
= nvram_safe_get("boot_hw_model");
1498 ver
= nvram_safe_get("boot_hw_ver");
1499 features
= SUP_SES
| SUP_80211N
| SUP_1000ET
;
1501 nvram_set("usb_uhci", "-1");
1503 if (!nvram_match("t_fix1", (char *)name
)) {
1504 #ifdef TCONFIG_USBAP
1505 nvram_set("wl1_hwaddr", nvram_safe_get("usb/0xBD17/macaddr"));
1506 nvram_set("ehciirqt", "3");
1507 nvram_set("qtdc_pid", "48407");
1508 nvram_set("qtdc_vid", "2652");
1509 nvram_set("qtdc0_ep", "4");
1510 nvram_set("qtdc0_sz", "0");
1511 nvram_set("qtdc1_ep", "18");
1512 nvram_set("qtdc1_sz", "10");
1513 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1514 nvram_set("landevs", "vlan1 wl0 wl1");
1515 nvram_set("wl0_ifname", "eth1");
1516 nvram_set("wl1_ifname", "eth2");
1518 nvram_set("lan_ifnames", "vlan1 eth1");
1519 nvram_set("landevs", "vlan1 wl0");
1521 nvram_set("wl_ifname", "eth1");
1522 nvram_set("wan_ifnameX", "vlan2");
1526 case MODEL_WRT160Nv3
:
1527 // same as M10, M20, WRT310Nv2, E1000v1
1529 name
= nvram_safe_get("boot_hw_model");
1530 ver
= nvram_safe_get("boot_hw_ver");
1531 if (nvram_match("boot_hw_model", "E100")){
1534 if (nvram_match("boot_hw_model", "M10") || nvram_match("boot_hw_model", "M20")){
1537 features
= SUP_SES
| SUP_80211N
| SUP_WHAM_LED
;
1538 if (!nvram_match("t_fix1", (char *)name
)) {
1539 nvram_set("lan_ifnames", "vlan1 eth1");
1540 nvram_set("wan_ifnameX", "vlan2");
1541 nvram_set("wl_ifname", "eth1");
1546 name
= nvram_match("boardrev", "0x1307") ? "E2000" : "WRT320N";
1547 features
= SUP_SES
| SUP_80211N
| SUP_WHAM_LED
| SUP_1000ET
;
1548 if (!nvram_match("t_fix1", (char *)name
)) {
1549 nvram_set("lan_ifnames", "vlan1 eth1");
1550 nvram_set("wan_ifnameX", "vlan2");
1551 nvram_set("wl_ifname", "eth1");
1554 case MODEL_WRT610Nv2
:
1556 name
= nvram_match("boot_hw_model", "E300") ? "E3000" : "WRT610N v2";
1557 features
= SUP_SES
| SUP_80211N
| SUP_WHAM_LED
| SUP_1000ET
;
1559 nvram_set("usb_uhci", "-1");
1561 if (!nvram_match("t_fix1", (char *)name
)) {
1562 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1563 nvram_set("wan_ifnameX", "vlan2");
1564 nvram_set("wl_ifname", "eth1");
1570 features
= SUP_SES
| SUP_80211N
| SUP_1000ET
;
1572 nvram_set("usb_uhci", "-1");
1574 if (!nvram_match("t_fix1", (char *)name
)) {
1575 nvram_set("lan_ifnames", "vlan1 eth1 eth2");
1576 nvram_set("wan_ifnameX", "vlan2");
1577 nvram_set("wl_ifname", "eth1");
1580 #endif // CONFIG_BCMWL5
1585 // The 330gE has only one wired port which can act either as WAN or LAN.
1586 // Failsafe mode is to have it start as a LAN port so you can get an IP
1587 // address via DHCP and access the router config page.
1588 if (!nvram_match("t_fix1", (char *)name
)) {
1589 nvram_set("wl_ifname", "eth1");
1590 nvram_set("lan_ifnames", "eth1");
1591 nvram_set("wan_ifnameX", "eth0");
1592 nvram_set("wan_islan", "1");
1593 nvram_set("wan_proto", "disabled");
1596 case MODEL_WL500GPv2
:
1598 name
= "WL-500gP v2";
1601 nvram_set("usb_uhci", "-1");
1609 nvram_set("usb_uhci", "-1");
1614 name
= "WL-500g Deluxe";
1615 // features = SUP_SES;
1617 nvram_set("usb_ohci", "-1");
1619 if (!nvram_match("t_fix1", (char *)name
)) {
1620 nvram_set("wl_ifname", "eth1");
1621 nvram_set("lan_ifnames", "vlan0 eth1");
1622 nvram_set("wan_ifnameX", "vlan1");
1623 nvram_unset("wl0gpio0");
1630 if (!nvram_match("t_fix1", (char *)name
)) {
1631 nvram_set("wan_ifnameX", "vlan1");
1632 nvram_set("wl_ifname", "eth1");
1637 name
= "ZXV10 H618B";
1638 features
= SUP_SES
| SUP_AOSS_LED
;
1640 case MODEL_WL1600GL
:
1645 #endif // WL_BSS_INFO_VERSION >= 108
1646 case MODEL_WZRG300N
:
1649 features
= SUP_SES
| SUP_AOSS_LED
| SUP_BRAU
| SUP_80211N
;
1651 case MODEL_WRT160Nv1
:
1654 name
= (model
== MODEL_WRT300N
) ? "WRT300N v1" : "WRT160N v1";
1655 features
= SUP_SES
| SUP_80211N
;
1656 if (!nvram_match("t_fix1", (char *)name
)) {
1657 nvram_set("wan_ifnameX", "eth1");
1658 nvram_set("lan_ifnames", "eth0 eth2");
1661 case MODEL_WRT310Nv1
:
1663 name
= "WRT310N v1";
1664 features
= SUP_SES
| SUP_80211N
| SUP_WHAM_LED
| SUP_1000ET
;
1665 if (!nvram_match("t_fix1", (char *)name
)) {
1666 nvram_set("lan_ifnames", "vlan1 eth1");
1667 nvram_set("wan_ifnameX", "vlan2");
1668 nvram_set("wl_ifname", "eth1");
1674 nvram_set("t_fix1", name
);
1675 if (ver
&& strcmp(ver
, "")) {
1676 sprintf(s
, "%s %s v%s", mfr
, name
, ver
);
1678 sprintf(s
, "%s %s", mfr
, name
);
1682 snprintf(s
, sizeof(s
), "%s %d/%s/%s/%s/%s", mfr
, check_hw_type(),
1683 nvram_safe_get("boardtype"), nvram_safe_get("boardnum"), nvram_safe_get("boardrev"), nvram_safe_get("boardflags"));
1686 nvram_set("t_model_name", s
);
1688 nvram_set("pa0maxpwr", "400"); // allow Tx power up tp 400 mW, needed for ND only
1690 sprintf(s
, "0x%lX", features
);
1691 nvram_set("t_features", s
);
1694 note: set wan_ifnameX if wan_ifname needs to be overriden
1697 if (nvram_is_empty("wan_ifnameX")) {
1699 nvram_set("wan_ifnameX", ((strtoul(nvram_safe_get("boardflags"), NULL
, 0) & BFL_ENETVLAN
) ||
1700 (check_hw_type() == HW_BCM4712
)) ? "vlan1" : "eth1");
1702 p
= nvram_safe_get("wan_ifname");
1703 if ((*p
== 0) || (nvram_match("wl_ifname", p
))) {
1704 p
= ((strtoul(nvram_safe_get("boardflags"), NULL
, 0) & BFL_ENETVLAN
) ||
1705 (check_hw_type() == HW_BCM4712
)) ? "vlan1" : "eth1";
1707 nvram_set("wan_ifnameX", p
);
1711 //!!TB - do not force country code here to allow nvram override
1712 //nvram_set("wl_country", "JP");
1713 //nvram_set("wl_country_code", "JP");
1714 nvram_set("wan_get_dns", "");
1715 nvram_set("wan_get_domain", "");
1716 nvram_set("ppp_get_ip", "");
1717 nvram_set("action_service", "");
1718 nvram_set("jffs2_format", "0");
1719 nvram_set("rrules_radio", "-1");
1720 nvram_unset("https_crt_gen");
1721 nvram_unset("log_wmclear");
1723 nvram_set("ipv6_get_dns", "");
1725 #ifdef TCONFIG_MEDIA_SERVER
1726 nvram_unset("ms_rescan");
1728 if (nvram_get_int("http_id_gen") == 1) nvram_unset("http_id");
1730 nvram_unset("sch_rboot_last");
1731 nvram_unset("sch_rcon_last");
1732 nvram_unset("sch_c1_last");
1733 nvram_unset("sch_c2_last");
1734 nvram_unset("sch_c3_last");
1736 nvram_set("brau_state", "");
1737 if ((features
& SUP_BRAU
) == 0) nvram_set("script_brau", "");
1738 if ((features
& SUP_SES
) == 0) nvram_set("sesx_script", "");
1740 if ((features
& SUP_1000ET
) == 0) nvram_set("jumbo_frame_enable", "0");
1742 // compatibility with old versions
1743 if (nvram_match("wl_net_mode", "disabled")) {
1744 nvram_set("wl_radio", "0");
1745 nvram_set("wl_net_mode", "mixed");
1751 /* Get the special files from nvram and copy them to disc.
1752 * These were files saved with "nvram setfile2nvram <filename>".
1753 * Better hope that they were saved with full pathname.
1755 static void load_files_from_nvram(void)
1759 char buf
[NVRAM_SPACE
];
1761 if (nvram_getall(buf
, sizeof(buf
)) != 0)
1764 for (name
= buf
; *name
; name
+= strlen(name
) + 1) {
1765 if (strncmp(name
, "FILE:", 5) == 0) { /* This special name marks a file to get. */
1766 if ((cp
= strchr(name
, '=')) == NULL
)
1769 syslog(LOG_INFO
, "Loading file '%s' from nvram", name
+ 5);
1770 nvram_nvram2file(name
, name
+ 5);
1771 if (memcmp(".autorun", cp
- 8, 9) == 0)
1775 /* Start any autorun files that may have been loaded into one of the standard places. */
1777 run_nvscript(".autorun", NULL
, 3);
1780 #if defined(LINUX26) && defined(TCONFIG_USB)
1781 static inline void tune_min_free_kbytes(void)
1783 struct sysinfo info
;
1785 memset(&info
, 0, sizeof(struct sysinfo
));
1787 if (info
.totalram
>= 55 * 1024 * 1024) {
1788 // If we have 64MB+ RAM, tune min_free_kbytes
1789 // to reduce page allocation failure errors.
1790 f_write_string("/proc/sys/vm/min_free_kbytes", "8192", 0, 0);
1795 static void sysinit(void)
1797 static int noconsole
= 0;
1798 static const time_t tm
= 0;
1806 mount("proc", "/proc", "proc", 0, NULL
);
1807 mount("tmpfs", "/tmp", "tmpfs", 0, NULL
);
1810 mount("devfs", "/dev", "tmpfs", MS_MGC_VAL
| MS_NOATIME
, NULL
);
1811 mknod("/dev/null", S_IFCHR
| 0666, makedev(1, 3));
1812 mknod("/dev/console", S_IFCHR
| 0600, makedev(5, 1));
1813 mount("sysfs", "/sys", "sysfs", MS_MGC_VAL
, NULL
);
1814 mkdir("/dev/shm", 0777);
1815 mkdir("/dev/pts", 0777);
1816 mknod("/dev/pts/ptmx", S_IRWXU
|S_IFCHR
, makedev(5, 2));
1817 mknod("/dev/pts/0", S_IRWXU
|S_IFCHR
, makedev(136, 0));
1818 mknod("/dev/pts/1", S_IRWXU
|S_IFCHR
, makedev(136, 1));
1819 mount("devpts", "/dev/pts", "devpts", MS_MGC_VAL
, NULL
);
1822 if (console_init()) noconsole
= 1;
1826 static const char *mkd
[] = {
1827 "/tmp/etc", "/tmp/var", "/tmp/home", "/tmp/mnt",
1828 "/tmp/splashd", //!!Victek
1829 "/tmp/share", "/var/webmon", // !!TB
1830 "/var/log", "/var/run", "/var/tmp", "/var/lib", "/var/lib/misc",
1831 "/var/spool", "/var/spool/cron", "/var/spool/cron/crontabs",
1832 "/tmp/var/wwwext", "/tmp/var/wwwext/cgi-bin", // !!TB - CGI support
1836 for (i
= 0; mkd
[i
]; ++i
) {
1837 mkdir(mkd
[i
], 0755);
1839 mkdir("/var/lock", 0777);
1840 mkdir("/var/tmp/dhcp", 0777);
1841 mkdir("/home/root", 0700);
1842 chmod("/tmp", 0777);
1843 f_write("/etc/hosts", NULL
, 0, 0, 0644); // blank
1844 f_write("/etc/fstab", NULL
, 0, 0, 0644); // !!TB - blank
1845 simple_unlock("cron");
1846 simple_unlock("firewall");
1847 simple_unlock("restrictions");
1850 if ((d
= opendir("/rom/etc")) != NULL
) {
1851 while ((de
= readdir(d
)) != NULL
) {
1852 if (de
->d_name
[0] == '.') continue;
1853 snprintf(s
, sizeof(s
), "%s/%s", "/rom/etc", de
->d_name
);
1854 snprintf(t
, sizeof(t
), "%s/%s", "/etc", de
->d_name
);
1859 symlink("/proc/mounts", "/etc/mtab");
1861 #ifdef TCONFIG_SAMBASRV
1862 if ((d
= opendir("/usr/codepages")) != NULL
) {
1863 while ((de
= readdir(d
)) != NULL
) {
1864 if (de
->d_name
[0] == '.') continue;
1865 snprintf(s
, sizeof(s
), "/usr/codepages/%s", de
->d_name
);
1866 snprintf(t
, sizeof(t
), "/usr/share/%s", de
->d_name
);
1874 eval("hotplug2", "--coldplug");
1877 static const char *dn
[] = {
1878 "null", "zero", "random", "urandom", "full", "ptmx", "nvram",
1881 for (i
= 0; dn
[i
]; ++i
) {
1882 snprintf(s
, sizeof(s
), "/dev/%s", dn
[i
]);
1885 chmod("/dev/gpio", 0660);
1888 set_action(ACT_IDLE
);
1890 for (i
= 0; defenv
[i
]; ++i
) {
1895 printf("\n\nHit ENTER for console...\n\n");
1902 // disable IPv6 by default on all interfaces
1903 f_write_string("/proc/sys/net/ipv6/conf/default/disable_ipv6", "1", 0, 0);
1906 for (i
= 0; i
< sizeof(fatalsigs
) / sizeof(fatalsigs
[0]); i
++) {
1907 signal(fatalsigs
[i
], handle_fatalsigs
);
1909 signal(SIGCHLD
, handle_reap
);
1911 #ifdef CONFIG_BCMWL5
1912 // ctf must be loaded prior to any other modules
1913 if (nvram_invmatch("ctf_disable", "1"))
1922 switch (hardware
= check_hw_type()) {
1924 modprobe("bcm57xx");
1935 eval("nvram", "defaults", "--initcheck");
1938 // set the packet size
1939 if (nvram_get_int("jumbo_frame_enable")) {
1940 // only set the size here - 'enable' flag is set by the driver
1941 // eval("et", "robowr", "0x40", "0x01", "0x1F"); // (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4)
1942 eval("et", "robowr", "0x40", "0x05", nvram_safe_get("jumbo_frame_size"));
1945 klogctl(8, NULL
, nvram_get_int("console_loglevel"));
1947 #if defined(LINUX26) && defined(TCONFIG_USB)
1948 tune_min_free_kbytes();
1951 set_host_domain_name();
1957 #ifdef CONFIG_BCMWL6
1961 if (!noconsole
) xstart("console");
1963 i
= nvram_get_int("sesx_led");
1964 led(LED_AMBER
, (i
& 1) != 0);
1965 led(LED_WHITE
, (i
& 2) != 0);
1966 led(LED_AOSS
, (i
& 4) != 0);
1967 led(LED_BRIDGE
, (i
& 8) != 0);
1971 int init_main(int argc
, char *argv
[])
1977 nvram_unset("debug_rc_svc");
1981 sigemptyset(&sigset
);
1982 for (i
= 0; i
< sizeof(initsigs
) / sizeof(initsigs
[0]); i
++) {
1983 sigaddset(&sigset
, initsigs
[i
]);
1985 sigprocmask(SIG_BLOCK
, &sigset
, NULL
);
1987 #if defined(DEBUG_NOISY)
1988 nvram_set("debug_logeval", "1");
1989 nvram_set("debug_cprintf", "1");
1990 nvram_set("debug_cprintf_file", "1");
1991 nvram_set("debug_ddns", "1");
1996 state
= SIGUSR2
; /* START */
1999 TRACE_PT("main loop signal/state=%d\n", state
);
2002 case SIGUSR1
: /* USER1: service handler */
2006 case SIGHUP
: /* RESTART */
2007 case SIGINT
: /* STOP */
2008 case SIGQUIT
: /* HALT */
2009 case SIGTERM
: /* REBOOT */
2011 unlink("/var/notice/sysup");
2013 if( nvram_match( "webmon_bkp", "1" ) )
2014 xstart( "/usr/sbin/webmon_bkp", "hourly" ); // make a copy before halt/reboot router
2016 run_nvscript("script_shut", NULL
, 10);
2024 if ((state
== SIGTERM
/* REBOOT */) ||
2025 (state
== SIGQUIT
/* HALT */)) {
2026 remove_storage_main(1);
2029 shutdn(state
== SIGTERM
/* REBOOT */);
2032 if (state
== SIGINT
/* STOP */) {
2036 // SIGHUP (RESTART) falls through
2038 case SIGUSR2
: /* START */
2039 SET_LED(RELEASE_WAN_CONTROL
);
2042 load_files_from_nvram();
2045 fd
= file_lock("usb"); // hold off automount processing
2048 xstart("/usr/sbin/mymotd", "init");
2049 run_nvscript("script_init", NULL
, 2);
2051 file_unlock(fd
); // allow to process usb hotplug events
2054 * On RESTART some partitions can stay mounted if they are busy at the moment.
2055 * In that case USB drivers won't unload, and hotplug won't kick off again to
2056 * remount those drives that actually got unmounted. Make sure to remount ALL
2057 * partitions here by simulating hotplug event.
2059 if (state
== SIGHUP
/* RESTART */)
2060 add_remove_usbhost("-1", 1);
2071 #ifdef CONFIG_BCMWL5
2073 /* Restart NAS one more time - for some reason without
2074 * this the new driver doesn't always bring WDS up.
2081 syslog(LOG_INFO
, "%s: Tomato %s", nvram_safe_get("t_model_name"), tomato_version
);
2084 notice_set("sysup", "");
2088 chld_reap(0); /* Periodically reap zombies. */
2090 sigwait(&sigset
, &state
);
2096 int reboothalt_main(int argc
, char *argv
[])
2098 int reboot
= (strstr(argv
[0], "reboot") != NULL
);
2099 puts(reboot
? "Rebooting..." : "Shutting down...");
2102 kill(1, reboot
? SIGTERM
: SIGQUIT
);
2104 /* In the case we're hung, we'll get stuck and never actually reboot.
2105 * The only way out is to pull power.
2106 * So after 'reset_wait' seconds (default: 20), forcibly crash & restart.
2109 int wait
= nvram_get_int("reset_wait") ? : 20;
2110 if ((wait
< 10) || (wait
> 120)) wait
= 10;
2112 f_write("/proc/sysrq-trigger", "s", 1, 0 , 0); /* sync disks */
2114 puts("Still running... Doing machine reset.");
2116 f_write("/proc/sysrq-trigger", "s", 1, 0 , 0); /* sync disks */
2118 f_write("/proc/sysrq-trigger", "b", 1, 0 , 0); /* machine reset */