[PATCH net-next v9 10/11] net: phy: ncn26000: Support for onsemi's S2500 internal phy
flat view
HOTtoday
REVIEWED: 8 (8M)
From: Selvamani Rajagopal via B4 Relay <devnull+Selvamani.Rajagopal.onsemi.com@kernel.org>
Date: 2026-10-09 17:12:26
Also in:
b4-sent, linux-devicetree, linux-doc, lkml
Subsystem:
ethernet phy library, networking drivers, onsemi ethernet phy drivers, the rest · Maintainers:
Andrew Lunn, Heiner Kallweit, Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Piergiorgio Beruto, Linus Torvalds
1 review trailer (1 from subsystem maintainers).
From: Selvamani Rajagopal <redacted> Adding support for internal PHY of the integrated media access controller S2500. PLCA tx opportunity timer's default value is correct in this device, compared to the currently supported PHY NCN26000. Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: Selvamani Rajagopal <redacted> --- changes in v9 - Added Reviewed tag changes in v8 - changes to use newer API for read/write_mmd callback changes in v7 - No change changes in v6 - No change changes in v5 - No change changes in v4 - no change changes in v3 added new PHY support separate patch changed model comparison to use phy_id_compare_model changes in v2 Removed bug fixes. Retained only S2500 specific changes changes in v1 Added support for an internal PHY of onsemi's MAC-PHY S2500 --- MAINTAINERS | 1 + drivers/net/phy/ncn26000.c | 36 ++++++++++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index 4e122a5eefa1..c114be851607 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS@@ -20435,6 +20435,7 @@ F: arch/mips/boot/dts/ralink/omega2p.dts ONSEMI ETHERNET PHY DRIVERS M: Piergiorgio Beruto <piergiorgio.beruto@gmail.com> +M: Selva Rajagopal <selvamani.rajagopal@onsemi.com> L: netdev@vger.kernel.org S: Supported W: http://www.onsemi.com
diff --git a/drivers/net/phy/ncn26000.c b/drivers/net/phy/ncn26000.c
index 6d433f4e2c45..a33ebb2a7ece 100644
--- a/drivers/net/phy/ncn26000.c
+++ b/drivers/net/phy/ncn26000.c@@ -2,7 +2,7 @@ /* * Driver for the onsemi 10BASE-T1S NCN26000 PHYs family. * - * Copyright 2022 onsemi + * Copyright 2026 onsemi */ #include <linux/kernel.h> #include <linux/bitfield.h>
@@ -14,6 +14,7 @@ #include "mdio-open-alliance.h" +#define PHY_ID_S2500 0x180FF411 #define PHY_ID_NCN26000 0x180FF5A1 #define NCN26000_REG_IRQ_CTL 16
@@ -41,13 +42,18 @@ static int ncn26000_config_init(struct phy_device *phydev) { + int ret = 0; + /* HW bug workaround: the default value of the PLCA TO_TIMER should be * 32, where the current version of NCN26000 reports 24. This will be * fixed in future PHY versions. For the time being, we force the * correct default here. */ - return phy_write_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_PLCA_TOTMR, - TO_TMR_DEFAULT); + if (phy_id_compare_model(phydev->drv->phy_id, PHY_ID_NCN26000)) + ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, + MDIO_OATC14_PLCA_TOTMR, + TO_TMR_DEFAULT); + return ret; } static int ncn26000_config_aneg(struct phy_device *phydev)
@@ -139,8 +145,8 @@ static irqreturn_t ncn26000_handle_interrupt(struct phy_device *phydev) static int ncn26000_config_intr(struct phy_device *phydev) { - int ret; u16 irqe; + int ret; if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { // acknowledge IRQs
@@ -163,6 +169,26 @@ static int ncn26000_config_intr(struct phy_device *phydev) } static struct phy_driver ncn26000_driver[] = { + { + PHY_ID_MATCH_MODEL(PHY_ID_S2500), + .name = "S2500", + .features = PHY_BASIC_T1S_P2MP_FEATURES, + .config_init = ncn26000_config_init, + .config_intr = ncn26000_config_intr, + .config_aneg = ncn26000_config_aneg, + .read_status = ncn26000_read_status, + .handle_interrupt = ncn26000_handle_interrupt, + .set_plca_cfg = ncn26000_c45_plca_set_cfg, + .get_plca_cfg = genphy_c45_plca_get_cfg, + .get_plca_status = genphy_c45_plca_get_status, + .soft_reset = genphy_soft_reset, + .get_sqi = genphy_c45_oatc14_get_sqi, + .get_sqi_max = genphy_c45_oatc14_get_sqi_max, + .read_mmd = genphy_read_mmd_c45, + .write_mmd = genphy_write_mmd_c45, + .cable_test_get_status = genphy_c45_oatc14_cable_test_get_status, + .cable_test_start = genphy_c45_oatc14_cable_test_start, + }, { PHY_ID_MATCH_MODEL(PHY_ID_NCN26000), .name = "NCN26000",
@@ -183,11 +209,13 @@ module_phy_driver(ncn26000_driver); static const struct mdio_device_id __maybe_unused ncn26000_tbl[] = { { PHY_ID_MATCH_MODEL(PHY_ID_NCN26000) }, + { PHY_ID_MATCH_MODEL(PHY_ID_S2500) }, { } }; MODULE_DEVICE_TABLE(mdio, ncn26000_tbl); +MODULE_AUTHOR("Selva Rajagopal <selvamani.rajagopal@onsemi.com>"); MODULE_AUTHOR("Piergiorgio Beruto"); MODULE_DESCRIPTION("onsemi 10BASE-T1S PHY driver"); MODULE_LICENSE("Dual BSD/GPL");
--
2.43.0