bcm63xx: handle huawei nvram layout
authorjogo <jogo@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sun, 10 Feb 2013 12:31:31 +0000 (12:31 +0000)
committerjogo <jogo@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sun, 10 Feb 2013 12:31:31 +0000 (12:31 +0000)
Use a different length for calculating the nvram checksum on hauwei
boards. Fixes boot on HW553 and HW556.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35533 3c298f89-4303-0410-b956-a3cf2f4a3e73

target/linux/brcm63xx/patches-3.7/108-MIPS-BCM63XX-handle-huawei-nvram-layout.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.7/429-MIPS-BCM63XX-export-PSI-size-from-nvram.patch
target/linux/brcm63xx/patches-3.7/556-board_rta770w.patch
target/linux/brcm63xx/patches-3.7/801-ssb_export_fallback_sprom.patch
target/linux/brcm63xx/patches-3.8/119-MIPS-BCM63XX-handle-huawei-nvram-layout.patch [new file with mode: 0644]
target/linux/brcm63xx/patches-3.8/429-MIPS-BCM63XX-export-PSI-size-from-nvram.patch
target/linux/brcm63xx/patches-3.8/556-board_rta770w.patch
target/linux/brcm63xx/patches-3.8/801-ssb_export_fallback_sprom.patch

diff --git a/target/linux/brcm63xx/patches-3.7/108-MIPS-BCM63XX-handle-huawei-nvram-layout.patch b/target/linux/brcm63xx/patches-3.7/108-MIPS-BCM63XX-handle-huawei-nvram-layout.patch
new file mode 100644 (file)
index 0000000..14d8339
--- /dev/null
@@ -0,0 +1,49 @@
+From fb1e2c8a1073297f4674ca90c7d533de5187d158 Mon Sep 17 00:00:00 2001
+From: Jonas Gorski <jogo@openwrt.org>
+Date: Sat, 9 Feb 2013 12:09:53 +0100
+Subject: [PATCH] MIPS: BCM63XX: handle huawei nvram layout
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Huawei uses a custom nvram layout, extending it with additional 32
+byte field. This pushes also the checksum further, causing it to
+always fail the check.
+
+Add an additional crc check for handling this modified nvram layout
+based on the different size.
+
+Reported-by: Álvaro Fernández Rojas <noltari@gmail.com>
+Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+---
+ arch/mips/bcm63xx/nvram.c |   18 +++++++++++++++++-
+ 1 file changed, 17 insertions(+), 1 deletion(-)
+
+--- a/arch/mips/bcm63xx/nvram.c
++++ b/arch/mips/bcm63xx/nvram.c
+@@ -59,8 +59,24 @@ int __init bcm63xx_nvram_init(void *addr
+       crc = crc32_le(~0, (u8 *)&nvram, check_len);
+-      if (crc != expected_crc)
++      if (crc != expected_crc) {
++              /* huawei uses a modified nvram that is 32 bytes longer */
++              if (nvram.version == 2 && !strncmp(nvram.name, "HW5", 3)) {
++                      check_len += 32;
++
++                      /* restore old value */
++                      nvram.checksum_old = expected_crc;
++                      expected_crc = *(u32 *)&nvram.reserved3[28];
++                      /* zero the checksum field */
++                      memset(&nvram.reserved3[28], 0, 4);
++
++                      crc = crc32_le(~0, (u8 *)&nvram, check_len);
++
++                      if (crc == expected_crc)
++                              return 0;
++              }
+               return -EINVAL;
++      }
+       return 0;
+ }
index bad4c4b..3c3559a 100644 (file)
@@ -20,7 +20,7 @@ Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
  static struct bcm963xx_nvram nvram;
  static int mac_addr_used;
  
-@@ -105,3 +107,12 @@ int bcm63xx_nvram_get_mac_address(u8 *ma
+@@ -121,3 +123,12 @@ int bcm63xx_nvram_get_mac_address(u8 *ma
        return 0;
  }
  EXPORT_SYMBOL(bcm63xx_nvram_get_mac_address);
index e0eedad..7528bd8 100644 (file)
@@ -1,6 +1,6 @@
 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -796,6 +796,60 @@
+@@ -803,6 +803,60 @@ static struct board_info __initdata boar
                },
        },
  };
@@ -61,7 +61,7 @@
  #endif
  
  /*
-@@ -3750,6 +3804,7 @@
+@@ -3757,6 +3811,7 @@ static const struct board_info __initcon
  #ifdef CONFIG_BCM63XX_CPU_6345
        &board_96345gw2,
        &board_rta770bw,
index 0d229fe..ef62f44 100644 (file)
@@ -8,7 +8,7 @@
  #include <linux/spi/spi.h>
  #include <linux/spi/spi_gpio.h>
  #include <linux/spi/74x164.h>
-@@ -3818,7 +3819,7 @@ static const struct board_info __initcon
+@@ -3873,7 +3874,7 @@ static const struct board_info __initcon
   * bcm4318 WLAN work
   */
  #ifdef CONFIG_SSB_PCIHOST
