CentOS users might have problems with WLAN on their laptops especially with BCM4311 802.11b/g WLAN chipsets. These can be solved by installing proprietary Linux driver by Broadcom.

Testing environment

  • Laptop: Dell Vostro 1400
  • Operating systems tested: CentOS 5.3, 5.4 (32 bit)
  • WLAN device: Dell Wireless 1390 WLAN Mini-Card
  • WLAN chipset: BCM4311 802.11b/g WLAN

Installation

By default CentOS installs WLAN hardware and associates it with internal b43 module. It fails to work with this network card (even WLAN LED won’t light up), so we need an original driver supplied by the hardware vendor. Luckily, Broadcom provides such.

Let’s download a package for appropriate architecture (in my case it’s 32 bit). Due to licencing issues CentOS community can not make a RPM package for your convenience, so we’ll have to compile and load driver ourselves. Let’s start.

Create a directory tree broadcom/driver under your home directory (e. g. ~/broadcom/driver) and unpack downloaded archive. You should then see these files and directories:

[code lang=”plain”] lib/
src/
Makefile[/code]

Great. We have our driver source ready. Now we must prepare our OS. By default CentOS doesn’t install Kernel development package, headers and required compiliers. We setup them running:

[code lang=”shell”]yum install kernel-headers kernel-devel gcc[/code]

Let’s cd into our directory where we unpacked driver source:

[code lang=”shell”]cd ~/broadcom/driver[/code]

And compile WLAN driver as Kernel module:

[code lang=”shell”]make -C /lib/modules/`uname -r`/build M=`pwd`[/code]

NOTE! Start here after Kernel upgrade

Copy compilied module to appropriate Kernel’s directory (this has to be done after each Kernel update):

[code lang=”shell”]cp wl.ko /lib/modules/`uname -r`/kernel/net/wireless/[/code]

Now we need to disable native CentOS WLAN driver called b43 running on eth1 device by default:

[code lang=”shell”]rmmod b43[/code]

In case you ever tried legacy driver or ndiswrapper, make sure you remove them too:

[code lang=”shell”]rmmod bcm43xx; rmmod b43legacy; rmmod ndiswrapper[/code]

Blacklist them by adding these lines to /etc/modprobe.d/blacklist ar the bottom:

[code lang=”plain”] # get rid of the default kernel drivers
blacklist b43
blacklist bcm43xx[/code]

Open /etc/modprobe.conf, find:

[code lang=”plain”]alias eth1 bcm43xx[/code]

And replace with:

[code lang=”plain”]alias eth1 wl[/code]

In the end add:

[code lang=”plain”]alias ieee80211_crypt_tkip ieee80211_crypt_tkip[/code]

Execute:

[code lang=”shell”] depmod -a
modprobe ieee80211_crypt_tkip; modprobe wl[/code]

Reboot system. Driver ready (LED should light up), now we need NetworkManager to deal with WLANs. First of all, disable network, because it manages network connections on CentOS by default:

[code lang=”shell”]chkconfig network off[/code]

Instead of network we use NetworkManager which has it’s own tools to deal with WPA encryption, so wpa_supplicant must be disabled:

[code lang=”shell”]chkconfig wpa_supplicant off[/code]

Make sure NetworkManager is enabled on startup:

[code lang=”shell”]chkconfig NetworkManager on[/code]

And start it now:

[code lang=”shell”]service NetworkManager start[/code]

Reboot your system. Enjoy fast WLAN!

This guide also available on CentOS wiki.