The auto negotiation result is the intersect of the advertised abilities and the link partner abilities. Signed-off-by: Johannes Stezenbach <js@xxxxxxxxx> --- drivers/net/miidev.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/net/miidev.c b/drivers/net/miidev.c index f47fc9e..272234e 100644 --- a/drivers/net/miidev.c +++ b/drivers/net/miidev.c @@ -123,6 +123,7 @@ int miidev_wait_aneg(struct mii_device *mdev) int miidev_get_status(struct mii_device *mdev) { + int ret, status, adv, lpa; int ret, status; ret = mii_read(mdev, mdev->address, MII_BMSR); @@ -136,13 +137,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 : -- 1.7.10.4 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox