aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorParav Pandit <parav@mellanox.com>2019-06-07 06:44:17 -0500
committerSaeed Mahameed <saeedm@mellanox.com>2019-07-03 12:50:42 -0700
commit7e736f9ae3d12272fec5a2b24e41b78ed58525a4 (patch)
treec003fc1059465daf66a3af2733db0343910861a5 /drivers
parentnet/mlx5: Introduce and use mlx5_eswitch_get_total_vports() (diff)
downloadlinux-dev-7e736f9ae3d12272fec5a2b24e41b78ed58525a4.tar.xz
linux-dev-7e736f9ae3d12272fec5a2b24e41b78ed58525a4.zip
net/mlx5: E-Switch prepare functions change handler to be modular
Eswitch function change handler will service multiple type of events for VFs and non VF functions update. Hence, introduce and use the helper function esw_vfs_changed_event_handler() for handling change in num VFs to improve the code readability. Signed-off-by: Parav Pandit <parav@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c44
1 files changed, 27 insertions, 17 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
index 5c8fb2597bfa..42c0db585561 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
@@ -2046,38 +2046,48 @@ static void esw_offloads_steering_cleanup(struct mlx5_eswitch *esw)
esw_destroy_offloads_acl_tables(esw);
}
-static void esw_functions_changed_event_handler(struct work_struct *work)
+static void
+esw_vfs_changed_event_handler(struct mlx5_eswitch *esw, const u32 *out)
{
- u32 out[MLX5_ST_SZ_DW(query_esw_functions_out)] = {};
- struct mlx5_host_work *host_work;
- struct mlx5_eswitch *esw;
bool host_pf_disabled;
- u16 num_vfs = 0;
- int err;
-
- host_work = container_of(work, struct mlx5_host_work, work);
- esw = host_work->esw;
+ u16 new_num_vfs;
- err = mlx5_esw_query_functions(esw->dev, out, sizeof(out));
- num_vfs = MLX5_GET(query_esw_functions_out, out,
- host_params_context.host_num_of_vfs);
+ new_num_vfs = MLX5_GET(query_esw_functions_out, out,
+ host_params_context.host_num_of_vfs);
host_pf_disabled = MLX5_GET(query_esw_functions_out, out,
host_params_context.host_pf_disabled);
- if (err || host_pf_disabled || num_vfs == esw->esw_funcs.num_vfs)
- goto out;
+
+ if (new_num_vfs == esw->esw_funcs.num_vfs || host_pf_disabled)
+ return;
/* Number of VFs can only change from "0 to x" or "x to 0". */
if (esw->esw_funcs.num_vfs > 0) {
esw_offloads_unload_vf_reps(esw, esw->esw_funcs.num_vfs);
} else {
- err = esw_offloads_load_vf_reps(esw, num_vfs);
+ int err;
+ err = esw_offloads_load_vf_reps(esw, new_num_vfs);
if (err)
- goto out;
+ return;
}
+ esw->esw_funcs.num_vfs = new_num_vfs;
+}
+
+static void esw_functions_changed_event_handler(struct work_struct *work)
+{
+ u32 out[MLX5_ST_SZ_DW(query_esw_functions_out)] = {};
+ struct mlx5_host_work *host_work;
+ struct mlx5_eswitch *esw;
+ int err;
+
+ host_work = container_of(work, struct mlx5_host_work, work);
+ esw = host_work->esw;
- esw->esw_funcs.num_vfs = num_vfs;
+ err = mlx5_esw_query_functions(esw->dev, out, sizeof(out));
+ if (err)
+ goto out;
+ esw_vfs_changed_event_handler(esw, out);
out:
kfree(host_work);
}