Commit eb418184 authored by Gavin Shan's avatar Gavin Shan Committed by David S. Miller

net/faraday: Helper functions to create or destroy MDIO interface

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: default avatarGavin Shan <gwshan@linux.vnet.ibm.com>
Acked-by: default avatarJoel Stanley <joel@jms.id.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7a82ecf4
...@@ -1146,6 +1146,60 @@ static const struct net_device_ops ftgmac100_netdev_ops = { ...@@ -1146,6 +1146,60 @@ static const struct net_device_ops ftgmac100_netdev_ops = {
.ndo_do_ioctl = ftgmac100_do_ioctl, .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 * struct platform_driver functions
*****************************************************************************/ *****************************************************************************/
...@@ -1211,31 +1265,9 @@ static int ftgmac100_probe(struct platform_device *pdev) ...@@ -1211,31 +1265,9 @@ static int ftgmac100_probe(struct platform_device *pdev)
priv->irq = irq; priv->irq = irq;
/* initialize mdio bus */ err = ftgmac100_setup_mdio(netdev);
priv->mii_bus = mdiobus_alloc(); if (err)
if (!priv->mii_bus) { goto err_setup_mdio;
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;
}
/* register network device */ /* register network device */
err = register_netdev(netdev); err = register_netdev(netdev);
...@@ -1255,12 +1287,8 @@ static int ftgmac100_probe(struct platform_device *pdev) ...@@ -1255,12 +1287,8 @@ static int ftgmac100_probe(struct platform_device *pdev)
return 0; return 0;
err_register_netdev: err_register_netdev:
phy_disconnect(netdev->phydev); ftgmac100_destroy_mdio(netdev);
err_mii_probe: err_setup_mdio:
mdiobus_unregister(priv->mii_bus);
err_register_mdiobus:
mdiobus_free(priv->mii_bus);
err_alloc_mdiobus:
iounmap(priv->base); iounmap(priv->base);
err_ioremap: err_ioremap:
release_resource(priv->res); release_resource(priv->res);
...@@ -1280,10 +1308,7 @@ static int __exit ftgmac100_remove(struct platform_device *pdev) ...@@ -1280,10 +1308,7 @@ static int __exit ftgmac100_remove(struct platform_device *pdev)
priv = netdev_priv(netdev); priv = netdev_priv(netdev);
unregister_netdev(netdev); unregister_netdev(netdev);
ftgmac100_destroy_mdio(netdev);
phy_disconnect(netdev->phydev);
mdiobus_unregister(priv->mii_bus);
mdiobus_free(priv->mii_bus);
iounmap(priv->base); iounmap(priv->base);
release_resource(priv->res); release_resource(priv->res);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment