net/mlx5: E-Switch, Properly refer to host PF vport as other vport
Commands referring to vports use the following scheme: 1. When referring to my own vport, put 0 in vport and 0 in other_vport. 2. When referring to another vport, put the vport number of the referred vport and put 1 in other_vport. It was assumed that driver is accessing other vport when vport number is greater than 0. With the above scheme, the case that ECPF eswitch manager is trying to access host PF vport will fall over with scheme 1 as the vport number is 0. This is apparently wrong as driver is trying to refer other vport. As such usage can only happen in the eswitch context, change relevant functions to provide other vport input properly. Signed-off-by: Bodong Wang <bodong@mellanox.com> Signed-off-by: Eli Cohen <eli@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
Родитель
a1b3839ac4
Коммит
cbc44e76bf
|
@ -1083,7 +1083,8 @@ static int mlx5e_vf_rep_open(struct net_device *dev)
|
|||
|
||||
if (!mlx5_modify_vport_admin_state(priv->mdev,
|
||||
MLX5_VPORT_STATE_OP_MOD_ESW_VPORT,
|
||||
rep->vport, MLX5_VPORT_ADMIN_STATE_UP))
|
||||
rep->vport, 1,
|
||||
MLX5_VPORT_ADMIN_STATE_UP))
|
||||
netif_carrier_on(dev);
|
||||
|
||||
unlock:
|
||||
|
@ -1101,7 +1102,8 @@ static int mlx5e_vf_rep_close(struct net_device *dev)
|
|||
mutex_lock(&priv->state_lock);
|
||||
mlx5_modify_vport_admin_state(priv->mdev,
|
||||
MLX5_VPORT_STATE_OP_MOD_ESW_VPORT,
|
||||
rep->vport, MLX5_VPORT_ADMIN_STATE_DOWN);
|
||||
rep->vport, 1,
|
||||
MLX5_VPORT_ADMIN_STATE_DOWN);
|
||||
ret = mlx5e_close_locked(dev);
|
||||
mutex_unlock(&priv->state_lock);
|
||||
return ret;
|
||||
|
|
|
@ -1462,7 +1462,7 @@ static void esw_apply_vport_conf(struct mlx5_eswitch *esw,
|
|||
|
||||
mlx5_modify_vport_admin_state(esw->dev,
|
||||
MLX5_VPORT_STATE_OP_MOD_ESW_VPORT,
|
||||
vport_num,
|
||||
vport_num, 1,
|
||||
vport->info.link_state);
|
||||
|
||||
/* Host PF has its own mac/guid. */
|
||||
|
@ -1581,10 +1581,10 @@ static void esw_disable_vport(struct mlx5_eswitch *esw, int vport_num)
|
|||
esw_vport_change_handle_locked(vport);
|
||||
vport->enabled_events = 0;
|
||||
esw_vport_disable_qos(esw, vport_num);
|
||||
if (vport_num && esw->mode == SRIOV_LEGACY) {
|
||||
if (esw->mode == SRIOV_LEGACY) {
|
||||
mlx5_modify_vport_admin_state(esw->dev,
|
||||
MLX5_VPORT_STATE_OP_MOD_ESW_VPORT,
|
||||
vport_num,
|
||||
vport_num, 1,
|
||||
MLX5_VPORT_ADMIN_STATE_DOWN);
|
||||
esw_vport_disable_egress_acl(esw, vport);
|
||||
esw_vport_disable_ingress_acl(esw, vport);
|
||||
|
@ -1875,7 +1875,7 @@ int mlx5_eswitch_set_vport_state(struct mlx5_eswitch *esw,
|
|||
|
||||
err = mlx5_modify_vport_admin_state(esw->dev,
|
||||
MLX5_VPORT_STATE_OP_MOD_ESW_VPORT,
|
||||
vport, link_state);
|
||||
vport, 1, link_state);
|
||||
if (err) {
|
||||
mlx5_core_warn(esw->dev,
|
||||
"Failed to set vport %d link state, err = %d",
|
||||
|
@ -2137,7 +2137,7 @@ static int mlx5_eswitch_query_vport_drop_stats(struct mlx5_core_dev *dev,
|
|||
!MLX5_CAP_GEN(dev, transmit_discard_vport_down))
|
||||
return 0;
|
||||
|
||||
err = mlx5_query_vport_down_stats(dev, vport_idx,
|
||||
err = mlx5_query_vport_down_stats(dev, vport_idx, 1,
|
||||
&rx_discard_vport_down,
|
||||
&tx_discard_vport_down);
|
||||
if (err)
|
||||
|
@ -2174,8 +2174,7 @@ int mlx5_eswitch_get_vport_stats(struct mlx5_eswitch *esw,
|
|||
MLX5_CMD_OP_QUERY_VPORT_COUNTER);
|
||||
MLX5_SET(query_vport_counter_in, in, op_mod, 0);
|
||||
MLX5_SET(query_vport_counter_in, in, vport_number, vport);
|
||||
if (vport)
|
||||
MLX5_SET(query_vport_counter_in, in, other_vport, 1);
|
||||
MLX5_SET(query_vport_counter_in, in, other_vport, 1);
|
||||
|
||||
memset(out, 0, outlen);
|
||||
err = mlx5_cmd_exec(esw->dev, in, sizeof(in), out, outlen);
|
||||
|
|
|
@ -64,7 +64,7 @@ u8 mlx5_query_vport_state(struct mlx5_core_dev *mdev, u8 opmod, u16 vport)
|
|||
}
|
||||
|
||||
int mlx5_modify_vport_admin_state(struct mlx5_core_dev *mdev, u8 opmod,
|
||||
u16 vport, u8 state)
|
||||
u16 vport, u8 other_vport, u8 state)
|
||||
{
|
||||
u32 in[MLX5_ST_SZ_DW(modify_vport_state_in)] = {0};
|
||||
u32 out[MLX5_ST_SZ_DW(modify_vport_state_out)] = {0};
|
||||
|
@ -73,8 +73,7 @@ int mlx5_modify_vport_admin_state(struct mlx5_core_dev *mdev, u8 opmod,
|
|||
MLX5_CMD_OP_MODIFY_VPORT_STATE);
|
||||
MLX5_SET(modify_vport_state_in, in, op_mod, opmod);
|
||||
MLX5_SET(modify_vport_state_in, in, vport_number, vport);
|
||||
if (vport)
|
||||
MLX5_SET(modify_vport_state_in, in, other_vport, 1);
|
||||
MLX5_SET(modify_vport_state_in, in, other_vport, other_vport);
|
||||
MLX5_SET(modify_vport_state_in, in, admin_state, state);
|
||||
|
||||
return mlx5_cmd_exec(mdev, in, sizeof(in), out, sizeof(out));
|
||||
|
@ -1057,7 +1056,7 @@ free:
|
|||
EXPORT_SYMBOL_GPL(mlx5_core_query_vport_counter);
|
||||
|
||||
int mlx5_query_vport_down_stats(struct mlx5_core_dev *mdev, u16 vport,
|
||||
u64 *rx_discard_vport_down,
|
||||
u8 other_vport, u64 *rx_discard_vport_down,
|
||||
u64 *tx_discard_vport_down)
|
||||
{
|
||||
u32 out[MLX5_ST_SZ_DW(query_vnic_env_out)] = {0};
|
||||
|
@ -1068,8 +1067,7 @@ int mlx5_query_vport_down_stats(struct mlx5_core_dev *mdev, u16 vport,
|
|||
MLX5_CMD_OP_QUERY_VNIC_ENV);
|
||||
MLX5_SET(query_vnic_env_in, in, op_mod, 0);
|
||||
MLX5_SET(query_vnic_env_in, in, vport_number, vport);
|
||||
if (vport)
|
||||
MLX5_SET(query_vnic_env_in, in, other_vport, 1);
|
||||
MLX5_SET(query_vnic_env_in, in, other_vport, other_vport);
|
||||
|
||||
err = mlx5_cmd_exec(mdev, in, sizeof(in), out, sizeof(out));
|
||||
if (err)
|
||||
|
|
|
@ -59,7 +59,7 @@ enum {
|
|||
|
||||
u8 mlx5_query_vport_state(struct mlx5_core_dev *mdev, u8 opmod, u16 vport);
|
||||
int mlx5_modify_vport_admin_state(struct mlx5_core_dev *mdev, u8 opmod,
|
||||
u16 vport, u8 state);
|
||||
u16 vport, u8 other_vport, u8 state);
|
||||
int mlx5_query_nic_vport_mac_address(struct mlx5_core_dev *mdev,
|
||||
u16 vport, u8 *addr);
|
||||
int mlx5_query_nic_vport_min_inline(struct mlx5_core_dev *mdev,
|
||||
|
@ -121,7 +121,7 @@ int mlx5_modify_nic_vport_vlans(struct mlx5_core_dev *dev,
|
|||
int mlx5_nic_vport_enable_roce(struct mlx5_core_dev *mdev);
|
||||
int mlx5_nic_vport_disable_roce(struct mlx5_core_dev *mdev);
|
||||
int mlx5_query_vport_down_stats(struct mlx5_core_dev *mdev, u16 vport,
|
||||
u64 *rx_discard_vport_down,
|
||||
u8 other_vport, u64 *rx_discard_vport_down,
|
||||
u64 *tx_discard_vport_down);
|
||||
int mlx5_core_query_vport_counter(struct mlx5_core_dev *dev, u8 other_vport,
|
||||
int vf, u8 port_num, void *out,
|
||||
|
|
Загрузка…
Ссылка в новой задаче