Skip to content

Commit

Permalink
b43: Workaround invalid bluetooth settings
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Michael Buesch authored and John W. Linville committed Apr 24, 2008
1 parent 0f48d7e commit 1855ba7
Showing 1 changed file with 20 additions and 2 deletions.
22 changes: 20 additions & 2 deletions drivers/net/wireless/b43/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,10 @@ int b43_modparam_qos = 1;
module_param_named(qos, b43_modparam_qos, int, 0444);
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[] = {
SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5),
Expand Down Expand Up @@ -3708,6 +3712,8 @@ static void b43_bluetooth_coext_enable(struct b43_wldev *dev)
struct ssb_sprom *sprom = &dev->dev->bus->sprom;
u32 hf;

if (!modparam_btcoex)
return;
if (!(sprom->boardflags_lo & B43_BFL_BTCOEXIST))
return;
if (dev->phy.type != B43_PHYTYPE_B && !dev->phy.gmode)
Expand All @@ -3719,11 +3725,13 @@ static void b43_bluetooth_coext_enable(struct b43_wldev *dev)
else
hf |= B43_HF_BTCOEX;
b43_hf_write(dev, hf);
//TODO
}

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)
Expand Down Expand Up @@ -4416,13 +4424,23 @@ static int b43_one_core_attach(struct ssb_device *dev, struct b43_wl *wl)

static void b43_sprom_fixup(struct ssb_bus *bus)
{
struct pci_dev *pdev;

/* boardflags workarounds */
if (bus->boardinfo.vendor == SSB_BOARDVENDOR_DELL &&
bus->chip_id == 0x4301 && bus->boardinfo.rev == 0x74)
bus->sprom.boardflags_lo |= B43_BFL_BTCOEXIST;
if (bus->boardinfo.vendor == PCI_VENDOR_ID_APPLE &&
bus->boardinfo.type == 0x4E && bus->boardinfo.rev > 0x40)
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)
Expand Down

0 comments on commit 1855ba7

Please sign in to comment.