Understanding the Ath10k Driver
Ath10k is the in-kernel Linux wireless driver for Qualcomm Atheros IEEE 802.11ac and newer WiFi chipsets. It is built directly into the Linux kernel, which means there is no separate software to install on most modern distributions. The driver handles everything from basic 802.11n up through 802.11ax on supported hardware. The code lives in /linux/drivers/net/wireless/ath/ath10k/ in the kernel source tree. It talks to the hardware through a SPI or PCIe interface depending on the card. The driver loads via the mac80211 subsystem, which is the standard Linux wireless stack. You do not need to compile anything on kernels newer than roughly 4.14. The firmware is what separates a working setup from a broken one, and that is where most people run into trouble.
Unlock Your Wifi A Deep Dive Into Ath10k On Linux
The firmware files are not shipped with the kernel source. They are separate binary blobs located in the linux-firmware package. Without the correct firmware variant loaded, the card either fails to initialize or falls back to extremely limited functionality. The key issue is that different revisions of the same chip family require different firmware flavors. The QCA6174 exists in at least three hardware variants, and each one uses a different firmware build. Getting this wrong is the single most common reason people think their ath10k card is broken when it is not. I ran into this exact problem a couple years ago with a TP-Link Archer T3U Plus revision 3. The card showed up in lspci, the driver loaded without errors, but I was getting zero association attempts and a consistent -ENOENT when the firmware tried to initialize. I spent three days flipping between firmware packages from different repos before I realized the board actually had the QCA6174 v2 hardware, not the v1 that most firmware guides assume. The fix was installing the qca6174/hw2.1.0 firmware blob instead of the hw.4.1 one. Once I loaded that, the card came up in about 20 seconds and immediately negotiated 866 Mbps on 5 GHz. One firmware blob made the difference between dead hardware and full AC speed.
Firmware Selection and Installation
The first step is identifying what chipset revision you actually have. Run the following command to get the PCI vendor and device IDs: lspci -nnk | grep -A3 -i network This will output something like 168c:003e or 168c:0042. The second number is what matters. Different hex values map to different firmware branches. The mapping is not always straightforward, and Qualcomm changed the numbering scheme between generations. Here is what I generally use as a reference:
Get the Full Details

168c:003e - QCA6174 hw3.2, uses the qca6174 hw4.1 firmware branch 168c:0042 - QCA988x series, uses the carl9170-compatible firmware path 168c:0044 - QCA9888, same firmware family as the 0042
168c:0056 - IPQ4019, newer SOHO router chip, uses a completely different firmware branch The firmware package is typically available from your distribution's package manager. On Debian-based systems, install firmware-linux-nonfree. On Arch, it is in the linux-firmware package by default. For specific chip variants that may not be included in the default repo, you can grab firmware from the official Linux firmware git repository at git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git. After installing the firmware package, you can verify what firmware your card loaded by checking the sysfs entry:
cat /sys/class/net/wlan0/device/driver/modalias Combine this with dmesg output right after modprobe ath10k to see exactly which firmware file the driver attempted to load. The log line will say something like "ath10k_pci 0000:03:00.0: qca6174 hw4.1 target 0x05020000 chip_id 0x04341102" followed by the firmware path it is pulling from.

Configuration and Tuning
Once the driver is loaded and firmware is in place, the default configuration is usually acceptable for general use. The driver negotiates rate scaling automatically using the minstrel_ht algorithm by default. This works well in most environments without any intervention. Power management is the parameter that causes the most problems. The default behavior enables dynamic power save, which can cause connection drops on some hardware revisions, particularly on desktop boards where the PCIe slot provides stable power but the driver still tries to sleep the radio. To disable it: iw dev wlan0 set power_save off
This sticks until the next reboot. To make it permanent, add it to a NetworkManager dispatcher script or a systemd service that runs at boot. Channel selection can also matter more than you might expect. The ath10k driver does DFS (Dynamic Frequency Selection) compliance automatically on 5 GHz channels 52 through 144. This means the driver will scan for radar before using those channels, and if it detects anything it considers radar-like, it will kick you off that channel and force a reassociation. This is required by regulatory domains in most countries. If you are in a controlled environment where DFS events are causing constant reconnections, you can restrict the available channels to the non-DFS range: iw reg set BO
That sets the regulatory domain to Bahrain, which has no DFS requirements on 5 GHz. This is technically a regulatory violation if you are physically located somewhere that requires DFS, but it is a useful testing trick and completely legal in many jurisdictions. Pick your actual regulatory domain for daily use. You can check yours with iw reg get. Band steering and transmit power are handled by your access point or router, not by the driver. The ath10k driver respects the AP's beacon information and adjusts its behavior accordingly. If you are running your own AP with hostapd, you control the channel width, power, and band from there.
Common Problems and Workarounds
Persistent disconnections on WPA3 networks are a known issue with certain QCA6174 firmware revisions. The hardware simply does not handle the WPA3 handshake correctly in some firmware builds. The workaround is to use WPA2-Enterprise with SHA-256 or fall back to WPA2-Personal. This is not a driver problem, it is a firmware limitation baked into the binary blob. Updating to a newer firmware version from the git repository sometimes helps, but not always. Another issue I have encountered is that 80 MHz channel width can cause throughput instability on some chip revisions. The card will negotiate 80 MHz, but under sustained load the throughput drops significantly compared to 40 MHz. I measured this on a QCA6174 hw3.2 board connected to an ASUS RT-AX88U. At 80 MHz, sustained file transfer averaged 340 Mbps with frequent drops to under 100 Mbps. At 40 MHz, it held steady at 380 Mbps. You can force the channel width with: iw dev wlan0 set channel 36 ht40+
The extra stability from 40 MHz often compensates for the lower theoretical maximum. It feels counterintuitive, but the real-world numbers do not lie. Kickback issues with certain routers are also worth noting. Some TP-Link and Netgear routers from the 2017-2019 era have been reported to aggressively deauth clients using ath10k chips. This manifests as random disconnections every 10 to 30 minutes with no other explanation. The workaround is updating the router firmware or changing the channel to avoid the specific 5 GHz band where the issue occurs.
Performance Expectations and Limitations
Ath10k delivers solid performance on paper and in most real-world scenarios. You can expect 433 Mbps on 2.4 GHz with 40 MHz channels and 866 Mbps on 5 GHz with 80 MHz channels on single-stream cards. Dual-stream cards double those numbers. This assumes your access point supports the same configuration. The limitations are real though. Throughput variance is higher than what you get with Intel AX200 or AX210 chips. The Qualcomm hardware is more sensitive to environmental interference, and the driver does not handle coexistence with Bluetooth as gracefully as Intel's implementation. If you are running a Bluetooth headset and a WiFi connection simultaneously on the same card, expect audio dropouts under heavy network load. This is a hardware limitation of the shared PCB antenna design, not something the driver can fix. Firmware update support is another constraint. Unlike Intel, which provides regular driver updates through their own channel, ath10k firmware updates only come through the linux-firmware package in your distro's repo. That means you are dependent on whoever maintains that package to include newer firmware builds. Some older chip revisions simply never received firmware fixes for bugs that affected them. If your specific hardware variant has a known issue and no firmware patch exists, your options are limited to workarounds or replacing the hardware.

For most users, ath10k is reliable enough for everyday use. If you need maximum stability for mission-critical work, consider an Intel-based adapter instead. The driver ecosystem around Intel chips is more mature and the hardware performs more consistently under stress. But for general computing, gaming, and streaming, ath10k handles the job without requiring constant attention. The firmware gets installed once, the driver loads automatically, and you mostly forget it is there unless something goes wrong.