Commit 1855ba78 authored by Michael Buesch's avatar Michael Buesch Committed by John W. Linville

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: default avatarMichael Buesch <mb@bu3sch.de>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 0f48d7e1
...@@ -84,6 +84,10 @@ int b43_modparam_qos = 1; ...@@ -84,6 +84,10 @@ int b43_modparam_qos = 1;
module_param_named(qos, b43_modparam_qos, int, 0444); module_param_named(qos, b43_modparam_qos, int, 0444);
MODULE_PARM_DESC(qos, "Enable QOS support (default on)"); MODULE_PARM_DESC(qos, "Enable QOS support (default on)");
static int modparam_btcoex = 1;
module_param_named(btcoex, modparam_btcoex, int, 0444);
MODULE_PARM_DESC(btcoex, "Enable Bluetooth coexistance (default on)");
static const struct ssb_device_id b43_ssb_tbl[] = { static const struct ssb_device_id b43_ssb_tbl[] = {
SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5), SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5),
...@@ -3708,6 +3712,8 @@ static void b43_bluetooth_coext_enable(struct b43_wldev *dev) ...@@ -3708,6 +3712,8 @@ static void b43_bluetooth_coext_enable(struct b43_wldev *dev)
struct ssb_sprom *sprom = &dev->dev->bus->sprom; struct ssb_sprom *sprom = &dev->dev->bus->sprom;
u32 hf; u32 hf;
if (!modparam_btcoex)
return;
if (!(sprom->boardflags_lo & B43_BFL_BTCOEXIST)) if (!(sprom->boardflags_lo & B43_BFL_BTCOEXIST))
return; return;
if (dev->phy.type != B43_PHYTYPE_B && !dev->phy.gmode) 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,11 +3725,13 @@ static void b43_bluetooth_coext_enable(struct b43_wldev *dev)
else else
hf |= B43_HF_BTCOEX; hf |= B43_HF_BTCOEX;
b43_hf_write(dev, hf); b43_hf_write(dev, hf);
//TODO
} }
static void b43_bluetooth_coext_disable(struct b43_wldev *dev) static void b43_bluetooth_coext_disable(struct b43_wldev *dev)
{ //TODO {
if (!modparam_btcoex)
return;
//TODO
} }
static void b43_imcfglo_timeouts_workaround(struct b43_wldev *dev) static 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,6 +4424,8 @@ static int b43_one_core_attach(struct ssb_device *dev, struct b43_wl *wl)
static void b43_sprom_fixup(struct ssb_bus *bus) static void b43_sprom_fixup(struct ssb_bus *bus)
{ {
struct pci_dev *pdev;
/* boardflags workarounds */ /* boardflags workarounds */
if (bus->boardinfo.vendor == SSB_BOARDVENDOR_DELL && if (bus->boardinfo.vendor == SSB_BOARDVENDOR_DELL &&
bus->chip_id == 0x4301 && bus->boardinfo.rev == 0x74) bus->chip_id == 0x4301 && bus->boardinfo.rev == 0x74)
...@@ -4423,6 +4433,14 @@ static void b43_sprom_fixup(struct ssb_bus *bus) ...@@ -4423,6 +4433,14 @@ static void b43_sprom_fixup(struct ssb_bus *bus)
if (bus->boardinfo.vendor == PCI_VENDOR_ID_APPLE && if (bus->boardinfo.vendor == PCI_VENDOR_ID_APPLE &&
bus->boardinfo.type == 0x4E && bus->boardinfo.rev > 0x40) bus->boardinfo.type == 0x4E && bus->boardinfo.rev > 0x40)
bus->sprom.boardflags_lo |= B43_BFL_PACTRL; bus->sprom.boardflags_lo |= B43_BFL_PACTRL;
if (bus->bustype == SSB_BUSTYPE_PCI) {
pdev = bus->host_pci;
if (pdev->vendor == PCI_VENDOR_ID_BROADCOM &&
pdev->device == 0x4318 &&
pdev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK &&
pdev->subsystem_device == 0x100F)
bus->sprom.boardflags_lo &= ~B43_BFL_BTCOEXIST;
}
} }
static void b43_wireless_exit(struct ssb_device *dev, struct b43_wl *wl) static void b43_wireless_exit(struct ssb_device *dev, struct b43_wl *wl)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment