Commit 61caac2d authored by Horatiu Vultur's avatar Horatiu Vultur Committed by Paolo Abeni
Browse files

net: lan966x: add tc matchall goto action



Extend matchall with action goto. This is needed to enable the lookup in
the VCAP. It is needed to connect chain 0 to a chain that is recognized
by the HW.

Signed-off-by: default avatarHoratiu Vultur <horatiu.vultur@microchip.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 3643abd6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ lan966x-switch-objs := lan966x_main.o lan966x_phylink.o lan966x_port.o \
			lan966x_tbf.o lan966x_cbs.o lan966x_ets.o \
			lan966x_tc_matchall.o lan966x_police.o lan966x_mirror.o \
			lan966x_xdp.o lan966x_vcap_impl.o lan966x_vcap_ag_api.o \
			lan966x_tc_flower.o
			lan966x_tc_flower.o lan966x_goto.o

# Provide include files
ccflags-y += -I$(srctree)/drivers/net/ethernet/microchip/vcap
+54 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0+

#include "lan966x_main.h"
#include "vcap_api_client.h"

int lan966x_goto_port_add(struct lan966x_port *port,
			  struct flow_action_entry *act,
			  unsigned long goto_id,
			  struct netlink_ext_ack *extack)
{
	struct lan966x *lan966x = port->lan966x;
	int err;

	err = vcap_enable_lookups(lan966x->vcap_ctrl, port->dev,
				  act->chain_index, goto_id,
				  true);
	if (err == -EFAULT) {
		NL_SET_ERR_MSG_MOD(extack, "Unsupported goto chain");
		return -EOPNOTSUPP;
	}

	if (err == -EADDRINUSE) {
		NL_SET_ERR_MSG_MOD(extack, "VCAP already enabled");
		return -EOPNOTSUPP;
	}

	if (err) {
		NL_SET_ERR_MSG_MOD(extack, "Could not enable VCAP lookups");
		return err;
	}

	port->tc.goto_id = goto_id;

	return 0;
}

int lan966x_goto_port_del(struct lan966x_port *port,
			  unsigned long goto_id,
			  struct netlink_ext_ack *extack)
{
	struct lan966x *lan966x = port->lan966x;
	int err;

	err = vcap_enable_lookups(lan966x->vcap_ctrl, port->dev, 0,
				  goto_id, false);
	if (err) {
		NL_SET_ERR_MSG_MOD(extack, "Could not disable VCAP lookups");
		return err;
	}

	port->tc.goto_id = 0;

	return 0;
}
+9 −0
Original line number Diff line number Diff line
@@ -320,6 +320,7 @@ struct lan966x_port_tc {
	unsigned long police_id;
	unsigned long ingress_mirror_id;
	unsigned long egress_mirror_id;
	unsigned long goto_id;
	struct flow_stats police_stat;
	struct flow_stats mirror_stat;
};
@@ -591,6 +592,14 @@ void lan966x_vcap_deinit(struct lan966x *lan966x);
int lan966x_tc_flower(struct lan966x_port *port,
		      struct flow_cls_offload *f);

int lan966x_goto_port_add(struct lan966x_port *port,
			  struct flow_action_entry *act,
			  unsigned long goto_id,
			  struct netlink_ext_ack *extack);
int lan966x_goto_port_del(struct lan966x_port *port,
			  unsigned long goto_id,
			  struct netlink_ext_ack *extack);

static inline void __iomem *lan_addr(void __iomem *base[],
				     int id, int tinst, int tcnt,
				     int gbase, int ginst,
+6 −0
Original line number Diff line number Diff line
@@ -23,6 +23,9 @@ static int lan966x_tc_matchall_add(struct lan966x_port *port,
	case FLOW_ACTION_MIRRED:
		return lan966x_mirror_port_add(port, act, f->cookie,
					       ingress, f->common.extack);
	case FLOW_ACTION_GOTO:
		return lan966x_goto_port_add(port, act, f->cookie,
					     f->common.extack);
	default:
		NL_SET_ERR_MSG_MOD(f->common.extack,
				   "Unsupported action");
@@ -43,6 +46,9 @@ static int lan966x_tc_matchall_del(struct lan966x_port *port,
		   f->cookie == port->tc.egress_mirror_id) {
		return lan966x_mirror_port_del(port, ingress,
					       f->common.extack);
	} else if (f->cookie == port->tc.goto_id) {
		return lan966x_goto_port_del(port, f->cookie,
					     f->common.extack);
	} else {
		NL_SET_ERR_MSG_MOD(f->common.extack,
				   "Unsupported action");