diff options
author | Trent Piepho <tpiepho@freescale.com> | 2008-10-30 21:17:07 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-10-31 00:59:53 -0400 |
commit | bdb59f949d663b7e943fb5f40b2557af4314abf9 (patch) | |
tree | c9ddebc19917166f27471cc1994aa19c80b72773 /drivers/net/gianfar.c | |
parent | c132419e560a2ecd3c8cf77f9c37e103e74b3754 (diff) |
gianfar: Don't reset TBI<->SerDes link if it's already up
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>
Diffstat (limited to 'drivers/net/gianfar.c')
-rw-r--r-- | drivers/net/gianfar.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 249541a1814b..83a5cb6aa23b 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
@@ -591,6 +591,14 @@ static void gfar_configure_serdes(struct net_device *dev) | |||
591 | if (bus) | 591 | if (bus) |
592 | mutex_lock(&bus->mdio_lock); | 592 | mutex_lock(&bus->mdio_lock); |
593 | 593 | ||
594 | /* If the link is already up, we must already be ok, and don't need to | ||
595 | * configure and reset the TBI<->SerDes link. Maybe U-Boot configured | ||
596 | * everything for us? Resetting it takes the link down and requires | ||
597 | * several seconds for it to come back. | ||
598 | */ | ||
599 | if (gfar_local_mdio_read(regs, tbipa, MII_BMSR) & BMSR_LSTATUS) | ||
600 | goto done; | ||
601 | |||
594 | /* Single clk mode, mii mode off(for serdes communication) */ | 602 | /* Single clk mode, mii mode off(for serdes communication) */ |
595 | gfar_local_mdio_write(regs, tbipa, MII_TBICON, TBICON_CLK_SELECT); | 603 | gfar_local_mdio_write(regs, tbipa, MII_TBICON, TBICON_CLK_SELECT); |
596 | 604 | ||
@@ -601,6 +609,7 @@ static void gfar_configure_serdes(struct net_device *dev) | |||
601 | gfar_local_mdio_write(regs, tbipa, MII_BMCR, BMCR_ANENABLE | | 609 | gfar_local_mdio_write(regs, tbipa, MII_BMCR, BMCR_ANENABLE | |
602 | BMCR_ANRESTART | BMCR_FULLDPLX | BMCR_SPEED1000); | 610 | BMCR_ANRESTART | BMCR_FULLDPLX | BMCR_SPEED1000); |
603 | 611 | ||
612 | done: | ||
604 | if (bus) | 613 | if (bus) |
605 | mutex_unlock(&bus->mdio_lock); | 614 | mutex_unlock(&bus->mdio_lock); |
606 | } | 615 | } |