How to enable Broadcom Wireless on Manjaro

Updated: September 13, 2019

Here's an interesting problem. Several weeks ago, I tested Manjaro 18.0.4 Illyria on my HP Pavilion laptop, and I've come across an interesting phenomenon. The laptop is equipped with a Broadcom Wireless card, and in the live session, both with free and nonfree drivers, the network was up and running okay. However, after the installation, I had no Wireless.

Looking at system looks, I found an error that said WLC_SCAN error (-22). Once I hit the Intertubes with this search, all hell broke loose. I found dozens of Arch and Manjaro forum posts talking about this issue. There were some solutions offered, but they were either ineffective or very difficult to implement. So I decided to try to fix this on my own, hence this guide. Follow me.

Problem in more detail

As it happens, in my case, I did have the Wireless icon showing up, and the Network Manager did list a number of access points in the vicinity of the laptop. But when I tried to connect, nothing would happen. I'd type in the password, wait, and then, the selected access point would simply disappear from the list, and no connection would be established. Running dmesg, I saw the following text:

[  526.274664] IPv6: ADDRCONF(NETDEV_UP): wlo1: link is not ready
[  526.276614] ERROR @wl_cfg80211_scan :
[  526.276619] WLC_SCAN error (-22)

I did have a Wireless network card identified (up and running). The (free) wl kernel module was loaded into memory. However, the system was unable to establish a connection. Turning off IPv6 did not help - this is just an artifact of not using IPv6 on the router(s).

I did attempt some of the quick fixes suggested in the various threads. One of them was to use the hardware button on the laptop case to turn the Wireless antenna on/off, and then check the status with the rfkill command. Some people reported having this help them "unblock" their cards. It didn't work for me.

rfkill list
0: hp-wifi: Wireless LAN
        Soft blocked: no
        Hard blocked: yes
1: hp-bluetooth: Bluetooth
        Soft blocked: yes
        Hard blocked: yes
2: phy0: Wireless LAN
        Soft blocked: no
        Hard blocked: no

I didn't want to start fiddling with yaourt at this point, trying broadcom-wl-dkms, and other tips and tricks mentioned. I wanted to see if I could resolve this with minimal changes to my system state, and hopefully, no need for any downloads via wired network (or similar).

Solution

Looking at other distributions I've used on this machine - including the somewhat problematic Fedora 30, as well as others that did have good, reasonable network connectivity and speed, I realized that I should be using the b43 kernel modules for the Wireless device rather than the wl blob. The first step was to manually unload the existing module (wl) and load the b43 one:

sudo modprobe -r wl

sudo modprobe b43

Once I did this, the problem changed. I no longer had Wireless at all, even though the b43 module has been loaded into memory. So I checked the system messages once again, and I saw the following error:

[  120.170582] Support for cores revisions 0x17 and 0x18 disabled by module param allhwsupport=0. Try b43.allhwsupport=1
[  120.170590] b43: probe of bcma0:1 failed with error -524
[  120.170611] Broadcom 43xx driver loaded [ Features: PNLS ]

As the error says, I needed to load the module with different parameters:

sudo modprobe b43 allhwsupport=1

Success! Once I did this, the Wireless card came back to life, I was able to connect and use the network just fine. So the problem is solved - but we still need to understand why and then auto-enable the use of the b43 module on boot.

Blacklisted modules

For some reason, both the free and nonfree editions of Manjaro Illyria have the b43 module blacklisted, which would explain why they wouldn't be loaded on boot. You can check this by examining the contents of the file named linux419-broadcom-wl.conf under /etc/modprobe.d. Inside, the whole range of relevant module was listed, including b43, b43legacy, bcma, ssb, and others.

Enable b43 loading on boot

Now that we have a manual fix, we need to make it permanent. This requires editing two files. One, you need to add b43 to the list of modules to boot under /etc/modules-load.d/modules.conf. If you cat the contents of this files, it will show something like:

# List of modules to load at boot

You need to add b43 underneath, like this:

# List of modules to load at boot
b43

But that's not all. We need to add a module loading option under /etc/modprobe.d. This is similar to what we did with the Realtek Wireless card to make it work on older 3.X kernels. You need to create a configuration file with the following format: "module name".conf. In this case, b43.conf. Inside this file, we need the allhwsupport option:

options b43 allhwsupport=1

To verify, the file should look like this:

cat /etc/modprobe.d/b43.conf
options b43 allhwsupport=1

And that's it. Reboot, and you will have your Wireless up and running.

Conclusion

There we go. This wasn't trivial. But I find this more elegant than manually compiling and building modules, and having to use a separate network just to grab the necessary packages. The fact there are also two different directories you need to use to enable the module loading also makes this a bit more complicated.

Anyway, the long-term solution is to have the distro automatically detect potentially "bad" hardware already in the live stage and make adjustments accordingly - install compilation tools and headers, modify the system configuration in advance, and such, so when the user logs in the first time, everything works. I hope you found this tutorial useful. Take care, Manjarians.

Cheers.

You may also like: