HCL/Network Adapters (Wireless)/Broadcom BCM43xx

From openSUSE

Hardware Compatibility List (HCL)
Full Systems Laptops - Desktops - Servers - Virtual Machines


Components Video Cards - Sound Cards - Wired Net Adapters - Wireless Adapters - Bluetooth Adapters - Printers - Scanners - TV Cards - Digital Cameras - Web Cameras - UPS - Floppy Drives





Contents

Native Linux b43 Driver

The Broadcom BCM43xx chipsets are being reverse engineered by the Linux Wireless project. See their webpage at http://linuxwireless.org/en/users/Drivers/b43 for full details. Basically, all 803.11b and 802.11g chips are currently supported, but the 802.11a and 802.11n chips are not. See the website for the current list. It is strongly recommended to use this driver rather than the Broadcom STA drivers which are reported to have stability and error-checking issues.

Note: One exception is the BCM4312 802.11b/g [14e4:4315] chipset. As of 1/30/09 it is not supported by the b43 driver, even thou the BCM4312 802.11a/b/g chipset is.

All kernels since 2.6.24 have included the b43 and b43legacy versions of the driver, i.e openSUSE versions 11.0 onwards?

All kernels from 2.6.xx to 2.6.23 included the bcm43xx version of the driver, i.e. openSUSE versions 10.x to 10.x?

Firmware installation for b43/b43legacy

If your chipset is supported by this driver, then you need to first download and install the Broadcom firmware blob that the driver uses to talk to the chip. openSUSE makes this easy by providing a script to run since openSuse 10.x.

Manual Installation

First, ensure you have the package b43-fwcutter installed. Next ensure you are online, then as root:

Run the script: /usr/sbin/install_bcm43xx_firmware.

This will download the required firmware, extract it, and save it to /lib/firmware, and configure the b43 module. Your wireless card should now be detected by NetworkManager.

Installing firmware from RPM packages

Alternatively, you can also download and install ready-made firmware RPM's from Packman (use the "noarch"-packages):

http://packman.links2linux.de/package/b43-firmware

http://packman.links2linux.de/package/b43legacy-firmware

This is especially helpful if you don't have internet access on your target machine and also somehow easier if you can access the internet with your target machine.

A) You have internet access via cable (or some other method) on your target machine:

- go to YaST => Software => Software Repositories

- check if Packman has not been selected yet, if not then go for "Add => Community Repositories" and select the Packman repository

- go to YaST => Software => Software Management, search and install "b43-firmware" and "b43-legacy-firmware"

B) You don't have internet access on your target machine:

- download the "noarch"-packages for b43-firmware and "b43-legacy-firmware" from Packman (see links above)

- transfer files to your target machine (i.e. via USB stick or if you are dual booting, download them in your other OS an access files on the disk from openSUSE)

- right-click the downloaded RPM-files and choose "Actions => Install with YaST" or "Open with Install Software", you will be prompted for root's password.

In all cases, you will have to unload and reload the respective kernel modules (b43 or b43legacy) with the respective modprobe-commands (or restart your machine).

Power management with b43

The b43 driver might or might not work after waking up from a suspend or thawing out from a suspend-to-disk, so you might need to create a file in /etc/pm/sleep.d to manage b43. I used the following, but if you are using NetworkManager instead of ifup/ifdown (this is set in Yast2 | Network Devices | Network Settings | Global Options | Network Setup Method), then omit the ifup and ifdown lines.

/etc/pm/sleep.d/b43

#!/bin/bash

export PATH=/sbin:/usr/sbin:/bin:/usr/bin

function turnOn
{
    modprobe b43
    ifup wlan0   # omit if you use NetworkManager
}

function turnOff
{
    ifdown wlan0 # omit if you use NetworkManager
    rmmod b43
}

case $1 in
    hibernate)
        turnOff
        ;;
    suspend)
        turnOff
        ;;
    thaw)
        turnOn
        ;;
    resume)
        turnOn
        ;;
    *)  echo "somebody is calling me totally wrong."
        ;;
esac

Broadcom STA Driver

For Broadcom's mixed GPL kernel module with proprietary blob see http://www.broadcom.com/support/802.11/linux_sta.php. These drivers are reported to have issues with stability, but if you have chipset unsupported by b43 drivers (like BCM4322) these are probably a better option than NDISWrapper.

How to install

The easy way

Packman repository, provides rpm for latest kernel available in Update Repository for openSUSE 10.3 11.0 11.1

To install it just install BOTH the broadcom-wl package and one of the broadcom-wl-kmp-$kernelflavor packages.

Note that if you select broadcom-wl package first via yast, it will auto-select the debug kernel. This may not be what you desire.

If you have a different kernel or you cannot have latest kernel from update repository, just install the following packages: kernel-source, kernel-syms, module-init-tools; then download source rpm package from here: http://packman.links2linux.org/package/broadcom-wl and type:

rpmbuild --rebuild broadcom-wl-<version>-<release>.src.rpm

that will build rpm for you that will be available in /usr/src/package/RPMS/i586|x86_64 folder

The hard way

First of all apply the following patch to allow your card to connect to hidden SSID:

--- src/wl/sys/wl_iw.c	2009-01-08 11:07:08.000000000 +0200
+++ src/wl/sys/wl_iw.c	2009-01-08 11:07:31.000000000 +0200
@@ -580,6 +580,7 @@
 	range->enc_capa |= IW_ENC_CAPA_CIPHER_TKIP;
 	range->enc_capa |= IW_ENC_CAPA_CIPHER_CCMP;
 	range->enc_capa |= IW_ENC_CAPA_WPA2;
+	range->scan_capa = IW_SCAN_CAPA_ESSID;
 #endif 
 
 	return 0;

Now compile the drivers. Ensure you are in the directory that you extracted the drivers into, and have all the required packages for compiling kernel modules, then make the drivers:

 make -C /lib/modules/`uname -r`/build/ M=$PWD clean
 make -C /lib/modules/`uname -r`/build/ M=$PWD

Load the drivers

As of 1/30/09, for OpenSUSE 11.1 simply rebooting to the kernel corresponding to the kmp package you installed causes the below to occur. No manual intervention is required to get the wl.ko driver operational. If you are using Network Manager. You will of course need to use Network Manager to connect to an actual wireless router.

Now make sure none of the other driver modules are loaded and test if your new module works.

 rmmod ndiswrapper b43 ssb bcm43xx b43legacy
 modprobe ieee80211_crypt_tkip
 insmod wl.ko

NetworkManger should now detect your wireless card as wlan0 or eth1 and enable you to connect.

Finally, if all is well, install the driver and set it up to load automatically on boot.

Open YaST --> Network Devices --> Network Setting

click on your wireless card than press edit, switch to hardware tab, then be sure that wl driver is selected; save and exit

Use Yast Sysconfig editor, or directly edit /etc/sysconfig/kernel, to set the module "ieee80211_crypt_tkip" to load at boot (thanks to YaST wl is yet to be loaded on boot) :

 MODULES_LOADED_ON_BOOT="ieee80211_crypt_tkip"

Reboot and confirm that all works as required. You may need to blacklist or uninstall the other drivers if necessary, packman rpms provide /etc/modprobe.d/broadcom-wl-blacklist file that blacklists them for you.

Instructions were sourced form the following links:

NDISWrapper

See wiki page http://en.opensuse.org/Ndiswrapper for details on using NDISWrapper.