mirror of
https://github.com/outbackdingo/mt76.git
synced 2026-10-24 13:26:48 +00:00
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:
+6
-2
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user