|
@@ -604,6 +604,37 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
|
|
ath9k_queue_reset(sc, RESET_TYPE_TX_ERROR);
|
|
|
}
|
|
|
|
|
|
+static bool bf_is_ampdu_not_probing(struct ath_buf *bf)
|
|
|
+{
|
|
|
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(bf->bf_mpdu);
|
|
|
+ return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE);
|
|
|
+}
|
|
|
+
|
|
|
+static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq,
|
|
|
+ struct ath_tx_status *ts, struct ath_buf *bf,
|
|
|
+ struct list_head *bf_head)
|
|
|
+{
|
|
|
+ bool txok, flush;
|
|
|
+
|
|
|
+ txok = !(ts->ts_status & ATH9K_TXERR_MASK);
|
|
|
+ flush = !!(ts->ts_status & ATH9K_TX_FLUSH);
|
|
|
+ txq->axq_tx_inprogress = false;
|
|
|
+
|
|
|
+ txq->axq_depth--;
|
|
|
+ if (bf_is_ampdu_not_probing(bf))
|
|
|
+ txq->axq_ampdu_depth--;
|
|
|
+
|
|
|
+ if (!bf_isampdu(bf)) {
|
|
|
+ if (!flush)
|
|
|
+ ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok);
|
|
|
+ ath_tx_complete_buf(sc, bf, txq, bf_head, ts, txok);
|
|
|
+ } else
|
|
|
+ ath_tx_complete_aggr(sc, txq, bf, bf_head, ts, txok);
|
|
|
+
|
|
|
+ if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) && !flush)
|
|
|
+ ath_txq_schedule(sc, txq);
|
|
|
+}
|
|
|
+
|
|
|
static bool ath_lookup_legacy(struct ath_buf *bf)
|
|
|
{
|
|
|
struct sk_buff *skb;
|
|
@@ -1453,12 +1484,6 @@ int ath_cabq_update(struct ath_softc *sc)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static bool bf_is_ampdu_not_probing(struct ath_buf *bf)
|
|
|
-{
|
|
|
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(bf->bf_mpdu);
|
|
|
- return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE);
|
|
|
-}
|
|
|
-
|
|
|
static void ath_drain_txq_list(struct ath_softc *sc, struct ath_txq *txq,
|
|
|
struct list_head *list)
|
|
|
{
|
|
@@ -1482,15 +1507,7 @@ static void ath_drain_txq_list(struct ath_softc *sc, struct ath_txq *txq,
|
|
|
|
|
|
lastbf = bf->bf_lastbf;
|
|
|
list_cut_position(&bf_head, list, &lastbf->list);
|
|
|
-
|
|
|
- txq->axq_depth--;
|
|
|
- if (bf_is_ampdu_not_probing(bf))
|
|
|
- txq->axq_ampdu_depth--;
|
|
|
-
|
|
|
- if (bf_isampdu(bf))
|
|
|
- ath_tx_complete_aggr(sc, txq, bf, &bf_head, &ts, 0);
|
|
|
- else
|
|
|
- ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0);
|
|
|
+ ath_tx_process_buffer(sc, txq, &ts, bf, &bf_head);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2152,28 +2169,6 @@ static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf,
|
|
|
tx_info->status.rates[tx_rateindex].count = ts->ts_longretry + 1;
|
|
|
}
|
|
|
|
|
|
-static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq,
|
|
|
- struct ath_tx_status *ts, struct ath_buf *bf,
|
|
|
- struct list_head *bf_head)
|
|
|
-{
|
|
|
- int txok;
|
|
|
-
|
|
|
- txq->axq_depth--;
|
|
|
- txok = !(ts->ts_status & ATH9K_TXERR_MASK);
|
|
|
- txq->axq_tx_inprogress = false;
|
|
|
- if (bf_is_ampdu_not_probing(bf))
|
|
|
- txq->axq_ampdu_depth--;
|
|
|
-
|
|
|
- if (!bf_isampdu(bf)) {
|
|
|
- ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok);
|
|
|
- ath_tx_complete_buf(sc, bf, txq, bf_head, ts, txok);
|
|
|
- } else
|
|
|
- ath_tx_complete_aggr(sc, txq, bf, bf_head, ts, txok);
|
|
|
-
|
|
|
- if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT)
|
|
|
- ath_txq_schedule(sc, txq);
|
|
|
-}
|
|
|
-
|
|
|
static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
|
|
|
{
|
|
|
struct ath_hw *ah = sc->sc_ah;
|