diff options
Diffstat (limited to 'package/kernel/mac80211/patches/561-ath9k_split_tid_queue.patch')
-rw-r--r-- | package/kernel/mac80211/patches/561-ath9k_split_tid_queue.patch | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/561-ath9k_split_tid_queue.patch b/package/kernel/mac80211/patches/561-ath9k_split_tid_queue.patch new file mode 100644 index 0000000000..c10e0f1231 --- /dev/null +++ b/package/kernel/mac80211/patches/561-ath9k_split_tid_queue.patch @@ -0,0 +1,62 @@ +--- a/drivers/net/wireless/ath/ath9k/ath9k.h ++++ b/drivers/net/wireless/ath/ath9k/ath9k.h +@@ -241,6 +241,7 @@ struct ath_buf { + struct ath_atx_tid { + struct list_head list; + struct sk_buff_head buf_q; ++ struct sk_buff_head retry_q; + struct ath_node *an; + struct ath_atx_ac *ac; + unsigned long tx_buf[BITS_TO_LONGS(ATH_TID_MAX_BUFS)]; +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -170,12 +170,18 @@ static void ath_txq_skb_done(struct ath_ + + static bool ath_tid_has_buffered(struct ath_atx_tid *tid) + { +- return !skb_queue_empty(&tid->buf_q); ++ return !skb_queue_empty(&tid->buf_q) || !skb_queue_empty(&tid->retry_q); + } + + static struct sk_buff *ath_tid_dequeue(struct ath_atx_tid *tid) + { +- return __skb_dequeue(&tid->buf_q); ++ struct sk_buff *skb; ++ ++ skb = __skb_dequeue(&tid->retry_q); ++ if (!skb) ++ skb = __skb_dequeue(&tid->buf_q); ++ ++ return skb; + } + + static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) +@@ -593,7 +599,7 @@ static void ath_tx_complete_aggr(struct + if (an->sleeping) + ieee80211_sta_set_buffered(sta, tid->tidno, true); + +- skb_queue_splice(&bf_pending, &tid->buf_q); ++ skb_queue_splice_tail(&bf_pending, &tid->retry_q); + if (!an->sleeping) { + ath_tx_queue_tid(txq, tid); + +@@ -833,7 +839,10 @@ ath_tx_get_tid_subframe(struct ath_softc + u16 seqno; + + while (1) { +- *q = &tid->buf_q; ++ *q = &tid->retry_q; ++ if (skb_queue_empty(*q)) ++ *q = &tid->buf_q; ++ + skb = skb_peek(*q); + if (!skb) + break; +@@ -2608,6 +2617,7 @@ void ath_tx_node_init(struct ath_softc * + tid->paused = false; + tid->active = false; + __skb_queue_head_init(&tid->buf_q); ++ __skb_queue_head_init(&tid->retry_q); + acno = TID_TO_WME_AC(tidno); + tid->ac = &an->ac[acno]; + } |