[PATCH v2 1/2] wifi: ath9k: clear destination mask for non-aggregate frames

From: Tomas Tonhauser

Date: Wed Oct 28 2026 - 13:20:36 EST


Frames to stations without an A-MPDU session (e.g. non-WMM/non-HT
clients) use the non-aggregate path. The hardware may complete such
frames with ATH9K_TXERR_FILT while the station is awake. They are
then reported to mac80211 as IEEE80211_TX_STAT_TX_FILTERED, and
ieee80211_handle_filtered_frame() retries them only once for a
station that is not in powersave.

The aggregate path re-queues filtered subframes on tid->retry_q and
sets tid->clear_ps_filter, so they are retransmitted until they get
through.

The result is downlink loss to awake non-WMM stations, while WMM/HT
stations on the same radio are unaffected. On a QCA9563 AP with
ESP8266 clients this caused 20-40% ping loss.

Set CLRDMASK on every non-aggregate frame. This restores the
behaviour from before commit 5519541d5a5f ("ath9k: fix powersave
frame filtering/buffering in AP mode") for the non-aggregate path
only. The trade-off is that non-aggregate frames already queued in
hardware when a station enters powersave may be sent to the sleeping
station instead of being filtered.

Assisted-by: LLM
Signed-off-by: Tomas Tonhauser <t.tonhauser@xxxxxxxx>
---

Notes:
v2: code unchanged, commit message updated

drivers/net/wireless/ath/ath9k/xmit.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 3413bb4906d4..913aa280ae2a 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -1432,7 +1432,7 @@ static void ath_tx_fill_desc(struct ath_softc *sc, struct ath_buf *bf,
if (!sc->tx99_state)
info.flags = ATH9K_TXDESC_INTREQ;
if ((tx_info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT) ||
- txq == sc->tx.uapsdq)
+ txq == sc->tx.uapsdq || !aggr)
info.flags |= ATH9K_TXDESC_CLRDMASK;

if (tx_info->flags & IEEE80211_TX_CTL_NO_ACK)
--
2.34.1