diff options
author | Felix Fietkau <nbd@openwrt.org> | 2012-04-19 15:18:23 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-04-23 15:35:30 -0400 |
commit | e115b7ec336bdeb1cf950cfcdc159f4628775c53 (patch) | |
tree | 87fb3b3fb640061fe1082bcfbbb5dfb53caa1e70 /drivers/net/wireless/ath/ath9k/hw.c | |
parent | e88e486115a21c27389b666191b318988fbca07f (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.c | 9 |
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 | } |