[][MAC80211][WED][Fix MT7981 wed detach occur call trace issue]

[Description]
Fix MT7981 wed detach occur call trace issue
Check for NULL pointer to avoid kernel crashing in case only a single WED device has been initialized

[Release-log]

Change-Id: I9f1c5a1ada98b09460653ec053ba4050addb9b9a
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/8387837
diff --git a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3006-add-wed-tx-support-for-netsys2.patch b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3006-add-wed-tx-support-for-netsys2.patch
index 1cfa774..5cfedfc 100644
--- a/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3006-add-wed-tx-support-for-netsys2.patch
+++ b/autobuild_mac80211_release/target/linux/mediatek/patches-5.4/999-3006-add-wed-tx-support-for-netsys2.patch
@@ -1,22 +1,35 @@
-From a0b64514c2bfe883d0128ce5bb26559c34185d90 Mon Sep 17 00:00:00 2001
+From d76914437a405265b298b7b01235a7304634c567 Mon Sep 17 00:00:00 2001
 From: Bo Jiao <Bo.Jiao@mediatek.com>
 Date: Mon, 18 Sep 2023 11:01:55 +0800
-Subject: [PATCH 07/22] add-wed-tx-support-for-mt7986
+Subject: [PATCH] add-wed-tx-support-for-mt7986
 
 ---
+ arch/arm64/boot/dts/mediatek/mt7981.dtsi      |   1 +
  arch/arm64/boot/dts/mediatek/mt7986a.dtsi     |   2 +
  arch/arm64/boot/dts/mediatek/mt7986b.dtsi     |   2 +
  drivers/net/ethernet/mediatek/mtk_eth_soc.c   |  17 +-
  drivers/net/ethernet/mediatek/mtk_eth_soc.h   |   5 +
- drivers/net/ethernet/mediatek/mtk_wed.c       | 496 +++++++++++++-----
+ drivers/net/ethernet/mediatek/mtk_wed.c       | 498 +++++++++++++-----
  drivers/net/ethernet/mediatek/mtk_wed.h       |  18 +-
  .../net/ethernet/mediatek/mtk_wed_debugfs.c   |   3 +
  drivers/net/ethernet/mediatek/mtk_wed_regs.h  | 130 ++++-
  include/linux/soc/mediatek/mtk_wed.h          |  23 +
- 9 files changed, 547 insertions(+), 149 deletions(-)
+ 10 files changed, 549 insertions(+), 150 deletions(-)
 
