The command line

GNU/Linux, web development and some other things

Linux Kernel Powered Wireless Card.

A bit of background first. Last year I got a new laptop (HP dv6420la). All worked fine, except for the wireless card. It is a BCM4312 rev 02. It only worked using ndiswrapper. This was acceptable, because in the end the important thing was that the tool (the laptop) worked. But I always had the feeling that it was not perfect. Besides, half the time it didn’t booted correctly because the wireless card didn’t initialized ok. This hanged the machine and the only solution was to cold reboot the laptop. Not very good for my files but that was the price to pay in order to have a working wireless card. All the time I follow the news on linuxwireless.org waiting for the time when native kernel support for my wireless card were incorporated to the mainline kernel. From time to time I installed new versions of the kernel and tested the card without success, but the progress was evident. My hopes were bigger and bigger as the months passed. Finally (thanks Larry Finger, the author of the patch, and the linux wireless team) mainstream kernel included the code necessary to drive the BCM4312 rev 02 card. It was included in kernel 2.6.25 and this kernel was stamped stable just two days ago. So, one more time (hoping it were the last) I put to test a new kernel in my laptop. I downloaded the full sources from kernel.org (because it isn’t yet in debian repositories). As root:

laptop:~# cd /usr/src
laptop:~# wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.tar.bz2
Then I installed the required dependencies needed to custom compile/install a kernel (instructions here):

laptop:~# apt-get install build-essential fakeroot
I unpacked the sources:

laptop:~# tar jxf linux-2.6.25.tar.bz2
laptop:~# cd linux-2.6.25
I copied the config file from my current kernel:

laptop:~# cp /boot/config-2.6.24-1-amd64 .config
and made the kernel package:

laptop:~# fakeroot make-kpkg --initrd --revision=miguel.1.0 kernel_image
This compiled the kernel and built the deb package leaving it in /usr/src/linux-image-2.6.25_miguel.1.0_amd64.deb. I chose the default answers in the config phase. Finally I installed it with:

laptop:~# dpkg -i /usr/src/linux-image-2.6.25_miguel.1.0_amd64.deb
As I was using ndiswrapper (as told here), I had to undo the changes made for ndiswrapper to work:

laptop:~# /etc/init.d/networking stop
laptop:~# rmmod ndiswrapper
laptop:~# ndiswrapper -r bcmwl5
laptop:~# m-a purge ndiswrapper --force
laptop:~# dpkg -l |grep ndiswrapper # to check ndiswrapper packages
# update the following accordingly
laptop:~# aptitude purge ndiswrapper-common ndiswrapper-source ndiswrapper-modules-2.6.22-2-amd64 ndiswrapper-utils-1.9
Also, I removed bcm43xx from /etc/modprobe.d/blacklist, and finally left just the following lines in /etc/network/interfaces:

auto lo
iface lo inet loopback
in order to let NetworkManager to manage the network interfaces (wired and wireless). The time to test this setup came, so I rebooted the laptop and watched the boot messages. No errors. Finally the led turned blue and when I logged in with my user the NetworkManager showed a list with all the wireless networks available. I chose mine and I was showed a windows asking for my password. I entered it and the connection was made. So here I am, writing this from my recently and brand new kernel powered BCM4312 rev 02 wireless card. So, thanks to the ndiswrapper team, but I have to say goodbye. I invite you to update to kernel 2.6.25 and to left behind ndiswrapper. Thanks to the Linux Wireless team, and in general to the FOSS community for the work made. Thank you all.