diff options
author | Wolfram Sang <w.sang@pengutronix.de> | 2012-03-21 12:18:45 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-03-23 08:23:11 +0100 |
commit | 6cbecc4163b460e44ebb810fafdd496a7c3c5b5a (patch) | |
tree | a811a56ba17e3af320b35771570cb5386fdfd2bc /drivers/net | |
parent | b7c9126750a2cea7173af170de1093e1c7b2651a (diff) | |
download | barebox-6cbecc4163b460e44ebb810fafdd496a7c3c5b5a.tar.gz barebox-6cbecc4163b460e44ebb810fafdd496a7c3c5b5a.tar.xz |
net: miidev: properly check for MII reset
Wait until the reset bit is actually cleared instead of some
arbitrary delay (which caused problems with a PHY which was in some
energy saving mode).
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/miidev.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/net/miidev.c b/drivers/net/miidev.c index 16a3461d45..3b73133201 100644 --- a/drivers/net/miidev.c +++ b/drivers/net/miidev.c @@ -31,19 +31,26 @@ int miidev_restart_aneg(struct mii_device *mdev) { int status, timeout; + uint64_t start; - /* - * Reset PHY, then delay 300ns - */ status = mii_write(mdev, mdev->address, MII_BMCR, BMCR_RESET); if (status) return status; + start = get_time_ns(); + do { + status = mii_read(mdev, mdev->address, MII_BMCR); + if (status < 0) + return status; + + if (is_timeout(start, SECOND)) + return -ETIMEDOUT; + + } while (status & BMCR_RESET); + if (mdev->flags & MIIDEV_FORCE_LINK) return 0; - udelay(1000); - if (mdev->flags & MIIDEV_FORCE_10) { printf("Forcing 10 Mbps ethernet link... "); |