diff mbox

[U-Boot] net: mii: check phy advertising register when geting link status

Message ID 1471871009-244894-1-git-send-email-lidongpo@hisilicon.com
State Accepted
Commit 8c83c0303c0eaa5f5323d08ffe1f786759e509be
Delegated to: Joe Hershberger
Headers show

Commit Message

Dongpo Li Aug. 22, 2016, 1:03 p.m. UTC
When phy autoneg on, the link speed and duplex should be
determined by phy advertising register and
phy link partner ability register.
Check phy advertising register when geting phy link speed and
duplex if autoneg on.

Signed-off-by: Dongpo Li <lidongpo@hisilicon.com>
Cc: Joe Hershberger <joe.hershberger@ni.com>
---
 common/miiphyutil.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

Comments

Joe Hershberger Aug. 22, 2016, 4:46 p.m. UTC | #1
On Mon, Aug 22, 2016 at 8:03 AM, Dongpo Li <lidongpo@hisilicon.com> wrote:
> When phy autoneg on, the link speed and duplex should be
> determined by phy advertising register and
> phy link partner ability register.
> Check phy advertising register when geting phy link speed and
> duplex if autoneg on.
>
> Signed-off-by: Dongpo Li <lidongpo@hisilicon.com>
> Cc: Joe Hershberger <joe.hershberger@ni.com>

Acked-by: Joe Hershberger <joe.hershberger@ni.com>
Joe Hershberger Aug. 23, 2016, 2:28 a.m. UTC | #2
Hi Dongpo,

https://patchwork.ozlabs.org/patch/661450/ was applied to u-boot-net.git.

Thanks!
-Joe
diff mbox

Patch

diff --git a/common/miiphyutil.c b/common/miiphyutil.c
index 08aa854..d8ebb38 100644
--- a/common/miiphyutil.c
+++ b/common/miiphyutil.c
@@ -380,7 +380,7 @@  int miiphy_reset(const char *devname, unsigned char addr)
  */
 int miiphy_speed(const char *devname, unsigned char addr)
 {
-	u16 bmcr, anlpar;
+	u16 bmcr, anlpar, adv;
 
 #if defined(CONFIG_PHY_GIGE)
 	u16 btsr;
@@ -417,7 +417,12 @@  int miiphy_speed(const char *devname, unsigned char addr)
 			printf("PHY AN speed");
 			goto miiphy_read_failed;
 		}
-		return (anlpar & LPA_100) ? _100BASET : _10BASET;
+
+		if (miiphy_read(devname, addr, MII_ADVERTISE, &adv)) {
+			puts("PHY AN adv speed");
+			goto miiphy_read_failed;
+		}
+		return ((anlpar & adv) & LPA_100) ? _100BASET : _10BASET;
 	}
 	/* Get speed from basic control settings. */
 	return (bmcr & BMCR_SPEED100) ? _100BASET : _10BASET;
@@ -433,7 +438,7 @@  miiphy_read_failed:
  */
 int miiphy_duplex(const char *devname, unsigned char addr)
 {
-	u16 bmcr, anlpar;
+	u16 bmcr, anlpar, adv;
 
 #if defined(CONFIG_PHY_GIGE)
 	u16 btsr;
@@ -475,7 +480,12 @@  int miiphy_duplex(const char *devname, unsigned char addr)
 			puts("PHY AN duplex");
 			goto miiphy_read_failed;
 		}
-		return (anlpar & (LPA_10FULL | LPA_100FULL)) ?
+
+		if (miiphy_read(devname, addr, MII_ADVERTISE, &adv)) {
+			puts("PHY AN adv duplex");
+			goto miiphy_read_failed;
+		}
+		return ((anlpar & adv) & (LPA_10FULL | LPA_100FULL)) ?
 		    FULL : HALF;
 	}
 	/* Get speed from basic control settings. */