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
owl
Jonas Gorski 2013-02-10 12:31:31 +00:00
parent de123c4409
commit 200359a520
8 changed files with 108 additions and 10 deletions

View File

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

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

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

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

View File

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

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

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

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