From: Rafał Miłecki Date: Mon, 23 Apr 2018 13:28:54 +0000 (+0200) Subject: brcm47xx: backport upstream patches for Netgear WNR1000 V3 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=23a638ebd1fd7b9a38473efa819c0aaec8870822;p=librecmc%2Flibrecmc.git brcm47xx: backport upstream patches for Netgear WNR1000 V3 This includes fix for reading NVRAM content. (cherry picked from commit b1f5dd34ed84b295a67934a64d2ab309db65b65e) Signed-off-by: Rafał Miłecki --- diff --git a/target/linux/brcm47xx/patches-4.4/033-MIPS-BCM47XX-Add-support-for-Netgear-WNR1000-V3.patch b/target/linux/brcm47xx/patches-4.4/033-MIPS-BCM47XX-Add-support-for-Netgear-WNR1000-V3.patch new file mode 100644 index 0000000000..e4c47605d9 --- /dev/null +++ b/target/linux/brcm47xx/patches-4.4/033-MIPS-BCM47XX-Add-support-for-Netgear-WNR1000-V3.patch @@ -0,0 +1,96 @@ +From 88b882ba0b0b7439d16d2c9df7f111cdf793443b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Sun, 8 Apr 2018 22:39:15 +0200 +Subject: [PATCH] MIPS: BCM47XX: Add support for Netgear WNR1000 V3 + +This adds support for detecting this model board and registers some LEDs +and buttons. + +There are two uncommon things regarding this device: +1) It can use two different "board_id" ID values. + Unit I have uses "U12H139T00_NETGEAR" value. This magic is also used + in firmware file header. There are two reports (one from an OpenWrt + user) of a different "U12H139T50_NETGEAR" magic though. +2) Power LEDs share GPIOs with buttons. + Amber one seems to share GPIO 2 with WPS button and green one seems + to share GPIO 3 with reset button. It remains unknown how to support + them and handle buttons at the same time. For that reason they aren't + added to the list of supported LEDs. +--- + arch/mips/bcm47xx/board.c | 2 ++ + arch/mips/bcm47xx/buttons.c | 9 +++++++++ + arch/mips/bcm47xx/leds.c | 9 +++++++++ + arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h | 1 + + 4 files changed, 21 insertions(+) + +--- a/arch/mips/bcm47xx/board.c ++++ b/arch/mips/bcm47xx/board.c +@@ -171,6 +171,8 @@ struct bcm47xx_board_type_list1 bcm47xx_ + {{BCM47XX_BOARD_NETGEAR_WNDR4000, "Netgear WNDR4000"}, "U12H181T00_NETGEAR"}, + {{BCM47XX_BOARD_NETGEAR_WNDR4500V1, "Netgear WNDR4500 V1"}, "U12H189T00_NETGEAR"}, + {{BCM47XX_BOARD_NETGEAR_WNDR4500V2, "Netgear WNDR4500 V2"}, "U12H224T00_NETGEAR"}, ++ {{BCM47XX_BOARD_NETGEAR_WNR1000_V3, "Netgear WNR1000 V3"}, "U12H139T00_NETGEAR"}, ++ {{BCM47XX_BOARD_NETGEAR_WNR1000_V3, "Netgear WNR1000 V3"}, "U12H139T50_NETGEAR"}, + {{BCM47XX_BOARD_NETGEAR_WNR2000, "Netgear WNR2000"}, "U12H114T00_NETGEAR"}, + {{BCM47XX_BOARD_NETGEAR_WNR3500L, "Netgear WNR3500L"}, "U12H136T99_NETGEAR"}, + {{BCM47XX_BOARD_NETGEAR_WNR3500U, "Netgear WNR3500U"}, "U12H136T00_NETGEAR"}, +--- a/arch/mips/bcm47xx/buttons.c ++++ b/arch/mips/bcm47xx/buttons.c +@@ -411,6 +411,12 @@ bcm47xx_buttons_netgear_wndr4500v1[] __i + }; + + static const struct gpio_keys_button ++bcm47xx_buttons_netgear_wnr1000_v3[] __initconst = { ++ BCM47XX_GPIO_KEY(2, KEY_WPS_BUTTON), ++ BCM47XX_GPIO_KEY(3, KEY_RESTART), ++}; ++ ++static const struct gpio_keys_button + bcm47xx_buttons_netgear_wnr3500lv1[] __initconst = { + BCM47XX_GPIO_KEY(4, KEY_RESTART), + BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON), +@@ -669,6 +675,9 @@ int __init bcm47xx_buttons_register(void + case BCM47XX_BOARD_NETGEAR_WNDR4500V1: + err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr4500v1); + break; ++ case BCM47XX_BOARD_NETGEAR_WNR1000_V3: ++ err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr1000_v3); ++ break; + case BCM47XX_BOARD_NETGEAR_WNR3500L: + err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr3500lv1); + break; +--- a/arch/mips/bcm47xx/leds.c ++++ b/arch/mips/bcm47xx/leds.c +@@ -497,6 +497,12 @@ bcm47xx_leds_netgear_wndr4500v1[] __init + }; + + static const struct gpio_led ++bcm47xx_leds_netgear_wnr1000_v3[] __initconst = { ++ BCM47XX_GPIO_LED(0, "blue", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF), ++ BCM47XX_GPIO_LED(1, "green", "wps", 0, LEDS_GPIO_DEFSTATE_OFF), ++}; ++ ++static const struct gpio_led + bcm47xx_leds_netgear_wnr3500lv1[] __initconst = { + BCM47XX_GPIO_LED(0, "blue", "wlan", 1, LEDS_GPIO_DEFSTATE_OFF), + BCM47XX_GPIO_LED(1, "green", "wps", 1, LEDS_GPIO_DEFSTATE_OFF), +@@ -757,6 +763,9 @@ void __init bcm47xx_leds_register(void) + case BCM47XX_BOARD_NETGEAR_WNDR4500V1: + bcm47xx_set_pdata(bcm47xx_leds_netgear_wndr4500v1); + break; ++ case BCM47XX_BOARD_NETGEAR_WNR1000_V3: ++ bcm47xx_set_pdata(bcm47xx_leds_netgear_wnr1000_v3); ++ break; + case BCM47XX_BOARD_NETGEAR_WNR3500L: + bcm47xx_set_pdata(bcm47xx_leds_netgear_wnr3500lv1); + break; +--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h ++++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h +@@ -109,6 +109,7 @@ enum bcm47xx_board { + BCM47XX_BOARD_NETGEAR_WNDR4000, + BCM47XX_BOARD_NETGEAR_WNDR4500V1, + BCM47XX_BOARD_NETGEAR_WNDR4500V2, ++ BCM47XX_BOARD_NETGEAR_WNR1000_V3, + BCM47XX_BOARD_NETGEAR_WNR2000, + BCM47XX_BOARD_NETGEAR_WNR3500L, + BCM47XX_BOARD_NETGEAR_WNR3500U, diff --git a/target/linux/brcm47xx/patches-4.4/034-firmware-bcm47xx_nvram-support-small-0x6000-B-NVRAM-.patch b/target/linux/brcm47xx/patches-4.4/034-firmware-bcm47xx_nvram-support-small-0x6000-B-NVRAM-.patch new file mode 100644 index 0000000000..7c860bb7ed --- /dev/null +++ b/target/linux/brcm47xx/patches-4.4/034-firmware-bcm47xx_nvram-support-small-0x6000-B-NVRAM-.patch @@ -0,0 +1,24 @@ +From 663beaeacf2552ed07405e69e96a18775e069eab Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Sun, 8 Apr 2018 22:51:08 +0200 +Subject: [PATCH] firmware: bcm47xx_nvram: support small (0x6000 B) NVRAM + partitions + +Some old devices with 4 MiB flashes were using 0x1000 block size and +could use smaller (0x6000 bytes) flash partition for storing NVRAM +content. This adds support for reading NVRAM on Netgear WNR1000 V3. +--- + drivers/firmware/broadcom/bcm47xx_nvram.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/firmware/broadcom/bcm47xx_nvram.c ++++ b/drivers/firmware/broadcom/bcm47xx_nvram.c +@@ -36,7 +36,7 @@ struct nvram_header { + + static char nvram_buf[NVRAM_SPACE]; + static size_t nvram_len; +-static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000}; ++static const u32 nvram_sizes[] = {0x6000, 0x8000, 0xF000, 0x10000}; + + static u32 find_nvram_size(void __iomem *end) + { diff --git a/target/linux/brcm47xx/patches-4.4/320-MIPS-BCM47XX-Devices-database-update-for-4.x.patch b/target/linux/brcm47xx/patches-4.4/320-MIPS-BCM47XX-Devices-database-update-for-4.x.patch index c5f97ba493..d771081dd0 100644 --- a/target/linux/brcm47xx/patches-4.4/320-MIPS-BCM47XX-Devices-database-update-for-4.x.patch +++ b/target/linux/brcm47xx/patches-4.4/320-MIPS-BCM47XX-Devices-database-update-for-4.x.patch @@ -21,14 +21,6 @@ {{BCM47XX_BOARD_NETGEAR_WNDR3300, "Netgear WNDR3300"}, "U12H093T00_NETGEAR"}, {{BCM47XX_BOARD_NETGEAR_WNDR3400V1, "Netgear WNDR3400 V1"}, "U12H155T00_NETGEAR"}, {{BCM47XX_BOARD_NETGEAR_WNDR3400V2, "Netgear WNDR3400 V2"}, "U12H187T00_NETGEAR"}, -@@ -171,6 +175,7 @@ struct bcm47xx_board_type_list1 bcm47xx_ - {{BCM47XX_BOARD_NETGEAR_WNDR4000, "Netgear WNDR4000"}, "U12H181T00_NETGEAR"}, - {{BCM47XX_BOARD_NETGEAR_WNDR4500V1, "Netgear WNDR4500 V1"}, "U12H189T00_NETGEAR"}, - {{BCM47XX_BOARD_NETGEAR_WNDR4500V2, "Netgear WNDR4500 V2"}, "U12H224T00_NETGEAR"}, -+ {{BCM47XX_BOARD_NETGEAR_WNR1000_V3, "Netgear WNR1000 V3"}, "U12H139T50_NETGEAR"}, - {{BCM47XX_BOARD_NETGEAR_WNR2000, "Netgear WNR2000"}, "U12H114T00_NETGEAR"}, - {{BCM47XX_BOARD_NETGEAR_WNR3500L, "Netgear WNR3500L"}, "U12H136T99_NETGEAR"}, - {{BCM47XX_BOARD_NETGEAR_WNR3500U, "Netgear WNR3500U"}, "U12H136T00_NETGEAR"}, --- a/arch/mips/bcm47xx/buttons.c +++ b/arch/mips/bcm47xx/buttons.c @@ -26,6 +26,12 @@ @@ -81,19 +73,7 @@ bcm47xx_buttons_netgear_wndr3400v1[] __initconst = { BCM47XX_GPIO_KEY(4, KEY_RESTART), BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON), -@@ -411,6 +440,11 @@ bcm47xx_buttons_netgear_wndr4500v1[] __i - }; - - static const struct gpio_keys_button -+bcm47xx_buttons_netgear_wnr1000_v3[] __initconst = { -+ BCM47XX_GPIO_KEY(3, KEY_RESTART), -+}; -+ -+static const struct gpio_keys_button - bcm47xx_buttons_netgear_wnr3500lv1[] __initconst = { - BCM47XX_GPIO_KEY(4, KEY_RESTART), - BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON), -@@ -464,6 +498,9 @@ int __init bcm47xx_buttons_register(void +@@ -470,6 +499,9 @@ int __init bcm47xx_buttons_register(void int err; switch (board) { @@ -103,7 +83,7 @@ case BCM47XX_BOARD_ASUS_RTN12: err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn12); break; -@@ -594,6 +631,12 @@ int __init bcm47xx_buttons_register(void +@@ -600,6 +632,12 @@ int __init bcm47xx_buttons_register(void case BCM47XX_BOARD_LINKSYS_WRT310NV1: err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310nv1); break; @@ -116,7 +96,7 @@ case BCM47XX_BOARD_LINKSYS_WRT54G3GV2: err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt54g3gv2); break; -@@ -657,6 +700,12 @@ int __init bcm47xx_buttons_register(void +@@ -663,6 +701,12 @@ int __init bcm47xx_buttons_register(void err = bcm47xx_copy_bdata(bcm47xx_buttons_motorola_wr850gv2v3); break; @@ -129,16 +109,6 @@ case BCM47XX_BOARD_NETGEAR_WNDR3400V1: err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3400v1); break; -@@ -669,6 +718,9 @@ int __init bcm47xx_buttons_register(void - case BCM47XX_BOARD_NETGEAR_WNDR4500V1: - err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr4500v1); - break; -+ case BCM47XX_BOARD_NETGEAR_WNR1000_V3: -+ err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr1000_v3); -+ break; - case BCM47XX_BOARD_NETGEAR_WNR3500L: - err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr3500lv1); - break; --- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h +++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h @@ -71,6 +71,7 @@ enum bcm47xx_board { @@ -162,14 +132,6 @@ BCM47XX_BOARD_NETGEAR_WNDR3300, BCM47XX_BOARD_NETGEAR_WNDR3400V1, BCM47XX_BOARD_NETGEAR_WNDR3400V2, -@@ -109,6 +113,7 @@ enum bcm47xx_board { - BCM47XX_BOARD_NETGEAR_WNDR4000, - BCM47XX_BOARD_NETGEAR_WNDR4500V1, - BCM47XX_BOARD_NETGEAR_WNDR4500V2, -+ BCM47XX_BOARD_NETGEAR_WNR1000_V3, - BCM47XX_BOARD_NETGEAR_WNR2000, - BCM47XX_BOARD_NETGEAR_WNR3500L, - BCM47XX_BOARD_NETGEAR_WNR3500U, --- a/arch/mips/bcm47xx/leds.c +++ b/arch/mips/bcm47xx/leds.c @@ -29,6 +29,14 @@ @@ -201,7 +163,7 @@ bcm47xx_leds_linksys_wrt54g_generic[] __initconst = { BCM47XX_GPIO_LED(0, "unk", "dmz", 1, LEDS_GPIO_DEFSTATE_OFF), BCM47XX_GPIO_LED(1, "unk", "power", 0, LEDS_GPIO_DEFSTATE_ON), -@@ -549,6 +564,9 @@ void __init bcm47xx_leds_register(void) +@@ -555,6 +570,9 @@ void __init bcm47xx_leds_register(void) enum bcm47xx_board board = bcm47xx_board_get(); switch (board) { @@ -211,7 +173,7 @@ case BCM47XX_BOARD_ASUS_RTN12: bcm47xx_set_pdata(bcm47xx_leds_asus_rtn12); break; -@@ -682,6 +700,9 @@ void __init bcm47xx_leds_register(void) +@@ -688,6 +706,9 @@ void __init bcm47xx_leds_register(void) case BCM47XX_BOARD_LINKSYS_WRT310NV1: bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt310nv1); break; diff --git a/target/linux/brcm47xx/patches-4.4/400-mtd-bcm47xxpart-get-nvram.patch b/target/linux/brcm47xx/patches-4.4/400-mtd-bcm47xxpart-get-nvram.patch index 64184c079d..2b9290ddec 100644 --- a/target/linux/brcm47xx/patches-4.4/400-mtd-bcm47xxpart-get-nvram.patch +++ b/target/linux/brcm47xx/patches-4.4/400-mtd-bcm47xxpart-get-nvram.patch @@ -8,7 +8,7 @@ /* * Some really old flashes (like AT45DB*) had smaller erasesize-s, but -@@ -384,12 +385,23 @@ static int bcm47xxpart_parse(struct mtd_ +@@ -398,12 +399,23 @@ static int bcm47xxpart_parse(struct mtd_ if (buf[0] == NVRAM_HEADER) { bcm47xxpart_add_part(&parts[curr_part++], "nvram", master->size - blocksize, 0); diff --git a/target/linux/brcm47xx/patches-4.4/820-wgt634u-nvram-fix.patch b/target/linux/brcm47xx/patches-4.4/820-wgt634u-nvram-fix.patch index da0f56fd5b..08e7552163 100644 --- a/target/linux/brcm47xx/patches-4.4/820-wgt634u-nvram-fix.patch +++ b/target/linux/brcm47xx/patches-4.4/820-wgt634u-nvram-fix.patch @@ -244,7 +244,7 @@ out the configuration than the in kernel cfe config reader. @@ -37,6 +37,8 @@ struct nvram_header { static char nvram_buf[NVRAM_SPACE]; static size_t nvram_len; - static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000}; + static const u32 nvram_sizes[] = {0x6000, 0x8000, 0xF000, 0x10000}; +static int cfe_env; +extern char *cfe_env_get(char *nv_buf, const char *name); diff --git a/target/linux/brcm47xx/patches-4.4/999-wl_exports.patch b/target/linux/brcm47xx/patches-4.4/999-wl_exports.patch index ea59f4f1db..02e399df73 100644 --- a/target/linux/brcm47xx/patches-4.4/999-wl_exports.patch +++ b/target/linux/brcm47xx/patches-4.4/999-wl_exports.patch @@ -8,7 +8,7 @@ +char nvram_buf[NVRAM_SPACE]; +EXPORT_SYMBOL(nvram_buf); static size_t nvram_len; - static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000}; + static const u32 nvram_sizes[] = {0x6000, 0x8000, 0xF000, 0x10000}; static int cfe_env; --- a/arch/mips/mm/cache.c +++ b/arch/mips/mm/cache.c