aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/hw.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2012-04-19 15:18:23 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-04-23 15:35:30 -0400
commite115b7ec336bdeb1cf950cfcdc159f4628775c53 (patch)
tree87fb3b3fb640061fe1082bcfbbb5dfb53caa1e70 /drivers/net/wireless/ath/ath9k/hw.c
parente88e486115a21c27389b666191b318988fbca07f (diff)
ath9k_hw: increase ACK timeout for half/quarter channels
For some reason the MAC timing is a bit off when waiting for ACKs, so add some extra delay to the ACK timeout values. Significantly reduces the number of retransmissions in my tests. Also disable the 2.4 GHz ACK timeout workaround in half/quarter mode, it is not required there. 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/hw.c')
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index a43934fb8138..4dddffd7c403 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -1020,7 +1020,7 @@ void ath9k_hw_init_global_settings(struct ath_hw *ah)
1020 struct ath_common *common = ath9k_hw_common(ah); 1020 struct ath_common *common = ath9k_hw_common(ah);
1021 struct ieee80211_conf *conf = &common->hw->conf; 1021 struct ieee80211_conf *conf = &common->hw->conf;
1022 const struct ath9k_channel *chan = ah->curchan; 1022 const struct ath9k_channel *chan = ah->curchan;
1023 int acktimeout, ctstimeout; 1023 int acktimeout, ctstimeout, ack_offset = 0;
1024 int slottime; 1024 int slottime;
1025 int sifstime; 1025 int sifstime;
1026 int rx_lat = 0, tx_lat = 0, eifs = 0; 1026 int rx_lat = 0, tx_lat = 0, eifs = 0;
@@ -1054,6 +1054,7 @@ void ath9k_hw_init_global_settings(struct ath_hw *ah)
1054 tx_lat += 11; 1054 tx_lat += 11;
1055 1055
1056 sifstime *= 2; 1056 sifstime *= 2;
1057 ack_offset = 16;
1057 slottime = 13; 1058 slottime = 13;
1058 } else if (IS_CHAN_QUARTER_RATE(chan)) { 1059 } else if (IS_CHAN_QUARTER_RATE(chan)) {
1059 eifs = 340; 1060 eifs = 340;
@@ -1063,6 +1064,7 @@ void ath9k_hw_init_global_settings(struct ath_hw *ah)
1063 tx_lat += 22; 1064 tx_lat += 22;
1064 1065
1065 sifstime *= 4; 1066 sifstime *= 4;
1067 ack_offset = 32;
1066 slottime = 21; 1068 slottime = 21;
1067 } else { 1069 } else {
1068 if (AR_SREV_9287(ah) && AR_SREV_9287_13_OR_LATER(ah)) { 1070 if (AR_SREV_9287(ah) && AR_SREV_9287_13_OR_LATER(ah)) {
@@ -1080,7 +1082,7 @@ void ath9k_hw_init_global_settings(struct ath_hw *ah)
1080 } 1082 }
1081 1083
1082 /* As defined by IEEE 802.11-2007 17.3.8.6 */ 1084 /* As defined by IEEE 802.11-2007 17.3.8.6 */
1083 acktimeout = slottime + sifstime + 3 * ah->coverage_class; 1085 acktimeout = slottime + sifstime + 3 * ah->coverage_class + ack_offset;
1084 ctstimeout = acktimeout; 1086 ctstimeout = acktimeout;
1085 1087
1086 /* 1088 /*
@@ -1090,7 +1092,8 @@ void ath9k_hw_init_global_settings(struct ath_hw *ah)
1090 * BA frames in some implementations, but it has been found to fix ACK 1092 * BA frames in some implementations, but it has been found to fix ACK
1091 * timeout issues in other cases as well. 1093 * timeout issues in other cases as well.
1092 */ 1094 */
1093 if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ) { 1095 if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ &&
1096 !IS_CHAN_HALF_RATE(chan) && !IS_CHAN_QUARTER_RATE(chan)) {
1094 acktimeout += 64 - sifstime - ah->slottime; 1097 acktimeout += 64 - sifstime - ah->slottime;
1095 ctstimeout += 48 - sifstime - ah->slottime; 1098 ctstimeout += 48 - sifstime - ah->slottime;
1096 } 1099 }