Broadcom wireless

From ArchWiki
Revision as of 01:18, 12 August 2011 by Karper (Talk | contribs) (Changed references to brcm80211 to brcmsmac where appropriate. Merged some troubleshooting sections and made it clearer which modules and kernel versions the issues affect)

Jump to: navigation, search

This template has only maintenance purposes. For linking to local translations please use interlanguage links, see Help:i18n#Interlanguage links.


Local languages: Català – Dansk – English – Español – Esperanto – Hrvatski – Indonesia – Italiano – Lietuviškai – Magyar – Nederlands – Norsk Bokmål – Polski – Português – Slovenský – Česky – Ελληνικά – Български – Русский – Српски – Українська – עברית – العربية – ไทย – 日本語 – 正體中文 – 简体中文 – 한국어


External languages (all articles in these languages should be moved to the external wiki): Deutsch – Français – Română – Suomi – Svenska – Tiếng Việt – Türkçe – فارسی

Introduction

Broadcom has been notorious in its support for its Wi-Fi cards on 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 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 chips:

  • brcmsmac/brcmfmac
  • broadcom-wl
  • b43

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 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.

If your card is not in the above lists, you may need to use the b43 or b43legacy drivers. A somewhat more complete list of supported hardware can be found here. Note that several cards are supported by more than one driver.

Getting the driver

brcmsmac

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 is required of the user.

broadcom-wl

For users of the broadcom-wl driver, there is a PKGBUILD available in AUR. You can also download this driver directly from Broadcom. However, the PKGBUILD method is strongly encouraged, as that way, pacman will track all 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

NOTE: Failure to unload ssb may result in the wireless interface not being created.

Load the wl module

# modprobe wl

The wl module should autoload lib80211 or lib80211_crypt_tkip. Check with lsmod to see if this is the case. If not, you may need to add that module 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 Template:Filename.

MODULES=(... wl...)

You can also blacklist other modules (to prevent them from interfering) in Template:Filename. To blacklist a module just append a new line with the syntax blacklist <module name>:

blacklist b43
blacklist ssb
Warning: Blacklisting modules in rc.conf has been deprecated and no longer works in initscripts 2011.06.1-1. Therefore, one of the following methods must be used.

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. In Template:Filename, blacklist the other module to prevent possible problems/confusion:

MODULES=(... !b43legacy b43)

or

MODULES=(... !b43 b43legacy)

Install the appropriate b43-firmware or the b43-firmware-legacy package from AUR.

In a new folder, execute the following commands (note: not needed, as installing the AUR package will do it automatically).

sudo pacman -S b43-fwcutter
export FIRMWARE_INSTALL_DIR="/lib/firmware"
wget 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
sudo b43-fwcutter -w "$FIRMWARE_INSTALL_DIR" wl_apsta.o

Restart your computer and configure your device as normal.

Troubleshooting

Wi-Fi card does not work/show up since kernel upgrade (brcmsmac)

Note: This affects kernel 3.0.

This is caused by the kernel using the bcma module instead of the brcmsmac module. The solution is to blacklist the bcma module in Template:Filename

blacklist bcma

Now, rebuild the initramfs image and everything should work as expected.

# mkinitcpio -p linux

Wi-Fi card does not work when resuming from suspend (brcm80211)

Note: This issue only affects kernels 2.6.38 and earlier.

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 doesn't already exist, create a file called modules or config in Template:Filename and add/modify the following line:

SUSPEND_MODULES="brcm80211"

Now, the card should resume working correctly.

An alternative procedure:

1. Create the new file Template:Filename

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)
/sbin/modprobe -r brcm80211
;;
suspend)
/sbin/modprobe -r brcm80211
;;
resume)
/sbin/modprobe brcm80211
;;
thaw)
/sbin/modprobe brcm80211
;;
esac

3. Make it executable:

chmod +x /etc/pm/sleep.d/brcm.sh

Wi-Fi card locks up (brcm80211)

Note: This issue only affects kernels 2.6.37 and earlier.

There is a common problem with some chips running on multi-core systems where the system will lock up while running 'iwlist scan' (or in the scanning process using a wireless client). The only known solution for this (so far) is to run your system with only one core. This can be done by appending 'maxcpus=1' to your kernel line in GRUB's Template:Filename (or the equivalent for whatever bootloader you use).

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 modules to prevent them from loading automatically in Template:Filename.

blacklist brcm80211
blacklist b43
blacklist ssb

Note that you may not have to blacklist the brcm80211 driver, though as of 2011/06/20 it will still default to loading the brcm80211 module before the wl driver, preventing wl from being used.

Warning: Blacklisting modules in Template:Filename has been obsoleted and no longer works in initscripts 2011.06.1-1, so you will have to use one of the following methods.

Check if you updated your module dependencies:

# depmod -a
  • Be sure to try ifconfig -a, instead of just ifconfig since the latter only shows interfaces that are up.
  • You may need to restart to see the device appear in iwconfig.
  • 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 wifi interfaces swapped. The udev page explains how to solve this. Create a file called Template:Filename 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 Template:Filename 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 the wl driver, but no wireless card shows up. However, if i first remove the b44 (and ssb) driver for my ethernet card, and THEN load the wl driver, I get a wireless eth0. Afterwards, I can load b44 again, to have an ethernet eth1.
  • I couldn't get the BCM4313 chip on a Lenovo B560 to work before following these steps:
    1. "Load defaults" in the BIOS. After that, the wireless was working under Windows. There aren't many options in there, so I don't know what the reset may have changed, but it did the trick.
    2. Blacklist the acer_wmi module. For testing, you can add the following to the kernel line in grub:
      acer_wmi.disable=1
  • I've found that to get the wl drivers working for the Broadcomm 4313 chip, you need to blacklist brcm80211 along with b43 and ssb.