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.
- compat-wireless: go to Linux Wireless and download compat-wireless-2.6.tar.bz2.
- the latest version of bw43-fwcutter (version 015)
- Broadcom's proprietary driver to extract the firmware
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
$ 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_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
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:
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)
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