Skip to content

Commit

Permalink
net: ethernet: ti: am65-cpsw: Fix devlink port register sequence
Browse files Browse the repository at this point in the history
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: 58356eb ("net: ti: am65-cpsw-nuss: Add devlink support")
Signed-off-by: Siddharth Vadapalli <s-vadapalli@ti.com>
Link: https://lore.kernel.org/r/20220706070208.12207-1-s-vadapalli@ti.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Siddharth Vadapalli authored and Jakub Kicinski committed Jul 8, 2022
1 parent 029c1c2 commit 0680e20
Showing 1 changed file with 10 additions and 7 deletions.
17 changes: 10 additions & 7 deletions drivers/net/ethernet/ti/am65-cpsw-nuss.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand All @@ -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];

Expand All @@ -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;
}
Expand Down

0 comments on commit 0680e20

Please sign in to comment.