NOTE: this page is for archival only, see the note at the end of the page.

b43 and b43legacy

b43 and b43legacy are drivers for the 802.11 B/G/N family of wireless chips that Broadcom produces. The choice of which driver your card uses depends on the revision level of the 802.11 core. If your card is a BCM4306 Rev 2 or only has 802.11b capability, it uses b43legacy. All other models use b43. This number is read by the driver ssb, and the correct choice for your device is made at that point. The drivers are called bcm43xx in mainline kernels, and b43 and b43legacy in wireless-2.6 and 2.6.24 and later.

Please read this whole document and the FAQ before asking questions to the developers.

Caveats

  • The b43/b43legacy drivers require proprietary firmware to be loaded onto the wireless chip before it can operate, see below.

  • If you have an Broadcom USB device, please use the rndis_wlan driver. The b43/b43legacy driver is not meant to support this device.

  • Both the b43 and b43legacy drivers conflict with the broadcom-wl driver, otherwise known as Broadcom's 802.11 Linux STA driver or simply broadcom-sta. If you want to use the b43 driver in favor of broadcom-wl, make sure that your Broadcom wireless chipset is supported on the supported device list first. You will need to either remove or unload the broadcom-wl driver prior to using b43 by following: Switching to b43 when broadcom-wl is currently in use

Known issues

  • LP-PHY devices: DMA errors on some machines with kernel 2.6. Problem was fixed in 3.0. Using PIO (module param) can be used as workaround for 2.6.
  • BCM4318 chipset: AP mode does not work because of packet loss in high transmission rates. Hard to debug & fix.

  • BCM4321: some cards do not work in DMA mode (PIO is needed).

Supported devices

To find out whether a PCI device is supported by the b43 or b43legacy drivers, issue this lspci command:

lspci -vnn | grep 14e4

The command will output a string similiar to this example:

0001:01:01.0 Network controller [0280]: Broadcom Corporation BCM4318 [AirForce One 54g] 802.11g Wireless LAN Controller [14e4:4318] (rev 02)

Ignore everything, except the last part inside of the [ ]. Find that phrase in the below table to determine support.

For any of the devices that have two or more supported drivers separated by a slash (/), you can only use one of the mentioned drivers at a time. It does not mean you can run two or more drivers simultaneously, as the drivers will conflict with each other.

PCI-ID

Supported?

Chip ID

Modes

PHY version

Alternative

14e4:0576

not tested

BCM43224

?

?

wl/brcm80211

14e4:4301

yes (b43legacy)

BCM4301

b

B

14e4:4306

yes (b43legacy)

BCM4306/2

b/g

G

14e4:4307

yes

BCM4306/3

b/g

G

14e4:4311

yes

BCM4311

b/g

G

wl/brcm80211

14e4:4312

yes

BCM4311

a/b/g

G (r8)

wl/brcm80211

14e4:4313

not tested

BCM4311

a

?

wl/brcm80211

14e4:4315

yes (2.6.33+)

BCM4312

b/g

LP (r1)

wl/brcm80211

14e4:4318

yes

BCM4318

b/g

G (r7)

14e4:4319

yes

BCM4318

a/b/g

G

14e4:4320

yes (b43legacy)

BCM4306/2

b/g

G

14e4:4320

yes

BCM4306/3

?

?

14e4:4320 (USB)

no (USB device)

BCM4320

a/g

?

rndis_wlan

14e4:4321

partially in 2.6.39+

BCM4321

?

N (r2)

14e4:4322

no

BCM4322

b/g/n

N (r4)

14e4:4323 (USB)

no (USB device)

BCM4323

a/b/g/n

?

ndiswrapper

14e4:4324

yes (b43legacy)

BCM4306

?

G (r1/2)

14e4:4325

not tested (b43legacy)

BCM4306

?

?

14e4:4328

partially in 2.6.39+

BCM4321

b/g/n

N (r2)

wl/brcm80211

14e4:4329

partially in 2.6.39+

BCM4321

b/g/n

N (r1)

wl/brcm80211

14e4:432a

not tested

BCM4321

a/n

N

wl/brcm80211

14e4:432b

partially in 2.6.39+

BCM4322

a/b/g/n

N (r4)

wl/brcm80211

14e4:432c

