summaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorWolfram Sang <w.sang@pengutronix.de>2012-03-21 12:18:45 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2012-03-23 08:23:11 +0100
commit6cbecc4163b460e44ebb810fafdd496a7c3c5b5a (patch)
treea811a56ba17e3af320b35771570cb5386fdfd2bc /drivers/net
parentb7c9126750a2cea7173af170de1093e1c7b2651a (diff)
downloadbarebox-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.c17
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... ");