From 15de91f1e963df248476f63c3ebb4dc4a210509b Mon Sep 17 00:00:00 2001 From: Markus Stockhausen Date: Wed, 1 Apr 2026 17:43:11 +0200 Subject: [PATCH] realtek: mdio: add mutex for multiple busses When the mdio driver gets enhanced for multiple busses it must snchronize reads/writes to the single controller. Add a lock to the control structure and guard the critical operations. Signed-off-by: Markus Stockhausen Link: https://github.com/openwrt/openwrt/pull/22731 Signed-off-by: Robert Marko --- .../files-6.18/drivers/net/mdio/mdio-realtek-otto.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 d53e447c45..379952fda4 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 @@ -188,6 +188,7 @@ struct rtmdio_bus { }; struct rtmdio_ctrl { + struct mutex lock; struct regmap *map; const struct rtmdio_config *cfg; struct rtmdio_port port[RTMDIO_MAX_PHY]; @@ -508,9 +509,11 @@ static int rtmdio_read_c45(struct mii_bus *bus, int addr, int devnum, int regnum if (addr >= ctrl->cfg->num_phys) return -ENODEV; + guard(mutex)(&ctrl->lock); err = (*ctrl->cfg->read_mmd_phy)(bus, addr, devnum, regnum, &val); pr_debug("rd_MMD(adr=%d, dev=%d, reg=%d) = %d, err = %d\n", addr, devnum, regnum, val, err); + return err ? err : val; } @@ -522,6 +525,7 @@ static int rtmdio_read(struct mii_bus *bus, int addr, int regnum) if (addr >= ctrl->cfg->num_phys) return -ENODEV; + guard(mutex)(&ctrl->lock); if (regnum == RTMDIO_PAGE_SELECT && ctrl->port[addr].page != ctrl->cfg->raw_page) return ctrl->port[addr].page; @@ -530,6 +534,7 @@ static int rtmdio_read(struct mii_bus *bus, int addr, int regnum) err = (*ctrl->cfg->read_phy)(bus, addr, ctrl->port[addr].page, regnum, &val); pr_debug("rd_PHY(adr=%d, pag=%d, reg=%d) = %d, err = %d\n", addr, ctrl->port[addr].page, regnum, val, err); + return err ? err : val; } @@ -541,9 +546,11 @@ static int rtmdio_write_c45(struct mii_bus *bus, int addr, int devnum, int regnu if (addr >= ctrl->cfg->num_phys) return -ENODEV; + guard(mutex)(&ctrl->lock); err = (*ctrl->cfg->write_mmd_phy)(bus, addr, devnum, regnum, val); pr_debug("wr_MMD(adr=%d, dev=%d, reg=%d, val=%d) err = %d\n", addr, devnum, regnum, val, err); + return err; } @@ -555,6 +562,7 @@ static int rtmdio_write(struct mii_bus *bus, int addr, int regnum, u16 val) if (addr >= ctrl->cfg->num_phys) return -ENODEV; + guard(mutex)(&ctrl->lock); page = ctrl->port[addr].page; if (regnum == RTMDIO_PAGE_SELECT) @@ -571,6 +579,7 @@ static int rtmdio_write(struct mii_bus *bus, int addr, int regnum, u16 val) } ctrl->port[addr].raw = false; + return 0; } @@ -966,6 +975,10 @@ static int rtmdio_probe(struct platform_device *pdev) if (!ctrl) return -ENOMEM; + ret = devm_mutex_init(dev, &ctrl->lock); + if (ret) + return ret; + platform_set_drvdata(pdev, ctrl); ctrl->cfg = (const struct rtmdio_config *)device_get_match_data(dev); ctrl->map = syscon_node_to_regmap(pdev->dev.of_node->parent);