diff options
Diffstat (limited to 'target/linux/brcm47xx/patches-4.1/031-05-MIPS-BCM47xx-Read-board-info-for-all-bcma-buses.patch')
-rw-r--r-- | target/linux/brcm47xx/patches-4.1/031-05-MIPS-BCM47xx-Read-board-info-for-all-bcma-buses.patch | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/target/linux/brcm47xx/patches-4.1/031-05-MIPS-BCM47xx-Read-board-info-for-all-bcma-buses.patch b/target/linux/brcm47xx/patches-4.1/031-05-MIPS-BCM47xx-Read-board-info-for-all-bcma-buses.patch new file mode 100644 index 0000000000..314a6c4904 --- /dev/null +++ b/target/linux/brcm47xx/patches-4.1/031-05-MIPS-BCM47xx-Read-board-info-for-all-bcma-buses.patch @@ -0,0 +1,132 @@ +From 12e1ab54dcd414c3579cfd26be9d9c9e1cab92ad Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com> +Date: Tue, 12 May 2015 13:05:18 +0200 +Subject: [PATCH] MIPS: BCM47xx: Read board info for all bcma buses +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Extra bcma buses may be totally different models, see following dump: +boardtype=0x0646 +pci/1/1/boardtype=0x0545 +pci/2/1/boardtype=0x62b +We need to detect them properly to allow drivers apply some board +specific hacks. + +[ralf@linux-mips.org: folded in Rafal's fix.] + +Signed-off-by: Rafał Miłecki <zajec5@gmail.com> +Cc: linux-mips@linux-mips.org +Cc: Hauke Mehrtens <hauke@hauke-m.de> +Patchwork: https://patchwork.linux-mips.org/patch/10028/ +Patchwork: https://patchwork.linux-mips.org/patch/10048/ +Signed-off-by: Ralf Baechle <ralf@linux-mips.org> +--- + arch/mips/bcm47xx/setup.c | 3 -- + arch/mips/bcm47xx/sprom.c | 44 ++++++++++++++-------------- + arch/mips/include/asm/mach-bcm47xx/bcm47xx.h | 4 --- + 3 files changed, 22 insertions(+), 29 deletions(-) + +--- a/arch/mips/bcm47xx/setup.c ++++ b/arch/mips/bcm47xx/setup.c +@@ -206,9 +206,6 @@ void __init bcm47xx_bus_setup(void) + err = bcma_host_soc_init(&bcm47xx_bus.bcma); + if (err) + panic("Failed to initialize BCMA bus (err %d)", err); +- +- bcm47xx_fill_bcma_boardinfo(&bcm47xx_bus.bcma.bus.boardinfo, +- NULL); + } + #endif + +--- a/arch/mips/bcm47xx/sprom.c ++++ b/arch/mips/bcm47xx/sprom.c +@@ -640,19 +640,6 @@ void bcm47xx_fill_ssb_boardinfo(struct s + } + #endif + +-#ifdef CONFIG_BCM47XX_BCMA +-void bcm47xx_fill_bcma_boardinfo(struct bcma_boardinfo *boardinfo, +- const char *prefix) +-{ +- nvram_read_u16(prefix, NULL, "boardvendor", &boardinfo->vendor, 0, +- true); +- if (!boardinfo->vendor) +- boardinfo->vendor = SSB_BOARDVENDOR_BCM; +- +- nvram_read_u16(prefix, NULL, "boardtype", &boardinfo->type, 0, true); +-} +-#endif +- + #if defined(CONFIG_BCM47XX_SSB) + static int bcm47xx_get_sprom_ssb(struct ssb_bus *bus, struct ssb_sprom *out) + { +@@ -707,33 +694,46 @@ static void bcm47xx_sprom_apply_prefix_a + + static int bcm47xx_get_sprom_bcma(struct bcma_bus *bus, struct ssb_sprom *out) + { +- char prefix[10]; ++ struct bcma_boardinfo *binfo = &bus->boardinfo; + struct bcma_device *core; ++ char buf[10]; ++ char *prefix; ++ bool fallback = false; + + switch (bus->hosttype) { + case BCMA_HOSTTYPE_PCI: + memset(out, 0, sizeof(struct ssb_sprom)); +- snprintf(prefix, sizeof(prefix), "pci/%u/%u/", ++ snprintf(buf, sizeof(buf), "pci/%u/%u/", + bus->host_pci->bus->number + 1, + PCI_SLOT(bus->host_pci->devfn)); +- bcm47xx_sprom_apply_prefix_alias(prefix, sizeof(prefix)); +- bcm47xx_fill_sprom(out, prefix, false); +- return 0; ++ bcm47xx_sprom_apply_prefix_alias(buf, sizeof(buf)); ++ prefix = buf; ++ break; + case BCMA_HOSTTYPE_SOC: + memset(out, 0, sizeof(struct ssb_sprom)); + core = bcma_find_core(bus, BCMA_CORE_80211); + if (core) { +- snprintf(prefix, sizeof(prefix), "sb/%u/", ++ snprintf(buf, sizeof(buf), "sb/%u/", + core->core_index); +- bcm47xx_fill_sprom(out, prefix, true); ++ prefix = buf; ++ fallback = true; + } else { +- bcm47xx_fill_sprom(out, NULL, false); ++ prefix = NULL; + } +- return 0; ++ break; + default: + pr_warn("Unable to fill SPROM for given bustype.\n"); + return -EINVAL; + } ++ ++ nvram_read_u16(prefix, NULL, "boardvendor", &binfo->vendor, 0, true); ++ if (!binfo->vendor) ++ binfo->vendor = SSB_BOARDVENDOR_BCM; ++ nvram_read_u16(prefix, NULL, "boardtype", &binfo->type, 0, true); ++ ++ bcm47xx_fill_sprom(out, prefix, fallback); ++ ++ return 0; + } + #endif + +--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h ++++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h +@@ -52,10 +52,6 @@ void bcm47xx_fill_sprom(struct ssb_sprom + void bcm47xx_fill_ssb_boardinfo(struct ssb_boardinfo *boardinfo, + const char *prefix); + #endif +-#ifdef CONFIG_BCM47XX_BCMA +-void bcm47xx_fill_bcma_boardinfo(struct bcma_boardinfo *boardinfo, +- const char *prefix); +-#endif + + void bcm47xx_set_system_type(u16 chip_id); + |