aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2010-03-01 07:32:11 -0500
committerJohn W. Linville <linville@tuxdriver.com>2010-03-10 17:44:45 -0500
commitd969847c2202f82b3f6755d16909925e64e354e5 (patch)
tree108eec6c1cccb07497c2831618ba1a0ac5bb420c /drivers/net/wireless/ath/ath9k
parent7c3c76a82f3a6d52bbeabf48dd32109cc951a7cf (diff)
ath9k: fix rate control tx status handling for A-MPDU
Currently the rate control tx status update gets called for every subframe of an A-MPDU, and ath9k marks the frame with the relevant status update with an internal flag. This not suitable for rate control algorithms using the standard mac80211 rate control API, so fix this by using IEEE80211_TX_STAT_AMPDU for marking the correct frames that should be processed. Signed-off-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k')
-rw-r--r--drivers/net/wireless/ath/ath9k/rc.c8
-rw-r--r--drivers/net/wireless/ath/ath9k/rc.h1
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c4
3 files changed, 8 insertions, 5 deletions
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c
index 0e79e58cf4c9..3c4b5d2d9e16 100644
--- a/drivers/net/wireless/ath/ath9k/rc.c
+++ b/drivers/net/wireless/ath/ath9k/rc.c
@@ -1226,8 +1226,12 @@ static void ath_tx_status(void *priv, struct ieee80211_supported_band *sband,
1226 long_retry = rate->count - 1; 1226 long_retry = rate->count - 1;
1227 } 1227 }
1228 1228
1229 if (!priv_sta || !ieee80211_is_data(fc) || 1229 if (!priv_sta || !ieee80211_is_data(fc))
1230 !(tx_info->pad[0] & ATH_TX_INFO_UPDATE_RC)) 1230 return;
1231
1232 /* This packet was aggregated but doesn't carry status info */
1233 if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) &&
1234 !(tx_info->flags & IEEE80211_TX_STAT_AMPDU))
1231 return; 1235 return;
1232 1236
1233 if (tx_info->flags & IEEE80211_TX_STAT_TX_FILTERED) 1237 if (tx_info->flags & IEEE80211_TX_STAT_TX_FILTERED)
diff --git a/drivers/net/wireless/ath/ath9k/rc.h b/drivers/net/wireless/ath/ath9k/rc.h
index 4f6d6fd442f4..f4818e4fa4b0 100644
--- a/drivers/net/wireless/ath/ath9k/rc.h
+++ b/drivers/net/wireless/ath/ath9k/rc.h
@@ -172,7 +172,6 @@ struct ath_rate_priv {
172 172
173#define ATH_TX_INFO_FRAME_TYPE_INTERNAL (1 << 0) 173#define ATH_TX_INFO_FRAME_TYPE_INTERNAL (1 << 0)
174#define ATH_TX_INFO_FRAME_TYPE_PAUSE (1 << 1) 174#define ATH_TX_INFO_FRAME_TYPE_PAUSE (1 << 1)
175#define ATH_TX_INFO_UPDATE_RC (1 << 2)
176#define ATH_TX_INFO_XRETRY (1 << 3) 175#define ATH_TX_INFO_XRETRY (1 << 3)
177#define ATH_TX_INFO_UNDERRUN (1 << 4) 176#define ATH_TX_INFO_UNDERRUN (1 << 4)
178 177
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index b2c8207f7bc1..8359362fc51c 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -1947,10 +1947,10 @@ static void ath_tx_rc_status(struct ath_buf *bf, struct ath_desc *ds,
1947 tx_rateindex = ds->ds_txstat.ts_rateindex; 1947 tx_rateindex = ds->ds_txstat.ts_rateindex;
1948 WARN_ON(tx_rateindex >= hw->max_rates); 1948 WARN_ON(tx_rateindex >= hw->max_rates);
1949 1949
1950 if (update_rc)
1951 tx_info->pad[0] |= ATH_TX_INFO_UPDATE_RC;
1952 if (ds->ds_txstat.ts_status & ATH9K_TXERR_FILT) 1950 if (ds->ds_txstat.ts_status & ATH9K_TXERR_FILT)
1953 tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED; 1951 tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
1952 if ((tx_info->flags & IEEE80211_TX_CTL_AMPDU) && update_rc)
1953 tx_info->flags |= IEEE80211_TX_STAT_AMPDU;
1954 1954
1955 if ((ds->ds_txstat.ts_status & ATH9K_TXERR_FILT) == 0 && 1955 if ((ds->ds_txstat.ts_status & ATH9K_TXERR_FILT) == 0 &&
1956 (bf->bf_flags & ATH9K_TXDESC_NOACK) == 0 && update_rc) { 1956 (bf->bf_flags & ATH9K_TXDESC_NOACK) == 0 && update_rc) {