[PATCH] wifi: mt76: mt7603: add debugfs attr for disabling frames buffering

Shengyu Qu wiagn233 at outlook.com
Tue Apr 2 09:54:52 PDT 2024


Hi Rafal,

Maybe we could disable frames buffering by default until it is fixed?
Also, maybe we could do more tests on newer models such as mt7986/81 to
make this patch benefit more models?

Best regards,
Shengyu


在 2024/3/26 6:33, Rafał Miłecki 写道:
> From: Rafał Miłecki <rafal at milecki.pl>
> 
> 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 <rafal at milecki.pl>
> ---
>   drivers/net/wireless/mediatek/mt76/mt7603/debugfs.c | 2 ++
>   drivers/net/wireless/mediatek/mt76/mt7603/dma.c     | 3 +++
>   drivers/net/wireless/mediatek/mt76/mt7603/init.c    | 1 +
>   drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h  | 2 ++
>   4 files changed, 8 insertions(+)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7603/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7603/debugfs.c
> index 3967f2f05774..c80baba7a402 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7603/debugfs.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7603/debugfs.c
> @@ -115,4 +115,6 @@ void mt7603_init_debugfs(struct mt7603_dev *dev)
>   			    &dev->sensitivity_limit);
>   	debugfs_create_bool("dynamic_sensitivity", 0600, dir,
>   			    &dev->dynamic_sensitivity);
> +	debugfs_create_bool("frames_buffering", 0600, dir,
> +			    &dev->frames_buffering);
>   }
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7603/dma.c b/drivers/net/wireless/mediatek/mt76/mt7603/dma.c
> index 7a2f5d38562b..f5ab729dec31 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7603/dma.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7603/dma.c
> @@ -27,6 +27,9 @@ mt7603_rx_loopback_skb(struct mt7603_dev *dev, struct sk_buff *skb)
>   	u32 val;
>   	u8 tid = 0;
>   
> +	if (!dev->frames_buffering)
> +		goto free;
> +
>   	if (skb->len < MT_TXD_SIZE + sizeof(struct ieee80211_hdr))
>   		goto free;
>   
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7603/init.c b/drivers/net/wireless/mediatek/mt76/mt7603/init.c
> index 6c55c72f28a2..5abc2618ec8b 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7603/init.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7603/init.c
> @@ -515,6 +515,7 @@ int mt7603_register_device(struct mt7603_dev *dev)
>   	dev->slottime = 9;
>   	dev->sensitivity_limit = 28;
>   	dev->dynamic_sensitivity = true;
> +	dev->frames_buffering = true;
>   
>   	ret = mt7603_init_hardware(dev);
>   	if (ret)
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h b/drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h
> index 9e58df7042ad..02c88334cdc0 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h
> +++ b/drivers/net/wireless/mediatek/mt76/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;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_0xE3520CC91929C8E7.asc
Type: application/pgp-keys
Size: 6868 bytes
Desc: OpenPGP public key
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20240403/5fb834d0/attachment-0001.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 840 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20240403/5fb834d0/attachment-0001.sig>


More information about the linux-arm-kernel mailing list