ksz_mdio_register() obtains the parent MDIO bus with of_mdio_find_bus(), which takes a reference on the embedded struct device, and stores it in dev->parent_mdio_bus for the side MDIO accessors. Nothing ever drops that reference, so it is leaked on the probe error paths and when the switch device is torn down. Register a devres action to put the device when the DSA switch device is released. The child MDIO bus is unregistered before the action runs, so the parent bus stays valid for the whole lifetime of the switch. Fixes: 9afaf0eec2ab ("net: dsa: microchip: Refactor MDIO handling for side MDIO access") Cc: stable@vger.kernel.org Assisted-by: DeepSeek-V4.1-Flash and OpenAI Codex Signed-off-by: Wentao Liang --- drivers/net/dsa/microchip/ksz_common.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c index 767c8fe8e819..ddd821fa0d3e 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -2392,6 +2392,17 @@ int ksz_parse_dt_phy_config(struct ksz_device *dev, struct mii_bus *bus, return 0; } +/** + * ksz_mdio_put_parent_bus - Drop the reference on a parent MDIO bus + * @data: mii_bus obtained from of_mdio_find_bus() + */ +static void ksz_mdio_put_parent_bus(void *data) +{ + struct mii_bus *bus = data; + + put_device(&bus->dev); +} + /** * ksz_mdio_register - Register and configure the MDIO bus for the KSZ device. * @dev: Pointer to the KSZ device structure. @@ -2431,6 +2442,12 @@ int ksz_mdio_register(struct ksz_device *dev) goto put_mdio_node; } + ret = devm_add_action_or_reset(ds->dev, + ksz_mdio_put_parent_bus, + parent_bus); + if (ret) + goto put_mdio_node; + dev->parent_mdio_bus = parent_bus; } -- 2.34.1