Skip to content

Commit

Permalink
net/faraday: Helper functions to create or destroy MDIO interface
Browse files Browse the repository at this point in the history
This introduces two helper functions to create or destroy MDIO
interface. No logical changes introduced except the proper MDIO
names are given when having more than one MDIO bus.

Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Acked-by: Joel Stanley <joel@jms.id.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Gavin Shan authored and David S. Miller committed Jul 20, 2016
1 parent 7a82ecf commit eb41818
Showing 1 changed file with 60 additions and 35 deletions.
95 changes: 60 additions & 35 deletions drivers/net/ethernet/faraday/ftgmac100.c
Original file line number Diff line number Diff line change
Expand Up @@ -1146,6 +1146,60 @@ 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);
struct platform_device *pdev = to_platform_device(priv->dev);
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, "%s-%d",
pdev->name, pdev->id);
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
*****************************************************************************/
Expand Down Expand Up @@ -1211,31 +1265,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);
Expand All @@ -1255,12 +1287,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);
Expand All @@ -1280,10 +1308,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);
Expand Down

0 comments on commit eb41818

Please sign in to comment.