|
@@ -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
|
|
|
*****************************************************************************/
|
|
@@ -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);
|
|
@@ -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);
|
|
@@ -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);
|