[source] ath9k: fix regression in tx queueing patch

LEDE Commits lede-commits at lists.infradead.org
Fri Sep 2 05:44:16 PDT 2016


nbd pushed a commit to source.git, branch master:
https://git.lede-project.org/dbc9ee5b722f3a8a359bdbd20b11c5a0239cb0b3

commit dbc9ee5b722f3a8a359bdbd20b11c5a0239cb0b3
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Fri Sep 2 12:10:51 2016 +0200

    ath9k: fix regression in tx queueing patch
    
    power save response frames can go through the old tx path, and the tid
    needs to be set for sequence numbers to be assigned correctly.
    
    Signed-off-by: Felix Fietkau <nbd at nbd.name>
---
 ...h-to-using-mac80211-intermediate-software.patch | 37 +++++++++++++---------
 1 file changed, 22 insertions(+), 15 deletions(-)

diff --git a/package/kernel/mac80211/patches/337-ath9k-Switch-to-using-mac80211-intermediate-software.patch b/package/kernel/mac80211/patches/337-ath9k-Switch-to-using-mac80211-intermediate-software.patch
index 6b1d016..adfd6df 100644
--- a/package/kernel/mac80211/patches/337-ath9k-Switch-to-using-mac80211-intermediate-software.patch
+++ b/package/kernel/mac80211/patches/337-ath9k-Switch-to-using-mac80211-intermediate-software.patch
@@ -807,9 +807,11 @@ Signed-off-by: Toke Høiland-Jørgensen <toke at toke.dk>
  		ath_draintxq(sc, txq);
  	}
  
-@@ -2335,15 +2307,12 @@ int ath_tx_start(struct ieee80211_hw *hw
+@@ -2334,16 +2306,14 @@ int ath_tx_start(struct ieee80211_hw *hw
+ 	struct ath_softc *sc = hw->priv;
  	struct ath_txq *txq = txctl->txq;
  	struct ath_atx_tid *tid = NULL;
++	struct ath_node *an = NULL;
  	struct ath_buf *bf;
 -	bool queue, ps_resp;
 +	bool ps_resp;
@@ -824,16 +826,13 @@ Signed-off-by: Toke Høiland-Jørgensen <toke at toke.dk>
  	ps_resp = !!(info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE);
  
  	ret = ath_tx_prepare(hw, skb, txctl);
-@@ -2358,63 +2327,13 @@ int ath_tx_start(struct ieee80211_hw *hw
+@@ -2358,63 +2328,18 @@ int ath_tx_start(struct ieee80211_hw *hw
  
  	q = skb_get_queue_mapping(skb);
  
-+	if (ps_resp)
-+		txq = sc->tx.uapsdq;
-+
- 	ath_txq_lock(sc, txq);
- 	if (txq == sc->tx.txq_map[q]) {
- 		fi->txq = q;
+-	ath_txq_lock(sc, txq);
+-	if (txq == sc->tx.txq_map[q]) {
+-		fi->txq = q;
 -		if (++txq->pending_frames > sc->tx.txq_max_pending[q] &&
 -		    !txq->stopped) {
 -			if (ath9k_is_chanctx_enabled())
@@ -869,14 +868,15 @@ Signed-off-by: Toke Høiland-Jørgensen <toke at toke.dk>
 -
 -	if (ps_resp) {
 -		ath_txq_unlock(sc, txq);
--		txq = sc->tx.uapsdq;
++	if (ps_resp)
+ 		txq = sc->tx.uapsdq;
 -		ath_txq_lock(sc, txq);
 -	} else if (txctl->an && queue) {
 -		WARN_ON(tid->txq != txctl->txq);
 -
 -		if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT)
 -			tid->clear_ps_filter = true;
--
+ 
 -		/*
 -		 * Add this frame to software queue for scheduling later
 -		 * for aggregation.
@@ -885,14 +885,21 @@ Signed-off-by: Toke Høiland-Jørgensen <toke at toke.dk>
 -		__skb_queue_tail(&tid->buf_q, skb);
 -		if (!txctl->an->sleeping)
 -			ath_tx_queue_tid(sc, txq, tid);
--
++	if (txctl->sta) {
++		an = (struct ath_node *) sta->drv_priv;
++		tid = ath_get_skb_tid(sc, an, skb);
++	}
+ 
 -		ath_txq_schedule(sc, txq);
 -		goto out;
++	ath_txq_lock(sc, txq);
++	if (txq == sc->tx.txq_map[q]) {
++		fi->txq = q;
 +		++txq->pending_frames;
  	}
  
  	bf = ath_tx_setup_buffer(sc, txq, tid, skb);
-@@ -2907,9 +2826,8 @@ void ath_tx_node_init(struct ath_softc *
+@@ -2907,9 +2832,8 @@ void ath_tx_node_init(struct ath_softc *
  	struct ath_atx_tid *tid;
  	int tidno, acno;
  
@@ -904,7 +911,7 @@ Signed-off-by: Toke Høiland-Jørgensen <toke at toke.dk>
  		tid->an        = an;
  		tid->tidno     = tidno;
  		tid->seq_start = tid->seq_next = 0;
-@@ -2917,11 +2835,14 @@ void ath_tx_node_init(struct ath_softc *
+@@ -2917,11 +2841,14 @@ void ath_tx_node_init(struct ath_softc *
  		tid->baw_head  = tid->baw_tail = 0;
  		tid->active	   = false;
  		tid->clear_ps_filter = true;
@@ -920,7 +927,7 @@ Signed-off-by: Toke Høiland-Jørgensen <toke at toke.dk>
  	}
  }
  
-@@ -2931,9 +2852,8 @@ void ath_tx_node_cleanup(struct ath_soft
+@@ -2931,9 +2858,8 @@ void ath_tx_node_cleanup(struct ath_soft
  	struct ath_txq *txq;
  	int tidno;
  
@@ -932,7 +939,7 @@ Signed-off-by: Toke Høiland-Jørgensen <toke at toke.dk>
  		txq = tid->txq;
  
  		ath_txq_lock(sc, txq);
-@@ -2945,6 +2865,9 @@ void ath_tx_node_cleanup(struct ath_soft
+@@ -2945,6 +2871,9 @@ void ath_tx_node_cleanup(struct ath_soft
  		tid->active = false;
  
  		ath_txq_unlock(sc, txq);



More information about the lede-commits mailing list