mirror of https://github.com/hak5/openwrt.git
87 lines
2.0 KiB
Diff
87 lines
2.0 KiB
Diff
|
--- 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)
|