wifi: mt76: mt76x02: clear the wcid drop mask for all powersave responses

Only frames that the driver has buffered in an ieee80211_txq are released
through mt76_release_buffered_frames() and end up on the PSD queue. Frames
that mac80211 buffered itself are handed back through the regular tx path
and go out on the access category queue of the frame. Clearing the drop
mask for MT_TXQ_PSD alone therefore misses them, and the hardware keeps
discarding PS-Poll and U-APSD responses for a station that is still marked
as sleeping. The client polls again on the next TIM and never receives
anything, so its traffic stalls until it leaves powersave.

Key off the tx info flags instead, the same way mt7603_tx_prepare_skb()
does. This covers both release paths and any other frame that mac80211
marks as exempt from powersave buffering.

Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
Felix Fietkau
2026-08-01 21:15:26 +02:00
parent 3ad249ed8d
commit 05fc7fb18f
+6 -2
View File
@@ -141,11 +141,15 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
{
struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76);
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx_info->skb->data;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb);
struct mt76x02_txwi *txwi = txwi_ptr;
bool ampdu = IEEE80211_SKB_CB(tx_info->skb)->flags & IEEE80211_TX_CTL_AMPDU;
bool ampdu = info->flags & IEEE80211_TX_CTL_AMPDU;
int hdrlen, len, pid, qsel = MT_QSEL_EDCA;
if (qid == MT_TXQ_PSD && wcid && wcid->idx < 128)
if (wcid && wcid->idx < MT76x02_N_WCIDS &&
((info->flags & (IEEE80211_TX_CTL_NO_PS_BUFFER |
IEEE80211_TX_CTL_CLEAR_PS_FILT)) ||
(info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE)))
mt76x02_mac_wcid_set_drop(dev, wcid->idx, false);
hdrlen = ieee80211_hdrlen(hdr->frame_control);