bcm63xx: handle huawei nvram layout

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>

SVN-Revision: 35533
master
Jonas Gorski 12 years ago
parent de123c4409
commit 200359a520
  1. 49
      target/linux/brcm63xx/patches-3.7/108-MIPS-BCM63XX-handle-huawei-nvram-layout.patch
  2. 2
      target/linux/brcm63xx/patches-3.7/429-MIPS-BCM63XX-export-PSI-size-from-nvram.patch
  3. 4
      target/linux/brcm63xx/patches-3.7/556-board_rta770w.patch
  4. 4
      target/linux/brcm63xx/patches-3.7/801-ssb_export_fallback_sprom.patch
  5. 49
      target/linux/brcm63xx/patches-3.8/119-MIPS-BCM63XX-handle-huawei-nvram-layout.patch
  6. 2
      target/linux/brcm63xx/patches-3.8/429-MIPS-BCM63XX-export-PSI-size-from-nvram.patch
  7. 4
      target/linux/brcm63xx/patches-3.8/556-board_rta770w.patch
  8. 4
      target/linux/brcm63xx/patches-3.8/801-ssb_export_fallback_sprom.patch

@ -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;
}

@ -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);

@ -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,

@ -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,
};

@ -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;
}

@ -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);

@ -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,

@ -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,
};

Loading…
Cancel
Save