aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/xmit.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/xmit.c')
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 9f4e755d27ce..e16136d61799 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -1055,6 +1055,7 @@ int ath_txq_update(struct ath_softc *sc, int qnum,
1055int ath_cabq_update(struct ath_softc *sc) 1055int ath_cabq_update(struct ath_softc *sc)
1056{ 1056{
1057 struct ath9k_tx_queue_info qi; 1057 struct ath9k_tx_queue_info qi;
1058 struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;
1058 int qnum = sc->beacon.cabq->axq_qnum; 1059 int qnum = sc->beacon.cabq->axq_qnum;
1059 1060
1060 ath9k_hw_get_txq_props(sc->sc_ah, qnum, &qi); 1061 ath9k_hw_get_txq_props(sc->sc_ah, qnum, &qi);
@@ -1066,7 +1067,7 @@ int ath_cabq_update(struct ath_softc *sc)
1066 else if (sc->config.cabqReadytime > ATH9K_READY_TIME_HI_BOUND) 1067 else if (sc->config.cabqReadytime > ATH9K_READY_TIME_HI_BOUND)
1067 sc->config.cabqReadytime = ATH9K_READY_TIME_HI_BOUND; 1068 sc->config.cabqReadytime = ATH9K_READY_TIME_HI_BOUND;
1068 1069
1069 qi.tqi_readyTime = (sc->beacon_interval * 1070 qi.tqi_readyTime = (cur_conf->beacon_interval *
1070 sc->config.cabqReadytime) / 100; 1071 sc->config.cabqReadytime) / 100;
1071 ath_txq_update(sc, qnum, &qi); 1072 ath_txq_update(sc, qnum, &qi);
1072 1073
@@ -2013,7 +2014,8 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
2013 spin_lock_bh(&txq->axq_lock); 2014 spin_lock_bh(&txq->axq_lock);
2014 if (list_empty(&txq->axq_q)) { 2015 if (list_empty(&txq->axq_q)) {
2015 txq->axq_link = NULL; 2016 txq->axq_link = NULL;
2016 if (sc->sc_flags & SC_OP_TXAGGR) 2017 if (sc->sc_flags & SC_OP_TXAGGR &&
2018 !txq->txq_flush_inprogress)
2017 ath_txq_schedule(sc, txq); 2019 ath_txq_schedule(sc, txq);
2018 spin_unlock_bh(&txq->axq_lock); 2020 spin_unlock_bh(&txq->axq_lock);
2019 break; 2021 break;
@@ -2070,6 +2072,7 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
2070 2072
2071 if (bf_is_ampdu_not_probing(bf)) 2073 if (bf_is_ampdu_not_probing(bf))
2072 txq->axq_ampdu_depth--; 2074 txq->axq_ampdu_depth--;
2075
2073 spin_unlock_bh(&txq->axq_lock); 2076 spin_unlock_bh(&txq->axq_lock);
2074 2077
2075 if (bf_held) 2078 if (bf_held)
@@ -2093,7 +2096,7 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
2093 2096
2094 spin_lock_bh(&txq->axq_lock); 2097 spin_lock_bh(&txq->axq_lock);
2095 2098
2096 if (sc->sc_flags & SC_OP_TXAGGR) 2099 if (sc->sc_flags & SC_OP_TXAGGR && !txq->txq_flush_inprogress)
2097 ath_txq_schedule(sc, txq); 2100 ath_txq_schedule(sc, txq);
2098 spin_unlock_bh(&txq->axq_lock); 2101 spin_unlock_bh(&txq->axq_lock);
2099 } 2102 }
@@ -2264,15 +2267,18 @@ void ath_tx_edma_tasklet(struct ath_softc *sc)
2264 2267
2265 spin_lock_bh(&txq->axq_lock); 2268 spin_lock_bh(&txq->axq_lock);
2266 2269
2267 if (!list_empty(&txq->txq_fifo_pending)) { 2270 if (!txq->txq_flush_inprogress) {
2268 INIT_LIST_HEAD(&bf_head); 2271 if (!list_empty(&txq->txq_fifo_pending)) {
2269 bf = list_first_entry(&txq->txq_fifo_pending, 2272 INIT_LIST_HEAD(&bf_head);
2270 struct ath_buf, list); 2273 bf = list_first_entry(&txq->txq_fifo_pending,
2271 list_cut_position(&bf_head, &txq->txq_fifo_pending, 2274 struct ath_buf, list);
2272 &bf->bf_lastbf->list); 2275 list_cut_position(&bf_head,
2273 ath_tx_txqaddbuf(sc, txq, &bf_head); 2276 &txq->txq_fifo_pending,
2274 } else if (sc->sc_flags & SC_OP_TXAGGR) 2277 &bf->bf_lastbf->list);
2275 ath_txq_schedule(sc, txq); 2278 ath_tx_txqaddbuf(sc, txq, &bf_head);
2279 } else if (sc->sc_flags & SC_OP_TXAGGR)
2280 ath_txq_schedule(sc, txq);
2281 }
2276 spin_unlock_bh(&txq->axq_lock); 2282 spin_unlock_bh(&txq->axq_lock);
2277 } 2283 }
2278} 2284}