From: Jonas Gorski Date: Sun, 10 Feb 2013 12:31:31 +0000 (+0000) Subject: bcm63xx: handle huawei nvram layout X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=200359a52055687d1edbf71e90d63aab141fd2f5;p=openwrt%2Fstaging%2Fldir.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 SVN-Revision: 35533 --- diff --git a/target/linux/brcm63xx/patches-3.7/108-MIPS-BCM63XX-handle-huawei-nvram-layout.patch b/target/linux/brcm63xx/patches-3.7/108-MIPS-BCM63XX-handle-huawei-nvram-layout.patch new file mode 100644 index 0000000000..14d83394be --- /dev/null +++ b/target/linux/brcm63xx/patches-3.7/108-MIPS-BCM63XX-handle-huawei-nvram-layout.patch @@ -0,0 +1,49 @@ +From fb1e2c8a1073297f4674ca90c7d533de5187d158 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski +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 +Signed-off-by: Jonas Gorski +--- + 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; + } diff --git a/target/linux/brcm63xx/patches-3.7/429-MIPS-BCM63XX-export-PSI-size-from-nvram.patch b/target/linux/brcm63xx/patches-3.7/429-MIPS-BCM63XX-export-PSI-size-from-nvram.patch index bad4c4b9cc..3c3559a178 100644 --- a/target/linux/brcm63xx/patches-3.7/429-MIPS-BCM63XX-export-PSI-size-from-nvram.patch +++ b/target/linux/brcm63xx/patches-3.7/429-MIPS-BCM63XX-export-PSI-size-from-nvram.patch @@ -20,7 +20,7 @@ Signed-off-by: Jonas Gorski 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); diff --git a/target/linux/brcm63xx/patches-3.7/556-board_rta770w.patch b/target/linux/brcm63xx/patches-3.7/556-board_rta770w.patch index e0eedad1e7..7528bd89b2 100644 --- a/target/linux/brcm63xx/patches-3.7/556-board_rta770w.patch +++ b/target/linux/brcm63xx/patches-3.7/556-board_rta770w.patch @@ -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, diff --git a/target/linux/brcm63xx/patches-3.7/801-ssb_export_fallback_sprom.patch b/target/linux/brcm63xx/patches-3.7/801-ssb_export_fallback_sprom.patch index 0d229fe317..ef62f445be 100644 --- a/target/linux/brcm63xx/patches-3.7/801-ssb_export_fallback_sprom.patch +++ b/target/linux/brcm63xx/patches-3.7/801-ssb_export_fallback_sprom.patch @@ -8,7 +8,7 @@ #include #include #include -@@ -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, }; diff --git a/target/linux/brcm63xx/patches-3.8/119-MIPS-BCM63XX-handle-huawei-nvram-layout.patch b/target/linux/brcm63xx/patches-3.8/119-MIPS-BCM63XX-handle-huawei-nvram-layout.patch new file mode 100644 index 0000000000..14d83394be --- /dev/null +++ b/target/linux/brcm63xx/patches-3.8/119-MIPS-BCM63XX-handle-huawei-nvram-layout.patch @@ -0,0 +1,49 @@ +From fb1e2c8a1073297f4674ca90c7d533de5187d158 Mon Sep 17 00:00:00 2001 +From: Jonas Gorski +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 +Signed-off-by: Jonas Gorski +--- + 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; + } diff --git a/target/linux/brcm63xx/patches-3.8/429-MIPS-BCM63XX-export-PSI-size-from-nvram.patch b/target/linux/brcm63xx/patches-3.8/429-MIPS-BCM63XX-export-PSI-size-from-nvram.patch index bad4c4b9cc..3c3559a178 100644 --- a/target/linux/brcm63xx/patches-3.8/429-MIPS-BCM63XX-export-PSI-size-from-nvram.patch +++ b/target/linux/brcm63xx/patches-3.8/429-MIPS-BCM63XX-export-PSI-size-from-nvram.patch @@ -20,7 +20,7 @@ Signed-off-by: Jonas Gorski 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); diff --git a/target/linux/brcm63xx/patches-3.8/556-board_rta770w.patch b/target/linux/brcm63xx/patches-3.8/556-board_rta770w.patch index e0eedad1e7..7528bd89b2 100644 --- a/target/linux/brcm63xx/patches-3.8/556-board_rta770w.patch +++ b/target/linux/brcm63xx/patches-3.8/556-board_rta770w.patch @@ -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, diff --git a/target/linux/brcm63xx/patches-3.8/801-ssb_export_fallback_sprom.patch b/target/linux/brcm63xx/patches-3.8/801-ssb_export_fallback_sprom.patch index 0d229fe317..ef62f445be 100644 --- a/target/linux/brcm63xx/patches-3.8/801-ssb_export_fallback_sprom.patch +++ b/target/linux/brcm63xx/patches-3.8/801-ssb_export_fallback_sprom.patch @@ -8,7 +8,7 @@ #include #include #include -@@ -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, };