Certain PHY's have issues when operating in GBit slave mode and can
be forced to master mode. Examples are RTL8211C, also the Micrel PHY
driver has a DT setting to force master mode.
If two such chips are link partners the autonegotiation will fail.
Standard defines a self-clearing on read, latched-high bit to
indicate this error. Check this bit to inform the user.

Signed-off-by: Heiner Kallweit <hkallwe...@gmail.com>
---
v2:
- Use different error messages depending on whether local PHY uses
  manual master/slave configuration.
---
 drivers/net/phy/phy_device.c | 8 ++++++++
 include/uapi/linux/mii.h     | 1 +
 2 files changed, 9 insertions(+)

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index b9f5f40a..db1172db 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -1555,6 +1555,14 @@ int genphy_read_status(struct phy_device *phydev)
                        if (adv < 0)
                                return adv;
 
+                       if (lpagb & LPA_1000MSFAIL) {
+                               if (adv & CTL1000_ENABLE_MASTER)
+                                       phydev_err(phydev, "Master/Slave 
resolution failed, maybe conflicting manual settings?\n");
+                               else
+                                       phydev_err(phydev, "Master/Slave 
resolution failed\n");
+                               return -ENOLINK;
+                       }
+
                        phydev->lp_advertising =
                                mii_stat1000_to_ethtool_lpa_t(lpagb);
                        common_adv_gb = lpagb & adv << 2;
diff --git a/include/uapi/linux/mii.h b/include/uapi/linux/mii.h
index b5c2fdcf..a5062165 100644
--- a/include/uapi/linux/mii.h
+++ b/include/uapi/linux/mii.h
@@ -136,6 +136,7 @@
 #define CTL1000_ENABLE_MASTER  0x1000
 
 /* 1000BASE-T Status register */
+#define LPA_1000MSFAIL         0x8000  /* Master/Slave resolution failure */
 #define LPA_1000LOCALRXOK      0x2000  /* Link partner local receiver status */
 #define LPA_1000REMRXOK                0x1000  /* Link partner remote receiver 
status */
 #define LPA_1000FULL           0x0800  /* Link partner 1000BASE-T full duplex 
*/
-- 
2.18.0

Reply via email to