diff options
author | Felix Fietkau <nbd@openwrt.org> | 2011-12-14 16:08:03 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-12-15 14:46:35 -0500 |
commit | da647626c7aa854755d32dc8e33d3c58314d2fdb (patch) | |
tree | 2033276d08a3b3f121402ec1b597e6bcfe52ce05 /drivers/net/wireless | |
parent | 1478acb392d8564d109c4add9de6a0c6258c4057 (diff) |
ath9k: change maximum software retransmission handling
Instead of limiting a subframe to 10 A-MPDU software transmission attempts,
count hardware retransmissions as well and raise the limit a bit. That way
there will be fewer software retransmission attempts when traffic suffers
from lots of hardware retransmissions.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ath9k.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 15 |
2 files changed, 13 insertions, 4 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index afc156a0a2e3..fa6c9050a8af 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
@@ -542,7 +542,7 @@ struct ath_ant_comb { | |||
542 | #define DEFAULT_CACHELINE 32 | 542 | #define DEFAULT_CACHELINE 32 |
543 | #define ATH_REGCLASSIDS_MAX 10 | 543 | #define ATH_REGCLASSIDS_MAX 10 |
544 | #define ATH_CABQ_READY_TIME 80 /* % of beacon interval */ | 544 | #define ATH_CABQ_READY_TIME 80 /* % of beacon interval */ |
545 | #define ATH_MAX_SW_RETRIES 10 | 545 | #define ATH_MAX_SW_RETRIES 30 |
546 | #define ATH_CHAN_MAX 255 | 546 | #define ATH_CHAN_MAX 255 |
547 | 547 | ||
548 | #define ATH_TXPOWER_MAX 100 /* .5 dBm units */ | 548 | #define ATH_TXPOWER_MAX 100 /* .5 dBm units */ |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 9e65c3198ca7..a46b4e2f045c 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
@@ -264,14 +264,17 @@ static void ath_tid_drain(struct ath_softc *sc, struct ath_txq *txq, | |||
264 | } | 264 | } |
265 | 265 | ||
266 | static void ath_tx_set_retry(struct ath_softc *sc, struct ath_txq *txq, | 266 | static void ath_tx_set_retry(struct ath_softc *sc, struct ath_txq *txq, |
267 | struct sk_buff *skb) | 267 | struct sk_buff *skb, int count) |
268 | { | 268 | { |
269 | struct ath_frame_info *fi = get_frame_info(skb); | 269 | struct ath_frame_info *fi = get_frame_info(skb); |
270 | struct ath_buf *bf = fi->bf; | 270 | struct ath_buf *bf = fi->bf; |
271 | struct ieee80211_hdr *hdr; | 271 | struct ieee80211_hdr *hdr; |
272 | int prev = fi->retries; | ||
272 | 273 | ||
273 | TX_STAT_INC(txq->axq_qnum, a_retries); | 274 | TX_STAT_INC(txq->axq_qnum, a_retries); |
274 | if (fi->retries++ > 0) | 275 | fi->retries += count; |
276 | |||
277 | if (prev > 0) | ||
275 | return; | 278 | return; |
276 | 279 | ||
277 | hdr = (struct ieee80211_hdr *)skb->data; | 280 | hdr = (struct ieee80211_hdr *)skb->data; |
@@ -379,6 +382,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, | |||
379 | int nframes; | 382 | int nframes; |
380 | u8 tidno; | 383 | u8 tidno; |
381 | bool flush = !!(ts->ts_status & ATH9K_TX_FLUSH); | 384 | bool flush = !!(ts->ts_status & ATH9K_TX_FLUSH); |
385 | int i, retries; | ||
382 | 386 | ||
383 | skb = bf->bf_mpdu; | 387 | skb = bf->bf_mpdu; |
384 | hdr = (struct ieee80211_hdr *)skb->data; | 388 | hdr = (struct ieee80211_hdr *)skb->data; |
@@ -387,6 +391,10 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, | |||
387 | 391 | ||
388 | memcpy(rates, tx_info->control.rates, sizeof(rates)); | 392 | memcpy(rates, tx_info->control.rates, sizeof(rates)); |
389 | 393 | ||
394 | retries = ts->ts_longretry + 1; | ||
395 | for (i = 0; i < ts->ts_rateindex; i++) | ||
396 | retries += rates[i].count; | ||
397 | |||
390 | rcu_read_lock(); | 398 | rcu_read_lock(); |
391 | 399 | ||
392 | sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); | 400 | sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); |
@@ -471,7 +479,8 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, | |||
471 | txpending = 1; | 479 | txpending = 1; |
472 | } else if (fi->retries < ATH_MAX_SW_RETRIES) { | 480 | } else if (fi->retries < ATH_MAX_SW_RETRIES) { |
473 | if (txok || !an->sleeping) | 481 | if (txok || !an->sleeping) |
474 | ath_tx_set_retry(sc, txq, bf->bf_mpdu); | 482 | ath_tx_set_retry(sc, txq, bf->bf_mpdu, |
483 | retries); | ||
475 | 484 | ||
476 | txpending = 1; | 485 | txpending = 1; |
477 | } else { | 486 | } else { |