-
Notifications
You must be signed in to change notification settings - Fork 322
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
mt76: include fixes for MT7603 / MT7612
- Loading branch information
1 parent
00160f5
commit e4f7398
Showing
1 changed file
with
175 additions
and
0 deletions.
There are no files selected for viewing
175 changes: 175 additions & 0 deletions
175
patches/openwrt/0008-mt76-include-fixes-for-MT7603-MT7612.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,175 @@ | ||
From: David Bauer <mail@david-bauer.net> | ||
Date: Thu, 14 Mar 2024 09:39:22 +0100 | ||
Subject: mt76: include fixes for MT7603 / MT7612 | ||
|
||
diff --git a/package/kernel/mt76/patches/0001-tx-add-limit-for-TXS-ack-override.patch b/package/kernel/mt76/patches/0001-tx-add-limit-for-TXS-ack-override.patch | ||
new file mode 100644 | ||
index 0000000000000000000000000000000000000000..568c590f24c251dda70522865af32b3753cd5beb | ||
--- /dev/null | ||
+++ b/package/kernel/mt76/patches/0001-tx-add-limit-for-TXS-ack-override.patch | ||
@@ -0,0 +1,79 @@ | ||
+From a95c23b2c2e923ed293eb794b74735c7d6c5b272 Mon Sep 17 00:00:00 2001 | ||
+From: David Bauer <mail@david-bauer.net> | ||
+Date: Fri, 1 Mar 2024 17:41:33 +0100 | ||
+Subject: [PATCH 1/2] tx: add limit for TXS ack override | ||
+ | ||
+Add an upper limit for overriding missing TX status for each client. | ||
+ | ||
+This avoids clients, which to mac80211 still appear as if they are | ||
+connected when in fact they are not reachable for the AP anymore. | ||
+ | ||
+This can happen, as the radio (observed on MT7603 in particular) might | ||
+skip TX status-reporting which the host will then mark as acked. This | ||
+prevents the client from timing out and become "sticky" on the AP. | ||
+ | ||
+Signed-off-by: David Bauer <mail@david-bauer.net> | ||
+--- | ||
+ mt76.h | 2 ++ | ||
+ tx.c | 20 +++++++++++++++++++- | ||
+ 2 files changed, 21 insertions(+), 1 deletion(-) | ||
+ | ||
+diff --git a/mt76.h b/mt76.h | ||
+index fd527649..6d9b7028 100644 | ||
+--- a/mt76.h | ||
++++ b/mt76.h | ||
+@@ -330,6 +330,8 @@ struct mt76_wcid { | ||
+ u8 rx_key_pn[IEEE80211_NUM_TIDS + 1][6]; | ||
+ u16 cipher; | ||
+ | ||
++ u8 txs_failed_cnt; | ||
++ | ||
+ u32 tx_info; | ||
+ bool sw_iv; | ||
+ | ||
+diff --git a/tx.c b/tx.c | ||
+index 1809b032..65d6104f 100644 | ||
+--- a/tx.c | ||
++++ b/tx.c | ||
+@@ -91,6 +91,7 @@ __mt76_tx_status_skb_done(struct mt76_dev *dev, struct sk_buff *skb, u8 flags, | ||
+ { | ||
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
+ struct mt76_tx_cb *cb = mt76_tx_skb_cb(skb); | ||
++ struct mt76_wcid *wcid; | ||
+ u8 done = MT_TX_CB_DMA_DONE | MT_TX_CB_TXS_DONE; | ||
+ | ||
+ flags |= cb->flags; | ||
+@@ -98,12 +99,29 @@ __mt76_tx_status_skb_done(struct mt76_dev *dev, struct sk_buff *skb, u8 flags, | ||
+ | ||
+ if ((flags & done) != done) | ||
+ return; | ||
++ | ||
++ wcid = rcu_dereference(dev->wcid[cb->wcid]); | ||
+ | ||
+ /* Tx status can be unreliable. if it fails, mark the frame as ACKed */ | ||
+ if (flags & MT_TX_CB_TXS_FAILED) { | ||
++ /* Increment station counter */ | ||
++ if (wcid && wcid->sta) | ||
++ wcid->txs_failed_cnt++; | ||
++ | ||
+ info->status.rates[0].count = 0; | ||
+ info->status.rates[0].idx = -1; | ||
+- info->flags |= IEEE80211_TX_STAT_ACK; | ||
++ | ||
++ /** | ||
++ * Check if station counter exceeds the limit for | ||
++ * implicit acks. If not, mark the frame as ACKed. | ||
++ */ | ||
++ if (!wcid || wcid->txs_failed_cnt < 25) { | ||
++ info->flags |= IEEE80211_TX_STAT_ACK; | ||
++ } | ||
++ } else if (info->flags & IEEE80211_TX_STAT_ACK) { | ||
++ /* Reset station counter */ | ||
++ if (wcid && wcid->sta) | ||
++ wcid->txs_failed_cnt = 0; | ||
+ } | ||
+ | ||
+ __skb_queue_tail(list, skb); | ||
+-- | ||
+2.43.0 | ||
+ | ||
diff --git a/package/kernel/mt76/patches/0002-mt76x02-avoid-action-ghost-ack.patch b/package/kernel/mt76/patches/0002-mt76x02-avoid-action-ghost-ack.patch | ||
new file mode 100644 | ||
index 0000000000000000000000000000000000000000..0910ed99ef473db9cf4129f88017912b5d63267d | ||
--- /dev/null | ||
+++ b/package/kernel/mt76/patches/0002-mt76x02-avoid-action-ghost-ack.patch | ||
@@ -0,0 +1,80 @@ | ||
+From 3c9ecc0c77e85d9ff91faddde59764fbc9316b7c Mon Sep 17 00:00:00 2001 | ||
+From: David Bauer <mail@david-bauer.net> | ||
+Date: Sat, 2 Mar 2024 13:14:49 +0100 | ||
+Subject: [PATCH 2/2] mt76x02: avoid action ghost-ack | ||
+ | ||
+On PMF enabled networks, chip reports ACTION frames always as acked. | ||
+ | ||
+In case a roaming-assistant sens link-measurements periodically, | ||
+this results in the station never becoming inactive and not being removed | ||
+from the AP's station list. | ||
+ | ||
+Avoid this from happening by marking action frames sent on a PMF enabled | ||
+network as no-ack. | ||
+ | ||
+Signed-off-by: David Bauer <mail@david-bauer.net> | ||
+--- | ||
+ mt76x02_mac.c | 27 +++++++++++++++++++++++++++ | ||
+ mt76x02_mac.h | 1 + | ||
+ 2 files changed, 28 insertions(+) | ||
+ | ||
+diff --git a/mt76x02_mac.c b/mt76x02_mac.c | ||
+index d5db6ffd..672e01ec 100644 | ||
+--- a/mt76x02_mac.c | ||
++++ b/mt76x02_mac.c | ||
+@@ -544,6 +544,7 @@ void mt76x02_send_tx_status(struct mt76x02_dev *dev, | ||
+ struct ieee80211_tx_status status = { | ||
+ .info = &info | ||
+ }; | ||
++ struct ieee80211_hdr *hdr; | ||
+ static const u8 ac_to_tid[4] = { | ||
+ [IEEE80211_AC_BE] = 0, | ||
+ [IEEE80211_AC_BK] = 1, | ||
+@@ -619,6 +620,32 @@ void mt76x02_send_tx_status(struct mt76x02_dev *dev, | ||
+ *update = 1; | ||
+ } | ||
+ | ||
++ if (msta && status.skb && | ||
++ (status.info->flags & IEEE80211_TX_STAT_ACK)) { | ||
++ hdr = (struct ieee80211_hdr *)status.skb->data; | ||
++ | ||
++ if (ieee80211_has_protected(hdr->frame_control) && | ||
++ ieee80211_is_robust_mgmt_frame(status.skb)) { | ||
++ /** | ||
++ * On PMF enabled networks, chip reports ACTION frames | ||
++ * always as acked. | ||
++ * | ||
++ * In case a roaming-assistant sends link-measurements | ||
++ * periodically, this results in the station never | ||
++ * becoming inactive and not being removed from the | ||
++ * AP's station list. | ||
++ */ | ||
++ | ||
++ if (msta->n_enc_mgmt >= 25) { | ||
++ status.info->flags &= ~IEEE80211_TX_STAT_ACK; | ||
++ } else { | ||
++ msta->n_enc_mgmt++; | ||
++ } | ||
++ } else { | ||
++ msta->n_enc_mgmt = 0; | ||
++ } | ||
++ } | ||
++ | ||
+ if (status.skb) { | ||
+ info = *status.info; | ||
+ len = status.skb->len; | ||
+diff --git a/mt76x02_mac.h b/mt76x02_mac.h | ||
+index 5dc6c834..1bd2288f 100644 | ||
+--- a/mt76x02_mac.h | ||
++++ b/mt76x02_mac.h | ||
+@@ -39,6 +39,7 @@ struct mt76x02_sta { | ||
+ struct mt76x02_vif *vif; | ||
+ struct mt76x02_tx_status status; | ||
+ int n_frames; | ||
++ u8 n_enc_mgmt; | ||
+ | ||
+ struct ewma_pktlen pktlen; | ||
+ }; | ||
+-- | ||
+2.43.0 | ||
+ |