Broadcom 43xx Wireless Card in Linux

610px-tux-g2-svg-svgToday I finally resolved what has been one of the most frustrated Linux issues I have faced yet — getting my bloody Dell Truemobile 1300 wireless card (stock in my Dell Inspiron 5100 notebook) to function in Linux. The problem has been that those bastards at Broadcom — the corporation that manufactures the controller for the card — have not released Linux drivers for this controller. Prior to today, I have struggled trying to wrap my Windows driver in a piece of Linux software called ndiswrapper. I have, as it turns out, found two ways to finally get the blasted card to work!
(Note: Before following the procedures outlined below, I had downloaded a tested driver — as per the ndiswrapper wiki — for the Dell Truemobile 1300 MPCI card. The recommended driver can be found here.)
(Additional note: This process was followed in Fedora Core 6 — I can only vouch for it working in this environment, although I imagine it will work in most distributions.)
Solution 1: bcm43xx-fwcutter
Today I found a fantastic little program called bcm43xx-fwcutter. In essence, it extracts the driver from the Windows driver file, and incorporates it into Linux’ native support for the bcm43xx controller. After finding this gem, the entire process — including download and installation — took about 5 minutes.
Here is what I did:
1.) Download bcm43xx-fwcutter from BerliOS.de. (Note: be sure to get the correct file for your version of the controller!)
2.) Unarchive and compile the tool:
tar -xvf bcm43xx-fwcutter-006.tar.bz2
cd ./bcm43xx-fwcutter-006
make

3.) Run the tool to extract the driver from the Windows driver file and install it in Linux:
bcm43xx-fwcutter -w /lib/firmware bcmwl5.sys
 
4.) Remove the bcm43xx module from the kernel then add it back with the new driver:
rmmod bcm43xx
modprobe bcm43xx

 
5.) Configure the wireless card (substituting your interface name where appropriate):
iwlist eth1 scan
iwconfig eth1 essid (SSID here)
iwconfig eth1 key restricted (WEP key here)
dhclient eth1

Voila! It was a truly effortless process after having extracted the driver using bcm43xx-fwcutter. My hat goes off to the developers — you lot have truly made Linux life much easier for owners of BCM43xx controller-based wireless cards!
Drawback to solution 1: The bcm43xx driver — the driver used in the process above — will limit the wireless card to 11mbps. GRRR!!
Solution 2: ndiswrapper
Ndiswrapper — available at SourceForge here — is a linux-based wrapper for Windows wireless card drivers. To quote the project page, “Some vendors do not release specifications of the hardware or provide a Linux driver for their wireless network cards. This project implements Windows kernel API and NDIS (Network Driver Interface Specification) API within Linux kernel. A Windows driver for wireless network card is then linked to this implementation so that the driver runs natively, as though it is in Windows, without binary emulation.”
Ndiswrapper can be a bit of a pain to implement, but I have managed to pare down the myriad instructions I found in various forums into several easy-to-follow steps.
1.) Download ndiswrapper from its SourceForge project page. (As of this posting, the current version is 1.37)
2.) Unarchive and compile ndiswrapper:
tar -zxvf ndiswrapper-1.37.tar.gz
cd ./ndiswrapper-1.37
make distclean
make
(As root) make install

3.) Ensure that the native bcm43xx driver is unloaded and add it to the module blacklist:
rmmod bcm43xx
vi /etc/modprobe.d/blacklist
Add a line: blacklist bcm43xx

4.) Install the Windows driver:
ndiswrapper -i bcmwl5.inf
5.) Run depmod and ensure that there are no errors:
depmod -a
6.) Add the ndiswrapper module to the kernel:
modprobe ndiswrapper
7.) Configure the wireless adapter (substituting your interface name where appropriate):
iwlist eth1 scan
iwconfig eth1 essid (SSID here)
iwconfig eth1 key restricted (WEP key here)
dhclient eth1

8.) Finally, to prevent having to reconfigure the card the next time I reboot, I edit /etc/sysconfig/network-scripts/ifcfg-eth1 and add the following configuration strings:
ESSID=(your SSID here)
KEY=(your WEP key here)

Additionally, add the following line to /etc/modprobe.conf:
options ndiswrapper if_name=eth1
alias eth1 ndiswrapper

Ndiswrapper is a much better solution for operating BCM43xx controller-based wireless cards in Linux, in my opinion. This is largely due to the wrapper’s ability to enable 802.11g (i.e. 54mbps) transfer rates for the card. The bcm43xx driver limits the card to 802.11b rates (i.e. <= 11mbps). (Note: Because ndiswrapper creates a kernel module, if you upgrade your kernel you will have to rebuild the module for the new kernel. Just recompile ndiswrapper and reinsert the kernel module.)
There it is! I hope that my documentation of this process will help others who find themselves in a similar bind.