net: mdio: mvusb: Fix an error handling path in mvusb_mdio_probe()
authorChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Fri, 5 May 2023 18:39:33 +0000 (20:39 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 7 May 2023 13:59:02 +0000 (14:59 +0100)
Should of_mdiobus_register() fail, a previous usb_get_dev() call should be
undone as in the .disconnect function.

Fixes: 04e37d92fbed ("net: phy: add marvell usb to mdio controller")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/mdio/mdio-mvusb.c

index 68fc559..554837c 100644 (file)
@@ -67,6 +67,7 @@ static int mvusb_mdio_probe(struct usb_interface *interface,
        struct device *dev = &interface->dev;
        struct mvusb_mdio *mvusb;
        struct mii_bus *mdio;
+       int ret;
 
        mdio = devm_mdiobus_alloc_size(dev, sizeof(*mvusb));
        if (!mdio)
@@ -87,7 +88,15 @@ static int mvusb_mdio_probe(struct usb_interface *interface,
        mdio->write = mvusb_mdio_write;
 
        usb_set_intfdata(interface, mvusb);
-       return of_mdiobus_register(mdio, dev->of_node);
+       ret = of_mdiobus_register(mdio, dev->of_node);
+       if (ret)
+               goto put_dev;
+
+       return 0;
+
+put_dev:
+       usb_put_dev(mvusb->udev);
+       return ret;
 }
 
 static void mvusb_mdio_disconnect(struct usb_interface *interface)