mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-18 13:08:08 +07:00
net/mlx5: E-Switch, Assign a different position for uplink rep and vport
In offloads mode, the current implementation puts the uplink representor at index zero of the vport reps array. It is not "natural" to place it at index 0 since we want to put the representor for vport 0 at index 0 with the introduction of SmartNIC. A separate patch will handle the case whether a rep is needed for vport 0 (PF vport). So, we want to have a different placeholder for uplink vport and representor. It was placed at the end of vport and rep array. Since vport number can no longer act as an index into the vport or representors arrays, use functions to map vport numbers to indices when accessing the vports or representors arrays, and vice versa. Signed-off-by: Bodong Wang <bodong@mellanox.com> Signed-off-by: Eli Cohen <eli@mellanox.com> Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
f8e8fa0262
commit
5ae5162066
@ -84,8 +84,10 @@ enum {
|
||||
static struct mlx5_vport *mlx5_eswitch_get_vport(struct mlx5_eswitch *esw,
|
||||
u16 vport_num)
|
||||
{
|
||||
u16 idx = mlx5_eswitch_vport_num_to_index(esw, vport_num);
|
||||
|
||||
WARN_ON(vport_num > esw->total_vports - 1);
|
||||
return &esw->vports[vport_num];
|
||||
return &esw->vports[idx];
|
||||
}
|
||||
|
||||
static int arm_vport_context_events_cmd(struct mlx5_core_dev *dev, u16 vport,
|
||||
@ -1756,8 +1758,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
|
||||
int total_vports = MLX5_TOTAL_VPORTS(dev);
|
||||
struct mlx5_eswitch *esw;
|
||||
struct mlx5_vport *vport;
|
||||
int vport_num;
|
||||
int err;
|
||||
int err, i;
|
||||
|
||||
if (!MLX5_VPORT_MANAGER(dev))
|
||||
return 0;
|
||||
@ -1798,8 +1799,8 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
|
||||
hash_init(esw->offloads.mod_hdr_tbl);
|
||||
mutex_init(&esw->state_lock);
|
||||
|
||||
mlx5_esw_for_all_vports(esw, vport_num, vport) {
|
||||
vport->vport = vport_num;
|
||||
mlx5_esw_for_all_vports(esw, i, vport) {
|
||||
vport->vport = mlx5_eswitch_index_to_vport_num(esw, i);
|
||||
vport->info.link_state = MLX5_VPORT_ADMIN_STATE_AUTO;
|
||||
vport->dev = dev;
|
||||
INIT_WORK(&vport->vport_change_handler,
|
||||
|
@ -374,6 +374,30 @@ static inline u16 mlx5_eswitch_manager_vport(struct mlx5_core_dev *dev)
|
||||
MLX5_VPORT_ECPF : MLX5_VPORT_PF;
|
||||
}
|
||||
|
||||
static inline int mlx5_eswitch_uplink_idx(struct mlx5_eswitch *esw)
|
||||
{
|
||||
/* Uplink always locate at the last element of the array.*/
|
||||
return esw->total_vports - 1;
|
||||
}
|
||||
|
||||
static inline int mlx5_eswitch_vport_num_to_index(struct mlx5_eswitch *esw,
|
||||
u16 vport_num)
|
||||
{
|
||||
if (vport_num == MLX5_VPORT_UPLINK)
|
||||
return mlx5_eswitch_uplink_idx(esw);
|
||||
|
||||
return vport_num;
|
||||
}
|
||||
|
||||
static inline int mlx5_eswitch_index_to_vport_num(struct mlx5_eswitch *esw,
|
||||
int index)
|
||||
{
|
||||
if (index == mlx5_eswitch_uplink_idx(esw))
|
||||
return MLX5_VPORT_UPLINK;
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
#else /* CONFIG_MLX5_ESWITCH */
|
||||
/* eswitch API stubs */
|
||||
static inline int mlx5_eswitch_init(struct mlx5_core_dev *dev) { return 0; }
|
||||
|
@ -85,10 +85,7 @@ enum {
|
||||
static struct mlx5_eswitch_rep *mlx5_eswitch_get_rep(struct mlx5_eswitch *esw,
|
||||
u16 vport_num)
|
||||
{
|
||||
u16 idx = vport_num;
|
||||
|
||||
if (vport_num == MLX5_VPORT_UPLINK)
|
||||
idx = UPLINK_REP_INDEX;
|
||||
u16 idx = mlx5_eswitch_vport_num_to_index(esw, vport_num);
|
||||
|
||||
WARN_ON(idx > esw->total_vports - 1);
|
||||
return &esw->offloads.vport_reps[idx];
|
||||
@ -1254,7 +1251,6 @@ int esw_offloads_init_reps(struct mlx5_eswitch *esw)
|
||||
{
|
||||
int total_vfs = MLX5_TOTAL_VPORTS(esw->dev);
|
||||
struct mlx5_core_dev *dev = esw->dev;
|
||||
struct mlx5_esw_offload *offloads;
|
||||
struct mlx5_eswitch_rep *rep;
|
||||
u8 hw_id[ETH_ALEN], rep_type;
|
||||
int vport;
|
||||
@ -1265,19 +1261,16 @@ int esw_offloads_init_reps(struct mlx5_eswitch *esw)
|
||||
if (!esw->offloads.vport_reps)
|
||||
return -ENOMEM;
|
||||
|
||||
offloads = &esw->offloads;
|
||||
mlx5_query_nic_vport_mac_address(dev, 0, hw_id);
|
||||
|
||||
mlx5_esw_for_all_reps(esw, vport, rep) {
|
||||
rep->vport = vport;
|
||||
rep->vport = mlx5_eswitch_index_to_vport_num(esw, vport);
|
||||
ether_addr_copy(rep->hw_id, hw_id);
|
||||
|
||||
for (rep_type = 0; rep_type < NUM_REP_TYPES; rep_type++)
|
||||
rep->rep_if[rep_type].state = REP_UNREGISTERED;
|
||||
}
|
||||
|
||||
offloads->vport_reps[0].vport = MLX5_VPORT_UPLINK;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -36,9 +36,14 @@
|
||||
#include <linux/mlx5/driver.h>
|
||||
#include <linux/mlx5/device.h>
|
||||
|
||||
#define MLX5_VPORT_PF_PLACEHOLDER (1u)
|
||||
#define MLX5_SPECIAL_VPORTS (MLX5_VPORT_PF_PLACEHOLDER)
|
||||
#define MLX5_TOTAL_VPORTS(mdev) (MLX5_SPECIAL_VPORTS + mlx5_core_max_vfs(mdev))
|
||||
#define MLX5_VPORT_PF_PLACEHOLDER (1u)
|
||||
#define MLX5_VPORT_UPLINK_PLACEHOLDER (1u)
|
||||
|
||||
#define MLX5_SPECIAL_VPORTS (MLX5_VPORT_PF_PLACEHOLDER + \
|
||||
MLX5_VPORT_UPLINK_PLACEHOLDER)
|
||||
|
||||
#define MLX5_TOTAL_VPORTS(mdev) (MLX5_SPECIAL_VPORTS + \
|
||||
mlx5_core_max_vfs(mdev))
|
||||
|
||||
#define MLX5_VPORT_MANAGER(mdev) \
|
||||
(MLX5_CAP_GEN(mdev, vport_group_manager) && \
|
||||
|
Loading…
Reference in New Issue
Block a user