]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/gianfar.c
net: struct device - replace bus_id with dev_name(), dev_set_name()
[linux-2.6-omap-h63xx.git] / drivers / net / gianfar.c
index b5bb7ae2817fe3ec86f381a5afc42952bba795f0..451f6b8b6163e891b61d0a6ce12b23c0f1dd287b 100644 (file)
@@ -161,8 +161,7 @@ static int gfar_probe(struct platform_device *pdev)
        struct gfar_private *priv = NULL;
        struct gianfar_platform_data *einfo;
        struct resource *r;
-       int err = 0;
-       DECLARE_MAC_BUF(mac);
+       int err = 0, irq;
 
        einfo = (struct gianfar_platform_data *) pdev->dev.platform_data;
 
@@ -187,15 +186,25 @@ static int gfar_probe(struct platform_device *pdev)
 
        /* fill out IRQ fields */
        if (einfo->device_flags & FSL_GIANFAR_DEV_HAS_MULTI_INTR) {
-               priv->interruptTransmit = platform_get_irq_byname(pdev, "tx");
-               priv->interruptReceive = platform_get_irq_byname(pdev, "rx");
-               priv->interruptError = platform_get_irq_byname(pdev, "error");
-               if (priv->interruptTransmit < 0 || priv->interruptReceive < 0 || priv->interruptError < 0)
+               irq = platform_get_irq_byname(pdev, "tx");
+               if (irq < 0)
+                       goto regs_fail;
+               priv->interruptTransmit = irq;
+
+               irq = platform_get_irq_byname(pdev, "rx");
+               if (irq < 0)
+                       goto regs_fail;
+               priv->interruptReceive = irq;
+
+               irq = platform_get_irq_byname(pdev, "error");
+               if (irq < 0)
                        goto regs_fail;
+               priv->interruptError = irq;
        } else {
-               priv->interruptTransmit = platform_get_irq(pdev, 0);
-               if (priv->interruptTransmit < 0)
+               irq = platform_get_irq(pdev, 0);
+               if (irq < 0)
                        goto regs_fail;
+               priv->interruptTransmit = irq;
        }
 
        /* get a pointer to the register memory */
@@ -354,8 +363,7 @@ static int gfar_probe(struct platform_device *pdev)
        gfar_init_sysfs(dev);
 
        /* Print out the device info */
-       printk(KERN_INFO DEVICE_NAME "%s\n",
-              dev->name, print_mac(mac, dev->dev_addr));
+       printk(KERN_INFO DEVICE_NAME "%pM\n", dev->name, dev->dev_addr);
 
        /* Even more device info helps when determining which kernel */
        /* provided which set of benchmarks. */
@@ -538,7 +546,7 @@ static int init_phy(struct net_device *dev)
        priv->oldspeed = 0;
        priv->oldduplex = -1;
 
-       snprintf(phy_id, BUS_ID_SIZE, PHY_ID_FMT, priv->einfo->bus_id, priv->einfo->phy_id);
+       snprintf(phy_id, sizeof(phy_id), PHY_ID_FMT, priv->einfo->bus_id, priv->einfo->phy_id);
 
        interface = gfar_get_interface(dev);
 
@@ -576,6 +584,18 @@ static void gfar_configure_serdes(struct net_device *dev)
        struct gfar_mii __iomem *regs =
                        (void __iomem *)&priv->regs->gfar_mii_regs;
        int tbipa = gfar_read(&priv->regs->tbipa);
+       struct mii_bus *bus = gfar_get_miibus(priv);
+
+       if (bus)
+               mutex_lock(&bus->mdio_lock);
+
+       /* If the link is already up, we must already be ok, and don't need to
+        * configure and reset the TBI<->SerDes link.  Maybe U-Boot configured
+        * everything for us?  Resetting it takes the link down and requires
+        * several seconds for it to come back.
+        */
+       if (gfar_local_mdio_read(regs, tbipa, MII_BMSR) & BMSR_LSTATUS)
+               goto done;
 
        /* Single clk mode, mii mode off(for serdes communication) */
        gfar_local_mdio_write(regs, tbipa, MII_TBICON, TBICON_CLK_SELECT);
@@ -586,6 +606,10 @@ static void gfar_configure_serdes(struct net_device *dev)
 
        gfar_local_mdio_write(regs, tbipa, MII_BMCR, BMCR_ANENABLE |
                        BMCR_ANRESTART | BMCR_FULLDPLX | BMCR_SPEED1000);
+
+       done:
+       if (bus)
+               mutex_unlock(&bus->mdio_lock);
 }
 
 static void init_registers(struct net_device *dev)
@@ -1669,8 +1693,6 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit)
                        dev->stats.rx_bytes += pkt_len;
                }
 
-               dev->last_rx = jiffies;
-
                priv->rx_skbuff[priv->skb_currx] = newskb;
 
                /* Setup the new bdp */