[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

Broadcom Corporation BCM4311, BCM4312, BCM4313, BCM4321, BCM4322, BCM43224, BCM43225, BCM43227 and BCM43228 Based Wireless NICs

<!> These chipsets are not natively supported by CentOS.

This page is currently maintained by: Miloš Blažević

ArtWork/WikiDesign/icon-admonition-info.png

NOTE: This manual is primarily intended for EL6 and EL7. If you are running EL 5, 6, or 7, instead of compilation, you can opt to build your own kABI-compatible binary RPM package of the driver which is reusable after kernel updates. For more info, please refer to ELRepo kmod-wl page. Also, it's been reported that the this driver doesn't work with all chips, so kindly provide feedback on your experiences with Broadcom Wireless, so this manual can be kept up to date and further improved.

ArtWork/WikiDesign/icon-admonition-info.png

NOTE: Due to an excessively restrictive license accompanying this Broadcom driver, the ELRepo repository developers have refrained from supplying it via an rpm package - hence this manual was created with the purpose of providing a single comprehensive driver installation manual.

ArtWork/WikiDesign/icon-admonition-info.png

NOTE: Please note that this Wiki may not apply to some older kernel (and/or driver) versions, due to the changes between versions made to the driver, and recent kernels. With that said, we can guarantee compilation of only the latest driver and kernel(s).

In order to install Broadcom BCM4311, BCM4312, BCM4313, BCM4321 or BCM4322, BCM43224, BCM43225, BCM43227, or BCM43228 based wireless network cards, the next steps should be followed:

1. Step 1: Determining WLAN chip and installing dependencies

First of all, make sure you are the "proud owner of Broadcom BCM43xx wireless card":

[user@host ~]$ /sbin/lspci | grep Broadcom
0b:00.0 Network controller: Broadcom Corporation BCM4312 802.11a/b/g (rev 01)

After the WLAN chip model was determined, make sure you have no missing packages needed at compile-time and install them if you do:

[root@host ~]# yum install kernel-headers kernel-devel gcc

Of course, if you're compiling the driver for Xen kernel (i.e. kernel-xen), you should install kernel-xen-devel instead of kernel-devel.

2. Step 2: Downloading and extracting Broadcom driver archive

Download the Broadcom BCM43xx linux driver archive from Broadcom Official website - you'll find it as in the search results list as either Linux® STA 32-bit driver or Linux® STA 64-bit driver - to your machine and extract it to /usr/local/src/hybrid-wl and feel free to change the ownership of the directory and it's contents to some unprivileged user

[root@host ~]# mkdir -p /usr/local/src/hybrid-wl
[root@host hybrid-wl]# cd /usr/local/src/hybrid-wl
[root@host hybrid-wl]# tar xvzf /path/to/the/tarball/hybrid-v35_64-nodebug-pcoem-6_30_223_271.tar.gz
[root@host hybrid-wl]# chown -R someuser.somegroup /usr/local/src/hybrid-wl

ArtWork/WikiDesign/icon-admonition-idea.png

NOTE: Why not extract it to arbitrary location and leave the ownership it is?
Well, this way the driver module sources remain on the system - where you left them - so you can build the driver module whenever you want (e.g. in case you upgrade the kernel - since driver modules are always compiled for a particular kernel), plus, you can do this as an unprivileged user!

3. Step 3a: Compiling the Broadcom driver module (on EL6 and EL7)

Driver module can be compiled as follows:

[user@host hybrid-wl]$ make -C /lib/modules/`uname -r`/build/ M=`pwd`

Mind the quotes (i.e. back quotes).

Now, with the current driver (version 6.30.223.271) it's almost certain you'll get an error message instead of compiled driver module (in fact, different scenario other that this error message is unknown to the author). The message might/will vary depending on the kernel and OS version, but on CentOS 6 it should look something like this:

make: Entering directory `/usr/src/kernels/2.6.32-573.7.1.el6.x86_64'
CFG80211 API is prefered for this kernel version
Using CFG80211 API
  LD      /usr/local/src/hybrid-wl/built-in.o
  CC [M]  /usr/local/src/hybrid-wl/src/shared/linux_osl.o
  CC [M]  /usr/local/src/hybrid-wl/src/wl/sys/wl_linux.o
  CC [M]  /usr/local/src/hybrid-wl/src/wl/sys/wl_iw.o
  CC [M]  /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.o
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:83: warning: ‘enum tx_power_setting’ declared inside parameter list
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:83: warning: its scope is only this definition or declaration, <snip>
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_cfg80211_join_ibss’:
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:730: error: ‘struct cfg80211_ibss_params’ has no member named ‘channel’
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: At top level:
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1096: warning: ‘enum tx_power_setting’ declared inside parameter list
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1096: error: parameter 2 (‘type’) has incomplete type
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_cfg80211_set_tx_power’:
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1107: error: ‘TX_POWER_AUTOMATIC’ undeclared (first use in this <snip>
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1107: error: (Each undeclared identifier is reported only once
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1107: error: for each function it appears in.)
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1109: error: ‘TX_POWER_LIMITED’ undeclared (first use in this function)
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1115: error: ‘TX_POWER_FIXED’ undeclared (first use in this function)
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: At top level:
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1774: warning: initialization from incompatible pointer type
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1779: warning: initialization from incompatible pointer type
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1780: warning: initialization from incompatible pointer type
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1781: warning: initialization from incompatible pointer type
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1782: warning: initialization from incompatible pointer type
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1783: warning: initialization from incompatible pointer type
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1784: warning: initialization from incompatible pointer type
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1789: warning: initialization from incompatible pointer type
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_inform_single_bss’:
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1984: error: too few arguments to function <snip>
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2023: warning: passing argument 1 of ‘cfg80211_put_bss’ from <snip> 
include/net/cfg80211.h:3380: note: expected ‘struct wiphy *’ but argument is of type ‘struct cfg80211_bss *’
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2023: error: too few arguments to function ‘cfg80211_put_bss’
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_update_bss_info’:
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2276: error: ‘struct cfg80211_bss’ has no member named <snip>
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2277: error: ‘struct cfg80211_bss’ has no member named <snip>
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2283: warning: passing argument 1 of ‘cfg80211_put_bss’ from <snip>
include/net/cfg80211.h:3380: note: expected ‘struct wiphy *’ but argument is of type ‘struct cfg80211_bss *’
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2283: error: too few arguments to function ‘cfg80211_put_bss’
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_bss_roaming_done’:
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: warning: passing argument 2 of ‘cfg80211_roamed’ from <snip>
include/net/cfg80211.h:3726: note: expected ‘struct ieee80211_channel *’ but argument is of type ‘u8 *’
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: warning: passing argument 4 of ‘cfg80211_roamed’ makes <snip>
include/net/cfg80211.h:3726: note: expected ‘const u8 *’ but argument is of type ‘s32’
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: warning: passing argument 5 of ‘cfg80211_roamed’ makes <snip>
include/net/cfg80211.h:3726: note: expected ‘size_t’ but argument is of type ‘u8 *’
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: warning: passing argument 6 of ‘cfg80211_roamed’ makes <snip>
include/net/cfg80211.h:3726: note: expected ‘const u8 *’ but argument is of type ‘s32’
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: error: too few arguments to function ‘cfg80211_roamed’
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_update_wowl’:
/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2791: warning: unused variable ‘wdev’
make[1]: *** [/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.o] Error 1
make: *** [_module_/usr/local/src/hybrid-wl] Error 2
make: Leaving directory `/usr/src/kernels/2.6.32-573.7.1.el6.x86_64'

ArtWork/WikiDesign/icon-admonition-info.png

NOTE: This is where the instructions for EL6 and EL7 part ways. So, for EL6, you should follow through step 3a, while for EL7, you need to apply only the patch from step 3a, and patches/sed commands from step 3b, applicable to EL7 only, and compile it as shown in this step (3a). So yes, for EL7, skip the 'sed' commands in step 3a.

On EL6, the driver won't compile because of the if-then-else clause for kernel version checking in file wl_cfg80211_hybrid.c. To remedy this, we'll run the following sed replacement commands:

[user@host hybrid-wl]$ sed -i 's/[ >][>=] KERNEL_VERSION(2, 6, 3.)/>= KERNEL_VERSION(2, 6, 32)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/[ >][>=] KERNEL_VERSION(3, ., .)/>= KERNEL_VERSION(2, 6, 32)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/[ >][>=] KERNEL_VERSION(3, 11, .)/>= KERNEL_VERSION(2, 6, 32)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/< KERNEL_VERSION(3, 18, .)/< KERNEL_VERSION(2, 6, 30)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/[ >][>=] KERNEL_VERSION(3, 15, .)/>= KERNEL_VERSION(2, 6, 32)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/[ >][>=] KERNEL_VERSION(4, 0, 0)/>= KERNEL_VERSION(2, 6, 32)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/< KERNEL_VERSION(4,2,0)/< KERNEL_VERSION(2, 6, 30)/' src/wl/sys/wl_cfg80211_hybrid.c

Just these 'sed' replacements are not enough to ensure proper driver compilation. So, we also need to apply the following patch wl-kmod-fix-ioctl-handling.patch prior to actually compiling the driver. Download it to /usr/local/src and run the following command to patch the driver source code:

[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-fix-ioctl-handling.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #1 succeeded at 1467 (offset 17 lines).
patching file src/wl/sys/wl_linux.c
Hunk #1 succeeded at 1659 (offset 8 lines).

Now, try compiling the driver module again:

[user@host hybrid-wl]$ make -C /lib/modules/`uname -r`/build/ M=`pwd`

and the compile output should look something like this:

{{{make: Entering directory `/usr/src/kernels/2.6.32-573.7.1.el6.x86_64' CFG80211 API is prefered for this kernel version Using CFG80211 API

/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1802: warning: initialization from incompatible pointer type

CFG80211 API is prefered for this kernel version Using CFG80211 API

make: Leaving directory `/usr/src/kernels/2.6.32-573.7.1.el6.x86_64' }}} The module, once built, can be stripped of unnecessary symbols:

[user@host hybrid-wl]$ strip --strip-debug wl.ko

What you will notice, is that driver module file size reduces (from 8.2MB to 7.2MB). And yes, your driver module works ;-)

4. Step 3b: Compiling the Broadcom driver module (specifics required for EL7)

ArtWork/WikiDesign/icon-admonition-info.png

NOTE: Lately, it's required to apply the patches before the sed statements, which may not always be the case, so if the compilation fails, try doing things other way around, i.e. sed before you patch.

Depending on EL7 point release (or better yet, the kernel version you're running), sub-set of sed replacements to apply will differ. So, stock kernels shipped with EL 7.0 (i.e. kernel-3.10.0-123.X), don't require running any of the commands below, EL 7.1 (i.e. kernel-3.10.0-229.X) require the first two, EL 7.2 (i.e. kernel-3.10.0-327.X), require first four 'sed' commands, EL 7.3 requires first 6 executed, EL7.4 first 7, and for EL 7.5 all 'sed' commands are required so as to make the code compile (along with the one from step 3a):

[user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(3, 11, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(3, 15, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c

[user@host hybrid-wl]$ sed -i 's/ < KERNEL_VERSION(3, 18, 0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(4, 0, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c

[user@host hybrid-wl]$ sed -i 's/ < KERNEL_VERSION(4,2,0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(4, 7, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c

[user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(4, 8, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c

[user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(4, 11, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/ < KERNEL_VERSION(4, 12, 0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/ >= KERNEL_VERSION(4, 12, 0)/ >= KERNEL_VERSION(3, 10, 0)/' src/wl/sys/wl_cfg80211_hybrid.c
[user@host hybrid-wl]$ sed -i 's/ <= KERNEL_VERSION(4, 10, 0)/ < KERNEL_VERSION(3, 9, 0)/' src/wl/sys/wl_linux.c

Again, esp. if you're running EL 7.3, or one of its kernels, you'll have to apply the following patches wl-kmod-01_kernel_4.7_IEEE80211_BAND_to_NL80211_BAND.patch wl-kmod-02_kernel_4.8_add_cfg80211_scan_info_struct.patch wl-kmod-03_fix_kernel_warnings.patch wl-kmod-04_kernel_4.11_remove_last_rx_in_net_device_struct.patch wl-kmod-05_kernel_4.12_add_cfg80211_roam_info_struct.patch BEFORE you apply the above sed replacement commands (otherwise, compilation won't work). Also, don't forget the patch from step 3a:

[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-01_kernel_4.7_IEEE80211_BAND_to_NL80211_BAND.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #6 succeeded at 1911 (offset 3 lines).
Hunk #7 succeeded at 2040 (offset 3 lines).
Hunk #8 succeeded at 2160 (offset 3 lines).
Hunk #9 succeeded at 2298 (offset 3 lines).
Hunk #10 succeeded at 2941 (offset 3 lines).
[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-02_kernel_4.8_add_cfg80211_scan_info_struct.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #1 succeeded at 2442 (offset 3 lines).
Hunk #2 succeeded at 2553 (offset 3 lines).
Hunk #3 succeeded at 2989 (offset 3 lines).
[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-03_fix_kernel_warnings.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #1 succeeded at 2008 (offset 3 lines).
Hunk #2 succeeded at 2032 (offset 3 lines).
Hunk #3 succeeded at 2056 (offset 3 lines).
Hunk #4 succeeded at 2071 (offset 3 lines).
Hunk #5 succeeded at 2107 (offset 3 lines).
Hunk #6 succeeded at 2386 (offset 3 lines).
Hunk #7 succeeded at 2401 (offset 3 lines).
Hunk #8 succeeded at 2441 (offset 3 lines).
[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-04_kernel_4.11_remove_last_rx_in_net_device_struct.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
patching file src/wl/sys/wl_linux.c
Hunk #1 succeeded at 2911 (offset -18 lines).
[user@host hybrid-wl]$ patch -p1 < ../wl-kmod-05_kernel_4.12_add_cfg80211_roam_info_struct.patch
patching file src/wl/sys/wl_cfg80211_hybrid.c
Hunk #3 succeeded at 2450 (offset 3 lines).
Hunk #4 succeeded at 2466 (offset 3 lines).

After applying these to the source code, just follow through the reminder of step 3a - compile the driver, and strip debugging info from it. Again, kernel builds =>229 require first two commands ONLY, builds => 327 require running first four sed replacements, builds >=514 require 6, builds >=693 require 7, and for builds >=862 all sed replacements are needed for driver to compile

5. Step 4a: Loading the driver module into kernel

Having successfully compiled the driver module, you can now load it into kernel, and eventually set up automatic driver load on system boot (to do all this, you'll have to assume root privileges). Of course, driver module loading can be done only after you remove the existing/conflicting wireless driver modules from kernel (in case these are loaded):

[root@host ~]# modprobe -r bcm43xx
[root@host ~]# modprobe -r b43
[root@host ~]# modprobe -r b43legacy
[root@host ~]# modprobe -r ssb
[root@host ~]# modprobe -r bcma
[root@host ~]# modprobe -r brcmsmac
[root@host ~]# modprobe -r ndiswrapper

copy the driver module file to a location where kernel can find it:

[root@host hybrid-wl]# cp -vi /usr/local/src/hybrid-wl/wl.ko /lib/modules/`uname -r`/extra/

to be consistent with all other external modules that have been / may be installed from a kmod packages (e.g. fuse, ntfs-3g, etc.)

Next, run:

[root@host ~]# depmod $(uname -r)

in order to create a list of module dependencies, and now load the driver module:

[root@host hybrid-wl]# modprobe wl

If no error was reported, the driver module is now successfully loaded and ready to use. The 'ndiswrapper' kernel module can be removed, provided you don't use it for anything else but wireless driver - but this is not necessary.

6. Step 4b: Loading the driver module into kernel on boot time

Couple of more steps are needed to get your module load every time the system boots. First, edit the /etc/modprobe.d/blacklist.conf file adding the lines:

blacklist bcm43xx
blacklist b43
blacklist b43legacy
blacklist bcma
blacklist brcmsmac
blacklist ssb
blacklist ndiswrapper

By doing so, you're preventing these modules from being loaded into kernel at boot time and conflicting with the wl module. Second, in order to load the wl module into the kernel on boot time, create/edit the file /etc/sysconfig/modules/kmod-wl.modules and copy-paste the following contents into it:

for M in lib80211 cfg80211 wl; do
    modprobe $M &>/dev/null
done

Your driver should now load every time you reboot (except of course, when you install the new kernel, in which case the driver has to be re-compiled for it following these same steps).

7. Appendix A: Broadcom chip models tested and reported (by community members) as working

Chip tested

EL version

Kernel

Arch

VendorID:DeviceID

Driver version

BCM4311

CentOS 7.1

3.10.0-229.el7

x86_64

N/A

6_30_223_248

BCM4312

CentOS 6.6

Unknown

Unknown

Unknown

6_30_223_248

BCM4313

CentOS 6.6

2.6.32-504.16.2.el6

x86_64

14e4:4727

6_30_223_248

BCM4321

CentOS 7.3

3.10.0-514.2.2.el7

x86_64

14e4:4328

6_30_223_271

BCM4322

CentOS 7.1

3.10.0-229.7.2.el7

x86_64

14e4:432b

6_30_223_248

BCM43142

CentOS 6.6

Unknown

Unknown

14e4:4365 (Unconfirmed)

6_30_223_248

BCM43224

BCM43225

BCM43227

BCM43228

CentOS 7.1

3.10.0-229.4.2.el7

x86_64

14e4:4359

6_30_223_248

BCM4352

CentOS 7.1

3.10.0-229.7.2.el7

x86_64

14e4:43b1

6_30_223_248

CentOS 6.8

2.6.32-642.15.1

x86_64

14e4:43b1

6_30_223_271

ArtWork/WikiDesign/icon-admonition-alert.png

ATTENTION: This driver module is NOT persistent across kernel upgrades (i.e. when you update the kernel, and boot the newly installed one, you'll have to do this over again). And again, this is why you placed the archive contents in /usr/local/src/hybrid-wl and changed the ownership of the directory and it's contents.

ArtWork/WikiDesign/icon-admonition-info.png

NOTE: After successful setup of the driver, users new to wireless often report problems like "Error for wireless request "Set Encode" (8B2A): SET failed on device.... Quick and easy solution is to configure NetworkManager service to manage your network connections instead of the network service. This used to be the case on CentOS 5, but has not happened (or reported to have happened) on CentOS 6.

8. Appendix B: Broadcom chip intermittent problems

This driver module, in author's experience, is sometimes known to require multiple reboots to make the WiFi work. In layman's terms, the WiFi card, finds the AP(s), but fails to associate it with the driver. I've made numerous attempts to make the card/driver work without a reboot, to no avail. Starting/stopping wpa_supplicant service, turning WiFi on/off, (un)loading the driver, ...etc. Sometimes it would only start working after several reboots.

From /var/log/wpa_supplicant.log:

Trying to associate with 58:6d:8f:xx:xx:xx (SSID='<ssid_name>' freq=2462 MHz)
Association request to the driver failed

and in /var/log/messages:

Dec 19 02:40:03 hostname kernel: cfg80211: Calling CRDA for country: RS 
Dec 19 02:40:03 hostname kernel: ------------[ cut here ]------------
Dec 19 02:40:03 hostname kernel: WARNING: at net/wireless/sme.c:664 __cfg80211_connect_result+0x3d9/0x430 [cfg80211]() (Tainted: P           -- ------------   )  
Dec 19 02:40:03 hostname kernel: Hardware name: Vostro 1540
Dec 19 02:40:03 hostname kernel: Modules linked in: vfat fat fuse ip6table_filter ip6_tables ebtable_nat ebtables ipt_MASQUERADE iptable_nat nf_nat xt_CHECKSUM iptable_mangle cpufreq_ondemand acpi_cpufreq freq_table mperf lockd sunrpc bridge stp llc ipv6 nf_conntrack_ftp xt_physdev ipt_REJECT nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack iptable_filter ip_tables vhost_net macvtap macvlan tun kvm_intel kvm microcode iTCO_wdt iTCO_vendor_support dell_laptop dcdbas sg uvcvideo videodev v4l2_compat_ioctl32 btusb bluetooth joydev i2c_i801 lpc_ich mfd_core r8169 mii wl(P)(U) snd_hda_codec_hdmi snd_hda_codec_idt snd_hda_codec_generic cfg80211 rfkill snd_hda_intel snd_hda_codec snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer snd soundcore snd_page_alloc ext4 jbd2 mbcache sr_mod cdrom sd_mod crc_t10dif ahci wmi usb_storage i915 drm_kms_helper drm i2c_algo_bit i2c_core video output dm_mirror dm_region_hash dm_log dm_mod [last unloaded: coretemp]
Dec 19 02:40:03 hostname kernel: Pid: 912, comm: cfg80211 Tainted: P           -- ------------    2.6.32-573.26.1.el6.x86_64 #1 
Dec 19 02:40:03 hostname kernel: Call Trace:
Dec 19 02:40:03 hostname kernel: [<ffffffff81077821>] ? warn_slowpath_common+0x91/0xe0
Dec 19 02:40:03 hostname kernel: [<ffffffff8107788a>] ? warn_slowpath_null+0x1a/0x20
Dec 19 02:40:03 hostname kernel: [<ffffffffa0381239>] ? __cfg80211_connect_result+0x3d9/0x430 [cfg80211]
Dec 19 02:40:03 hostname kernel: [<ffffffffa035b374>] ? cfg80211_process_wdev_events+0x144/0x1f0 [cfg80211]
Dec 19 02:40:03 hostname kernel: [<ffffffff8153a63b>] ? mutex_unlock+0x1b/0x20
Dec 19 02:40:03 hostname kernel: [<ffffffffa0358410>] ? cfg80211_event_work+0x0/0x30 [cfg80211]
Dec 19 02:40:03 hostname kernel: [<ffffffffa035b458>] ? cfg80211_process_rdev_events+0x38/0x70 [cfg80211]
Dec 19 02:40:03 hostname kernel: [<ffffffffa0358432>] ? cfg80211_event_work+0x22/0x30 [cfg80211]
Dec 19 02:40:03 hostname kernel: [<ffffffff8109ab40>] ? worker_thread+0x170/0x2a0
Dec 19 02:40:03 hostname kernel: [<ffffffff810a1820>] ? autoremove_wake_function+0x0/0x40
Dec 19 02:40:03 hostname kernel: [<ffffffff8109a9d0>] ? worker_thread+0x0/0x2a0
Dec 19 02:40:03 hostname kernel: [<ffffffff810a138e>] ? kthread+0x9e/0xc0
Dec 19 02:40:03 hostname kernel: [<ffffffff8100c28a>] ? child_rip+0xa/0x20
Dec 19 02:40:03 hostname kernel: [<ffffffff810a12f0>] ? kthread+0x0/0xc0
Dec 19 02:40:03 hostname kernel: [<ffffffff8100c280>] ? child_rip+0x0/0x20
Dec 19 02:40:03 hostname kernel: ---[ end trace e80c4119fc086d48 ]---
Dec 19 02:40:03 hostname kernel: cfg80211: Regulatory domain changed to country: RS 
Dec 19 02:40:03 hostname kernel: cfg80211:  DFS Master region: ETSI
Dec 19 02:40:03 hostname kernel: cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)

Rumour has it, this is caused by "improper" loading of the WiFi card firmware on boot, hence, only rebooting the system fixes it.

Another problem (probably caused by improperly loaded firmware) is choppy/flaky network connectivity. The cards appears to have associated to the AP, but shows poor signal quality even though you're in the same room with the AP. even pings are dropping, and bottom line - connection is useless. Again, this should be resolved by repeated reboots until the firmware is loaded properly.


2023-09-11 07:22