]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/mv643xx_eth.c
Merge git://git.infradead.org/mtd-2.6
[linux-2.6-omap-h63xx.git] / drivers / net / mv643xx_eth.c
index 63400815448005074f06a462c13609a0193038f5..b9dcdbd369f87b87e5e9e12650e50d7ada6d9465 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/init.h>
 #include <linux/dma-mapping.h>
 #include <linux/in.h>
+#include <linux/ip.h>
 #include <linux/tcp.h>
 #include <linux/udp.h>
 #include <linux/etherdevice.h>
@@ -250,7 +251,7 @@ struct mv643xx_eth_shared_private {
        /*
         * Provides access to local SMI interface.
         */
-       struct mii_bus smi_bus;
+       struct mii_bus *smi_bus;
 
        /*
         * If we have access to the error interrupt pin (which is
@@ -1065,9 +1066,12 @@ static int smi_wait_ready(struct mv643xx_eth_shared_private *msp)
                return 0;
        }
 
-       if (!wait_event_timeout(msp->smi_busy_wait, smi_is_done(msp),
-                               msecs_to_jiffies(100)))
-               return -ETIMEDOUT;
+       if (!smi_is_done(msp)) {
+               wait_event_timeout(msp->smi_busy_wait, smi_is_done(msp),
+                                  msecs_to_jiffies(100));
+               if (!smi_is_done(msp))
+                       return -ETIMEDOUT;
+       }
 
        return 0;
 }
@@ -2363,15 +2367,19 @@ static int mv643xx_eth_shared_probe(struct platform_device *pdev)
         * Set up and register SMI bus.
         */
        if (pd == NULL || pd->shared_smi == NULL) {
-               msp->smi_bus.priv = msp;
-               msp->smi_bus.name = "mv643xx_eth smi";
-               msp->smi_bus.read = smi_bus_read;
-               msp->smi_bus.write = smi_bus_write,
-               snprintf(msp->smi_bus.id, MII_BUS_ID_SIZE, "%d", pdev->id);
-               msp->smi_bus.parent = &pdev->dev;
-               msp->smi_bus.phy_mask = 0xffffffff;
-               if (mdiobus_register(&msp->smi_bus) < 0)
+               msp->smi_bus = mdiobus_alloc();
+               if (msp->smi_bus == NULL)
                        goto out_unmap;
+
+               msp->smi_bus->priv = msp;
+               msp->smi_bus->name = "mv643xx_eth smi";
+               msp->smi_bus->read = smi_bus_read;
+               msp->smi_bus->write = smi_bus_write,
+               snprintf(msp->smi_bus->id, MII_BUS_ID_SIZE, "%d", pdev->id);
+               msp->smi_bus->parent = &pdev->dev;
+               msp->smi_bus->phy_mask = 0xffffffff;
+               if (mdiobus_register(msp->smi_bus) < 0)
+                       goto out_free_mii_bus;
                msp->smi = msp;
        } else {
                msp->smi = platform_get_drvdata(pd->shared_smi);
@@ -2411,6 +2419,8 @@ static int mv643xx_eth_shared_probe(struct platform_device *pdev)
 
        return 0;
 
+out_free_mii_bus:
+       mdiobus_free(msp->smi_bus);
 out_unmap:
        iounmap(msp->base);
 out_free:
@@ -2424,8 +2434,10 @@ static int mv643xx_eth_shared_remove(struct platform_device *pdev)
        struct mv643xx_eth_shared_private *msp = platform_get_drvdata(pdev);
        struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data;
 
-       if (pd == NULL || pd->shared_smi == NULL)
-               mdiobus_unregister(&msp->smi_bus);
+       if (pd == NULL || pd->shared_smi == NULL) {
+               mdiobus_free(msp->smi_bus);
+               mdiobus_unregister(msp->smi_bus);
+       }
        if (msp->err_interrupt != NO_IRQ)
                free_irq(msp->err_interrupt, msp);
        iounmap(msp->base);
@@ -2493,7 +2505,7 @@ static void set_params(struct mv643xx_eth_private *mp,
 static struct phy_device *phy_scan(struct mv643xx_eth_private *mp,
                                   int phy_addr)
 {
-       struct mii_bus *bus = &mp->shared->smi->smi_bus;
+       struct mii_bus *bus = mp->shared->smi->smi_bus;
        struct phy_device *phydev;
        int start;
        int num;