From 818604cb08f99812744829c892fa866e117ebf99 Mon Sep 17 00:00:00 2001 From: Markus Stockhausen Date: Wed, 25 Mar 2026 11:26:57 +0100 Subject: [PATCH] realtek: mdio: move smi_addr attribute into port structure The smi_addr attribute is defined per port. Move it into the new port structure. As the devices have a maximum of 56 addresses save some space and convert it to type u8. While we are here harden the mapping routine that reads these addresses from the DTS. For this check the value that is read into smi_addr. This is usually the MDIO standard 0..31. Sadly RTL839x devices are an exception from that and allow addresses 0..51. To avoid device specific if/then/else cases for now implement a "light" consistency check. Signed-off-by: Markus Stockhausen Link: https://github.com/openwrt/openwrt/pull/22604 Signed-off-by: Robert Marko --- .../drivers/net/mdio/mdio-realtek-otto.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 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 345d584c97..47ada0f682 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 @@ -175,6 +175,7 @@ struct rtmdio_port { int page; bool raw; + u8 smi_addr; u8 smi_bus; }; @@ -182,7 +183,6 @@ struct rtmdio_ctrl { struct regmap *map; const struct rtmdio_config *cfg; struct rtmdio_port port[RTMDIO_MAX_PHY]; - int smi_addr[RTMDIO_MAX_PHY]; struct device_node *phy_node[RTMDIO_MAX_PHY]; bool smi_bus_is_c45[RTMDIO_MAX_SMI_BUS]; DECLARE_BITMAP(valid_ports, RTMDIO_MAX_PHY); @@ -579,7 +579,7 @@ static void rtmdio_setup_smi_topology(struct mii_bus *bus) if (ctrl->cfg->port_map_base) { reg = (addr / 6) * 4; mask = 0x1f << ((addr % 6) * 5); - val = ctrl->smi_addr[addr] << ((addr % 6) * 5); + val = ctrl->port[addr].smi_addr << ((addr % 6) * 5); regmap_update_bits(ctrl->map, ctrl->cfg->port_map_base + reg, mask, val); } } @@ -838,7 +838,7 @@ static int rtmdio_reset(struct mii_bus *bus) static int rtmdio_map_ports(struct device *dev) { struct rtmdio_ctrl *ctrl = dev_get_drvdata(dev); - int smi_bus, addr; + int smi_bus, smi_addr, addr; struct device_node *switch_node __free(device_node) = of_get_child_by_name(dev->of_node->parent, "ethernet-switch"); @@ -869,10 +869,15 @@ static int rtmdio_map_ports(struct device *dev) return dev_err_probe(dev, -EINVAL, "%pfwP duplicated port number\n", of_fwnode_handle(port)); - if (of_property_read_u32(phy, "reg", &ctrl->smi_addr[addr])) + if (of_property_read_u32(phy, "reg", &smi_addr)) return dev_err_probe(dev, -EINVAL, "%pfwP no phy address\n", of_fwnode_handle(phy)); + /* relaxed check as RTL839x uses MDIO addresses 0..51 */ + if (smi_addr >= ctrl->cfg->num_phys) + return dev_err_probe(dev, -EINVAL, "%pfwP illegal phy address\n", + of_fwnode_handle(phy)); + if (of_property_read_u32(phy->parent, "reg", &smi_bus)) return dev_err_probe(dev, -EINVAL, "%pfwP no bus address\n", of_fwnode_handle(phy->parent)); @@ -885,6 +890,7 @@ static int rtmdio_map_ports(struct device *dev) ctrl->smi_bus_is_c45[smi_bus] = true; ctrl->port[addr].smi_bus = smi_bus; + ctrl->port[addr].smi_addr = smi_addr; ctrl->phy_node[addr] = of_node_get(phy); __set_bit(addr, ctrl->valid_ports); }