aboutsummaryrefslogtreecommitdiffstats
path: root/queue-6.6/net-ethernet-mtk_eth_soc-fix-wed-wifi-reset.patch
diff options
context:
space:
mode:
Diffstat (limited to 'queue-6.6/net-ethernet-mtk_eth_soc-fix-wed-wifi-reset.patch')
-rw-r--r--queue-6.6/net-ethernet-mtk_eth_soc-fix-wed-wifi-reset.patch64
1 files changed, 64 insertions, 0 deletions
diff --git a/queue-6.6/net-ethernet-mtk_eth_soc-fix-wed-wifi-reset.patch b/queue-6.6/net-ethernet-mtk_eth_soc-fix-wed-wifi-reset.patch
new file mode 100644
index 0000000000..aa87af8279
--- /dev/null
+++ b/queue-6.6/net-ethernet-mtk_eth_soc-fix-wed-wifi-reset.patch
@@ -0,0 +1,64 @@
+From 7568923b5814e0ce0db3461ce5bd1855d5c9f4c8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 16 Apr 2024 10:23:29 +0200
+Subject: net: ethernet: mtk_eth_soc: fix WED + wifi reset
+
+From: Felix Fietkau <nbd@nbd.name>
+
+[ Upstream commit 94667949ec3bbb2218c46ad0a0e7274c8832e494 ]
+
+The WLAN + WED reset sequence relies on being able to receive interrupts from
+the card, in order to synchronize individual steps with the firmware.
+When WED is stopped, leave interrupts running and rely on the driver turning
+off unwanted ones.
+WED DMA also needs to be disabled before resetting.
+
+Fixes: f78cd9c783e0 ("net: ethernet: mtk_wed: update mtk_wed_stop")
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+Link: https://lore.kernel.org/r/20240416082330.82564-1-nbd@nbd.name
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/mediatek/mtk_wed.c | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
+index 94376aa2b34c5..c7196055c8c98 100644
+--- a/drivers/net/ethernet/mediatek/mtk_wed.c
++++ b/drivers/net/ethernet/mediatek/mtk_wed.c
+@@ -598,13 +598,13 @@ mtk_wed_dma_disable(struct mtk_wed_device *dev)
+ static void
+ mtk_wed_stop(struct mtk_wed_device *dev)
+ {
++ mtk_wed_dma_disable(dev);
+ mtk_wed_set_ext_int(dev, false);
+
+ wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, 0);
+ wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, 0);
+ wdma_w32(dev, MTK_WDMA_INT_MASK, 0);
+ wdma_w32(dev, MTK_WDMA_INT_GRP2, 0);
+- wed_w32(dev, MTK_WED_WPDMA_INT_MASK, 0);
+
+ if (dev->hw->version == 1)
+ return;
+@@ -617,7 +617,6 @@ static void
+ mtk_wed_deinit(struct mtk_wed_device *dev)
+ {
+ mtk_wed_stop(dev);
+- mtk_wed_dma_disable(dev);
+
+ wed_clr(dev, MTK_WED_CTRL,
+ MTK_WED_CTRL_WDMA_INT_AGENT_EN |
+@@ -1703,9 +1702,6 @@ mtk_wed_irq_get(struct mtk_wed_device *dev, u32 mask)
+ static void
+ mtk_wed_irq_set_mask(struct mtk_wed_device *dev, u32 mask)
+ {
+- if (!dev->running)
+- return;
+-
+ mtk_wed_set_ext_int(dev, !!mask);
+ wed_w32(dev, MTK_WED_INT_MASK, mask);
+ }
+--
+2.43.0
+