mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-06 03:06:50 -04:00
net/mlx5: Push devlink port PF/VF init/cleanup calls out of devlink_port_register/unregister()
In order to prepare for mlx5_esw_offloads_devlink_port_register/unregister() to be used for SFs as well, push out the PF/VF specific init/cleanup calls outside. Introduce mlx5_eswitch_load/unload_pf_vf_vport() and call them from there. Use these new helpers of PF/VF loading and make mlx5_eswitch_local/unload_vport() reusable for SFs. Signed-off-by: Jiri Pirko <jiri@nvidia.com> Reviewed-by: Shay Drory <shayd@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
committed by
Saeed Mahameed
parent
6380022525
commit
d9833bcfe8
@@ -54,7 +54,7 @@ static void mlx5_esw_offloads_pf_vf_devlink_port_attrs_set(struct mlx5_eswitch *
|
||||
}
|
||||
}
|
||||
|
||||
static int mlx5_esw_offloads_pf_vf_devlink_port_init(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
int mlx5_esw_offloads_pf_vf_devlink_port_init(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
{
|
||||
struct devlink_port *dl_port;
|
||||
struct mlx5_vport *vport;
|
||||
@@ -76,7 +76,7 @@ static int mlx5_esw_offloads_pf_vf_devlink_port_init(struct mlx5_eswitch *esw, u
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mlx5_esw_offloads_pf_vf_devlink_port_cleanup(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
void mlx5_esw_offloads_pf_vf_devlink_port_cleanup(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
{
|
||||
struct mlx5_vport *vport;
|
||||
|
||||
@@ -152,10 +152,6 @@ int mlx5_esw_offloads_devlink_port_register(struct mlx5_eswitch *esw, u16 vport_
|
||||
if (IS_ERR(vport))
|
||||
return PTR_ERR(vport);
|
||||
|
||||
err = mlx5_esw_offloads_pf_vf_devlink_port_init(esw, vport_num);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
dl_port = vport->dl_port;
|
||||
if (!dl_port)
|
||||
return 0;
|
||||
@@ -165,7 +161,7 @@ int mlx5_esw_offloads_devlink_port_register(struct mlx5_eswitch *esw, u16 vport_
|
||||
err = devl_port_register_with_ops(devlink, dl_port, dl_port_index,
|
||||
&mlx5_esw_pf_vf_dl_port_ops);
|
||||
if (err)
|
||||
goto reg_err;
|
||||
return err;
|
||||
|
||||
err = devl_rate_leaf_create(dl_port, vport, NULL);
|
||||
if (err)
|
||||
@@ -175,8 +171,6 @@ int mlx5_esw_offloads_devlink_port_register(struct mlx5_eswitch *esw, u16 vport_
|
||||
|
||||
rate_err:
|
||||
devl_port_unregister(dl_port);
|
||||
reg_err:
|
||||
mlx5_esw_offloads_pf_vf_devlink_port_cleanup(esw, vport_num);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -192,7 +186,6 @@ void mlx5_esw_offloads_devlink_port_unregister(struct mlx5_eswitch *esw, u16 vpo
|
||||
devl_rate_leaf_destroy(vport->dl_port);
|
||||
|
||||
devl_port_unregister(vport->dl_port);
|
||||
mlx5_esw_offloads_pf_vf_devlink_port_cleanup(esw, vport_num);
|
||||
}
|
||||
|
||||
struct devlink_port *mlx5_esw_offloads_devlink_port(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
|
||||
@@ -1094,6 +1094,31 @@ static void mlx5_eswitch_unload_vport(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
mlx5_esw_vport_disable(esw, vport_num);
|
||||
}
|
||||
|
||||
static int mlx5_eswitch_load_pf_vf_vport(struct mlx5_eswitch *esw, u16 vport_num,
|
||||
enum mlx5_eswitch_vport_event enabled_events)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = mlx5_esw_offloads_init_pf_vf_rep(esw, vport_num);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mlx5_eswitch_load_vport(esw, vport_num, enabled_events);
|
||||
if (err)
|
||||
goto err_load;
|
||||
return 0;
|
||||
|
||||
err_load:
|
||||
mlx5_esw_offloads_cleanup_pf_vf_rep(esw, vport_num);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void mlx5_eswitch_unload_pf_vf_vport(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
{
|
||||
mlx5_eswitch_unload_vport(esw, vport_num);
|
||||
mlx5_esw_offloads_cleanup_pf_vf_rep(esw, vport_num);
|
||||
}
|
||||
|
||||
void mlx5_eswitch_unload_vf_vports(struct mlx5_eswitch *esw, u16 num_vfs)
|
||||
{
|
||||
struct mlx5_vport *vport;
|
||||
@@ -1102,7 +1127,7 @@ void mlx5_eswitch_unload_vf_vports(struct mlx5_eswitch *esw, u16 num_vfs)
|
||||
mlx5_esw_for_each_vf_vport(esw, i, vport, num_vfs) {
|
||||
if (!vport->enabled)
|
||||
continue;
|
||||
mlx5_eswitch_unload_vport(esw, vport->vport);
|
||||
mlx5_eswitch_unload_pf_vf_vport(esw, vport->vport);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1115,7 +1140,7 @@ static void mlx5_eswitch_unload_ec_vf_vports(struct mlx5_eswitch *esw,
|
||||
mlx5_esw_for_each_ec_vf_vport(esw, i, vport, num_ec_vfs) {
|
||||
if (!vport->enabled)
|
||||
continue;
|
||||
mlx5_eswitch_unload_vport(esw, vport->vport);
|
||||
mlx5_eswitch_unload_pf_vf_vport(esw, vport->vport);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1127,7 +1152,7 @@ int mlx5_eswitch_load_vf_vports(struct mlx5_eswitch *esw, u16 num_vfs,
|
||||
int err;
|
||||
|
||||
mlx5_esw_for_each_vf_vport(esw, i, vport, num_vfs) {
|
||||
err = mlx5_eswitch_load_vport(esw, vport->vport, enabled_events);
|
||||
err = mlx5_eswitch_load_pf_vf_vport(esw, vport->vport, enabled_events);
|
||||
if (err)
|
||||
goto vf_err;
|
||||
}
|
||||
@@ -1147,7 +1172,7 @@ static int mlx5_eswitch_load_ec_vf_vports(struct mlx5_eswitch *esw, u16 num_ec_v
|
||||
int err;
|
||||
|
||||
mlx5_esw_for_each_ec_vf_vport(esw, i, vport, num_ec_vfs) {
|
||||
err = mlx5_eswitch_load_vport(esw, vport->vport, enabled_events);
|
||||
err = mlx5_eswitch_load_pf_vf_vport(esw, vport->vport, enabled_events);
|
||||
if (err)
|
||||
goto vf_err;
|
||||
}
|
||||
@@ -1189,7 +1214,7 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
|
||||
int ret;
|
||||
|
||||
/* Enable PF vport */
|
||||
ret = mlx5_eswitch_load_vport(esw, MLX5_VPORT_PF, enabled_events);
|
||||
ret = mlx5_eswitch_load_pf_vf_vport(esw, MLX5_VPORT_PF, enabled_events);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1200,7 +1225,7 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
|
||||
|
||||
/* Enable ECPF vport */
|
||||
if (mlx5_ecpf_vport_exists(esw->dev)) {
|
||||
ret = mlx5_eswitch_load_vport(esw, MLX5_VPORT_ECPF, enabled_events);
|
||||
ret = mlx5_eswitch_load_pf_vf_vport(esw, MLX5_VPORT_ECPF, enabled_events);
|
||||
if (ret)
|
||||
goto ecpf_err;
|
||||
if (mlx5_core_ec_sriov_enabled(esw->dev)) {
|
||||
@@ -1223,11 +1248,11 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
|
||||
mlx5_eswitch_unload_ec_vf_vports(esw, esw->esw_funcs.num_ec_vfs);
|
||||
ec_vf_err:
|
||||
if (mlx5_ecpf_vport_exists(esw->dev))
|
||||
mlx5_eswitch_unload_vport(esw, MLX5_VPORT_ECPF);
|
||||
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF);
|
||||
ecpf_err:
|
||||
host_pf_disable_hca(esw->dev);
|
||||
pf_hca_err:
|
||||
mlx5_eswitch_unload_vport(esw, MLX5_VPORT_PF);
|
||||
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_PF);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1241,11 +1266,11 @@ void mlx5_eswitch_disable_pf_vf_vports(struct mlx5_eswitch *esw)
|
||||
if (mlx5_ecpf_vport_exists(esw->dev)) {
|
||||
if (mlx5_core_ec_sriov_enabled(esw->dev))
|
||||
mlx5_eswitch_unload_ec_vf_vports(esw, esw->esw_funcs.num_vfs);
|
||||
mlx5_eswitch_unload_vport(esw, MLX5_VPORT_ECPF);
|
||||
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF);
|
||||
}
|
||||
|
||||
host_pf_disable_hca(esw->dev);
|
||||
mlx5_eswitch_unload_vport(esw, MLX5_VPORT_PF);
|
||||
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_PF);
|
||||
}
|
||||
|
||||
static void mlx5_eswitch_get_devlink_param(struct mlx5_eswitch *esw)
|
||||
|
||||
@@ -729,6 +729,8 @@ void mlx5_esw_set_spec_source_port(struct mlx5_eswitch *esw,
|
||||
u16 vport,
|
||||
struct mlx5_flow_spec *spec);
|
||||
|
||||
int mlx5_esw_offloads_init_pf_vf_rep(struct mlx5_eswitch *esw, u16 vport_num);
|
||||
void mlx5_esw_offloads_cleanup_pf_vf_rep(struct mlx5_eswitch *esw, u16 vport_num);
|
||||
int mlx5_esw_offloads_load_rep(struct mlx5_eswitch *esw, u16 vport_num);
|
||||
void mlx5_esw_offloads_unload_rep(struct mlx5_eswitch *esw, u16 vport_num);
|
||||
|
||||
@@ -736,6 +738,8 @@ int mlx5_eswitch_load_vf_vports(struct mlx5_eswitch *esw, u16 num_vfs,
|
||||
enum mlx5_eswitch_vport_event enabled_events);
|
||||
void mlx5_eswitch_unload_vf_vports(struct mlx5_eswitch *esw, u16 num_vfs);
|
||||
|
||||
int mlx5_esw_offloads_pf_vf_devlink_port_init(struct mlx5_eswitch *esw, u16 vport_num);
|
||||
void mlx5_esw_offloads_pf_vf_devlink_port_cleanup(struct mlx5_eswitch *esw, u16 vport_num);
|
||||
int mlx5_esw_offloads_devlink_port_register(struct mlx5_eswitch *esw, u16 vport_num);
|
||||
void mlx5_esw_offloads_devlink_port_unregister(struct mlx5_eswitch *esw, u16 vport_num);
|
||||
struct devlink_port *mlx5_esw_offloads_devlink_port(struct mlx5_eswitch *esw, u16 vport_num);
|
||||
|
||||
@@ -2535,6 +2535,22 @@ static void mlx5_esw_offloads_rep_unload(struct mlx5_eswitch *esw, u16 vport_num
|
||||
__esw_offloads_unload_rep(esw, rep, rep_type);
|
||||
}
|
||||
|
||||
int mlx5_esw_offloads_init_pf_vf_rep(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
{
|
||||
if (esw->mode != MLX5_ESWITCH_OFFLOADS)
|
||||
return 0;
|
||||
|
||||
return mlx5_esw_offloads_pf_vf_devlink_port_init(esw, vport_num);
|
||||
}
|
||||
|
||||
void mlx5_esw_offloads_cleanup_pf_vf_rep(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
{
|
||||
if (esw->mode != MLX5_ESWITCH_OFFLOADS)
|
||||
return;
|
||||
|
||||
mlx5_esw_offloads_pf_vf_devlink_port_cleanup(esw, vport_num);
|
||||
}
|
||||
|
||||
int mlx5_esw_offloads_load_rep(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
{
|
||||
int err;
|
||||
|
||||
Reference in New Issue
Block a user