Skip to content

Commit 7e39a00

Browse files
AviSternlucacoelho
authored andcommitted
iwlwifi: mvm: start mac queues when deferred tx frames are purged
In AP mode, if a station is removed just as it is adding a new stream, the queue in question will remain stopped and no more TX will happen in this queue, leading to connection failures and other problems. This is because under DQA, when tx is deferred because a queue needs to be allocated, the mac queue for that TID is stopped until the new stream is added. If at this point the station that this stream belongs to is removed, all the deferred tx frames are purged, but the mac queue is not restarted. As a result, all following tx on this queue will not be transmitted. Fix this by starting the relevant mac queues when the deferred tx frames are purged. Fixes: 24afba7 ("iwlwifi: mvm: support bss dynamic alloc/dealloc of queues") Signed-off-by: Avraham Stern <[email protected]> Signed-off-by: Luca Coelho <[email protected]>
1 parent aae9d56 commit 7e39a00

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2597,8 +2597,18 @@ static void iwl_mvm_purge_deferred_tx_frames(struct iwl_mvm *mvm,
25972597
spin_lock_bh(&mvm_sta->lock);
25982598
for (i = 0; i <= IWL_MAX_TID_COUNT; i++) {
25992599
tid_data = &mvm_sta->tid_data[i];
2600-
while ((skb = __skb_dequeue(&tid_data->deferred_tx_frames)))
2600+
2601+
while ((skb = __skb_dequeue(&tid_data->deferred_tx_frames))) {
2602+
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2603+
2604+
/*
2605+
* The first deferred frame should've stopped the MAC
2606+
* queues, so we should never get a second deferred
2607+
* frame for the RA/TID.
2608+
*/
2609+
iwl_mvm_start_mac_queues(mvm, info->hw_queue);
26012610
ieee80211_free_txskb(mvm->hw, skb);
2611+
}
26022612
}
26032613
spin_unlock_bh(&mvm_sta->lock);
26042614
}

0 commit comments

Comments
 (0)