|
|
@@ -115,47 +115,82 @@ static struct adm5120_board __initdata adm5120_boards[] = {
|
|
|
.flash0_size = 4*1024*1024,
|
|
|
},
|
|
|
{
|
|
|
- .name = "RouterBOARD RB-111",
|
|
|
+ .name = "RouterBOARD 111",
|
|
|
.mach_type = MACH_ADM5120_RB_111,
|
|
|
.has_usb = 0,
|
|
|
.iface_num = 1,
|
|
|
.flash0_size = 128*1024,
|
|
|
},
|
|
|
{
|
|
|
- .name = "RouterBOARD RB-112",
|
|
|
+ .name = "RouterBOARD 112",
|
|
|
.mach_type = MACH_ADM5120_RB_112,
|
|
|
.has_usb = 0,
|
|
|
.iface_num = 1,
|
|
|
.flash0_size = 128*1024,
|
|
|
},
|
|
|
{
|
|
|
- .name = "RouterBOARD RB-133",
|
|
|
+ .name = "RouterBOARD 133",
|
|
|
.mach_type = MACH_ADM5120_RB_133,
|
|
|
.has_usb = 0,
|
|
|
.iface_num = 3,
|
|
|
.flash0_size = 128*1024,
|
|
|
},
|
|
|
{
|
|
|
- .name = "RouterBOARD RB-133C",
|
|
|
+ .name = "RouterBOARD 133C",
|
|
|
.mach_type = MACH_ADM5120_RB_133C,
|
|
|
.has_usb = 0,
|
|
|
.iface_num = 1,
|
|
|
.flash0_size = 128*1024,
|
|
|
},
|
|
|
{
|
|
|
- .name = "RouterBOARD RB-150",
|
|
|
+ .name = "RouterBOARD 150",
|
|
|
.mach_type = MACH_ADM5120_RB_150,
|
|
|
.has_usb = 0,
|
|
|
.iface_num = 5,
|
|
|
.flash0_size = 128*1024,
|
|
|
},
|
|
|
{
|
|
|
- .name = "RouterBOARD RB-153",
|
|
|
+ .name = "RouterBOARD 153",
|
|
|
.mach_type = MACH_ADM5120_RB_153,
|
|
|
.has_usb = 0,
|
|
|
.iface_num = 5,
|
|
|
.flash0_size = 128*1024,
|
|
|
},
|
|
|
+ {
|
|
|
+ .name = "ZyXEL ES-2108",
|
|
|
+ .mach_type = MACH_ADM5120_ES2108,
|
|
|
+ .has_usb = 0,
|
|
|
+ .iface_num = 0,
|
|
|
+ .flash0_size = 4*1024*1024,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .name = "ZyXEL ES-2108-F",
|
|
|
+ .mach_type = MACH_ADM5120_ES2108F,
|
|
|
+ .has_usb = 0,
|
|
|
+ .iface_num = 0,
|
|
|
+ .flash0_size = 4*1024*1024,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .name = "ZyXEL ES-2108-G",
|
|
|
+ .mach_type = MACH_ADM5120_ES2108G,
|
|
|
+ .has_usb = 0,
|
|
|
+ .iface_num = 0,
|
|
|
+ .flash0_size = 4*1024*1024,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .name = "ZyXEL ES-2108-LC",
|
|
|
+ .mach_type = MACH_ADM5120_ES2108LC,
|
|
|
+ .has_usb = 0,
|
|
|
+ .iface_num = 0,
|
|
|
+ .flash0_size = 4*1024*1024,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .name = "ZyXEL ES-2108PWR",
|
|
|
+ .mach_type = MACH_ADM5120_ES2108PWR,
|
|
|
+ .has_usb = 0,
|
|
|
+ .iface_num = 0,
|
|
|
+ .flash0_size = 4*1024*1024,
|
|
|
+ },
|
|
|
{
|
|
|
.name = "ZyXEL HomeSafe 100/100W",
|
|
|
.mach_type = MACH_ADM5120_HS100,
|
|
|
@@ -367,8 +402,7 @@ static int __init cfe_present(void)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- /* cfe_a1_val must be 0, because only one CPU present in the ADM5120 SoC
|
|
|
-*/
|
|
|
+ /* cfe_a1_val must be 0, because only one CPU present in the ADM5120 */
|
|
|
if (cfe_a1_val != 0) {
|
|
|
return 0;
|
|
|
}
|
|
|
@@ -434,75 +468,111 @@ out:
|
|
|
/*
|
|
|
* RouterBOOT based boards
|
|
|
*/
|
|
|
-static int __init routerboot_find_tag(u8 *buf, u16 tagid, void **tagval,
|
|
|
- u16 *taglen)
|
|
|
+static int __init routerboot_load_hs(u8 *buf, u16 buflen,
|
|
|
+ struct rb_hard_settings *hs)
|
|
|
{
|
|
|
u16 id,len;
|
|
|
- int ret;
|
|
|
+ u8 *mac;
|
|
|
+ int i,j;
|
|
|
+
|
|
|
+ if (buflen < 4)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ if (read_le32(buf) != RB_MAGIC_HARD)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ /* skip magic value */
|
|
|
+ buf += 4;
|
|
|
+ buflen -= 4;
|
|
|
|
|
|
- ret = -1;
|
|
|
- /* skip header */
|
|
|
- buf += 8;
|
|
|
- for (;;) {
|
|
|
+ while (buflen > 2) {
|
|
|
id = read_le16(buf);
|
|
|
buf += 2;
|
|
|
- if (id == RB_ID_TERMINATOR)
|
|
|
+ buflen -= 2;
|
|
|
+ if (id == RB_ID_TERMINATOR || buflen < 2)
|
|
|
break;
|
|
|
|
|
|
len = read_le16(buf);
|
|
|
buf += 2;
|
|
|
- if (id == tagid) {
|
|
|
- *tagval = buf;
|
|
|
- *taglen = len;
|
|
|
- ret = 0;
|
|
|
+ buflen -= 2;
|
|
|
+
|
|
|
+ if (buflen < len)
|
|
|
+ break;
|
|
|
+
|
|
|
+ switch (id) {
|
|
|
+ case RB_ID_BIOS_VERSION:
|
|
|
+ hs->bios_ver = (char *)buf;
|
|
|
+ break;
|
|
|
+ case RB_ID_BOARD_NAME:
|
|
|
+ hs->name = (char *)buf;
|
|
|
+ break;
|
|
|
+ case RB_ID_MEMORY_SIZE:
|
|
|
+ hs->mem_size = read_le32(buf);
|
|
|
+ break;
|
|
|
+ case RB_ID_MAC_ADDRESS_COUNT:
|
|
|
+ hs->mac_count = read_le32(buf);
|
|
|
+ break;
|
|
|
+ case RB_ID_MAC_ADDRESS_PACK:
|
|
|
+ hs->mac_count = len/RB_MAC_SIZE;
|
|
|
+ if (hs->mac_count > RB_MAX_MAC_COUNT)
|
|
|
+ hs->mac_count = RB_MAX_MAC_COUNT;
|
|
|
+ mac = buf;
|
|
|
+ for (i=0; i < hs->mac_count; i++) {
|
|
|
+ for (j=0; j < RB_MAC_SIZE; j++)
|
|
|
+ hs->macs[i][j] = mac[j];
|
|
|
+ mac += RB_MAC_SIZE;
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
buf += len;
|
|
|
+ buflen -= len;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- return ret;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
-#define RB_HS_ADDR KSEG1ADDR(ADM5120_SRAM0_BASE+0x1000)
|
|
|
-#define RB_SS_ADDR KSEG1ADDR(ADM5120_SRAM0_BASE+0x2000)
|
|
|
-#define RB_FW_ADDR KSEG1ADDR(ADM5120_SRAM0_BASE+0x10000)
|
|
|
+#define RB_BS_OFFS 0x14
|
|
|
+#define RB_OFFS_MAX (128*1024)
|
|
|
|
|
|
static unsigned long __init routerboot_detect_board(void)
|
|
|
{
|
|
|
struct routerboard *board;
|
|
|
- u32 magic;
|
|
|
- char *name;
|
|
|
- u16 namelen;
|
|
|
+ struct rb_hard_settings hs;
|
|
|
+ struct rb_bios_settings *bs;
|
|
|
+ u8 *base;
|
|
|
+ u32 off,len;
|
|
|
unsigned long ret;
|
|
|
|
|
|
ret = MACH_ADM5120_UNKNOWN;
|
|
|
|
|
|
- magic = le32_to_cpu(*(u32 *)RB_HS_ADDR);
|
|
|
- if (magic != RB_MAGIC_HARD)
|
|
|
- goto out;
|
|
|
+ base = (u8 *)KSEG1ADDR(ADM5120_SRAM0_BASE);
|
|
|
+ bs = (struct rb_bios_settings *)(base + RB_BS_OFFS);
|
|
|
|
|
|
- magic = le32_to_cpu(*(u32 *)RB_SS_ADDR);
|
|
|
- if ((magic != RB_MAGIC_SOFT) && (magic != RB_MAGIC_DAWN))
|
|
|
- goto out;
|
|
|
+ off = read_le32(&bs->hs_offs);
|
|
|
+ len = read_le32(&bs->hs_size);
|
|
|
+ if (off > RB_OFFS_MAX)
|
|
|
+ return ret;
|
|
|
|
|
|
- if (routerboot_find_tag((u8 *)RB_HS_ADDR, RB_ID_BOARD_NAME,
|
|
|
- (void *)&name, &namelen))
|
|
|
- goto out;
|
|
|
+ memset(&hs, 0, sizeof(hs));
|
|
|
+ if (routerboot_load_hs(base+off, len, &hs) != 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ /* assume RouterBOOT as the boot-loader */
|
|
|
+ adm5120_boot_loader = BOOT_LOADER_ROUTERBOOT;
|
|
|
+
|
|
|
+ if (hs.name == NULL)
|
|
|
+ return ret;
|
|
|
|
|
|
for (board = routerboards; board->mach_type != MACH_ADM5120_UNKNOWN;
|
|
|
board++) {
|
|
|
- if (strncmp(board->name, name, strlen(board->name)) == 0) {
|
|
|
+ if (strncmp(board->name, hs.name, strlen(board->name)) == 0) {
|
|
|
ret = board->mach_type;
|
|
|
break;
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
- /* assume RouterBOOT as the boot-loader */
|
|
|
- adm5120_boot_loader = BOOT_LOADER_ROUTERBOOT;
|
|
|
-
|
|
|
-out:
|
|
|
return ret;
|
|
|
}
|
|
|
|