Преглед на файлове

ar71xx: avoid duplicated 'board' parameter in kernel command line

SVN-Revision: 21805
Gabor Juhos преди 15 години
родител
ревизия
08c2e29018
променени са 1 файла, в които са добавени 31 реда и са изтрити 8 реда
  1. 31 8
      target/linux/ar71xx/files/arch/mips/ar71xx/prom.c

+ 31 - 8
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 <[email protected]>
+ *  Copyright (C) 2008-2010 Gabor Juhos <[email protected]>
  *  Copyright (C) 2008 Imre Kaloz <[email protected]>
  *
  *  This program is free software; you can redistribute it and/or modify it
@@ -42,27 +42,31 @@ static void __init ar71xx_prom_append_cmdline(const char *name,
 	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)
@@ -142,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, "
@@ -156,8 +161,26 @@ void __init prom_init(void)
 	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)