]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/macb.c
phylib: move to dynamic allocation of struct mii_bus
[linux-2.6-omap-h63xx.git] / drivers / net / macb.c
index 045361fe3d6abedb0a29f0f4a7ed04be7261da4f..01f7a31bac764134f623352a3894456c7192b205 100644 (file)
@@ -195,8 +195,8 @@ static int macb_mii_probe(struct net_device *dev)
 
        /* find the first phy */
        for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) {
-               if (bp->mii_bus.phy_map[phy_addr]) {
-                       phydev = bp->mii_bus.phy_map[phy_addr];
+               if (bp->mii_bus->phy_map[phy_addr]) {
+                       phydev = bp->mii_bus->phy_map[phy_addr];
                        break;
                }
        }
@@ -244,30 +244,36 @@ static int macb_mii_init(struct macb *bp)
        /* Enable managment port */
        macb_writel(bp, NCR, MACB_BIT(MPE));
 
-       bp->mii_bus.name = "MACB_mii_bus";
-       bp->mii_bus.read = &macb_mdio_read;
-       bp->mii_bus.write = &macb_mdio_write;
-       bp->mii_bus.reset = &macb_mdio_reset;
-       snprintf(bp->mii_bus.id, MII_BUS_ID_SIZE, "%x", bp->pdev->id);
-       bp->mii_bus.priv = bp;
-       bp->mii_bus.parent = &bp->dev->dev;
+       bp->mii_bus = mdiobus_alloc();
+       if (bp->mii_bus == NULL) {
+               err = -ENOMEM;
+               goto err_out;
+       }
+
+       bp->mii_bus->name = "MACB_mii_bus";
+       bp->mii_bus->read = &macb_mdio_read;
+       bp->mii_bus->write = &macb_mdio_write;
+       bp->mii_bus->reset = &macb_mdio_reset;
+       snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%x", bp->pdev->id);
+       bp->mii_bus->priv = bp;
+       bp->mii_bus->parent = &bp->dev->dev;
        pdata = bp->pdev->dev.platform_data;
 
        if (pdata)
-               bp->mii_bus.phy_mask = pdata->phy_mask;
+               bp->mii_bus->phy_mask = pdata->phy_mask;
 
-       bp->mii_bus.irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
-       if (!bp->mii_bus.irq) {
+       bp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
+       if (!bp->mii_bus->irq) {
                err = -ENOMEM;
-               goto err_out;
+               goto err_out_free_mdiobus;
        }
 
        for (i = 0; i < PHY_MAX_ADDR; i++)
-               bp->mii_bus.irq[i] = PHY_POLL;
+               bp->mii_bus->irq[i] = PHY_POLL;
 
-       platform_set_drvdata(bp->dev, &bp->mii_bus);
+       platform_set_drvdata(bp->dev, bp->mii_bus);
 
-       if (mdiobus_register(&bp->mii_bus))
+       if (mdiobus_register(bp->mii_bus))
                goto err_out_free_mdio_irq;
 
        if (macb_mii_probe(bp->dev) != 0) {
@@ -277,9 +283,11 @@ static int macb_mii_init(struct macb *bp)
        return 0;
 
 err_out_unregister_bus:
-       mdiobus_unregister(&bp->mii_bus);
+       mdiobus_unregister(bp->mii_bus);
 err_out_free_mdio_irq:
-       kfree(bp->mii_bus.irq);
+       kfree(bp->mii_bus->irq);
+err_out_free_mdiobus:
+       mdiobus_free(bp->mii_bus);
 err_out:
        return err;
 }
@@ -1261,8 +1269,9 @@ static int __exit macb_remove(struct platform_device *pdev)
                bp = netdev_priv(dev);
                if (bp->phy_dev)
                        phy_disconnect(bp->phy_dev);
-               mdiobus_unregister(&bp->mii_bus);
-               kfree(bp->mii_bus.irq);
+               mdiobus_unregister(bp->mii_bus);
+               kfree(bp->mii_bus->irq);
+               mdiobus_free(bp->mii_bus);
                unregister_netdev(dev);
                free_irq(dev->irq, dev);
                iounmap(bp->regs);