Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: 58356eb31d60 ("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>

authored by

Siddharth Vadapalli and committed by
Jakub Kicinski
0680e20a 029c1c20

+10 -7
+10 -7
drivers/net/ethernet/ti/am65-cpsw-nuss.c
··· 2467 2467 port->port_id, ret); 2468 2468 goto dl_port_unreg; 2469 2469 } 2470 - devlink_port_type_eth_set(dl_port, port->ndev); 2471 2470 } 2472 2471 devlink_register(common->devlink); 2473 2472 return ret; ··· 2510 2511 static int am65_cpsw_nuss_register_ndevs(struct am65_cpsw_common *common) 2511 2512 { 2512 2513 struct device *dev = common->dev; 2514 + struct devlink_port *dl_port; 2513 2515 struct am65_cpsw_port *port; 2514 2516 int ret = 0, i; 2515 2517 ··· 2527 2527 return ret; 2528 2528 } 2529 2529 2530 + ret = am65_cpsw_nuss_register_devlink(common); 2531 + if (ret) 2532 + return ret; 2533 + 2530 2534 for (i = 0; i < common->port_num; i++) { 2531 2535 port = &common->ports[i]; 2532 2536 ··· 2543 2539 i, ret); 2544 2540 goto err_cleanup_ndev; 2545 2541 } 2542 + 2543 + dl_port = &port->devlink_port; 2544 + devlink_port_type_eth_set(dl_port, port->ndev); 2546 2545 } 2547 2546 2548 2547 ret = am65_cpsw_register_notifiers(common); 2549 2548 if (ret) 2550 2549 goto err_cleanup_ndev; 2551 2550 2552 - ret = am65_cpsw_nuss_register_devlink(common); 2553 - if (ret) 2554 - goto clean_unregister_notifiers; 2555 - 2556 2551 /* can't auto unregister ndev using devm_add_action() due to 2557 2552 * devres release sequence in DD core for DMA 2558 2553 */ 2559 2554 2560 2555 return 0; 2561 - clean_unregister_notifiers: 2562 - am65_cpsw_unregister_notifiers(common); 2556 + 2563 2557 err_cleanup_ndev: 2564 2558 am65_cpsw_nuss_cleanup_ndev(common); 2559 + am65_cpsw_unregister_devlink(common); 2565 2560 2566 2561 return ret; 2567 2562 }