brcm63xx: update development kernel to linux 3.14
[openwrt.git] / target / linux / brcm63xx / patches-3.14 / 304-boardid_fixup.patch
diff --git a/target/linux/brcm63xx/patches-3.14/304-boardid_fixup.patch b/target/linux/brcm63xx/patches-3.14/304-boardid_fixup.patch
new file mode 100644 (file)
index 0000000..937b9d6
--- /dev/null
@@ -0,0 +1,62 @@
+--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
++++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
+@@ -35,6 +35,7 @@
+ #include <board_bcm963xx.h>
+ #include <uapi/linux/bcm933xx_hcs.h>
++#include <uapi/linux/bcm963xx_tag.h>
+ #define PFX   "board_bcm963xx: "
+@@ -43,6 +44,9 @@
+ #define BCM963XX_KEYS_POLL_INTERVAL   20
+ #define BCM963XX_KEYS_DEBOUNCE_INTERVAL       (BCM963XX_KEYS_POLL_INTERVAL * 3)
++#define CFE_OFFSET_64K                        0x10000
++#define CFE_OFFSET_128K                       0x20000
++
+ static struct board_info board;
+ /*
+@@ -782,6 +786,30 @@ const char *board_get_name(void)
+       return board.name;
+ }
++static void __init boardid_fixup(u8 *boot_addr)
++{
++      struct bcm_tag *tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_64K);
++      char *board_name = (char *)bcm63xx_nvram_get_name();
++
++      /* check if bcm_tag is at 64k offset */
++      if (strncmp(board_name, tag->board_id, BOARDID_LEN) != 0) {
++              /* else try 128k */
++              tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_128K);
++              if (strncmp(board_name, tag->board_id, BOARDID_LEN) != 0) {
++                      /* No tag found */
++                      printk(KERN_DEBUG "No bcm_tag found!\n");
++                      return;
++              }
++      }
++      /* check if we should override the boardid */
++      if (tag->information1[0] != '+')
++              return;
++
++      strncpy(board_name, &tag->information1[1], BOARDID_LEN);
++
++      printk(KERN_INFO "Overriding boardid with '%s'\n", board_name);
++}
++
+ /*
+  * early init callback, read nvram data from flash and checksum it
+  */
+@@ -820,6 +848,10 @@ void __init board_prom_init(void)
+               hcs = (struct bcm_hcs *)boot_addr;
+               board_name = hcs->filename;
+       } else {
++              if (strcmp(cfe_version, "unknown") != 0) {
++                      /* cfe present */
++                      boardid_fixup(boot_addr);
++              }
+               board_name = bcm63xx_nvram_get_name();
+       }
+       /* find board by name */