From d5d6d0f7aca547c9a5f66ee72d697c9c11e0626c Mon Sep 17 00:00:00 2001
From: David Bauer <mail@david-bauer.net>
Date: Mon, 1 Jul 2024 15:47:44 +0000
Subject: [PATCH] mt76: include fixes for MT7603 / MT7612 (#3261)

---
 ...mt76-include-fixes-for-MT7603-MT7612.patch | 175 ++++++++++++++++++
 1 file changed, 175 insertions(+)
 create mode 100644 patches/openwrt/0010-mt76-include-fixes-for-MT7603-MT7612.patch

diff --git a/patches/openwrt/0010-mt76-include-fixes-for-MT7603-MT7612.patch b/patches/openwrt/0010-mt76-include-fixes-for-MT7603-MT7612.patch
new file mode 100644
index 000000000..e8b989618
--- /dev/null
+++ b/patches/openwrt/0010-mt76-include-fixes-for-MT7603-MT7612.patch
@@ -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
++
-- 
GitLab