Difference between revisions of "Broadcom wireless"

From ArchWiki
Jump to: navigation, search
m (use wikipedia template)
(simplification and beautification of wikilinks, fixing whitespace, capitalization and section fragments (https://github.com/lahwaacz/wiki-scripts/blob/master/link-checker.py (interactive)))
 
(127 intermediate revisions by 55 users not shown)
Line 1: Line 1:
 +
[[Category:Wireless networking]]
 +
[[ja:Broadcom ワイヤレス]]
 
[[zh-CN:Broadcom wireless]]
 
[[zh-CN:Broadcom wireless]]
[[Category:Wireless Networking]]
+
{{Related articles start}}
 +
{{Related|Wireless}}
 +
{{Related articles end}}
 +
This article details how to install and setup a Broadcom wireless network device.
  
== Introduction ==
+
== History ==
  
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 ({{ic|brcm4xxx}}, {{ic|b43}}, etc.). The reverse-engineered [http://wireless.kernel.org/en/users/Drivers/b43 {{ic|b43}}] drivers have been in the kernel since 2.6.24.
+
Broadcom has a noted history with its support for Wi-Fi devices regarding GNU/Linux. For a good portion of its initial history, Broadcom devices were either entirely unsupported or required the user to tinker with the firmware. The limited set of wireless devices that were supported were done so by a reverse-engineered driver. The reverse-engineered {{ic|b43}} driver was introduced in the 2.6.24 kernel.
  
In August 2008, Broadcom released the [http://www.broadcom.com/support/802.11/linux_sta.php 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 August 2008, Broadcom released the [http://www.broadcom.com/support/802.11/linux_sta.php 802.11 Linux STA driver] officially supporting Broadcom wireless devices on GNU/Linux. This is a restrictively licensed driver and it does not work with hidden ESSIDs, but Broadcom promised to work towards a more open approach in the future.
  
In September 2010, Broadcom [http://thread.gmane.org/gmane.linux.kernel.wireless.general/55418 finally released] fully open source drivers for its hardware. This driver, [http://wireless.kernel.org/en/users/Drivers/brcm80211 {{ic|brcm80211}}], has been included into the kernel since 2.6.37. With the release of 2.6.39, these drivers have been renamed to {{ic|brcmsmac}} and {{ic|brcmfmac}}.
+
In September 2010, Broadcom [http://thread.gmane.org/gmane.linux.kernel.wireless.general/55418 released] a fully open source driver. The [http://wireless.kernel.org/en/users/Drivers/brcm80211 brcm80211] driver was introduced in the 2.6.37 kernel and in the 2.6.39 kernel it was sub-divided into the {{ic|brcmsmac}} and {{ic|brcmfmac}} drivers.
  
At the time of writing, there are three choices for users with Broadcom Wi-Fi chipsets:
+
The types of available drivers are:
  
{| class="wikitable" border="1" cellpadding="5" cellspacing="0"
+
{| class="wikitable"
! Driver !! Description
+
! Driver     !! Description
 
|-
 
|-
|brcmsmac/brcmfmac || Open source kernel driver
+
| brcm80211  || Kernel driver open-source version
 
|-
 
|-
|b43 || Reversed engineered kernel driver
+
| b43         || Kernel driver reverse-engineered version
 
|-
 
|-
|broadcom-wl || Proprietary Broadcom STA driver
+
| broadcom-wl || Broadcom driver restricted-license
 
|}
 
|}
  
== Determine which driver you need/can use ==
+
== Driver selection ==
  
First, determine your card's [[Wikipedia:PCI_configuration_space|PCI-ID]]. Type the following (case-sensitive) command into a console:
+
To know what driver(s) are operable on the computer's Broadcom wireless network device, the [[Wikipedia:PCI configuration space|device ID]] and chipset name will need to be detected. Cross-reference them with the driver list of supported [https://wireless.wiki.kernel.org/en/users/Drivers/brcm80211#supported_chips brcm80211] and [https://wireless.wiki.kernel.org/en/users/Drivers/b43#list_of_hardware b43] devices.
$ lspci -vnn | grep 14e4
+
  
If your card is in the following list, you can use the [[#brcmsmac.2Fbrcmfmac|{{ic|brcmsmac}} driver]]:
+
$ lspci -vnn -d 14e4:
{| border="1"
+
! PCI-ID !! Name
+
|-
+
| {{ic|[14e4:4727]}} || BCM4313
+
|-
+
| {{ic|[14e4:4353]}} || BCM43224
+
|-
+
| {{ic|[14e4:4357]}} || BCM43225
+
|}
+
If your card is in the following list, you can use the [[#brcmsmac.2Fbrcmfmac|{{ic|brcmfmac}} SDIO driver]]:
+
{| border="1"
+
! Name
+
|-
+
| BCM4329
+
|}
+
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, which supports following devices.
+
== Installation ==
{| border="1"
+
! PCI-ID !! Name !! Notes
+
|-
+
| {{ic|[14e4:4301]}} || BCM4301 || legacy-only
+
|-
+
| {{ic|[14e4:4306]}} || BCM4306 || <s>?legacy</s>
+
|-
+
| {{ic|[14e4:4307]}} || BCM4306 ||
+
|-
+
| {{ic|[14e4:4311]}} || BCM4311 ||
+
|-
+
| {{ic|[14e4:4312]}} || BCM4311 ||
+
|-
+
| {{ic|[14e4:4313]}} || BCM4311 ||
+
|-
+
| {{ic|[14e4:4315]}} || BCM4312 || Not in kernel26-lts
+
|-
+
| {{ic|[14e4:4318]}} || BCM4318 ||
+
|-
+
| {{ic|[14e4:4319]}} || BCM4318 ||
+
|-
+
| {{ic|[14e4:4320]}} || BCM4306 || ?legacy
+
|-
+
| {{ic|[14e4:4321]}} || BCM4321 || Not in kernel26-lts
+
|-
+
| {{ic|[14e4:4324]}} || BCM4306 || legacy-only
+
|-
+
| {{ic|[14e4:4325]}} || BCM4306 || legacy-only
+
|-
+
| {{ic|[14e4:4328]}} || BCM4321 || Not in kernel26-lts
+
|-
+
| {{ic|[14e4:4329]}} || BCM4321 || Not in kernel26-lts
+
|-
+
| {{ic|[14e4:432a]}} || BCM4321 ||
+
|-
+
| {{ic|[14e4:432b]}} || BCM4322 || Not in kernel26-lts
+
|-
+
| {{ic|[14e4:432c]}} || BCM4322 ||
+
|-
+
| {{ic|[14e4:432d]}} || BCM4322 ||
+
|-
+
| {{ic|[14e4:4359]}} || BCM43228 ||
+
|}
+
?legacy means that there are devices with same PCI-IDs, but with different hardware available.
+
Some of these work with the {{ic|b43}} driver, but some might need {{ic|b43legacy}} driver.
+
legacy-only means that you need to use the {{ic|b43legacy}} driver.
+
  
A more up-to-date list may be found [http://linuxwireless.org/en/users/Drivers/b43 here].
+
=== brcm80211 ===
  
If your card is in the following list, you can use the [[#broadcom-wl|{{ic|broadcom-wl}} driver]]:
+
The kernel contains two built-in open-source drivers: '''brcmsmac''' for PCI backends and '''brcmfmac''' for SDIO/USB backends. They should be automatically loaded when booting.
{| border="1"
+
! PCI-ID !! Name
+
|-
+
| {{ic|[14e4:4311]}} || BCM4311
+
|-
+
| {{ic|[14e4:4312]}} || BCM4311
+
|-
+
| {{ic|[14e4:4313]}} || BCM4311
+
|-
+
| {{ic|[14e4:4315]}} || BCM4312
+
|-
+
| {{ic|[14e4:4727]}} || BCM4313
+
|-
+
| {{ic|[14e4:4328]}} || BCM4321
+
|-
+
| {{ic|[14e4:4329]}} || BCM4321
+
|-
+
| {{ic|[14e4:432a]}} || BCM4321
+
|-
+
| {{ic|[14e4:432b]}} || BCM4322
+
|-
+
| {{ic|[14e4:432c]}} || BCM4322
+
|-
+
| {{ic|[14e4:432d]}} || BCM4322
+
|-
+
| {{ic|[14e4:4353]}} || BCM43224
+
|-
+
| {{ic|[14e4:4357]}} || BCM43225
+
|-
+
| {{ic|[14e4:4358]}} || BCM43227
+
|-
+
| {{ic|[14e4:4359]}} || BCM43228
+
|}
+
A more up-to-date list may be found [http://www.broadcom.com/docs/linux_sta/README.txt here].
+
  
 +
=== b43 ===
  
If your card is in the following list, you should use broadcom-wl in version 6.20.55.19 (or later), which may be found [https://aur.archlinux.org/packages.php?ID=62666 in AUR]
+
Two reverse-engineered open-source drivers are built-in to the kernel: '''b43''' and '''b43legacy'''. b43 supports most newer Broadcom chipsets, while the b43legacy driver only supports the early BCM4301 and BCM4306 rev.2 chipsets. To avoid erroneous detection of your WiFi card's chipset, [[blacklist]] the unused driver.
(more informations about this package can be found [https://bbs.archlinux.org/viewtopic.php?id=145884 here]).
+
{| border="1"
+
! PCI-ID !! Name
+
|-
+
| {{ic|[14e4:4365]}} || BCM43142
+
|}
+
  
== Getting the driver ==
+
Both of these drivers require non-free firmware to function. Install {{aur|b43-firmware}}, {{aur|b43-firmware-classic}} or {{aur|b43-firmware-legacy}} from the [[AUR]].
  
=== brcmsmac/brcmfmac ===
+
{{Note|
The {{ic|brcm80211}} drivers have been included in the kernel since 2.6.37. Since the release of 2.6.39, they have been renamed to {{ic|brcmsmac}} (for PCI cards) and {{ic|brcmfmac}} (for SDIO).
+
* BCM4306 rev.3, BCM4311, BCM4312 noticed to have problems with '''b43-firmware'''. Use {{aur|b43-firmware-classic}} for these cards instead.
 +
* BCM4331 noticed to have problems with '''b43-firmware-classic'''. Use {{aur|b43-firmware}} for this card instead.
 +
}}
  
These drivers should be automatically loaded during startup and no further action should be required of the user. If the driver doesn't auto load, try the following commands.
+
=== broadcom-wl ===
# modprobe brcmsmac
+
or
+
# modprobe brcmfmac
+
  
{{Note|The {{ic|bcma}} module can prevent some cards from showing up and may need to be [[#Wi-Fi_card_does_not_work.2Fshow_up_since_kernel_upgrade_.28brcmsmac.29|blacklisted]].}}
+
There are two version in [[AUR]] of the restrictively licensed driver:
 +
* the standard {{AUR|broadcom-wl}}
 +
* and the [[DKMS]] variant {{AUR|broadcom-wl-dkms}}
  
{{Note|Since linux 3.3.1 the {{ic|brcmsmac}} driver depends on the {{ic|bcma}} module and blacklisting is no longer required.}}
+
{{Tip|The DKMS variant {{AUR|broadcom-wl-dkms}}
 +
* is kernel agnostic. This means it supports different kernels you may use (e.g. {{AUR|linux-ck}}).
 +
* is kernel release agnostic too. It will be rebuild after a kernel is upgraded to a new release. If you use {{AUR|broadcom-wl}} or another kernel release dependant variant (e.g. {{AUR|broadcom-wl-ck}}), it may happen that kernel upgrades break wireless from time to time until the packages are in sync again}}
  
{{Note|[http://wireless.kernel.org/en/users/Drivers/brcm80211 wireless.kernel.org] states that brcm80211 does not support older PCI/PCI-E chips with ssb backplane.}}
+
==== Offline installation ====
  
=== b43/b43legacy ===
+
An Internet connection is the ideal way to install the '''broadcom-wl''' driver; many newer laptops with Broadcom cards forgo Ethernet ports, so a USB Ethernet adapter or [[Android tethering]] may be helpful. If you have neither, you'll need to first install the {{grp|base-devel}} group during installation. Then, use another Internet-connected computer to download {{pkg|linux-headers}} and the driver tarball from the AUR, and install them in that order.
The drivers are included in the kernel since 2.6.24.
+
  
==== Loading the b43/b43legacy kernel module ====
+
==== Manually ====
Verify which module you need by looking up your device [http://wireless.kernel.org/en/users/Drivers/b43#Known_PCI_devices here]. You can also check by computer model [http://linuxwireless.org/en/users/Drivers/b43/devices here]. Blacklist the other module (either {{ic|b43}} or {{ic|b43legacy}}) to prevent possible problems/confusion. For instructions, see [[Kernel_modules#Blacklisting]].
+
  
Install the appropriate {{AUR|b43-firmware}} or {{AUR|b43-firmware-legacy}} package from the [[AUR]].
+
{{Warning|This method is not recommended. Drivers that are un-tracked can become problematic or nonfunctional on system updates.}}
  
You can now configure your device.
+
Install the appropriate driver for your system architecture from [https://www.broadcom.com/support/?gid=1 Broadcom's website]. After this, to avoid driver/module collisions with similar modules and make the driver available, do:
  
=== broadcom-wl ===
 
{{Warning|Even though this driver has matured a lot throughout the years and works quite good nowadays, it's usage is recommended only when none of the two opensource drivers support your device. Please refer to project [http://linuxwireless.org/en/users/Drivers/b43/#Supported_devices b43's] page for list of supported devices.}}
 
For users of the {{ic|broadcom-wl}} driver, there is a PKGBUILD available in the AUR ({{AUR|broadcom-wl}}). You can also download this driver directly from [http://www.broadcom.com/support/802.11/linux_sta.php 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 {{ic|wl}} module may need to be manually loaded if there are other usable modules present. Before loading the {{ic|wl}} module, remove the {{ic|b43}} or other module that may have been automatically loaded instead:
 
 
  # rmmod b43
 
  # rmmod b43
 
Also unload {{ic|ssb}}, if loaded:
 
 
  # rmmod ssb
 
  # rmmod ssb
 
{{Note|Failure to unload {{ic|ssb}} may result in the wireless interface not being created.}}
 
 
Load the {{ic|wl}} module
 
 
  # modprobe wl
 
  # modprobe wl
  
The {{ic|wl}} module should automatically load {{ic|lib80211}} or {{ic|lib80211_crypt_tkip}}. Check with {{ic|lsmod}} to see if this is the case. If not, you may need to add one of those two modules as well.
+
The ''wl'' module should automatically load ''lib80211'' or ''lib80211_crypt_tkip'' otherwise they will have to be manually loaded.
# modprobe lib80211
+
  
or
+
If the driver does not work at this point, you may need to update dependencies:
# modprobe lib80211_crypt_tkip
+
  
If you installed the driver directly from Broadcom, you may also need to update the dependencies:
 
 
  # depmod -a
 
  # depmod -a
  
To make the module load at boot, add {{ic|wl}} (and {{ic|lib80211}}/{{ic|lib80211_crypt_tkip}}, if needed) to your MODULES array in {{ic|/etc/rc.conf}}.
+
To make the module load at boot, refer to [[Kernel modules]]. It is recommending that you [[blacklist]] conflicting modules.
MODULES=(... wl...)
+
  
You can also blacklist other modules (to prevent them from interfering) in {{ic|/etc/modprobe.d/modprobe.conf}}. To blacklist a module just append a new line with the syntax {{ic|blacklist <module name>}}:
+
== Troubleshooting ==
blacklist b43
+
blacklist ssb
+
  
{{Warning|Broadcom Corporation BCM4311 802.11b/g WLAN [14e4:4311] does not work with blacklisting {{ic|b43}} and {{ic|ssb}}.}}
+
=== Setting broadcom-wl in monitor mode ===
  
== Troubleshooting ==
+
To set broadcom-wl in monitor mode you have to set 1 to {{ic|/proc/brcm_monitor0)}}:
=== Wi-Fi card does not work or show up after kernel upgrade (brcmsmac) ===
+
  
This is caused by the kernel using the {{ic|bcma}} module instead of the {{ic|brcmsmac}} module. The solution is to blacklist the {{ic|bcma}} module. For instructions, see [[Kernel_modules#Blacklisting]].
+
# echo 1 > /proc/brcm_monitor0
{{Note|This affects only Linux kernels 3.0, 3.1, and 3.2. Since kernel 3.3, the {{ic|brcmsmac}} module actually uses {{ic|bcma}}, so {{ic|bcma}} needs to be unblacklisted or the Wi-Fi interface will not appear.}}
+
  
=== Wi-Fi card does not work/show up (broadcom-wl) ===
+
It will create a new network interface called {{ic|prism0}}.
Check if you are loading the correct modules. You may need to blacklist the {{ic|brcm80211}}, {{ic|b43}}, and {{ic|ssb}} kernel modules to prevent them from loading automatically. For instructions, see [[Kernel_modules#Blacklisting]].
+
  
{{Note|You may not have to blacklist the {{ic|brcm80211}} driver; although as of 2011-06-20, it will still default to loading the {{ic|brcm80211}} module before the {{ic|wl}} driver, which prevents {{ic|wl}} from being used.}}
+
To work in monitor mode, use this newly created network interface.
  
Check if you updated your module dependencies:
+
=== Device inaccessible after kernel upgrade ===
# depmod -a
+
 
 +
Since the 3.3.1 kernel the '''bcma''' module was introduced. If using a '''brcm80211''' driver be sure it has not been [[Kernel_modules#Blacklisting|blacklisted]]. It should be blackisted if using a '''b43''' driver.
 +
 
 +
If you are using {{aur|broadcom-wl}}, uninstall and reinstall it after upgrading your kernel.
 +
 
 +
=== Device with broadcom-wl driver not working/showing ===
 +
 
 +
Be sure the correct modules are blacklisted and occasionally it may be necessary to blacklist the '''brcm80211''' drivers if accidentally detected before the '''wl''' driver is loaded. Furthermore, update the modules dependencies {{ic|depmod -a}}, verify the wireless interface with {{ic|ip addr}}, kernel upgrades will require an upgrade of the non-[[DKMS]] package.
 +
 
 +
=== Interfaces swapped with broadcom-wl ===
 +
 
 +
Users of the broadcom-wl driver may find their Ethernet and Wi-Fi interfaces have been swapped. See [[Network configuration#Device names|device naming]] for an answer.
 +
 
 +
=== Interface is showing but not allowing connections ===
  
* Verify that your wireless interface(s) appear using {{ic|ip addr}}.
+
Append the following [[kernel parameter]]:
* You may need to restart your machine to see the device appear in {{ic|iwconfig}} or {{ic|ip addr}}.
+
* If you have recently upgraded your kernel, you need to rebuild the {{ic|broadcom-wl}} package with the new kernel installed to update the module.
+
  
=== Interfaces swapped (broadcom-wl) ===
+
b43.allhwsupport=1
Users of the {{ic|broadcom-wl}} driver may find their Ethernet and Wi-Fi interfaces have been swapped. The [http://wiki.archlinux.org/index.php/Udev#Mixed_Up_Devices.2C_Sound.2FNetwork_Cards_Changing_Order_Each_Boot udev] page explains how to resolve this. Create a file named {{ic|/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 {{ic|/etc/rc.conf}} and other configuration files that refer to it.
+
=== Suppressing console messages ===
  
=== Miscellaneous user notes ===
+
You may continuously get some verbose and annoying messages during the boot, similar to
* In my Dell Inspiron Laptop, I have a Broadcom BCM4401 Ethernet card and a Broadcom BCM4328 wireless card. If I just remove {{ic|b43}}, I can load the {{ic|wl}} driver, but no wireless card shows up. However, if I first remove the {{ic|b44}} (and {{ic|ssb}}) driver for my Ethernet card, and ''then'' load the {{ic|wl}} driver, I get a wireless device using the name ''eth0''. Afterwards, I can load {{ic|b44}} again, to have an Ethernet ''eth1'' device.
+
  
* I could not get the BCM4313 chip on a Lenovo B560 to work before following these steps:
+
phy0: brcms_ops_bss_info_changed: arp filtering: enabled true, count 0 (implement)
*# "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.
+
phy0: brcms_ops_bss_info_changed: qos enabled: false (implement)
*# Blacklist the {{ic|acer_wmi}} module. For testing, you can add the following to the kernel line in GRUB: {{ic|acer_wmi.disable<nowiki>=</nowiki>1}}
+
phy0: brcms_ops_bss_info_changed: arp filtering: enabled true, count 1 (implement)
 +
enabled, active
  
* I have found that to get the {{ic|wl}} drivers working for the Broadcom 4313 chip, you need to blacklist {{ic|brcm80211}} along with {{ic|b43}} and {{ic|ssb}}.
+
To disable those messages, increase the loglevel of printk messages that get through to the console - see [[Silent boot#sysctl]].
  
* 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) {{ic|iwconfig wlan0 power off}} to {{ic|/etc/rc.local}} and create an empty file {{ic|/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.
+
=== Device BCM43241 non-detected ===
  
* In my case on a HP pavilion netbook DM1 with a BCM4313 chip, with the original kernel brcmsmac driver, the LED didn't work, the power was awful, and it kept loosing the signal all the time, unless very close to the wifi hotspot. The last broadcom driver {{ic|wl}} solved everything. So in some cases, it's actually better than the kernel driver. However, I had  to install it in the initram image, along with lib80211 and lib80211_crypt_tkip to avoid a recurring kernel panic. (Use mkinitcpio)
+
This device will not display with either {{ic|lspci}} nor {{ic|lsusb}}; there is no known solution yet. Please remove this section when resolved.
  
* On a similar HP DM1 netbook I found the brcmsmac driver did not work either. The kernel panic can also be solved by blacklisting the brcmsmac, b43 and wl drivers. In rc.local you can modprobe wl without problems. On a sidenote: I get hard lockups, without any way to debug because there is nothing in kernel.log. Not sure if related to the wl driver though.
+
=== Connection is unstable with some routers ===
  
* Likewise, my HP Pavilion g7-1374ca also had problems with stock kernel drivers. I downloaded Broadcom tarball, but it wouldn't compile in 3.4.3. I removed the #include <asm/system.h> line and commented out a line referencing .ndo_set_multicast_list (there's only one). Then I was able to compile and load the module for a 100% strength signal, no lockups so far.
+
If no other approaches help, install {{Pkg|linux-lts}}, or use a [[Downgrading packages|previous driver version]].

Latest revision as of 08:57, 3 June 2016

Related articles

This article details how to install and setup a Broadcom wireless network device.

History

Broadcom has a noted history with its support for Wi-Fi devices regarding GNU/Linux. For a good portion of its initial history, Broadcom devices were either entirely unsupported or required the user to tinker with the firmware. The limited set of wireless devices that were supported were done so by a reverse-engineered driver. The reverse-engineered b43 driver was introduced in the 2.6.24 kernel.

In August 2008, Broadcom released the 802.11 Linux STA driver officially supporting Broadcom wireless devices on GNU/Linux. This is a restrictively licensed driver and it does not work with hidden ESSIDs, but Broadcom promised to work towards a more open approach in the future.

In September 2010, Broadcom released a fully open source driver. The brcm80211 driver was introduced in the 2.6.37 kernel and in the 2.6.39 kernel it was sub-divided into the brcmsmac and brcmfmac drivers.

The types of available drivers are:

Driver Description
brcm80211 Kernel driver open-source version
b43 Kernel driver reverse-engineered version
broadcom-wl Broadcom driver restricted-license

Driver selection

To know what driver(s) are operable on the computer's Broadcom wireless network device, the device ID and chipset name will need to be detected. Cross-reference them with the driver list of supported brcm80211 and b43 devices.

$ lspci -vnn -d 14e4:

Installation

brcm80211

The kernel contains two built-in open-source drivers: brcmsmac for PCI backends and brcmfmac for SDIO/USB backends. They should be automatically loaded when booting.

b43

Two reverse-engineered open-source drivers are built-in to the kernel: b43 and b43legacy. b43 supports most newer Broadcom chipsets, while the b43legacy driver only supports the early BCM4301 and BCM4306 rev.2 chipsets. To avoid erroneous detection of your WiFi card's chipset, blacklist the unused driver.

Both of these drivers require non-free firmware to function. Install b43-firmwareAUR, b43-firmware-classicAUR or b43-firmware-legacyAUR from the AUR.

Note:
  • BCM4306 rev.3, BCM4311, BCM4312 noticed to have problems with b43-firmware. Use b43-firmware-classicAUR for these cards instead.
  • BCM4331 noticed to have problems with b43-firmware-classic. Use b43-firmwareAUR for this card instead.

broadcom-wl

There are two version in AUR of the restrictively licensed driver:

Tip: The DKMS variant broadcom-wl-dkmsAUR
  • is kernel agnostic. This means it supports different kernels you may use (e.g. linux-ckAUR).
  • is kernel release agnostic too. It will be rebuild after a kernel is upgraded to a new release. If you use broadcom-wlAUR or another kernel release dependant variant (e.g. broadcom-wl-ckAUR), it may happen that kernel upgrades break wireless from time to time until the packages are in sync again

Offline installation

An Internet connection is the ideal way to install the broadcom-wl driver; many newer laptops with Broadcom cards forgo Ethernet ports, so a USB Ethernet adapter or Android tethering may be helpful. If you have neither, you'll need to first install the base-devel group during installation. Then, use another Internet-connected computer to download linux-headers and the driver tarball from the AUR, and install them in that order.

Manually

Warning: This method is not recommended. Drivers that are un-tracked can become problematic or nonfunctional on system updates.

Install the appropriate driver for your system architecture from Broadcom's website. After this, to avoid driver/module collisions with similar modules and make the driver available, do:

# rmmod b43
# rmmod ssb
# modprobe wl

The wl module should automatically load lib80211 or lib80211_crypt_tkip otherwise they will have to be manually loaded.

If the driver does not work at this point, you may need to update dependencies:

# depmod -a

To make the module load at boot, refer to Kernel modules. It is recommending that you blacklist conflicting modules.

Troubleshooting

Setting broadcom-wl in monitor mode

To set broadcom-wl in monitor mode you have to set 1 to /proc/brcm_monitor0):

# echo 1 > /proc/brcm_monitor0

It will create a new network interface called prism0.

To work in monitor mode, use this newly created network interface.

Device inaccessible after kernel upgrade

Since the 3.3.1 kernel the bcma module was introduced. If using a brcm80211 driver be sure it has not been blacklisted. It should be blackisted if using a b43 driver.

If you are using broadcom-wlAUR, uninstall and reinstall it after upgrading your kernel.

Device with broadcom-wl driver not working/showing

Be sure the correct modules are blacklisted and occasionally it may be necessary to blacklist the brcm80211 drivers if accidentally detected before the wl driver is loaded. Furthermore, update the modules dependencies depmod -a, verify the wireless interface with ip addr, kernel upgrades will require an upgrade of the non-DKMS package.

Interfaces swapped with broadcom-wl

Users of the broadcom-wl driver may find their Ethernet and Wi-Fi interfaces have been swapped. See device naming for an answer.

Interface is showing but not allowing connections

Append the following kernel parameter:

b43.allhwsupport=1

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

To disable those messages, increase the loglevel of printk messages that get through to the console - see Silent boot#sysctl.

Device BCM43241 non-detected

This device will not display with either lspci nor lsusb; there is no known solution yet. Please remove this section when resolved.

Connection is unstable with some routers

If no other approaches help, install linux-lts, or use a previous driver version.