not tested

BCM4322

b/g/n

N

wl/brcm80211

14e4:432d

not tested

BCM4322

a/n

N

wl/brcm80211

14e4:4331

soon (3.2+)

BCM4331

?

HT (r1)

14e4:4353

yes (3.1+)

BCM43224

a/b/g/n

N (r6)

wl/brcm80211

14e4:4357

yes (3.1+)

BCM43225

b/g/n

N (r6)

wl/brcm80211

14e4:4358

not tested

BCM43227

b/g/n

?

wl/brcm80211

14e4:4359

not tested

BCM43228

a/b/g/n

?

wl/brcm80211

14e4:435a

not tested

?

?

?

wl

14e4:4727

no (WIP)

BCM4313

b/g/n

LCN (r1)

wl/brcm80211

14e4:5354

not tested

?

b/g

LP

14e4:a99d

not tested

BCM43421?

?

?

wl

Note that the PCI-ID is not in direct correlation with the Chip ID. Often the PCI-ID equals the Chip ID, but that is not always the case and it is a constant source of confusion.

Chips that are not supported include:

  • The 802.11a part of the 4311 is not supported
  • BCM4320 (USB) - try rndis_wlan

  • BCM4313 - chipset uses unsupported LCN PHY, we work on it
  • All other Broadcom chipsets not listed above are not supported. Feel free to notify the devs via mailing list and/or IRC channel of newer chipsets.

For a list of available devices, please see the device list.

Support

Features

Working

  • Station mode
  • Mesh networking mode (b43 only)
  • Access Point mode
  • Ad-Hoc (IBSS) mode (b43 only)
  • Monitor and Promisc mode.
  • "Monitor while operating" and multiple monitor interfaces.
  • In-Hardware traffic de/encryption (relieves your CPU).
  • LEDs to signal card state and traffic.
  • In-Hardware MAC address filter (b43 only; impossible on b43legacy hardware)
  • Packet injection (with radiotap; no FCS injection currently though hardware supports it - a radiotap flag is being discussed for this)
  • Bluetooth coexistence protection, if the bluetooth card is physically connected to the wireless chip. (Does not protect against external BT dongles)
  • Probably something we forgot to add here.

Not working yet

  • Interference mitigation.
  • HT
  • 40MHz channels
  • 5GHz for N-PHY cards
  • Probably something else that's not listed under "Works".

Device firmware installation

The Broadcom wireless chip needs proprietary software (called "firmware") that runs on the wireless chip itself to work properly. This firmware is copyrighted by Broadcom and must be extracted from Broadcom's proprietary drivers. To get such firmware on your system, you must download the driver from a legal distribution point, extract it, and install it. This is accomplished different ways by different Linux distributions, so please read the section for yours for the best results. You will need an alternate working internet connection (by Ethernet cable, for example) since the firmware cannot be included with the distro itself.

Post details for missing distributions at b43-dev@lists.infradead.org. Note: the firmware from the binary drivers is copyrighted by Broadcom Corporation and cannot be redistributed.

Fedora

With Fedora 10 and above, you should install wget and the b43-fwcutter tool (which will extract firmware from the Windows driver):

   1 su -
   2 yum install b43-fwcutter wget

Next use the instructions here, skipping b43-fwcutter installation part.

openSUSE

openSUSE 11.3 and above includes a utility that will automatically download the firmware and install it into its proper location. With working Internet access, run the following commands:

   1 sudo zypper install b43-fwcutter
   2 sudo /usr/sbin/install_bcm43xx_firmware

Ubuntu/Debian

In recent versions of Ubuntu and Debian, installing the b43-fwcutter package will handle everything for you:

   1 sudo apt-get install b43-fwcutter

You will be asked to automatically fetch and install the firmware into the right location. Again, you will need an internet connection.

Ubuntu Community Documentation

Ubuntu also has a page detailing the process of installing Broadcom wireless drivers on their community documentation. If you have internet access on the device that you want to install the b43 driver onto, follow this link: https://help.ubuntu.com/community/WifiDocs/Driver/bcm43xx#b43%20-%20Internet%20access . If you do not have internet access on the device that has a b43 supported broadcom wireless chipset and would like to use b43, follow this link instead: https://help.ubuntu.com/community/WifiDocs/Driver/bcm43xx#b43%20-%20No%20Internet%20access.

