summaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/510-ath9k_fix_ampdu_retry_count.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/510-ath9k_fix_ampdu_retry_count.patch')
-rw-r--r--package/mac80211/patches/510-ath9k_fix_ampdu_retry_count.patch62
1 files changed, 62 insertions, 0 deletions
diff --git a/package/mac80211/patches/510-ath9k_fix_ampdu_retry_count.patch b/package/mac80211/patches/510-ath9k_fix_ampdu_retry_count.patch
new file mode 100644
index 000000000..8e6e6d0ad
--- /dev/null
+++ b/package/mac80211/patches/510-ath9k_fix_ampdu_retry_count.patch
@@ -0,0 +1,62 @@
+--- a/drivers/net/wireless/ath/ath9k/xmit.c
++++ b/drivers/net/wireless/ath/ath9k/xmit.c
+@@ -328,6 +328,7 @@ static void ath_tx_complete_aggr(struct
+ u32 ba[WME_BA_BMP_SIZE >> 5];
+ int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0;
+ bool rc_update = true;
++ struct ieee80211_tx_rate rates[4];
+
+ skb = bf->bf_mpdu;
+ hdr = (struct ieee80211_hdr *)skb->data;
+@@ -335,6 +336,8 @@ static void ath_tx_complete_aggr(struct
+ tx_info = IEEE80211_SKB_CB(skb);
+ hw = bf->aphy->hw;
+
++ memcpy(rates, tx_info->control.rates, sizeof(rates));
++
+ rcu_read_lock();
+
+ /* XXX: use ieee80211_find_sta! */
+@@ -375,6 +378,9 @@ static void ath_tx_complete_aggr(struct
+ txfail = txpending = 0;
+ bf_next = bf->bf_next;
+
++ skb = bf->bf_mpdu;
++ tx_info = IEEE80211_SKB_CB(skb);
++
+ if (ATH_BA_ISSET(ba, ATH_BA_INDEX(seq_st, bf->bf_seqno))) {
+ /* transmit completion, subframe is
+ * acked by block ack */
+@@ -428,6 +434,7 @@ static void ath_tx_complete_aggr(struct
+ spin_unlock_bh(&txq->axq_lock);
+
+ if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) {
++ memcpy(tx_info->control.rates, rates, sizeof(rates));
+ ath_tx_rc_status(bf, ts, nbad, txok, true);
+ rc_update = false;
+ } else {
+@@ -2014,7 +2021,7 @@ static void ath_tx_rc_status(struct ath_
+ tx_info->status.rates[i].idx = -1;
+ }
+
+- tx_info->status.rates[tx_rateindex].count = bf->bf_retries + 1;
++ tx_info->status.rates[tx_rateindex].count = ts->ts_longretry + 1;
+ }
+
+ static void ath_wake_mac80211_queue(struct ath_softc *sc, struct ath_txq *txq)
+@@ -2125,7 +2132,6 @@ static void ath_tx_processq(struct ath_s
+ * This frame is sent out as a single frame.
+ * Use hardware retry status for this frame.
+ */
+- bf->bf_retries = ts.ts_longretry;
+ if (ts.ts_status & ATH9K_TXERR_XRETRY)
+ bf->bf_state.bf_type |= BUF_XRETRY;
+ ath_tx_rc_status(bf, &ts, 0, txok, true);
+@@ -2255,7 +2261,6 @@ void ath_tx_edma_tasklet(struct ath_soft
+ }
+
+ if (!bf_isampdu(bf)) {
+- bf->bf_retries = txs.ts_longretry;
+ if (txs.ts_status & ATH9K_TXERR_XRETRY)
+ bf->bf_state.bf_type |= BUF_XRETRY;
+ ath_tx_rc_status(bf, &txs, 0, txok, true);