Commit 0680e20a authored by Siddharth Vadapalli's avatar Siddharth Vadapalli Committed by Jakub Kicinski
Browse files

net: ethernet: ti: am65-cpsw: Fix devlink port register sequence



Renaming interfaces using udevd depends on the interface being registered
before its netdev is registered. Otherwise, udevd reads an empty
phys_port_name value, resulting in the interface not being renamed.

Fix this by registering the interface before registering its netdev
by invoking am65_cpsw_nuss_register_devlink() before invoking
register_netdev() for the interface.

Move the function call to devlink_port_type_eth_set(), invoking it after
register_netdev() is invoked, to ensure that netlink notification for the
port state change is generated after the netdev is completely initialized.

Fixes: 58356eb3 ("net: ti: am65-cpsw-nuss: Add devlink support")
Signed-off-by: default avatarSiddharth Vadapalli <s-vadapalli@ti.com>
Link: https://lore.kernel.org/r/20220706070208.12207-1-s-vadapalli@ti.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 029c1c20
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -2467,7 +2467,6 @@ static int am65_cpsw_nuss_register_devlink(struct am65_cpsw_common *common)
				port->port_id, ret);
			goto dl_port_unreg;
		}
		devlink_port_type_eth_set(dl_port, port->ndev);
	}
	devlink_register(common->devlink);
	return ret;
@@ -2511,6 +2510,7 @@ static void am65_cpsw_unregister_devlink(struct am65_cpsw_common *common)
static int am65_cpsw_nuss_register_ndevs(struct am65_cpsw_common *common)
{
	struct device *dev = common->dev;
	struct devlink_port *dl_port;
	struct am65_cpsw_port *port;
	int ret = 0, i;

@@ -2527,6 +2527,10 @@ static int am65_cpsw_nuss_register_ndevs(struct am65_cpsw_common *common)
		return ret;
	}

	ret = am65_cpsw_nuss_register_devlink(common);
	if (ret)
		return ret;

	for (i = 0; i < common->port_num; i++) {
		port = &common->ports[i];

@@ -2539,25 +2543,24 @@ static int am65_cpsw_nuss_register_ndevs(struct am65_cpsw_common *common)
				i, ret);
			goto err_cleanup_ndev;
		}

		dl_port = &port->devlink_port;
		devlink_port_type_eth_set(dl_port, port->ndev);
	}

	ret = am65_cpsw_register_notifiers(common);
	if (ret)
		goto err_cleanup_ndev;

	ret = am65_cpsw_nuss_register_devlink(common);
	if (ret)
		goto clean_unregister_notifiers;

	/* can't auto unregister ndev using devm_add_action() due to
	 * devres release sequence in DD core for DMA
	 */

	return 0;
clean_unregister_notifiers:
	am65_cpsw_unregister_notifiers(common);

err_cleanup_ndev:
	am65_cpsw_nuss_cleanup_ndev(common);
	am65_cpsw_unregister_devlink(common);

	return ret;
}