From 7236d4f82b57680d76a52abc934130cb02cc913c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Mon, 1 Apr 2024 23:59:03 +0200 Subject: [PATCH] mt76: add mt7603 possible workaround for MT7603EN / MT7628AN stability MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Add debugfs entry for disabling frames buffering that may be a reason for mt7603 instability. This patch was sent upstream for review and at least wasn't rejected yet. Let's add it to let OpenWrt users test if it really helps. Example usage: echo N > /sys/kernel/debug/ieee80211/phy0/mt76/frames_buffering Signed-off-by: Rafał Miłecki --- package/kernel/mt76/Makefile | 2 +- ...-add-debugfs-attr-for-disabling-fram.patch | 81 +++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 package/kernel/mt76/patches/101-wifi-mt76-mt7603-add-debugfs-attr-for-disabling-fram.patch diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile index 61491063e9..c44ed4d1da 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 0000000000..7d2b7eccbf --- /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; -- 2.30.2