ar71xx: add preliminary support for 3.3
[openwrt.git] / target / linux / ar71xx / patches-3.3 / 506-MIPS-ath79-prom-parse-redboot-args.patch
diff --git a/target/linux/ar71xx/patches-3.3/506-MIPS-ath79-prom-parse-redboot-args.patch b/target/linux/ar71xx/patches-3.3/506-MIPS-ath79-prom-parse-redboot-args.patch
new file mode 100644 (file)
index 0000000..aab959b
--- /dev/null
@@ -0,0 +1,86 @@
+--- a/arch/mips/ath79/prom.c
++++ b/arch/mips/ath79/prom.c
+@@ -19,6 +19,8 @@
+ #include "common.h"
++static char ath79_cmdline_buf[COMMAND_LINE_SIZE] __initdata;
++
+ static inline int is_valid_ram_addr(void *addr)
+ {
+       if (((u32) addr > KSEG0) &&
+@@ -32,6 +34,41 @@ static inline int is_valid_ram_addr(void
+       return 0;
+ }
++static void __init ath79_prom_append_cmdline(const char *name,
++                                            const char *value)
++{
++      snprintf(ath79_cmdline_buf, sizeof(ath79_cmdline_buf),
++               " %s=%s", name, value);
++      strlcat(arcs_cmdline, ath79_cmdline_buf, sizeof(arcs_cmdline));
++}
++
++static const char * __init ath79_prom_find_env(char **envp, const char *name)
++{
++      const char *ret = NULL;
++      int len;
++      char **p;
++
++      if (!is_valid_ram_addr(envp))
++              return NULL;
++
++      len = strlen(name);
++      for (p = envp; is_valid_ram_addr(*p); p++) {
++              if (strncmp(name, *p, len) == 0 && (*p)[len] == '=') {
++                      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))) {
++                              ret = *p;
++                              break;
++                      }
++      }
++
++      return ret;
++}
++
+ static __init void ath79_prom_init_cmdline(int argc, char **argv)
+ {
+       int i;
+@@ -48,7 +85,32 @@ static __init void ath79_prom_init_cmdli
+ void __init prom_init(void)
+ {
++      const char *env;
++      char **envp;
++
+       ath79_prom_init_cmdline(fw_arg0, (char **)fw_arg1);
++
++      envp = (char **)fw_arg2;
++      if (!strstr(arcs_cmdline, "ethaddr=")) {
++              env = ath79_prom_find_env(envp, "ethaddr");
++              if (env)
++                      ath79_prom_append_cmdline("ethaddr", env);
++      }
++
++      if (!strstr(arcs_cmdline, "board=")) {
++              env = ath79_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";
++
++                      ath79_prom_append_cmdline("board", env);
++              }
++      }
+ }
+ void __init prom_free_prom_memory(void)
This page took 0.023494 seconds and 4 git commands to generate.