@@ -17,7 +17,7 @@
        .revision               = 0x02,
        .board_rev              = 0x17,
        .country_code           = 0x0,
-@@ -3838,6 +3839,7 @@ static struct ssb_sprom bcm63xx_sprom =
+@@ -3893,6 +3894,7 @@ static struct ssb_sprom bcm63xx_sprom =
        .boardflags_lo          = 0x2848,
        .boardflags_hi          = 0x0000,
  };
diff --git a/target/linux/brcm63xx/patches-3.8/119-MIPS-BCM63XX-handle-huawei-nvram-layout.patch b/target/linux/brcm63xx/patches-3.8/119-MIPS-BCM63XX-handle-huawei-nvram-layout.patch
new file mode 100644 (file)
index 0000000..14d8339
--- /dev/null
@@ -0,0 +1,49 @@
+From fb1e2c8a1073297f4674ca90c7d533de5187d158 Mon Sep 17 00:00:00 2001
+From: Jonas Gorski <jogo@openwrt.org>
+Date: Sat, 9 Feb 2013 12:09:53 +0100
+Subject: [PATCH] MIPS: BCM63XX: handle huawei nvram layout
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Huawei uses a custom nvram layout, extending it with additional 32
+byte field. This pushes also the checksum further, causing it to
+always fail the check.
+
+Add an additional crc check for handling this modified nvram layout
+based on the different size.
+
+Reported-by: Álvaro Fernández Rojas <noltari@gmail.com>
+Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+---
+ arch/mips/bcm63xx/nvram.c |   18 +++++++++++++++++-
+ 1 file changed, 17 insertions(+), 1 deletion(-)
+
+--- a/arch/mips/bcm63xx/nvram.c
++++ b/arch/mips/bcm63xx/nvram.c
+@@ -59,8 +59,24 @@ int __init bcm63xx_nvram_init(void *addr
+       crc = crc32_le(~0, (u8 *)&nvram, check_len);
+-      if (crc != expected_crc)
++      if (crc != expected_crc) {
++              /* huawei uses a modified nvram that is 32 bytes longer */
++              if (nvram.version == 2 && !strncmp(nvram.name, "HW5", 3)) {
++                      check_len += 32;
++
++                      /* restore old value */
++                      nvram.checksum_old = expected_crc;
++                      expected_crc = *(u32 *)&nvram.reserved3[28];
++                      /* zero the checksum field */
++                      memset(&nvram.reserved3[28], 0, 4);
++
++                      crc = crc32_le(~0, (u8 *)&nvram, check_len);
++
++                      if (crc == expected_crc)
++                              return 0;
++              }
+               return -EINVAL;
++      }
+       return 0;
+ }
index bad4c4b..3c3559a 100644 (file)
@@ -20,7 +20,7 @@ Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
  static struct bcm963xx_nvram nvram;
  static int mac_addr_used;
  
-@@ -105,3 +107,12 @@ int bcm63xx_nvram_get_mac_address(u8 *ma
+@@ -121,3 +123,12 @@ int bcm63xx_nvram_get_mac_address(u8 *ma
        return 0;
  }
  EXPORT_SYMBOL(bcm63xx_nvram_get_mac_address);
index e0eedad..7528bd8 100644 (file)
@@ -1,6 +1,6 @@
 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
-@@ -796,6 +796,60 @@
+@@ -803,6 +803,60 @@ static struct board_info __initdata boar
                },
        },
  };
@@ -61,7 +61,7 @@
  #endif
  
  /*
-@@ -3750,6 +3804,7 @@
+@@ -3757,6 +3811,7 @@ static const struct board_info __initcon
  #ifdef CONFIG_BCM63XX_CPU_6345
        &board_96345gw2,
        &board_rta770bw,
index 0d229fe..ef62f44 100644 (file)
@@ -8,7 +8,7 @@
  #include <linux/spi/spi.h>
  #include <linux/spi/spi_gpio.h>
  #include <linux/spi/74x164.h>
-@@ -3818,7 +3819,7 @@ static const struct board_info __initcon
+@@ -3873,7 +3874,7 @@ static const struct board_info __initcon
   * bcm4318 WLAN work
   */
  #ifdef CONFIG_SSB_PCIHOST
@@ -17,7 +17,7 @@
        .revision               = 0x02,
        .board_rev              = 0x17,
        .country_code           = 0x0,
-@@ -3838,6 +3839,7 @@ static struct ssb_sprom bcm63xx_sprom =
+@@ -3893,6 +3894,7 @@ static struct ssb_sprom bcm63xx_sprom =
        .boardflags_lo          = 0x2848,
        .boardflags_hi          = 0x0000,
  };