How to Fix Slow WiFi Speed on Fedora

Slow WiFi on Fedora is usually caused by power saving, a missing firmware feature, or the wrong wireless driver, and can be fixed by disabling power management or adjusting driver parameters.

Story / scenario opener

You run a large file transfer or join a video call and the throughput drops to a crawl. The signal bars look full, but the actual data rate sits at a fraction of what your router advertises. This happens on Fedora because the default configuration prioritizes battery life and regulatory compliance over raw wireless performance.

What is actually happening

Wireless adapters balance power consumption, signal stability, and throughput. The kernel driver and NetworkManager make conservative choices to keep the connection alive on laptops and to avoid interfering with neighboring networks. When the adapter aggressively downshifts its transmit power or locks onto a congested 2.4 GHz channel, your effective speed collapses. The driver enters a low-power state between packets, the radio drops to a narrower channel width, or the firmware fails to negotiate the highest modulation scheme. The fix involves telling the driver to stop conserving energy, pointing it at a cleaner frequency, and ensuring the firmware matches the hardware revision.

Identify the adapter and establish a baseline

You cannot tune what you cannot name. Fedora ships with multiple wireless stacks depending on your hardware. Intel chips use the iwlwifi module, Realtek chips often rely on rtw88 or proprietary drivers, and USB dongles may use mt76 or ath9k_htc. Knowing the exact chip and loaded module tells you which configuration files matter.

Here is how to find the adapter model and the active kernel driver.

lspci -nnk | grep -iA3 network
# WHY: Shows the PCI vendor/device ID, the exact driver loaded, and the kernel module in use
lsusb | grep -i wireless
# WHY: Catches USB dongles that lspci will miss entirely
iw dev
# WHY: Lists all wireless interfaces recognized by the kernel, including virtual ones

Record the interface name. It is usually wlan0 or wlp2s0. You will need this name for every command that follows. Before changing any settings, measure your current throughput. A baseline tells you whether the bottleneck is the radio, the router, or the ISP.

Here is how to run a quick throughput test against a public server.

sudo dnf install speedtest-cli
# WHY: Installs the CLI speed test tool from the Fedora repository
speedtest-cli --simple
# WHY: Runs the test and prints download, upload, and ping without extra formatting

Note the download number. Compare it to a wired Ethernet test on the same machine if you have a cable available. If Ethernet matches your ISP plan but WiFi does not, the radio stack is the problem. If both are slow, the issue is upstream.

Run the baseline test before you touch any configuration. Guessing without numbers wastes time.

Disable aggressive power management

Power management is the most common culprit for intermittent slowness. The kernel periodically puts the radio to sleep between packets to save battery. On desktop machines or laptops plugged into power, this behavior only adds latency and drops throughput. NetworkManager controls this globally through its dispatcher and configuration directories.

Here is how to check the current power save state and disable it for the active session.

iw dev wlan0 get power_save
# WHY: Queries the kernel for the current power management setting on the interface
sudo iw dev wlan0 set power_save off
# WHY: Tells the driver to stop sleeping between packets until the next reboot

The iw command only changes the live state. Rebooting or reconnecting to a different network will revert the setting. You need a persistent configuration that survives reboots. NetworkManager reads drop-in files from /etc/NetworkManager/conf.d/ on startup. Files in /etc/ are user-modified. Files in /usr/lib/ ship with the package. Edit /etc/. Never edit /usr/lib/.

Here is how to write a persistent power management override.

[connection]
wifi.powersave = 2
# WHY: 2 disables power saving globally. 3 enables it. NetworkManager applies this to all WiFi profiles.

Place that content in /etc/NetworkManager/conf.d/wifi-disable-powersave.conf. Restart the service to apply the change immediately.

sudo systemctl restart NetworkManager
# WHY: Reloads the configuration directory and reapplies the new power management policy
sudo systemctl status NetworkManager
# WHY: Confirms the service restarted cleanly and shows recent log lines for errors

Check journalctl -xe if the service fails to start. The x flag adds explanatory text and the e flag jumps to the end. Most sysadmins type journalctl -xeu NetworkManager muscle-memory style.

Reboot before you debug. Half the time the symptom is gone.

Switch bands and isolate interference

The 2.4 GHz band shares spectrum with microwaves, Bluetooth devices, and every neighbor's router. Channels overlap heavily, and the maximum theoretical speed caps at 600 Mbps under perfect conditions. The 5 GHz band offers wider channels, less overlap, and higher modulation rates. Distance and wall penetration are worse, but throughput is consistently higher.

Here is how to force a NetworkManager connection profile to prefer the 5 GHz band.

nmcli connection modify "Home WiFi" 802-11-wireless.band a
# WHY: Forces the connection profile to prefer 5 GHz. Use bg for 2.4 GHz.
nmcli connection up "Home WiFi"
# WHY: Reapplies the modified profile to the active interface and triggers a new scan

