]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: ethernet: ti: am65-cpsw: handle -EPROBE_DEFER
authorMichael Walle <mwalle@kernel.org>
Mon, 14 Apr 2025 08:43:36 +0000 (10:43 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 17 Apr 2025 00:51:33 +0000 (17:51 -0700)
of_get_mac_address() might fetch the MAC address from NVMEM and that
driver might not have been loaded. In that case, -EPROBE_DEFER is
returned. Right now, this will trigger an immediate fallback to
am65_cpsw_am654_get_efuse_macid() possibly resulting in a random MAC
address although the MAC address is stored in the referenced NVMEM.

Fix it by handling the -EPROBE_DEFER return code correctly. This also
means that the creation of the MDIO device has to be moved to a later
stage as -EPROBE_DEFER must not be returned after child devices are
created.

Signed-off-by: Michael Walle <mwalle@kernel.org>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20250414084336.4017237-3-mwalle@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/ti/am65-cpsw-nuss.c

index 0a38776339769357d9c9c03a3a4737a9a1f469c9..aedef818800c85d4d9d104ec7fb79012a8a66830 100644 (file)
@@ -2679,7 +2679,9 @@ static int am65_cpsw_nuss_init_slave_ports(struct am65_cpsw_common *common)
                        goto of_node_put;
 
                ret = of_get_mac_address(port_np, port->slave.mac_addr);
-               if (ret) {
+               if (ret == -EPROBE_DEFER) {
+                       goto of_node_put;
+               } else if (ret) {
                        am65_cpsw_am654_get_efuse_macid(port_np,
                                                        port->port_id,
                                                        port->slave.mac_addr);
@@ -3550,6 +3552,16 @@ static int am65_cpsw_nuss_probe(struct platform_device *pdev)
                return ret;
        }
 
+       am65_cpsw_nuss_get_ver(common);
+
+       ret = am65_cpsw_nuss_init_host_p(common);
+       if (ret)
+               goto err_pm_clear;
+
+       ret = am65_cpsw_nuss_init_slave_ports(common);
+       if (ret)
+               goto err_pm_clear;
+
        node = of_get_child_by_name(dev->of_node, "mdio");
        if (!node) {
                dev_warn(dev, "MDIO node not found\n");
@@ -3566,16 +3578,6 @@ static int am65_cpsw_nuss_probe(struct platform_device *pdev)
        }
        of_node_put(node);
 
-       am65_cpsw_nuss_get_ver(common);
-
-       ret = am65_cpsw_nuss_init_host_p(common);
-       if (ret)
-               goto err_of_clear;
-
-       ret = am65_cpsw_nuss_init_slave_ports(common);
-       if (ret)
-               goto err_of_clear;
-
        /* init common data */
        ale_params.dev = dev;
        ale_params.ale_ageout = AM65_CPSW_ALE_AGEOUT_DEFAULT;