diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2009-10-25 07:10:16 +0000 |
---|---|---|
committer | Gabor Juhos <juhosg@openwrt.org> | 2009-10-25 07:10:16 +0000 |
commit | fda1a60882238b2163f859bfe8a90d335ede7894 (patch) | |
tree | 517778ece6d466358a215bef18b0cad6c0797185 /target/linux/ramips/files/arch | |
parent | 08ab8b307059d87c6ca18f4e3d68fa971c0ab0c3 (diff) | |
download | master-187ad058-fda1a60882238b2163f859bfe8a90d335ede7894.tar.gz master-187ad058-fda1a60882238b2163f859bfe8a90d335ede7894.tar.bz2 master-187ad058-fda1a60882238b2163f859bfe8a90d335ede7894.zip |
ramips: change prom code to accept 'board=FOOBAR' from the command line
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@18142 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/ramips/files/arch')
-rw-r--r-- | target/linux/ramips/files/arch/mips/ralink/common/prom.c | 103 |
1 files changed, 69 insertions, 34 deletions
diff --git a/target/linux/ramips/files/arch/mips/ralink/common/prom.c b/target/linux/ramips/files/arch/mips/ralink/common/prom.c index 587f161107..5dad9c28fb 100644 --- a/target/linux/ramips/files/arch/mips/ralink/common/prom.c +++ b/target/linux/ramips/files/arch/mips/ralink/common/prom.c @@ -24,10 +24,6 @@ struct board_rec { enum ramips_mach_type mach_type; }; -static int ramips_prom_argc __initdata; -static char **ramips_prom_argv __initdata; -static char **ramips_prom_envp __initdata; - static struct board_rec boards[] __initdata = { { .name = "RT-N15", @@ -70,46 +66,82 @@ static inline void *to_ram_addr(void *addr) return NULL; } -static __init char *ramips_prom_getargv(const char *name) +static void __init prom_append_cmdline(const char *name, + const char *value) +{ + char buf[CL_SIZE]; + + snprintf(buf, sizeof(buf), " %s=%s", name, value); + strlcat(arcs_cmdline, buf, sizeof(arcs_cmdline)); +} + +#ifdef CONFIG_IMAGE_CMDLINE_HACK +extern char __image_cmdline[]; + +static int __init use_image_cmdline(void) +{ + char *p = __image_cmdline; + int replace = 0; + + if (*p == '-') { + replace = 1; + p++; + } + + if (*p == '\0') + return 0; + + if (replace) { + strlcpy(arcs_cmdline, p, sizeof(arcs_cmdline)); + } else { + strlcat(arcs_cmdline, " ", sizeof(arcs_cmdline)); + strlcat(arcs_cmdline, p, sizeof(arcs_cmdline)); + } + + return 1; +} +#else +static int inline use_image_cmdline(void) { return 0; } +#endif + +static __init void prom_init_cmdline(int argc, char **argv) { - int len = strlen(name); int i; - if (!ramips_prom_argv) { + if (use_image_cmdline()) + return; + + if (!argv) { printk(KERN_DEBUG "argv=%p is invalid, skipping\n", - ramips_prom_argv); - return NULL; + argv); + return; } - for (i = 0; i < ramips_prom_argc; i++) { - char *argv = to_ram_addr(ramips_prom_argv[i]); + for (i = 0; i < argc; i++) { + char *p = to_ram_addr(argv[i]); - if (!argv) { + if (!p) { printk(KERN_DEBUG "argv[%d]=%p is invalid, skipping\n", - i, ramips_prom_argv[i]); + i, argv[i]); continue; } - printk(KERN_DEBUG "argv[%d]: %s\n", i, argv); - if (strncmp(name, argv, len) == 0 && (argv)[len] == '=') - return argv + len + 1; + printk(KERN_DEBUG "argv[%d]: %s\n", i, p); + strlcat(arcs_cmdline, " ", sizeof(arcs_cmdline)); + strlcat(arcs_cmdline, p, sizeof(arcs_cmdline)); } - - return NULL; } -static __init char *ramips_prom_getenv(const char *envname) +static __init char *prom_append_env(char **env, const char *envname) { #define PROM_MAX_ENVS 256 int len = strlen(envname); - char **env; int i; - env = ramips_prom_envp; if (!env) { - printk(KERN_DEBUG "envp=%p is not in RAM, skipping\n", - ramips_prom_envp); + printk(KERN_DEBUG "env=%p is not in RAM, skipping\n", + env); return NULL; } @@ -121,14 +153,14 @@ static __init char *ramips_prom_getenv(const char *envname) printk(KERN_DEBUG "env[%d]: %s\n", i, p); if (strncmp(envname, p, len) == 0 && p[len] == '=') - return p + len + 1; + prom_append_cmdline(envname, p + len + 1); } return NULL; #undef PROM_MAX_ENVS } -static __init void find_board_byname(char *name) +static __init int ramips_board_setup(char *name) { int i; @@ -137,26 +169,29 @@ static __init void find_board_byname(char *name) ramips_mach = boards[i].mach_type; break; } + + return 1; } +__setup("board=", ramips_board_setup); void __init prom_init(void) { - char *p; + int argc; + char **envp; + char **argv; printk(KERN_DEBUG "prom: fw_arg0=%08x, fw_arg1=%08x, fw_arg2=%08x, fw_arg3=%08x\n", (unsigned int)fw_arg0, (unsigned int)fw_arg1, (unsigned int)fw_arg2, (unsigned int)fw_arg3); - ramips_prom_argc = fw_arg0; - ramips_prom_argv = to_ram_addr((void *)fw_arg1); - ramips_prom_envp = to_ram_addr((void *)fw_arg2); + argc = fw_arg0; + argv = to_ram_addr((void *)fw_arg1); + prom_init_cmdline(argc, argv); - p = ramips_prom_getargv("board"); - if (!p) - p = ramips_prom_getenv("board"); - if (p) - find_board_byname(p); + envp = to_ram_addr((void *)fw_arg2); + prom_append_env(envp, "board"); + prom_append_env(envp, "ethaddr"); } void __init prom_free_prom_memory(void) |