diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/xmit.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 30 |
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, | |||
| 1055 | int ath_cabq_update(struct ath_softc *sc) | 1055 | int 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 | } |
