|
@@ -591,6 +591,14 @@ static void gfar_configure_serdes(struct net_device *dev)
|
|
if (bus)
|
|
if (bus)
|
|
mutex_lock(&bus->mdio_lock);
|
|
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) */
|
|
/* Single clk mode, mii mode off(for serdes communication) */
|
|
gfar_local_mdio_write(regs, tbipa, MII_TBICON, TBICON_CLK_SELECT);
|
|
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 |
|
|
gfar_local_mdio_write(regs, tbipa, MII_BMCR, BMCR_ANENABLE |
|
|
BMCR_ANRESTART | BMCR_FULLDPLX | BMCR_SPEED1000);
|
|
BMCR_ANRESTART | BMCR_FULLDPLX | BMCR_SPEED1000);
|
|
|
|
|
|
|
|
+ done:
|
|
if (bus)
|
|
if (bus)
|
|
mutex_unlock(&bus->mdio_lock);
|
|
mutex_unlock(&bus->mdio_lock);
|
|
}
|
|
}
|