aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Buesch <mb@bu3sch.de>2008-04-18 14:51:41 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-04-23 21:25:34 -0400
commit1855ba7812dbd294fcfc083dc7d3b14d3b1f38db (patch)
treea44c24a0bc2681f00c3cc7d9a9a440c65fcc98dc
parent0f48d7e1cf2341148dcafc19a098ca22e184bee9 (diff)
b43: Workaround invalid bluetooth settings
This adds a workaround for invalid bluetooth SPROM settings on ASUS PCI cards. This will stop the microcode from poking with the BT GPIO line. This fixes data transmission on this device, as the BT GPIO line is used for something TX related on this device (probably the power amplifier or the radio). This also adds a modparam knob to help debugging this in the future, as more devices with this bug may show up. Signed-off-by: Michael Buesch <mb@bu3sch.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/b43/main.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index cf5c046c9fa8..4bc053ffc37e 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -84,6 +84,10 @@ int b43_modparam_qos = 1;
84module_param_named(qos, b43_modparam_qos, int, 0444); 84module_param_named(qos, b43_modparam_qos, int, 0444);
85MODULE_PARM_DESC(qos, "Enable QOS support (default on)"); 85MODULE_PARM_DESC(qos, "Enable QOS support (default on)");
86 86
87static int modparam_btcoex = 1;
88module_param_named(btcoex, modparam_btcoex, int, 0444);
89MODULE_PARM_DESC(btcoex, "Enable Bluetooth coexistance (default on)");
90
87 91
88static const struct ssb_device_id b43_ssb_tbl[] = { 92static const struct ssb_device_id b43_ssb_tbl[] = {
89 SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5), 93 SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5),
@@ -3708,6 +3712,8 @@ static void b43_bluetooth_coext_enable(struct b43_wldev *dev)
3708 struct ssb_sprom *sprom = &dev->dev->bus->sprom; 3712 struct ssb_sprom *sprom = &dev->dev->bus->sprom;
3709 u32 hf; 3713 u32 hf;
3710 3714
3715 if (!modparam_btcoex)
3716 return;
3711 if (!(sprom->boardflags_lo & B43_BFL_BTCOEXIST)) 3717 if (!(sprom->boardflags_lo & B43_BFL_BTCOEXIST))
3712 return; 3718 return;
3713 if (dev->phy.type != B43_PHYTYPE_B && !dev->phy.gmode) 3719 if (dev->phy.type != B43_PHYTYPE_B && !dev->phy.gmode)
@@ -3719,11 +3725,13 @@ static void b43_bluetooth_coext_enable(struct b43_wldev *dev)
3719 else 3725 else
3720 hf |= B43_HF_BTCOEX; 3726 hf |= B43_HF_BTCOEX;
3721 b43_hf_write(dev, hf); 3727 b43_hf_write(dev, hf);
3722 //TODO
3723} 3728}
3724 3729
3725static void b43_bluetooth_coext_disable(struct b43_wldev *dev) 3730static void b43_bluetooth_coext_disable(struct b43_wldev *dev)
3726{ //TODO 3731{
3732 if (!modparam_btcoex)
3733 return;
3734 //TODO
3727} 3735}
3728 3736
3729static void b43_imcfglo_timeouts_workaround(struct b43_wldev *dev) 3737static void b43_imcfglo_timeouts_workaround(struct b43_wldev *dev)
@@ -4416,6 +4424,8 @@ static int b43_one_core_attach(struct ssb_device *dev, struct b43_wl *wl)
4416 4424
4417static void b43_sprom_fixup(struct ssb_bus *bus) 4425static void b43_sprom_fixup(struct ssb_bus *bus)
4418{ 4426{
4427 struct pci_dev *pdev;
4428
4419 /* boardflags workarounds */ 4429 /* boardflags workarounds */
4420 if (bus->boardinfo.vendor == SSB_BOARDVENDOR_DELL && 4430 if (bus->boardinfo.vendor == SSB_BOARDVENDOR_DELL &&
4421 bus->chip_id == 0x4301 && bus->boardinfo.rev == 0x74) 4431 bus->chip_id == 0x4301 && bus->boardinfo.rev == 0x74)
@@ -4423,6 +4433,14 @@ static void b43_sprom_fixup(struct ssb_bus *bus)
4423 if (bus->boardinfo.vendor == PCI_VENDOR_ID_APPLE && 4433 if (bus->boardinfo.vendor == PCI_VENDOR_ID_APPLE &&
4424 bus->boardinfo.type == 0x4E && bus->boardinfo.rev > 0x40) 4434 bus->boardinfo.type == 0x4E && bus->boardinfo.rev > 0x40)
4425 bus->sprom.boardflags_lo |= B43_BFL_PACTRL; 4435 bus->sprom.boardflags_lo |= B43_BFL_PACTRL;
4436 if (bus->bustype == SSB_BUSTYPE_PCI) {
4437 pdev = bus->host_pci;
4438 if (pdev->vendor == PCI_VENDOR_ID_BROADCOM &&
4439 pdev->device == 0x4318 &&
4440 pdev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK &&
4441 pdev->subsystem_device == 0x100F)
4442 bus->sprom.boardflags_lo &= ~B43_BFL_BTCOEXIST;
4443 }
4426} 4444}
4427 4445
4428static void b43_wireless_exit(struct ssb_device *dev, struct b43_wl *wl) 4446static void b43_wireless_exit(struct ssb_device *dev, struct b43_wl *wl)