]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
kernel: backport fixes for MediaTek Ethernet driver
authorDaniel Golle <daniel@makrotopia.org>
Wed, 2 Nov 2022 12:41:40 +0000 (12:41 +0000)
committerDaniel Golle <daniel@makrotopia.org>
Wed, 2 Nov 2022 15:53:34 +0000 (15:53 +0000)
Backport patches from net-next which fix possible memory and resource
leaks in the error codepaths of WED initialization.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
target/linux/generic/backport-5.15/726-v6.0-net-ethernet-mtk_eth_soc-fix-mask-of-RX_DMA_GET_SPOR.patch [moved from target/linux/generic/backport-5.15/788-v6.0-net-ethernet-mtk_eth_soc-fix-mask-of-RX_DMA_GET_SPOR.patch with 100% similarity]
target/linux/generic/backport-5.15/727-v6.1-net-ethernet-mtk_eth_soc-fix-state-in-__mtk_foe_entr.patch [moved from target/linux/generic/backport-5.15/789-v6.1-net-ethernet-mtk_eth_soc-fix-state-in-__mtk_foe_entr.patch with 100% similarity]
target/linux/generic/backport-5.15/728-v6.1-01-net-ethernet-mtk_eth_soc-fix-possible-memory-leak-in.patch [new file with mode: 0644]
target/linux/generic/backport-5.15/728-v6.1-02-net-ethernet-mtk_eth_wed-add-missing-put_device-in-m.patch [new file with mode: 0644]
target/linux/generic/backport-5.15/728-v6.1-03-net-ethernet-mtk_eth_wed-add-missing-of_node_put.patch [new file with mode: 0644]
target/linux/generic/pending-5.15/702-net-ethernet-mtk_eth_soc-enable-threaded-NAPI.patch

