Kernel 6.x Ate My WiFi Adapter
(And How I Got It Back)

When airodump-ng fails with zero explanation, you dig. Turns out Kali ships two competing WiFi drivers and only one of them actually works for pentest.

Kali Linux RTL8812AU Kernel 6.x WiFi Security Home Lab

The Alfa AWUS036ACH is the WiFi adapter everyone recommends for wireless security work. Dual-band, monitor mode, packet injection, solid range. I picked one up, plugged it into the Kali box, and it showed up immediately. Network scan worked. I could see everything in range.

Then I tried airodump-ng.

Failed initializing wireless card(s): wlan0

No other information. Just that. Not "driver not loaded", not "wrong mode", not "permission denied" — just a flat failure with nothing to dig into. Great.

The Two-Driver Problem

After some digging, I found the issue. Kali ships with the RTL8812AU chipset supported by a driver called rtw88_8812au — it's baked right into the kernel. It works perfectly for normal WiFi. You can connect to networks, you can scan, you can see signal strengths. Everything looks fine.

What it doesn't do well is monitor mode for actual pentest use. The implementation is limited enough that airodump-ng just rejects it.

The driver you actually want is called 88XXau — an out-of-tree module maintained separately from the kernel. This is the one that gives you proper monitor mode, proper packet injection, and a happy airodump-ng. It's been around for ages and is the standard recommendation for serious wireless work.

The problem: it was written for older kernels, and kernel 6.x broke it in three different ways.

Three Patches for Three Breakages

Building 88XXau on kernel 6.19 fails immediately. The errors are spread across different files and all have different root causes — each one is a different kernel API that changed or got removed in a different version.

The Makefile (kernel 5.18+)

The driver's Makefile uses EXTRA_CFLAGS to set include paths and defines. That variable was silently dropped from the kernel build system back in 5.18. On 6.x it's completely ignored, so the compiler runs without any of the setup flags it needs. One line fix — forward EXTRA_CFLAGS into ccflags-y, which is what the kernel actually reads now.

Timer Functions (kernel 6.15 / 6.16)

Two timer functions the driver relies on were removed in recent kernels — del_timer_sync() went in 6.15, from_timer() went in 6.16. Both were replaced by new equivalents. A few compat #define shims in the header file handle it cleanly with version guards, so the same code compiles on old and new kernels.

cfg80211 API (kernel 6.x MLO changes)

This one took the most time. Kernel 6.x added support for Wi-Fi 7's Multi-Link Operation, and that required changing the function signatures for several cfg80211_ops callbacks — set_tx_power, get_tx_power, and get_channel all got new parameters. The fix was to check the actual expected signatures in the kernel headers, then patch the driver's implementation to match.

DKMS Makes It Stick

Once all three patches are applied and the module builds successfully, the cleanest way to install it is via DKMS — the Dynamic Kernel Module System. It registers the module so that whenever a new kernel is installed, the module is automatically rebuilt to match. Without DKMS you'd have to redo the whole thing every kernel update.

The last step is blacklisting the in-kernel rtw88_8812au driver so the system loads 88XXau instead at boot. Without this, there's a coin-flip on which driver wins.

End Result

Monitor mode confirmed working. airodump-ng picks up everything in range. The Alfa at close range reads excellent signal. The whole process from "why is this failing" to "it works" took a few hours — mostly tracking down which kernel version removed which function and finding the right replacement in the headers.

Kernel version note: These patches were written and tested on kernel 6.19 (Kali 2026). The API changes are versioned so the patches won't break older kernels, but if you're on a significantly newer kernel and something still fails, check the current function signatures with grep in the kernel headers — the fix approach is the same.
📋

Field Notes — Full Patch Procedure

All three patches with copy-paste scripts, build commands, DKMS install, and verify steps.

Read the Guide →
Pixel the AI mascot