[PATCH 06/10] net/farady: Helper functions to create or destroy MDIO interface
Joel Stanley
joel at jms.id.au
Thu Jun 30 23:49:42 AEST 2016
On Thu, Jun 30, 2016 at 7:57 PM, Gavin Shan <gwshan at linux.vnet.ibm.com> wrote:
> This introduces two helper functions to create or destroy MDIO
> interface. No logical changes introduced.
>
> Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>
> ---
> drivers/net/ethernet/faraday/ftgmac100.c | 93 ++++++++++++++++++++------------
> 1 file changed, 58 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
> index e7cf313..2c22f74 100644
> --- a/drivers/net/ethernet/faraday/ftgmac100.c
> +++ b/drivers/net/ethernet/faraday/ftgmac100.c
> @@ -1146,6 +1146,58 @@ static const struct net_device_ops ftgmac100_netdev_ops = {
> .ndo_do_ioctl = ftgmac100_do_ioctl,
> };
>
> +static int ftgmac100_setup_mdio(struct net_device *netdev)
> +{
> + struct ftgmac100 *priv = netdev_priv(netdev);
> + int i, err = 0;
> +
> + /* initialize mdio bus */
> + priv->mii_bus = mdiobus_alloc();
> + if (!priv->mii_bus)
> + return -EIO;
> +
> + priv->mii_bus->name = "ftgmac100_mdio";
> + snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "ftgmac100_mii");
If we have two ftgmac100 drivers loaded (such as on the ast2500-evb),
when the second goes to create the mdiobus kobject it will have the
same name. We need to make this name unique (or fix up the mdiobus
code).
You can see a backtrace here:
https://github.com/openbmc/linux/issues/87
> + priv->mii_bus->priv = priv->netdev;
> + priv->mii_bus->read = ftgmac100_mdiobus_read;
> + priv->mii_bus->write = ftgmac100_mdiobus_write;
> +
> + for (i = 0; i < PHY_MAX_ADDR; i++)
> + priv->mii_bus->irq[i] = PHY_POLL;
> +
> + err = mdiobus_register(priv->mii_bus);
> + if (err) {
> + dev_err(priv->dev, "Cannot register MDIO bus!\n");
> + goto err_register_mdiobus;
> + }
> +
> + err = ftgmac100_mii_probe(priv);
> + if (err) {
> + dev_err(priv->dev, "MII Probe failed!\n");
> + goto err_mii_probe;
> + }
> +
> + return 0;
> +
> +err_mii_probe:
> + mdiobus_unregister(priv->mii_bus);
> +err_register_mdiobus:
> + mdiobus_free(priv->mii_bus);
> + return err;
> +}
> +
> +static void ftgmac100_destroy_mdio(struct net_device *netdev)
> +{
> + struct ftgmac100 *priv = netdev_priv(netdev);
> +
> + if (!netdev->phydev)
> + return;
> +
> + phy_disconnect(netdev->phydev);
> + mdiobus_unregister(priv->mii_bus);
> + mdiobus_free(priv->mii_bus);
> +}
> +
> /******************************************************************************
> * struct platform_driver functions
> *****************************************************************************/
> @@ -1211,31 +1263,9 @@ static int ftgmac100_probe(struct platform_device *pdev)
>
> priv->irq = irq;
>
> - /* initialize mdio bus */
> - priv->mii_bus = mdiobus_alloc();
> - if (!priv->mii_bus) {
> - err = -EIO;
> - goto err_alloc_mdiobus;
> - }
> -
> - priv->mii_bus->name = "ftgmac100_mdio";
> - snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "ftgmac100_mii");
> -
> - priv->mii_bus->priv = netdev;
> - priv->mii_bus->read = ftgmac100_mdiobus_read;
> - priv->mii_bus->write = ftgmac100_mdiobus_write;
> -
> - err = mdiobus_register(priv->mii_bus);
> - if (err) {
> - dev_err(&pdev->dev, "Cannot register MDIO bus!\n");
> - goto err_register_mdiobus;
> - }
> -
> - err = ftgmac100_mii_probe(priv);
> - if (err) {
> - dev_err(&pdev->dev, "MII Probe failed!\n");
> - goto err_mii_probe;
> - }
> + err = ftgmac100_setup_mdio(netdev);
> + if (err)
> + goto err_setup_mdio;
>
> /* register network device */
> err = register_netdev(netdev);
> @@ -1255,12 +1285,8 @@ static int ftgmac100_probe(struct platform_device *pdev)
> return 0;
>
> err_register_netdev:
> - phy_disconnect(netdev->phydev);
> -err_mii_probe:
> - mdiobus_unregister(priv->mii_bus);
> -err_register_mdiobus:
> - mdiobus_free(priv->mii_bus);
> -err_alloc_mdiobus:
> + ftgmac100_destroy_mdio(netdev);
> +err_setup_mdio:
> iounmap(priv->base);
> err_ioremap:
> release_resource(priv->res);
> @@ -1280,10 +1306,7 @@ static int __exit ftgmac100_remove(struct platform_device *pdev)
> priv = netdev_priv(netdev);
>
> unregister_netdev(netdev);
> -
> - phy_disconnect(netdev->phydev);
> - mdiobus_unregister(priv->mii_bus);
> - mdiobus_free(priv->mii_bus);
> + ftgmac100_destroy_mdio(netdev);
>
> iounmap(priv->base);
> release_resource(priv->res);
> --
> 2.1.0
>
More information about the openbmc
mailing list