50 lines
1.4 KiB
Diff
50 lines
1.4 KiB
Diff
|
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;
|
||
|
}
|