Check bootloader argument in mtd.
Fix "cfe-" string length copy and mtd read size.
Add last byte on "cfe-v" versions a.b.c-d.e -> a.b.c-d.e-f.
Add support for Huawei CFE versions ("cfe-vd").

Signed-off-by: Jonas Gorski <[email protected]>
Signed-off-by: Álvaro Fernández Rojas <[email protected]>
---
V3: Switch CFE detection code to bootloader argument.

diff --git a/target/linux/brcm63xx/patches-3.7/311-cfe_version_mod.patch 
b/target/linux/brcm63xx/patches-3.7/311-cfe_version_mod.patch
index b9edc23..b82ac18 100644
--- a/target/linux/brcm63xx/patches-3.7/311-cfe_version_mod.patch
+++ b/target/linux/brcm63xx/patches-3.7/311-cfe_version_mod.patch
@@ -1,26 +1,90 @@
 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -796,6 +796,8 @@ void __init board_prom_init(void)
-       if (!memcmp(cfe, "cfe-v", 5))
-               snprintf(cfe_version, sizeof(cfe_version), "%u.%u.%u-%u.%u",
-                        cfe[5], cfe[6], cfe[7], cfe[8], cfe[9]);
+@@ -793,9 +793,13 @@ void __init board_prom_init(void)
+ 
+       /* dump cfe version */
+       cfe = boot_addr + BCM963XX_CFE_VERSION_OFFSET;
+-      if (!memcmp(cfe, "cfe-v", 5))
+-              snprintf(cfe_version, sizeof(cfe_version), "%u.%u.%u-%u.%u",
+-                       cfe[5], cfe[6], cfe[7], cfe[8], cfe[9]);
++      if (!memcmp(cfe, "cfe-vd", 6))
++              snprintf(cfe_version, 11, "%s", (char *) &cfe[5]);
++      else if (!memcmp(cfe, "cfe-v", 5))
++              snprintf(cfe_version, sizeof(cfe_version), "%u.%u.%u-%u.%u-%u",
++                      cfe[5], cfe[6], cfe[7], cfe[8], cfe[9], cfe[10]);
 +      else if (!memcmp(cfe, "cfe-", 4))
-+              snprintf(cfe_version, 16, "%s", (char *) &cfe[4]);
++              snprintf(cfe_version, 12, "%s", (char *) &cfe[4]);
        else
                strcpy(cfe_version, "unknown");
        printk(KERN_INFO PFX "CFE version: %s\n", cfe_version);
+--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_board.h
++++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_board.h
+@@ -1,6 +1,8 @@
+ #ifndef BCM63XX_BOARD_H_
+ #define BCM63XX_BOARD_H_
+ 
++#include <asm/bootinfo.h>
++
+ const char *board_get_name(void);
+ 
+ void board_prom_init(void);
+@@ -9,4 +11,8 @@ void board_setup(void);
+ 
+ int board_register_devices(void);
+ 
++static inline bool bcm63xx_is_cfe_present(void) {
++      return fw_arg3 == 0x43464531;
++}
++
+ #endif /* ! BCM63XX_BOARD_H_ */
 --- a/drivers/mtd/bcm63xxpart.c
 +++ b/drivers/mtd/bcm63xxpart.c
-@@ -54,10 +54,10 @@ static int bcm63xx_detect_cfe(struct mtd
-       if (ret)
-               return ret;
+@@ -33,38 +33,12 @@
+ #include <linux/mtd/partitions.h>
  
--      if (strncmp("cfe-v", buf, 5) == 0)
-+      if (strncmp("cfe-", buf, 4) == 0)
-               return 0;
+ #include <linux/bcm963xx_tag.h>
+-#include <asm/mach-bcm63xx/board_bcm963xx.h>
++#include <asm/mach-bcm63xx/bcm63xx_board.h>
  
+ #define BCM63XX_EXTENDED_SIZE 0xBFC00000      /* Extended flash address */
+ 
+ #define BCM63XX_CFE_BLOCK_SIZE        0x10000         /* always at least 
64KiB */
+ 
+-#define BCM63XX_CFE_MAGIC_OFFSET 0x4e0
+-
+-static int bcm63xx_detect_cfe(struct mtd_info *master)
+-{
+-      char buf[9];
+-      int ret;
+-      size_t retlen;
+-
+-      ret = mtd_read(master, BCM963XX_CFE_VERSION_OFFSET, 5, &retlen,
+-                     (void *)buf);
+-      buf[retlen] = 0;
+-
+-      if (ret)
+-              return ret;
+-
+-      if (strncmp("cfe-v", buf, 5) == 0)
+-              return 0;
+-
 -      /* very old CFE's do not have the cfe-v string, so check for magic */
-+      /* very old CFE's do not have the cfe- string, so check for magic */
-       ret = mtd_read(master, BCM63XX_CFE_MAGIC_OFFSET, 8, &retlen,
-                      (void *)buf);
-       buf[retlen] = 0;
+-      ret = mtd_read(master, BCM63XX_CFE_MAGIC_OFFSET, 8, &retlen,
+-                     (void *)buf);
+-      buf[retlen] = 0;
+-
+-      return strncmp("CFE1CFE1", buf, 8);
+-}
+-
+ static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,
+                                       struct mtd_partition **pparts,
+                                       struct mtd_part_parser_data *data)
+@@ -83,7 +57,7 @@ static int bcm63xx_parse_cfe_partitions(
+       u32 computed_crc;
+       bool rootfs_first = false;
+ 
+-      if (bcm63xx_detect_cfe(master))
++      if (!bcm63xx_is_cfe_present())
+               return -EINVAL;
+ 
+       cfe_erasesize = max_t(uint32_t, master->erasesize,
diff --git 
a/target/linux/brcm63xx/patches-3.7/401-MIPS-BCM63XX-register-ohci-device.patch 
b/target/linux/brcm63xx/patches-3.7/401-MIPS-BCM63XX-register-ohci-device.patch
index 80ff1c2..bb7aba5 100644
--- 
a/target/linux/brcm63xx/patches-3.7/401-MIPS-BCM63XX-register-ohci-device.patch
+++ 
b/target/linux/brcm63xx/patches-3.7/401-MIPS-BCM63XX-register-ohci-device.patch
@@ -71,7 +71,7 @@ Subject: [PATCH 31/72] MIPS: BCM63XX: register ohci device.
  #include <bcm63xx_dev_usb_usbd.h>
  #include <board_bcm963xx.h>
  
-@@ -923,6 +924,9 @@ int __init board_register_devices(void)
+@@ -925,6 +926,9 @@ int __init board_register_devices(void)
        if (board.has_usbd)
                bcm63xx_usbd_register(&board.usbd);
  
diff --git 
a/target/linux/brcm63xx/patches-3.7/403-MIPS-BCM63XX-register-ehci-device.patch 
b/target/linux/brcm63xx/patches-3.7/403-MIPS-BCM63XX-register-ehci-device.patch
index 10af689..6883b95 100644
--- 
a/target/linux/brcm63xx/patches-3.7/403-MIPS-BCM63XX-register-ehci-device.patch
+++ 
b/target/linux/brcm63xx/patches-3.7/403-MIPS-BCM63XX-register-ehci-device.patch
@@ -52,7 +52,7 @@ Subject: [PATCH 33/72] MIPS: BCM63XX: register ehci device.
  #include <bcm63xx_dev_usb_usbd.h>
  #include <board_bcm963xx.h>
  
-@@ -924,6 +925,9 @@ int __init board_register_devices(void)
+@@ -926,6 +927,9 @@ int __init board_register_devices(void)
        if (board.has_usbd)
                bcm63xx_usbd_register(&board.usbd);
  
diff --git 
a/target/linux/brcm63xx/patches-3.7/405-bcm963xx_real_rootfs_length.patch 
b/target/linux/brcm63xx/patches-3.7/405-bcm963xx_real_rootfs_length.patch
index 955c32f..f17751e 100644
--- a/target/linux/brcm63xx/patches-3.7/405-bcm963xx_real_rootfs_length.patch
+++ b/target/linux/brcm63xx/patches-3.7/405-bcm963xx_real_rootfs_length.patch
@@ -15,7 +15,7 @@
        /* 240-255: Unused at present */
 --- a/drivers/mtd/bcm63xxpart.c
 +++ b/drivers/mtd/bcm63xxpart.c
-@@ -131,7 +131,8 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -105,7 +105,8 @@ static int bcm63xx_parse_cfe_partitions(
                } else {
                        /* OpenWrt layout */
                        rootfsaddr = kerneladdr + kernellen;
diff --git 
a/target/linux/brcm63xx/patches-3.7/408-6358-enet1-external-mii-clk.patch 
b/target/linux/brcm63xx/patches-3.7/408-6358-enet1-external-mii-clk.patch
index 6b4886d..6d4c635 100644
--- a/target/linux/brcm63xx/patches-3.7/408-6358-enet1-external-mii-clk.patch
+++ b/target/linux/brcm63xx/patches-3.7/408-6358-enet1-external-mii-clk.patch
@@ -1,6 +1,6 @@
 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -859,6 +859,8 @@ void __init board_prom_init(void)
+@@ -861,6 +861,8 @@ void __init board_prom_init(void)
                if (BCMCPU_IS_6348())
                        val |= GPIO_MODE_6348_G3_EXT_MII |
                                GPIO_MODE_6348_G0_EXT_MII;
diff --git 
a/target/linux/brcm63xx/patches-3.7/415-bcm63xx_enet-add-support-for-bcm6368-internal-ethern.patch
 
b/target/linux/brcm63xx/patches-3.7/415-bcm63xx_enet-add-support-for-bcm6368-internal-ethern.patch
index 5dec825..92bba09 100644
--- 
a/target/linux/brcm63xx/patches-3.7/415-bcm63xx_enet-add-support-for-bcm6368-internal-ethern.patch
+++ 
b/target/linux/brcm63xx/patches-3.7/415-bcm63xx_enet-add-support-for-bcm6368-internal-ethern.patch
@@ -13,7 +13,7 @@ Subject: [PATCH 31/63] bcm63xx_enet: add support for bcm6368 
internal ethernet s
 
 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -927,6 +927,10 @@ int __init board_register_devices(void)
+@@ -929,6 +929,10 @@ int __init board_register_devices(void)
        if (board.has_usbd)
                bcm63xx_usbd_register(&board.usbd);
  
diff --git 
a/target/linux/brcm63xx/patches-3.7/425-MIPS-BCM63XX-add-HS-SPI-platform-device-and-register.patch
 
b/target/linux/brcm63xx/patches-3.7/425-MIPS-BCM63XX-add-HS-SPI-platform-device-and-register.patch
index 15240ce..98e64fe 100644
--- 
a/target/linux/brcm63xx/patches-3.7/425-MIPS-BCM63XX-add-HS-SPI-platform-device-and-register.patch
+++ 
b/target/linux/brcm63xx/patches-3.7/425-MIPS-BCM63XX-add-HS-SPI-platform-device-and-register.patch
@@ -36,7 +36,7 @@ Signed-off-by: Jonas Gorski <[email protected]>
  #include <bcm63xx_dev_pcmcia.h>
  #include <bcm63xx_dev_spi.h>
  #include <bcm63xx_dev_usb_ohci.h>
-@@ -952,6 +953,7 @@ int __init board_register_devices(void)
+@@ -954,6 +955,7 @@ int __init board_register_devices(void)
                        pr_err(PFX "failed to register fallback SPROM\n");
        }
  #endif
diff --git 
a/target/linux/brcm63xx/patches-3.7/430-MTD-bcm63xxpart-use-nvram-for-PSI-size.patch
 
b/target/linux/brcm63xx/patches-3.7/430-MTD-bcm63xxpart-use-nvram-for-PSI-size.patch
index fd1bfc4..910a5af 100644
--- 
a/target/linux/brcm63xx/patches-3.7/430-MTD-bcm63xxpart-use-nvram-for-PSI-size.patch
+++ 
b/target/linux/brcm63xx/patches-3.7/430-MTD-bcm63xxpart-use-nvram-for-PSI-size.patch
@@ -15,9 +15,9 @@ Subject: [PATCH 62/79] MTD: bcm63xxpart: use nvram for PSI 
size
  
 +#include <asm/mach-bcm63xx/bcm63xx_nvram.h>
  #include <linux/bcm963xx_tag.h>
- #include <asm/mach-bcm63xx/board_bcm963xx.h>
+ #include <asm/mach-bcm63xx/bcm63xx_board.h>
  
-@@ -90,7 +91,8 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -64,7 +65,8 @@ static int bcm63xx_parse_cfe_partitions(
                              BCM63XX_CFE_BLOCK_SIZE);
  
        cfelen = cfe_erasesize;
diff --git 
a/target/linux/brcm63xx/patches-3.7/432-BCM63XX-allow-providing-fixup-data-in-board-data.patch
 
b/target/linux/brcm63xx/patches-3.7/432-BCM63XX-allow-providing-fixup-data-in-board-data.patch
index 033a8a5..d2c2289 100644
--- 
a/target/linux/brcm63xx/patches-3.7/432-BCM63XX-allow-providing-fixup-data-in-board-data.patch
+++ 
b/target/linux/brcm63xx/patches-3.7/432-BCM63XX-allow-providing-fixup-data-in-board-data.patch
@@ -18,7 +18,7 @@ Subject: [PATCH 58/72] BCM63XX: allow providing fixup data in 
board data
  
  #include <uapi/linux/bcm963xx_tag.h>
  
-@@ -907,6 +908,7 @@ int __init board_register_devices(void)
+@@ -909,6 +910,7 @@ int __init board_register_devices(void)
  {
        int button_count = 0;
        int led_count = 0;
@@ -26,7 +26,7 @@ Subject: [PATCH 58/72] BCM63XX: allow providing fixup data in 
board data
  
        if (board.has_uart0)
                bcm63xx_uart_register(0);
-@@ -945,7 +947,8 @@ int __init board_register_devices(void)
+@@ -947,7 +949,8 @@ int __init board_register_devices(void)
         * do this after registering enet devices
         */
  #ifdef CONFIG_SSB_PCIHOST
@@ -36,7 +36,7 @@ Subject: [PATCH 58/72] BCM63XX: allow providing fixup data in 
board data
                memcpy(bcm63xx_sprom.et0mac, bcm63xx_sprom.il0mac, ETH_ALEN);
                memcpy(bcm63xx_sprom.et1mac, bcm63xx_sprom.il0mac, ETH_ALEN);
                if (ssb_arch_register_fallback_sprom(
-@@ -987,5 +990,9 @@ int __init board_register_devices(void)
+@@ -989,5 +992,9 @@ int __init board_register_devices(void)
                platform_device_register(&bcm63xx_gpio_keys_device);
        }
  
diff --git 
a/target/linux/brcm63xx/patches-3.7/436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch
 
b/target/linux/brcm63xx/patches-3.7/436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch
index af2bb75..1c14989 100644
--- 
a/target/linux/brcm63xx/patches-3.7/436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch
+++ 
b/target/linux/brcm63xx/patches-3.7/436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch
@@ -8,7 +8,7 @@ contained in flash.
 
 --- a/drivers/mtd/bcm63xxpart.c
 +++ b/drivers/mtd/bcm63xxpart.c
-@@ -76,10 +76,12 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -50,10 +50,12 @@ static int bcm63xx_parse_cfe_partitions(
        struct mtd_partition *parts;
        int ret;
        size_t retlen;
@@ -22,7 +22,7 @@ contained in flash.
        int i;
        u32 computed_crc;
        bool rootfs_first = false;
-@@ -93,6 +95,24 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -67,6 +69,24 @@ static int bcm63xx_parse_cfe_partitions(
        cfelen = cfe_erasesize;
        nvramlen = bcm63xx_nvram_get_psi_size() * 1024;
        nvramlen = roundup(nvramlen, cfe_erasesize);
@@ -47,7 +47,7 @@ contained in flash.
  
        /* Allocate memory for buffer */
        buf = vmalloc(sizeof(struct bcm_tag));
-@@ -144,7 +164,7 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -118,7 +138,7 @@ static int bcm63xx_parse_cfe_partitions(
                rootfsaddr = 0;
                spareaddr = cfelen;
        }
@@ -56,7 +56,7 @@ contained in flash.
  
        /* Determine number of partitions */
        if (rootfslen > 0)
-@@ -153,6 +173,12 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -127,6 +147,12 @@ static int bcm63xx_parse_cfe_partitions(
        if (kernellen > 0)
                nrparts++;
  
@@ -69,7 +69,7 @@ contained in flash.
        /* Ask kernel for more memory */
        parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL);
        if (!parts) {
-@@ -190,15 +216,32 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -164,15 +190,32 @@ static int bcm63xx_parse_cfe_partitions(
                curpart++;
        }
  
diff --git 
a/target/linux/brcm63xx/patches-3.7/437-MIPS-BCM63XX-pass-caldata-info-to-flash.patch
 
b/target/linux/brcm63xx/patches-3.7/437-MIPS-BCM63XX-pass-caldata-info-to-flash.patch
index fb3b4f0..6781cf8 100644
--- 
a/target/linux/brcm63xx/patches-3.7/437-MIPS-BCM63XX-pass-caldata-info-to-flash.patch
+++ 
b/target/linux/brcm63xx/patches-3.7/437-MIPS-BCM63XX-pass-caldata-info-to-flash.patch
@@ -11,7 +11,7 @@ Subject: [PATCH 69/80] MIPS: BCM63XX: pass caldata info to 
flash
 
 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -966,7 +966,7 @@ int __init board_register_devices(void)
+@@ -968,7 +968,7 @@ int __init board_register_devices(void)
        if (board.num_spis)
                spi_register_board_info(board.spis, board.num_spis);
  
diff --git 
a/target/linux/brcm63xx/patches-3.7/444-BCM63XX-add-endian-check-for-ath9k.patch
 
b/target/linux/brcm63xx/patches-3.7/444-BCM63XX-add-endian-check-for-ath9k.patch
index 2127bf3..1e6683e 100644
--- 
a/target/linux/brcm63xx/patches-3.7/444-BCM63XX-add-endian-check-for-ath9k.patch
+++ 
b/target/linux/brcm63xx/patches-3.7/444-BCM63XX-add-endian-check-for-ath9k.patch
@@ -41,7 +41,7 @@ Subject: [PATCH] BCM63XX: add endian check for ath9k
                return;
 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -992,7 +992,8 @@ int __init board_register_devices(void)
+@@ -994,7 +994,8 @@ int __init board_register_devices(void)
  
        /* register any fixups */
        for (i = 0; i < board.has_caldata; i++)
diff --git 
a/target/linux/brcm63xx/patches-3.7/445-BCM63XX-add-led-pin-for-ath9k.patch 
b/target/linux/brcm63xx/patches-3.7/445-BCM63XX-add-led-pin-for-ath9k.patch
index cb724e6..4cc34f3 100644
--- a/target/linux/brcm63xx/patches-3.7/445-BCM63XX-add-led-pin-for-ath9k.patch
+++ b/target/linux/brcm63xx/patches-3.7/445-BCM63XX-add-led-pin-for-ath9k.patch
@@ -2,7 +2,7 @@ From: Álvaro Fernández Rojas <[email protected]>
 Subject: BCM63XX: add led pin for ath9k
 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -993,7 +993,7 @@ int __init board_register_devices(void)
+@@ -995,7 +995,7 @@ int __init board_register_devices(void)
        /* register any fixups */
        for (i = 0; i < board.has_caldata; i++)
                pci_enable_ath9k_fixup(board.caldata[i].slot, 
board.caldata[i].caldata_offset,
diff --git 
a/target/linux/brcm63xx/patches-3.7/446-BCM63XX-add-a-fixup-for-rt2x00-devices.patch
 
b/target/linux/brcm63xx/patches-3.7/446-BCM63XX-add-a-fixup-for-rt2x00-devices.patch
index 033cdb4..47fcb59 100644
--- 
a/target/linux/brcm63xx/patches-3.7/446-BCM63XX-add-a-fixup-for-rt2x00-devices.patch
+++ 
b/target/linux/brcm63xx/patches-3.7/446-BCM63XX-add-a-fixup-for-rt2x00-devices.patch
@@ -36,7 +36,7 @@ Subject: [PATCH 72/72] 
446-BCM63XX-add-a-fixup-for-rt2x00-devices
  
  #include <uapi/linux/bcm963xx_tag.h>
  
-@@ -991,9 +992,19 @@ int __init board_register_devices(void)
+@@ -993,9 +994,19 @@ int __init board_register_devices(void)
        }
  
        /* register any fixups */
diff --git 
a/target/linux/brcm63xx/patches-3.7/520-bcm63xx-add-support-for-96368MVWG-board.patch
 
b/target/linux/brcm63xx/patches-3.7/520-bcm63xx-add-support-for-96368MVWG-board.patch
index c3b2c16..d5df5c3 100644
--- 
a/target/linux/brcm63xx/patches-3.7/520-bcm63xx-add-support-for-96368MVWG-board.patch
+++ 
b/target/linux/brcm63xx/patches-3.7/520-bcm63xx-add-support-for-96368MVWG-board.patch
@@ -100,7 +100,7 @@ Subject: [PATCH 32/63] bcm63xx: add support for 96368MVWG 
board.
  };
  
  /*
-@@ -2409,12 +2485,25 @@ void __init board_prom_init(void)
+@@ -2411,12 +2487,25 @@ void __init board_prom_init(void)
                bcm63xx_pci_enabled = 1;
                if (BCMCPU_IS_6348())
                        val |= GPIO_MODE_6348_G2_PCI;
diff --git a/target/linux/brcm63xx/patches-3.7/554-board_hw556.patch 
b/target/linux/brcm63xx/patches-3.7/554-board_hw556.patch
index 55aadee..12bfd7e 100644
--- a/target/linux/brcm63xx/patches-3.7/554-board_hw556.patch
+++ b/target/linux/brcm63xx/patches-3.7/554-board_hw556.patch
@@ -433,7 +433,7 @@
  
 --- a/drivers/mtd/bcm63xxpart.c
 +++ b/drivers/mtd/bcm63xxpart.c
-@@ -93,6 +93,11 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -67,6 +67,11 @@ static int bcm63xx_parse_cfe_partitions(
                              BCM63XX_CFE_BLOCK_SIZE);
  
        cfelen = cfe_erasesize;
diff --git a/target/linux/brcm63xx/patches-3.8/311-cfe_version_mod.patch 
b/target/linux/brcm63xx/patches-3.8/311-cfe_version_mod.patch
index a05b9a5..8fb657d 100644
--- a/target/linux/brcm63xx/patches-3.8/311-cfe_version_mod.patch
+++ b/target/linux/brcm63xx/patches-3.8/311-cfe_version_mod.patch
@@ -1,26 +1,90 @@
 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -798,6 +798,8 @@ void __init board_prom_init(void)
-       if (!memcmp(cfe, "cfe-v", 5))
-               snprintf(cfe_version, sizeof(cfe_version), "%u.%u.%u-%u.%u",
-                        cfe[5], cfe[6], cfe[7], cfe[8], cfe[9]);
+@@ -795,9 +795,13 @@ void __init board_prom_init(void)
+ 
+       /* dump cfe version */
+       cfe = boot_addr + BCM963XX_CFE_VERSION_OFFSET;
+-      if (!memcmp(cfe, "cfe-v", 5))
+-              snprintf(cfe_version, sizeof(cfe_version), "%u.%u.%u-%u.%u",
+-                       cfe[5], cfe[6], cfe[7], cfe[8], cfe[9]);
++      if (!memcmp(cfe, "cfe-vd", 6))
++              snprintf(cfe_version, 11, "%s", (char *) &cfe[5]);
++      else if (!memcmp(cfe, "cfe-v", 5))
++              snprintf(cfe_version, sizeof(cfe_version), "%u.%u.%u-%u.%u-%u",
++                      cfe[5], cfe[6], cfe[7], cfe[8], cfe[9], cfe[10]);
 +      else if (!memcmp(cfe, "cfe-", 4))
-+              snprintf(cfe_version, 16, "%s", (char *) &cfe[4]);
++              snprintf(cfe_version, 12, "%s", (char *) &cfe[4]);
        else
                strcpy(cfe_version, "unknown");
        printk(KERN_INFO PFX "CFE version: %s\n", cfe_version);
+--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_board.h
++++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_board.h
+@@ -1,6 +1,8 @@
+ #ifndef BCM63XX_BOARD_H_
+ #define BCM63XX_BOARD_H_
+ 
++#include <asm/bootinfo.h>
++
+ const char *board_get_name(void);
+ 
+ void board_prom_init(void);
+@@ -9,4 +11,8 @@ void board_setup(void);
+ 
+ int board_register_devices(void);
+ 
++static inline bool bcm63xx_is_cfe_present(void) {
++      return fw_arg3 == 0x43464531;
++}
++
+ #endif /* ! BCM63XX_BOARD_H_ */
 --- a/drivers/mtd/bcm63xxpart.c
 +++ b/drivers/mtd/bcm63xxpart.c
-@@ -54,10 +54,10 @@ static int bcm63xx_detect_cfe(struct mtd
-       if (ret)
-               return ret;
+@@ -33,38 +33,12 @@
+ #include <linux/mtd/partitions.h>
  
--      if (strncmp("cfe-v", buf, 5) == 0)
-+      if (strncmp("cfe-", buf, 4) == 0)
-               return 0;
+ #include <linux/bcm963xx_tag.h>
+-#include <asm/mach-bcm63xx/board_bcm963xx.h>
++#include <asm/mach-bcm63xx/bcm63xx_board.h>
  
+ #define BCM63XX_EXTENDED_SIZE 0xBFC00000      /* Extended flash address */
+ 
+ #define BCM63XX_CFE_BLOCK_SIZE        0x10000         /* always at least 
64KiB */
+ 
+-#define BCM63XX_CFE_MAGIC_OFFSET 0x4e0
+-
+-static int bcm63xx_detect_cfe(struct mtd_info *master)
+-{
+-      char buf[9];
+-      int ret;
+-      size_t retlen;
+-
+-      ret = mtd_read(master, BCM963XX_CFE_VERSION_OFFSET, 5, &retlen,
+-                     (void *)buf);
+-      buf[retlen] = 0;
+-
+-      if (ret)
+-              return ret;
+-
+-      if (strncmp("cfe-v", buf, 5) == 0)
+-              return 0;
+-
 -      /* very old CFE's do not have the cfe-v string, so check for magic */
-+      /* very old CFE's do not have the cfe- string, so check for magic */
-       ret = mtd_read(master, BCM63XX_CFE_MAGIC_OFFSET, 8, &retlen,
-                      (void *)buf);
-       buf[retlen] = 0;
+-      ret = mtd_read(master, BCM63XX_CFE_MAGIC_OFFSET, 8, &retlen,
+-                     (void *)buf);
+-      buf[retlen] = 0;
+-
+-      return strncmp("CFE1CFE1", buf, 8);
+-}
+-
+ static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,
+                                       struct mtd_partition **pparts,
+                                       struct mtd_part_parser_data *data)
+@@ -83,7 +57,7 @@ static int bcm63xx_parse_cfe_partitions(
+       u32 computed_crc;
+       bool rootfs_first = false;
+ 
+-      if (bcm63xx_detect_cfe(master))
++      if (!bcm63xx_is_cfe_present())
+               return -EINVAL;
+ 
+       cfe_erasesize = max_t(uint32_t, master->erasesize,
diff --git 
a/target/linux/brcm63xx/patches-3.8/405-bcm963xx_real_rootfs_length.patch 
b/target/linux/brcm63xx/patches-3.8/405-bcm963xx_real_rootfs_length.patch
index 955c32f..f17751e 100644
--- a/target/linux/brcm63xx/patches-3.8/405-bcm963xx_real_rootfs_length.patch
+++ b/target/linux/brcm63xx/patches-3.8/405-bcm963xx_real_rootfs_length.patch
@@ -15,7 +15,7 @@
        /* 240-255: Unused at present */
 --- a/drivers/mtd/bcm63xxpart.c
 +++ b/drivers/mtd/bcm63xxpart.c
-@@ -131,7 +131,8 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -105,7 +105,8 @@ static int bcm63xx_parse_cfe_partitions(
                } else {
                        /* OpenWrt layout */
                        rootfsaddr = kerneladdr + kernellen;
diff --git 
a/target/linux/brcm63xx/patches-3.8/408-6358-enet1-external-mii-clk.patch 
b/target/linux/brcm63xx/patches-3.8/408-6358-enet1-external-mii-clk.patch
index 4ead53f..0b0a004 100644
--- a/target/linux/brcm63xx/patches-3.8/408-6358-enet1-external-mii-clk.patch
+++ b/target/linux/brcm63xx/patches-3.8/408-6358-enet1-external-mii-clk.patch
@@ -1,6 +1,6 @@
 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -859,6 +859,8 @@ void __init board_prom_init(void)
+@@ -861,6 +861,8 @@ void __init board_prom_init(void)
                if (BCMCPU_IS_6348())
                        val |= GPIO_MODE_6348_G3_EXT_MII |
                                GPIO_MODE_6348_G0_EXT_MII;
diff --git 
a/target/linux/brcm63xx/patches-3.8/415-bcm63xx_enet-add-support-for-bcm6368-internal-ethern.patch
 
b/target/linux/brcm63xx/patches-3.8/415-bcm63xx_enet-add-support-for-bcm6368-internal-ethern.patch
index ef61519..a0de0fc 100644
--- 
a/target/linux/brcm63xx/patches-3.8/415-bcm63xx_enet-add-support-for-bcm6368-internal-ethern.patch
+++ 
b/target/linux/brcm63xx/patches-3.8/415-bcm63xx_enet-add-support-for-bcm6368-internal-ethern.patch
@@ -13,7 +13,7 @@ Subject: [PATCH 31/63] bcm63xx_enet: add support for bcm6368 
internal ethernet s
 
 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -927,6 +927,10 @@ int __init board_register_devices(void)
+@@ -929,6 +929,10 @@ int __init board_register_devices(void)
        if (board.has_usbd)
                bcm63xx_usbd_register(&board.usbd);
  
diff --git 
a/target/linux/brcm63xx/patches-3.8/425-MIPS-BCM63XX-add-HS-SPI-platform-device-and-register.patch
 
b/target/linux/brcm63xx/patches-3.8/425-MIPS-BCM63XX-add-HS-SPI-platform-device-and-register.patch
index babe04a..9f6a4b4 100644
--- 
a/target/linux/brcm63xx/patches-3.8/425-MIPS-BCM63XX-add-HS-SPI-platform-device-and-register.patch
+++ 
b/target/linux/brcm63xx/patches-3.8/425-MIPS-BCM63XX-add-HS-SPI-platform-device-and-register.patch
@@ -37,7 +37,7 @@ Signed-off-by: Jonas Gorski <[email protected]>
  #include <bcm63xx_dev_pcmcia.h>
  #include <bcm63xx_dev_spi.h>
  #include <bcm63xx_dev_usb_ehci.h>
-@@ -952,6 +953,7 @@ int __init board_register_devices(void)
+@@ -954,6 +955,7 @@ int __init board_register_devices(void)
                        pr_err(PFX "failed to register fallback SPROM\n");
        }
  #endif
diff --git 
a/target/linux/brcm63xx/patches-3.8/430-MTD-bcm63xxpart-use-nvram-for-PSI-size.patch
 
b/target/linux/brcm63xx/patches-3.8/430-MTD-bcm63xxpart-use-nvram-for-PSI-size.patch
index fd1bfc4..910a5af 100644
--- 
a/target/linux/brcm63xx/patches-3.8/430-MTD-bcm63xxpart-use-nvram-for-PSI-size.patch
+++ 
b/target/linux/brcm63xx/patches-3.8/430-MTD-bcm63xxpart-use-nvram-for-PSI-size.patch
@@ -15,9 +15,9 @@ Subject: [PATCH 62/79] MTD: bcm63xxpart: use nvram for PSI 
size
  
 +#include <asm/mach-bcm63xx/bcm63xx_nvram.h>
  #include <linux/bcm963xx_tag.h>
- #include <asm/mach-bcm63xx/board_bcm963xx.h>
+ #include <asm/mach-bcm63xx/bcm63xx_board.h>
  
-@@ -90,7 +91,8 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -64,7 +65,8 @@ static int bcm63xx_parse_cfe_partitions(
                              BCM63XX_CFE_BLOCK_SIZE);
  
        cfelen = cfe_erasesize;
diff --git 
a/target/linux/brcm63xx/patches-3.8/432-BCM63XX-allow-providing-fixup-data-in-board-data.patch
 
b/target/linux/brcm63xx/patches-3.8/432-BCM63XX-allow-providing-fixup-data-in-board-data.patch
index 06d0b1b..a37175d 100644
--- 
a/target/linux/brcm63xx/patches-3.8/432-BCM63XX-allow-providing-fixup-data-in-board-data.patch
+++ 
b/target/linux/brcm63xx/patches-3.8/432-BCM63XX-allow-providing-fixup-data-in-board-data.patch
@@ -18,7 +18,7 @@ Subject: [PATCH 58/72] BCM63XX: allow providing fixup data in 
board data
  
  #include <uapi/linux/bcm963xx_tag.h>
  
-@@ -907,6 +908,7 @@ int __init board_register_devices(void)
+@@ -909,6 +910,7 @@ int __init board_register_devices(void)
  {
        int button_count = 0;
        int led_count = 0;
@@ -26,7 +26,7 @@ Subject: [PATCH 58/72] BCM63XX: allow providing fixup data in 
board data
  
        if (board.has_uart0)
                bcm63xx_uart_register(0);
-@@ -945,7 +947,8 @@ int __init board_register_devices(void)
+@@ -947,7 +949,8 @@ int __init board_register_devices(void)
         * do this after registering enet devices
         */
  #ifdef CONFIG_SSB_PCIHOST
@@ -36,7 +36,7 @@ Subject: [PATCH 58/72] BCM63XX: allow providing fixup data in 
board data
                memcpy(bcm63xx_sprom.et0mac, bcm63xx_sprom.il0mac, ETH_ALEN);
                memcpy(bcm63xx_sprom.et1mac, bcm63xx_sprom.il0mac, ETH_ALEN);
                if (ssb_arch_register_fallback_sprom(
-@@ -987,5 +990,9 @@ int __init board_register_devices(void)
+@@ -989,5 +992,9 @@ int __init board_register_devices(void)
                platform_device_register(&bcm63xx_gpio_keys_device);
        }
  
diff --git 
a/target/linux/brcm63xx/patches-3.8/436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch
 
b/target/linux/brcm63xx/patches-3.8/436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch
index 3b34eec..0ed688f 100644
--- 
a/target/linux/brcm63xx/patches-3.8/436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch
+++ 
b/target/linux/brcm63xx/patches-3.8/436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch
@@ -7,7 +7,7 @@ contained in flash.
 
 --- a/drivers/mtd/bcm63xxpart.c
 +++ b/drivers/mtd/bcm63xxpart.c
-@@ -76,10 +76,12 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -50,10 +50,12 @@ static int bcm63xx_parse_cfe_partitions(
        struct mtd_partition *parts;
        int ret;
        size_t retlen;
@@ -21,7 +21,7 @@ contained in flash.
        int i;
        u32 computed_crc;
        bool rootfs_first = false;
-@@ -93,6 +95,24 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -67,6 +69,24 @@ static int bcm63xx_parse_cfe_partitions(
        cfelen = cfe_erasesize;
        nvramlen = bcm63xx_nvram_get_psi_size() * 1024;
        nvramlen = roundup(nvramlen, cfe_erasesize);
@@ -46,7 +46,7 @@ contained in flash.
  
        /* Allocate memory for buffer */
        buf = vmalloc(sizeof(struct bcm_tag));
-@@ -144,7 +164,7 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -118,7 +138,7 @@ static int bcm63xx_parse_cfe_partitions(
                rootfsaddr = 0;
                spareaddr = cfelen;
        }
@@ -55,7 +55,7 @@ contained in flash.
  
        /* Determine number of partitions */
        if (rootfslen > 0)
-@@ -153,6 +173,12 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -127,6 +147,12 @@ static int bcm63xx_parse_cfe_partitions(
        if (kernellen > 0)
                nrparts++;
  
@@ -68,7 +68,7 @@ contained in flash.
        /* Ask kernel for more memory */
        parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL);
        if (!parts) {
-@@ -190,15 +216,32 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -164,15 +190,32 @@ static int bcm63xx_parse_cfe_partitions(
                curpart++;
        }
  
diff --git 
a/target/linux/brcm63xx/patches-3.8/437-MIPS-BCM63XX-pass-caldata-info-to-flash.patch
 
b/target/linux/brcm63xx/patches-3.8/437-MIPS-BCM63XX-pass-caldata-info-to-flash.patch
index fb3b4f0..6781cf8 100644
--- 
a/target/linux/brcm63xx/patches-3.8/437-MIPS-BCM63XX-pass-caldata-info-to-flash.patch
+++ 
b/target/linux/brcm63xx/patches-3.8/437-MIPS-BCM63XX-pass-caldata-info-to-flash.patch
@@ -11,7 +11,7 @@ Subject: [PATCH 69/80] MIPS: BCM63XX: pass caldata info to 
flash
 
 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -966,7 +966,7 @@ int __init board_register_devices(void)
+@@ -968,7 +968,7 @@ int __init board_register_devices(void)
        if (board.num_spis)
                spi_register_board_info(board.spis, board.num_spis);
  
diff --git 
a/target/linux/brcm63xx/patches-3.8/444-BCM63XX-add-endian-check-for-ath9k.patch
 
b/target/linux/brcm63xx/patches-3.8/444-BCM63XX-add-endian-check-for-ath9k.patch
index bdcb3e0..929de1a 100644
--- 
a/target/linux/brcm63xx/patches-3.8/444-BCM63XX-add-endian-check-for-ath9k.patch
+++ 
b/target/linux/brcm63xx/patches-3.8/444-BCM63XX-add-endian-check-for-ath9k.patch
@@ -39,7 +39,7 @@
                return;
 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -992,7 +992,8 @@ int __init board_register_devices(void)
+@@ -994,7 +994,8 @@ int __init board_register_devices(void)
  
        /* register any fixups */
        for (i = 0; i < board.has_caldata; i++)
diff --git 
a/target/linux/brcm63xx/patches-3.8/445-BCM63XX-add-led-pin-for-ath9k.patch 
b/target/linux/brcm63xx/patches-3.8/445-BCM63XX-add-led-pin-for-ath9k.patch
index 4f77179..a902fae 100644
--- a/target/linux/brcm63xx/patches-3.8/445-BCM63XX-add-led-pin-for-ath9k.patch
+++ b/target/linux/brcm63xx/patches-3.8/445-BCM63XX-add-led-pin-for-ath9k.patch
@@ -1,6 +1,6 @@
 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -993,7 +993,7 @@ int __init board_register_devices(void)
+@@ -995,7 +995,7 @@ int __init board_register_devices(void)
        /* register any fixups */
        for (i = 0; i < board.has_caldata; i++)
                pci_enable_ath9k_fixup(board.caldata[i].slot, 
board.caldata[i].caldata_offset,
diff --git 
a/target/linux/brcm63xx/patches-3.8/446-BCM63XX-add-a-fixup-for-rt2x00-devices.patch
 
b/target/linux/brcm63xx/patches-3.8/446-BCM63XX-add-a-fixup-for-rt2x00-devices.patch
index 039e988..4444521 100644
--- 
a/target/linux/brcm63xx/patches-3.8/446-BCM63XX-add-a-fixup-for-rt2x00-devices.patch
+++ 
b/target/linux/brcm63xx/patches-3.8/446-BCM63XX-add-a-fixup-for-rt2x00-devices.patch
@@ -36,7 +36,7 @@ Subject: [PATCH 72/72] 
446-BCM63XX-add-a-fixup-for-rt2x00-devices
  
  #include <uapi/linux/bcm963xx_tag.h>
  
-@@ -991,9 +992,19 @@ int __init board_register_devices(void)
+@@ -993,9 +994,19 @@ int __init board_register_devices(void)
        }
  
        /* register any fixups */
diff --git 
a/target/linux/brcm63xx/patches-3.8/520-bcm63xx-add-support-for-96368MVWG-board.patch
 
b/target/linux/brcm63xx/patches-3.8/520-bcm63xx-add-support-for-96368MVWG-board.patch
index c3b2c16..d5df5c3 100644
--- 
a/target/linux/brcm63xx/patches-3.8/520-bcm63xx-add-support-for-96368MVWG-board.patch
+++ 
b/target/linux/brcm63xx/patches-3.8/520-bcm63xx-add-support-for-96368MVWG-board.patch
@@ -100,7 +100,7 @@ Subject: [PATCH 32/63] bcm63xx: add support for 96368MVWG 
board.
  };
  
  /*
-@@ -2409,12 +2485,25 @@ void __init board_prom_init(void)
+@@ -2411,12 +2487,25 @@ void __init board_prom_init(void)
                bcm63xx_pci_enabled = 1;
                if (BCMCPU_IS_6348())
                        val |= GPIO_MODE_6348_G2_PCI;
diff --git a/target/linux/brcm63xx/patches-3.8/554-board_hw556.patch 
b/target/linux/brcm63xx/patches-3.8/554-board_hw556.patch
index 55aadee..12bfd7e 100644
--- a/target/linux/brcm63xx/patches-3.8/554-board_hw556.patch
+++ b/target/linux/brcm63xx/patches-3.8/554-board_hw556.patch
@@ -433,7 +433,7 @@
  
 --- a/drivers/mtd/bcm63xxpart.c
 +++ b/drivers/mtd/bcm63xxpart.c
-@@ -93,6 +93,11 @@ static int bcm63xx_parse_cfe_partitions(
+@@ -67,6 +67,11 @@ static int bcm63xx_parse_cfe_partitions(
                              BCM63XX_CFE_BLOCK_SIZE);
  
        cfelen = cfe_erasesize;

_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to