From patchwork Tue Jun 7 10:17:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksij Rempel X-Patchwork-Id: 12871691 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D4E67C43334 for ; Tue, 7 Jun 2022 10:17:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240803AbiFGKRZ (ORCPT ); Tue, 7 Jun 2022 06:17:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47848 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240800AbiFGKRW (ORCPT ); Tue, 7 Jun 2022 06:17:22 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A11FDD110 for ; Tue, 7 Jun 2022 03:17:20 -0700 (PDT) Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nyWGv-0008Dn-Lh; Tue, 07 Jun 2022 12:17:13 +0200 Received: from [2a0a:edc0:0:1101:1d::ac] (helo=dude04.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1nyWGv-006yMw-Tl; Tue, 07 Jun 2022 12:17:12 +0200 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1nyWGt-00BtG7-Tv; Tue, 07 Jun 2022 12:17:11 +0200 From: Oleksij Rempel To: Andrew Lunn , Heiner Kallweit , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH net-next v1 1/3] net: phy: dp83td510: add SQI support Date: Tue, 7 Jun 2022 12:17:08 +0200 Message-Id: <20220607101710.2833332-1-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: netdev@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org Convert MSE (mean-square error) values to SNR and split it SQI (Signal Quality Indicator) ranges. The used ranges are taken from "OPEN ALLIANCE - Advanced diagnostic features for 100BASE-T1 automotive Ethernet PHYs" specification. Signed-off-by: Oleksij Rempel --- drivers/net/phy/dp83td510.c | 56 +++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/drivers/net/phy/dp83td510.c b/drivers/net/phy/dp83td510.c index 1ae792b0daaa..441f77bfc9f2 100644 --- a/drivers/net/phy/dp83td510.c +++ b/drivers/net/phy/dp83td510.c @@ -27,6 +27,32 @@ #define DP83TD510E_AN_STAT_1 0x60c #define DP83TD510E_MASTER_SLAVE_RESOL_FAIL BIT(15) +#define DP83TD510E_MSE_DETECT 0xa85 + +#define DP83TD510_SQI_MAX 7 + +struct dp83td510_mse_sqi_range { + u16 end; + u16 start; +}; + +/* Register values are converted to SNR(dB) as suggested by + * "Application Report - DP83TD510E Cable Diagnostics Toolkit": + * SNR(dB) = -10 * log10 (VAL/2^17) - 1.76 dB. + * SQI ranges are implemented according to "OPEN ALLIANCE - Advanced diagnostic + * features for 100BASE-T1 automotive Ethernet PHYs" + */ +static const struct dp83td510_mse_sqi_range dp83td510_mse_sqi_map[] = { + { 0xffff, 0x0569 }, /* < 18dB */ + { 0x0569, 0x044c }, /* 18dB =< SNR < 19dB */ + { 0x044c, 0x0369 }, /* 19dB =< SNR < 20dB */ + { 0x0369, 0x02b6 }, /* 20dB =< SNR < 21dB */ + { 0x02b6, 0x0227 }, /* 21dB =< SNR < 22dB */ + { 0x0227, 0x01b6 }, /* 22dB =< SNR < 23dB */ + { 0x01b6, 0x015b }, /* 23dB =< SNR < 24dB */ + { 0x015b, 0x0000 }, /* 24dB =< SNR */ +}; + static int dp83td510_config_intr(struct phy_device *phydev) { int ret; @@ -164,6 +190,34 @@ static int dp83td510_config_aneg(struct phy_device *phydev) return genphy_c45_check_and_restart_aneg(phydev, changed); } +static int dp83td510_get_sqi(struct phy_device *phydev) +{ + u16 mse_val; + int sqi; + int ret; + + if (!phydev->link) + return 0; + + ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, DP83TD510E_MSE_DETECT); + if (ret < 0) + return ret; + + mse_val = 0xFFFF & ret; + for (sqi = 0; sqi < ARRAY_SIZE(dp83td510_mse_sqi_map); sqi++) { + if (mse_val >= dp83td510_mse_sqi_map[sqi].start && + mse_val <= dp83td510_mse_sqi_map[sqi].end) + return sqi; + } + + return -EINVAL; +} + +static int dp83td510_get_sqi_max(struct phy_device *phydev) +{ + return DP83TD510_SQI_MAX; +} + static int dp83td510_get_features(struct phy_device *phydev) { /* This PHY can't respond on MDIO bus if no RMII clock is enabled. @@ -192,6 +246,8 @@ static struct phy_driver dp83td510_driver[] = { .get_features = dp83td510_get_features, .config_intr = dp83td510_config_intr, .handle_interrupt = dp83td510_handle_interrupt, + .get_sqi = dp83td510_get_sqi, + .get_sqi_max = dp83td510_get_sqi_max, .suspend = genphy_suspend, .resume = genphy_resume, From patchwork Tue Jun 7 10:17:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksij Rempel X-Patchwork-Id: 12871693 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9C42BCCA47C for ; Tue, 7 Jun 2022 10:17:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240833AbiFGKR0 (ORCPT ); Tue, 7 Jun 2022 06:17:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48002 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240813AbiFGKRY (ORCPT ); Tue, 7 Jun 2022 06:17:24 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EDCBE10FDA for ; Tue, 7 Jun 2022 03:17:21 -0700 (PDT) Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nyWGv-0008Do-Lg; Tue, 07 Jun 2022 12:17:13 +0200 Received: from [2a0a:edc0:0:1101:1d::ac] (helo=dude04.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1nyWGw-006yMz-2v; Tue, 07 Jun 2022 12:17:12 +0200 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1nyWGt-00BtGh-VU; Tue, 07 Jun 2022 12:17:11 +0200 From: Oleksij Rempel To: Andrew Lunn , Heiner Kallweit , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH net-next v1 2/3] net: phy: dp83td510: add cable testing support Date: Tue, 7 Jun 2022 12:17:09 +0200 Message-Id: <20220607101710.2833332-2-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220607101710.2833332-1-o.rempel@pengutronix.de> References: <20220607101710.2833332-1-o.rempel@pengutronix.de> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: netdev@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org Cable testing was tested in different HW configurations and cables: - SJA1105 + DP83TD510 - ASIX + DP83TD510 - STM32MP1 + DP83TD510 Results provided by this PHY should be interpreted with grain of sold. For example testing unshielded and shielded twisted pair may give different results. Nevertheless, it still can be usable. Signed-off-by: Oleksij Rempel --- drivers/net/phy/dp83td510.c | 161 ++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) diff --git a/drivers/net/phy/dp83td510.c b/drivers/net/phy/dp83td510.c index 441f77bfc9f2..d0229f3b0181 100644 --- a/drivers/net/phy/dp83td510.c +++ b/drivers/net/phy/dp83td510.c @@ -4,6 +4,7 @@ */ #include +#include #include #include #include @@ -24,6 +25,52 @@ #define DP83TD510E_INT1_LINK BIT(13) #define DP83TD510E_INT1_LINK_EN BIT(5) +#define DP83TD510E_TDR_CFG 0x1e +#define DP83TD510E_TDR_START BIT(15) +#define DP83TD510E_TDR_DONE BIT(1) +#define DP83TD510E_TDR_FAIL BIT(0) + +#define DP83TD510E_TDR_CFG1 0x300 + +#define DP83TD510E_TDR_CFG2 0x301 +#define DP83TD510E_TDR_END_TAP_INDEX_1 GENMASK(14, 8) +#define DP83TD510E_TDR_START_TAP_INDEX_1 GENMASK(6, 0) + +#define DP83TD510E_TDR_CFG3 0x302 +#define DP83TD510E_TDR_TX_DURATION_US GENMASK(15, 0) + +#define DP83TD510E_TDR_FAULT_CFG1 0x303 +#define DP83TD510E_TDR_FLT_LOC_OFFSET_1 GENMASK(14, 8) +#define DP83TD510E_TDR_FLT_INIT_1 GENMASK(7, 0) + +#define DP83TD510E_TDR_FAULT_CFG2 0x304 +#define DP83TD510E_TDR_FLT_SLOPE_1 GENMASK(7, 0) + +#define DP83TD510E_TDR_FAULT_STAT1 0x305 +#define DP83TD510E_TDR_FAULT_STAT2 0x306 +#define DP83TD510E_TDR_FAULT_STAT3 0x307 +#define DP83TD510E_TDR_FAULT_STAT4 0x308 +#define DP83TD510E_TDR_FAULT_STAT5 0x309 +#define DP83TD510E_TDR_FAULT_STAT6 0x30a + +#define DP83TD510E_TDR_FAULT_STAT 0x30c +#define DP83TD510E_TDR_PEAK_DETECT BIT(11) +#define DP83TD510E_TDR_PEAK_SIGN BIT(10) +#define DP83TD510E_TDR_PEAK_LOCATION GENMASK(9, 0) + + +/* Not documented registers and values but recommended according to + * "DP83TD510E Cable Diagnostics Toolkit" + */ +#define DP83TD510E_UNKN_030D 0x30d +#define DP83TD510E_030D_VAL 0x5f25 +#define DP83TD510E_UNKN_030E 0x30e +#define DP83TD510E_030E_VAL 0x0536 +#define DP83TD510E_UNKN_030F 0x30f +#define DP83TD510E_030F_VAL 0x0008 +#define DP83TD510E_UNKN_0310 0x310 +#define DP83TD510E_0310_VAL 0x0036 + #define DP83TD510E_AN_STAT_1 0x60c #define DP83TD510E_MASTER_SLAVE_RESOL_FAIL BIT(15) @@ -218,6 +265,117 @@ static int dp83td510_get_sqi_max(struct phy_device *phydev) return DP83TD510_SQI_MAX; } +/* Configure the TDR circuitry within the PHY as described in + * "Application Report - DP83TD510E Cable Diagnostics Toolkit" + */ +static int dp83td510_tdr_init(struct phy_device *phydev) +{ + int ret; + + ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, DP83TD510E_TDR_CFG2, + FIELD_PREP(DP83TD510E_TDR_END_TAP_INDEX_1, 36) | + FIELD_PREP(DP83TD510E_TDR_START_TAP_INDEX_1, 4)); + if (ret) + return ret; + + ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, DP83TD510E_UNKN_030D, + DP83TD510E_030D_VAL); + if (ret) + return ret; + + ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, DP83TD510E_TDR_FAULT_CFG1, + FIELD_PREP(DP83TD510E_TDR_FLT_LOC_OFFSET_1, 0x5) | + FIELD_PREP(DP83TD510E_TDR_FLT_INIT_1, 0x3e)); + if (ret) + return ret; + + ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, DP83TD510E_UNKN_030E, + DP83TD510E_030E_VAL); + if (ret) + return ret; + + ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, DP83TD510E_TDR_FAULT_CFG2, + FIELD_PREP(DP83TD510E_TDR_FLT_SLOPE_1, 0xa)); + if (ret) + return ret; + + ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, DP83TD510E_UNKN_030F, + DP83TD510E_030F_VAL); + if (ret) + return ret; + + ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, DP83TD510E_TDR_CFG3, + FIELD_PREP(DP83TD510E_TDR_TX_DURATION_US, 16000)); + if (ret) + return ret; + + return phy_write_mmd(phydev, MDIO_MMD_VEND2, DP83TD510E_UNKN_0310, + DP83TD510E_0310_VAL); +} + +static int dp83td510_cable_test_start(struct phy_device *phydev) +{ + int ret; + + ret = dp83td510_tdr_init(phydev); + if (ret) + return ret; + + return phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, DP83TD510E_TDR_CFG, + DP83TD510E_TDR_START); +} + +static int dp83td510_cable_test_get_status(struct phy_device *phydev, + bool *finished) +{ + int ret, stat; + + *finished = false; + + ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, DP83TD510E_TDR_CFG); + if (ret < 0) + return ret; + + if (!(ret & DP83TD510E_TDR_DONE)) + return 0; + + if (!(ret & DP83TD510E_TDR_FAIL)) { + int location; + + ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, + DP83TD510E_TDR_FAULT_STAT); + if (ret < 0) + return ret; + + if (ret & DP83TD510E_TDR_PEAK_DETECT) { + if (ret & DP83TD510E_TDR_PEAK_SIGN) + stat = ETHTOOL_A_CABLE_RESULT_CODE_OPEN; + else + stat = ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT; + + location = FIELD_GET(DP83TD510E_TDR_PEAK_LOCATION, + ret) * 100; + ethnl_cable_test_fault_length(phydev, + ETHTOOL_A_CABLE_PAIR_A, + location); + } else { + stat = ETHTOOL_A_CABLE_RESULT_CODE_OK; + } + } else { + /* Most probably we have active link partner */ + stat = ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC; + } + + *finished = true; + + ethnl_cable_test_result(phydev, ETHTOOL_A_CABLE_PAIR_A, stat); + + /* Reset state machine, otherwise at least other TDR attempts may + * provide not reliable results. + */ + return phy_set_bits(phydev, MII_BMCR, BMCR_RESET); +} + static int dp83td510_get_features(struct phy_device *phydev) { /* This PHY can't respond on MDIO bus if no RMII clock is enabled. @@ -241,6 +399,7 @@ static struct phy_driver dp83td510_driver[] = { PHY_ID_MATCH_MODEL(DP83TD510E_PHY_ID), .name = "TI DP83TD510E", + .flags = PHY_POLL_CABLE_TEST, .config_aneg = dp83td510_config_aneg, .read_status = dp83td510_read_status, .get_features = dp83td510_get_features, @@ -248,6 +407,8 @@ static struct phy_driver dp83td510_driver[] = { .handle_interrupt = dp83td510_handle_interrupt, .get_sqi = dp83td510_get_sqi, .get_sqi_max = dp83td510_get_sqi_max, + .cable_test_start = dp83td510_cable_test_start, + .cable_test_get_status = dp83td510_cable_test_get_status, .suspend = genphy_suspend, .resume = genphy_resume, From patchwork Tue Jun 7 10:17:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksij Rempel X-Patchwork-Id: 12871692 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1F768C43334 for ; Tue, 7 Jun 2022 10:17:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240830AbiFGKRZ (ORCPT ); Tue, 7 Jun 2022 06:17:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47950 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240810AbiFGKRY (ORCPT ); Tue, 7 Jun 2022 06:17:24 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EDBE610544 for ; Tue, 7 Jun 2022 03:17:21 -0700 (PDT) Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nyWGv-0008Dp-Lh; Tue, 07 Jun 2022 12:17:13 +0200 Received: from [2a0a:edc0:0:1101:1d::ac] (helo=dude04.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1nyWGw-006yN2-4E; Tue, 07 Jun 2022 12:17:12 +0200 Received: from ore by dude04.red.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1nyWGu-00BtH8-1B; Tue, 07 Jun 2022 12:17:12 +0200 From: Oleksij Rempel To: Andrew Lunn , Heiner Kallweit , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Oleksij Rempel , kernel@pengutronix.de, linux-kernel@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH net-next v1 3/3] net: phy: dp83td510: disable cable test support for 1Vpp PHYs Date: Tue, 7 Jun 2022 12:17:10 +0200 Message-Id: <20220607101710.2833332-3-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220607101710.2833332-1-o.rempel@pengutronix.de> References: <20220607101710.2833332-1-o.rempel@pengutronix.de> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: netdev@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org Using 1Vpp pulse provides most unreliable results. So, disable cable testing if PHY is bootstrapped to use 1Vpp-only mode. Signed-off-by: Oleksij Rempel --- drivers/net/phy/dp83td510.c | 52 ++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/drivers/net/phy/dp83td510.c b/drivers/net/phy/dp83td510.c index d0229f3b0181..fb39eec40e10 100644 --- a/drivers/net/phy/dp83td510.c +++ b/drivers/net/phy/dp83td510.c @@ -31,6 +31,8 @@ #define DP83TD510E_TDR_FAIL BIT(0) #define DP83TD510E_TDR_CFG1 0x300 +/* TX_TYPE: Transmit voltage level for TDR. 0 = 1V, 1 = 2.4V */ +#define DP83TD510E_TDR_TX_TYPE BIT(12) #define DP83TD510E_TDR_CFG2 0x301 #define DP83TD510E_TDR_END_TAP_INDEX_1 GENMASK(14, 8) @@ -71,6 +73,10 @@ #define DP83TD510E_UNKN_0310 0x310 #define DP83TD510E_0310_VAL 0x0036 +#define DP83TD510E_CHIP_SOR_1 0x467 +/* If LED_2 is set, blacklist 2.4V mode */ +#define DP83TD510E_SOR_LED_2 BIT(7) + #define DP83TD510E_AN_STAT_1 0x60c #define DP83TD510E_MASTER_SLAVE_RESOL_FAIL BIT(15) @@ -78,6 +84,10 @@ #define DP83TD510_SQI_MAX 7 +struct dp83td510_priv { + bool allow_v2_4_mode; +}; + struct dp83td510_mse_sqi_range { u16 end; u16 start; @@ -315,12 +325,29 @@ static int dp83td510_tdr_init(struct phy_device *phydev) static int dp83td510_cable_test_start(struct phy_device *phydev) { - int ret; + struct dp83td510_priv *priv = phydev->priv; + int ret, cfg = 0; + + /* Generate 2.4Vpp pulse if HW is allowed to do so */ + if (priv->allow_v2_4_mode) { + cfg |= DP83TD510E_TDR_TX_TYPE; + } else { + /* This PHY do not provide usable results with 1Vpp pulse. + * Potentially different dp83td510_tdr_init() values are + * needed. + */ + return -EOPNOTSUPP; + } ret = dp83td510_tdr_init(phydev); if (ret) return ret; + ret = phy_modify_mmd(phydev, MDIO_MMD_VEND2, DP83TD510E_TDR_CFG1, + DP83TD510E_TDR_TX_TYPE, cfg); + if (ret) + return ret; + return phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, DP83TD510E_TDR_CFG, DP83TD510E_TDR_START); } @@ -376,6 +403,28 @@ static int dp83td510_cable_test_get_status(struct phy_device *phydev, return phy_set_bits(phydev, MII_BMCR, BMCR_RESET); } +static int dp83td510_probe(struct phy_device *phydev) +{ + struct device *dev = &phydev->mdio.dev; + struct dp83td510_priv *priv; + int ret; + + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + phydev->priv = priv; + + ret = phy_read_mmd(phydev, MDIO_MMD_VEND2, DP83TD510E_CHIP_SOR_1); + if (ret < 0) + return ret; + + if (!(ret & DP83TD510E_SOR_LED_2)) + priv->allow_v2_4_mode = true; + + return 0; +} + static int dp83td510_get_features(struct phy_device *phydev) { /* This PHY can't respond on MDIO bus if no RMII clock is enabled. @@ -400,6 +449,7 @@ static struct phy_driver dp83td510_driver[] = { .name = "TI DP83TD510E", .flags = PHY_POLL_CABLE_TEST, + .probe = dp83td510_probe, .config_aneg = dp83td510_config_aneg, .read_status = dp83td510_read_status, .get_features = dp83td510_get_features,