Manually Install WiFi Driver on Linux

On December 24th, 2024, Debian had me a gift for me: it installed Linux kernel 6.11.10, and suddenly the WiFi module of my laptop stopped working. I quickly found a workaround (selecting an older kernel with GRUB during boot) and hoped that the problem would be fixed by the next kernel update or by a firmware update from my laptop's manufacturer. Sadly, kernel 6.12 arrived and nothing changed. I finally took some time to really investigate the issue. In this article, I will explain how I diagnosed and fixed the problem. Spoiler alert: I downloaded and manually installed drivers from kernel.org. The Symptoms With kernel 6.11, the WiFi was simply absent from the GUI of Debian's settings. My laptop wasn't just unable to connect to the network, the WiFi was simply gone! With kernel 6.12, the entry was present in the GUI, but only to tell me that no network adapter was available. The time to open a terminal and investigate had come. Several commands can help determine the state of the WiFi adapter, such as lshw -C network or lspci. On my laptop, the latter showed: $ lspci -k ... 00:14.3 Network controller: Intel Corporation Raptor Lake PCH CNVi WiFi (rev 01) Subsystem: Intel Corporation Raptor Lake PCH CNVi WiFi Kernel modules: iwlwifi ... The -k option shows "kernel drivers handling each device and also kernel modules capable of handling it" according to the man pages. The network controller was detected, but something was clearly wrong: unlike other devices, there was no line saying "Kernel driver in use: [name-of-the-driver]". The kernel's log provides detailed information about modules and drivers being loaded. By inspecting the log and searching for the module indicated by lspci, I noticed that the module was indeed not properly loaded: dmesg | grep -i iwlwifi [ 264.172078] iwlwifi 0000:00:14.3: Detected crf-id 0x400410, cnv-id 0x80400 wfpm id 0x80000020 [ 264.172136] iwlwifi 0000:00:14.3: PCI dev 51f1/0090, rev=0x370, rfid=0x2010d000 [ 264.172137] iwlwifi 0000:00:14.3: Detected Intel(R) Wi-Fi 6E AX211 160MHz [ 264.172742] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-89.ucode (-2) [ 264.172747] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-89.ucode (-2) [ 264.172748] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-89.ucode failed with error -2 [ 264.172754] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-88.ucode (-2) [ 264.172757] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-88.ucode (-2) [ 264.172758] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-88.ucode failed with error -2 [ 264.172761] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-87.ucode (-2) [ 264.172764] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-87.ucode (-2) [ 264.172765] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-87.ucode failed with error -2 [ 264.172769] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-86.ucode (-2) [ 264.172771] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-86.ucode (-2) [ 264.172772] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-86.ucode failed with error -2 [ 264.172775] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-85.ucode (-2) [ 264.172778] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-85.ucode (-2) [ 264.172779] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-85.ucode failed with error -2 [ 264.172782] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-84.ucode (-2) [ 264.172785] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-84.ucode (-2) [ 264.172786] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-84.ucode failed with error -2 [ 264.172789] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-83.ucode (-2) [ 264.172792] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-83.ucode (-2) [ 264.172792] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-83.ucode failed with error -2 [ 264.172796] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-82.ucode (-2) [ 264.172799] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-82.ucode (-2) [ 264.172800] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-82.ucode failed with error -2 [ 264.172803] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-81.ucode (-2) [ 264.172806] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-81.ucode (-2) [ 264.172807] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-81.ucode failed with error -2 [ 264.172810] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-80.ucode (-2) [ 264.172813] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-8

Mar 24, 2025 - 12:33
 0
Manually Install WiFi Driver on Linux

On December 24th, 2024, Debian had me a gift for me: it installed Linux kernel 6.11.10, and suddenly the WiFi module of my laptop stopped working. I quickly found a workaround (selecting an older kernel with GRUB during boot) and hoped that the problem would be fixed by the next kernel update or by a firmware update from my laptop's manufacturer. Sadly, kernel 6.12 arrived and nothing changed. I finally took some time to really investigate the issue.

In this article, I will explain how I diagnosed and fixed the problem.

Spoiler alert: I downloaded and manually installed drivers from kernel.org.

The Symptoms

With kernel 6.11, the WiFi was simply absent from the GUI of Debian's settings. My laptop wasn't just unable to connect to the network, the WiFi was simply gone! With kernel 6.12, the entry was present in the GUI, but only to tell me that no network adapter was available.

The time to open a terminal and investigate had come.

Several commands can help determine the state of the WiFi adapter, such as lshw -C network or lspci. On my laptop, the latter showed:

$ lspci -k
...
00:14.3 Network controller: Intel Corporation Raptor Lake PCH CNVi WiFi (rev 01)
    Subsystem: Intel Corporation Raptor Lake PCH CNVi WiFi
    Kernel modules: iwlwifi
...

The -k option shows "kernel drivers handling each device and also kernel modules capable of handling it" according to the man pages. The network controller was detected, but something was clearly wrong: unlike other devices, there was no line saying "Kernel driver in use: [name-of-the-driver]".

The kernel's log provides detailed information about modules and drivers being loaded. By inspecting the log and searching for the module indicated by lspci, I noticed that the module was indeed not properly loaded:

