Received: by 2002:a25:868d:0:0:0:0:0 with SMTP id z13csp1604257ybk; Thu, 14 May 2020 13:09:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz5Uf5EaiGP7jnG1RXCb/UKj6kVzNVHWBrHDn4SDw8H0rK3AkOTjI6KSPqWYay//hYSzdYe X-Received: by 2002:a17:907:41dd:: with SMTP id og21mr2283559ejb.368.1589486981381; Thu, 14 May 2020 13:09:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1589486981; cv=none; d=google.com; s=arc-20160816; b=F1sUeSYS0PtXLrIFIhbmxyDQLxgdC/VJVdlq3L6Xf4mhz6shNUVkekGW31lAnhC6Jh A7z/coTRzpyYo3OeLPNmJ97G43cNN1ezpQR9n1PsXhoSyfNtglxyVabehkD7ExlF2jLP Ff06r3QLqx6y/T3P0mxjcn2rcxxfl4+U+nZoGX74upDWrSYo7TOS2IjoiXUx0fv6euhx FF3kSOgxRBCn1Dt3RK6Pms7njpGQF8ZRKctSOxyphKbk4GxFpVB2FVv1FzP/iUpSRRUo wwkU6CuXu/Gi/Iz5XWaQpvR0Hys/5DL8G5V1xuHT3tF7yk4HK5nzTceLMHCpXbmeRPQh Uw4Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=e8J1qQJUij/36N3VzayGCWhqiOfY2nfI8QBujfjHBMQ=; b=WkJhQNPlxFd7y9R6RhcFKUv/3F/flE31jCkqw0wXaJMvfQYr35na5MOEOyKX9EuQjw Oa127Nabb+3GISXROc3CWyetimyX6pu838qkO0ITQs1JzM09e1tzO16ubIoDaLZpE2Kn Ue/D6nVi0zcVHhMf7tgrhpX6OrYtxtzR0vmL+uKGXq0YQClFwYjU38OLEyPyB79hYeSH qAN96Mllo3/OSJmucvOVpYGZketTEjif7IvkRSucYVTwWnXGImxhVQ8jB6rko6esDuof LVunKI3a+nNzL+d5IH/06AOeWa9U6AWa0DYj4SkdKct5tgZlFfrQiR2DywY4N3jTRwyf St8g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y22si2435536edv.198.2020.05.14.13.09.13; Thu, 14 May 2020 13:09:41 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728273AbgENTmY (ORCPT + 99 others); Thu, 14 May 2020 15:42:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56246 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1727118AbgENTmY (ORCPT ); Thu, 14 May 2020 15:42: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 6A915C061A0C for ; Thu, 14 May 2020 12:42:24 -0700 (PDT) Received: from dude.hi.pengutronix.de ([2001:67c:670:100:1d::7]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jZJkL-0008Kr-Ok; Thu, 14 May 2020 21:42:21 +0200 Received: from ore by dude.hi.pengutronix.de with local (Exim 4.92) (envelope-from ) id 1jZJkJ-0005js-Cc; Thu, 14 May 2020 21:42:19 +0200 From: Oleksij Rempel To: Andrew Lunn , Florian Fainelli , Heiner Kallweit Cc: Oleksij Rempel , Pengutronix Kernel Team , linux-kernel@vger.kernel.org, "David S. Miller" , netdev@vger.kernel.org, Marek Vasut , David Jander Subject: [PATCH net-next v1] net: phy: tja11xx: execute cable test on link up Date: Thu, 14 May 2020 21:42:18 +0200 Message-Id: <20200514194218.22011-1-o.rempel@pengutronix.de> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::7 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: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A typical 100Base-T1 link should be always connected. If the link is in a shot or open state, it is a failure. In most cases, we won't be able to automatically handle this issue, but we need to log it or notify user (if possible). With this patch, the cable will be tested on "ip l s dev .. up" attempt and send ethnl notification to the user space. This patch was tested with TJA1102 PHY and "ethtool --monitor" command. Signed-off-by: Oleksij Rempel --- drivers/net/phy/nxp-tja11xx.c | 48 +++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/drivers/net/phy/nxp-tja11xx.c b/drivers/net/phy/nxp-tja11xx.c index 8b743d25002b9..0d4f9067ca715 100644 --- a/drivers/net/phy/nxp-tja11xx.c +++ b/drivers/net/phy/nxp-tja11xx.c @@ -180,10 +180,43 @@ static int tja11xx_soft_reset(struct phy_device *phydev) return genphy_soft_reset(phydev); } +static int tja11xx_config_aneg_cable_test(struct phy_device *phydev) +{ + bool finished = false; + int ret; + + if (phydev->link) + return 0; + + if (!phydev->drv->cable_test_start || + !phydev->drv->cable_test_get_status) + return 0; + + ret = ethnl_cable_test_alloc(phydev); + if (ret) + return ret; + + ret = phydev->drv->cable_test_start(phydev); + if (ret) + return ret; + + /* According to the documentation this test takes 100 usec */ + usleep_range(100, 200); + + ret = phydev->drv->cable_test_get_status(phydev, &finished); + if (ret) + return ret; + + if (finished) + ethnl_cable_test_finished(phydev); + + return 0; +} + static int tja11xx_config_aneg(struct phy_device *phydev) { + int ret, changed = 0; u16 ctl = 0; - int ret; switch (phydev->master_slave_set) { case MASTER_SLAVE_CFG_MASTER_FORCE: @@ -193,17 +226,22 @@ static int tja11xx_config_aneg(struct phy_device *phydev) break; case MASTER_SLAVE_CFG_UNKNOWN: case MASTER_SLAVE_CFG_UNSUPPORTED: - return 0; + goto do_test; default: phydev_warn(phydev, "Unsupported Master/Slave mode\n"); return -ENOTSUPP; } - ret = phy_modify_changed(phydev, MII_CFG1, MII_CFG1_MASTER_SLAVE, ctl); - if (ret < 0) + changed = phy_modify_changed(phydev, MII_CFG1, MII_CFG1_MASTER_SLAVE, ctl); + if (changed < 0) + return changed; + +do_test: + ret = tja11xx_config_aneg_cable_test(phydev); + if (ret) return ret; - return __genphy_config_aneg(phydev, ret); + return __genphy_config_aneg(phydev, changed); } static int tja11xx_config_init(struct phy_device *phydev) -- 2.26.2