Difference between revisions of "Broadcom wireless"
(→Wi-Fi card does not work when resuming from suspend (brcm80211): shorter switch/case statements) |
m (changed "wich" to "which") |
||
Line 39: | Line 39: | ||
A more up-to-date list may be found [http://linuxwireless.org/en/users/Drivers/brcm80211 here]. | A more up-to-date list may be found [http://linuxwireless.org/en/users/Drivers/brcm80211 here]. | ||
− | If your card is not in the above lists, you need to use the older {{ic|b43}} or {{ic|b43legacy}} driver, | + | If your card is not in the above lists, you need to use the older {{ic|b43}} or {{ic|b43legacy}} driver, which supports following devices. |
{| border="1" | {| border="1" | ||
! PCI-ID !! Name !! Notes | ! PCI-ID !! Name !! Notes |
Revision as of 08:44, 3 March 2012
Contents
Introduction
Broadcom has been notorious in its support for its Wi-Fi cards on GNU/Linux. Until recently, most Broadcom chips were either entirely unsupported or required the user to tinker with firmware. A limited set of wireless chips were supported by various reverse-engineered drivers (brcm4xxx
, b43
, etc.). The reverse-engineered b43
drivers have been in the kernel since 2.6.24.
In August 2008, Broadcom released the 802.11 Linux STA driver officially supporting Broadcom wireless hardware on GNU/Linux. These are restrictively licensed drivers, but Broadcom promised to work towards a more open approach in the future. Further, they do not work with hidden ESSIDs.
In September 2010, Broadcom finally released fully open source drivers for its hardware. This driver, brcm80211
, has been included into the kernel since 2.6.37. With the release of 2.6.39, these drivers have been renamed to brcmsmac
and brcmfmac
.
At the time of writing, there are three choices for users with Broadcom Wi-Fi chipsets:
-
brcmsmac
/brcmfmac
-
b43
-
broadcom-wl
Determine which driver you need/can use
First, determine your card's PCI-ID. Type the following (case-sensitive) command into a console:
$ lspci -vnn | grep 14e4
If your card is in the following list, you can use the brcmsmac
driver:
PCI-ID | Name |
---|---|
[14e4:4727] |
BCM4313 |
[14e4:4353] |
BCM43224 |
[14e4:4357] |
BCM43225 |
If your card is in the following list, you can use the brcmfmac
SDIO driver:
Name |
---|
BCM4329 |
A more up-to-date list may be found here.
If your card is not in the above lists, you need to use the older b43
or b43legacy
driver, which supports following devices.
PCI-ID | Name | Notes |
---|---|---|
[14e4:4301] |
BCM4301 | legacy-only |
[14e4:4306] |
BCM4306 | ?legacy |
[14e4:4307] |
BCM4306 | |
[14e4:4311] |
BCM4311 | |
[14e4:4312] |
BCM4311 | |
[14e4:4313] |
BCM4311 | |
[14e4:4315] |
BCM4312 | b43 has problems with this model, try broadcom-wl driver insead. Not in kernel26-lts |
[14e4:4318] |
BCM4318 | |
[14e4:4319] |
BCM4318 | |
[14e4:4320] |
BCM4306 | ?legacy |
[14e4:4321] |
BCM4321 | Not in kernel26-lts |
[14e4:4324] |
BCM4306 | legacy-only |
[14e4:4325] |
BCM4306 | legacy-only |
[14e4:4328] |
BCM4321 | Not in kernel26-lts |
[14e4:4329] |
BCM4321 | Not in kernel26-lts |
[14e4:432a] |
BCM4321 | |
[14e4:432b] |
BCM4322 | Not in kernel26-lts |
[14e4:432c] |
BCM4322 | |
[14e4:432d] |
BCM4322 | |
[14e4:4358] |
BCM43227 | |
[14e4:4359] |
BCM43228 |
?legacy means that there are devices with same PCI-IDs, but with different hardware available.
Some of these work with the b43
driver, but some might need b43legacy
driver.
legacy-only means that you need to use the b43legacy
driver.
A more up-to-date list may be found here.
If your card is in the following list, you can use the broadcom-wl
driver:
PCI-ID | Name |
---|---|
[14e4:4311] |
BCM4311 |
[14e4:4312] |
BCM4311 |
[14e4:4313] |
BCM4311 |
[14e4:4315] |
BCM4312 |
[14e4:4727] |
BCM4313 |
[14e4:4328] |
BCM4321 |
[14e4:4329] |
BCM4321 |
[14e4:432a] |
BCM4321 |
[14e4:432b] |
BCM4322 |
[14e4:432c] |
BCM4322 |
[14e4:432d] |
BCM4322 |
[14e4:4353] |
BCM43224 |
[14e4:4357] |
BCM43225 |
[14e4:4358] |
BCM43227 |
[14e4:4359] |
BCM43228 |
A more up-to-date list may be found here.
Getting the driver
brcmsmac/brcmfmac
The brcm80211
drivers have been included in the kernel since 2.6.37. Since the release of 2.6.39, they have been renamed to brcmsmac
(for PCI cards) and brcmfmac
(for SDIO).
These drivers should be automatically loaded during startup and no further action should be required of the user.
bcma
module can prevent some cards from showing up and may need to be blacklisted.b43/b43legacy
The drivers are included in the kernel since 2.6.24.
Loading the b43/b43legacy kernel module
Verify which module you need by looking up your device here. You can also check by computer model here. Blacklist the other module (either b43
or b43legacy
) to prevent possible problems/confusion. For instructions, see Kernel_modules#Blacklisting.
Install the appropriate b43-firmwareAUR or b43-firmware-legacyAUR package from the AUR.
You can now configure your device.
broadcom-wl
For users of the broadcom-wl
driver, there is a PKGBUILD available in the AUR (broadcom-wlAUR). You can also download this driver directly from Broadcom. However, the PKGBUILD method is strongly encouraged, as that way will have pacman track all of the files.
Loading the wl kernel module
The wl
module may need to be manually loaded if there are other usable modules present. Before loading the wl
module, remove the b43
or other module that may have been automatically loaded instead:
# rmmod b43
Also unload ssb
, if loaded:
# rmmod ssb
ssb
may result in the wireless interface not being created.Load the wl
module
# modprobe wl
The wl
module should automatically load lib80211
or lib80211_crypt_tkip
. Check with lsmod
to see if this is the case. If not, you may need to add one of those two modules as well.
# modprobe lib80211
or
# modprobe lib80211_crypt_tkip
If you installed the driver directly from Broadcom, you may also need to update the dependencies:
# depmod -a
To make the module load at boot, add wl
(and lib80211
/lib80211_crypt_tkip
, if needed) to your MODULES array in /etc/rc.conf
.
MODULES=(... wl...)
You can also blacklist other modules (to prevent them from interfering) in /etc/modprobe.d/modprobe.conf
. To blacklist a module just append a new line with the syntax blacklist <module name>
:
blacklist b43 blacklist ssb
b43
and ssb
.Troubleshooting
Wi-Fi card does not work or show up since kernel upgrade (brcmsmac)
This is caused by the kernel using the bcma
module instead of the brcmsmac
module. The solution is to blacklist the bcma
module. For instructions, see Kernel_modules#Blacklisting.
Wi-Fi card does not work when resuming from suspend (brcm80211)
The brcm80211
module needs to be unloaded before suspend and reloaded upon resume, otherwise Wi-Fi will not come back up. This is printed by dmesg
:
wlc_coreinit: ucode did not self-suspend! wlc_suspend_mac_and_wait: waited 83000 uS and MI_MACSSPNDD is still not on. psmdebug 0x000f8773, phydebug 0x00000000, psm_brc 0x0000
The pm-utils page explains how to do this. If the file does not already exist, create a file called modules
or config
in /etc/pm/config.d/
and add/modify the following line:
SUSPEND_MODULES="brcm80211"
Now, the card should resume working correctly.
An alternative procedure:
1. Create the new file /etc/pm/sleep.d/brcm.sh
2. Insert this code and save:
#!/bin/bash # Simple Bash script to fix resume from suspend issues... # Place this script in /etc/pm/sleep.d/ # then chmod +x /etc/pm/sleep.d/brcm.sh case $1 in hibernate|suspend) /sbin/modprobe -r brcm80211 ;; thaw|resume) /sbin/modprobe brcm80211 ;; esac
3. Make it executable:
chmod +x /etc/pm/sleep.d/brcm.sh
Wi-Fi card does not work/show up (broadcom-wl)
Check if you are loading the correct modules. You may need to blacklist the brcm80211
, b43
, and ssb
kernel modules to prevent them from loading automatically. For instructions, see Kernel_modules#Blacklisting.
brcm80211
driver; although as of 2011-06-20, it will still default to loading the brcm80211
module before the wl
driver, which prevents wl
from being used.Check if you updated your module dependencies:
# depmod -a
- Verify that your wireless interface(s) appear using
ip addr
. - You may need to restart your machine to see the device appear in
iwconfig
orip addr
. - If you have recently upgraded your kernel, you need to rebuild the
broadcom-wl
package with the new kernel installed to update the module.
Interfaces swapped (broadcom-wl)
Users of the broadcom-wl
driver may find their Ethernet and Wi-Fi interfaces have been swapped. The udev page explains how to resolve this. Create a file named /etc/udev/rules.d/10-network.rules
and bind the MAC address of each of your cards to a certain interface name:
SUBSYSTEM=="net", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="eth0" SUBSYSTEM=="net", ATTR{address}=="ff:ee:dd:cc:bb:aa", NAME="eth1"
Ensure that the interface name appears correctly in /etc/rc.conf
and other configuration files that refer to it.
Miscellaneous user notes
- In my Dell Inspiron Laptop, I have a Broadcom BCM4401 Ethernet card and a Broadcom BCM4328 wireless card. If I just remove
b43
, I can load thewl
driver, but no wireless card shows up. However, if I first remove theb44
(andssb
) driver for my Ethernet card, and then load thewl
driver, I get a wireless device using the name eth0. Afterwards, I can loadb44
again, to have an Ethernet eth1 device.
- I could not get the BCM4313 chip on a Lenovo B560 to work before following these steps:
- "Load defaults" in the BIOS. After that, the wireless was working under MS Windows. There are not many options in there, so I do not know what the reset may have changed, but it did the trick.
- Blacklist the
acer_wmi
module. For testing, you can add the following to the kernel line in GRUB:acer_wmi.disable=1
- I have found that to get the
wl
drivers working for the Broadcom 4313 chip, you need to blacklistbrcm80211
along withb43
andssb
.
- If you notice slow wireless speeds when your laptop/netbook is not connected to AC power, you may need to disable Wi-Fi power management by adding the following line (assuming wlan0 is your wireless device)
iwconfig wlan0 power off
to/etc/rc.local
and create an empty file/etc/pm/power.d/wireless
. In case you also experience interface swapping (discussed above), you might want to add another line for the second interface name as well. The command will have no effect on the wired interface.