All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
To: Grant Grundler <grundler@chromium.org>
Cc: Oleksij Rempel <linux@rempel-privat.de>,
	Pavel Skripkin <paskripkin@gmail.com>,
	Lukas Wunner <lukas@wunner.de>,
	Eizan Miyamoto <eizan@chromium.org>,
	Jakub Kicinski <kuba@kernel.org>, netdev <netdev@vger.kernel.org>,
	"David S . Miller" <davem@davemloft.net>,
	LKML <linux-kernel@vger.kernel.org>,
	Anton Lundin <glance@acc.umu.se>
Subject: Re: [PATCHv4 net] net: asix: fix modprobe "sysfs: cannot create duplicate filename"
Date: Tue, 14 Mar 2023 14:22:37 +0100	[thread overview]
Message-ID: <ZBB1HR3ow/sGigFB@localhost.localdomain> (raw)
In-Reply-To: <20230314055410.3329480-1-grundler@chromium.org>

On Mon, Mar 13, 2023 at 10:54:10PM -0700, Grant Grundler wrote:
> "modprobe asix ; rmmod asix ; modprobe asix" fails with:
>    sysfs: cannot create duplicate filename \
>    	'/devices/virtual/mdio_bus/usb-003:004'
> 
> Issue was originally reported by Anton Lundin on 2022-06-22 (link below).
> 
> Chrome OS team hit the same issue in Feb, 2023 when trying to find
> work arounds for other issues with AX88172 devices.
> 
> The use of devm_mdiobus_register() with usbnet devices results in the
> MDIO data being associated with the USB device. When the asix driver
> is unloaded, the USB device continues to exist and the corresponding
> "mdiobus_unregister()" is NOT called until the USB device is unplugged
> or unauthorized. So the next "modprobe asix" will fail because the MDIO
> phy sysfs attributes still exist.
> 
> The 'easy' (from a design PoV) fix is to use the non-devm variants of
> mdiobus_* functions and explicitly manage this use in the asix_bind
> and asix_unbind function calls. I've not explored trying to fix usbnet
> initialization so devm_* stuff will work.
> 
> Fixes: e532a096be0e5 ("net: usb: asix: ax88772: add phylib support")
> Reported-by: Anton Lundin <glance@acc.umu.se>
> Link: https://lore.kernel.org/netdev/20220623063649.GD23685@pengutronix.de/T/
> Tested-by: Eizan Miyamoto <eizan@chromium.org>
> Signed-off-by: Grant Grundler <grundler@chromium.org>
> 
> ---
>  drivers/net/usb/asix_devices.c | 33 ++++++++++++++++++++++++++++-----
>  1 file changed, 28 insertions(+), 5 deletions(-)
> 
> V4: add mdio_unregister to ax88172_bind() error handling paths
> 
> V3: rebase against netdev/net.git
>     remove "TEST" prefix in subject line
>     added Link: tag for Reported-by tag
> 
> V2: moved mdiobus_get_phy() call back into ax88772_init_phy()
>    (Lukas Wunner is entirely correct this patch is much easier
>    to backport without this patch hunk.)
>    Added "Fixes:" tag per request from Florian Fainelli
> 
> diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c
> index 743cbf5d662c..b758010bab36 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);

Hi,

Patch looks good, one question, are the devm_mdiobus_alloc() and
devm_mdiobus_register functions used anywhere after removing? Maybe it
is worth to remove also the implementation if it isn't used.

Otherwise
Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>

> +	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)
> @@ -690,6 +704,7 @@ static int ax88772_init_phy(struct usbnet *dev)
>  	priv->phydev = mdiobus_get_phy(priv->mdio, priv->phy_addr);
>  	if (!priv->phydev) {
>  		netdev_err(dev->net, "Could not find PHY\n");
> +		ax88772_mdio_unregister(priv);
>  		return -ENODEV;
>  	}
>  
> @@ -896,16 +911,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 +948,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);
>  }
>  
> -- 
> 2.40.0.rc1.284.g88254d51c5-goog
> 

  reply	other threads:[~2023-03-14 13:26 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-14  5:54 [PATCHv4 net] net: asix: fix modprobe "sysfs: cannot create duplicate filename" Grant Grundler
2023-03-14 13:22 ` Michal Swiatkowski [this message]
2023-03-16  5:08 ` Jakub Kicinski
2023-03-17 17:58   ` Grant Grundler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZBB1HR3ow/sGigFB@localhost.localdomain \
    --to=michal.swiatkowski@linux.intel.com \
    --cc=davem@davemloft.net \
    --cc=eizan@chromium.org \
    --cc=glance@acc.umu.se \
    --cc=grundler@chromium.org \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@rempel-privat.de \
    --cc=lukas@wunner.de \
    --cc=netdev@vger.kernel.org \
    --cc=paskripkin@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.