aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel González Cabanelas <dgcbueu@gmail.com>2021-02-02 12:11:09 +0100
committerÁlvaro Fernández Rojas <noltari@gmail.com>2021-02-02 20:40:31 +0100
commita0e0e621cadbec02fddc1311d4a10b189b3c70f4 (patch)
tree3b2638c0c7288ec2a4ff9a73756cc165746f00d4
parente23a90674e1b52a6eaa3d66a621f7ff612641243 (diff)
downloadupstream-a0e0e621cadbec02fddc1311d4a10b189b3c70f4.tar.gz
upstream-a0e0e621cadbec02fddc1311d4a10b189b3c70f4.tar.bz2
upstream-a0e0e621cadbec02fddc1311d4a10b189b3c70f4.zip
bcm63xx: sprom: override the PCI device ID
The PCI device ID detected by the wifi drivers on devices using a fallback SPROM is wrong. Currently the chipnum is used for this parameter. Most SSB based Broadcom wifi chips are 2.4 and 5GHz capable. But on devices without a physical SPROM, the only one way to detect if the device suports both bands or only the 5GHz band, is by reading the device ID from the fallback SPROM. In some devices, this may lead to a non working wifi on a 5GHz-only card, or in the best case a working 2.4GHz-only in a dual band wifi card. The offset for the deviceid in SSB SPROMs is 0x0008, whereas in BCMA is 0x0060. This is true for any SPROM version. Override the PCI device ID with the one defined at the fallback SPROM, to detect the correct wifi card model and allow using the 5GHz band if supported. The patch has been tested with the following wifi radios: BCM43222: b43: both 2.4/5GHz working brcm-wl: both 2.4/5GHz working BCM43225: b43: 2.4GHz, working brcmsmac: working brcm-wl: it lacks support BCM43217: b43: 2.4GHz, working brcmsmac: it lacks support brcm-wl: it lacks support Signed-off-by: Daniel González Cabanelas <dgcbueu@gmail.com> [amend commit description, rework patch to avoid using a new global variable and keep ssb sprom extraction code as close to ssb/pci.c as possible] Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
-rw-r--r--target/linux/bcm63xx/patches-5.4/366-MIPS-BCM63XX-fallback-sprom-override-devid.patch78
-rw-r--r--target/linux/bcm63xx/patches-5.4/801-ssb_export_fallback_sprom.patch2
2 files changed, 79 insertions, 1 deletions
diff --git a/target/linux/bcm63xx/patches-5.4/366-MIPS-BCM63XX-fallback-sprom-override-devid.patch b/target/linux/bcm63xx/patches-5.4/366-MIPS-BCM63XX-fallback-sprom-override-devid.patch
new file mode 100644
index 0000000000..31641aeff2
--- /dev/null
+++ b/target/linux/bcm63xx/patches-5.4/366-MIPS-BCM63XX-fallback-sprom-override-devid.patch
@@ -0,0 +1,78 @@
+--- a/arch/mips/bcm63xx/sprom.c
++++ b/arch/mips/bcm63xx/sprom.c
+@@ -384,6 +384,7 @@ static __initconst u16 bcm4331_sprom[] =
+ struct fallback_sprom_match {
+ u8 pci_bus;
+ u8 pci_dev;
++ int override_devid;
+ struct ssb_sprom sprom;
+ };
+
+@@ -399,6 +400,8 @@ int bcm63xx_get_fallback_ssb_sprom(struc
+ fallback_sprom.pci_bus, fallback_sprom.pci_dev,
+ bus->host_pci->bus->number,
+ PCI_SLOT(bus->host_pci->devfn));
++ if (fallback_sprom.override_devid)
++ bus->host_pci->device = fallback_sprom.sprom.dev_id;
+ memcpy(out, &fallback_sprom.sprom, sizeof(struct ssb_sprom));
+ return 0;
+ } else {
+@@ -418,6 +421,8 @@ int bcm63xx_get_fallback_bcma_sprom(stru
+ fallback_sprom.pci_bus, fallback_sprom.pci_dev,
+ bus->host_pci->bus->number,
+ PCI_SLOT(bus->host_pci->devfn));
++ if (fallback_sprom.override_devid)
++ bus->host_pci->device = fallback_sprom.sprom.dev_id;
+ memcpy(out, &fallback_sprom.sprom, sizeof(struct ssb_sprom));
+ return 0;
+ } else {
+@@ -965,6 +970,37 @@ static int sprom_extract(struct ssb_spro
+ return 0;
+ }
+
++int sprom_override_devid(struct fallback_sprom_data *data,
++ struct ssb_sprom *out, const u16 *in)
++{
++ switch (data->type) {
++#if defined(CONFIG_SSB_PCIHOST)
++ case SPROM_BCM4306:
++ case SPROM_BCM4318:
++ case SPROM_BCM4321:
++ case SPROM_BCM4322:
++ case SPROM_BCM43222:
++ SPEX(dev_id, SSB_SPROM1_PID, 0xFFFF, 0);
++ return !!out->dev_id;
++#endif /* CONFIG_SSB_PCIHOST */
++#if defined(CONFIG_BCMA_HOST_PCI)
++ case SPROM_BCM4313:
++ case SPROM_BCM43131:
++ case SPROM_BCM43217:
++ case SPROM_BCM43225:
++ case SPROM_BCM43227:
++ case SPROM_BCM43228:
++ case SPROM_BCM4331:
++ SPEX(dev_id, 0x0060, 0xFFFF, 0);
++ return !!out->dev_id;
++#endif /* CONFIG_BCMA_HOST_PCI */
++ case SPROM_DEFAULT:
++ return 0;
++ }
++
++ return 0;
++}
++
+ void sprom_apply_fixups(u16 *sprom, struct sprom_fixup *fixups, int n)
+ {
+ unsigned int i;
+@@ -1056,6 +1092,11 @@ int __init bcm63xx_register_fallback_spr
+ data->num_board_fixups);
+
+ sprom_extract(&fallback_sprom.sprom, template_sprom, size);
++
++ fallback_sprom.override_devid =
++ sprom_override_devid(data, &fallback_sprom.sprom, template_sprom);
++ } else {
++ fallback_sprom.override_devid = 0;
+ }
+
+ memcpy(fallback_sprom.sprom.il0mac, data->mac_addr, ETH_ALEN);
diff --git a/target/linux/bcm63xx/patches-5.4/801-ssb_export_fallback_sprom.patch b/target/linux/bcm63xx/patches-5.4/801-ssb_export_fallback_sprom.patch
index 11a83536b7..6e4e05a63b 100644
--- a/target/linux/bcm63xx/patches-5.4/801-ssb_export_fallback_sprom.patch
+++ b/target/linux/bcm63xx/patches-5.4/801-ssb_export_fallback_sprom.patch
@@ -8,7 +8,7 @@
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/platform_device.h>
-@@ -387,7 +388,19 @@ struct fallback_sprom_match {
+@@ -388,7 +389,19 @@ struct fallback_sprom_match {
struct ssb_sprom sprom;
};