Commit f8e8fa02 authored by Bodong Wang's avatar Bodong Wang Committed by Saeed Mahameed

net/mlx5: E-Switch, Centralize repersentor reg/unreg to eswitch driver

Eswitch has two users: IB and ETH. They both register repersentors
when mlx5 interface is added, and unregister the repersentors when
mlx5 interface is removed. Ideally, each driver should only deal with
the entities which are unique to itself. However, current IB and ETH
drivers have to perform the following eswitch operations:

1. When registering, specify how many vports to register. This number
   is the same for both drivers which is the total available vport
   numbers.
2. When unregistering, specify the number of registered vports to do
   unregister. Also, unload the repersentors which are already loaded.

It's unnecessary for eswitch driver to hands out the control of above
operations to individual driver users, as they're not unique to each
driver. Instead, such operations should be centralized to eswitch
driver. This consolidates eswitch control flow, and simplified IB and
ETH driver.

This patch doesn't change any functionality.
Signed-off-by: default avatarBodong Wang <bodong@mellanox.com>
Reviewed-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent 29d9fd7d
...@@ -95,26 +95,20 @@ static void *mlx5_ib_vport_get_proto_dev(struct mlx5_eswitch_rep *rep) ...@@ -95,26 +95,20 @@ static void *mlx5_ib_vport_get_proto_dev(struct mlx5_eswitch_rep *rep)
void mlx5_ib_register_vport_reps(struct mlx5_core_dev *mdev) void mlx5_ib_register_vport_reps(struct mlx5_core_dev *mdev)
{ {
struct mlx5_eswitch *esw = mdev->priv.eswitch; struct mlx5_eswitch *esw = mdev->priv.eswitch;
int total_vports = MLX5_TOTAL_VPORTS(mdev);
struct mlx5_eswitch_rep_if rep_if = {}; struct mlx5_eswitch_rep_if rep_if = {};
int vport;
for (vport = 0; vport < total_vports; vport++) {
rep_if.load = mlx5_ib_vport_rep_load; rep_if.load = mlx5_ib_vport_rep_load;
rep_if.unload = mlx5_ib_vport_rep_unload; rep_if.unload = mlx5_ib_vport_rep_unload;
rep_if.get_proto_dev = mlx5_ib_vport_get_proto_dev; rep_if.get_proto_dev = mlx5_ib_vport_get_proto_dev;
mlx5_eswitch_register_vport_rep(esw, vport, &rep_if, REP_IB);
} mlx5_eswitch_register_vport_reps(esw, &rep_if, REP_IB);
} }
void mlx5_ib_unregister_vport_reps(struct mlx5_core_dev *mdev) void mlx5_ib_unregister_vport_reps(struct mlx5_core_dev *mdev)
{ {
struct mlx5_eswitch *esw = mdev->priv.eswitch; struct mlx5_eswitch *esw = mdev->priv.eswitch;
int total_vports = MLX5_TOTAL_VPORTS(mdev);
int vport;
for (vport = total_vports - 1; vport >= 0; vport--) mlx5_eswitch_unregister_vport_reps(esw, REP_IB);
mlx5_eswitch_unregister_vport_rep(esw, vport, REP_IB);
} }
u8 mlx5_ib_eswitch_mode(struct mlx5_eswitch *esw) u8 mlx5_ib_eswitch_mode(struct mlx5_eswitch *esw)
......
...@@ -1798,25 +1798,18 @@ static void *mlx5e_vport_rep_get_proto_dev(struct mlx5_eswitch_rep *rep) ...@@ -1798,25 +1798,18 @@ static void *mlx5e_vport_rep_get_proto_dev(struct mlx5_eswitch_rep *rep)
void mlx5e_rep_register_vport_reps(struct mlx5_core_dev *mdev) void mlx5e_rep_register_vport_reps(struct mlx5_core_dev *mdev)
{ {
struct mlx5_eswitch *esw = mdev->priv.eswitch; struct mlx5_eswitch *esw = mdev->priv.eswitch;
int total_vfs = MLX5_TOTAL_VPORTS(mdev);
int vport;
for (vport = 0; vport < total_vfs; vport++) {
struct mlx5_eswitch_rep_if rep_if = {}; struct mlx5_eswitch_rep_if rep_if = {};
rep_if.load = mlx5e_vport_rep_load; rep_if.load = mlx5e_vport_rep_load;
rep_if.unload = mlx5e_vport_rep_unload; rep_if.unload = mlx5e_vport_rep_unload;
rep_if.get_proto_dev = mlx5e_vport_rep_get_proto_dev; rep_if.get_proto_dev = mlx5e_vport_rep_get_proto_dev;
mlx5_eswitch_register_vport_rep(esw, vport, &rep_if, REP_ETH);
} mlx5_eswitch_register_vport_reps(esw, &rep_if, REP_ETH);
} }
void mlx5e_rep_unregister_vport_reps(struct mlx5_core_dev *mdev) void mlx5e_rep_unregister_vport_reps(struct mlx5_core_dev *mdev)
{ {
struct mlx5_eswitch *esw = mdev->priv.eswitch; struct mlx5_eswitch *esw = mdev->priv.eswitch;
int total_vfs = MLX5_TOTAL_VPORTS(mdev);
int vport;
for (vport = total_vfs - 1; vport >= 0; vport--) mlx5_eswitch_unregister_vport_reps(esw, REP_ETH);
mlx5_eswitch_unregister_vport_rep(esw, vport, REP_ETH);
} }
...@@ -1923,40 +1923,39 @@ int mlx5_devlink_eswitch_encap_mode_get(struct devlink *devlink, u8 *encap) ...@@ -1923,40 +1923,39 @@ int mlx5_devlink_eswitch_encap_mode_get(struct devlink *devlink, u8 *encap)
return 0; return 0;
} }
void mlx5_eswitch_register_vport_rep(struct mlx5_eswitch *esw, void mlx5_eswitch_register_vport_reps(struct mlx5_eswitch *esw,
int vport_index,
struct mlx5_eswitch_rep_if *__rep_if, struct mlx5_eswitch_rep_if *__rep_if,
u8 rep_type) u8 rep_type)
{ {
struct mlx5_esw_offload *offloads = &esw->offloads;
struct mlx5_eswitch_rep_if *rep_if; struct mlx5_eswitch_rep_if *rep_if;
struct mlx5_eswitch_rep *rep;
int i;
rep_if = &offloads->vport_reps[vport_index].rep_if[rep_type]; mlx5_esw_for_all_reps(esw, i, rep) {
rep_if = &rep->rep_if[rep_type];
rep_if->load = __rep_if->load; rep_if->load = __rep_if->load;
rep_if->unload = __rep_if->unload; rep_if->unload = __rep_if->unload;
rep_if->get_proto_dev = __rep_if->get_proto_dev; rep_if->get_proto_dev = __rep_if->get_proto_dev;
rep_if->priv = __rep_if->priv; rep_if->priv = __rep_if->priv;
rep_if->state = REP_REGISTERED; rep_if->state = REP_REGISTERED;
}
} }
EXPORT_SYMBOL(mlx5_eswitch_register_vport_rep); EXPORT_SYMBOL(mlx5_eswitch_register_vport_reps);
void mlx5_eswitch_unregister_vport_rep(struct mlx5_eswitch *esw, void mlx5_eswitch_unregister_vport_reps(struct mlx5_eswitch *esw, u8 rep_type)
int vport_index, u8 rep_type)
{ {
struct mlx5_esw_offload *offloads = &esw->offloads; u16 max_vf = mlx5_core_max_vfs(esw->dev);
struct mlx5_eswitch_rep *rep; struct mlx5_eswitch_rep *rep;
int i;
rep = &offloads->vport_reps[vport_index]; if (esw->mode == SRIOV_OFFLOADS)
__unload_reps_all_vport(esw, max_vf, rep_type);
if (esw->mode == SRIOV_OFFLOADS &&
rep->rep_if[rep_type].state == REP_LOADED)
rep->rep_if[rep_type].unload(rep);
mlx5_esw_for_all_reps(esw, i, rep)
rep->rep_if[rep_type].state = REP_UNREGISTERED; rep->rep_if[rep_type].state = REP_UNREGISTERED;
} }
EXPORT_SYMBOL(mlx5_eswitch_unregister_vport_rep); EXPORT_SYMBOL(mlx5_eswitch_unregister_vport_reps);
void *mlx5_eswitch_get_uplink_priv(struct mlx5_eswitch *esw, u8 rep_type) void *mlx5_eswitch_get_uplink_priv(struct mlx5_eswitch *esw, u8 rep_type)
{ {
......
...@@ -46,13 +46,10 @@ struct mlx5_eswitch_rep { ...@@ -46,13 +46,10 @@ struct mlx5_eswitch_rep {
u32 vlan_refcount; u32 vlan_refcount;
}; };
void mlx5_eswitch_register_vport_rep(struct mlx5_eswitch *esw, void mlx5_eswitch_register_vport_reps(struct mlx5_eswitch *esw,
int vport_index,
struct mlx5_eswitch_rep_if *rep_if, struct mlx5_eswitch_rep_if *rep_if,
u8 rep_type); u8 rep_type);
void mlx5_eswitch_unregister_vport_rep(struct mlx5_eswitch *esw, void mlx5_eswitch_unregister_vport_reps(struct mlx5_eswitch *esw, u8 rep_type);
int vport_index,
u8 rep_type);
void *mlx5_eswitch_get_proto_dev(struct mlx5_eswitch *esw, void *mlx5_eswitch_get_proto_dev(struct mlx5_eswitch *esw,
int vport, int vport,
u8 rep_type); u8 rep_type);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment