]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: stmmac: platform: guarantee uniqueness of bus_id
authorQuentin Schulz <quentin.schulz@cherry.de>
Tue, 27 May 2025 11:56:23 +0000 (13:56 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 27 Jun 2025 10:07:17 +0000 (11:07 +0100)
[ Upstream commit eb7fd7aa35bfcc1e1fda4ecc42ccfcb526cdc780 ]

bus_id is currently derived from the ethernetX alias. If one is missing
for the device, 0 is used. If ethernet0 points to another stmmac device
or if there are 2+ stmmac devices without an ethernet alias, then bus_id
will be 0 for all of those.

This is an issue because the bus_id is used to generate the mdio bus id
(new_bus->id in drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
stmmac_mdio_register) and this needs to be unique.

This allows to avoid needing to define ethernet aliases for devices with
multiple stmmac controllers (such as the Rockchip RK3588) for multiple
stmmac devices to probe properly.

Obviously, the bus_id isn't guaranteed to be stable across reboots if no
alias is set for the device but that is easily fixed by simply adding an
alias if this is desired.

Fixes: 25c83b5c2e82 ("dt:net:stmmac: Add support to dwmac version 3.610 and 3.710")
Signed-off-by: Quentin Schulz <quentin.schulz@cherry.de>
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Link: https://patch.msgid.link/20250527-stmmac-mdio-bus_id-v2-1-a5ca78454e3c@cherry.de
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c

index c368ef3cd9cb4e83d19ec004a3a2a804f3532847..e81f54a4ac9b18711db28096f34f20ccfd7728b3 100644 (file)
@@ -417,6 +417,7 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
        struct device_node *np = pdev->dev.of_node;
        struct plat_stmmacenet_data *plat;
        struct stmmac_dma_cfg *dma_cfg;
+       static int bus_id = -ENODEV;
        int phy_mode;
        void *ret;
        int rc;
@@ -453,8 +454,14 @@ stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
        of_property_read_u32(np, "max-speed", &plat->max_speed);
 
        plat->bus_id = of_alias_get_id(np, "ethernet");
-       if (plat->bus_id < 0)
-               plat->bus_id = 0;
+       if (plat->bus_id < 0) {
+               if (bus_id < 0)
+                       bus_id = of_alias_get_highest_id("ethernet");
+               /* No ethernet alias found, init at -1 so first bus_id is 0 */
+               if (bus_id < 0)
+                       bus_id = -1;
+               plat->bus_id = ++bus_id;
+       }
 
        /* Default to phy auto-detection */
        plat->phy_addr = -1;