diff options
Diffstat (limited to 'drivers/net/usb/asix_devices.c')
| -rw-r--r-- | drivers/net/usb/asix_devices.c | 32 | 
1 files changed, 27 insertions, 5 deletions
diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c index 743cbf5d662c..f7cff58fe044 100644 --- a/drivers/net/usb/asix_devices.c +++ b/drivers/net/usb/asix_devices.c @@ -666,8 +666,9 @@ static int asix_resume(struct usb_interface *intf)  static int ax88772_init_mdio(struct usbnet *dev)  {  	struct asix_common_private *priv = dev->driver_priv; +	int ret; -	priv->mdio = devm_mdiobus_alloc(&dev->udev->dev); +	priv->mdio = mdiobus_alloc();  	if (!priv->mdio)  		return -ENOMEM; @@ -679,7 +680,20 @@ static int ax88772_init_mdio(struct usbnet *dev)  	snprintf(priv->mdio->id, MII_BUS_ID_SIZE, "usb-%03d:%03d",  		 dev->udev->bus->busnum, dev->udev->devnum); -	return devm_mdiobus_register(&dev->udev->dev, priv->mdio); +	ret = mdiobus_register(priv->mdio); +	if (ret) { +		netdev_err(dev->net, "Could not register MDIO bus (err %d)\n", ret); +		mdiobus_free(priv->mdio); +		priv->mdio = NULL; +	} + +	return ret; +} + +static void ax88772_mdio_unregister(struct asix_common_private *priv) +{ +	mdiobus_unregister(priv->mdio); +	mdiobus_free(priv->mdio);  }  static int ax88772_init_phy(struct usbnet *dev) @@ -896,16 +910,23 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)  	ret = ax88772_init_mdio(dev);  	if (ret) -		return ret; +		goto mdio_err;  	ret = ax88772_phylink_setup(dev);  	if (ret) -		return ret; +		goto phylink_err;  	ret = ax88772_init_phy(dev);  	if (ret) -		phylink_destroy(priv->phylink); +		goto initphy_err; +	return 0; + +initphy_err: +	phylink_destroy(priv->phylink); +phylink_err: +	ax88772_mdio_unregister(priv); +mdio_err:  	return ret;  } @@ -926,6 +947,7 @@ static void ax88772_unbind(struct usbnet *dev, struct usb_interface *intf)  	phylink_disconnect_phy(priv->phylink);  	rtnl_unlock();  	phylink_destroy(priv->phylink); +	ax88772_mdio_unregister(priv);  	asix_rx_fixup_common_free(dev->driver_priv);  }  |