Sun Sep 4 12:06:31 CEST 2011

Linux support for Broadcom 4331 wireless chip (Macbook Pro 8,1)

Linux support for the Broadcom 4331 wireless chip used to be poor. This chip has vendor- and device id 14e4:4331 and identifies as

$ lspci | grep 4331
03:00.0 Network controller: Broadcom Corporation Device 4331 (rev 02)

As of this writing, there is no driver in the kernel, and with ndiswrapper there are many random system lock-ups. As a result, Macbook Pro 8,1 (8,2 ...?) users running Linux couldn't use the internal wireless chip. Recently, the situation has improved thanks to three patches submitted by Rafał Miłecki and Larry Finger. The driver is announced for kernel version 3.2, but if you don't want to wait for this kernel it is possible to compile and use the relevant module with older kernels.

This is a summary of the information contained in the linux-wireless wiki page of the driver and the mailing list, in particular this thread. You will need

You will also need the infrastructure to compile source code and kernel modules on your distribution, in particular you will need the kernel headers. For Ubuntu, make sure the packages build-essential, automake and linux-headers-generic are installed.

Update: previously compat-wireless had to be patched. As of version 2011-09-27 the patches are no longer needed.

Update: apparently recent versions of compat-wireless will lead to unresolved symbols when you try to load the module. I used an older version, compat-wireless-2011-10-09 worked for me with Ubuntu Oneiric.

Assuming you have all the files in the directory ~/b4331, first unpack compat-wireless:

$ cd ~/b4331
$ tar xf compat-wireless-2.6.tar.bz2

Next, enable the b43 driver. Assuming the tar archive was extracted to compat-wireless-2011-10-09:

$ cd compat-wireless-2011-10-09
$ scripts/driver-select b43

Make sure PHY_HT is enabled. In the file config.mk, the following line should be present and uncommented:

config.mk
...
CONFIG_B43_PHY_HT=y
...

Compile and install the driver:

$ make
$ sudo make install
$ cd ..

Unpack and compile b43-fwcutter:

$ tar xf b43-fwcutter-015.tar.bz2
$ cd b43-fwcutter-015
$ make

Extract the firmware:

$ tar xf ../broadcom-wl-5.100.138.tar.bz2
$ export FIRMWARE_INSTALL_DIR="/lib/firmware"
$ sudo ./b43-fwcutter -w "$FIRMWARE_INSTALL_DIR"  broadcom-wl-5.100.138/linux/wl_apsta.o
$ cd ..

Unload all modules related to wireless and make sure ndiswrapper is not loaded:

$ cd compat-wireless-2011-10-09
$ sudo make wlunload
$ sudo rmmod ndiswrapper
/etc/modprobe.d/blacklist
...
ndiswrapper

To be sure that none of the old modules are still loaded, it is probably best to reboot the system. Now you should be able to load and use the freshly compiled b43 module:

$ sudo modprobe b43

You might want to add b43 to the list of modules which are loaded on startup (at the moment, the module is not automatically loaded). For Ubuntu, this is:

/etc/modules
...
b43

The driver does not play nice with suspend and hibernate. It is necessary to unload the module before putting the laptop to sleep and to reload it after wakeup. For Ubuntu, it is sufficient to create the file (or append to the file)

/etc/pm/config.d/default
SUSPEND_MODULES="b43"

Note that after every kernel update you will have to recompile the module for the new kernel:

$ cd ~/b4331/compat-wireless-2011-10-09
$ make clean
$ make
$ sudo make install

Posted by Raimar | Permanent link | File under: gnu_linux
Diese Seiten werden auf einem Server der Universitaet Innsbruck gehostet und unterstehen diesen Richtlinien.