LinuxKPI: 802.11: deal with stopped queues

Following 5a9a0d7803 initialize the
queue values explicitly and deal with a stopped queue in
ieee80211_tx_dequeue().

Sponsored by:	The FreeBSD Foundation
MFC after:	3 days
This commit is contained in:
Bjoern A. Zeeb 2023-02-07 20:18:08 +00:00
parent 27202b98dc
commit 0cbcfa1964

View File

@ -244,9 +244,11 @@ lkpi_lsta_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN],
ltxq->txq.ac = tid_to_mac80211_ac[tid & 7];
}
ltxq->seen_dequeue = false;
ltxq->stopped = false;
ltxq->txq.vif = vif;
ltxq->txq.tid = tid;
ltxq->txq.sta = sta;
TAILQ_ELEM_INIT(ltxq, txq_entry);
skb_queue_head_init(&ltxq->skbq);
sta->txq[tid] = &ltxq->txq;
}
@ -2276,6 +2278,9 @@ lkpi_ic_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ],
vif->hw_queue[i] = i;
else
vif->hw_queue[i] = 0;
/* Initialize the queue to running. Stopped? */
lvif->hw_queue_stopped[i] = false;
}
vif->cab_queue = IEEE80211_INVAL_HW_QUEUE;
@ -4268,13 +4273,25 @@ linuxkpi_ieee80211_tx_dequeue(struct ieee80211_hw *hw,
struct ieee80211_txq *txq)
{
struct lkpi_txq *ltxq;
struct lkpi_vif *lvif;
struct sk_buff *skb;
skb = NULL;
ltxq = TXQ_TO_LTXQ(txq);
ltxq->seen_dequeue = true;
if (ltxq->stopped)
goto stopped;
lvif = VIF_TO_LVIF(ltxq->txq.vif);
if (lvif->hw_queue_stopped[ltxq->txq.ac]) {
ltxq->stopped = true;
goto stopped;
}
skb = skb_dequeue(&ltxq->skbq);
stopped:
return (skb);
}