From: Jiri Pirko Date: Thu, 25 May 2023 08:30:45 +0000 (+0200) Subject: net/mlx5: Push out SF devlink port init and cleanup code to separate helpers X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=638002252544a20f3f62ffb2cadbfa70207bd9b8;p=linux.git net/mlx5: Push out SF devlink port init and cleanup code to separate helpers Similar to what was done for PFs/VFs, introduce devlink port init and cleanup helpers for SFs and manage the vport->dl_port pointer there. Signed-off-by: Jiri Pirko Signed-off-by: Saeed Mahameed --- diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c b/drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c index 1864bf83aaa23..dfb1101dfef0f 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c @@ -97,6 +97,48 @@ static const struct devlink_port_ops mlx5_esw_pf_vf_dl_port_ops = { .port_fn_migratable_set = mlx5_devlink_port_fn_migratable_set, }; +static void mlx5_esw_offloads_sf_devlink_port_attrs_set(struct mlx5_eswitch *esw, + struct devlink_port *dl_port, + u32 controller, u32 sfnum) +{ + struct mlx5_core_dev *dev = esw->dev; + struct netdev_phys_item_id ppid = {}; + u16 pfnum; + + pfnum = mlx5_get_dev_index(dev); + mlx5_esw_get_port_parent_id(dev, &ppid); + memcpy(dl_port->attrs.switch_id.id, &ppid.id[0], ppid.id_len); + dl_port->attrs.switch_id.id_len = ppid.id_len; + devlink_port_attrs_pci_sf_set(dl_port, controller, pfnum, sfnum, !!controller); +} + +static int mlx5_esw_offloads_sf_devlink_port_init(struct mlx5_eswitch *esw, u16 vport_num, + struct devlink_port *dl_port, + u32 controller, u32 sfnum) +{ + struct mlx5_vport *vport; + + vport = mlx5_eswitch_get_vport(esw, vport_num); + if (IS_ERR(vport)) + return PTR_ERR(vport); + + mlx5_esw_offloads_sf_devlink_port_attrs_set(esw, dl_port, controller, sfnum); + + vport->dl_port = dl_port; + return 0; +} + +static void mlx5_esw_offloads_sf_devlink_port_cleanup(struct mlx5_eswitch *esw, u16 vport_num) +{ + struct mlx5_vport *vport; + + vport = mlx5_eswitch_get_vport(esw, vport_num); + if (IS_ERR(vport)) + return; + + vport->dl_port = NULL; +} + int mlx5_esw_offloads_devlink_port_register(struct mlx5_eswitch *esw, u16 vport_num) { struct mlx5_core_dev *dev = esw->dev; @@ -179,38 +221,37 @@ int mlx5_esw_devlink_sf_port_register(struct mlx5_eswitch *esw, struct devlink_p u16 vport_num, u32 controller, u32 sfnum) { struct mlx5_core_dev *dev = esw->dev; - struct netdev_phys_item_id ppid = {}; unsigned int dl_port_index; struct mlx5_vport *vport; struct devlink *devlink; - u16 pfnum; int err; vport = mlx5_eswitch_get_vport(esw, vport_num); if (IS_ERR(vport)) return PTR_ERR(vport); - pfnum = mlx5_get_dev_index(dev); - mlx5_esw_get_port_parent_id(dev, &ppid); - memcpy(dl_port->attrs.switch_id.id, &ppid.id[0], ppid.id_len); - dl_port->attrs.switch_id.id_len = ppid.id_len; - devlink_port_attrs_pci_sf_set(dl_port, controller, pfnum, sfnum, !!controller); + err = mlx5_esw_offloads_sf_devlink_port_init(esw, vport_num, dl_port, controller, sfnum); + if (err) + return err; + devlink = priv_to_devlink(dev); dl_port_index = mlx5_esw_vport_to_devlink_port_index(dev, vport_num); err = devl_port_register_with_ops(devlink, dl_port, dl_port_index, &mlx5_esw_dl_sf_port_ops); if (err) - return err; + goto reg_err; err = devl_rate_leaf_create(dl_port, vport, NULL); if (err) goto rate_err; - vport->dl_port = dl_port; return 0; rate_err: devl_port_unregister(dl_port); + +reg_err: + mlx5_esw_offloads_sf_devlink_port_cleanup(esw, vport_num); return err; } @@ -226,5 +267,5 @@ void mlx5_esw_devlink_sf_port_unregister(struct mlx5_eswitch *esw, u16 vport_num devl_rate_leaf_destroy(vport->dl_port); devl_port_unregister(vport->dl_port); - vport->dl_port = NULL; + mlx5_esw_offloads_sf_devlink_port_cleanup(esw, vport_num); }