Message ID | 20221017035156.2497448-2-yangyingliang@huawei.com (mailing list archive) |
---|---|
State | Accepted |
Commit | b3d0d98179d62f9d55635a600679c4fa362baf8d |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: ethernet: mtk_eth_wed: fixe some leaks | expand |
Il 17/10/22 05:51, Yang Yingliang ha scritto: > 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> > --- > drivers/net/ethernet/mediatek/mtk_eth_soc.c | 17 ++++++++++++----- > 1 file changed, 12 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c > index 4fba7cb0144b..7cd381530aa4 100644 > --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c > +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c > @@ -4060,19 +4060,23 @@ static int mtk_probe(struct platform_device *pdev) > 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; > } > @@ -4083,7 +4087,7 @@ static int mtk_probe(struct platform_device *pdev) > > err = mtk_hw_init(eth); > if (err) > - return err; > + goto err_wed_exit; > > eth->hwlro = MTK_HAS_CAPS(eth->soc->caps, MTK_HWLRO); > > @@ -4179,6 +4183,8 @@ static int mtk_probe(struct platform_device *pdev) > mtk_free_dev(eth); > err_deinit_hw: > mtk_hw_deinit(eth); > +err_wed_exit: > + mtk_wed_exit(); mtk_wed_add_hw() happens *only* if eth->soc->offload_version == true. To make this clean, mtk_wed_exit() should be called only if mtk_wed_add_hw() was ever called, so you have to add a check here. > > return err; > } > @@ -4198,6 +4204,7 @@ static int mtk_remove(struct platform_device *pdev) > phylink_disconnect_phy(mac->phylink); > } > > + mtk_wed_exit(); ...and here as well. Regards, Angelo > mtk_hw_deinit(eth); > > netif_napi_del(ð->tx_napi);
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c index 4fba7cb0144b..7cd381530aa4 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c @@ -4060,19 +4060,23 @@ static int mtk_probe(struct platform_device *pdev) 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; } @@ -4083,7 +4087,7 @@ static int mtk_probe(struct platform_device *pdev) err = mtk_hw_init(eth); if (err) - return err; + goto err_wed_exit; eth->hwlro = MTK_HAS_CAPS(eth->soc->caps, MTK_HWLRO); @@ -4179,6 +4183,8 @@ static int mtk_probe(struct platform_device *pdev) mtk_free_dev(eth); err_deinit_hw: mtk_hw_deinit(eth); +err_wed_exit: + mtk_wed_exit(); return err; } @@ -4198,6 +4204,7 @@ static int mtk_remove(struct platform_device *pdev) phylink_disconnect_phy(mac->phylink); } + mtk_wed_exit(); mtk_hw_deinit(eth); netif_napi_del(ð->tx_napi);
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> --- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)