From 404cd71e7c4cb3b69a53db4876c0b2cbf27c3036 Mon Sep 17 00:00:00 2001 From: jogo Date: Mon, 4 Feb 2013 10:19:50 +0000 Subject: bcm63xx: add support for linux 3.7 Based on 3.7.6. Signed-off-by: Jonas Gorski git-svn-id: svn://svn.openwrt.org/openwrt/trunk@35481 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- ...PS-BCM63XX-fix-nvram-checksum-calculation.patch | 66 ++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 target/linux/brcm63xx/patches-3.7/005-MIPS-BCM63XX-fix-nvram-checksum-calculation.patch (limited to 'target/linux/brcm63xx/patches-3.7/005-MIPS-BCM63XX-fix-nvram-checksum-calculation.patch') diff --git a/target/linux/brcm63xx/patches-3.7/005-MIPS-BCM63XX-fix-nvram-checksum-calculation.patch b/target/linux/brcm63xx/patches-3.7/005-MIPS-BCM63XX-fix-nvram-checksum-calculation.patch new file mode 100644 index 0000000000..cbe0b96bf0 --- /dev/null +++ b/target/linux/brcm63xx/patches-3.7/005-MIPS-BCM63XX-fix-nvram-checksum-calculation.patch @@ -0,0 +1,66 @@ +From 7180de9a27ce433efc15bc1982b9a9e4ba3c48dc Mon Sep 17 00:00:00 2001 +From: Jonas Gorski +Date: Sat, 10 Nov 2012 02:04:58 +0100 +Subject: [PATCH] MIPS: BCM63XX: fix nvram checksum calculation + +The current checksum calculation code does nothing except checking that +the first byte of nvram is 0 without actually checking the checksum. + +Implement the correct checksum calculation by calculating the crc32 with +the checksum field set to 0. + +Signed-off-by: Jonas Gorski +--- + +This patch depends on the previous nvram patch ("move nvram functions +into their own file"). + + arch/mips/bcm63xx/nvram.c | 23 +++++++++++++---------- + 1 files changed, 13 insertions(+), 10 deletions(-) + +--- a/arch/mips/bcm63xx/nvram.c ++++ b/arch/mips/bcm63xx/nvram.c +@@ -11,6 +11,7 @@ + #define pr_fmt(fmt) "bcm63xx_nvram: " fmt + + #include ++#include + #include + #include + #include +@@ -40,23 +41,25 @@ static int mac_addr_used; + int __init bcm63xx_nvram_init(void *addr) + { + unsigned int check_len; +- u8 *p; +- u32 val; ++ u32 crc, expected_crc; + + /* extract nvram data */ + memcpy(&nvram, addr, sizeof(nvram)); + + /* check checksum before using data */ +- if (nvram.version <= 4) +- check_len = offsetof(struct bcm963xx_nvram, checksum_old); +- else ++ if (nvram.version <= 4) { ++ check_len = offsetof(struct bcm963xx_nvram, reserved3); ++ expected_crc = nvram.checksum_old; ++ nvram.checksum_old = 0; ++ } else { + check_len = sizeof(nvram); +- val = 0; +- p = (u8 *)&nvram; ++ expected_crc = nvram.checksum_high; ++ nvram.checksum_high = 0; ++ } + +- while (check_len--) +- val += *p; +- if (val) ++ crc = crc32_le(~0, (u8 *)&nvram, check_len); ++ ++ if (crc != expected_crc) + return -EINVAL; + + return 0; -- cgit v1.2.3