Note that you can only follow one of the two guides, not both.

Gentoo

Gentoo systems supply a pre-compiled binary for b43-fwcutter. You need to:

   1 emerge b43-fwcutter

and then follow the instructions below to download the Broadcom driver. The line that invokes b43-fwcutter will need to be changed to execute the program emerged above.

Mandriva

See the instructions at http://wiki.mandriva.com/en/Installing_wireless_network_cards_using_the_b43_driver

Other distributions not mentioned above

Note: You need to have a compiler and headers for libc installed, since you will have to build fwcutter from source

Install b43-fwcutter

Use version 015 of b43-fwcutter.
Download, extract the b43-fwcutter tarball and build it:

   1 wget http://bu3sch.de/b43/fwcutter/b43-fwcutter-015.tar.bz2
   2 tar xjf b43-fwcutter-015.tar.bz2
   3 cd b43-fwcutter-015
   4 make
   5 sudo make install
   6 cd ..

If you are using the b43 driver from 3.2 kernel or newer:

After installing b43-fwcutter, download version 5.100.138 of Broadcom's proprietary driver and extract the firmware from it:

   1 export FIRMWARE_INSTALL_DIR="/lib/firmware"
   2 wget http://www.lwfinger.com/b43-firmware/broadcom-wl-5.100.138.tar.bz2
   3 tar xjf broadcom-wl-5.100.138.tar.bz2
   4 sudo b43-fwcutter -w "$FIRMWARE_INSTALL_DIR" broadcom-wl-5.100.138/linux/wl_apsta.o

If you are using the b43 driver from older kernel:

After installing b43-fwcutter, download version 5.10.56.27.3 of Broadcom's proprietary driver and extract the firmware from it:

   1 export FIRMWARE_INSTALL_DIR="/lib/firmware"
   2 wget http://mirror2.openwrt.org/sources/broadcom-wl-5.10.56.27.3_mipsel.tar.bz2
   3 tar xjf broadcom-wl-5.10.56.27.3_mipsel.tar.bz2
   4 sudo b43-fwcutter -w "$FIRMWARE_INSTALL_DIR" broadcom-wl-5.10.56.27.3/driver/wl_apsta/wl_prebuilt.o

Note that you must adjust the FIRMWARE_INSTALL_DIR path to your distribution. The standard place where firmware is installed to is /lib/firmware. However some distributions put firmware in a different place.

If you are using the b43legacy driver:

After installing b43-fwcutter, download version 3.130.20.0 of Broadcom's proprietary driver and extract the firmware from it:

   1 export FIRMWARE_INSTALL_DIR="/lib/firmware"
   2 wget http://downloads.openwrt.org/sources/wl_apsta-3.130.20.0.o
   3 sudo b43-fwcutter -w "$FIRMWARE_INSTALL_DIR" wl_apsta-3.130.20.0.o

Note that you must adjust the FIRMWARE_INSTALL_DIR path to your distribution. The standard place where firmware is installed to is /lib/firmware. However some distributions put firmware in a different place.

List of firmware

Earlier we were using other, older firmwares. The table contains all drivers supported by fwcutter.

Driver

Version of wl

Firmware

Firmware extractor

b43

5.100.138

666.2

b43-fwcutter-015

b43

5.100.104.2

644.1001

b43-fwcutter-015

b43

5.10.144.3

508.154

b43-fwcutter-015

b43

5.10.56.2808

508.10872

b43-fwcutter-015

b43

5.10.56.51

508.1107

b43-fwcutter-015

b43

5.10.56.27.3?

508.1084

b43-fwcutter-014

b43

4.174.64.19

478.104

b43-fwcutter-013

b43

4.150.10.5

410.2160

b43-fwcutter-012

b43

4.80.53.0

351.126

b43-fwcutter-012

b43legacy

3.130.20.0

295.14

b43-fwcutter-012

bcm43xx (deprecated)

3.130.20.0

295.14

bcm43xx-fwcutter-006

bcm43xx, b43legacy, b43, softmac,... the full story

Many different drivers are or have been in use to support Broadcom chipsets, so the terminology is very confusing. The sections below aim to help you understand what is what.

