Message ID | 20240809072440.3477125-3-o.rempel@pengutronix.de (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next,v3,1/3] ethtool: Add new result codes for TDR diagnostics | expand |
Hi Oleksij,
kernel test robot noticed the following build errors:
[auto build test ERROR on net-next/main]
url: https://github.com/intel-lab-lkp/linux/commits/Oleksij-Rempel/phy-Add-Open-Alliance-helpers-for-the-PHY-framework/20240809-172119
base: net-next/main
patch link: https://lore.kernel.org/r/20240809072440.3477125-3-o.rempel%40pengutronix.de
patch subject: [PATCH net-next v3 3/3] net: phy: dp83tg720: Add cable testing support
config: i386-buildonly-randconfig-004-20240809 (https://download.01.org/0day-ci/archive/20240810/202408100138.gwg3Yuur-lkp@intel.com/config)
compiler: clang version 18.1.5 (https://github.com/llvm/llvm-project 617a15a9eac96088ae5e9134248d8236e34b91b1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240810/202408100138.gwg3Yuur-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202408100138.gwg3Yuur-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/net/phy/open_alliance_helpers.c:34:18: error: call to undeclared function 'FIELD_GET'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
34 | u8 tdr_status = FIELD_GET(OA_1000BT1_HDD_TDR_STATUS_MASK, reg_value);
| ^
drivers/net/phy/open_alliance_helpers.c:69:16: error: call to undeclared function 'FIELD_GET'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
69 | u8 dist_val = FIELD_GET(OA_1000BT1_HDD_TDR_DISTANCE_MASK, reg_value);
| ^
2 errors generated.
vim +/FIELD_GET +34 drivers/net/phy/open_alliance_helpers.c
f4eee3aa678aeb Oleksij Rempel 2024-08-09 21
f4eee3aa678aeb Oleksij Rempel 2024-08-09 22 /**
f4eee3aa678aeb Oleksij Rempel 2024-08-09 23 * oa_1000bt1_get_ethtool_cable_result_code - Convert TDR status to ethtool
f4eee3aa678aeb Oleksij Rempel 2024-08-09 24 * result code
f4eee3aa678aeb Oleksij Rempel 2024-08-09 25 * @reg_value: Value read from the TDR register
f4eee3aa678aeb Oleksij Rempel 2024-08-09 26 *
f4eee3aa678aeb Oleksij Rempel 2024-08-09 27 * This function takes a register value from the HDD.TDR register and converts
f4eee3aa678aeb Oleksij Rempel 2024-08-09 28 * the TDR status to the corresponding ethtool cable test result code.
f4eee3aa678aeb Oleksij Rempel 2024-08-09 29 *
f4eee3aa678aeb Oleksij Rempel 2024-08-09 30 * Return: The appropriate ethtool result code based on the TDR status
f4eee3aa678aeb Oleksij Rempel 2024-08-09 31 */
f4eee3aa678aeb Oleksij Rempel 2024-08-09 32 int oa_1000bt1_get_ethtool_cable_result_code(u16 reg_value)
f4eee3aa678aeb Oleksij Rempel 2024-08-09 33 {
f4eee3aa678aeb Oleksij Rempel 2024-08-09 @34 u8 tdr_status = FIELD_GET(OA_1000BT1_HDD_TDR_STATUS_MASK, reg_value);
f4eee3aa678aeb Oleksij Rempel 2024-08-09 35 u8 dist_val = FIELD_GET(OA_1000BT1_HDD_TDR_DISTANCE_MASK, reg_value);
f4eee3aa678aeb Oleksij Rempel 2024-08-09 36
f4eee3aa678aeb Oleksij Rempel 2024-08-09 37 switch (tdr_status) {
f4eee3aa678aeb Oleksij Rempel 2024-08-09 38 case OA_1000BT1_HDD_TDR_STATUS_CABLE_OK:
f4eee3aa678aeb Oleksij Rempel 2024-08-09 39 return ETHTOOL_A_CABLE_RESULT_CODE_OK;
f4eee3aa678aeb Oleksij Rempel 2024-08-09 40 case OA_1000BT1_HDD_TDR_STATUS_OPEN:
f4eee3aa678aeb Oleksij Rempel 2024-08-09 41 return ETHTOOL_A_CABLE_RESULT_CODE_OPEN;
f4eee3aa678aeb Oleksij Rempel 2024-08-09 42 case OA_1000BT1_HDD_TDR_STATUS_SHORT:
f4eee3aa678aeb Oleksij Rempel 2024-08-09 43 return ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT;
f4eee3aa678aeb Oleksij Rempel 2024-08-09 44 case OA_1000BT1_HDD_TDR_STATUS_NOISE:
f4eee3aa678aeb Oleksij Rempel 2024-08-09 45 return ETHTOOL_A_CABLE_RESULT_CODE_NOISE;
f4eee3aa678aeb Oleksij Rempel 2024-08-09 46 default:
f4eee3aa678aeb Oleksij Rempel 2024-08-09 47 if (dist_val == OA_1000BT1_HDD_TDR_DISTANCE_RESOLUTION_NOT_POSSIBLE)
f4eee3aa678aeb Oleksij Rempel 2024-08-09 48 return ETHTOOL_A_CABLE_RESULT_CODE_RESOLUTION_NOT_POSSIBLE;
f4eee3aa678aeb Oleksij Rempel 2024-08-09 49 return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC;
f4eee3aa678aeb Oleksij Rempel 2024-08-09 50 }
f4eee3aa678aeb Oleksij Rempel 2024-08-09 51 }
f4eee3aa678aeb Oleksij Rempel 2024-08-09 52 EXPORT_SYMBOL_GPL(oa_1000bt1_get_ethtool_cable_result_code);
f4eee3aa678aeb Oleksij Rempel 2024-08-09 53
Hi Oleksij,
kernel test robot noticed the following build errors:
[auto build test ERROR on net-next/main]
url: https://github.com/intel-lab-lkp/linux/commits/Oleksij-Rempel/phy-Add-Open-Alliance-helpers-for-the-PHY-framework/20240809-172119
base: net-next/main
patch link: https://lore.kernel.org/r/20240809072440.3477125-3-o.rempel%40pengutronix.de
patch subject: [PATCH net-next v3 3/3] net: phy: dp83tg720: Add cable testing support
config: m68k-allmodconfig (https://download.01.org/0day-ci/archive/20240810/202408100348.U6S1jP0z-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240810/202408100348.U6S1jP0z-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202408100348.U6S1jP0z-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/net/phy/open_alliance_helpers.c: In function 'oa_1000bt1_get_ethtool_cable_result_code':
>> drivers/net/phy/open_alliance_helpers.c:34:25: error: implicit declaration of function 'FIELD_GET' [-Wimplicit-function-declaration]
34 | u8 tdr_status = FIELD_GET(OA_1000BT1_HDD_TDR_STATUS_MASK, reg_value);
| ^~~~~~~~~
vim +/FIELD_GET +34 drivers/net/phy/open_alliance_helpers.c
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 21
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 22 /**
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 23 * oa_1000bt1_get_ethtool_cable_result_code - Convert TDR status to ethtool
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 24 * result code
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 25 * @reg_value: Value read from the TDR register
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 26 *
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 27 * This function takes a register value from the HDD.TDR register and converts
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 28 * the TDR status to the corresponding ethtool cable test result code.
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 29 *
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 30 * Return: The appropriate ethtool result code based on the TDR status
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 31 */
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 32 int oa_1000bt1_get_ethtool_cable_result_code(u16 reg_value)
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 33 {
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 @34 u8 tdr_status = FIELD_GET(OA_1000BT1_HDD_TDR_STATUS_MASK, reg_value);
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 35 u8 dist_val = FIELD_GET(OA_1000BT1_HDD_TDR_DISTANCE_MASK, reg_value);
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 36
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 37 switch (tdr_status) {
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 38 case OA_1000BT1_HDD_TDR_STATUS_CABLE_OK:
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 39 return ETHTOOL_A_CABLE_RESULT_CODE_OK;
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 40 case OA_1000BT1_HDD_TDR_STATUS_OPEN:
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 41 return ETHTOOL_A_CABLE_RESULT_CODE_OPEN;
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 42 case OA_1000BT1_HDD_TDR_STATUS_SHORT:
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 43 return ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT;
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 44 case OA_1000BT1_HDD_TDR_STATUS_NOISE:
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 45 return ETHTOOL_A_CABLE_RESULT_CODE_NOISE;
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 46 default:
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 47 if (dist_val == OA_1000BT1_HDD_TDR_DISTANCE_RESOLUTION_NOT_POSSIBLE)
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 48 return ETHTOOL_A_CABLE_RESULT_CODE_RESOLUTION_NOT_POSSIBLE;
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 49 return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC;
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 50 }
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 51 }
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 52 EXPORT_SYMBOL_GPL(oa_1000bt1_get_ethtool_cable_result_code);
f4eee3aa678aeb0 Oleksij Rempel 2024-08-09 53
On Sat, Aug 10, 2024 at 03:57:35AM +0800, kernel test robot wrote: > Hi Oleksij, > > kernel test robot noticed the following build errors: > > [auto build test ERROR on net-next/main] > > url: https://github.com/intel-lab-lkp/linux/commits/Oleksij-Rempel/phy-Add-Open-Alliance-helpers-for-the-PHY-framework/20240809-172119 > base: net-next/main > patch link: https://lore.kernel.org/r/20240809072440.3477125-3-o.rempel%40pengutronix.de > patch subject: [PATCH net-next v3 3/3] net: phy: dp83tg720: Add cable testing support > config: m68k-allmodconfig (https://download.01.org/0day-ci/archive/20240810/202408100348.U6S1jP0z-lkp@intel.com/config) > compiler: m68k-linux-gcc (GCC) 14.1.0 > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240810/202408100348.U6S1jP0z-lkp@intel.com/reproduce) > > If you fix the issue in a separate patch/commit (i.e. not just a new version of > the same patch/commit), kindly add following tags > | Reported-by: kernel test robot <lkp@intel.com> > | Closes: https://lore.kernel.org/oe-kbuild-all/202408100348.U6S1jP0z-lkp@intel.com/ > > All errors (new ones prefixed by >>): > > drivers/net/phy/open_alliance_helpers.c: In function 'oa_1000bt1_get_ethtool_cable_result_code': > >> drivers/net/phy/open_alliance_helpers.c:34:25: error: implicit declaration of function 'FIELD_GET' [-Wimplicit-function-declaration] > 34 | u8 tdr_status = FIELD_GET(OA_1000BT1_HDD_TDR_STATUS_MASK, reg_value); > | ^~~~~~~~~ Huh.. why it builds on arm?
On Sat, Aug 10, 2024 at 08:16:48AM +0200, Oleksij Rempel wrote: > On Sat, Aug 10, 2024 at 03:57:35AM +0800, kernel test robot wrote: > > Hi Oleksij, > > > > kernel test robot noticed the following build errors: > > > > [auto build test ERROR on net-next/main] > > > > url: https://github.com/intel-lab-lkp/linux/commits/Oleksij-Rempel/phy-Add-Open-Alliance-helpers-for-the-PHY-framework/20240809-172119 > > base: net-next/main > > patch link: https://lore.kernel.org/r/20240809072440.3477125-3-o.rempel%40pengutronix.de > > patch subject: [PATCH net-next v3 3/3] net: phy: dp83tg720: Add cable testing support > > config: m68k-allmodconfig (https://download.01.org/0day-ci/archive/20240810/202408100348.U6S1jP0z-lkp@intel.com/config) > > compiler: m68k-linux-gcc (GCC) 14.1.0 > > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240810/202408100348.U6S1jP0z-lkp@intel.com/reproduce) > > > > If you fix the issue in a separate patch/commit (i.e. not just a new version of > > the same patch/commit), kindly add following tags > > | Reported-by: kernel test robot <lkp@intel.com> > > | Closes: https://lore.kernel.org/oe-kbuild-all/202408100348.U6S1jP0z-lkp@intel.com/ > > > > All errors (new ones prefixed by >>): > > > > drivers/net/phy/open_alliance_helpers.c: In function 'oa_1000bt1_get_ethtool_cable_result_code': > > >> drivers/net/phy/open_alliance_helpers.c:34:25: error: implicit declaration of function 'FIELD_GET' [-Wimplicit-function-declaration] > > 34 | u8 tdr_status = FIELD_GET(OA_1000BT1_HDD_TDR_STATUS_MASK, reg_value); > > | ^~~~~~~~~ > > Huh.. why it builds on arm? There has been a couple of reports like this recently. I suspect there is a some architecture header pulling in the needed header, and m68k does not. You might want to compare drivers/net/phy/open_alliance_helpers.i for arm and m68k. Andrew
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index 874422e530ff0..f530fcd092fe4 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig @@ -417,6 +417,7 @@ config DP83TD510_PHY config DP83TG720_PHY tristate "Texas Instruments DP83TG720 Ethernet 1000Base-T1 PHY" + select OPEN_ALLIANCE_HELPERS help The DP83TG720S-Q1 is an automotive Ethernet physical layer transceiver compliant with IEEE 802.3bp and Open Alliance diff --git a/drivers/net/phy/dp83tg720.c b/drivers/net/phy/dp83tg720.c index c706429b225a2..0ef4d7dba0656 100644 --- a/drivers/net/phy/dp83tg720.c +++ b/drivers/net/phy/dp83tg720.c @@ -3,10 +3,13 @@ * Copyright (c) 2023 Pengutronix, Oleksij Rempel <kernel@pengutronix.de> */ #include <linux/bitfield.h> +#include <linux/ethtool_netlink.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/phy.h> +#include "open_alliance_helpers.h" + #define DP83TG720S_PHY_ID 0x2000a284 /* MDIO_MMD_VEND2 registers */ @@ -14,6 +17,17 @@ #define DP83TG720S_STS_MII_INT BIT(7) #define DP83TG720S_LINK_STATUS BIT(0) +/* TDR Configuration Register (0x1E) */ +#define DP83TG720S_TDR_CFG 0x1e +/* 1b = TDR start, 0b = No TDR */ +#define DP83TG720S_TDR_START BIT(15) +/* 1b = TDR auto on link down, 0b = Manual TDR start */ +#define DP83TG720S_CFG_TDR_AUTO_RUN BIT(14) +/* 1b = TDR done, 0b = TDR in progress */ +#define DP83TG720S_TDR_DONE BIT(1) +/* 1b = TDR fail, 0b = TDR success */ +#define DP83TG720S_TDR_FAIL BIT(0) + #define DP83TG720S_PHY_RESET 0x1f #define DP83TG720S_HW_RESET BIT(15) @@ -22,18 +36,155 @@ /* Power Mode 0 is Normal mode */ #define DP83TG720S_LPS_CFG3_PWR_MODE_0 BIT(0) +/* Open Aliance 1000BaseT1 compatible HDD.TDR Fault Status Register */ +#define DP83TG720S_TDR_FAULT_STATUS 0x30f + +/* Register 0x0301: TDR Configuration 2 */ +#define DP83TG720S_TDR_CFG2 0x301 + +/* Register 0x0303: TDR Configuration 3 */ +#define DP83TG720S_TDR_CFG3 0x303 + +/* Register 0x0304: TDR Configuration 4 */ +#define DP83TG720S_TDR_CFG4 0x304 + +/* Register 0x0405: Unknown Register */ +#define DP83TG720S_UNKNOWN_0405 0x405 + +/* Register 0x0576: TDR Master Link Down Control */ +#define DP83TG720S_TDR_MASTER_LINK_DOWN 0x576 + #define DP83TG720S_RGMII_DELAY_CTRL 0x602 /* In RGMII mode, Enable or disable the internal delay for RXD */ #define DP83TG720S_RGMII_RX_CLK_SEL BIT(1) /* In RGMII mode, Enable or disable the internal delay for TXD */ #define DP83TG720S_RGMII_TX_CLK_SEL BIT(0) +/* Register 0x083F: Unknown Register */ +#define DP83TG720S_UNKNOWN_083F 0x83f + #define DP83TG720S_SQI_REG_1 0x871 #define DP83TG720S_SQI_OUT_WORST GENMASK(7, 5) #define DP83TG720S_SQI_OUT GENMASK(3, 1) #define DP83TG720_SQI_MAX 7 +/** + * dp83tg720_cable_test_start - Start the cable test for the DP83TG720 PHY. + * @phydev: Pointer to the phy_device structure. + * + * This sequence is based on the documented procedure for the DP83TG720 PHY. + * + * Returns: 0 on success, a negative error code on failure. + */ +static int dp83tg720_cable_test_start(struct phy_device *phydev) +{ + int ret; + + /* Initialize the PHY to run the TDR test as described in the + * "DP83TG720S-Q1: Configuring for Open Alliance Specification + * Compliance (Rev. B)" application note. + * Most of the registers are not documented. Some of register names + * are guessed by comparing the register offsets with the DP83TD510E. + */ + + /* Force master link down */ + ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, + DP83TG720S_TDR_MASTER_LINK_DOWN, 0x0400); + if (ret) + return ret; + + ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, DP83TG720S_TDR_CFG2, + 0xa008); + if (ret) + return ret; + + ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, DP83TG720S_TDR_CFG3, + 0x0928); + if (ret) + return ret; + + ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, DP83TG720S_TDR_CFG4, + 0x0004); + if (ret) + return ret; + + ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, DP83TG720S_UNKNOWN_0405, + 0x6400); + if (ret) + return ret; + + ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, DP83TG720S_UNKNOWN_083F, + 0x3003); + if (ret) + return ret; + + /* Start the TDR */ + ret = phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, DP83TG720S_TDR_CFG, + DP83TG720S_TDR_START); + if (ret) + return ret; + + return 0; +} + +/** + * dp83tg720_cable_test_get_status - Get the status of the cable test for the + * DP83TG720 PHY. + * @phydev: Pointer to the phy_device structure. + * @finished: Pointer to a boolean that indicates whether the test is finished. + * + * The function sets the @finished flag to true if the test is complete. + * + * Returns: 0 on success or a negative error code on failure. + */ +static int dp83tg720_cable_test_get_status(struct phy_device *phydev, + bool *finished) +{ + int ret, stat; + + *finished = false; + + /* Read the TDR status */ + ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, DP83TG720S_TDR_CFG); + if (ret < 0) + return ret; + + /* Check if the TDR test is done */ + if (!(ret & DP83TG720S_TDR_DONE)) + return 0; + + /* Check for TDR test failure */ + if (!(ret & DP83TG720S_TDR_FAIL)) { + int location; + + /* Read fault status */ + ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, + DP83TG720S_TDR_FAULT_STATUS); + if (ret < 0) + return ret; + + /* Get fault type */ + stat = oa_1000bt1_get_ethtool_cable_result_code(ret); + + /* Determine fault location */ + location = oa_1000bt1_get_tdr_distance(ret); + if (location > 0) + ethnl_cable_test_fault_length(phydev, + ETHTOOL_A_CABLE_PAIR_A, + location); + } else { + /* Active link partner or other issues */ + stat = ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC; + } + + *finished = true; + + ethnl_cable_test_result(phydev, ETHTOOL_A_CABLE_PAIR_A, stat); + + return phy_init_hw(phydev); +} + static int dp83tg720_config_aneg(struct phy_device *phydev) { int ret; @@ -195,12 +346,15 @@ static struct phy_driver dp83tg720_driver[] = { PHY_ID_MATCH_MODEL(DP83TG720S_PHY_ID), .name = "TI DP83TG720S", + .flags = PHY_POLL_CABLE_TEST, .config_aneg = dp83tg720_config_aneg, .read_status = dp83tg720_read_status, .get_features = genphy_c45_pma_read_ext_abilities, .config_init = dp83tg720_config_init, .get_sqi = dp83tg720_get_sqi, .get_sqi_max = dp83tg720_get_sqi_max, + .cable_test_start = dp83tg720_cable_test_start, + .cable_test_get_status = dp83tg720_cable_test_get_status, .suspend = genphy_suspend, .resume = genphy_resume,
Introduce cable testing support for the DP83TG720 PHY. This implementation is based on the "DP83TG720S-Q1: Configuring for Open Alliance Specification Compliance (Rev. B)" application note. The feature has been tested with cables of various lengths: - No cable: 1m till open reported. - 5 meter cable: reported properly. - 20 meter cable: reported as 19m. - 40 meter cable: reported as cable ok. Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- changes v3: - select OPEN_ALLIANCE_HELPERS changes v2: - use open alliance specific helpers for the TDR results --- drivers/net/phy/Kconfig | 1 + drivers/net/phy/dp83tg720.c | 154 ++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+)