NetworkManager stores connection profiles, not live state. Modifying the profile changes future connections. The a value tells the driver to scan only 5 GHz channels. If your router broadcasts the same SSID on both bands, the client will now ignore the 2.4 GHz beacon.

You can verify which channel the router is broadcasting by scanning the airwaves.

nmcli device wifi list
# WHY: Lists all visible networks, their channels, frequencies, and signal strength

If many networks share your channel, your router's admin panel can switch to a less congested one. Tools like wavemon provide a live view of signal quality and noise floor.

sudo dnf install wavemon
# WHY: Installs a terminal-based wireless monitoring tool
wavemon
# WHY: Launches the interactive interface showing real-time RSSI, SNR, and channel utilization

Pick a channel with the least overlap. On 5 GHz, channels 36, 40, 44, and 48 are usually safe. Avoid DFS channels if your region requires radar detection, as the radio will drop the connection temporarily when a weather radar sweeps by.

Trust the package manager. Manual file edits drift, snapshots stay.

Update firmware and tune driver parameters

Some Intel and Realtek adapters need binary firmware blobs that are not included in the base Fedora repository due to licensing. The linux-firmware package contains the majority of open-source compatible firmware. Proprietary Realtek chips sometimes require packages from RPM Fusion.

Here is how to install the latest firmware packages and reload the driver.

sudo dnf install linux-firmware iwlwifi-firmware
# WHY: Pulls the latest binary blobs from Fedora repos. RPM Fusion may be needed for proprietary Realtek chips.
sudo modprobe -r iwlwifi && sudo modprobe iwlwifi
# WHY: Unloads and reloads the kernel module to pick up the new firmware files

The modprobe -r command will fail if the interface is actively transmitting. Disconnect from WiFi first or run the command from a TTY. The driver will automatically fetch the matching .ucode file from /lib/firmware/ on reload.

Driver parameters can also improve throughput on older or buggy hardware. The iwlwifi module accepts several options that control hardware acceleration and power states.

Here is how to apply persistent module parameters.

options iwlwifi 11n_disable=0 power_save=0 swcrypto=1
# WHY: 11n_disable=0 ensures 802.11n is active. swcrypto=1 can bypass buggy hardware encryption on older chips.

Place this in /etc/modprobe.d/iwlwifi.conf. The modprobe.d directory is read every time the kernel loads a module. You do not need to rebuild the initramfs for these changes to take effect. A simple module reload or reboot applies them.

Run journalctl -t setroubleshoot if you see SELinux denials after changing firmware paths. SELinux denials show up with a one-line summary. Read those before disabling SELinux.

Reboot for the module parameter changes to take effect. Future-you will thank you.

Verify the fix

You need to confirm that the radio is actually using the new settings. The kernel exposes the negotiated bitrate and active frequency through iw. NetworkManager logs the connection state. A second speed test closes the loop.

Here is how to check the live radio state and negotiated link speed.

iw dev wlan0 get power_save
# WHY: Confirms the kernel sees power saving as off
iw dev wlan0 link
# WHY: Shows the active frequency, signal strength, and negotiated bitrate

Look for power_save: off and a frequency in the 5000 MHz range. The bitrate should match your router's advertised rate. If it shows 1 Mbps or 6 Mbps, the radio is falling back to legacy modulation due to interference or a firmware mismatch.

Run the speed test again.

speedtest-cli --simple
# WHY: Repeats the baseline measurement to quantify the improvement

Compare the new number to the baseline. A 2x to 5x improvement is normal when disabling power saving and switching bands. If the number is identical, the bottleneck is elsewhere.

Run journalctl first. Read the actual error before guessing.

Common pitfalls and what the error looks like

The nmcli connection modify command will refuse to proceed and print Error: Connection activation failed: Device not ready. This happens when you try to modify a profile while the interface is in a transitional state. Wait for the connection to fully establish or disconnect first.

If you see [FAILED] Failed to start NetworkManager.service during boot, your network configuration probably references a missing interface name or a malformed drop-in file. Check the syntax of /etc/NetworkManager/conf.d/. A single missing bracket breaks the entire parser.

The modprobe -r command will print modprobe: FATAL: Module iwlwifi is in use. The kernel refuses to unload a module while a network interface holds it. Bring the interface down with sudo ip link set wlan0 down before reloading.

RF-kill blocks are another common trap. The command iw dev wlan0 set power_save off will return iw: command failed: Operation not possible due to RF-kill. Check rfkill list to see if a hardware switch or software toggle is blocking the radio. Unblock it with rfkill unblock wifi before proceeding.

If the boot menu is gone, GRUB rescue is your friend, not your enemy.

When to use this approach versus alternatives

Use iw and modprobe.d when you need low-level control over driver behavior and power states. Use nmcli when you want to manage connection profiles, band preferences, and authentication without touching kernel parameters. Use wavemon when you are diagnosing channel congestion or signal degradation in a dense apartment building. Use a wired Ethernet connection when you require guaranteed latency and throughput for gaming or large transfers. Stay on the default Fedora configuration if your laptop battery life matters more than peak wireless speed.

Where to go next