[PATCH net-next v2 3/9] net: phy: ncn26000: Added PHY loopback and read/write MMD callbacks
From: Selvamani Rajagopal
Date: Mon May 11 2026 - 14:23:15 EST
- PHY loopback has to set only BMCR_LOOPBACK bit. As a result, we can't
use generic, genphy_loopback.
- Direct MMD calls via Clause 45 read/write avoids indirect calls.
Signed-off-by: Selvamani Rajagopal <Selvamani.Rajagopal@xxxxxxxxxx>
---
drivers/net/phy/ncn26000.c | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/drivers/net/phy/ncn26000.c b/drivers/net/phy/ncn26000.c
index 68b0e4647..d302e04c8 100644
--- a/drivers/net/phy/ncn26000.c
+++ b/drivers/net/phy/ncn26000.c
@@ -162,6 +162,39 @@ static int ncn26000_config_intr(struct phy_device *phydev)
return 0;
}
+/* Directly accessing via Clause 45 read avoids the extra
+ * SPI accesses required by indirect access.
+ */
+static int ncn26000_read_mmd(struct phy_device *phydev, int dev, u16 reg)
+{
+ struct mii_bus *bus = phydev->mdio.bus;
+ int addr = phydev->mdio.addr;
+
+ return __mdiobus_c45_read(bus, addr, dev, reg);
+}
+
+/* Directly accessing via Clause 45 write avoids the extra
+ * SPI accesses required by indirect access.
+ */
+static int ncn26000_write_mmd(struct phy_device *phydev, int dev,
+ u16 reg, u16 val)
+{
+ struct mii_bus *bus = phydev->mdio.bus;
+ int addr = phydev->mdio.addr;
+
+ return __mdiobus_c45_write(bus, addr, dev, reg, val);
+}
+
+static int ncn26000_loopback(struct phy_device *phydev, bool enable, int speed)
+{
+ u16 mask = BMCR_LOOPBACK;
+ u16 ctl = 0;
+
+ if (enable)
+ ctl = BMCR_LOOPBACK;
+ return phy_modify(phydev, MII_BMCR, mask, ctl);
+}
+
static struct phy_driver ncn26000_driver[] = {
{
PHY_ID_MATCH_MODEL(PHY_ID_NCN26000),
@@ -176,6 +209,9 @@ static struct phy_driver ncn26000_driver[] = {
.set_plca_cfg = ncn26000_plca_set_cfg,
.get_plca_status = genphy_c45_plca_get_status,
.soft_reset = genphy_soft_reset,
+ .set_loopback = ncn26000_loopback,
+ .read_mmd = ncn26000_read_mmd,
+ .write_mmd = ncn26000_write_mmd,
},
};
--
2.43.0