gianfar: Don't reset TBI<->SerDes link if it's already up
authorTrent Piepho <tpiepho@freescale.com>
Fri, 31 Oct 2008 01:17:07 +0000 (18:17 -0700)
committerJeff Garzik <jgarzik@redhat.com>
Fri, 31 Oct 2008 04:59:53 +0000 (00:59 -0400)
The link may be up already via the chip's reset strapping, or though action
of U-Boot, or from the last time the interface was brought up.  Resetting
the link causes it to go down for several seconds.  This can significantly
increase the time from power-on to DHCP completion and a device being
accessible to the network.

Signed-off-by: Trent Piepho <tpiepho@freescale.com>
Acked-by: Andy Fleming <afleming@freescale.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/net/gianfar.c

index 249541a1814b6823e98b079b6b0ae061723aa3bf..83a5cb6aa23b1fc5c4426a9863303be6bb10dad3 100644 (file)
@@ -591,6 +591,14 @@ static void gfar_configure_serdes(struct net_device *dev)
        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);
 
@@ -601,6 +609,7 @@ 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);
 }