+diff --git a/arch/arm64/boot/dts/mediatek/mt7981.dtsi b/arch/arm64/boot/dts/mediatek/mt7981.dtsi
+index e1b9b2c..3e0d2c0 100644
+--- a/arch/arm64/boot/dts/mediatek/mt7981.dtsi
++++ b/arch/arm64/boot/dts/mediatek/mt7981.dtsi
+@@ -96,6 +96,7 @@
+ 		reg = <0 0x15010000 0 0x1000>;
+ 		interrupt-parent = <&gic>;
+ 		interrupts = <GIC_SPI 205 IRQ_TYPE_LEVEL_HIGH>;
++		mediatek,wed_pcie = <&wed_pcie>;
+ 	};
+ 
+ 	ap2woccif: ap2woccif@151A5000 {
 diff --git a/arch/arm64/boot/dts/mediatek/mt7986a.dtsi b/arch/arm64/boot/dts/mediatek/mt7986a.dtsi
-index 0c54e12..3ff8994 100644
+index 7e3101c..e9756bd 100644
 --- a/arch/arm64/boot/dts/mediatek/mt7986a.dtsi
 +++ b/arch/arm64/boot/dts/mediatek/mt7986a.dtsi
 @@ -64,6 +64,7 @@
@@ -36,7 +49,7 @@
  
  	ap2woccif: ap2woccif@151A5000 {
 diff --git a/arch/arm64/boot/dts/mediatek/mt7986b.dtsi b/arch/arm64/boot/dts/mediatek/mt7986b.dtsi
-index 2d2207f..043e509 100644
+index a780cfb..eafe314 100644
 --- a/arch/arm64/boot/dts/mediatek/mt7986b.dtsi
 +++ b/arch/arm64/boot/dts/mediatek/mt7986b.dtsi
 @@ -64,6 +64,7 @@
@@ -55,23 +68,11 @@
  	};
  
  	ap2woccif: ap2woccif@151A5000 {
-diff --git a/arch/arm64/boot/dts/mediatek/mt7981.dtsi b/arch/arm64/boot/dts/mediatek/mt7981.dtsi
-index b2f53b13..d34943e7 100644
---- a/arch/arm64/boot/dts/mediatek/mt7981.dtsi
-+++ b/arch/arm64/boot/dts/mediatek/mt7981.dtsi
-@@ -96,6 +96,7 @@
- 		reg = <0 0x15010000 0 0x1000>;
- 		interrupt-parent = <&gic>;
- 		interrupts = <GIC_SPI 205 IRQ_TYPE_LEVEL_HIGH>;
-+		mediatek,wed_pcie = <&wed_pcie>;
- 	};
- 
- 	ap2woccif: ap2woccif@151A5000 {
 diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-index ee5e0c6..2cab49a 100644
+index 3685926..51fe4b3 100644
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -4968,6 +4968,7 @@ static int mtk_probe(struct platform_device *pdev)
+@@ -5091,6 +5091,7 @@ static int mtk_probe(struct platform_device *pdev)
  {
  	struct device_node *mac_np, *mux_np;
  	struct mtk_eth *eth;
@@ -79,7 +80,7 @@
  	int err, i;
  
  	eth = devm_kzalloc(&pdev->dev, sizeof(*eth), GFP_KERNEL);
-@@ -4988,13 +4989,12 @@ static int mtk_probe(struct platform_device *pdev)
+@@ -5111,13 +5112,12 @@ static int mtk_probe(struct platform_device *pdev)
  			return PTR_ERR(eth->sram_base);
  	}
  
@@ -98,7 +99,7 @@
  
  	mtk_get_hwver(eth);
  
-@@ -5090,12 +5090,15 @@ static int mtk_probe(struct platform_device *pdev)
+@@ -5213,12 +5213,15 @@ static int mtk_probe(struct platform_device *pdev)
  			MTK_WDMA1_BASE
  		};
  		void __iomem *wdma;
@@ -114,12 +115,12 @@
 +		mtk_wed_add_hw(np, eth, wdma, wdma_phy, i);
  	}
  
- 	for (i = 0; i < MTK_PDMA_IRQ_NUM; i++)
+ 	if (MTK_HAS_CAPS(eth->soc->caps, MTK_PDMA_INT)) {
 diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-index 783166d..960b979 100644
+index b714c27..e9d88f1 100644
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
-@@ -583,8 +583,13 @@
+@@ -593,8 +593,13 @@
  #define RX_DMA_SPORT_MASK       0x7
  #define RX_DMA_SPORT_MASK_V2    0xf
  
@@ -134,7 +135,7 @@
  /* QDMA descriptor txd4 */
  #define TX_DMA_CHKSUM		(0x7 << 29)
 diff --git a/drivers/net/ethernet/mediatek/mtk_wed.c b/drivers/net/ethernet/mediatek/mtk_wed.c
-index ea1cbdf..0588e32 100644
+index ea1cbdf..948f013 100644
 --- a/drivers/net/ethernet/mediatek/mtk_wed.c
 +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
 @@ -18,15 +18,6 @@
@@ -434,7 +435,7 @@
  	struct mtk_wed_hw *hw = dev->hw;
  
  	mutex_lock(&hw_lock);
-@@ -279,9 +420,12 @@ mtk_wed_detach(struct mtk_wed_device *dev)
+@@ -279,11 +420,14 @@ mtk_wed_detach(struct mtk_wed_device *dev)
  	mtk_wed_free_buffer(dev);
  	mtk_wed_free_tx_rings(dev);
  
@@ -448,8 +449,11 @@
 +					   BIT(hw->index), BIT(hw->index));
 +	}
  
- 	if (!hw_list[!hw->index]->wed_dev &&
+-	if (!hw_list[!hw->index]->wed_dev &&
++	if ((!hw_list[!hw->index] || !hw_list[!hw->index]->wed_dev) &&
  	    hw->eth->dma_dev != hw->eth->dev)
+ 		mtk_eth_set_dma_device(hw->eth, hw->eth->dev);
+ 
 @@ -294,15 +438,87 @@ mtk_wed_detach(struct mtk_wed_device *dev)
  	mutex_unlock(&hw_lock);
  }