[openwrt/openwrt] realtek: rtl931x: align SerDes access with other targets

LEDE Commits lede-commits at lists.infradead.org
Fri Sep 12 11:53:20 PDT 2025


hauke pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/69ce2eeb97bd86162026f4a7b9c9d53084b2df21

commit 69ce2eeb97bd86162026f4a7b9c9d53084b2df21
Author: Markus Stockhausen <markus.stockhausen at gmx.de>
AuthorDate: Sun Sep 7 08:46:16 2025 -0400

    realtek: rtl931x: align SerDes access with other targets
    
    While converting the RTL931x SerDes code to the new frontend
    access methods, the target specific workarounds where left in
    place. The old functions were kept and the phy/sds mapping
    was unchanged too. It is time to clean this up
    
    - drop the old functions
    - reuse the existing read/write logic
    - harden the new functions
    
    For now keep the function naming rtmdio_...__new() as is. This
    will be changed in a future commit.
    
    Signed-off-by: Markus Stockhausen <markus.stockhausen at gmx.de>
    Link: https://github.com/openwrt/openwrt/pull/19973
    Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
---
 .../drivers/net/mdio/mdio-realtek-otto.c           | 117 ++++++---------------
 1 file changed, 31 insertions(+), 86 deletions(-)

diff --git a/target/linux/realtek/files-6.12/drivers/net/mdio/mdio-realtek-otto.c b/target/linux/realtek/files-6.12/drivers/net/mdio/mdio-realtek-otto.c
index fcc1c53e55..216273d19d 100644
--- a/target/linux/realtek/files-6.12/drivers/net/mdio/mdio-realtek-otto.c
+++ b/target/linux/realtek/files-6.12/drivers/net/mdio/mdio-realtek-otto.c
@@ -845,72 +845,67 @@ static int rtmdio_931x_get_backing_sds(u32 sds, u32 page)
 	return back;
 }
 
-static int rtmdio_931x_read_sds_phy(int sds, int page, int regnum)
+int rtmdio_931x_read_sds_phy_new(int sds, int page, int regnum)
 {
-	u32 cmd = sds << 2 | page << 7 | regnum << 13 | 1;
-	int i, ret = -EIO;
+	int backsds, i, cmd, ret = -EIO;
+	int backpage = page & 0x3f;
 
-	pr_debug("%s: phy_addr(SDS-ID) %d, phy_reg: %d\n", __func__, sds, regnum);
+	if (sds < 0 || sds > 13 || page < 0 || page > 575 || regnum < 0 || regnum > 31)
+		return -EIO;
+
+	backsds = rtmdio_931x_get_backing_sds(sds, page);
+	if (backsds == -EINVAL)
+		return 0;
 
 	mutex_lock(&rtmdio_lock_sds);
+
+	cmd = backsds << 2 | backpage << 7 | regnum << 13 | 0x1;
 	sw_w32(cmd, RTMDIO_931X_SERDES_INDRT_ACCESS_CTRL);
 
 	for (i = 0; i < 100; i++) {
-		if (!(sw_r32(RTMDIO_931X_SERDES_INDRT_ACCESS_CTRL) & 0x1))
+		if (!(sw_r32(RTMDIO_931X_SERDES_INDRT_ACCESS_CTRL) & 0x1)) {
+			ret = sw_r32(RTMDIO_931X_SERDES_INDRT_DATA_CTRL) & 0xffff;
 			break;
+		}
 		mdelay(1);
 	}
 
-	if (i < 100)
-		ret = sw_r32(RTMDIO_931X_SERDES_INDRT_DATA_CTRL) & 0xffff;
-
 	mutex_unlock(&rtmdio_lock_sds);
 
-	pr_debug("%s: returning %08x\n", __func__, ret);
-
 	return ret;
 }
 
-int rtmdio_931x_read_sds_phy_new(int sds, int page, int regnum)
+int rtmdio_931x_write_sds_phy_new(int sds, int page, int regnum, u16 val)
 {
-	int backsds = rtmdio_931x_get_backing_sds(sds, page);
+	int backsds, i, cmd, ret = -EIO;
+	int backpage = page & 0x3f;
 
-	return backsds < 0 ? 0 : rtmdio_931x_read_sds_phy(backsds, page & 0x3f, regnum);
-}
+	if (sds < 0 || sds > 13 || page < 0 || page > 575 || regnum < 0 || regnum > 31)
+		return -EIO;
 
