diff options
author | Johannes Stezenbach <js@sig21.net> | 2012-06-18 16:47:55 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-06-30 13:58:14 +0200 |
commit | 467d9d9ceefc7d718b89a90c0d843b80e8489c50 (patch) | |
tree | 151ef3422b8f5dc16b3bb216e6ad162ea9e9bafe /drivers | |
parent | a6e358b2f5b219fda18a7bc9348cb969043c19d5 (diff) | |
download | barebox-467d9d9ceefc7d718b89a90c0d843b80e8489c50.tar.gz barebox-467d9d9ceefc7d718b89a90c0d843b80e8489c50.tar.xz |
miidev: fix auto negotiation
The auto negotiation result is the intersect
of the advertised abilities and the link partner abilities.
Signed-off-by: Johannes Stezenbach <js@sig21.net>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/miidev.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/net/miidev.c b/drivers/net/miidev.c index f47fc9e65b..e0757f1e35 100644 --- a/drivers/net/miidev.c +++ b/drivers/net/miidev.c @@ -123,7 +123,7 @@ int miidev_wait_aneg(struct mii_device *mdev) int miidev_get_status(struct mii_device *mdev) { - int ret, status; + int ret, status, adv, lpa; ret = mii_read(mdev, mdev->address, MII_BMSR); if (ret < 0) @@ -136,13 +136,16 @@ int miidev_get_status(struct mii_device *mdev) goto err_out; if (ret & BMCR_ANENABLE) { - ret = mii_read(mdev, mdev->address, MII_LPA); - if (ret < 0) + lpa = mii_read(mdev, mdev->address, MII_LPA); + if (lpa < 0) goto err_out; - - status |= ret & LPA_DUPLEX ? MIIDEV_STATUS_IS_FULL_DUPLEX : 0; - status |= ret & LPA_100 ? MIIDEV_STATUS_IS_100MBIT : - MIIDEV_STATUS_IS_10MBIT; + adv = mii_read(mdev, mdev->address, MII_ADVERTISE); + if (adv < 0) + goto err_out; + lpa &= adv; + status |= lpa & LPA_DUPLEX ? MIIDEV_STATUS_IS_FULL_DUPLEX : 0; + status |= lpa & LPA_100 ? MIIDEV_STATUS_IS_100MBIT : + MIIDEV_STATUS_IS_10MBIT; } else { status |= ret & BMCR_FULLDPLX ? MIIDEV_STATUS_IS_FULL_DUPLEX : 0; status |= ret & BMCR_SPEED100 ? MIIDEV_STATUS_IS_100MBIT : |