mirror of https://github.com/hak5/openwrt-owl.git
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: 35533owl
parent
de123c4409
commit
200359a520
|
@ -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 struct bcm963xx_nvram nvram;
|
||||||
static int mac_addr_used;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(bcm63xx_nvram_get_mac_address);
|
EXPORT_SYMBOL(bcm63xx_nvram_get_mac_address);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
|
--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
|
||||||
+++ b/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
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -3750,6 +3804,7 @@
|
@@ -3757,6 +3811,7 @@ static const struct board_info __initcon
|
||||||
#ifdef CONFIG_BCM63XX_CPU_6345
|
#ifdef CONFIG_BCM63XX_CPU_6345
|
||||||
&board_96345gw2,
|
&board_96345gw2,
|
||||||
&board_rta770bw,
|
&board_rta770bw,
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/spi/spi_gpio.h>
|
#include <linux/spi/spi_gpio.h>
|
||||||
#include <linux/spi/74x164.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
|
* bcm4318 WLAN work
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_SSB_PCIHOST
|
#ifdef CONFIG_SSB_PCIHOST
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
.revision = 0x02,
|
.revision = 0x02,
|
||||||
.board_rev = 0x17,
|
.board_rev = 0x17,
|
||||||
.country_code = 0x0,
|
.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_lo = 0x2848,
|
||||||
.boardflags_hi = 0x0000,
|
.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 struct bcm963xx_nvram nvram;
|
||||||
static int mac_addr_used;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(bcm63xx_nvram_get_mac_address);
|
EXPORT_SYMBOL(bcm63xx_nvram_get_mac_address);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
|
--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
|
||||||
+++ b/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
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -3750,6 +3804,7 @@
|
@@ -3757,6 +3811,7 @@ static const struct board_info __initcon
|
||||||
#ifdef CONFIG_BCM63XX_CPU_6345
|
#ifdef CONFIG_BCM63XX_CPU_6345
|
||||||
&board_96345gw2,
|
&board_96345gw2,
|
||||||
&board_rta770bw,
|
&board_rta770bw,
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/spi/spi_gpio.h>
|
#include <linux/spi/spi_gpio.h>
|
||||||
#include <linux/spi/74x164.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
|
* bcm4318 WLAN work
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_SSB_PCIHOST
|
#ifdef CONFIG_SSB_PCIHOST
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
.revision = 0x02,
|
.revision = 0x02,
|
||||||
.board_rev = 0x17,
|
.board_rev = 0x17,
|
||||||
.country_code = 0x0,
|
.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_lo = 0x2848,
|
||||||
.boardflags_hi = 0x0000,
|
.boardflags_hi = 0x0000,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue