Skip to content

Commit

Permalink
net: ti: am65-cpsw-nuss: fix wrong devlink release order
Browse files Browse the repository at this point in the history
[ Upstream commit acf3495 ]

The commit that introduced devlink support released devlink resources in
wrong order, that made an unwind flow to be asymmetrical. In addition,
the am65-cpsw-nuss used internal to devlink core field - registered.

In order to fix the unwind flow and remove such access to the
registered field, rewrite the code to call devlink_port_unregister only
on registered ports.

Fixes: 58356eb ("net: ti: am65-cpsw-nuss: Add devlink support")
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
rleon authored and gregkh committed Sep 15, 2021
1 parent 082ef18 commit 1eaee39
Showing 1 changed file with 17 additions and 17 deletions.
34 changes: 17 additions & 17 deletions drivers/net/ethernet/ti/am65-cpsw-nuss.c
Expand Up @@ -2388,21 +2388,6 @@ static const struct devlink_param am65_cpsw_devlink_params[] = {
am65_cpsw_dl_switch_mode_set, NULL),
};

static void am65_cpsw_unregister_devlink_ports(struct am65_cpsw_common *common)
{
struct devlink_port *dl_port;
struct am65_cpsw_port *port;
int i;

for (i = 1; i <= common->port_num; i++) {
port = am65_common_get_port(common, i);
dl_port = &port->devlink_port;

if (dl_port->registered)
devlink_port_unregister(dl_port);
}
}

static int am65_cpsw_nuss_register_devlink(struct am65_cpsw_common *common)
{
struct devlink_port_attrs attrs = {};
Expand Down Expand Up @@ -2464,7 +2449,12 @@ static int am65_cpsw_nuss_register_devlink(struct am65_cpsw_common *common)
return ret;

dl_port_unreg:
am65_cpsw_unregister_devlink_ports(common);
for (i = i - 1; i >= 1; i--) {
port = am65_common_get_port(common, i);
dl_port = &port->devlink_port;

devlink_port_unregister(dl_port);
}
dl_unreg:
devlink_unregister(common->devlink);
dl_free:
Expand All @@ -2475,14 +2465,24 @@ static int am65_cpsw_nuss_register_devlink(struct am65_cpsw_common *common)

static void am65_cpsw_unregister_devlink(struct am65_cpsw_common *common)
{
struct devlink_port *dl_port;
struct am65_cpsw_port *port;
int i;

for (i = 1; i <= common->port_num; i++) {
port = am65_common_get_port(common, i);
dl_port = &port->devlink_port;

devlink_port_unregister(dl_port);
}

if (!AM65_CPSW_IS_CPSW2G(common) &&
IS_ENABLED(CONFIG_TI_K3_AM65_CPSW_SWITCHDEV)) {
devlink_params_unpublish(common->devlink);
devlink_params_unregister(common->devlink, am65_cpsw_devlink_params,
ARRAY_SIZE(am65_cpsw_devlink_params));
}

am65_cpsw_unregister_devlink_ports(common);
devlink_unregister(common->devlink);
devlink_free(common->devlink);
}
Expand Down

0 comments on commit 1eaee39

Please sign in to comment.