# Broadcom wireless (简体中文)

## 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 | Reversed 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 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. If the driver doesn't auto load, try the following commands.

    # modprobe brcmsmac

or

    # modprobe brcmfmac

Note: The `bcma` module can prevent some cards from showing up and may need to be blacklisted.
Note: Since linux 3.3.1 the `brcmsmac` driver depends on the `bcma` module and blacklisting is no longer required.
Note: wireless.kernel.org states that brcm80211 does not support older PCI/PCI-E chips with ssb backplane.

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

You can now configure your device.

### broadcom-wl

Warning: This driver is more likely to cause problems than to resolve them. Most of the problems reported by users on Broadcom chips are caused by this driver. Using this is HIGHLY NOT recommended. Before you even think of trying out this one, make sure to try the other drivers first.

For users of the `broadcom-wl` driver, there is a PKGBUILD available in the AUR (broadcom-wl). 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

Note: Failure to unload `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

Warning: Broadcom Corporation BCM4311 802.11b/g WLAN [14e4:4311] does not work with blacklisting `b43` and `ssb`.

## 加载多博通网卡的内核驱动模块

在我的戴尔 Inspiron笔记本上，拥有BCM4401有线网卡和BCM4328无线网卡。如果我仅仅是移除b43模块，我能加载wl无线驱动，但是没有无线网卡显示。然而，如果我先移除有线网卡的b44(和ssb)驱动模块，然后加载wl无线驱动，则会有一个eth0无线网卡设备出现。之后，再重新加载b44驱动，这样就同时能有一个eth1的有线网卡出现。

短文版:

- Put "lib80211_crypt_tkip" and "wl" at the BEFORE b44 (if you have it) position in MODULES= 在 /etc/rc.conf 模块部分，b44(如果你需要这个驱动的话)之前加入lib80211_crypt_tkip wl
- 不要忘记把 b43 模块加入黑名单
- 您的无线网卡设备为eth0
- 您的有线网卡设备为eth1
- 两者能同是正常工作

## 故障解决

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

Note: This affects only Linux kernels 3.0, 3.1, and 3.2. Since kernel 3.3, the `brcmsmac` module actually uses `bcma`, so `bcma` needs to be unblacklisted or the Wi-Fi interface will not appear.

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

Note: You may not have to blacklist the `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` or `ip 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.

### 网卡设备界面总是互换

这个本驱动的常见问题.而我根据 udev post来设定我的BCM4312网卡:

创建一个`/etc/udev/rules.d/10-network.rules`文件并根据网卡的MAC地址来命名网卡设备名.

    SUBSYSTEM=="net", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="eth0"
    SUBSYSTEM=="net", ATTR{address}=="ff:ee:dd:cc:bb:aa", NAME="eth1"

语法说明:

- NAME="eth0" 是你想要的设备名称,例如"eth0". 你也可以使用其它的来代替,如"lan0"来代替eth0或者"wlan0"代替eth1.
- 可以通过如下命令查看网卡MAC地址: `udevadm info -a -p /sys/class/net/<yourdevice> | grep address`

但是首先你要知道eth0不是eth1,反之亦然, 当然你可以扫描下设备: `iwlist scan` 如果eth0变成了eth1,那么现在eth1的MAC地址,就是之前eth0的MAC地址.

别忘记更新 /etc/rc.conf 和其它要用到ethX的配置文件!

### 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 device using the name eth0. Afterwards, I can load `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:
  1. "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.
  2. 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 blacklist `brcm80211` along with `b43` and `ssb`.

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

- 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 `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)

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

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

Category:

- Wireless Networking (简体中文)