The PHY drivers can use these helpers for reporting the results. The results get translated into netlink attributes which are added to the pre-allocated skbuf.
Signed-off-by: Andrew Lunn <and...@lunn.ch> --- drivers/net/phy/phy.c | 47 +++++++++++++++++++++++++++++++++++++++++++ include/linux/phy.h | 4 ++++ 2 files changed, 51 insertions(+) diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 3c614639ce20..6540523d773a 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -485,6 +485,53 @@ static void phy_cable_test_abort(struct phy_device *phydev) genphy_soft_reset(phydev); } +int phy_cable_test_result(struct phy_device *phydev, u8 pair, u16 result) +{ + struct nlattr *nest; + int ret = -EMSGSIZE; + + nest = ethnl_nest_start(phydev->skb, ETHTOOL_A_CABLE_TEST_EVENT_RESULT); + if (!nest) + return -EMSGSIZE; + + if (nla_put_u8(phydev->skb, ETHTOOL_A_CABLE_RESULT_PAIR, pair)) + goto err; + if (nla_put_u8(phydev->skb, ETHTOOL_A_CABLE_RESULT_CODE, result)) + goto err; + + nla_nest_end(phydev->skb, nest); + return 0; + +err: + nla_nest_cancel(phydev->skb, nest); + return ret; +} +EXPORT_SYMBOL_GPL(phy_cable_test_result); + +int phy_cable_test_fault_length(struct phy_device *phydev, u8 pair, u16 cm) +{ + struct nlattr *nest; + int ret = -EMSGSIZE; + + nest = ethnl_nest_start(phydev->skb, + ETHTOOL_A_CABLE_TEST_EVENT_FAULT_LENGTH); + if (!nest) + return -EMSGSIZE; + + if (nla_put_u8(phydev->skb, ETHTOOL_A_CABLE_FAULT_LENGTH_PAIR, pair)) + goto err; + if (nla_put_u16(phydev->skb, ETHTOOL_A_CABLE_FAULT_LENGTH_CM, cm)) + goto err; + + nla_nest_end(phydev->skb, nest); + return 0; + +err: + nla_nest_cancel(phydev->skb, nest); + return ret; +} +EXPORT_SYMBOL_GPL(phy_cable_test_fault_length); + int phy_start_cable_test(struct phy_device *phydev, struct netlink_ext_ack *extack, u32 seq) { diff --git a/include/linux/phy.h b/include/linux/phy.h index cea151c66ac1..23c18583ea07 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -1090,6 +1090,10 @@ int phy_start_cable_test(struct phy_device *phydev, } #endif +int phy_cable_test_result(struct phy_device *phydev, u8 pair, u16 result); +int phy_cable_test_fault_length(struct phy_device *phydev, u8 pair, + u16 cm); + static inline void phy_device_reset(struct phy_device *phydev, int value) { mdio_device_reset(&phydev->mdio, value); -- 2.20.1