Don't wait for disconnected TSECs
PATCH 1/1 Don't wait for disconnected TSECs
The TSEC driver's PHY code waits a long time for autonegotiation to complete, even if the link is down. The PHY knows the link is down or up before autonegotiation completes, so we can short-circuit the process if the link is down.
Signed-off-by Andy Fleming <[email protected]>
--- drivers/tsec.c | 30 +++++++++++++++++------------- 1 files changed, 17 insertions(+), 13 deletions(-)
drivers/tsec.c +17 -13
@@ -347,17 +347,16 @@ uint mii_cr_init(uint mii_reg, struct tsec_private * priv)uint mii_parse_sr (uint mii_reg,struct tsec_private * priv) {/* -* Wait if PHY is capable of autonegotiation and autonegotiation -* is not complete. +* Wait if the link is up, and autonegotiation is in progress +* (ie - we're capable and it's not done) */ mii_reg =read_phy_reg (priv,MIIM_STATUS ); -if ((mii_reg &PHY_BMSR_AUTN_ABLE ) +if ((mii_reg &MIIM_STATUS_LINK ) && (mii_reg &PHY_BMSR_AUTN_ABLE ) && !(mii_reg &PHY_BMSR_AUTN_COMP )) {int i =0 ;puts ("Waiting for PHY auto negotiation to complete" ); -while (!((mii_reg &PHY_BMSR_AUTN_COMP ) - && (mii_reg &MIIM_STATUS_LINK ))) { +while (!(mii_reg &PHY_BMSR_AUTN_COMP )) {/* * Timeout reached ? */
@@ -377,7 +376,10 @@ uint mii_parse_sr(uint mii_reg, struct tsec_private * priv) priv->link =1 ;udelay (500000 );/* another 500 ms (results in faster booting) */ }else { - priv->link =1 ; +if (mii_reg &MIIM_STATUS_LINK ) + priv->link =1 ; +else + priv->link =0 ; }return 0 ;
@@ -517,16 +519,13 @@ uint mii_parse_88E1011_psr(uint mii_reg, struct tsec_private * priv) mii_reg =read_phy_reg (priv,MIIM_88E1011_PHY_STATUS ); -if (!((mii_reg &MIIM_88E1011_PHYSTAT_SPDDONE ) && - (mii_reg &MIIM_88E1011_PHYSTAT_LINK ))) { +if ((mii_reg &MIIM_88E1011_PHYSTAT_LINK ) && + !(mii_reg &MIIM_88E1011_PHYSTAT_SPDDONE )) {int i =0 ;puts ("Waiting for PHY realtime link" ); -while (!((mii_reg &MIIM_88E1011_PHYSTAT_SPDDONE ) && - (mii_reg &MIIM_88E1011_PHYSTAT_LINK ))) { -/* -* Timeout reached ? -*/ +while (!(mii_reg &MIIM_88E1011_PHYSTAT_SPDDONE )) { +/* Timeout reached ? */ if (i >PHY_AUTONEGOTIATE_TIMEOUT ) {puts (" TIMEOUT !\n" ); priv->link =0 ;
@@ -541,6 +540,11 @@ uint mii_parse_88E1011_psr(uint mii_reg, struct tsec_private * priv) }puts (" done\n" );udelay (500000 );/* another 500 ms (results in faster booting) */ + }else { +if (mii_reg &MIIM_88E1011_PHYSTAT_LINK ) + priv->link =1 ; +else + priv->link =0 ; }if (mii_reg &MIIM_88E1011_PHYSTAT_DUPLEX )
Signature · 1 line
1.5.0.2.230.gfbe3d-dirty
Wolfgang Denk
AppliedPATCH 1/1 Don't wait for disconnected TSECs
Quoted 6 lines · In message <[email protected]> you wrote:
The TSEC driver's PHY code waits a long time for autonegotiation to complete, even if the link is down. The PHY knows the link is down or up before autonegotiation completes, so we can short-circuit the process if the link is down.
Signed-off-by Andy Fleming <[email protected]>
Applied. Thanks.
Best regards,
Wolfgang Denk
Signature · 5 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de "Don't worry about people stealing your ideas. If your ideas are any good, you'll have to ram them down people's throats." - Howard Aiken