aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/b43/main.c
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2014-04-20 14:30:58 -0400
committerJohn W. Linville <linville@tuxdriver.com>2014-04-22 15:06:34 -0400
commit8f15e28703d1222bf5f23009fde998e9e4c20e8d (patch)
tree6fd360957a12f9f98b0df082a5f95b248c54de91 /drivers/net/wireless/b43/main.c
parent557579279f5f783fa86295cf767a19f9e98bb62d (diff)
b43: ssb: refuse to support more than IEEE 802.11 core
Some ancient Broadcom devices had one core per band, e.g.: ssb: Found chip with id 0x4306, rev 0x02 and package 0x00 ssb: Core 0 found: ChipCommon (cc 0x800, rev 0x02, vendor 0x4243) ssb: Core 1 found: IEEE 802.11 (cc 0x812, rev 0x04, vendor 0x4243) ssb: Core 2 found: PCMCIA (cc 0x80D, rev 0x01, vendor 0x4243) ssb: Core 3 found: V90 (cc 0x807, rev 0x01, vendor 0x4243) ssb: Core 4 found: PCI (cc 0x804, rev 0x07, vendor 0x4243) ssb: Core 5 found: IEEE 802.11 (cc 0x812, rev 0x04, vendor 0x4243) This hardware model was dropped for newer devices handled by b43. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/b43/main.c')
-rw-r--r--drivers/net/wireless/b43/main.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 69fc3d65531a..cf84cf2b6874 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -5486,39 +5486,42 @@ int b43_ssb_probe(struct ssb_device *sdev, const struct ssb_device_id *id)
5486 struct b43_bus_dev *dev; 5486 struct b43_bus_dev *dev;
5487 struct b43_wl *wl; 5487 struct b43_wl *wl;
5488 int err; 5488 int err;
5489 int first = 0;
5490 5489
5491 dev = b43_bus_dev_ssb_init(sdev); 5490 dev = b43_bus_dev_ssb_init(sdev);
5492 if (!dev) 5491 if (!dev)
5493 return -ENOMEM; 5492 return -ENOMEM;
5494 5493
5495 wl = ssb_get_devtypedata(sdev); 5494 wl = ssb_get_devtypedata(sdev);
5496 if (!wl) { 5495 if (wl) {
5497 /* Probing the first core. Must setup common struct b43_wl */ 5496 b43err(NULL, "Dual-core devices are not supported\n");
5498 first = 1; 5497 err = -ENOTSUPP;
5499 b43_sprom_fixup(sdev->bus); 5498 goto err_ssb_kfree_dev;
5500 wl = b43_wireless_init(dev);
5501 if (IS_ERR(wl)) {
5502 err = PTR_ERR(wl);
5503 goto out;
5504 }
5505 ssb_set_devtypedata(sdev, wl);
5506 B43_WARN_ON(ssb_get_devtypedata(sdev) != wl);
5507 } 5499 }
5500
5501 b43_sprom_fixup(sdev->bus);
5502
5503 wl = b43_wireless_init(dev);
5504 if (IS_ERR(wl)) {
5505 err = PTR_ERR(wl);
5506 goto err_ssb_kfree_dev;
5507 }
5508 ssb_set_devtypedata(sdev, wl);
5509 B43_WARN_ON(ssb_get_devtypedata(sdev) != wl);
5510
5508 err = b43_one_core_attach(dev, wl); 5511 err = b43_one_core_attach(dev, wl);
5509 if (err) 5512 if (err)
5510 goto err_wireless_exit; 5513 goto err_ssb_wireless_exit;
5511 5514
5512 /* setup and start work to load firmware */ 5515 /* setup and start work to load firmware */
5513 INIT_WORK(&wl->firmware_load, b43_request_firmware); 5516 INIT_WORK(&wl->firmware_load, b43_request_firmware);
5514 schedule_work(&wl->firmware_load); 5517 schedule_work(&wl->firmware_load);
5515 5518
5516 out:
5517 return err; 5519 return err;
5518 5520
5519 err_wireless_exit: 5521err_ssb_wireless_exit:
5520 if (first) 5522 b43_wireless_exit(dev, wl);
5521 b43_wireless_exit(dev, wl); 5523err_ssb_kfree_dev:
5524 kfree(dev);
5522 return err; 5525 return err;
5523} 5526}
5524 5527