net: lan966x: add tc matchall goto action
authorHoratiu Vultur <horatiu.vultur@microchip.com>
Fri, 25 Nov 2022 09:50:08 +0000 (10:50 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 29 Nov 2022 12:08:23 +0000 (13:08 +0100)
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: Horatiu Vultur <horatiu.vultur@microchip.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/microchip/lan966x/Makefile
drivers/net/ethernet/microchip/lan966x/lan966x_goto.c [new file with mode: 0644]
drivers/net/ethernet/microchip/lan966x/lan966x_main.h
drivers/net/ethernet/microchip/lan966x/lan966x_tc_matchall.c

index 2378114..56afd69 100644 (file)
@@ -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
diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_goto.c b/drivers/net/ethernet/microchip/lan966x/lan966x_goto.c
new file mode 100644 (file)
index 0000000..bf0cfe2
--- /dev/null
@@ -0,0 +1,54 @@
+// 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;
+}
index 118745e..f2e45da 100644 (file)
@@ -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,
index 7368433..a539aba 100644 (file)
@@ -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");