realtek: rtl931x: align SerDes access with other targets
authorMarkus Stockhausen <[email protected]>
Sun, 7 Sep 2025 12:46:16 +0000 (08:46 -0400)
committerHauke Mehrtens <[email protected]>
Fri, 12 Sep 2025 18:52:37 +0000 (20:52 +0200)
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 <[email protected]>
Link: https://github.com/openwrt/openwrt/pull/19973
Signed-off-by: Hauke Mehrtens <[email protected]>
target/linux/realtek/files-6.12/drivers/net/mdio/mdio-realtek-otto.c

index fcc1c53e55b17e301a4196d55bfc5f748313ec5c..216273d19de02c979dc2b69f29a2192a3fe50400 100644 (file)
@@ -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;