diff --git a/target/linux/generic/backport-5.15/728-v6.1-01-net-ethernet-mtk_eth_soc-fix-possible-memory-leak-in.patch b/target/linux/generic/backport-5.15/728-v6.1-01-net-ethernet-mtk_eth_soc-fix-possible-memory-leak-in.patch
new file mode 100644 (file)
index 0000000..c419fc8
--- /dev/null
@@ -0,0 +1,73 @@
+From b3d0d98179d62f9d55635a600679c4fa362baf8d Mon Sep 17 00:00:00 2001
+From: Yang Yingliang <yangyingliang@huawei.com>
+Date: Mon, 17 Oct 2022 11:51:54 +0800
+Subject: [PATCH 1/3] net: ethernet: mtk_eth_soc: fix possible memory leak in
+ mtk_probe()
+
+If mtk_wed_add_hw() has been called, mtk_wed_exit() needs be called
+in error path or removing module to free the memory allocated in
+mtk_wed_add_hw().
+
+Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)")
+Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+@@ -4008,19 +4008,23 @@ static int mtk_probe(struct platform_dev
+                       eth->irq[i] = platform_get_irq(pdev, i);
+               if (eth->irq[i] < 0) {
+                       dev_err(&pdev->dev, "no IRQ%d resource found\n", i);
+-                      return -ENXIO;
++                      err = -ENXIO;
++                      goto err_wed_exit;
+               }
+       }
+       for (i = 0; i < ARRAY_SIZE(eth->clks); i++) {
+               eth->clks[i] = devm_clk_get(eth->dev,
+                                           mtk_clks_source_name[i]);
+               if (IS_ERR(eth->clks[i])) {
+-                      if (PTR_ERR(eth->clks[i]) == -EPROBE_DEFER)
+-                              return -EPROBE_DEFER;
++                      if (PTR_ERR(eth->clks[i]) == -EPROBE_DEFER) {
++                              err = -EPROBE_DEFER;
++                              goto err_wed_exit;
++                      }
+                       if (eth->soc->required_clks & BIT(i)) {
+                               dev_err(&pdev->dev, "clock %s not found\n",
+                                       mtk_clks_source_name[i]);
+-                              return -EINVAL;
++                              err = -EINVAL;
++                              goto err_wed_exit;
+                       }
+                       eth->clks[i] = NULL;
+               }
+@@ -4031,7 +4035,7 @@ static int mtk_probe(struct platform_dev
+       err = mtk_hw_init(eth);
+       if (err)
+-              return err;
++              goto err_wed_exit;
+       eth->hwlro = MTK_HAS_CAPS(eth->soc->caps, MTK_HWLRO);
+@@ -4129,6 +4133,8 @@ err_free_dev:
+       mtk_free_dev(eth);
+ err_deinit_hw:
+       mtk_hw_deinit(eth);
++err_wed_exit:
++      mtk_wed_exit();
+       return err;
+ }
+@@ -4148,6 +4154,7 @@ static int mtk_remove(struct platform_de
+               phylink_disconnect_phy(mac->phylink);
+       }
++      mtk_wed_exit();
+       mtk_hw_deinit(eth);
+       netif_napi_del(&eth->tx_napi);
diff --git a/target/linux/generic/backport-5.15/728-v6.1-02-net-ethernet-mtk_eth_wed-add-missing-put_device-in-m.patch b/target/linux/generic/backport-5.15/728-v6.1-02-net-ethernet-mtk_eth_wed-add-missing-put_device-in-m.patch
new file mode 100644 (file)
index 0000000..ef5374d
--- /dev/null
@@ -0,0 +1,47 @@
+From 9d4f20a476ca57e4c9246eb1fa2a61bea2354720 Mon Sep 17 00:00:00 2001
+From: Yang Yingliang <yangyingliang@huawei.com>
+Date: Mon, 17 Oct 2022 11:51:55 +0800
+Subject: [PATCH 2/3] net: ethernet: mtk_eth_wed: add missing put_device() in
+ mtk_wed_add_hw()
+
+After calling get_device() in mtk_wed_add_hw(), in error path, put_device()
+needs be called.
+
+Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)")
+Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mediatek/mtk_wed.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/mediatek/mtk_wed.c
++++ b/drivers/net/ethernet/mediatek/mtk_wed.c
+@@ -1084,11 +1084,11 @@ void mtk_wed_add_hw(struct device_node *
+       get_device(&pdev->dev);
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0)
+-              return;
++              goto err_put_device;
+       regs = syscon_regmap_lookup_by_phandle(np, NULL);
+       if (IS_ERR(regs))
+-              return;
++              goto err_put_device;
+       rcu_assign_pointer(mtk_soc_wed_ops, &wed_ops);
+@@ -1131,8 +1131,14 @@ void mtk_wed_add_hw(struct device_node *
+       hw_list[index] = hw;
++      mutex_unlock(&hw_lock);
++
++      return;
++
+ unlock:
+       mutex_unlock(&hw_lock);
++err_put_device:
++      put_device(&pdev->dev);
+ }
+ void mtk_wed_exit(void)
diff --git a/target/linux/generic/backport-5.15/728-v6.1-03-net-ethernet-mtk_eth_wed-add-missing-of_node_put.patch b/target/linux/generic/backport-5.15/728-v6.1-03-net-ethernet-mtk_eth_wed-add-missing-of_node_put.patch
new file mode 100644 (file)
index 0000000..0a452d4
--- /dev/null
@@ -0,0 +1,43 @@
+From e0bb4659e235770e6f53b3692e958591f49448f5 Mon Sep 17 00:00:00 2001
+From: Yang Yingliang <yangyingliang@huawei.com>
+Date: Mon, 17 Oct 2022 11:51:56 +0800
+Subject: [PATCH 3/3] net: ethernet: mtk_eth_wed: add missing of_node_put()
+
+The device_node pointer returned by of_parse_phandle() with refcount
+incremented, when finish using it, the refcount need be decreased.
+
+Fixes: 804775dfc288 ("net: ethernet: mtk_eth_soc: add support for Wireless Ethernet Dispatch (WED)")
+Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+ drivers/net/ethernet/mediatek/mtk_wed.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/mediatek/mtk_wed.c
++++ b/drivers/net/ethernet/mediatek/mtk_wed.c
+@@ -1079,7 +1079,7 @@ void mtk_wed_add_hw(struct device_node *
+       pdev = of_find_device_by_node(np);
+       if (!pdev)
+-              return;
++              goto err_of_node_put;
+       get_device(&pdev->dev);
+       irq = platform_get_irq(pdev, 0);
+@@ -1139,6 +1139,8 @@ unlock:
+       mutex_unlock(&hw_lock);
+ err_put_device:
+       put_device(&pdev->dev);
++err_of_node_put:
++      of_node_put(np);
+ }
+ void mtk_wed_exit(void)
+@@ -1159,6 +1161,7 @@ void mtk_wed_exit(void)
+               hw_list[i] = NULL;
+               debugfs_remove(hw->debugfs_dir);
+               put_device(hw->dev);
++              of_node_put(hw->node);
+               kfree(hw);
+       }
+ }
index 670c2b04a8c249ad195f46bc627f834b6f45dfd4..3e1486962cbb8d72ad5873ad07a55b8eab517bd9 100644 (file)
@@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        }
  
        return IRQ_HANDLED;
-@@ -4114,6 +4114,8 @@ static int mtk_probe(struct platform_dev
+@@ -4118,6 +4118,8 @@ static int mtk_probe(struct platform_dev
         * for NAPI to work
         */
        init_dummy_netdev(&eth->dummy_dev);