|
@@ -58,7 +58,7 @@ static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq,
|
|
struct list_head *head, bool internal);
|
|
struct list_head *head, bool internal);
|
|
static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf,
|
|
static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf,
|
|
struct ath_tx_status *ts, int nframes, int nbad,
|
|
struct ath_tx_status *ts, int nframes, int nbad,
|
|
- int txok, bool update_rc);
|
|
|
|
|
|
+ int txok);
|
|
static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid,
|
|
static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid,
|
|
int seqno);
|
|
int seqno);
|
|
static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc,
|
|
static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc,
|
|
@@ -392,7 +392,6 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
|
if (!bf->bf_stale || bf_next != NULL)
|
|
if (!bf->bf_stale || bf_next != NULL)
|
|
list_move_tail(&bf->list, &bf_head);
|
|
list_move_tail(&bf->list, &bf_head);
|
|
|
|
|
|
- ath_tx_rc_status(sc, bf, ts, 1, 1, 0, false);
|
|
|
|
ath_tx_complete_buf(sc, bf, txq, &bf_head, ts,
|
|
ath_tx_complete_buf(sc, bf, txq, &bf_head, ts,
|
|
0, 0);
|
|
0, 0);
|
|
|
|
|
|
@@ -494,10 +493,8 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
|
|
|
|
|
if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) {
|
|
if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) {
|
|
memcpy(tx_info->control.rates, rates, sizeof(rates));
|
|
memcpy(tx_info->control.rates, rates, sizeof(rates));
|
|
- ath_tx_rc_status(sc, bf, ts, nframes, nbad, txok, true);
|
|
|
|
|
|
+ ath_tx_rc_status(sc, bf, ts, nframes, nbad, txok);
|
|
rc_update = false;
|
|
rc_update = false;
|
|
- } else {
|
|
|
|
- ath_tx_rc_status(sc, bf, ts, nframes, nbad, txok, false);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
ath_tx_complete_buf(sc, bf, txq, &bf_head, ts,
|
|
ath_tx_complete_buf(sc, bf, txq, &bf_head, ts,
|
|
@@ -519,8 +516,6 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
|
ath_tx_update_baw(sc, tid, seqno);
|
|
ath_tx_update_baw(sc, tid, seqno);
|
|
spin_unlock_bh(&txq->axq_lock);
|
|
spin_unlock_bh(&txq->axq_lock);
|
|
|
|
|
|
- ath_tx_rc_status(sc, bf, ts, nframes,
|
|
|
|
- nbad, 0, false);
|
|
|
|
ath_tx_complete_buf(sc, bf, txq,
|
|
ath_tx_complete_buf(sc, bf, txq,
|
|
&bf_head,
|
|
&bf_head,
|
|
ts, 0, 1);
|
|
ts, 0, 1);
|
|
@@ -1983,6 +1978,7 @@ static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
|
|
struct ath_tx_status *ts, int txok, int sendbar)
|
|
struct ath_tx_status *ts, int txok, int sendbar)
|
|
{
|
|
{
|
|
struct sk_buff *skb = bf->bf_mpdu;
|
|
struct sk_buff *skb = bf->bf_mpdu;
|
|
|
|
+ struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
int tx_flags = 0;
|
|
int tx_flags = 0;
|
|
|
|
|
|
@@ -1992,6 +1988,9 @@ static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
|
|
if (!txok)
|
|
if (!txok)
|
|
tx_flags |= ATH_TX_ERROR;
|
|
tx_flags |= ATH_TX_ERROR;
|
|
|
|
|
|
|
|
+ if (ts->ts_status & ATH9K_TXERR_FILT)
|
|
|
|
+ tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
|
|
|
|
+
|
|
dma_unmap_single(sc->dev, bf->bf_buf_addr, skb->len, DMA_TO_DEVICE);
|
|
dma_unmap_single(sc->dev, bf->bf_buf_addr, skb->len, DMA_TO_DEVICE);
|
|
bf->bf_buf_addr = 0;
|
|
bf->bf_buf_addr = 0;
|
|
|
|
|
|
@@ -2021,7 +2020,7 @@ static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
|
|
|
|
|
|
static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf,
|
|
static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf,
|
|
struct ath_tx_status *ts, int nframes, int nbad,
|
|
struct ath_tx_status *ts, int nframes, int nbad,
|
|
- int txok, bool update_rc)
|
|
|
|
|
|
+ int txok)
|
|
{
|
|
{
|
|
struct sk_buff *skb = bf->bf_mpdu;
|
|
struct sk_buff *skb = bf->bf_mpdu;
|
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
|
@@ -2036,9 +2035,7 @@ static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf,
|
|
tx_rateindex = ts->ts_rateindex;
|
|
tx_rateindex = ts->ts_rateindex;
|
|
WARN_ON(tx_rateindex >= hw->max_rates);
|
|
WARN_ON(tx_rateindex >= hw->max_rates);
|
|
|
|
|
|
- if (ts->ts_status & ATH9K_TXERR_FILT)
|
|
|
|
- tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
|
|
|
|
- if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && update_rc) {
|
|
|
|
|
|
+ if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) {
|
|
tx_info->flags |= IEEE80211_TX_STAT_AMPDU;
|
|
tx_info->flags |= IEEE80211_TX_STAT_AMPDU;
|
|
|
|
|
|
BUG_ON(nbad > nframes);
|
|
BUG_ON(nbad > nframes);
|
|
@@ -2048,7 +2045,7 @@ static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf,
|
|
}
|
|
}
|
|
|
|
|
|
if ((ts->ts_status & ATH9K_TXERR_FILT) == 0 &&
|
|
if ((ts->ts_status & ATH9K_TXERR_FILT) == 0 &&
|
|
- (tx_info->flags & IEEE80211_TX_CTL_NO_ACK) == 0 && update_rc) {
|
|
|
|
|
|
+ (tx_info->flags & IEEE80211_TX_CTL_NO_ACK) == 0) {
|
|
/*
|
|
/*
|
|
* If an underrun error is seen assume it as an excessive
|
|
* If an underrun error is seen assume it as an excessive
|
|
* retry only if max frame trigger level has been reached
|
|
* retry only if max frame trigger level has been reached
|
|
@@ -2061,9 +2058,9 @@ static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf,
|
|
* successfully by eventually preferring slower rates.
|
|
* successfully by eventually preferring slower rates.
|
|
* This itself should also alleviate congestion on the bus.
|
|
* This itself should also alleviate congestion on the bus.
|
|
*/
|
|
*/
|
|
- if (ieee80211_is_data(hdr->frame_control) &&
|
|
|
|
- (ts->ts_flags & (ATH9K_TX_DATA_UNDERRUN |
|
|
|
|
- ATH9K_TX_DELIM_UNDERRUN)) &&
|
|
|
|
|
|
+ if (unlikely(ts->ts_flags & (ATH9K_TX_DATA_UNDERRUN |
|
|
|
|
+ ATH9K_TX_DELIM_UNDERRUN)) &&
|
|
|
|
+ ieee80211_is_data(hdr->frame_control) &&
|
|
ah->tx_trig_level >= sc->sc_ah->config.max_txtrig_level)
|
|
ah->tx_trig_level >= sc->sc_ah->config.max_txtrig_level)
|
|
tx_info->status.rates[tx_rateindex].count =
|
|
tx_info->status.rates[tx_rateindex].count =
|
|
hw->max_rate_tries;
|
|
hw->max_rate_tries;
|
|
@@ -2094,7 +2091,7 @@ static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq,
|
|
spin_unlock_bh(&txq->axq_lock);
|
|
spin_unlock_bh(&txq->axq_lock);
|
|
|
|
|
|
if (!bf_isampdu(bf)) {
|
|
if (!bf_isampdu(bf)) {
|
|
- ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok, true);
|
|
|
|
|
|
+ ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok);
|
|
ath_tx_complete_buf(sc, bf, txq, bf_head, ts, txok, 0);
|
|
ath_tx_complete_buf(sc, bf, txq, bf_head, ts, txok, 0);
|
|
} else
|
|
} else
|
|
ath_tx_complete_aggr(sc, txq, bf, bf_head, ts, txok, true);
|
|
ath_tx_complete_aggr(sc, txq, bf, bf_head, ts, txok, true);
|