Some PHYs are not capable of generating interrupts when a cable test
finished. They do however support interrupts for normal operations,
like link up/down. As such, the PHY state machine would normally not
poll the PHY.

Add support for indicating the PHY state machine must poll the PHY
when performing a cable test.

Signed-off-by: Andrew Lunn <and...@lunn.ch>
---
 drivers/net/phy/phy.c | 2 ++
 include/linux/phy.h   | 5 +++++
 2 files changed, 7 insertions(+)

diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 65b13c74c158..dbd4484f04be 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -505,6 +505,8 @@ int phy_start_cable_test(struct phy_device *phydev,
 
        phydev->state = PHY_CABLETEST;
 
+       if (phy_polling_mode(phydev))
+               phy_trigger_machine(phydev);
 out:
        mutex_unlock(&phydev->lock);
 
diff --git a/include/linux/phy.h b/include/linux/phy.h
index 2531684f507d..0dc6adc73a01 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -76,6 +76,7 @@ extern const int phy_10gbit_features_array[1];
 
 #define PHY_IS_INTERNAL                0x00000001
 #define PHY_RST_AFTER_CLK_EN   0x00000002
+#define PHY_POLL_CABLE_TEST    0x00000004
 #define MDIO_DEVICE_IS_PHY     0x80000000
 
 /* Interface Mode definitions */
@@ -950,6 +951,10 @@ static inline bool phy_interrupt_is_valid(struct 
phy_device *phydev)
  */
 static inline bool phy_polling_mode(struct phy_device *phydev)
 {
+       if (phydev->state == PHY_CABLETEST)
+               if (phydev->drv->flags & PHY_POLL_CABLE_TEST)
+                       return true;
+
        return phydev->irq == PHY_POLL;
 }
 
-- 
2.20.1

Reply via email to