This week I’ve spent way too many evenings trying to figure out why Ubuntu 20.04 was unable to load the driver for a 9260 wireless card, which by all indications seemed like it should be at least partially supported by recent-ish kernels. For the record, I tried the stock generic 5.4 and 5.8 kernels in the Ubuntu Focal apt repos.

The initial clue was output from dmesg which didn’t reveal a ton of additional info:

$ dmesg | grep -i wifi
[    4.686571] Intel(R) Wireless WiFi driver for Linux
[    4.983570] iwlwifi 0000:04:00.0: enabling device (0000 -> 0002)
[    5.080453] iwlwifi: probe of 0000:02:00.0 failed with error -110

There were some debugging docs in the Linux Wireless Wiki. From these docs and some poking around at kernel configs I think the terse output I was seeing was just because the kernels were built with CONFIG_IWLWIFI_DEBUG disabled. I went so far as to rebuild the kernel with this config enabled but the only additional info I got was fairly terse (“Failed to wake NIC”).

There were also bug reports around the “Failed to wake NIC” message but at a glance nothing that seemed specific to the 9260. In retrospect I should have poked around at this a little more, since it was ultimately a bug report for an “unrelated” Intel NIC that got me on the right path. Anyway, then I tried to wring out more info with trace-cmd without much luck. Seemed like it might be useful if I were having issues once the driver was loaded, but didn’t seem to have anything that would help me during the initialization/”probe” phase.

I dug around for bugs around this NIC and the mysterious “error -110” and found a few reports indicating that folks were indeed having issues with this and other Intel NICs in Linux, but almost all of them were dual booting Windows and I certainly wasn’t. Even Intel’s own site hand-waves about “Windows leaves things partially running” and there were suggestions in several places to disable a Fast Startup feature in Windows. I blew Windows away completely when I installed Ubuntu, so that wasn’t going to help me without a painful reinstall. It also felt unlikely that Windows (having been completely uninstalled) would still be causing me trouble.

Turns out I was wrong.

When I first started the system I booted into Windows 10 just as a smoke test to see if things would boot at all. I didn’t even complete the setup process, just saw the ‘welcome’ screen and shut down.

Booting into Windows was apparently my big mistake because it laid claim to the NIC, presumably as part of the Windows Fast Startup feature I mentioned earlier. The claim seemed to persist across reboots and even fully shutting the system down didn’t help. Some posts seemed to imply that this behavior is due to some sort of hibernation on the host, but I really don’t think that’s actually the case given I simply would have had to fully power the thing off to install Ubuntu etc.

Somebody in this bug report mentioned that disabling Wake-on-LAN in the BIOS helped address a similar issue with a different Intel card. Too lazy to physically attach a keyboard to fool around in the BIOS, I wondered if simply unplugging the system for a bit would be enough to clear whatever state was lingering around in the NIC between reboots. This worked! Very next boot, dmesg reported this:

$ dmesg | grep -i wifi
[    3.386571] Intel(R) Wireless WiFi driver for Linux
[    3.404745] iwlwifi 0000:02:00.0: enabling device (0000 -> 0002)
[    3.429996] iwlwifi 0000:02:00.0: Found debug destination: EXTERNAL_DRAM
[    3.429998] iwlwifi 0000:02:00.0: Found debug configuration: 0
[    3.430317] iwlwifi 0000:02:00.0: loaded firmware version 46.6bf1df06.0 op_mode iwlmvm
[    3.514261] iwlwifi 0000:02:00.0: Detected Intel(R) Wireless-AC 9260 160MHz, REV=0x324
[    3.523071] iwlwifi 0000:02:00.0: Applying debug destination EXTERNAL_DRAM
[    3.523559] iwlwifi 0000:02:00.0: Allocated 0x00400000 bytes for firmware monitor.
[    3.568867] iwlwifi 0000:02:00.0: base HW address: d8:3b:bf:58:98:9b
[    3.638799] iwlwifi 0000:02:00.0 wlp2s0: renamed from wlan0

Now to see if it actually works.

A few handy links I found along the way: