diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile index 61491063e93..c44ed4d1dab 100644 --- a/package/kernel/mt76/Makefile +++ b/package/kernel/mt76/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mt76 -PKG_RELEASE=1 +PKG_RELEASE=2 PKG_LICENSE:=GPLv2 PKG_LICENSE_FILES:= diff --git a/package/kernel/mt76/patches/101-wifi-mt76-mt7603-add-debugfs-attr-for-disabling-fram.patch b/package/kernel/mt76/patches/101-wifi-mt76-mt7603-add-debugfs-attr-for-disabling-fram.patch new file mode 100644 index 00000000000..7d2b7eccbf9 --- /dev/null +++ b/package/kernel/mt76/patches/101-wifi-mt76-mt7603-add-debugfs-attr-for-disabling-fram.patch @@ -0,0 +1,81 @@ +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Mon, 25 Mar 2024 18:54:02 +0100 +Subject: [PATCH] wifi: mt76: mt7603: add debugfs attr for disabling frames + buffering +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +MT7603EN and MT7628AN were reported by multiple users to be unstable +under high traffic. Transmission of packets could stop for seconds often +leading to disconnections. + +Long research & debugging revelaed a close relation between MCU +interrupts of type PKT_TYPE_TXS and slowdowns / stalls. That led to +questioning frames buffering feature. + +It turns out that disabling SKBs loopback code makes mt7603 devices much +more stable under load. There are still some traffic hiccups but those +happen like once every an hour and end up in recovery in most cases. + +Add a debugfs option for disabling frames buffering so users can give it +a try. If this solution yields a success we can make this feature +disabled by default. + +This change was successfully tested using 2 GHz AP interface on: +1. Netgear R6220 - MT7621ST (SoC) + MT7603EN (WiFi) + MT7612EN (WiFi) +2. Xiaomi Mi Router 4C - MT7628AN (Wi-Fi SoC) + +Link: https://lore.kernel.org/linux-wireless/7c96d5ee-86c1-8068-1b58-40db6087a24f@gmail.com/ +Closes: https://github.com/openwrt/mt76/issues/865 +Fixes: c8846e101502 ("mt76: add driver for MT7603E and MT7628/7688") +Signed-off-by: Rafał Miłecki +--- + mt7603/debugfs.c | 2 ++ + mt7603/dma.c | 3 +++ + mt7603/init.c | 1 + + mt7603/mt7603.h | 2 ++ + 4 files changed, 8 insertions(+) + +--- a/mt7603/debugfs.c ++++ b/mt7603/debugfs.c +@@ -115,4 +115,6 @@ void mt7603_init_debugfs(struct mt7603_d + &dev->sensitivity_limit); + debugfs_create_bool("dynamic_sensitivity", 0600, dir, + &dev->dynamic_sensitivity); ++ debugfs_create_bool("frames_buffering", 0600, dir, ++ &dev->frames_buffering); + } +--- a/mt7603/dma.c ++++ b/mt7603/dma.c +@@ -27,6 +27,9 @@ mt7603_rx_loopback_skb(struct mt7603_dev + u32 val; + u8 tid = 0; + ++ if (!dev->frames_buffering) ++ goto free; ++ + if (skb->len < MT_TXD_SIZE + sizeof(struct ieee80211_hdr)) + goto free; + +--- a/mt7603/init.c ++++ b/mt7603/init.c +@@ -517,6 +517,7 @@ int mt7603_register_device(struct mt7603 + dev->slottime = 9; + dev->sensitivity_limit = 28; + dev->dynamic_sensitivity = true; ++ dev->frames_buffering = true; + + ret = mt7603_init_hardware(dev); + if (ret) +--- a/mt7603/mt7603.h ++++ b/mt7603/mt7603.h +@@ -155,6 +155,8 @@ struct mt7603_dev { + u32 reset_test; + + unsigned int reset_cause[__RESET_CAUSE_MAX]; ++ ++ bool frames_buffering; + }; + + extern const struct mt76_driver_ops mt7603_drv_ops;