summaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorAnton Bondarenko <anton.bondarenko.sama@gmail.com>2015-11-04 22:23:04 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2015-11-05 09:04:24 +0100
commit9956226fbbc6fda84dcd5298723ad4827b037c58 (patch)
treedcfb17cc53155a5658121d75261f822e3f667b0e /drivers/net
parenta5c51acab4a9ec7f6cd0a4565e9f46fe579192bf (diff)
downloadbarebox-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/net')
-rw-r--r--drivers/net/phy/phy.c13
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;
}