Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e33dfe31 authored by Or Gerlitz's avatar Or Gerlitz Committed by David S. Miller
Browse files

net/mlx5: E-Switch, Allow fine tuning of eswitch vport push/pop vlan



The HW can be programmed to push vlan, pop vlan or both.

A factorization step towards using the push/pop capabilties in the
eswitch offloads mode. This patch doesn't add new functionality.

Signed-off-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent bac9b6aa
Loading
Loading
Loading
Loading
+22 −11
Original line number Original line Diff line number Diff line
@@ -127,7 +127,7 @@ static int modify_esw_vport_context_cmd(struct mlx5_core_dev *dev, u16 vport,
}
}


static int modify_esw_vport_cvlan(struct mlx5_core_dev *dev, u32 vport,
static int modify_esw_vport_cvlan(struct mlx5_core_dev *dev, u32 vport,
				  u16 vlan, u8 qos, bool set)
				  u16 vlan, u8 qos, u8 set_flags)
{
{
	u32 in[MLX5_ST_SZ_DW(modify_esw_vport_context_in)] = {0};
	u32 in[MLX5_ST_SZ_DW(modify_esw_vport_context_in)] = {0};


@@ -135,14 +135,18 @@ static int modify_esw_vport_cvlan(struct mlx5_core_dev *dev, u32 vport,
	    !MLX5_CAP_ESW(dev, vport_cvlan_insert_if_not_exist))
	    !MLX5_CAP_ESW(dev, vport_cvlan_insert_if_not_exist))
		return -ENOTSUPP;
		return -ENOTSUPP;


	esw_debug(dev, "Set Vport[%d] VLAN %d qos %d set=%d\n",
	esw_debug(dev, "Set Vport[%d] VLAN %d qos %d set=%x\n",
		  vport, vlan, qos, set);
		  vport, vlan, qos, set_flags);
	if (set) {

	if (set_flags & SET_VLAN_STRIP)
		MLX5_SET(modify_esw_vport_context_in, in,
		MLX5_SET(modify_esw_vport_context_in, in,
			 esw_vport_context.vport_cvlan_strip, 1);
			 esw_vport_context.vport_cvlan_strip, 1);

	if (set_flags & SET_VLAN_INSERT) {
		/* insert only if no vlan in packet */
		/* insert only if no vlan in packet */
		MLX5_SET(modify_esw_vport_context_in, in,
		MLX5_SET(modify_esw_vport_context_in, in,
			 esw_vport_context.vport_cvlan_insert, 1);
			 esw_vport_context.vport_cvlan_insert, 1);

		MLX5_SET(modify_esw_vport_context_in, in,
		MLX5_SET(modify_esw_vport_context_in, in,
			 esw_vport_context.cvlan_pcp, qos);
			 esw_vport_context.cvlan_pcp, qos);
		MLX5_SET(modify_esw_vport_context_in, in,
		MLX5_SET(modify_esw_vport_context_in, in,
@@ -1778,25 +1782,21 @@ int mlx5_eswitch_get_vport_config(struct mlx5_eswitch *esw,
	return 0;
	return 0;
}
}


int mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
int __mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
				int vport, u16 vlan, u8 qos)
				  int vport, u16 vlan, u8 qos, u8 set_flags)
{
{
	struct mlx5_vport *evport;
	struct mlx5_vport *evport;
	int err = 0;
	int err = 0;
	int set = 0;


	if (!ESW_ALLOWED(esw))
	if (!ESW_ALLOWED(esw))
		return -EPERM;
		return -EPERM;
	if (!LEGAL_VPORT(esw, vport) || (vlan > 4095) || (qos > 7))
	if (!LEGAL_VPORT(esw, vport) || (vlan > 4095) || (qos > 7))
		return -EINVAL;
		return -EINVAL;


	if (vlan || qos)
		set = 1;

	mutex_lock(&esw->state_lock);
	mutex_lock(&esw->state_lock);
	evport = &esw->vports[vport];
	evport = &esw->vports[vport];


	err = modify_esw_vport_cvlan(esw->dev, vport, vlan, qos, set);
	err = modify_esw_vport_cvlan(esw->dev, vport, vlan, qos, set_flags);
	if (err)
	if (err)
		goto unlock;
		goto unlock;


@@ -1814,6 +1814,17 @@ int mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
	return err;
	return err;
}
}


int mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
				int vport, u16 vlan, u8 qos)
{
	u8 set_flags = 0;

	if (vlan || qos)
		set_flags = SET_VLAN_STRIP | SET_VLAN_INSERT;

	return __mlx5_eswitch_set_vport_vlan(esw, vport, vlan, qos, set_flags);
}

int mlx5_eswitch_set_vport_spoofchk(struct mlx5_eswitch *esw,
int mlx5_eswitch_set_vport_spoofchk(struct mlx5_eswitch *esw,
				    int vport, bool spoofchk)
				    int vport, bool spoofchk)
{
{
+5 −0
Original line number Original line Diff line number Diff line
@@ -246,6 +246,11 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
struct mlx5_flow_rule *
struct mlx5_flow_rule *
mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, int vport, u32 tirn);
mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, int vport, u32 tirn);


enum {
	SET_VLAN_STRIP	= BIT(0),
	SET_VLAN_INSERT	= BIT(1)
};

int mlx5_eswitch_sqs2vport_start(struct mlx5_eswitch *esw,
int mlx5_eswitch_sqs2vport_start(struct mlx5_eswitch *esw,
				 struct mlx5_eswitch_rep *rep,
				 struct mlx5_eswitch_rep *rep,
				 u16 *sqns_array, int sqns_num);
				 u16 *sqns_array, int sqns_num);