brcm47xx: add patches for kernel 2.6.36
[openwrt/svn-archive/archive.git] / target / linux / brcm47xx / patches-2.6.36 / 016-MIPS-BCM47xx-Remove-CFE-console.patch
diff --git a/target/linux/brcm47xx/patches-2.6.36/016-MIPS-BCM47xx-Remove-CFE-console.patch b/target/linux/brcm47xx/patches-2.6.36/016-MIPS-BCM47xx-Remove-CFE-console.patch
new file mode 100644 (file)
index 0000000..ef36709
--- /dev/null
@@ -0,0 +1,141 @@
+From 5219981646071abb6731634bf47781a53e248764 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+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 <hauke@hauke-m.de>
+---
+ 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
+@@ -76,7 +76,6 @@ config BCM47XX
+       select SSB_B43_PCI_BRIDGE if PCI
+       select SSB_PCICORE_HOSTMODE if PCI
+       select GENERIC_GPIO
+-      select SYS_HAS_EARLY_PRINTK
+       select CFE
+       help
+        Support for BCM47XX based boards
+--- a/arch/mips/bcm47xx/prom.c
++++ b/arch/mips/bcm47xx/prom.c
+@@ -31,96 +31,28 @@
+ #include <asm/fw/cfe/cfe_api.h>
+ #include <asm/fw/cfe/cfe_error.h>
+-static int cfe_cons_handle;
+-
+ const char *get_system_type(void)
+ {
+       return "Broadcom BCM47XX";
+ }
+-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)
+@@ -161,8 +93,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();
+ }