|
@@ -807,9 +807,11 @@ Signed-off-by: Toke Høiland-Jørgensen <[email protected]>
|
|
|
ath_draintxq(sc, txq);
|
|
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_txq *txq = txctl->txq;
|
|
|
struct ath_atx_tid *tid = NULL;
|
|
struct ath_atx_tid *tid = NULL;
|
|
|
|
|
++ struct ath_node *an = NULL;
|
|
|
struct ath_buf *bf;
|
|
struct ath_buf *bf;
|
|
|
- bool queue, ps_resp;
|
|
- bool queue, ps_resp;
|
|
|
+ bool ps_resp;
|
|
+ bool ps_resp;
|
|
@@ -824,16 +826,13 @@ Signed-off-by: Toke Høiland-Jørgensen <[email protected]>
|
|
|
ps_resp = !!(info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE);
|
|
ps_resp = !!(info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE);
|
|
|
|
|
|
|
|
ret = ath_tx_prepare(hw, skb, txctl);
|
|
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);
|
|
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] &&
|
|
- if (++txq->pending_frames > sc->tx.txq_max_pending[q] &&
|
|
|
- !txq->stopped) {
|
|
- !txq->stopped) {
|
|
|
- if (ath9k_is_chanctx_enabled())
|
|
- if (ath9k_is_chanctx_enabled())
|
|
@@ -869,14 +868,15 @@ Signed-off-by: Toke Høiland-Jørgensen <[email protected]>
|
|
|
-
|
|
-
|
|
|
- if (ps_resp) {
|
|
- if (ps_resp) {
|
|
|
- ath_txq_unlock(sc, txq);
|
|
- ath_txq_unlock(sc, txq);
|
|
|
-- txq = sc->tx.uapsdq;
|
|
|
|
|
|
|
++ if (ps_resp)
|
|
|
|
|
+ txq = sc->tx.uapsdq;
|
|
|
- ath_txq_lock(sc, txq);
|
|
- ath_txq_lock(sc, txq);
|
|
|
- } else if (txctl->an && queue) {
|
|
- } else if (txctl->an && queue) {
|
|
|
- WARN_ON(tid->txq != txctl->txq);
|
|
- WARN_ON(tid->txq != txctl->txq);
|
|
|
-
|
|
-
|
|
|
- if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT)
|
|
- if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT)
|
|
|
- tid->clear_ps_filter = true;
|
|
- tid->clear_ps_filter = true;
|
|
|
--
|
|
|
|
|
|
|
+
|
|
|
- /*
|
|
- /*
|
|
|
- * Add this frame to software queue for scheduling later
|
|
- * Add this frame to software queue for scheduling later
|
|
|
- * for aggregation.
|
|
- * for aggregation.
|
|
@@ -885,14 +885,21 @@ Signed-off-by: Toke Høiland-Jørgensen <[email protected]>
|
|
|
- __skb_queue_tail(&tid->buf_q, skb);
|
|
- __skb_queue_tail(&tid->buf_q, skb);
|
|
|
- if (!txctl->an->sleeping)
|
|
- if (!txctl->an->sleeping)
|
|
|
- ath_tx_queue_tid(sc, txq, tid);
|
|
- 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);
|
|
- ath_txq_schedule(sc, txq);
|
|
|
- goto out;
|
|
- goto out;
|
|
|
|
|
++ ath_txq_lock(sc, txq);
|
|
|
|
|
++ if (txq == sc->tx.txq_map[q]) {
|
|
|
|
|
++ fi->txq = q;
|
|
|
+ ++txq->pending_frames;
|
|
+ ++txq->pending_frames;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bf = ath_tx_setup_buffer(sc, txq, tid, skb);
|
|
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;
|
|
struct ath_atx_tid *tid;
|
|
|
int tidno, acno;
|
|
int tidno, acno;
|
|
|
|
|
|
|
@@ -904,7 +911,7 @@ Signed-off-by: Toke Høiland-Jørgensen <[email protected]>
|
|
|
tid->an = an;
|
|
tid->an = an;
|
|
|
tid->tidno = tidno;
|
|
tid->tidno = tidno;
|
|
|
tid->seq_start = tid->seq_next = 0;
|
|
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->baw_head = tid->baw_tail = 0;
|
|
|
tid->active = false;
|
|
tid->active = false;
|
|
|
tid->clear_ps_filter = true;
|
|
tid->clear_ps_filter = true;
|
|
@@ -920,7 +927,7 @@ Signed-off-by: Toke Høiland-Jørgensen <[email protected]>
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-@@ -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;
|
|
struct ath_txq *txq;
|
|
|
int tidno;
|
|
int tidno;
|
|
|
|
|
|
|
@@ -932,7 +939,7 @@ Signed-off-by: Toke Høiland-Jørgensen <[email protected]>
|
|
|
txq = tid->txq;
|
|
txq = tid->txq;
|
|
|
|
|
|
|
|
ath_txq_lock(sc, 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;
|
|
tid->active = false;
|
|
|
|
|
|
|
|
ath_txq_unlock(sc, txq);
|
|
ath_txq_unlock(sc, txq);
|