From patchwork Wed Feb 19 19:42:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerhard Engleder X-Patchwork-Id: 13982827 X-Patchwork-Delegate: kuba@kernel.org Received: from mx09lb.world4you.com (mx09lb.world4you.com [81.19.149.119]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8BD46214A82 for ; Wed, 19 Feb 2025 20:12:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=81.19.149.119 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739995931; cv=none; b=gK9c9aEQRxaevIp1RqvbqmqOzTVTE6rhvj+rOkUjx7FcspVbSTtqhma5+hMJLN69LCFp2EIx5/FOlqXYie4pKB/6rTQ6JWe6KrlZrE8VIfra7ejvkYp7tOBuPn85XCdMdn1HeOIbDNu8NCnC4alhXNCAJ+OFzXwMW8lbe7NkpfQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739995931; c=relaxed/simple; bh=dKIdLRRd27iMdnrw+GlDju4e3Px8MSGtbCrQYwNzaW0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ue+P/w9c4jQtxGJYbKgfVXp9dh4+Aak9JTGfyoDAackgUsUQZSQUr+ywsU2LBPg6EMJrKp21pk5EWna5NwGSEBZywKhUoGTylvqS/y1loch5PeDHyFBnCDBT4Gb4uH5R1jYlP6ps6xktSWv7IT0P8T5QWZ19E/O/i2ELKWSBd8c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com; spf=pass smtp.mailfrom=engleder-embedded.com; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b=TROLF4Rb; arc=none smtp.client-ip=81.19.149.119 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b="TROLF4Rb" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=engleder-embedded.com; s=dkim11; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=hJmjmIuHt/fpZN8dIFwzZaQGRQV/W+DirjW18f3fXTY=; b=TROLF4RbXX9+IHay+hcEjO1R91 hKn4kBKRnn4bUISQ/f6KErBp9QGYLDXNozgIoV726l91PjluBtziZXUsfmzBpWaNIm67WRiTdpF5X ner+EvmJaZk+Vn5oG8/WU/gsO9V/dXE9apVJPDIRC1waN0D3xrY7E1FDemhazErX1gEg=; Received: from 88-117-55-1.adsl.highway.telekom.at ([88.117.55.1] helo=hornet.engleder.at) by mx09lb.world4you.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.97.1) (envelope-from ) id 1tkpxa-000000003mi-2XwN; Wed, 19 Feb 2025 20:42:18 +0100 From: Gerhard Engleder To: andrew@lunn.ch, hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: netdev@vger.kernel.org, Gerhard Engleder Subject: [PATCH net-next v7 1/8] net: phy: Allow loopback speed selection for PHY drivers Date: Wed, 19 Feb 2025 20:42:06 +0100 Message-Id: <20250219194213.10448-2-gerhard@engleder-embedded.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250219194213.10448-1-gerhard@engleder-embedded.com> References: <20250219194213.10448-1-gerhard@engleder-embedded.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-AV-Do-Run: Yes X-ACL-Warn: X-W4Y-Internal X-Patchwork-Delegate: kuba@kernel.org PHY drivers support loopback mode, but it is not possible to select the speed of the loopback mode. The speed is chosen by the set_loopback() operation of the PHY driver. Same is valid for genphy_loopback(). There are PHYs that support loopback with different speeds. Extend set_loopback() to make loopback speed selection possible. Signed-off-by: Gerhard Engleder Reviewed-by: Andrew Lunn --- drivers/net/phy/adin1100.c | 5 ++++- drivers/net/phy/dp83867.c | 5 ++++- drivers/net/phy/marvell.c | 8 +++++++- drivers/net/phy/mxl-gpy.c | 11 +++++++---- drivers/net/phy/phy-c45.c | 5 ++++- drivers/net/phy/phy_device.c | 12 +++++++++--- drivers/net/phy/xilinx_gmii2rgmii.c | 7 ++++--- include/linux/phy.h | 16 ++++++++++++---- 8 files changed, 51 insertions(+), 18 deletions(-) diff --git a/drivers/net/phy/adin1100.c b/drivers/net/phy/adin1100.c index 6bb469429b9d..bd7a47a903ac 100644 --- a/drivers/net/phy/adin1100.c +++ b/drivers/net/phy/adin1100.c @@ -215,8 +215,11 @@ static int adin_resume(struct phy_device *phydev) return adin_set_powerdown_mode(phydev, false); } -static int adin_set_loopback(struct phy_device *phydev, bool enable) +static int adin_set_loopback(struct phy_device *phydev, bool enable, int speed) { + if (enable && speed) + return -EOPNOTSUPP; + if (enable) return phy_set_bits_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_10T1L_CTRL, BMCR_LOOPBACK); diff --git a/drivers/net/phy/dp83867.c b/drivers/net/phy/dp83867.c index c1451df430ac..063266cafe9c 100644 --- a/drivers/net/phy/dp83867.c +++ b/drivers/net/phy/dp83867.c @@ -1009,8 +1009,11 @@ static void dp83867_link_change_notify(struct phy_device *phydev) } } -static int dp83867_loopback(struct phy_device *phydev, bool enable) +static int dp83867_loopback(struct phy_device *phydev, bool enable, int speed) { + if (enable && speed) + return -EOPNOTSUPP; + return phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK, enable ? BMCR_LOOPBACK : 0); } diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index dd254e36ca8a..f2ad675537d1 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c @@ -2131,13 +2131,19 @@ static void marvell_get_stats_simple(struct phy_device *phydev, data[i] = marvell_get_stat_simple(phydev, i); } -static int m88e1510_loopback(struct phy_device *phydev, bool enable) +static int m88e1510_loopback(struct phy_device *phydev, bool enable, int speed) { int err; if (enable) { u16 bmcr_ctl, mscr2_ctl = 0; + if (speed == SPEED_10 || speed == SPEED_100 || + speed == SPEED_1000) + phydev->speed = speed; + else if (speed) + return -EINVAL; + bmcr_ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); err = phy_write(phydev, MII_BMCR, bmcr_ctl); diff --git a/drivers/net/phy/mxl-gpy.c b/drivers/net/phy/mxl-gpy.c index 94d9cb727121..a6cca8d43253 100644 --- a/drivers/net/phy/mxl-gpy.c +++ b/drivers/net/phy/mxl-gpy.c @@ -813,7 +813,7 @@ static void gpy_get_wol(struct phy_device *phydev, wol->wolopts = priv->wolopts; } -static int gpy_loopback(struct phy_device *phydev, bool enable) +static int gpy_loopback(struct phy_device *phydev, bool enable, int speed) { struct gpy_priv *priv = phydev->priv; u16 set = 0; @@ -822,6 +822,9 @@ static int gpy_loopback(struct phy_device *phydev, bool enable) if (enable) { u64 now = get_jiffies_64(); + if (speed) + return -EOPNOTSUPP; + /* wait until 3 seconds from last disable */ if (time_before64(now, priv->lb_dis_to)) msleep(jiffies64_to_msecs(priv->lb_dis_to - now)); @@ -845,15 +848,15 @@ static int gpy_loopback(struct phy_device *phydev, bool enable) return 0; } -static int gpy115_loopback(struct phy_device *phydev, bool enable) +static int gpy115_loopback(struct phy_device *phydev, bool enable, int speed) { struct gpy_priv *priv = phydev->priv; if (enable) - return gpy_loopback(phydev, enable); + return gpy_loopback(phydev, enable, speed); if (priv->fw_minor > 0x76) - return gpy_loopback(phydev, 0); + return gpy_loopback(phydev, 0, 0); return genphy_soft_reset(phydev); } diff --git a/drivers/net/phy/phy-c45.c b/drivers/net/phy/phy-c45.c index dedbdcab83a5..013949506435 100644 --- a/drivers/net/phy/phy-c45.c +++ b/drivers/net/phy/phy-c45.c @@ -1230,8 +1230,11 @@ int gen10g_config_aneg(struct phy_device *phydev) } EXPORT_SYMBOL_GPL(gen10g_config_aneg); -int genphy_c45_loopback(struct phy_device *phydev, bool enable) +int genphy_c45_loopback(struct phy_device *phydev, bool enable, int speed) { + if (enable && speed) + return -EOPNOTSUPP; + return phy_modify_mmd(phydev, MDIO_MMD_PCS, MDIO_CTRL1, MDIO_PCS_CTRL1_LOOPBACK, enable ? MDIO_PCS_CTRL1_LOOPBACK : 0); diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 0d56e7c7f98c..b5d1cad3b0bc 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -2072,9 +2072,9 @@ int phy_loopback(struct phy_device *phydev, bool enable) } if (phydev->drv->set_loopback) - ret = phydev->drv->set_loopback(phydev, enable); + ret = phydev->drv->set_loopback(phydev, enable, 0); else - ret = genphy_loopback(phydev, enable); + ret = genphy_loopback(phydev, enable, 0); if (ret) goto out; @@ -2843,12 +2843,18 @@ int genphy_resume(struct phy_device *phydev) } EXPORT_SYMBOL(genphy_resume); -int genphy_loopback(struct phy_device *phydev, bool enable) +int genphy_loopback(struct phy_device *phydev, bool enable, int speed) { if (enable) { u16 ctl = BMCR_LOOPBACK; int ret, val; + if (speed == SPEED_10 || speed == SPEED_100 || + speed == SPEED_1000) + phydev->speed = speed; + else if (speed) + return -EINVAL; + ctl |= mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); phy_modify(phydev, MII_BMCR, ~0, ctl); diff --git a/drivers/net/phy/xilinx_gmii2rgmii.c b/drivers/net/phy/xilinx_gmii2rgmii.c index 7c51daecf18e..2024d8ef36d9 100644 --- a/drivers/net/phy/xilinx_gmii2rgmii.c +++ b/drivers/net/phy/xilinx_gmii2rgmii.c @@ -64,15 +64,16 @@ static int xgmiitorgmii_read_status(struct phy_device *phydev) return 0; } -static int xgmiitorgmii_set_loopback(struct phy_device *phydev, bool enable) +static int xgmiitorgmii_set_loopback(struct phy_device *phydev, bool enable, + int speed) { struct gmii2rgmii *priv = mdiodev_get_drvdata(&phydev->mdio); int err; if (priv->phy_drv->set_loopback) - err = priv->phy_drv->set_loopback(phydev, enable); + err = priv->phy_drv->set_loopback(phydev, enable, speed); else - err = genphy_loopback(phydev, enable); + err = genphy_loopback(phydev, enable, speed); if (err < 0) return err; diff --git a/include/linux/phy.h b/include/linux/phy.h index 70c632799082..71f9b7d1bfe8 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -1181,8 +1181,16 @@ struct phy_driver { int (*set_tunable)(struct phy_device *dev, struct ethtool_tunable *tuna, const void *data); - /** @set_loopback: Set the loopback mood of the PHY */ - int (*set_loopback)(struct phy_device *dev, bool enable); + /** + * @set_loopback: Set the loopback mode of the PHY + * enable selects if the loopback mode is enabled or disabled. If the + * loopback mode is enabled, then the speed of the loopback mode can be + * requested with the speed argument. If the speed argument is zero, + * then any speed can be selected. If the speed argument is > 0, then + * this speed shall be selected for the loopback mode or EOPNOTSUPP + * shall be returned if speed selection is not supported. + */ + int (*set_loopback)(struct phy_device *dev, bool enable, int speed); /** @get_sqi: Get the signal quality indication */ int (*get_sqi)(struct phy_device *dev); /** @get_sqi_max: Get the maximum signal quality indication */ @@ -1977,7 +1985,7 @@ int genphy_read_status(struct phy_device *phydev); int genphy_read_master_slave(struct phy_device *phydev); int genphy_suspend(struct phy_device *phydev); int genphy_resume(struct phy_device *phydev); -int genphy_loopback(struct phy_device *phydev, bool enable); +int genphy_loopback(struct phy_device *phydev, bool enable, int speed); int genphy_soft_reset(struct phy_device *phydev); irqreturn_t genphy_handle_interrupt_no_ack(struct phy_device *phydev); @@ -2019,7 +2027,7 @@ int genphy_c45_pma_baset1_read_master_slave(struct phy_device *phydev); int genphy_c45_read_status(struct phy_device *phydev); int genphy_c45_baset1_read_status(struct phy_device *phydev); int genphy_c45_config_aneg(struct phy_device *phydev); -int genphy_c45_loopback(struct phy_device *phydev, bool enable); +int genphy_c45_loopback(struct phy_device *phydev, bool enable, int speed); int genphy_c45_pma_resume(struct phy_device *phydev); int genphy_c45_pma_suspend(struct phy_device *phydev); int genphy_c45_fast_retrain(struct phy_device *phydev, bool enable); From patchwork Wed Feb 19 19:42:07 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerhard Engleder X-Patchwork-Id: 13982848 X-Patchwork-Delegate: kuba@kernel.org Received: from mx09lb.world4you.com (mx09lb.world4you.com [81.19.149.119]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A81591DF72D for ; Wed, 19 Feb 2025 20:18:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=81.19.149.119 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739996334; cv=none; b=HBRR9oAOMdHGwOTt2eXym6PQg4B2m2H8yHYgLkX8t+LcdDuByCYdBfE7nCAk9F5CrmvI5Gtk0bmMGz/xpTfrqSIkBSJBDO4PL+YHH5o96j0VPFqurvSJbkQCDrhrww5f1ZOrR65ZdSsUcnJRGORg5+iINgMs0PoJkHD3ABoH9As= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739996334; c=relaxed/simple; bh=dSbD6VsQUEIq3iQnzIQ8QoeiR/pTFgHuETrzjjF23oQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=eS+XoS4gkqMoT33l3lQbvPiI/RpPirIr6zmn//eu53OVcxd8UchXxci9wRUTUXx5A1s5m6olYs2aYzkcxWXDV6afxqDO2cQikXVAyNL/FE4Y4rlYemQ2HWN4QIrmSBDYDeDrXila24DWxlr9oxY9sKqXfdbGSM3XS1o9pYRSs88= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com; spf=pass smtp.mailfrom=engleder-embedded.com; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b=OeYPPOpH; arc=none smtp.client-ip=81.19.149.119 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b="OeYPPOpH" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=engleder-embedded.com; s=dkim11; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=Mrp34RF3bFzPqKsks6pmivCnwuEL4paEE3LYkn16fAo=; b=OeYPPOpHPOKYDBu8qay2TK6Sl1 iKWWUSGrI4l3IpxkZ+nywRZx8xdsQTQDMUGBGI9NVxpcwlKka43NLxcPIMdYHNKBSpGD6LdVw+iUG Yk70iOHhJYUPB7/r9RKggL7eeqNtgvmbQl8HIHpbwkC8z4sf62ssX3FHDMiz3PG9ZcFE=; Received: from 88-117-55-1.adsl.highway.telekom.at ([88.117.55.1] helo=hornet.engleder.at) by mx09lb.world4you.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.97.1) (envelope-from ) id 1tkpxc-000000003mi-0GQA; Wed, 19 Feb 2025 20:42:20 +0100 From: Gerhard Engleder To: andrew@lunn.ch, hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: netdev@vger.kernel.org, Gerhard Engleder Subject: [PATCH net-next v7 2/8] net: phy: Support speed selection for PHY loopback Date: Wed, 19 Feb 2025 20:42:07 +0100 Message-Id: <20250219194213.10448-3-gerhard@engleder-embedded.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250219194213.10448-1-gerhard@engleder-embedded.com> References: <20250219194213.10448-1-gerhard@engleder-embedded.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-AV-Do-Run: Yes X-ACL-Warn: X-W4Y-Internal X-Patchwork-Delegate: kuba@kernel.org phy_loopback() leaves it to the PHY driver to select the speed of the loopback mode. Thus, the speed of the loopback mode depends on the PHY driver in use. Add support for speed selection to phy_loopback() to enable loopback with defined speeds. Ensure that link up is signaled if speed changes as speed is not allowed to change during link up. Link down and up is necessary for a new speed. Signed-off-by: Gerhard Engleder --- drivers/net/ethernet/engleder/tsnep_main.c | 2 +- .../net/ethernet/hisilicon/hns/hns_ethtool.c | 4 +- .../hisilicon/hns3/hns3pf/hclge_main.c | 4 +- .../hisilicon/hns3/hns3pf/hclge_mdio.c | 2 +- .../stmicro/stmmac/stmmac_selftests.c | 8 +- drivers/net/phy/phy.c | 87 +++++++++++++++++++ drivers/net/phy/phy_device.c | 35 -------- include/linux/phy.h | 2 +- net/core/selftests.c | 4 +- 9 files changed, 100 insertions(+), 48 deletions(-) diff --git a/drivers/net/ethernet/engleder/tsnep_main.c b/drivers/net/ethernet/engleder/tsnep_main.c index 18df6a5cbfc6..a16b12137edb 100644 --- a/drivers/net/ethernet/engleder/tsnep_main.c +++ b/drivers/net/ethernet/engleder/tsnep_main.c @@ -230,7 +230,7 @@ static int tsnep_phy_loopback(struct tsnep_adapter *adapter, bool enable) { int retval; - retval = phy_loopback(adapter->phydev, enable); + retval = phy_loopback(adapter->phydev, enable, 0); /* PHY link state change is not signaled if loopback is enabled, it * would delay a working loopback anyway, let's ensure that loopback diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c index 6c458f037262..60a586a951a0 100644 --- a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c +++ b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c @@ -266,9 +266,9 @@ static int hns_nic_config_phy_loopback(struct phy_device *phy_dev, u8 en) if (err) goto out; - err = phy_loopback(phy_dev, true); + err = phy_loopback(phy_dev, true, 0); } else { - err = phy_loopback(phy_dev, false); + err = phy_loopback(phy_dev, false, 0); if (err) goto out; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index 3f17b3073e50..f8161d6eb152 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -7875,7 +7875,7 @@ static int hclge_enable_phy_loopback(struct hclge_dev *hdev, if (ret) return ret; - return phy_loopback(phydev, true); + return phy_loopback(phydev, true, 0); } static int hclge_disable_phy_loopback(struct hclge_dev *hdev, @@ -7883,7 +7883,7 @@ static int hclge_disable_phy_loopback(struct hclge_dev *hdev, { int ret; - ret = phy_loopback(phydev, false); + ret = phy_loopback(phydev, false, 0); if (ret) return ret; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c index 80079657afeb..9a456ebf9b7c 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c @@ -258,7 +258,7 @@ void hclge_mac_start_phy(struct hclge_dev *hdev) if (!phydev) return; - phy_loopback(phydev, false); + phy_loopback(phydev, false, 0); phy_start(phydev); } diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c index 3ca1c2a816ff..a01bc394d1ac 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c @@ -382,14 +382,14 @@ static int stmmac_test_phy_loopback(struct stmmac_priv *priv) if (!priv->dev->phydev) return -EOPNOTSUPP; - ret = phy_loopback(priv->dev->phydev, true); + ret = phy_loopback(priv->dev->phydev, true, 0); if (ret) return ret; attr.dst = priv->dev->dev_addr; ret = __stmmac_test_loopback(priv, &attr); - phy_loopback(priv->dev->phydev, false); + phy_loopback(priv->dev->phydev, false, 0); return ret; } @@ -1985,7 +1985,7 @@ void stmmac_selftest_run(struct net_device *dev, case STMMAC_LOOPBACK_PHY: ret = -EOPNOTSUPP; if (dev->phydev) - ret = phy_loopback(dev->phydev, true); + ret = phy_loopback(dev->phydev, true, 0); if (!ret) break; fallthrough; @@ -2018,7 +2018,7 @@ void stmmac_selftest_run(struct net_device *dev, case STMMAC_LOOPBACK_PHY: ret = -EOPNOTSUPP; if (dev->phydev) - ret = phy_loopback(dev->phydev, false); + ret = phy_loopback(dev->phydev, false, 0); if (!ret) break; fallthrough; diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index f2086b0b7b76..95e29a69c08c 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -1722,6 +1722,93 @@ void phy_mac_interrupt(struct phy_device *phydev) } EXPORT_SYMBOL(phy_mac_interrupt); +/** + * phy_loopback - Configure loopback mode of PHY + * @phydev: target phy_device struct + * @enable: enable or disable loopback mode + * @speed: enable loopback mode with speed + * + * Configure loopback mode of PHY and signal link down and link up if speed is + * changing. + * + * Return: 0 on success, negative error code on failure. + */ +int phy_loopback(struct phy_device *phydev, bool enable, int speed) +{ + bool link_up = false; + int ret = 0; + + if (!phydev->drv) + return -EIO; + + mutex_lock(&phydev->lock); + + if (enable && phydev->loopback_enabled) { + ret = -EBUSY; + goto out; + } + + if (!enable && !phydev->loopback_enabled) { + ret = -EINVAL; + goto out; + } + + if (enable) { + /* + * Link up is signaled with a defined speed. If speed changes, + * then first link down and after that link up needs to be + * signaled. + */ + if (phydev->link && phydev->state == PHY_RUNNING) { + /* link is up and signaled */ + if (speed && phydev->speed != speed) { + /* signal link down and up for new speed */ + phydev->link = false; + phydev->state = PHY_NOLINK; + phy_link_down(phydev); + + link_up = true; + } + } else { + /* link is not signaled */ + if (speed) { + /* signal link up for new speed */ + link_up = true; + } + } + } + + if (phydev->drv->set_loopback) + ret = phydev->drv->set_loopback(phydev, enable, speed); + else + ret = genphy_loopback(phydev, enable, speed); + + if (ret) { + if (enable) { + /* try to restore link if enabling loopback fails */ + if (phydev->drv->set_loopback) + phydev->drv->set_loopback(phydev, false, 0); + else + genphy_loopback(phydev, false, 0); + } + + goto out; + } + + if (link_up) { + phydev->link = true; + phydev->state = PHY_RUNNING; + phy_link_up(phydev); + } + + phydev->loopback_enabled = enable; + +out: + mutex_unlock(&phydev->lock); + return ret; +} +EXPORT_SYMBOL(phy_loopback); + /** * phy_eee_tx_clock_stop_capable() - indicate whether the MAC can stop tx clock * @phydev: target phy_device struct diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index b5d1cad3b0bc..5f9a9edda0e1 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -2052,41 +2052,6 @@ int phy_resume(struct phy_device *phydev) } EXPORT_SYMBOL(phy_resume); -int phy_loopback(struct phy_device *phydev, bool enable) -{ - int ret = 0; - - if (!phydev->drv) - return -EIO; - - mutex_lock(&phydev->lock); - - if (enable && phydev->loopback_enabled) { - ret = -EBUSY; - goto out; - } - - if (!enable && !phydev->loopback_enabled) { - ret = -EINVAL; - goto out; - } - - if (phydev->drv->set_loopback) - ret = phydev->drv->set_loopback(phydev, enable, 0); - else - ret = genphy_loopback(phydev, enable, 0); - - if (ret) - goto out; - - phydev->loopback_enabled = enable; - -out: - mutex_unlock(&phydev->lock); - return ret; -} -EXPORT_SYMBOL(phy_loopback); - /** * phy_reset_after_clk_enable - perform a PHY reset if needed * @phydev: target phy_device struct diff --git a/include/linux/phy.h b/include/linux/phy.h index 71f9b7d1bfe8..2de5d7b73acf 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -1870,7 +1870,7 @@ int phy_init_hw(struct phy_device *phydev); int phy_suspend(struct phy_device *phydev); int phy_resume(struct phy_device *phydev); int __phy_resume(struct phy_device *phydev); -int phy_loopback(struct phy_device *phydev, bool enable); +int phy_loopback(struct phy_device *phydev, bool enable, int speed); int phy_sfp_connect_phy(void *upstream, struct phy_device *phy); void phy_sfp_disconnect_phy(void *upstream, struct phy_device *phy); void phy_sfp_attach(void *upstream, struct sfp_bus *bus); diff --git a/net/core/selftests.c b/net/core/selftests.c index 8f801e6e3b91..e99ae983fca9 100644 --- a/net/core/selftests.c +++ b/net/core/selftests.c @@ -299,7 +299,7 @@ static int net_test_phy_loopback_enable(struct net_device *ndev) if (!ndev->phydev) return -EOPNOTSUPP; - return phy_loopback(ndev->phydev, true); + return phy_loopback(ndev->phydev, true, 0); } static int net_test_phy_loopback_disable(struct net_device *ndev) @@ -307,7 +307,7 @@ static int net_test_phy_loopback_disable(struct net_device *ndev) if (!ndev->phydev) return -EOPNOTSUPP; - return phy_loopback(ndev->phydev, false); + return phy_loopback(ndev->phydev, false, 0); } static int net_test_phy_loopback_udp(struct net_device *ndev) From patchwork Wed Feb 19 19:42:08 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerhard Engleder X-Patchwork-Id: 13982823 X-Patchwork-Delegate: kuba@kernel.org Received: from mx09lb.world4you.com (mx09lb.world4you.com [81.19.149.119]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8A6EB1ADC86 for ; Wed, 19 Feb 2025 19:52:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=81.19.149.119 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739994756; cv=none; b=ltHE1haJ2HxbpA5moajLsXEbQGc/yBJLv7nspTUuh+3ZVhye6yVuEKlrhO7fkVF2q2gtFPikp7iq+9/wcMexIAKq3pCpwmPSYWqbJtX/ylMU/rQamGGUgLHyovJ8ZhhQwV/XkU/LreitQHBaIwg9fNEtSaCJqGvyIK4A12FPWbo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739994756; c=relaxed/simple; bh=QEKHIQ5ErvkvJyId9qVE83R+XW0uQ2qd9xh/n86cAXk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=u1Rd+l0gSUlrf32ngXWag1xlY7WviL/IJGosxp8rzA5tMRZjp7/PJ+GaWgiFNRWoArlP9pP8hA/6dysUCrxoMSDsRfjdLb+FwENe7K0E07m7LSIniytpDkAmKOqNvNCvPfBqkFjPdsYFatshZTEFY7lPFl5iL1Ao6bo4hFYueBQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com; spf=pass smtp.mailfrom=engleder-embedded.com; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b=s425i+Dj; arc=none smtp.client-ip=81.19.149.119 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b="s425i+Dj" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=engleder-embedded.com; s=dkim11; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=RaQrNGqtJlx0rIA/HDsTPrByyWliWNtnWVUHMoJu1t8=; b=s425i+DjfWlknCmTOg8J9ZhYHS VexmBs4B4kPXhW9uSbdKx1el6NJW0wa0iQfi4R/ihVaODT1OUMqE59BkUSA6Dzeb04Xw8H9c9hrYb O1WX8jXXcpV6nbpOyjMPCLkqXJjBxAOEjchoD+abwgMuve3QnWbwO3EpFFod+8P5dXKU=; Received: from 88-117-55-1.adsl.highway.telekom.at ([88.117.55.1] helo=hornet.engleder.at) by mx09lb.world4you.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.97.1) (envelope-from ) id 1tkpxd-000000003mi-25Ob; Wed, 19 Feb 2025 20:42:21 +0100 From: Gerhard Engleder To: andrew@lunn.ch, hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: netdev@vger.kernel.org, Gerhard Engleder Subject: [PATCH net-next v7 3/8] net: phy: micrel: Add loopback support Date: Wed, 19 Feb 2025 20:42:08 +0100 Message-Id: <20250219194213.10448-4-gerhard@engleder-embedded.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250219194213.10448-1-gerhard@engleder-embedded.com> References: <20250219194213.10448-1-gerhard@engleder-embedded.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-AV-Do-Run: Yes X-ACL-Warn: X-W4Y-Internal X-Patchwork-Delegate: kuba@kernel.org The KSZ9031 PHYs requires full duplex for loopback mode. Add PHY specific set_loopback() to ensure this. Signed-off-by: Gerhard Engleder --- drivers/net/phy/micrel.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 9c0b1c229af6..f375832e3987 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@ -1030,6 +1030,29 @@ static int ksz9021_config_init(struct phy_device *phydev) #define MII_KSZ9031RN_EDPD 0x23 #define MII_KSZ9031RN_EDPD_ENABLE BIT(0) +static int ksz9031_set_loopback(struct phy_device *phydev, bool enable, + int speed) +{ + u16 ctl = BMCR_LOOPBACK; + int val; + + if (!enable) + return genphy_loopback(phydev, enable, 0); + + if (speed == SPEED_10 || speed == SPEED_100 || speed == SPEED_1000) + phydev->speed = speed; + else if (speed) + return -EINVAL; + phydev->duplex = DUPLEX_FULL; + + ctl |= mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); + + phy_write(phydev, MII_BMCR, ctl); + + return phy_read_poll_timeout(phydev, MII_BMSR, val, val & BMSR_LSTATUS, + 5000, 500000, true); +} + static int ksz9031_of_load_skew_values(struct phy_device *phydev, const struct device_node *of_node, u16 reg, size_t field_sz, @@ -5564,6 +5587,7 @@ static struct phy_driver ksphy_driver[] = { .resume = kszphy_resume, .cable_test_start = ksz9x31_cable_test_start, .cable_test_get_status = ksz9x31_cable_test_get_status, + .set_loopback = ksz9031_set_loopback, }, { .phy_id = PHY_ID_LAN8814, .phy_id_mask = MICREL_PHY_ID_MASK, From patchwork Wed Feb 19 19:42:09 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerhard Engleder X-Patchwork-Id: 13982826 X-Patchwork-Delegate: kuba@kernel.org Received: from mx09lb.world4you.com (mx09lb.world4you.com [81.19.149.119]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D156522D7A0 for ; Wed, 19 Feb 2025 20:11:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=81.19.149.119 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739995913; cv=none; b=lO8l07Ekj55DpP95DMvH1zwNpXhfO/qbhvK6i7dS6TSyLu/ZxsZrQMWLOa4T9+AjeUuUrWefPEI7Z2u8hiNf9uNGcgClCm3XYokhs6eoOa2PaLmKM5lZeGewOeJwJi4b5IOntuYBb1h5CbjeHOT35AmQYo4E2+YyJUU17IxWUrU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739995913; c=relaxed/simple; bh=S2dE/z0aGsnbY8NdaLYNkmZW9KztXUsXLqLz6hIA4B8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=WznUDso7kkazlUJcx+R+OF30tl5uL/oopBrKV0Hu7YPUjc5WWaXLB67/dnaxnxunEyq8qj6Xk6FnPYhDURILs5JFZGmo+ulzG57mRtCcV0zY0m8985bi2x2soGr7Sxc0xZ7ZUmkrrpd071UlAIajj8kEEkGQIwf50xjJcBLCniQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com; spf=pass smtp.mailfrom=engleder-embedded.com; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b=vgv5SCtS; arc=none smtp.client-ip=81.19.149.119 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b="vgv5SCtS" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=engleder-embedded.com; s=dkim11; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=ZiPc592vzeYKTRjw+Zr7BdQk9/pym+uW6W6CjjQX6Oc=; b=vgv5SCtSaEvT1Piov77zBMh6J3 CHpyvecb4EZccgLpZ3QoqA6yziv79SgVsJi51mU14vcwv1oCeGy/yscFhhnhPs6MnlzbiC0mNClL/ AHDnYNqK6pxFKuUgQmiOmM+t3xdw9bRe8Gt77p4VpRhJ5zkO4QdeRBYfj/2oKl28GXC0=; Received: from 88-117-55-1.adsl.highway.telekom.at ([88.117.55.1] helo=hornet.engleder.at) by mx09lb.world4you.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.97.1) (envelope-from ) id 1tkpxe-000000003mi-3d1A; Wed, 19 Feb 2025 20:42:23 +0100 From: Gerhard Engleder To: andrew@lunn.ch, hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: netdev@vger.kernel.org, Gerhard Engleder Subject: [PATCH net-next v7 4/8] net: phy: marvell: Align set_loopback() implementation Date: Wed, 19 Feb 2025 20:42:09 +0100 Message-Id: <20250219194213.10448-5-gerhard@engleder-embedded.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250219194213.10448-1-gerhard@engleder-embedded.com> References: <20250219194213.10448-1-gerhard@engleder-embedded.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-AV-Do-Run: Yes X-ACL-Warn: X-W4Y-Internal X-Patchwork-Delegate: kuba@kernel.org Use genphy_loopback() to disable loopback like ksz9031_set_loopback(). This way disable loopback is implemented only once within genphy_loopback() and the set_loopback() implementations look similar. Also fix comment about msleep() in the out-of loopback case which is not executed in the out-of loopback case. Suggested-by: Andrew Lunn Signed-off-by: Gerhard Engleder Reviewed-by: Andrew Lunn --- drivers/net/phy/marvell.c | 72 ++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index f2ad675537d1..623292948fa7 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c @@ -2133,56 +2133,50 @@ static void marvell_get_stats_simple(struct phy_device *phydev, static int m88e1510_loopback(struct phy_device *phydev, bool enable, int speed) { + u16 bmcr_ctl, mscr2_ctl = 0; int err; - if (enable) { - u16 bmcr_ctl, mscr2_ctl = 0; + if (!enable) + return genphy_loopback(phydev, enable, 0); - if (speed == SPEED_10 || speed == SPEED_100 || - speed == SPEED_1000) - phydev->speed = speed; - else if (speed) - return -EINVAL; - - bmcr_ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); - - err = phy_write(phydev, MII_BMCR, bmcr_ctl); - if (err < 0) - return err; + if (speed == SPEED_10 || speed == SPEED_100 || speed == SPEED_1000) + phydev->speed = speed; + else if (speed) + return -EINVAL; - if (phydev->speed == SPEED_1000) - mscr2_ctl = BMCR_SPEED1000; - else if (phydev->speed == SPEED_100) - mscr2_ctl = BMCR_SPEED100; + bmcr_ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); - err = phy_modify_paged(phydev, MII_MARVELL_MSCR_PAGE, - MII_88E1510_MSCR_2, BMCR_SPEED1000 | - BMCR_SPEED100, mscr2_ctl); - if (err < 0) - return err; + err = phy_write(phydev, MII_BMCR, bmcr_ctl); + if (err < 0) + return err; - /* Need soft reset to have speed configuration takes effect */ - err = genphy_soft_reset(phydev); - if (err < 0) - return err; + if (phydev->speed == SPEED_1000) + mscr2_ctl = BMCR_SPEED1000; + else if (phydev->speed == SPEED_100) + mscr2_ctl = BMCR_SPEED100; - err = phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK, - BMCR_LOOPBACK); + err = phy_modify_paged(phydev, MII_MARVELL_MSCR_PAGE, + MII_88E1510_MSCR_2, BMCR_SPEED1000 | + BMCR_SPEED100, mscr2_ctl); + if (err < 0) + return err; - if (!err) { - /* It takes some time for PHY device to switch - * into/out-of loopback mode. - */ - msleep(1000); - } + /* Need soft reset to have speed configuration takes effect */ + err = genphy_soft_reset(phydev); + if (err < 0) return err; - } else { - err = phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK, 0); - if (err < 0) - return err; - return phy_config_aneg(phydev); + err = phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK, + BMCR_LOOPBACK); + + if (!err) { + /* + * It takes some time for PHY device to switch into loopback + * mode. + */ + msleep(1000); } + return err; } static int marvell_vct5_wait_complete(struct phy_device *phydev) From patchwork Wed Feb 19 19:42:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerhard Engleder X-Patchwork-Id: 13982828 X-Patchwork-Delegate: kuba@kernel.org Received: from mx09lb.world4you.com (mx09lb.world4you.com [81.19.149.119]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3454322D4C9 for ; Wed, 19 Feb 2025 20:14:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=81.19.149.119 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739996062; cv=none; b=QDn/qFskSiJH0wVi1fg5TX2PQC+cY8O0Sx9zMkSDAnrKLX/5ak+ydvNqPpm5qk3G/GZpx5FXW6aLwIlH7ZU7r40EQeGJkGjiqdoW5SFQ7KOy0QWkilm0dZ7q4R3hRbfAz0CLP4YZ9IovO3RldF4eDIN8aX4KWYeGYl7D+PgZuS8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739996062; c=relaxed/simple; bh=YeBYrwSQEp0dNNZNpUaqkukDqYYjQW4pZLiqS6JrucA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=uRKQtqBtOljh4u4kIKnBbr1u/Wp5dpnY97W04ubPnoekVs7I6B55FCsotEj5Yssu6K7BhE2LGLaZhItQ3xfiJTJhxi8Wkwc0+lWbvH542IVgqk553WsJNVYGH3rvyNdQvtRvOzce2e2i47OAXiF5RvBnDrS/CI2VAgWfel0ycqk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com; spf=pass smtp.mailfrom=engleder-embedded.com; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b=Bf9nxhZu; arc=none smtp.client-ip=81.19.149.119 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b="Bf9nxhZu" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=engleder-embedded.com; s=dkim11; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=uReMLVAbSNd7wQC1AA3HmaHs8nu68miO7fUikGXVTmI=; b=Bf9nxhZuo75wfTxUpRUeK7U79T XsDnggYo/tUauqv3Wc6J3lro2C4/dkXraiFnrCp2nuAAg1GHPsLZmoCHFQFh1OzLCB1lDJ8286tB9 fE21xeqduHyJ0vX+fnEii9CprLhv5nHhH294/AkvWgpWjAH1bwijMkGzR6//Adc2BWw8=; Received: from 88-117-55-1.adsl.highway.telekom.at ([88.117.55.1] helo=hornet.engleder.at) by mx09lb.world4you.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.97.1) (envelope-from ) id 1tkpxg-000000003mi-1EQB; Wed, 19 Feb 2025 20:42:24 +0100 From: Gerhard Engleder To: andrew@lunn.ch, hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: netdev@vger.kernel.org, Gerhard Engleder Subject: [PATCH net-next v7 5/8] tsnep: Select speed for loopback Date: Wed, 19 Feb 2025 20:42:10 +0100 Message-Id: <20250219194213.10448-6-gerhard@engleder-embedded.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250219194213.10448-1-gerhard@engleder-embedded.com> References: <20250219194213.10448-1-gerhard@engleder-embedded.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-AV-Do-Run: Yes X-ACL-Warn: X-W4Y-Internal X-Patchwork-Delegate: kuba@kernel.org Use 100 Mbps only if the PHY is configured to this speed. Otherwise use always the maximum speed of 1000 Mbps. Also remove explicit setting of carrier on and link mode after loopback. This is not needed anymore, because phy_loopback() with selected speed signals the link and the speed to the MAC. Signed-off-by: Gerhard Engleder Reviewed-by: Andrew Lunn --- drivers/net/ethernet/engleder/tsnep_main.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/engleder/tsnep_main.c b/drivers/net/ethernet/engleder/tsnep_main.c index a16b12137edb..d77a5b423c4c 100644 --- a/drivers/net/ethernet/engleder/tsnep_main.c +++ b/drivers/net/ethernet/engleder/tsnep_main.c @@ -228,20 +228,19 @@ static void tsnep_phy_link_status_change(struct net_device *netdev) static int tsnep_phy_loopback(struct tsnep_adapter *adapter, bool enable) { - int retval; - - retval = phy_loopback(adapter->phydev, enable, 0); + int speed; - /* PHY link state change is not signaled if loopback is enabled, it - * would delay a working loopback anyway, let's ensure that loopback - * is working immediately by setting link mode directly - */ - if (!retval && enable) { - netif_carrier_on(adapter->netdev); - tsnep_set_link_mode(adapter); + if (enable) { + if (adapter->phydev->autoneg == AUTONEG_DISABLE && + adapter->phydev->speed == SPEED_100) + speed = SPEED_100; + else + speed = SPEED_1000; + } else { + speed = 0; } - return retval; + return phy_loopback(adapter->phydev, enable, speed); } static int tsnep_phy_open(struct tsnep_adapter *adapter) From patchwork Wed Feb 19 19:42:11 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerhard Engleder X-Patchwork-Id: 13982831 X-Patchwork-Delegate: kuba@kernel.org Received: from mx09lb.world4you.com (mx09lb.world4you.com [81.19.149.119]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 964C722DFB4 for ; Wed, 19 Feb 2025 20:14:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=81.19.149.119 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739996070; cv=none; b=tM1MQhIgboculuDEuX4W+tMMeEsPdiQ7w7Xz0V8hRlfIPg3XftfIAwtW/7sXxbvudsELez/aYtKhkn/DPqDSr10TIH5kA1NoOfihGJy51p29rDsp2gMIR0rROURKbqEeKZsVTQ3l//NNlklm6F0r8nw72q+hu2lW6enF0tf9DJs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739996070; c=relaxed/simple; bh=YVcHp7FIcc46OutUa1ihvCX9HvOvTdeIjeMjnnnE32Y=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=CRUjBggbFrZvrV8j1Ph3xSdLktdepDibWzoyXNiO6XePPxuVGGc0O5kzic+GR+hlLb8xxTGEWVFSh+PXbrULUddcJLSr96YoVYvQvo5TTpXip58hbAC0HF83JH28Pc67YHL/Zh5UV6bqDo0OsWavFgebilF4SzeZzNvPQfCnetI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com; spf=pass smtp.mailfrom=engleder-embedded.com; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b=hUPYVCh6; arc=none smtp.client-ip=81.19.149.119 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b="hUPYVCh6" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=engleder-embedded.com; s=dkim11; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=XRJu28hCi5goY3hxb5ko3/+rGjUUldnEbyCZWnL99qE=; b=hUPYVCh6fLcRUYFIP8uOWZRsvM SCctlrziqT0Aa5O+cpL8nb75SUEDo9ayxhhQMoNLkVqVRrEmYTMp7fJLjBjcuR9J3dZjhEpv/Qkz3 MQOEh4bBRkg8KmkaOhHiz8XVO0j7cUNNsD5QVae8VVEzPx7N9x6QfPb2HJ64PljgTf6c=; Received: from 88-117-55-1.adsl.highway.telekom.at ([88.117.55.1] helo=hornet.engleder.at) by mx09lb.world4you.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.97.1) (envelope-from ) id 1tkpxh-000000003mi-3Qjc; Wed, 19 Feb 2025 20:42:26 +0100 From: Gerhard Engleder To: andrew@lunn.ch, hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: netdev@vger.kernel.org, Gerhard Engleder , Oleksij Rempel Subject: [PATCH net-next v7 6/8] net: selftests: Support selftest sets Date: Wed, 19 Feb 2025 20:42:11 +0100 Message-Id: <20250219194213.10448-7-gerhard@engleder-embedded.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250219194213.10448-1-gerhard@engleder-embedded.com> References: <20250219194213.10448-1-gerhard@engleder-embedded.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-AV-Do-Run: Yes X-ACL-Warn: X-W4Y-Internal X-Patchwork-Delegate: kuba@kernel.org Currently only one test set is supported. Extend selftests to support multiple test sets which can be combined by network drivers. Signed-off-by: Gerhard Engleder CC: Oleksij Rempel --- include/net/selftests.h | 27 ++++++++ net/core/selftests.c | 138 ++++++++++++++++++++++++++-------------- 2 files changed, 119 insertions(+), 46 deletions(-) diff --git a/include/net/selftests.h b/include/net/selftests.h index e65e8d230d33..a3e9bb959e3d 100644 --- a/include/net/selftests.h +++ b/include/net/selftests.h @@ -4,6 +4,14 @@ #include +/** + * enum net_selftest_set - selftest set ID + * @NET_SELFTEST_CARRIER: Loopback tests based on carrier speed + */ +enum net_selftest_set { + NET_TEST_LOOPBACK_CARRIER = 0, +}; + #if IS_ENABLED(CONFIG_NET_SELFTESTS) void net_selftest(struct net_device *ndev, struct ethtool_test *etest, @@ -11,6 +19,11 @@ void net_selftest(struct net_device *ndev, struct ethtool_test *etest, int net_selftest_get_count(void); void net_selftest_get_strings(u8 *data); +void net_selftest_set(int set, struct net_device *ndev, + struct ethtool_test *etest, u64 *buf); +int net_selftest_set_get_count(int set); +void net_selftest_set_get_strings(int set, u8 **data); + #else static inline void net_selftest(struct net_device *ndev, struct ethtool_test *etest, @@ -27,5 +40,19 @@ static inline void net_selftest_get_strings(u8 *data) { } +static inline void net_selftest_set(int set, struct net_device *ndev, + struct ethtool_test *etest, u64 *buf) +{ +} + +static inline int net_selftest_set_get_count(int set, void) +{ + return 0; +} + +static inline void net_selftest_set_get_strings(int set, u8 *data) +{ +} + #endif #endif /* _NET_SELFTESTS */ diff --git a/net/core/selftests.c b/net/core/selftests.c index e99ae983fca9..3a597a38566e 100644 --- a/net/core/selftests.c +++ b/net/core/selftests.c @@ -284,17 +284,37 @@ static int __net_test_loopback(struct net_device *ndev, return ret; } -static int net_test_netif_carrier(struct net_device *ndev) +struct net_test { + const char *name; + int (*fn)(struct net_device *ndev); +}; + +/** + * NET_TEST - Define a selftest. + * @_name: Selftest name. + * @_string: Selftest string. + */ +#define NET_TEST(_name, _string) \ + struct net_test net_test_##_name = { \ + .name = _string, \ + .fn = net_test_##_name##_fn, \ + } + +static int net_test_netif_carrier_fn(struct net_device *ndev) { return netif_carrier_ok(ndev) ? 0 : -ENOLINK; } -static int net_test_phy_phydev(struct net_device *ndev) +static const NET_TEST(netif_carrier, "Carrier"); + +static int net_test_phy_phydev_fn(struct net_device *ndev) { return ndev->phydev ? 0 : -EOPNOTSUPP; } -static int net_test_phy_loopback_enable(struct net_device *ndev) +static const NET_TEST(phy_phydev, "PHY dev is present"); + +static int net_test_phy_loopback_enable_fn(struct net_device *ndev) { if (!ndev->phydev) return -EOPNOTSUPP; @@ -302,7 +322,9 @@ static int net_test_phy_loopback_enable(struct net_device *ndev) return phy_loopback(ndev->phydev, true, 0); } -static int net_test_phy_loopback_disable(struct net_device *ndev) +static const NET_TEST(phy_loopback_enable, "PHY loopback enable"); + +static int net_test_phy_loopback_disable_fn(struct net_device *ndev) { if (!ndev->phydev) return -EOPNOTSUPP; @@ -310,7 +332,9 @@ static int net_test_phy_loopback_disable(struct net_device *ndev) return phy_loopback(ndev->phydev, false, 0); } -static int net_test_phy_loopback_udp(struct net_device *ndev) +static const NET_TEST(phy_loopback_disable, "PHY loopback disable"); + +static int net_test_phy_loopback_udp_fn(struct net_device *ndev) { struct net_packet_attrs attr = { }; @@ -318,7 +342,9 @@ static int net_test_phy_loopback_udp(struct net_device *ndev) return __net_test_loopback(ndev, &attr); } -static int net_test_phy_loopback_udp_mtu(struct net_device *ndev) +static const NET_TEST(phy_loopback_udp, "PHY loopback UDP"); + +static int net_test_phy_loopback_udp_mtu_fn(struct net_device *ndev) { struct net_packet_attrs attr = { }; @@ -327,7 +353,9 @@ static int net_test_phy_loopback_udp_mtu(struct net_device *ndev) return __net_test_loopback(ndev, &attr); } -static int net_test_phy_loopback_tcp(struct net_device *ndev) +static const NET_TEST(phy_loopback_udp_mtu, "PHY loopback MTU"); + +static int net_test_phy_loopback_tcp_fn(struct net_device *ndev) { struct net_packet_attrs attr = { }; @@ -336,72 +364,90 @@ static int net_test_phy_loopback_tcp(struct net_device *ndev) return __net_test_loopback(ndev, &attr); } -static const struct net_test { - char name[ETH_GSTRING_LEN]; - int (*fn)(struct net_device *ndev); -} net_selftests[] = { - { - .name = "Carrier ", - .fn = net_test_netif_carrier, - }, { - .name = "PHY dev is present ", - .fn = net_test_phy_phydev, - }, { - /* This test should be done before all PHY loopback test */ - .name = "PHY internal loopback, enable ", - .fn = net_test_phy_loopback_enable, - }, { - .name = "PHY internal loopback, UDP ", - .fn = net_test_phy_loopback_udp, - }, { - .name = "PHY internal loopback, MTU ", - .fn = net_test_phy_loopback_udp_mtu, - }, { - .name = "PHY internal loopback, TCP ", - .fn = net_test_phy_loopback_tcp, - }, { - /* This test should be done after all PHY loopback test */ - .name = "PHY internal loopback, disable", - .fn = net_test_phy_loopback_disable, - }, +static const NET_TEST(phy_loopback_tcp, "PHY loopback TCP"); + +static const struct net_test *net_selftests_carrier[] = { + &net_test_netif_carrier, + &net_test_phy_phydev, + &net_test_phy_loopback_enable, + &net_test_phy_loopback_udp, + &net_test_phy_loopback_udp_mtu, + &net_test_phy_loopback_tcp, + &net_test_phy_loopback_disable, }; -void net_selftest(struct net_device *ndev, struct ethtool_test *etest, u64 *buf) +static const struct net_test **net_selftests_set_get(int set) +{ + switch (set) { + case NET_TEST_LOOPBACK_CARRIER: + return net_selftests_carrier; + } + + return NULL; +} + +void net_selftest_set(int set, struct net_device *ndev, + struct ethtool_test *etest, u64 *buf) { - int count = net_selftest_get_count(); + const struct net_test **selftests = net_selftests_set_get(set); + int count = net_selftest_set_get_count(set); int i; memset(buf, 0, sizeof(*buf) * count); net_test_next_id = 0; - if (etest->flags != ETH_TEST_FL_OFFLINE) { + if (!(etest->flags & ETH_TEST_FL_OFFLINE)) { netdev_err(ndev, "Only offline tests are supported\n"); etest->flags |= ETH_TEST_FL_FAILED; return; } - for (i = 0; i < count; i++) { - buf[i] = net_selftests[i].fn(ndev); + buf[i] = selftests[i]->fn(ndev); if (buf[i] && (buf[i] != -EOPNOTSUPP)) etest->flags |= ETH_TEST_FL_FAILED; } } +EXPORT_SYMBOL_GPL(net_selftest_set); + +int net_selftest_set_get_count(int set) +{ + switch (set) { + case NET_TEST_LOOPBACK_CARRIER: + return ARRAY_SIZE(net_selftests_carrier); + default: + return -EINVAL; + } +} +EXPORT_SYMBOL_GPL(net_selftest_set_get_count); + +void net_selftest_set_get_strings(int set, u8 **data) +{ + const struct net_test **selftests = net_selftests_set_get(set); + int count = net_selftest_set_get_count(set); + int i; + + /* right pad strings for aligned ethtool output */ + for (i = 0; i < count; i++) + ethtool_sprintf(data, "%-30s", selftests[i]->name); +} +EXPORT_SYMBOL_GPL(net_selftest_set_get_strings); + +void net_selftest(struct net_device *ndev, struct ethtool_test *etest, u64 *buf) +{ + net_selftest_set(NET_TEST_LOOPBACK_CARRIER, ndev, etest, buf); +} EXPORT_SYMBOL_GPL(net_selftest); int net_selftest_get_count(void) { - return ARRAY_SIZE(net_selftests); + return net_selftest_set_get_count(NET_TEST_LOOPBACK_CARRIER); } EXPORT_SYMBOL_GPL(net_selftest_get_count); void net_selftest_get_strings(u8 *data) { - int i; - - for (i = 0; i < net_selftest_get_count(); i++) - ethtool_sprintf(&data, "%2d. %s", i + 1, - net_selftests[i].name); + net_selftest_set_get_strings(NET_TEST_LOOPBACK_CARRIER, &data); } EXPORT_SYMBOL_GPL(net_selftest_get_strings); From patchwork Wed Feb 19 19:42:12 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerhard Engleder X-Patchwork-Id: 13982804 X-Patchwork-Delegate: kuba@kernel.org Received: from mx09lb.world4you.com (mx09lb.world4you.com [81.19.149.119]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2EBFA21C9E5 for ; Wed, 19 Feb 2025 19:42:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=81.19.149.119 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739994152; cv=none; b=qPc3LIO7WvvQeDVcagV28Q+yY9WJCjxccwra9DpBsHkyXyVcZQ6A/+H1WQa6Iwq3M8z0EHgn2iQAl3veEDaWbKOqxLTPJ718lrbEs5oTLaucgygJVUGDKMFID0xALBE7KUbfQN6eXJWG4X3hkKO/MUWS/HuLtY9yBlsCDizk2R0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739994152; c=relaxed/simple; bh=+pvgzGgR29YlwgpcA1b3/w29dCZWpHGbhvKDb9QYVOI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=A4RlHbgD1psZmRXCmbqWdfEnVl8RIc0b0vAAtqei5X/VmRYkg/+93ZbLKhxGgpGnqzcCzQzz6HipJjO/x0WUdqsBXFqbWj8LYTM1hDFvb+SVKaMhtX2LhsFfXbXeIukDQPlbI3S8yKBBUuLlJm/GPuOdoi1KufZNRU0slI8CZ8Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com; spf=pass smtp.mailfrom=engleder-embedded.com; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b=s1WyTNsh; arc=none smtp.client-ip=81.19.149.119 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b="s1WyTNsh" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=engleder-embedded.com; s=dkim11; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=SppyZ9N4iBYEdqDLftkZGDqyE3Ludi9Aj2kWbyOUpBw=; b=s1WyTNshRj1Ay0oowX/U4pCCCW xL0sLr2Ped+9JrlxVtn8gYWWyzOoHYyNpUqHHEaDvYb6xiZ1IuQLZrKxpjzrqEt6i8CvTl+GCAqJv 6rIuUmPCv5koJ3a1Oye77CSCREydUXJyWSazDWyOC1RXlmRslwX+PxW2YpROnBlcfBnI=; Received: from 88-117-55-1.adsl.highway.telekom.at ([88.117.55.1] helo=hornet.engleder.at) by mx09lb.world4you.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.97.1) (envelope-from ) id 1tkpxj-000000003mi-1WUX; Wed, 19 Feb 2025 20:42:27 +0100 From: Gerhard Engleder To: andrew@lunn.ch, hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: netdev@vger.kernel.org, Gerhard Engleder Subject: [PATCH net-next v7 7/8] net: selftests: Add selftests sets with fixed speed Date: Wed, 19 Feb 2025 20:42:12 +0100 Message-Id: <20250219194213.10448-8-gerhard@engleder-embedded.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250219194213.10448-1-gerhard@engleder-embedded.com> References: <20250219194213.10448-1-gerhard@engleder-embedded.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-AV-Do-Run: Yes X-ACL-Warn: X-W4Y-Internal X-Patchwork-Delegate: kuba@kernel.org Add PHY loopback selftest sets with fixed 100 Mbps and 1000 Mbps speed. Signed-off-by: Gerhard Engleder --- include/net/selftests.h | 4 ++++ net/core/selftests.c | 46 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/include/net/selftests.h b/include/net/selftests.h index a3e9bb959e3d..ba781fa6249a 100644 --- a/include/net/selftests.h +++ b/include/net/selftests.h @@ -7,9 +7,13 @@ /** * enum net_selftest_set - selftest set ID * @NET_SELFTEST_CARRIER: Loopback tests based on carrier speed + * @NET_SELFTEST_100: Loopback tests with 100 Mbps + * @NET_SELFTEST_1000: Loopback tests with 1000 Mbps */ enum net_selftest_set { NET_TEST_LOOPBACK_CARRIER = 0, + NET_TEST_LOOPBACK_100, + NET_TEST_LOOPBACK_1000, }; #if IS_ENABLED(CONFIG_NET_SELFTESTS) diff --git a/net/core/selftests.c b/net/core/selftests.c index 3a597a38566e..3149bd1f15d3 100644 --- a/net/core/selftests.c +++ b/net/core/selftests.c @@ -324,6 +324,26 @@ static int net_test_phy_loopback_enable_fn(struct net_device *ndev) static const NET_TEST(phy_loopback_enable, "PHY loopback enable"); +static int net_test_phy_loopback_100_enable_fn(struct net_device *ndev) +{ + if (!ndev->phydev) + return -EOPNOTSUPP; + + return phy_loopback(ndev->phydev, true, 100); +} + +static const NET_TEST(phy_loopback_100_enable, "PHY loopback 100 Mbps"); + +static int net_test_phy_loopback_1000_enable_fn(struct net_device *ndev) +{ + if (!ndev->phydev) + return -EOPNOTSUPP; + + return phy_loopback(ndev->phydev, true, 1000); +} + +static const NET_TEST(phy_loopback_1000_enable, "PHY loopback 1000 Mbps"); + static int net_test_phy_loopback_disable_fn(struct net_device *ndev) { if (!ndev->phydev) @@ -376,11 +396,33 @@ static const struct net_test *net_selftests_carrier[] = { &net_test_phy_loopback_disable, }; +static const struct net_test *net_selftests_100[] = { + &net_test_phy_phydev, + &net_test_phy_loopback_100_enable, + &net_test_phy_loopback_udp, + &net_test_phy_loopback_udp_mtu, + &net_test_phy_loopback_tcp, + &net_test_phy_loopback_disable, +}; + +static const struct net_test *net_selftests_1000[] = { + &net_test_phy_phydev, + &net_test_phy_loopback_1000_enable, + &net_test_phy_loopback_udp, + &net_test_phy_loopback_udp_mtu, + &net_test_phy_loopback_tcp, + &net_test_phy_loopback_disable, +}; + static const struct net_test **net_selftests_set_get(int set) { switch (set) { case NET_TEST_LOOPBACK_CARRIER: return net_selftests_carrier; + case NET_TEST_LOOPBACK_100: + return net_selftests_100; + case NET_TEST_LOOPBACK_1000: + return net_selftests_1000; } return NULL; @@ -415,6 +457,10 @@ int net_selftest_set_get_count(int set) switch (set) { case NET_TEST_LOOPBACK_CARRIER: return ARRAY_SIZE(net_selftests_carrier); + case NET_TEST_LOOPBACK_100: + return ARRAY_SIZE(net_selftests_100); + case NET_TEST_LOOPBACK_1000: + return ARRAY_SIZE(net_selftests_1000); default: return -EINVAL; } From patchwork Wed Feb 19 19:42:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerhard Engleder X-Patchwork-Id: 13982805 X-Patchwork-Delegate: kuba@kernel.org Received: from mx09lb.world4you.com (mx09lb.world4you.com [81.19.149.119]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E278422AE68 for ; Wed, 19 Feb 2025 19:42:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=81.19.149.119 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739994154; cv=none; b=fipqRx8vZKTc6z/uHo99pdjk6maLiGe2i1GJpVpi7BgF4WOeo6wfcwbDxMiVtc6kTn8Gnfi3Rzs/4gqmaA7wDBmadjherXqTcAtSLBjpUiavMyIJiFIXkqSqtbX6XeJHfvFEumimwh3p9wyJiaQgRZI3ZFCiQtGhyFdiaCa2tqM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739994154; c=relaxed/simple; bh=HXBLJtaIaOudcomRCIGwhxYjIl3TJo2FXN1fAgjAjv8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=blHqDyQJpKmpXWEFocbVoEKpSzf1Rz5WU6uUjrW2v/RWutF/Y0yxTUHbUdUGEIQAd4G9ok3EPCh5KiNp0AO5Jm9gb6LtoKdZMVCtFs60qhB13QzuqpA3of1e7G5HQeTMmERHGasaJP+7r6dg1muT8z1cEpYnvXmZNipaSRGdQEw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com; spf=pass smtp.mailfrom=engleder-embedded.com; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b=P3MOh51t; arc=none smtp.client-ip=81.19.149.119 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=engleder-embedded.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=engleder-embedded.com header.i=@engleder-embedded.com header.b="P3MOh51t" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=engleder-embedded.com; s=dkim11; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=ytnMsgyp8cUwtU3iNP5WDJh5DFPeXAXSbRtN6uiSNiw=; b=P3MOh51tDxysa4NdUS/DaoRNxE LjoCRTkJNiXAgduROtSPoywoU7VOxwrBSUoUn0rpCLM1a6042MFbDZrj6QEh/9iMmxtnRTisi18Rz 9KPPzEfNix6Kc3CyR60rSsx3ja+eC8N8rhYJoUc/LPQAtWzA3HJeoXM7omdmsas0Cges=; Received: from 88-117-55-1.adsl.highway.telekom.at ([88.117.55.1] helo=hornet.engleder.at) by mx09lb.world4you.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.97.1) (envelope-from ) id 1tkpxk-000000003mi-3sS8; Wed, 19 Feb 2025 20:42:29 +0100 From: Gerhard Engleder To: andrew@lunn.ch, hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: netdev@vger.kernel.org, Gerhard Engleder Subject: [PATCH net-next v7 8/8] tsnep: Add loopback selftests Date: Wed, 19 Feb 2025 20:42:13 +0100 Message-Id: <20250219194213.10448-9-gerhard@engleder-embedded.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250219194213.10448-1-gerhard@engleder-embedded.com> References: <20250219194213.10448-1-gerhard@engleder-embedded.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-AV-Do-Run: Yes X-ACL-Warn: X-W4Y-Internal X-Patchwork-Delegate: kuba@kernel.org Add selftest sets with 100 Mbps and 1000 Mbps fixed speed to ethtool selftests. Signed-off-by: Gerhard Engleder --- .../net/ethernet/engleder/tsnep_selftests.c | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/engleder/tsnep_selftests.c b/drivers/net/ethernet/engleder/tsnep_selftests.c index 8a9145f93147..3f56cd871c00 100644 --- a/drivers/net/ethernet/engleder/tsnep_selftests.c +++ b/drivers/net/ethernet/engleder/tsnep_selftests.c @@ -4,6 +4,7 @@ #include "tsnep.h" #include +#include enum tsnep_test { TSNEP_TEST_ENABLE = 0, @@ -756,27 +757,36 @@ static bool tsnep_test_taprio_extension(struct tsnep_adapter *adapter) int tsnep_ethtool_get_test_count(void) { - return TSNEP_TEST_COUNT; + int count = TSNEP_TEST_COUNT; + + count += net_selftest_set_get_count(NET_TEST_LOOPBACK_100); + count += net_selftest_set_get_count(NET_TEST_LOOPBACK_1000); + + return count; } void tsnep_ethtool_get_test_strings(u8 *data) { memcpy(data, tsnep_test_strings, sizeof(tsnep_test_strings)); + data += sizeof(tsnep_test_strings); + + net_selftest_set_get_strings(NET_TEST_LOOPBACK_100, &data); + net_selftest_set_get_strings(NET_TEST_LOOPBACK_1000, &data); } void tsnep_ethtool_self_test(struct net_device *netdev, struct ethtool_test *eth_test, u64 *data) { struct tsnep_adapter *adapter = netdev_priv(netdev); + int count = tsnep_ethtool_get_test_count(); + int i; - eth_test->len = TSNEP_TEST_COUNT; + eth_test->len = count; if (eth_test->flags != ETH_TEST_FL_OFFLINE) { /* no tests are done online */ - data[TSNEP_TEST_ENABLE] = 0; - data[TSNEP_TEST_TAPRIO] = 0; - data[TSNEP_TEST_TAPRIO_CHANGE] = 0; - data[TSNEP_TEST_TAPRIO_EXTENSION] = 0; + for (i = 0; i < count; i++) + data[i] = 0; return; } @@ -808,4 +818,10 @@ void tsnep_ethtool_self_test(struct net_device *netdev, eth_test->flags |= ETH_TEST_FL_FAILED; data[TSNEP_TEST_TAPRIO_EXTENSION] = 1; } + + data += TSNEP_TEST_COUNT; + net_selftest_set(NET_TEST_LOOPBACK_100, netdev, eth_test, data); + + data += net_selftest_set_get_count(NET_TEST_LOOPBACK_100); + net_selftest_set(NET_TEST_LOOPBACK_1000, netdev, eth_test, data); }