X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=blobdiff_plain;f=target%2Flinux%2Far71xx%2Ffiles%2Farch%2Fmips%2Far71xx%2Fprom.c;h=c40dae319a3dbf5afe8ad560ad526363d31411fb;hp=283aff6a7bdc6952bcb9f56fe935af2599e3e8f0;hb=c1e8a5560a250f85411438381a27b98af7c9c3d4;hpb=03fe566eb83766245fc8bc46792743225ec8bd89 diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c b/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c index 283aff6a7b..c40dae319a 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c @@ -1,7 +1,7 @@ /* * Atheros AR71xx SoC specific prom routines * - * Copyright (C) 2008-2009 Gabor Juhos + * Copyright (C) 2008-2010 Gabor Juhos * Copyright (C) 2008 Imre Kaloz * * This program is free software; you can redistribute it and/or modify it @@ -20,144 +20,6 @@ #include -#include "devices.h" - -struct board_rec { - char *name; - enum ar71xx_mach_type mach_type; -}; - -static struct board_rec boards[] __initdata = { - { - .name = "411", - .mach_type = AR71XX_MACH_RB_411, - }, { - .name = "411U", - .mach_type = AR71XX_MACH_RB_411U, - }, { - .name = "433", - .mach_type = AR71XX_MACH_RB_433, - }, { - .name = "433U", - .mach_type = AR71XX_MACH_RB_433U, - }, { - .name = "450", - .mach_type = AR71XX_MACH_RB_450, - }, { - .name = "450G", - .mach_type = AR71XX_MACH_RB_450G, - }, { - .name = "493", - .mach_type = AR71XX_MACH_RB_493, - }, { - .name = "AP81", - .mach_type = AR71XX_MACH_AP81, - }, { - .name = "AP83", - .mach_type = AR71XX_MACH_AP83, - }, { - .name = "AW-NR580", - .mach_type = AR71XX_MACH_AW_NR580, - }, { - .name = "DIR-825-B1", - .mach_type = AR71XX_MACH_DIR_825_B1, - }, { - .name = "TEW-632BRP", - .mach_type = AR71XX_MACH_TEW_632BRP, - }, { - .name = "DIR-615-C1", - .mach_type = AR71XX_MACH_DIR_615_C1, - }, { - .name = "TL-WR741ND", - .mach_type = AR71XX_MACH_TL_WR741ND, - }, { - .name = "TL-WR941ND", - .mach_type = AR71XX_MACH_TL_WR941ND, - }, { - .name = "TL-WR1043ND", - .mach_type = AR71XX_MACH_TL_WR1043ND, - }, { - .name = "UBNT-RS", - .mach_type = AR71XX_MACH_UBNT_RS, - }, { - .name = "UBNT-RSPRO", - .mach_type = AR71XX_MACH_UBNT_RSPRO, - }, { - .name = "Ubiquiti AR71xx-based board", - .mach_type = AR71XX_MACH_UBNT_RS, - }, { - .name = "UBNT-LS-SR71", - .mach_type = AR71XX_MACH_UBNT_LSSR71, - }, { - .name = "UBNT-LSX", - .mach_type = AR71XX_MACH_UBNT_LSX, - }, { - .name = "UBNT-BM", - .mach_type = AR71XX_MACH_UBNT_BULLET_M, - }, { - .name = "UBNT-RM", - .mach_type = AR71XX_MACH_UBNT_ROCKET_M, - }, { - .name = "UBNT-NM", - .mach_type = AR71XX_MACH_UBNT_NANO_M, - }, { - .name = "WNDR3700", - .mach_type = AR71XX_MACH_WNDR3700, - }, { - .name = "WNR2000", - .mach_type = AR71XX_MACH_WNR2000, - }, { - .name = "WRT160NL", - .mach_type = AR71XX_MACH_WRT160NL, - }, { - .name = "WP543", - .mach_type = AR71XX_MACH_WP543, - }, { - .name = "WRT400N", - .mach_type = AR71XX_MACH_WRT400N, - }, { - .name = "PB42", - .mach_type = AR71XX_MACH_PB42, - }, { - .name = "PB44", - .mach_type = AR71XX_MACH_PB44, - }, { - .name = "MZK-W300NH", - .mach_type = AR71XX_MACH_MZK_W300NH, - }, { - .name = "MZK-W04NU", - .mach_type = AR71XX_MACH_MZK_W04NU, - } -}; - -static int __init ar71xx_board_setup(char *name) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(boards); i++) - if (strcmp(name, boards[i].name) == 0) { - ar71xx_mach = boards[i].mach_type; - break; - } - - return 1; -} -__setup("board=", ar71xx_board_setup); - -static int __init ar71xx_ethaddr_setup(char *str) -{ - ar71xx_parse_mac_addr(str); - return 1; -} -__setup("ethaddr=", ar71xx_ethaddr_setup); - -static int __init ar71xx_kmac_setup(char *str) -{ - ar71xx_parse_mac_addr(str); - return 1; -} -__setup("kmac=", ar71xx_kmac_setup); - static inline int is_valid_ram_addr(void *addr) { if (((u32) addr > KSEG0) && @@ -174,33 +36,37 @@ static inline int is_valid_ram_addr(void *addr) static void __init ar71xx_prom_append_cmdline(const char *name, const char *value) { - char buf[CL_SIZE]; + char buf[COMMAND_LINE_SIZE]; snprintf(buf, sizeof(buf), " %s=%s", name, value); strlcat(arcs_cmdline, buf, sizeof(arcs_cmdline)); } -static void __init ar71xx_prom_find_env(char **envp, const char *name) +static const char * __init ar71xx_prom_find_env(char **envp, const char *name) { - int len = strlen(name); + const char *ret = NULL; + int len; char **p; if (!is_valid_ram_addr(envp)) - return; + return NULL; + len = strlen(name); for (p = envp; is_valid_ram_addr(*p); p++) { if (strncmp(name, *p, len) == 0 && (*p)[len] == '=') { - ar71xx_prom_append_cmdline(name, *p + len + 1); + ret = *p + len + 1; break; } /* RedBoot env comes in pointer pairs - key, value */ if (strncmp(name, *p, len) == 0 && (*p)[len] == 0) if (is_valid_ram_addr(*(++p))) { - ar71xx_prom_append_cmdline(name, *p); + ret = *p; break; } } + + return ret; } static int __init ar71xx_prom_init_myloader(void) @@ -258,7 +124,7 @@ static int __init ar71xx_use__image_cmdline(void) return 1; } #else -static int inline ar71xx_use__image_cmdline(void) { return 0; } +static inline int ar71xx_use__image_cmdline(void) { return 0; } #endif static __init void ar71xx_prom_init_cmdline(int argc, char **argv) @@ -280,6 +146,7 @@ static __init void ar71xx_prom_init_cmdline(int argc, char **argv) void __init prom_init(void) { + const char *env; char **envp; printk(KERN_DEBUG "prom: fw_arg0=%08x, fw_arg1=%08x, " @@ -288,16 +155,32 @@ void __init prom_init(void) (unsigned int)fw_arg2, (unsigned int)fw_arg3); - ar71xx_mach = AR71XX_MACH_GENERIC; - if (ar71xx_prom_init_myloader()) return; ar71xx_prom_init_cmdline(fw_arg0, (char **)fw_arg1); envp = (char **)fw_arg2; - ar71xx_prom_find_env(envp, "board"); - ar71xx_prom_find_env(envp, "ethaddr"); + if (!strstr(arcs_cmdline, "ethaddr=")) { + env = ar71xx_prom_find_env(envp, "ethaddr"); + if (env) + ar71xx_prom_append_cmdline("ethaddr", env); + } + + if (!strstr(arcs_cmdline, "board=")) { + env = ar71xx_prom_find_env(envp, "board"); + if (env) { + /* Workaround for buggy bootloaders */ + if (strcmp(env, "RouterStation") == 0 || + strcmp(env, "Ubiquiti AR71xx-based board") == 0) + env = "UBNT-RS"; + + if (strcmp(env, "RouterStation PRO") == 0) + env = "UBNT-RSPRO"; + + ar71xx_prom_append_cmdline("board", env); + } + } } void __init prom_free_prom_memory(void)