From 5219981646071abb6731634bf47781a53e248764 Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Sun, 18 Jul 2010 15:11:26 +0200 Subject: [PATCH 6/6] MIPS: BCM47xx: Remove CFE console Do not use the CFE console. It causes hangs on some devices like the Buffalo WHR-HP-G54. This was reported in https://dev.openwrt.org/ticket/4061 and https://forum.openwrt.org/viewtopic.php?id=17063 Signed-off-by: Hauke Mehrtens --- arch/mips/Kconfig | 1 - arch/mips/bcm47xx/prom.c | 82 +++------------------------------------------ 2 files changed, 6 insertions(+), 77 deletions(-) --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -118,7 +118,6 @@ config BCM47XX select NO_EXCEPT_FILL select SYS_SUPPORTS_32BIT_KERNEL select SYS_SUPPORTS_LITTLE_ENDIAN - select SYS_HAS_EARLY_PRINTK help Support for BCM47XX based boards --- a/arch/mips/bcm47xx/prom.c +++ b/arch/mips/bcm47xx/prom.c @@ -35,8 +35,6 @@ #include #include -static int cfe_cons_handle; - static char bcm47xx_system_type[20] = "Broadcom BCM47XX"; const char *get_system_type(void) @@ -52,89 +50,23 @@ __init void bcm47xx_set_system_type(u16 chip_id); } -void prom_putchar(char c) -{ - while (cfe_write(cfe_cons_handle, &c, 1) == 0) - ; -} - -static __init void prom_init_cfe(void) +static __init int prom_init_cfe(void) { uint32_t cfe_ept; uint32_t cfe_handle; uint32_t cfe_eptseal; - int argc = fw_arg0; - char **envp = (char **) fw_arg2; - int *prom_vec = (int *) fw_arg3; - - /* - * Check if a loader was used; if NOT, the 4 arguments are - * what CFE gives us (handle, 0, EPT and EPTSEAL) - */ - if (argc < 0) { - cfe_handle = (uint32_t)argc; - cfe_ept = (uint32_t)envp; - cfe_eptseal = (uint32_t)prom_vec; - } else { - if ((int)prom_vec < 0) { - /* - * Old loader; all it gives us is the handle, - * so use the "known" entrypoint and assume - * the seal. - */ - cfe_handle = (uint32_t)prom_vec; - cfe_ept = 0xBFC00500; - cfe_eptseal = CFE_EPTSEAL; - } else { - /* - * Newer loaders bundle the handle/ept/eptseal - * Note: prom_vec is in the loader's useg - * which is still alive in the TLB. - */ - cfe_handle = prom_vec[0]; - cfe_ept = prom_vec[2]; - cfe_eptseal = prom_vec[3]; - } - } + + cfe_eptseal = (uint32_t) fw_arg3; + cfe_handle = (uint32_t) fw_arg0; + cfe_ept = (uint32_t) fw_arg2; if (cfe_eptseal != CFE_EPTSEAL) { - /* too early for panic to do any good */ printk(KERN_ERR "CFE's entrypoint seal doesn't match."); - while (1) ; + return -1; } cfe_init(cfe_handle, cfe_ept); -} - -static __init void prom_init_console(void) -{ - /* Initialize CFE console */ - cfe_cons_handle = cfe_getstdhandle(CFE_STDHANDLE_CONSOLE); -} - -static __init void prom_init_cmdline(void) -{ - static char buf[COMMAND_LINE_SIZE] __initdata; - - /* Get the kernel command line from CFE */ - if (cfe_getenv("LINUX_CMDLINE", buf, COMMAND_LINE_SIZE) >= 0) { - buf[COMMAND_LINE_SIZE - 1] = 0; - strcpy(arcs_cmdline, buf); - } - - /* Force a console handover by adding a console= argument if needed, - * as CFE is not available anymore later in the boot process. */ - if ((strstr(arcs_cmdline, "console=")) == NULL) { - /* Try to read the default serial port used by CFE */ - if ((cfe_getenv("BOOT_CONSOLE", buf, COMMAND_LINE_SIZE) < 0) - || (strncmp("uart", buf, 4))) - /* Default to uart0 */ - strcpy(buf, "uart0"); - - /* Compute the new command line */ - snprintf(arcs_cmdline, COMMAND_LINE_SIZE, "%s console=ttyS%c,115200", - arcs_cmdline, buf[4]); - } + return 0; } static __init void prom_init_mem(void) @@ -185,8 +117,6 @@ static __init void prom_init_mem(void) void __init prom_init(void) { prom_init_cfe(); - prom_init_console(); - prom_init_cmdline(); prom_init_mem(); }