Comparison of recent drivers

Basic info

b43

wl

brcmsmac

Open source

yes

no

yes

In kernel

yes

no

staging

Supported buses

b43

wl

brcmsmac

ssb

yes

yes

no

bcma

yes

yes

yes

Supported PHYs

b43

wl

brcmsmac

G

yes

yes

no

N

yes

yes

yes

LP

yes

yes

no

HT

yes

no

no

LCN

no

yes

yes

Supported modes

b43

wl

brcmsmac

Managed

yes

yes

yes

Ad-Hoc

yes

yes

unknown

Monitor

yes

no

no

AP

yes

no

no

bcm43xx

bcm43xx is the old deprecated driver. It uses the ieee80211 + softmac libraries of code shared with other drivers. This stack is deprecated and being replaced by the new mac80211 stack. A new stack implies brand new, re-written driver(s): b43 and b43legacy.

What's the difference between b43legacy and b43?

b43 offers a newer codebase and hardware cryptography support. However, Broadcom did not release any version 4 firmware files for some older boards, possibly due to memory constraints on the cards themselves. Stuck with firmware version 3, these cards must use b43legacy which doesn't have hardware crypto support because it has not been reverse engineered completely.

bcm43xx

b43legacy

b43

needs firmware

version 3

version 4

extracted by

bcm43xx-fwcutter

b43-fwcutter

depends on

softmac

mac80211

b43legacy should be used on all BCM4301 cards and BCM4306 cards with a 80211 core revision of 4 or less. b43 should be used on all other cards. You can safely have both versions built on the same system. Info about cores is printed by ssb when the driver finds a board; type "dmesg" to see it. If you are unsure or don't know what we are talking about here, get both of the firmwares and both b43 and b43legacy and the kernel autoloader will automatically load the correct driver for your device.

What about broadcom-wl/sta?

Broadcom has elected to create their own proprietary driver for Linux. This is possibly due to various portable computer manufacturers like Dell including Broadcom's wireless chipsets in their devices. Also, many users/owners have expressed concerns and the pain of using ndiswrapper to use b43 so the driver was created to alleviate such issues.

However, broadcom-wl does not support some things that b43/b43legacy does. broadcom-wl can only offer connection to AP or Ad-Hoc networks, it does not offer AP modes and Monitor modes. Furthermore, the driver does not cooperate well with iw tools because it has its own ieee80211 stack. This stack is both outdated and does not work with the mac80211 stack which b43/b43legacy is based on.

Users of unsupported Broadcom devices wanting more functionality out of the broadcom-wl driver will have no choice but to continue emailing Broadcom. There will be no support offered by the b43 developers due to the fact that the driver is mainly proprietary. This is not the developers' faults but Broadcom's conflicts with the Linux community.

Open-source driver from Broadcom (brcm80211)

On 09/09/2010, Broadcom released an open driver for their SSB-less chipsets. However, it only supported three chips (bcm4313, bcm43224, bcm43225). The driver is merged into kernel 2.6.37 under brcm80211. More information is available on this release at http://lwn.net/Articles/404248/.

On 27/11/2010, Broadcom added staging support for bcm4329 via brcmfmac under brcm80211. The included documentation noted 4329 (SDIO) support. However, this may work with other variants of the bus interconnection apart from SDIO.

Switching to b43 when broadcom-wl is currently in use

If you want to use b43 in favour of broadcom-sta and your Broadcom wireless chipset is supported from the device list, you will first need to unload the broadcom-wl driver:

   1 modprobe -r wl

Users that have chipsets with only partial b43 support may want to retain the broadcom-wl driver without loading it. Blacklisting broadcom-wl is the recommended way to do this:

   1 echo "blacklist wl" >> /etc/modprobe.d/blacklist

This will make sure that b43 is automatically loaded instead of broadcom-wl.

Those who wish to remove the broadcom-wl driver from their filesystem completely should seek their distribution documentation.

Switching to broadcom-wl when b43 is currently in use

For various reasons, you may want to switch back to broadcom-wl instead of b43. To do this, first unload the b43/b43legacy driver:

   1 modprobe -r b43
   2 modprobe wl

This will make sure that broadcom-wl is automatically loaded instead of b43.

Bug reporting

