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

Commit eb49cfaa authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller
Browse files

mlxsw: spectrum: Convert ndo_setup_tc offloads to block callbacks



Benefit from the newly introduced block callback infrastructure and
convert ndo_setup_tc calls for matchall and flower offloads to block
callbacks.

Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3f7889c4
Loading
Loading
Loading
Loading
+60 −22
Original line number Diff line number Diff line
@@ -1697,17 +1697,9 @@ static void mlxsw_sp_port_del_cls_matchall(struct mlxsw_sp_port *mlxsw_sp_port,
}

static int mlxsw_sp_setup_tc_cls_matchall(struct mlxsw_sp_port *mlxsw_sp_port,
					  struct tc_cls_matchall_offload *f)
					  struct tc_cls_matchall_offload *f,
					  bool ingress)
{
	bool ingress;

	if (is_classid_clsact_ingress(f->common.classid))
		ingress = true;
	else if (is_classid_clsact_egress(f->common.classid))
		ingress = false;
	else
		return -EOPNOTSUPP;

	if (f->common.chain_index)
		return -EOPNOTSUPP;

@@ -1725,17 +1717,9 @@ static int mlxsw_sp_setup_tc_cls_matchall(struct mlxsw_sp_port *mlxsw_sp_port,

static int
mlxsw_sp_setup_tc_cls_flower(struct mlxsw_sp_port *mlxsw_sp_port,
			     struct tc_cls_flower_offload *f)
			     struct tc_cls_flower_offload *f,
			     bool ingress)
{
	bool ingress;

	if (is_classid_clsact_ingress(f->common.classid))
		ingress = true;
	else if (is_classid_clsact_egress(f->common.classid))
		ingress = false;
	else
		return -EOPNOTSUPP;

	switch (f->command) {
	case TC_CLSFLOWER_REPLACE:
		return mlxsw_sp_flower_replace(mlxsw_sp_port, ingress, f);
@@ -1749,6 +1733,59 @@ mlxsw_sp_setup_tc_cls_flower(struct mlxsw_sp_port *mlxsw_sp_port,
	}
}

static int mlxsw_sp_setup_tc_block_cb(enum tc_setup_type type, void *type_data,
				      void *cb_priv, bool ingress)
{
	struct mlxsw_sp_port *mlxsw_sp_port = cb_priv;

	switch (type) {
	case TC_SETUP_CLSMATCHALL:
		return mlxsw_sp_setup_tc_cls_matchall(mlxsw_sp_port, type_data,
						      ingress);
	case TC_SETUP_CLSFLOWER:
		return mlxsw_sp_setup_tc_cls_flower(mlxsw_sp_port, type_data,
						    ingress);
	default:
		return -EOPNOTSUPP;
	}
}

static int mlxsw_sp_setup_tc_block_cb_ig(enum tc_setup_type type,
					 void *type_data, void *cb_priv)
{
	return mlxsw_sp_setup_tc_block_cb(type, type_data, cb_priv, true);
}

static int mlxsw_sp_setup_tc_block_cb_eg(enum tc_setup_type type,
					 void *type_data, void *cb_priv)
{
	return mlxsw_sp_setup_tc_block_cb(type, type_data, cb_priv, false);
}

static int mlxsw_sp_setup_tc_block(struct mlxsw_sp_port *mlxsw_sp_port,
				   struct tc_block_offload *f)
{
	tc_setup_cb_t *cb;

	if (f->binder_type == TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS)
		cb = mlxsw_sp_setup_tc_block_cb_ig;
	else if (f->binder_type == TCF_BLOCK_BINDER_TYPE_CLSACT_EGRESS)
		cb = mlxsw_sp_setup_tc_block_cb_eg;
	else
		return -EOPNOTSUPP;

	switch (f->command) {
	case TC_BLOCK_BIND:
		return tcf_block_cb_register(f->block, cb, mlxsw_sp_port,
					     mlxsw_sp_port);
	case TC_BLOCK_UNBIND:
		tcf_block_cb_unregister(f->block, cb, mlxsw_sp_port);
		return 0;
	default:
		return -EOPNOTSUPP;
	}
}

static int mlxsw_sp_setup_tc(struct net_device *dev, enum tc_setup_type type,
			     void *type_data)
{
@@ -1756,9 +1793,10 @@ static int mlxsw_sp_setup_tc(struct net_device *dev, enum tc_setup_type type,

	switch (type) {
	case TC_SETUP_CLSMATCHALL:
		return mlxsw_sp_setup_tc_cls_matchall(mlxsw_sp_port, type_data);
	case TC_SETUP_CLSFLOWER:
		return mlxsw_sp_setup_tc_cls_flower(mlxsw_sp_port, type_data);
		return 0; /* will be removed after conversion from ndo */
	case TC_SETUP_BLOCK:
		return mlxsw_sp_setup_tc_block(mlxsw_sp_port, type_data);
	default:
		return -EOPNOTSUPP;
	}