Message ID | 20240823200433.7542-1-rosenp@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [PATCHv2,net-next] net: ag71xx: add missing reset_control_put | expand |
Hi Rosen, On Fri, Aug 23, 2024 at 01:04:18PM -0700, Rosen Penev wrote: > The original downstream driver used devm instead of of. The latter > requires reset_control_put to be called in all return paths. At the moment of upstreaming this code, the original driver used of_reset_control_get_exclusive() and was fixed by f92bbdcc93 ("ath79: ag71xx-mdio: get reset control using devm api") Why not port the original fix? Regards, Oleksij
On Fri, Aug 23, 2024 at 9:48 PM Oleksij Rempel <o.rempel@pengutronix.de> wrote: > > Hi Rosen, > > On Fri, Aug 23, 2024 at 01:04:18PM -0700, Rosen Penev wrote: > > The original downstream driver used devm instead of of. The latter > > requires reset_control_put to be called in all return paths. > > At the moment of upstreaming this code, the original driver used > of_reset_control_get_exclusive() and was fixed by f92bbdcc93 ("ath79: > ag71xx-mdio: get reset control using devm api") > > Why not port the original fix? On further review, this looks safe to do. Will submit tomorrow. > > Regards, > Oleksij > -- > Pengutronix e.K. | | > Steuerwalder Str. 21 | http://www.pengutronix.de/ | > 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | > Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
diff --git a/drivers/net/ethernet/atheros/ag71xx.c b/drivers/net/ethernet/atheros/ag71xx.c index 89cd001b385f..7fbe95108067 100644 --- a/drivers/net/ethernet/atheros/ag71xx.c +++ b/drivers/net/ethernet/atheros/ag71xx.c @@ -722,8 +722,10 @@ static int ag71xx_mdio_probe(struct ag71xx *ag) mnp = of_get_child_by_name(np, "mdio"); err = devm_of_mdiobus_register(dev, mii_bus, mnp); of_node_put(mnp); - if (err) + if (err) { + reset_control_put(ag->mdio_reset); return err; + } return 0; } @@ -1924,12 +1926,14 @@ static int ag71xx_probe(struct platform_device *pdev) err = ag71xx_phylink_setup(ag); if (err) { netif_err(ag, probe, ndev, "failed to setup phylink (%d)\n", err); + reset_control_put(ag->mdio_reset); return err; } err = devm_register_netdev(&pdev->dev, ndev); if (err) { netif_err(ag, probe, ndev, "unable to register net device\n"); + reset_control_put(ag->mdio_reset); platform_set_drvdata(pdev, NULL); return err; } @@ -1941,6 +1945,14 @@ static int ag71xx_probe(struct platform_device *pdev) return 0; } +static void ag71xx_remove(struct platform_device *pdev) +{ + struct net_device *ndev = platform_get_drvdata(pdev); + struct ag71xx *ag = ag = netdev_priv(ndev); + + reset_control_put(ag->mdio_reset); +} + static const u32 ar71xx_fifo_ar7100[] = { 0x0fff0000, 0x00001fff, 0x00780fff, }; @@ -2025,6 +2037,7 @@ static const struct of_device_id ag71xx_match[] = { static struct platform_driver ag71xx_driver = { .probe = ag71xx_probe, + .remove_new = ag71xx_remove, .driver = { .name = "ag71xx", .of_match_table = ag71xx_match,
The original downstream driver used devm instead of of. The latter requires reset_control_put to be called in all return paths. Signed-off-by: Rosen Penev <rosenp@gmail.com> --- v2: don't call after ag71xx_mdio_probe. Already done. drivers/net/ethernet/atheros/ag71xx.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)