Skip to content

Commit

Permalink
mt76: include fixes for MT7603 / MT7612
Browse files Browse the repository at this point in the history
  • Loading branch information
blocktrron committed May 6, 2024
1 parent 00160f5 commit e4f7398
Showing 1 changed file with 175 additions and 0 deletions.
175 changes: 175 additions & 0 deletions patches/openwrt/0008-mt76-include-fixes-for-MT7603-MT7612.patch
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
+

0 comments on commit e4f7398

Please sign in to comment.