diff options
author | Anton Bondarenko <anton.bondarenko.sama@gmail.com> | 2015-11-04 22:23:04 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2015-11-05 09:04:24 +0100 |
commit | 9956226fbbc6fda84dcd5298723ad4827b037c58 (patch) | |
tree | dcfb17cc53155a5658121d75261f822e3f667b0e /drivers | |
parent | a5c51acab4a9ec7f6cd0a4565e9f46fe579192bf (diff) | |
download | barebox-9956226fbbc6fda84dcd5298723ad4827b037c58.tar.gz barebox-9956226fbbc6fda84dcd5298723ad4827b037c58.tar.xz |
net: phy: wait for link OK after successfull autonegotiation
It may take some time for PHY to indicate link OK status after
autonegotiation completed. This change addresses this case
and prevent network commands fails due to the delay.
Signed-off-by: Anton Bondarenko <anton.bondarenko.sama@gmail.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/phy/phy.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 2b3c5e2e02..25c999c550 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -502,13 +502,16 @@ int phy_wait_aneg_done(struct phy_device *phydev) return 0; while (!is_timeout(start, PHY_AN_TIMEOUT * SECOND)) { - if (phy_aneg_done(phydev) > 0) { - phydev->link = 1; - return 0; - } + if (phy_aneg_done(phydev) > 0) + break; } - phydev->link = 0; + do { + genphy_update_link(phydev); + if (phydev->link == 1) + return 0; + } while (!is_timeout(start, PHY_AN_TIMEOUT * SECOND)); + return -ETIMEDOUT; } |