diff options
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.patch | 64 |
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 + |