aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index aa447770eb2b..9a11099dd86a 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -317,6 +317,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
317 int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0; 317 int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0;
318 bool rc_update = true; 318 bool rc_update = true;
319 struct ieee80211_tx_rate rates[4]; 319 struct ieee80211_tx_rate rates[4];
320 int nframes;
320 321
321 skb = bf->bf_mpdu; 322 skb = bf->bf_mpdu;
322 hdr = (struct ieee80211_hdr *)skb->data; 323 hdr = (struct ieee80211_hdr *)skb->data;
@@ -325,6 +326,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
325 hw = bf->aphy->hw; 326 hw = bf->aphy->hw;
326 327
327 memcpy(rates, tx_info->control.rates, sizeof(rates)); 328 memcpy(rates, tx_info->control.rates, sizeof(rates));
329 nframes = bf->bf_nframes;
328 330
329 rcu_read_lock(); 331 rcu_read_lock();
330 332
@@ -341,7 +343,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
341 !bf->bf_stale || bf_next != NULL) 343 !bf->bf_stale || bf_next != NULL)
342 list_move_tail(&bf->list, &bf_head); 344 list_move_tail(&bf->list, &bf_head);
343 345
344 ath_tx_rc_status(bf, ts, 0, 0, false); 346 ath_tx_rc_status(bf, ts, 1, 0, false);
345 ath_tx_complete_buf(sc, bf, txq, &bf_head, ts, 347 ath_tx_complete_buf(sc, bf, txq, &bf_head, ts,
346 0, 0); 348 0, 0);
347 349
@@ -446,6 +448,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
446 448
447 if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) { 449 if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) {
448 memcpy(tx_info->control.rates, rates, sizeof(rates)); 450 memcpy(tx_info->control.rates, rates, sizeof(rates));
451 bf->bf_nframes = nframes;
449 ath_tx_rc_status(bf, ts, nbad, txok, true); 452 ath_tx_rc_status(bf, ts, nbad, txok, true);
450 rc_update = false; 453 rc_update = false;
451 } else { 454 } else {
@@ -1979,9 +1982,15 @@ static void ath_tx_rc_status(struct ath_buf *bf, struct ath_tx_status *ts,
1979 1982
1980 if (ts->ts_status & ATH9K_TXERR_FILT) 1983 if (ts->ts_status & ATH9K_TXERR_FILT)
1981 tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED; 1984 tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
1982 if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && update_rc) 1985 if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && update_rc) {
1983 tx_info->flags |= IEEE80211_TX_STAT_AMPDU; 1986 tx_info->flags |= IEEE80211_TX_STAT_AMPDU;
1984 1987
1988 BUG_ON(nbad > bf->bf_nframes);
1989
1990 tx_info->status.ampdu_len = bf->bf_nframes;
1991 tx_info->status.ampdu_ack_len = bf->bf_nframes - nbad;
1992 }
1993
1985 if ((ts->ts_status & ATH9K_TXERR_FILT) == 0 && 1994 if ((ts->ts_status & ATH9K_TXERR_FILT) == 0 &&
1986 (bf->bf_flags & ATH9K_TXDESC_NOACK) == 0 && update_rc) { 1995 (bf->bf_flags & ATH9K_TXDESC_NOACK) == 0 && update_rc) {
1987 if (ieee80211_is_data(hdr->frame_control)) { 1996 if (ieee80211_is_data(hdr->frame_control)) {
@@ -1991,8 +2000,6 @@ static void ath_tx_rc_status(struct ath_buf *bf, struct ath_tx_status *ts,
1991 if ((ts->ts_status & ATH9K_TXERR_XRETRY) || 2000 if ((ts->ts_status & ATH9K_TXERR_XRETRY) ||
1992 (ts->ts_status & ATH9K_TXERR_FIFO)) 2001 (ts->ts_status & ATH9K_TXERR_FIFO))
1993 tx_info->pad[0] |= ATH_TX_INFO_XRETRY; 2002 tx_info->pad[0] |= ATH_TX_INFO_XRETRY;
1994 tx_info->status.ampdu_len = bf->bf_nframes;
1995 tx_info->status.ampdu_ack_len = bf->bf_nframes - nbad;
1996 } 2003 }
1997 } 2004 }
1998 2005
@@ -2102,7 +2109,7 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)
2102 */ 2109 */
2103 if (ts.ts_status & ATH9K_TXERR_XRETRY) 2110 if (ts.ts_status & ATH9K_TXERR_XRETRY)
2104 bf->bf_state.bf_type |= BUF_XRETRY; 2111 bf->bf_state.bf_type |= BUF_XRETRY;
2105 ath_tx_rc_status(bf, &ts, 0, txok, true); 2112 ath_tx_rc_status(bf, &ts, txok ? 0 : 1, txok, true);
2106 } 2113 }
2107 2114
2108 if (bf_isampdu(bf)) 2115 if (bf_isampdu(bf))
@@ -2220,7 +2227,7 @@ void ath_tx_edma_tasklet(struct ath_softc *sc)
2220 if (!bf_isampdu(bf)) { 2227 if (!bf_isampdu(bf)) {
2221 if (txs.ts_status & ATH9K_TXERR_XRETRY) 2228 if (txs.ts_status & ATH9K_TXERR_XRETRY)
2222 bf->bf_state.bf_type |= BUF_XRETRY; 2229 bf->bf_state.bf_type |= BUF_XRETRY;
2223 ath_tx_rc_status(bf, &txs, 0, txok, true); 2230 ath_tx_rc_status(bf, &txs, txok ? 0 : 1, txok, true);
2224 } 2231 }
2225 2232
2226 if (bf_isampdu(bf)) 2233 if (bf_isampdu(bf))