mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-26 17:01:14 +00:00
dd4b8a24a1
Close cooperation with Lorenzo Bianconi resulted in these patches which fix all remaining seen issues when using dynack. Fix link losses when: - Late Ack's are not seen or not present - switching from too low static coverage class to dynack on a live link These are fixed by setting the Ack Timeout/Slottime to the max possible value for the currently used channel width when a new station has been discovered. When traffic flows, dynack is able to adjust to optimal values within a few packets received (typically < 1 second) These changes have been thoroughly tested on ~60 offshore devices all interconnected using mesh over IBSS and dynack enabled on all. Distances between devices varied from <100m up to ~35km Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> (cherry picked from commit f6e8ba0238fe349b7529357793e2fb18635819ed)
79 lines
2.3 KiB
Diff
79 lines
2.3 KiB
Diff
From cc783bfa67e87d2e6206f7626b7bbb74d5c5f269 Mon Sep 17 00:00:00 2001
|
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Date: Tue, 20 Aug 2019 18:20:22 +0200
|
|
Subject: [PATCH 4/4] ath9k: dynack: set ackto to max timeout in
|
|
ath_dynack_reset
|
|
|
|
Initialize acktimeout to the maximum configurable value in
|
|
ath_dynack_reset in order to not disconnect long distance static links
|
|
enabling dynack and even to take care of possible errors configuring
|
|
a static timeout. Moreover initialize station timeout value to the current
|
|
acktimeout value
|
|
|
|
Tested-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
|
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
---
|
|
drivers/net/wireless/ath/ath9k/dynack.c | 20 +++++++++++++-------
|
|
1 file changed, 13 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/drivers/net/wireless/ath/ath9k/dynack.c b/drivers/net/wireless/ath/ath9k/dynack.c
|
|
index fe9181533de3..f786be04d0ac 100644
|
|
--- a/drivers/net/wireless/ath/ath9k/dynack.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/dynack.c
|
|
@@ -321,11 +321,9 @@ EXPORT_SYMBOL(ath_dynack_sample_ack_ts);
|
|
*/
|
|
void ath_dynack_node_init(struct ath_hw *ah, struct ath_node *an)
|
|
{
|
|
- /* ackto = slottime + sifs + air delay */
|
|
- u32 ackto = 9 + 16 + 64;
|
|
struct ath_dynack *da = &ah->dynack;
|
|
|
|
- an->ackto = ackto;
|
|
+ an->ackto = da->ackto;
|
|
|
|
spin_lock(&da->qlock);
|
|
list_add_tail(&an->list, &da->nodes);
|
|
@@ -356,20 +354,26 @@ EXPORT_SYMBOL(ath_dynack_node_deinit);
|
|
*/
|
|
void ath_dynack_reset(struct ath_hw *ah)
|
|
{
|
|
- /* ackto = slottime + sifs + air delay */
|
|
- u32 ackto = 9 + 16 + 64;
|
|
struct ath_dynack *da = &ah->dynack;
|
|
+ struct ath_node *an;
|
|
+
|
|
+ spin_lock_bh(&da->qlock);
|
|
|
|
da->lto = jiffies + COMPUTE_TO;
|
|
- da->ackto = ackto;
|
|
|
|
da->st_rbf.t_rb = 0;
|
|
da->st_rbf.h_rb = 0;
|
|
da->ack_rbf.t_rb = 0;
|
|
da->ack_rbf.h_rb = 0;
|
|
|
|
+ da->ackto = ath_dynack_get_max_to(ah);
|
|
+ list_for_each_entry(an, &da->nodes, list)
|
|
+ an->ackto = da->ackto;
|
|
+
|
|
/* init acktimeout */
|
|
- ath_dynack_set_timeout(ah, ackto);
|
|
+ ath_dynack_set_timeout(ah, da->ackto);
|
|
+
|
|
+ spin_unlock_bh(&da->qlock);
|
|
}
|
|
EXPORT_SYMBOL(ath_dynack_reset);
|
|
|
|
@@ -386,6 +390,8 @@ void ath_dynack_init(struct ath_hw *ah)
|
|
|
|
spin_lock_init(&da->qlock);
|
|
INIT_LIST_HEAD(&da->nodes);
|
|
+ /* ackto = slottime + sifs + air delay */
|
|
+ da->ackto = 9 + 16 + 64;
|
|
|
|
ah->hw->wiphy->features |= NL80211_FEATURE_ACKTO_ESTIMATION;
|
|
}
|
|
--
|
|
2.17.1
|
|
|