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>
This commit is contained in:
parent
1478acb392
commit
da647626c7
2 changed files with 13 additions and 4 deletions
|
@ -542,7 +542,7 @@ struct ath_ant_comb {
|
||||||
#define DEFAULT_CACHELINE 32
|
#define DEFAULT_CACHELINE 32
|
||||||
#define ATH_REGCLASSIDS_MAX 10
|
#define ATH_REGCLASSIDS_MAX 10
|
||||||
#define ATH_CABQ_READY_TIME 80 /* % of beacon interval */
|
#define ATH_CABQ_READY_TIME 80 /* % of beacon interval */
|
||||||
#define ATH_MAX_SW_RETRIES 10
|
#define ATH_MAX_SW_RETRIES 30
|
||||||
#define ATH_CHAN_MAX 255
|
#define ATH_CHAN_MAX 255
|
||||||
|
|
||||||
#define ATH_TXPOWER_MAX 100 /* .5 dBm units */
|
#define ATH_TXPOWER_MAX 100 /* .5 dBm units */
|
||||||
|
|
|
@ -264,14 +264,17 @@ static void ath_tid_drain(struct ath_softc *sc, struct ath_txq *txq,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ath_tx_set_retry(struct ath_softc *sc, struct ath_txq *txq,
|
static void ath_tx_set_retry(struct ath_softc *sc, struct ath_txq *txq,
|
||||||
struct sk_buff *skb)
|
struct sk_buff *skb, int count)
|
||||||
{
|
{
|
||||||
struct ath_frame_info *fi = get_frame_info(skb);
|
struct ath_frame_info *fi = get_frame_info(skb);
|
||||||
struct ath_buf *bf = fi->bf;
|
struct ath_buf *bf = fi->bf;
|
||||||
struct ieee80211_hdr *hdr;
|
struct ieee80211_hdr *hdr;
|
||||||
|
int prev = fi->retries;
|
||||||
|
|
||||||
TX_STAT_INC(txq->axq_qnum, a_retries);
|
TX_STAT_INC(txq->axq_qnum, a_retries);
|
||||||
if (fi->retries++ > 0)
|
fi->retries += count;
|
||||||
|
|
||||||
|
if (prev > 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
hdr = (struct ieee80211_hdr *)skb->data;
|
hdr = (struct ieee80211_hdr *)skb->data;
|
||||||
|
@ -379,6 +382,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
||||||
int nframes;
|
int nframes;
|
||||||
u8 tidno;
|
u8 tidno;
|
||||||
bool flush = !!(ts->ts_status & ATH9K_TX_FLUSH);
|
bool flush = !!(ts->ts_status & ATH9K_TX_FLUSH);
|
||||||
|
int i, retries;
|
||||||
|
|
||||||
skb = bf->bf_mpdu;
|
skb = bf->bf_mpdu;
|
||||||
hdr = (struct ieee80211_hdr *)skb->data;
|
hdr = (struct ieee80211_hdr *)skb->data;
|
||||||
|
@ -387,6 +391,10 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
||||||
|
|
||||||
memcpy(rates, tx_info->control.rates, sizeof(rates));
|
memcpy(rates, tx_info->control.rates, sizeof(rates));
|
||||||
|
|
||||||
|
retries = ts->ts_longretry + 1;
|
||||||
|
for (i = 0; i < ts->ts_rateindex; i++)
|
||||||
|
retries += rates[i].count;
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
|
||||||
sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2);
|
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,
|
||||||
txpending = 1;
|
txpending = 1;
|
||||||
} else if (fi->retries < ATH_MAX_SW_RETRIES) {
|
} else if (fi->retries < ATH_MAX_SW_RETRIES) {
|
||||||
if (txok || !an->sleeping)
|
if (txok || !an->sleeping)
|
||||||
ath_tx_set_retry(sc, txq, bf->bf_mpdu);
|
ath_tx_set_retry(sc, txq, bf->bf_mpdu,
|
||||||
|
retries);
|
||||||
|
|
||||||
txpending = 1;
|
txpending = 1;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Reference in a new issue