mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05:00 
			
		
		
		
	Changelog: https://cdn.kernel.org/pub/linux/kernel/v5.x/ChangeLog-5.15.132 Removed upstreamed: bcm53xx/patches-5.15/037-v6.6-0006-ARM-dts-BCM53573-Add-cells-sizes-to-PCIe-node.patch[1] bcm53xx/patches-5.15/037-v6.6-0007-ARM-dts-BCM53573-Use-updated-spi-gpio-binding-proper.patch[2] bcm53xx/patches-5.15/037-v6.6-0008-ARM-dts-BCM5301X-Extend-RAM-to-full-256MB-for-Linksy.patch[3] All other patches automatically rebased. 1. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.132&id=b35f3ca1877e024887df205ede952863d65dad36 2. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.132&id=2840d9b9c8750be270fb1153ccd5b983cbb5d592 3. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.132&id=f086e859ddc252c32f0438edff241859c0f022ce Build system: x86_64 Build-tested: ramips/tplink_archer-a6-v3 Run-tested: ramips/tplink_archer-a6-v3 Signed-off-by: John Audia <therealgraysky@proton.me>
		
			
				
	
	
		
			125 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From: Lorenzo Bianconi <lorenzo@kernel.org>
 | 
						|
Date: Sat, 14 Jan 2023 18:01:32 +0100
 | 
						|
Subject: [PATCH] net: ethernet: mtk_wed: add reset/reset_complete callbacks
 | 
						|
 | 
						|
Introduce reset and reset_complete wlan callback to schedule WLAN driver
 | 
						|
reset when ethernet/wed driver is resetting.
 | 
						|
 | 
						|
Tested-by: Daniel Golle <daniel@makrotopia.org>
 | 
						|
Co-developed-by: Sujuan Chen <sujuan.chen@mediatek.com>
 | 
						|
Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
 | 
						|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
 | 
						|
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
 | 
						|
---
 | 
						|
 | 
						|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 | 
						|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 | 
						|
@@ -3632,6 +3632,11 @@ static void mtk_pending_work(struct work
 | 
						|
 	set_bit(MTK_RESETTING, ð->state);
 | 
						|
 
 | 
						|
 	mtk_prepare_for_reset(eth);
 | 
						|
+	mtk_wed_fe_reset();
 | 
						|
+	/* Run again reset preliminary configuration in order to avoid any
 | 
						|
+	 * possible race during FE reset since it can run releasing RTNL lock.
 | 
						|
+	 */
 | 
						|
+	mtk_prepare_for_reset(eth);
 | 
						|
 
 | 
						|
 	/* stop all devices to make sure that dma is properly shut down */
 | 
						|
 	for (i = 0; i < MTK_MAC_COUNT; i++) {
 | 
						|
@@ -3669,6 +3674,8 @@ static void mtk_pending_work(struct work
 | 
						|
 
 | 
						|
 	clear_bit(MTK_RESETTING, ð->state);
 | 
						|
 
 | 
						|
+	mtk_wed_fe_reset_complete();
 | 
						|
+
 | 
						|
 	rtnl_unlock();
 | 
						|
 }
 | 
						|
 
 | 
						|
--- a/drivers/net/ethernet/mediatek/mtk_wed.c
 | 
						|
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
 | 
						|
@@ -205,6 +205,48 @@ mtk_wed_wo_reset(struct mtk_wed_device *
 | 
						|
 	iounmap(reg);
 | 
						|
 }
 | 
						|
 
 | 
						|
+void mtk_wed_fe_reset(void)
 | 
						|
+{
 | 
						|
+	int i;
 | 
						|
+
 | 
						|
+	mutex_lock(&hw_lock);
 | 
						|
+
 | 
						|
+	for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
 | 
						|
+		struct mtk_wed_hw *hw = hw_list[i];
 | 
						|
+		struct mtk_wed_device *dev = hw->wed_dev;
 | 
						|
+		int err;
 | 
						|
+
 | 
						|
+		if (!dev || !dev->wlan.reset)
 | 
						|
+			continue;
 | 
						|
+
 | 
						|
+		/* reset callback blocks until WLAN reset is completed */
 | 
						|
+		err = dev->wlan.reset(dev);
 | 
						|
+		if (err)
 | 
						|
+			dev_err(dev->dev, "wlan reset failed: %d\n", err);
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	mutex_unlock(&hw_lock);
 | 
						|
+}
 | 
						|
+
 | 
						|
+void mtk_wed_fe_reset_complete(void)
 | 
						|
+{
 | 
						|
+	int i;
 | 
						|
+
 | 
						|
+	mutex_lock(&hw_lock);
 | 
						|
+
 | 
						|
+	for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
 | 
						|
+		struct mtk_wed_hw *hw = hw_list[i];
 | 
						|
+		struct mtk_wed_device *dev = hw->wed_dev;
 | 
						|
+
 | 
						|
+		if (!dev || !dev->wlan.reset_complete)
 | 
						|
+			continue;
 | 
						|
+
 | 
						|
+		dev->wlan.reset_complete(dev);
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	mutex_unlock(&hw_lock);
 | 
						|
+}
 | 
						|
+
 | 
						|
 static struct mtk_wed_hw *
 | 
						|
 mtk_wed_assign(struct mtk_wed_device *dev)
 | 
						|
 {
 | 
						|
--- a/drivers/net/ethernet/mediatek/mtk_wed.h
 | 
						|
+++ b/drivers/net/ethernet/mediatek/mtk_wed.h
 | 
						|
@@ -128,6 +128,8 @@ void mtk_wed_add_hw(struct device_node *
 | 
						|
 void mtk_wed_exit(void);
 | 
						|
 int mtk_wed_flow_add(int index);
 | 
						|
 void mtk_wed_flow_remove(int index);
 | 
						|
+void mtk_wed_fe_reset(void);
 | 
						|
+void mtk_wed_fe_reset_complete(void);
 | 
						|
 #else
 | 
						|
 static inline void
 | 
						|
 mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
 | 
						|
@@ -147,6 +149,13 @@ static inline void mtk_wed_flow_remove(i
 | 
						|
 {
 | 
						|
 }
 | 
						|
 
 | 
						|
+static inline void mtk_wed_fe_reset(void)
 | 
						|
+{
 | 
						|
+}
 | 
						|
+
 | 
						|
+static inline void mtk_wed_fe_reset_complete(void)
 | 
						|
+{
 | 
						|
+}
 | 
						|
 #endif
 | 
						|
 
 | 
						|
 #ifdef CONFIG_DEBUG_FS
 | 
						|
--- a/include/linux/soc/mediatek/mtk_wed.h
 | 
						|
+++ b/include/linux/soc/mediatek/mtk_wed.h
 | 
						|
@@ -151,6 +151,8 @@ struct mtk_wed_device {
 | 
						|
 		void (*release_rx_buf)(struct mtk_wed_device *wed);
 | 
						|
 		void (*update_wo_rx_stats)(struct mtk_wed_device *wed,
 | 
						|
 					   struct mtk_wed_wo_rx_stats *stats);
 | 
						|
+		int (*reset)(struct mtk_wed_device *wed);
 | 
						|
+		void (*reset_complete)(struct mtk_wed_device *wed);
 | 
						|
 	} wlan;
 | 
						|
 #endif
 | 
						|
 };
 |