If you encounter a bug, you should send a message to the b43/b43legacy mailing list at b43-dev@lists.infradead.org containing ALL of the following:

  • A description of the problem at hand
  • When it happens
  • How to reproduce
  • wlan configuration and authentication/encryption type
  • The output of the following commands:

   1 uname -a

   1 lspci -vvn|grep 43 -A7

   1 dmesg

In addition the following may be of interest to developers:

  • If you have built the kernel from git, tell which tree, the output of "git describe"
  • If the driver worked with earlier kernels, but has since stopped working, a bisection is of great value.

Related tools

  • ssb-sprom
    • A tool for the modification of the Broadcom Sonics Silicon Backplane SPROM (e.g. you can permanently change the MAC address or the PCI IDs of your wireless card – useful on some (e.g. Compaq/HP) laptops where the BIOS checks these at boot. It's now part of b43-tools:

git clone git://git.bu3sch.de/b43-tools.git
  • To use the sprom tool, it is necessary to get a disk copy of your sprom from the /sys file system. The file path for the sprom contents depends on the bus layout of the specific computer being used and will be something like
    /sys/devices/pci0000:00/0000:00:0d.0/0000:04:00.0/ssb_sprom
  • It is not recommended that you try to type the name. Instead, you should use the following commands to get the working copy:
    SSB_SPROM=$(find /sys/devices -name ssb_sprom)
    echo $SSB_SPROM
  • If the echo command only results in a single instance of "/sys/...", you may proceed. For systems with more than one SSB-based interface, there will be such a string for each, and the command that sets the SSB_SPROM symbol will have to be changed. In the name above, the sequence states that this device is attached to the 0'th PCI bus via bridge 0d.0 and is device 04:00.0 on that bridge. To find which of your SSB devices to select, use the 'lspci -v' command. On my system, the first line of such output for my interface is "04:00.0 Network controller: Broadcom Corporation BCM94311MCG wlan mini-PCI (rev 02)". For this device, one would use
    SSB_SPROM=$(find /sys/devices -name ssb_sprom | grep 04:00.0)
    echo $SSB_SPROM
  • Of course, the "04:00.0" needs to match your system, and check the output value to determine that there is now a single instance of "/sys..." and that the path matches the device whose SPROM is to be changed. If not, adjust the string after 'grep' accordingly.
  • Once the SSB_SPROM variable matches the path to ssb_sprom for your device, get a working copy of the sprom contents with
    sudo cat $SSB_SPROM > ssb_sprom_copy
  • You may now look at the contents of your sprom with the command
    ssb-sprom -i ssb_sprom_copy -P
  • As an example, let us suppose that you have purchased a Dell mini-pci card to use in an HP laptop. The HP BIOS refuses to use the card when the pcivendor is Dell (code 0x1028), not HP (code 0x103C). From the information provided by an "ssb-prom –help" command, we learn that the switch needed to change this vendor code is "–subv". To change that code, we use the command
    ssb-sprom -i ssb_sprom_copy -o new_ssb_sprom_copy --subv 0x103C
  • to write the HP vendor ID to our working copy. I use different input and output files so as not to destroy the original. If further changes are needed, for example the PCI product ID, the command
    ssb-sprom -i new_ssb_sprom_copy -o new_ssb_sprom_copy --subp 0x137C
  • would be used. Note that the input and output files may be the same.
  • Once you think you have updated correctly, use the following to check the contents:
    ssb-sprom -i ssb_sprom_copy -P
  • Once the sprom contents are the way you want them, and presumably correct, you are ready to rewrite the file. First, use
    echo $SSB_SPROM
  • to ensure that this symbol still contains the SPROM path. If not, then it will have to be reloaded as discussed above.
  • You are then ready to rewrite the sprom with
    sudo cp new_ssb_sprom_copy $SSB_SPROM
  • IMPORTANT: The 2.6.32 kernel will throw the following error message and refuse to write the SPROM:

    SPROM write: Could not freeze devices. No suspend support. Is CONFIG_PM enabled?
  • Apply the following patch to the 2.6.32 kernel to allow programming the SPROM on that kernel. Alternatively install a newer or an older kernel.

    http://marc.info/?l=linux-wireless&m=125900356410309&q=raw
  • Once again, you are urged to be absolutely certain of the contents of the working copy BEFORE writing it to hardware. If your interface becomes unusable as a result of writing incorrect data into the sprom, the responsibility is YOURS. Once again, you have been warned.
  • A firmware assembler/disassembler can be found in the git repository at
    • git clone git://git.bu3sch.de/b43-tools.git
  • There are more development and debugging tools available in the b43-tools git repository. Just clone it and read the shipped documentation files.
    • git clone git://git.bu3sch.de/b43-tools.git
  • wpa_supplicant
    • A tool for enabling WPA and full IEEE 802.11i/RSN/WPA2 WPA-PSK and WPA2-PSK (pre-shared key) ("WPA-Personal") WPA with EAP.
    • wpa_supplicant may have a 'broadcom' driver that is used with the proprietary Broadcom driver. The bcm43xx, b43 and b43legacy drivers use the linux wireless extensions properly and so need the wext driver. This is set using the -D option like this:
    • wpa_supplicant -iwlan0 -Dwext -c/etc/wpa_supplement.conf
    • Of course, you don't need this if you're using NetworkManager.

Donations

Many people have donated money, hardware or other services to make this driver possible. Thanks! Please see the donations page for details.

External Links


This is a static dump of the old wiki, taken after locking it in January 2015. The new wiki is at https://wireless.wiki.kernel.org/.
versions of this page: last, v385, v384, v383, v382, v381, v380, v379, v378, v377, v376, v375, v374, v373, v372, v371, v370, v369, v368, v367, v366, v365, v364, v363, v362, v361, v360, v359, v358, v357, v356, v355, v354, v353, v352, v351, v350, v349, v348, v347, v346, v345, v344, v343, v342, v341, v340, v339, v338, v337, v336, v335, v334, v333, v332, v331, v330, v329, v328, v327, v326, v325, v324, v323, v322, v321, v320, v319, v318, v317, v316, v315, v314, v313, v312, v311, v310, v309, v308, v307, v306, v305, v304, v303, v302, v301, v300, v299, v298, v297, v296, v295, v294, v293, v292, v291, v290, v289, v288, v287, v286, v285, v284, v283, v282, v281, v280, v279, v278, v277, v276, v275, v274, v273, v272, v271, v270, v269, v268, v267, v266, v265, v264, v263, v262, v261, v260, v259, v258, v257, v256, v255, v254, v253, v252, v251, v250, v249, v248, v247, v246, v245, v244, v243, v242, v241, v240, v239, v238, v237, v236, v235, v234, v233, v232, v231, v230, v229, v228, v227, v226, v225, v224, v223, v222, v221, v220, v219, v218, v217, v216, v215, v214, v213, v212, v211, v210, v209, v208, v207, v206, v205, v204, v203, v202, v201, v200, v199, v198, v197, v196, v195, v194, v193, v192, v191, v190, v189, v188, v187, v186, v185, v184, v183, v182, v181, v180, v179, v178, v177, v176, v175, v174, v173, v172, v171, v170, v169, v168, v167, v166, v165, v164, v163, v162, v161, v160, v159, v158, v157, v156, v155, v154, v153, v152, v151, v150, v149, v148, v147, v146, v145, v144, v143, v142, v141, v140, v139, v138, v137, v136, v135, v134, v133, v132, v131, v130, v129, v128, v127, v126, v125, v124, v123, v122, v121, v120, v119, v118, v117, v116, v115, v114, v113, v112, v111, v110, v109, v108, v107, v106, v105, v104, v103, v102, v101, v100, v99, v98, v97, v96, v95, v94, v93, v92, v91, v90, v89, v88, v87, v86, v85, v84, v83, v82, v81, v80, v79, v78, v77, v76, v75, v74, v73, v72, v71, v70, v69, v68, v67, v66, v65, v64, v63, v62, v61, v60, v59, v58, v57, v56, v55, v54, v53, v52, v51, v50, v49, v48, v47, v46, v45, v44, v43, v42, v41, v40, v39, v38, v37, v36, v35, v34, v33, v32, v31, v30, v29, v28, v27, v26, v25, v24, v23, v22, v21, v20, v19, v18, v17, v16, v15, v14, v13, v12, v11, v10, v9, v8, v7, v6, v5, v4, v3, v2, v1