dmesg | grep -i iwlwifi
[  264.172078] iwlwifi 0000:00:14.3: Detected crf-id 0x400410, cnv-id 0x80400 wfpm id 0x80000020
[  264.172136] iwlwifi 0000:00:14.3: PCI dev 51f1/0090, rev=0x370, rfid=0x2010d000
[  264.172137] iwlwifi 0000:00:14.3: Detected Intel(R) Wi-Fi 6E AX211 160MHz
[  264.172742] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-89.ucode (-2)
[  264.172747] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-89.ucode (-2)
[  264.172748] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-89.ucode failed with error -2
[  264.172754] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-88.ucode (-2)
[  264.172757] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-88.ucode (-2)
[  264.172758] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-88.ucode failed with error -2
[  264.172761] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-87.ucode (-2)
[  264.172764] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-87.ucode (-2)
[  264.172765] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-87.ucode failed with error -2
[  264.172769] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-86.ucode (-2)
[  264.172771] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-86.ucode (-2)
[  264.172772] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-86.ucode failed with error -2
[  264.172775] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-85.ucode (-2)
[  264.172778] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-85.ucode (-2)
[  264.172779] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-85.ucode failed with error -2
[  264.172782] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-84.ucode (-2)
[  264.172785] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-84.ucode (-2)
[  264.172786] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-84.ucode failed with error -2
[  264.172789] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-83.ucode (-2)
[  264.172792] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-83.ucode (-2)
[  264.172792] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-83.ucode failed with error -2
[  264.172796] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-82.ucode (-2)
[  264.172799] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-82.ucode (-2)
[  264.172800] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-82.ucode failed with error -2
[  264.172803] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-81.ucode (-2)
[  264.172806] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-81.ucode (-2)
[  264.172807] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-81.ucode failed with error -2
[  264.172810] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-80.ucode (-2)
[  264.172813] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-80.ucode (-2)
[  264.172814] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-80.ucode failed with error -2
[  264.172817] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-79.ucode (-2)
[  264.172820] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-79.ucode (-2)
[  264.172821] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-79.ucode failed with error -2
[  264.172825] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-78.ucode (-2)
[  264.172827] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-78.ucode (-2)
[  264.172828] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-78.ucode failed with error -2
[  264.172832] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-77.ucode (-2)
[  264.172834] iwlwifi 0000:00:14.3: firmware: failed to load iwlwifi-so-a0-gf-a0-77.ucode (-2)
[  264.172835] iwlwifi 0000:00:14.3: Direct firmware load for iwlwifi-so-a0-gf-a0-77.ucode failed with error -2
[  264.172836] iwlwifi 0000:00:14.3: no suitable firmware found!
[  264.172838] iwlwifi 0000:00:14.3: minimum version required: iwlwifi-so-a0-gf-a0-77
[  264.172839] iwlwifi 0000:00:14.3: maximum version supported: iwlwifi-so-a0-gf-a0-89
[  264.172839] iwlwifi 0000:00:14.3: check git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git

This output also confirmed the model of the WiFi controller from the website of my laptop's manufacturer: it's an Intel® Wi-Fi 6E AX211.

As mentioned before, the WiFi controller was still working fine with kernel 6.10. The same dmesg command was showing similar errors, but the kernel was trying to load more modules. Eventually, it succeeded in loading version 72:

[   17.290059] iwlwifi 0000:00:14.3: loaded firmware version 72.daa05125.0 so-a0-gf-a0-72.ucode op_mode iwlmvm

The Solution

Intel's website states that this controller is supported by Linux. It even mentions that it is supported by kernel 6.11+.

A discussion thread from Intel's forum was helpful: you can manually download drivers from kernel.org and install them by simply copying them to /lib/firmware.

What was already installed on my laptop? I listed the files matching the pattern from dmesg with ll /lib/firmware/iwlwifi-so-a0-gf-*.ucode and found only one result: /lib/firmware/iwlwifi-so-a0-gf-a0-72.ucode. The dmesg output had mentioned that "minimum version required: iwlwifi-so-a0-gf-a0-77" and "maximum version supported: iwlwifi-so-a0-gf-a0-89". Conclusion: the driver was failing to load not because it was invalid, but simply because it was missinga version in the required range.

I new the files I needed, so I headed to kernel.org and downloaded both version 77 and 89, which are the minimum required and maximum supported versions the kernel was trying to load. In reality, only version 89 would have been sufficient.

I simply copied these files to /lib/firmware, rebooted my computer, and... the WiFi was back! :)

Now, dmesg confirms that a driver is correctly loaded with [ 183.837486] iwlwifi 0000:00:14.3: loaded firmware version 89.1a492d28.0 so-a0-gf-a0-89.ucode op_mode iwlmvm and the output of lspci shows that there a kernel driver in use (and yes, this is very significant difference):

$ lspci -k -s 14.3
00:14.3 Network controller: Intel Corporation Raptor Lake PCH CNVi WiFi (rev 01)
        Subsystem: Intel Corporation Raptor Lake PCH CNVi WiFi
        Kernel driver in use: iwlwifi
        Kernel modules: iwlwifi

Conclusion

Sometimes, newer kernels don't come with the required drivers. In my case, it's was the WiFi's driver, but it can the drive for another type of device.

If you find yourself in a similar situation:

  • Identify the exact model of your device.
  • Check kernel logs to find error messages to determine what files are missing.
  • Manually download and install the required driver.
  • Reboot your machine and hope for the best.

PS: there is a package named firmware-iwlwifi in Debian non-free repository. Installing should provide automatic updates for Intel WiFi firmware in the future. However, because this Debian and Debian is sometimes slow to update its package, this package seems clearly outdated:

 % sudo apt install firmware-iwlwifi
[...]]
firmware-iwlwifi is already the newest version (20230210-5).
0 upgraded, 0 newly installed, 0 to remove and 86 not upgraded.

Oh by the way: iwlwifi probably stands for "Intel Wire*L*ess WiFI".