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 0000000000000000000000000000000000000000..e8b9896181107d15098308e2cc2ed096f5b0998e --- /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 ++