Broadcom wireless
Contents
- 1 Introduction
- 2 Determine which driver you need/can use
- 3 Getting the driver
-
4 Troubleshooting
- 4.1 Wi-Fi card does not seem to even exist
- 4.2 Wi-Fi card does not work or show up after kernel upgrade (brcmsmac)
- 4.3 Wi-Fi card does not work/show up (broadcom-wl)
- 4.4 Interfaces swapped (broadcom-wl)
- 4.5 The b43 driver and Linux 3.8+
- 4.6 Suppressing console messages
- 4.7 Interface is showing but does not allow connections
- 4.8 Miscellaneous user notes
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:
Driver | Description |
---|---|
brcmsmac/brcmfmac | Open-source kernel driver |
b43 | Reverse-engineered kernel driver |
broadcom-wl | Proprietary Broadcom STA driver |
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:
Then check your card against this list of supported b43 devices and this list of supported brcm80211 devices.
Getting the driver
brcmsmac/brcmfmac
The brcm80211
drivers are included in the kernel. They are named brcmsmac
for PCI cards and brcmfmac
for SDIO devices.
These drivers should be automatically loaded during start-up and no further action should be required of the user. If the driver does not load automatically, simply load it manually.
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-firmware or b43-firmware-legacy package from the AUR.
If you have a low-power version of a b43-supported device, you will need to install special firmware. A quick way to check whether you have a low-power chip is by running lspci | grep Broadcom | grep LP-PHY
. You can install it by downloading the appropriate package and using b43-fwcutter
as outlined below, or by using this installation script.
To install the LP-PHY firmware, perform the following:
curl -LO http://downloads.openwrt.org/sources/broadcom-wl-4.178.10.4.tar.bz2 tar xjf broadcom-wl-4.178.10.4.tar.bz2 cd broadcom-wl-4.178.10.4/linux b43-fwcutter -w /lib/firmware wl_apsta.o
After installing the firwmare, you can now configure your device.
broadcom-wl
For users of the broadcom-wl
driver, there are packages available in the AUR named broadcom-wl, or, for those who prefer to use DKMS, broadcom-wl-dkms.
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
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, refer to Kernel modules.
You can also blacklist other modules (to prevent them from interfering) in /etc/modprobe.d/modprobe.conf
. To blacklist a module, refer to Kernel modules#Blacklisting.
Troubleshooting
Wi-Fi card does not seem to even exist
Some users with newer cards like the Broadcom BCM43241 will experience an issue where lspci or lsusb will not show any trace of the card. A solution to this will be posted when found.
Wi-Fi card does not work or show up after 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/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.
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. See Network configuration#Device_names for solution.
The b43 driver and Linux 3.8+
The b43 driver has some major issues starting with the release of Linux 3.8+, namely that you are unable to see / connect to some access points.
Solution: Try the latest broadcom-wl driver (version 6+), see above.
Suppressing console messages
You may continuously get some verbose and annoying messages during the boot, similar to
phy0: brcms_ops_bss_info_changed: arp filtering: enabled true, count 0 (implement) phy0: brcms_ops_bss_info_changed: qos enabled: false (implement) phy0: brcms_ops_bss_info_changed: arp filtering: enabled true, count 1 (implement) enabled, active
These do not seem to be suppressible via normal means, such as setting MaxLevelConsole
in /etc/systemd/journald.conf
. To hide them, you must lower the level at which dmesg
messages are printed to the console. This can be done on start-up by creating a simple systemd service.
Create a file in /etc/systemd/system/
called brcms_suppression.service
or something similar:
brcms_suppression.service
[Unit] Description=Broadcom console message suppression script [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/sh -c 'dmesg -n 3' [Install] WantedBy=multi-user.target
Like all other systemd services, you can then enable it with
# systemctl enable brcms_suppression
Interface is showing but does not allow connections
Append the following to your kernel command line:
b43.allhwsupport=1