-static int rtmdio_931x_write_sds_phy(int sds, int page, int regnum, u16 val)
-{
-	u32 cmd = sds << 2 | page << 7 | regnum << 13;;
-	int i, ret = -EIO;
+	backsds = rtmdio_931x_get_backing_sds(sds, page);
+	if (backsds == -EINVAL)
+		return 0;
 
 	mutex_lock(&rtmdio_lock_sds);
-	sw_w32(cmd, RTMDIO_931X_SERDES_INDRT_ACCESS_CTRL);
-	sw_w32(val, RTMDIO_931X_SERDES_INDRT_DATA_CTRL);
 
-	cmd = sw_r32(RTMDIO_931X_SERDES_INDRT_ACCESS_CTRL) | 0x3;
+	cmd = backsds << 2 | backpage << 7 | regnum << 13 | 0x3;
+	sw_w32(val, RTMDIO_931X_SERDES_INDRT_DATA_CTRL);
 	sw_w32(cmd, RTMDIO_931X_SERDES_INDRT_ACCESS_CTRL);
 
 	for (i = 0; i < 100; i++) {
-		if (!(sw_r32(RTMDIO_931X_SERDES_INDRT_ACCESS_CTRL) & 0x1))
+		if (!(sw_r32(RTMDIO_931X_SERDES_INDRT_ACCESS_CTRL) & 0x1)) {
+			ret = 0;
 			break;
+		}
 		mdelay(1);
 	}
 
 	mutex_unlock(&rtmdio_lock_sds);
 
-	if (i < 100)
-		ret = 0;
-
 	return ret;
 }
 
-int rtmdio_931x_write_sds_phy_new(int sds, int page, int regnum, u16 val)
-{
-	int backsds = rtmdio_931x_get_backing_sds(sds, page);
-
-	return backsds < 0 ? 0 : rtmdio_931x_write_sds_phy(backsds, page & 0x3f, regnum, val);
-}
-
 /* RTL931x specific MDIO functions */
 
 static int rtmdio_931x_write_phy(u32 port, u32 page, u32 reg, u32 val)
@@ -1146,29 +1141,6 @@ static int rtmdio_read(struct mii_bus *bus, int addr, int regnum)
 	return err ? err : val;
 }
 
-static int rtmdio_93xx_read(struct mii_bus *bus, int addr, int regnum)
-{
-	struct rtmdio_bus_priv *priv = bus->priv;
-	int err, val;
-
-	if (addr >= priv->cpu_port)
-		return -ENODEV;
-
-	if (regnum == RTMDIO_PAGE_SELECT && priv->page[addr] != priv->rawpage)
-		return priv->page[addr];
-
-	priv->raw[addr] = (priv->page[addr] == priv->rawpage);
-	if (priv->phy_is_internal[addr]) {
-		return rtmdio_931x_read_sds_phy(priv->sds_id[addr],
-						priv->page[addr], regnum);
-	}
-
-	err = (*priv->read_phy)(addr, priv->page[addr], regnum, &val);
-	pr_debug("rd_PHY(adr=%d, pag=%d, reg=%d) = %d, err = %d\n",
-		 addr, priv->page[addr], regnum, val, err);
-	return err ? err : val;
-}
-
 static int rtmdio_write_c45(struct mii_bus *bus, int addr, int devnum, int regnum, u16 val)
 {
 	struct rtmdio_bus_priv *priv = bus->priv;
@@ -1212,35 +1184,6 @@ static int rtmdio_write(struct mii_bus *bus, int addr, int regnum, u16 val)
 	return 0;
 }
 
-static int rtmdio_93xx_write(struct mii_bus *bus, int addr, int regnum, u16 val)
-{
-	struct rtmdio_bus_priv *priv = bus->priv;
-	int err, page;
-
-	if (addr >= priv->cpu_port)
-		return -ENODEV;
-
-	page = priv->page[addr];
-
-	if (regnum == RTMDIO_PAGE_SELECT)
-		priv->page[addr] = val;
-
-	if (!priv->raw[addr] && (regnum != RTMDIO_PAGE_SELECT || page == priv->rawpage)) {
-		priv->raw[addr] = (page == priv->rawpage);
-		if (priv->phy_is_internal[addr]) {
-			return rtmdio_931x_write_sds_phy(priv->sds_id[addr],
-							 page, regnum, val);
-		}
-
-		err = (*priv->write_phy)(addr, page, regnum, val);
-		pr_debug("wr_PHY(adr=%d, pag=%d, reg=%d, val=%d) err = %d\n",
-			 addr, page, regnum, val, err);
-	}
-
-	priv->raw[addr] = false;
-	return 0;
-}
-
 static int rtmdio_838x_reset(struct mii_bus *bus)
 {
 	pr_debug("%s called\n", __func__);
@@ -1519,9 +1462,11 @@ static int rtmdio_probe(struct platform_device *pdev)
 		break;
 	case RTMDIO_931X_FAMILY_ID:
 		bus->name = "rtl931x-eth-mdio";
-		bus->read = rtmdio_93xx_read;
-		bus->write = rtmdio_93xx_write;
+		bus->read = rtmdio_read;
+		bus->write = rtmdio_write;
 		bus->reset = rtmdio_931x_reset;
+		priv->read_sds_phy = rtmdio_931x_read_sds_phy_new;
+		priv->write_sds_phy = rtmdio_931x_write_sds_phy_new;
 		priv->read_mmd_phy = rtmdio_931x_read_mmd_phy;
 		priv->write_mmd_phy = rtmdio_931x_write_mmd_phy;
 		priv->read_phy = rtmdio_931x_read_phy;




More information about the lede-commits mailing list