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=5402e0a54389ace0337ca3e11a1428a7fbf60a90;hp=1d55328aad024ce41b7b97b8d3656e0e6d49e545;hb=002e689c3125090d6b679875d749e71b5336e2ef;hpb=e9f92916642f20d69834e68030c6b8f9390d573e diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c b/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c index 1d55328aad..5402e0a543 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 Gabor Juhos + * Copyright (C) 2008-2009 Gabor Juhos * Copyright (C) 2008 Imre Kaloz * * This program is free software; you can redistribute it and/or modify it @@ -33,29 +33,73 @@ static char **ar71xx_prom_envp __initdata; static struct board_rec boards[] __initdata = { { .name = "411", - .mach_type = MACH_AR71XX_RB_411, + .mach_type = AR71XX_MACH_RB_411, }, { .name = "433", - .mach_type = MACH_AR71XX_RB_433, + .mach_type = AR71XX_MACH_RB_433, }, { .name = "450", - .mach_type = MACH_AR71XX_RB_450, + .mach_type = AR71XX_MACH_RB_450, }, { .name = "493", - .mach_type = MACH_AR71XX_RB_493, + .mach_type = AR71XX_MACH_RB_493, + }, { + .name = "AW-NR580", + .mach_type = AR71XX_MACH_AW_NR580, + }, { + .name = "AP83", + .mach_type = AR71XX_MACH_AP83, + }, { + .name = "TEW-632BRP", + .mach_type = AR71XX_MACH_TEW_632BRP, + }, { + .name = "UBNT-RS", + .mach_type = AR71XX_MACH_UBNT_RS, + }, { + .name = "UBNT-LSX", + .mach_type = AR71XX_MACH_UBNT_LSX, + }, { + .name = "WNR2000", + .mach_type = AR71XX_MACH_WNR2000, + }, { + .name = "PB42", + .mach_type = AR71XX_MACH_PB42, + }, { + .name = "MZK-W300NH", + .mach_type = AR71XX_MACH_MZK_W300NH, + }, { + .name = "MZK-W04NU", + .mach_type = AR71XX_MACH_MZK_W04NU, } }; +static inline int is_valid_ram_addr(void *addr) +{ + if (((u32) addr > KSEG0) && + ((u32) addr < (KSEG0 + AR71XX_MEM_SIZE_MAX))) + return 1; + + if (((u32) addr > KSEG1) && + ((u32) addr < (KSEG1 + AR71XX_MEM_SIZE_MAX))) + return 1; + + return 0; +} + static __init char *ar71xx_prom_getargv(const char *name) { int len = strlen(name); int i; - if (!ar71xx_prom_argv) + if (!is_valid_ram_addr(ar71xx_prom_argv)) return NULL; for (i = 0; i < ar71xx_prom_argc; i++) { char *argv = ar71xx_prom_argv[i]; + + if (!is_valid_ram_addr(argv)) + continue; + if (strncmp(name, argv, len) == 0 && (argv)[len] == '=') return argv + len + 1; } @@ -68,10 +112,10 @@ static __init char *ar71xx_prom_getenv(const char *envname) int len = strlen(envname); char **env; - if (!ar71xx_prom_envp) + if (!is_valid_ram_addr(ar71xx_prom_envp)) return NULL; - for (env = ar71xx_prom_envp; *env != NULL; env++) + for (env = ar71xx_prom_envp; is_valid_ram_addr(*env); env++) if (strncmp(envname, *env, len) == 0 && (*env)[len] == '=') return *env + len + 1; @@ -86,7 +130,7 @@ static __init unsigned long find_board_byname(char *name) if (strcmp(name, boards[i].name) == 0) return boards[i].mach_type; - return MACH_AR71XX_GENERIC; + return AR71XX_MACH_GENERIC; } static int ar71xx_prom_init_myloader(void) @@ -99,7 +143,7 @@ static int ar71xx_prom_init_myloader(void) switch (mylo->did) { case DEVID_COMPEX_WP543: - mips_machtype = MACH_AR71XX_WP543; + ar71xx_mach_type = AR71XX_MACH_WP543; break; default: printk(KERN_WARNING "prom: unknown device id: %x\n", @@ -122,7 +166,7 @@ static void ar71xx_prom_init_generic(void) if (!p) p = ar71xx_prom_getargv("board"); if (p) - mips_machtype = find_board_byname(p); + ar71xx_mach_type = find_board_byname(p); p = ar71xx_prom_getenv("ethaddr"); if (!p) @@ -138,7 +182,7 @@ void __init prom_init(void) (unsigned int)fw_arg0, (unsigned int)fw_arg1, (unsigned int)fw_arg2, (unsigned int)fw_arg3); - mips_machtype = MACH_AR71XX_GENERIC; + ar71xx_mach_type = AR71XX_MACH_GENERIC; if (ar71xx_prom_init_myloader()) return;