net: mdiobus: fwnode_mdiobus_register_phy() rework error handling
authorOleksij Rempel <o.rempel@pengutronix.de>
Mon, 3 Oct 2022 06:51:58 +0000 (08:51 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 4 Oct 2022 00:33:56 +0000 (17:33 -0700)
Rework error handling as preparation for PSE patch. This patch should
make it easier to extend this function.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/mdio/fwnode_mdio.c

index 1c1584fca63277a0d6b286e055a72678fa9677fd..7ff7349a27a2fa17af3149edecf333069dc1284d 100644 (file)
@@ -110,8 +110,8 @@ int fwnode_mdiobus_register_phy(struct mii_bus *bus,
        else
                phy = phy_device_create(bus, addr, phy_id, 0, NULL);
        if (IS_ERR(phy)) {
-               unregister_mii_timestamper(mii_ts);
-               return PTR_ERR(phy);
+               rc = PTR_ERR(phy);
+               goto clean_mii_ts;
        }
 
        if (is_acpi_node(child)) {
@@ -125,17 +125,13 @@ int fwnode_mdiobus_register_phy(struct mii_bus *bus,
                /* All data is now stored in the phy struct, so register it */
                rc = phy_device_register(phy);
                if (rc) {
-                       phy_device_free(phy);
                        fwnode_handle_put(phy->mdio.dev.fwnode);
-                       return rc;
+                       goto clean_phy;
                }
        } else if (is_of_node(child)) {
                rc = fwnode_mdiobus_phy_device_register(bus, phy, child, addr);
-               if (rc) {
-                       unregister_mii_timestamper(mii_ts);
-                       phy_device_free(phy);
-                       return rc;
-               }
+               if (rc)
+                       goto clean_phy;
        }
 
        /* phy->mii_ts may already be defined by the PHY driver. A
@@ -145,5 +141,12 @@ int fwnode_mdiobus_register_phy(struct mii_bus *bus,
        if (mii_ts)
                phy->mii_ts = mii_ts;
        return 0;
+
+clean_phy:
+       phy_device_free(phy);
+clean_mii_ts:
+       unregister_mii_timestamper(mii_ts);
+
+       return rc;
 }
 EXPORT_SYMBOL(fwnode_mdiobus_register_phy);