From 534f3d5d8dac23b050a7e07153bd591251f1adef Mon Sep 17 00:00:00 2001 From: Markus Stockhausen Date: Sun, 3 May 2026 10:36:22 +0200 Subject: [PATCH] realtek: mdio: harden rtmdio_setup_smi_topology() Topology setup is used during probing. Improve error checking to be 100% sure that hardware setup works as expected. While we are here: - use GENMASK() - Be type consistent and add u32 cast for value calculation - use __ffs(mask) for code deduplication and better readability Signed-off-by: Markus Stockhausen Link: https://github.com/openwrt/openwrt/pull/23204 Signed-off-by: Robert Marko --- .../drivers/net/mdio/mdio-realtek-otto.c | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/target/linux/realtek/files-6.18/drivers/net/mdio/mdio-realtek-otto.c b/target/linux/realtek/files-6.18/drivers/net/mdio/mdio-realtek-otto.c index 5a313e9f3a..c200fe6ff9 100644 --- a/target/linux/realtek/files-6.18/drivers/net/mdio/mdio-realtek-otto.c +++ b/target/linux/realtek/files-6.18/drivers/net/mdio/mdio-realtek-otto.c @@ -595,25 +595,32 @@ static int rtmdio_write_c22(struct mii_bus *bus, int phy, int regnum, u16 val) return 0; } -static void rtmdio_setup_smi_topology(struct rtmdio_ctrl *ctrl) +static int rtmdio_setup_smi_topology(struct rtmdio_ctrl *ctrl) { u32 reg, mask, val, pn; + int ret; for_each_port(ctrl, pn) { if (ctrl->cfg->bus_map_base) { - reg = (pn / 16) * 4; - mask = 0x3 << ((pn % 16) * 2); - val = ctrl->port[pn].smi_bus << ((pn % 16) * 2); - regmap_update_bits(ctrl->map, ctrl->cfg->bus_map_base + reg, mask, val); + reg = ctrl->cfg->bus_map_base + (pn / 16) * 4; + mask = GENMASK(1, 0) << ((pn % 16) * 2); + val = (u32)ctrl->port[pn].smi_bus << __ffs(mask); + ret = regmap_update_bits(ctrl->map, reg, mask, val); + if (ret) + return ret; } if (ctrl->cfg->port_map_base) { - reg = (pn / 6) * 4; - mask = 0x1f << ((pn % 6) * 5); - val = ctrl->port[pn].smi_addr << ((pn % 6) * 5); - regmap_update_bits(ctrl->map, ctrl->cfg->port_map_base + reg, mask, val); + reg = ctrl->cfg->port_map_base + (pn / 6) * 4; + mask = GENMASK(4, 0) << ((pn % 6) * 5); + val = (u32)ctrl->port[pn].smi_addr << __ffs(mask); + ret = regmap_update_bits(ctrl->map, reg, mask, val); + if (ret) + return ret; } } + + return 0; } static u32 rtmdio_get_phy_id(struct phy_device *phydev) @@ -958,7 +965,10 @@ static int rtmdio_probe(struct platform_device *pdev) if (ret) return ret; - rtmdio_setup_smi_topology(ctrl); + ret = rtmdio_setup_smi_topology(ctrl); + if (ret) + return ret; + ctrl->cfg->setup_ctrl(ctrl); device_for_each_child_node_scoped(dev, child) {