OpenWrt Wi-Fi slow after idle: a 10-minute diagnostic
2026-10-11 · 2 min read
Symptom: after an idle period, one device's download drops to about 10 Mbps (sometimes worse) while other devices are fine. Here is the 10-minute diagnostic we used to find two root causes on an MT7986 router (grade E evidence; the fixes ship as scripts [2] and the measurements are published [1]).
1. Direction test: is it only the downlink?
# on the AP
iw dev <ap> station dump | grep -E "Station|tx bitrate|rx bitrate|signal:"
tx bitratelow (MCS0) whilerx bitrateis high means the AP-to-client direction is broken;- if both are low, you have a signal/interference/regulatory problem instead.
2. Sample the rate, do not trust one reading
for i in $(seq 1 20); do
iw dev <ap> station dump | grep -m1 "tx bitrate"
sleep 2
done
Oscillating between MCS0 and MCS9+ points to rate-control/state problems. Pinned at a mid rate points to channel conditions.
3. Byte accounting: retransmissions or idle airtime?
Compare bytes the AP transmitted with bytes the client received during a LAN transfer:
- transmitted roughly equals received: airtime is idle, the rate is simply low (rate-control problem);
- transmitted far exceeds received: retransmission storm (radio/interference problem).
4. Check the two known mt76 traps
# trap 1: firmware VoW ATF (default 1) prevents the rate from recovering
cat /sys/kernel/debug/ieee80211/phy*/mt76/vow_atf
echo 0 > /sys/kernel/debug/ieee80211/phy*/mt76/vow_atf # test it now
# trap 2: a 40 MHz-only client inside an 80 MHz BSS
iw dev <ap> info | grep -E "channel|width" # radio width
iw dev <ap> station dump | grep -m1 "tx bitrate" # client width appears in the rate string
Expected result after fixing trap 1 (measured on MT7986): the first bursts are still slow, then throughput climbs back to about 400 Mbps within 15 s. If your client is a 40 MHz device, also switch the radio to 40 MHz (stable 330-420 Mbps).
5. Make the fix survive reboots
vow_atf lives in debugfs and is lost on driver reload, so persist it with an init script at boot
(/etc/init.d/mt76-wifi-tune) and a watchdog that re-applies it every minute. Both scripts ship in the project toolkit.
6. Quick reference
| Observation | Most likely cause | Fix |
|---|---|---|
| one client, downlink only, pinned MCS0 | firmware ATF blocking recovery | disable vow_atf, persist it |
| collapses every few minutes, 40 MHz client | narrow client in wide BSS | run the radio at the client's width |
| all clients slow at the same time | channel/interference | channel analysis, width reduction, DFS |
| slow only far from the AP | signal/rate | check RSSI, antenna placement |
Related: mt76 rate control deep dive · 80 vs 40 MHz · reproduction guide
References and data sources
Every external claim carries a source and an evidence grade (grading scheme). Grade E marks first-party, reproducible measurements from this project.
- Grade E · first-party measurement
This project's 10-minute raw capture (57,293 records / 600.0 s, SHA-256 00373f83…95e2)
Router CSI Lab · 2026
csi.okwujun.pw/zh/datasets/ · verified: Reassembled chunks verified byte-identical (2026-10-11) - Grade E · first-party measurement
Router CSI Toolkit — capture/analysis/watchdog scripts (MIT)
Router CSI Lab · 2026
csi.okwujun.pw/zh/tools/ · verified: Repository bundle has a SHA-256; scripts run on real hardware