The hardest part about this entire process has been the flake factor. If the wireless card simply did not work, then trouble shooting becomes much easier. However, as I discovered, the problem is that this card often (but not always) works on reboot, then starts to experience degradation (as measured by the handy tool mtr), then eventually stops working altogether (iwconfig reports link quality of 0/100).

Sometimes, however, when working with just one machine alone, it will keep running (slightly degraded - 10% packet loss) for up to an hour. Then, the next day, stop working after 5 minutes.

All of this to say: my report above was based on getting the card to work in a slightly degraded manner (at the time I attributed the degradation to the network) for an hour.

The following monday I tried again and it failed.

So - sadly, I gave up on the free drivers and switched to ndiswrapper.

Why sadly? Because essentially ndiswrapper runs closed code in kernel space. We don't know what it's doing. And, the code wasn't intended to be run this way. I think the ndiswrapper authors are frickin' amazing to have written this tool. I owe them a giant thanks!! But the real solution is to pressure our vendors to release drivers that work for all major operating systems!!

I based most of my work on the excellent Ubuntu tutorial. However, I did things a bit differently. I was working with 17 identical laptops in a location with only wireless connectivity, so I had to copy all needed files to a USB key. I ended up writing a script to do the installation.

I'm pasting the script below. It is not meant to be executed as is! It references other files that you should prepare based on your system.

In particular - you will need to download the bcm drivers (try downloading them from your computer vendor web site - be sure to download the Windows XP drivers and not the Windows Vista drivers). I downloaded my drivers from the Dell web site - it was a 90 MB download - but after downloading I only need the very small driver directory (the one that has the .inf file in it).

In addition - you will need a firmware directory with your .fw files. If you have a computer that can get online, you don't need this step - just install the drivers via the Ubuntu restricted drivers control panel or by installing the bcm43xx-fwcutter package. That package installs a shell script that downloads the drivers and then cuts them up into .fw files and puts them in the right place. If you are not online - you'll need to do this on a computer that is online and then copy the resulting .fw files over.

Finally - I downloaded the ndiswrapper packages to my USB device. The Ubuntu How to makes a big deal about compiling the ndiswrapper from scrach, but for me it worked fine using the Gutsy Gibbon packages.

echo "Copying firmware"
cp firmware/*.fw /lib/firmware/

# remove the bcm43xx module
echo "Removing the bcm43xx module"
modprobe -rv bcm43xx

# blacklist it
echo "Blacklisting bcm43xx module"
echo "blacklist bcm43xx" >> /etc/modprobe.d/blacklist

# install ndiswrapper binaries
echo "Installing ndiswrapper binaries"
dpkg -i ndiswrapper-common_1.43-1ubuntu2_all.deb
dpkg -i ndiswrapper-utils-1.9_1.43-1ubuntu2_i386.deb

# install driver
echo "Installing driver"
ndiswrapper -i driver/bcmwl5.inf

# copy the configuration file
echo "Copying the configuration file"
cp /etc/ndiswrapper/bcmwl5/14E4:4311.5.conf /etc/ndiswrapper/bcmwl5/.conf

# bring down eth0 if it is up
echo "Bringing down eth0"
ifdown eth0

# copy in the new interfaces file
echo "Copying new interfaces file"
cp interfaces /etc/network/
chmod 644 /etc/network/interfaces

# bring up the driver
echo "Bringing up driver"
depmod -a
modprobe -v ndiswrapper

# make permanent
echo "Adding to /etc/modules"
echo "ndiswrapper" >> /etc/modules

# restart eth0
echo "sleeping 5, then restarting networking: MAKE SURE WIFI LIGHT IS ON"
sleep 5
/sbin/ifdown eth0
/sbin/ifup eth0

# on reboot, seems like it doesn't always come up properly
# Maybe the driver is loaded too slowly?
# ensure that it comes up by adding to the rc local script
cp rc.local /etc/
chmod 755 /etc/rc.local

--jamie