Debian-like distributions come with b43, or b43legacy, and ssb modules for broadcom wireless cards, but they never worked for me. Searching over the internet i found out that broadcom provides the driver for BCM4311-, BCM4312-, BCM4313-, BCM4321-, and BCM4322-based hardware, all we need to do is compile it and install the module. This is how we do it:
1 – Check your wireless card:
First of all we need to be sure that your wireless card is one of the BCMXXXX-based hardware:
The return should be something like this:
08:00.0 Network controller: Broadcom Corporation BCM4312 802.11b/g (rev 01)
In that line you can see that my wireless card hardware is BCM4312, so it is supported.
2 – Download the Driver:
You can access Broadcom’s website[0] and download it or use wget to download it through shell.
For 32-bits CPUs:
1
| $ wget -c http://www.broadcom.com/docs/linux_sta/hybrid-portsrc-x86_32-v5.60.48.36.tar.gz |
For 64-bits CPUs:
1
| $ wget -c http://www.broadcom.com/docs/linux_sta/hybrid-portsrc-x86_64-v5.60.48.36.tar.gz |
3 – Remove the other modules:
Check if b43, b43legacy, ssb and/or an older version of wl modules exist:
1
| $ lsmod | grep "b43\|ssb\|wl" |
Remove them, if they exist:
1
| # rmmod b43 ; rmmod b43legacy ; rmmod ssb ; rmmod wl |
Add b43, b43legacy and ssb to the blacklist, preventing them to be probed in initialization:
1 2 3
| # echo "blacklist ssb" >> /etc/modprobe.d/blacklist.conf
# echo "blacklist b43" >> /etc/modprobe.d/blacklist.conf
# echo "blacklist b43legacy" >> /etc/modprobe.d/blacklist.conf |
4 – Install the wl module:
Extract the tarball you downloaded and compile it, you’ll need to install the build-essential package to compile it:
1 2 3 4 5
| # aptitude install build-essential -y
$ mkdir broadcom
$ cd broadcom
$ tar xvzf ../hybrid-portsrc-x86_<32/64>-<version>
$ make |
If you have an older version of wl, which is usually in /lib/modules//kernel/net/wireless, you should rename or remove it, to avoid conflicts:
1
| # mv /lib/modules/`uname -r`/kernel/net/wireless/wl.ko /lib/modules/`uname -r`/kernel/net/wireless/wl.ko.old |
Copy the new wl.ko to /lib/modules//kernel/net/wireless and install it:
1 2
| # cp wl.ko /lib/modules/`uname -r`/kernel/net/wireless/
# insmod wl.ko |
Add it to /etc/modules to load it at boot time:
1 2
| # echo "lib80211" /etc/modules
# echo "wl" /etc/modules |
After these steps your wireless network should be working.
Troubleshooting
I had another problem: after rebooting, ssb module was being loaded even after being blacklisted, and the recently added wl module wasn’t.
To check if this is happening to you run the command below:
If the command returns something, it means that the ssb module is being loaded, then you’ll have to:
1 – Remove ssb and wl modules:
2 – Back up the current boot ramfs, generate a new one and reboot system:
1 2 3
| # cp /boot/initrd.img-`uname -r` somewheresafe
# update-initramfs -u
# reboot |
3 – Reinstall wl module:
1 2 3
| # cp wl.ko /lib/modules/`uname -r`/kernel/net/wireless/
# insmod wl.ko
# depmode -a |
And wl module will be loaded at boot time.
[0] http://www.broadcom.com/support/802.11/linux_sta.php