Skip to content

Commit cb55ff7

Browse files
author
Paolo Abeni
committed
Merge branch 'add-support-for-lan966x-is2-vcap'
Horatiu Vultur says: ==================== Add support for lan966x IS2 VCAP This provides initial support for lan966x for 'tc' traffic control userspace tool and its flower filter. For this is required to use the VCAP library. Currently supported flower filter keys and actions are: - source and destination MAC address keys - trap action ==================== Link: https://lore.kernel.org/r/20221125095010.124458-1-horatiu.vultur@microchip.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
2 parents 7a168f5 + 4f141e3 commit cb55ff7

File tree

16 files changed

+3321
-727
lines changed

16 files changed

+3321
-727
lines changed

drivers/net/ethernet/microchip/lan966x/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ config LAN966X_SWITCH
88
select PHYLINK
99
select PACKING
1010
select PAGE_POOL
11+
select VCAP
1112
help
1213
This driver supports the Lan966x network switch device.

drivers/net/ethernet/microchip/lan966x/Makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,8 @@ lan966x-switch-objs := lan966x_main.o lan966x_phylink.o lan966x_port.o \
1212
lan966x_tc.o lan966x_mqprio.o lan966x_taprio.o \
1313
lan966x_tbf.o lan966x_cbs.o lan966x_ets.o \
1414
lan966x_tc_matchall.o lan966x_police.o lan966x_mirror.o \
15-
lan966x_xdp.o
15+
lan966x_xdp.o lan966x_vcap_impl.o lan966x_vcap_ag_api.o \
16+
lan966x_tc_flower.o lan966x_goto.o
17+
18+
# Provide include files
19+
ccflags-y += -I$(srctree)/drivers/net/ethernet/microchip/vcap
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// SPDX-License-Identifier: GPL-2.0+
2+
3+
#include "lan966x_main.h"
4+
#include "vcap_api_client.h"
5+
6+
int lan966x_goto_port_add(struct lan966x_port *port,
7+
struct flow_action_entry *act,
8+
unsigned long goto_id,
9+
struct netlink_ext_ack *extack)
10+
{
11+
struct lan966x *lan966x = port->lan966x;
12+
int err;
13+
14+
err = vcap_enable_lookups(lan966x->vcap_ctrl, port->dev,
15+
act->chain_index, goto_id,
16+
true);
17+
if (err == -EFAULT) {
18+
NL_SET_ERR_MSG_MOD(extack, "Unsupported goto chain");
19+
return -EOPNOTSUPP;
20+
}
21+
22+
if (err == -EADDRINUSE) {
23+
NL_SET_ERR_MSG_MOD(extack, "VCAP already enabled");
24+
return -EOPNOTSUPP;
25+
}
26+
27+
if (err) {
28+
NL_SET_ERR_MSG_MOD(extack, "Could not enable VCAP lookups");
29+
return err;
30+
}
31+
32+
port->tc.goto_id = goto_id;
33+
34+
return 0;
35+
}
36+
37+
int lan966x_goto_port_del(struct lan966x_port *port,
38+
unsigned long goto_id,
39+
struct netlink_ext_ack *extack)
40+
{
41+
struct lan966x *lan966x = port->lan966x;
42+
int err;
43+
44+
err = vcap_enable_lookups(lan966x->vcap_ctrl, port->dev, 0,
45+
goto_id, false);
46+
if (err) {
47+
NL_SET_ERR_MSG_MOD(extack, "Could not disable VCAP lookups");
48+
return err;
49+
}
50+
51+
port->tc.goto_id = 0;
52+
53+
return 0;
54+
}

drivers/net/ethernet/microchip/lan966x/lan966x_main.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ static const struct lan966x_main_io_resource lan966x_main_iomap[] = {
4747
{ TARGET_PTP, 0xc000, 1 }, /* 0xe200c000 */
4848
{ TARGET_CHIP_TOP, 0x10000, 1 }, /* 0xe2010000 */
4949
{ TARGET_REW, 0x14000, 1 }, /* 0xe2014000 */
50+
{ TARGET_VCAP, 0x18000, 1 }, /* 0xe2018000 */
51+
{ TARGET_VCAP + 1, 0x20000, 1 }, /* 0xe2020000 */
52+
{ TARGET_VCAP + 2, 0x24000, 1 }, /* 0xe2024000 */
5053
{ TARGET_SYS, 0x28000, 1 }, /* 0xe2028000 */
5154
{ TARGET_DEV, 0x34000, 1 }, /* 0xe2034000 */
5255
{ TARGET_DEV + 1, 0x38000, 1 }, /* 0xe2038000 */
@@ -1157,8 +1160,15 @@ static int lan966x_probe(struct platform_device *pdev)
11571160
if (err)
11581161
goto cleanup_ptp;
11591162

1163+
err = lan966x_vcap_init(lan966x);
1164+
if (err)
1165+
goto cleanup_fdma;
1166+
11601167
return 0;
11611168

1169+
cleanup_fdma:
1170+
lan966x_fdma_deinit(lan966x);
1171+
11621172
cleanup_ptp:
11631173
lan966x_ptp_deinit(lan966x);
11641174

@@ -1182,6 +1192,7 @@ static int lan966x_remove(struct platform_device *pdev)
11821192
struct lan966x *lan966x = platform_get_drvdata(pdev);
11831193

11841194
lan966x_taprio_deinit(lan966x);
1195+
lan966x_vcap_deinit(lan966x);
11851196
lan966x_fdma_deinit(lan966x);
11861197
lan966x_cleanup_ports(lan966x);
11871198

drivers/net/ethernet/microchip/lan966x/lan966x_main.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,9 @@ struct lan966x {
300300
struct lan966x_port *mirror_monitor;
301301
u32 mirror_mask[2];
302302
u32 mirror_count;
303+
304+
/* vcap */
305+
struct vcap_control *vcap_ctrl;
303306
};
304307

305308
struct lan966x_port_config {
@@ -317,6 +320,7 @@ struct lan966x_port_tc {
317320
unsigned long police_id;
318321
unsigned long ingress_mirror_id;
319322
unsigned long egress_mirror_id;
323+
unsigned long goto_id;
320324
struct flow_stats police_stat;
321325
struct flow_stats mirror_stat;
322326
};
@@ -582,6 +586,20 @@ static inline bool lan966x_xdp_port_present(struct lan966x_port *port)
582586
return !!port->xdp_prog;
583587
}
584588

589+
int lan966x_vcap_init(struct lan966x *lan966x);
590+
void lan966x_vcap_deinit(struct lan966x *lan966x);
591+
592+
int lan966x_tc_flower(struct lan966x_port *port,
593+
struct flow_cls_offload *f);
594+
595+
int lan966x_goto_port_add(struct lan966x_port *port,
596+
struct flow_action_entry *act,
597+
unsigned long goto_id,
598+
struct netlink_ext_ack *extack);
599+
int lan966x_goto_port_del(struct lan966x_port *port,
600+
unsigned long goto_id,
601+
struct netlink_ext_ack *extack);
602+
585603
static inline void __iomem *lan_addr(void __iomem *base[],
586604
int id, int tinst, int tcnt,
587605
int gbase, int ginst,

drivers/net/ethernet/microchip/lan966x/lan966x_regs.h

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ enum lan966x_target {
2525
TARGET_QSYS = 46,
2626
TARGET_REW = 47,
2727
TARGET_SYS = 52,
28+
TARGET_VCAP = 61,
2829
NUM_TARGETS = 66
2930
};
3031

@@ -315,6 +316,69 @@ enum lan966x_target {
315316
#define ANA_DROP_CFG_DROP_MC_SMAC_ENA_GET(x)\
316317
FIELD_GET(ANA_DROP_CFG_DROP_MC_SMAC_ENA, x)
317318

319+
/* ANA:PORT:VCAP_S2_CFG */
320+
#define ANA_VCAP_S2_CFG(g) __REG(TARGET_ANA, 0, 1, 28672, g, 9, 128, 28, 0, 1, 4)
321+
322+
#define ANA_VCAP_S2_CFG_ISDX_ENA GENMASK(20, 19)
323+
#define ANA_VCAP_S2_CFG_ISDX_ENA_SET(x)\
324+
FIELD_PREP(ANA_VCAP_S2_CFG_ISDX_ENA, x)
325+
#define ANA_VCAP_S2_CFG_ISDX_ENA_GET(x)\
326+
FIELD_GET(ANA_VCAP_S2_CFG_ISDX_ENA, x)
327+
328+
#define ANA_VCAP_S2_CFG_UDP_PAYLOAD_ENA GENMASK(18, 17)
329+
#define ANA_VCAP_S2_CFG_UDP_PAYLOAD_ENA_SET(x)\
330+
FIELD_PREP(ANA_VCAP_S2_CFG_UDP_PAYLOAD_ENA, x)
331+
#define ANA_VCAP_S2_CFG_UDP_PAYLOAD_ENA_GET(x)\
332+
FIELD_GET(ANA_VCAP_S2_CFG_UDP_PAYLOAD_ENA, x)
333+
334+
#define ANA_VCAP_S2_CFG_ETYPE_PAYLOAD_ENA GENMASK(16, 15)
335+
#define ANA_VCAP_S2_CFG_ETYPE_PAYLOAD_ENA_SET(x)\
336+
FIELD_PREP(ANA_VCAP_S2_CFG_ETYPE_PAYLOAD_ENA, x)
337+
#define ANA_VCAP_S2_CFG_ETYPE_PAYLOAD_ENA_GET(x)\
338+
FIELD_GET(ANA_VCAP_S2_CFG_ETYPE_PAYLOAD_ENA, x)
339+
340+
#define ANA_VCAP_S2_CFG_ENA BIT(14)
341+
#define ANA_VCAP_S2_CFG_ENA_SET(x)\
342+
FIELD_PREP(ANA_VCAP_S2_CFG_ENA, x)
343+
#define ANA_VCAP_S2_CFG_ENA_GET(x)\
344+
FIELD_GET(ANA_VCAP_S2_CFG_ENA, x)
345+
346+
#define ANA_VCAP_S2_CFG_SNAP_DIS GENMASK(13, 12)
347+
#define ANA_VCAP_S2_CFG_SNAP_DIS_SET(x)\
348+
FIELD_PREP(ANA_VCAP_S2_CFG_SNAP_DIS, x)
349+
#define ANA_VCAP_S2_CFG_SNAP_DIS_GET(x)\
350+
FIELD_GET(ANA_VCAP_S2_CFG_SNAP_DIS, x)
351+
352+
#define ANA_VCAP_S2_CFG_ARP_DIS GENMASK(11, 10)
353+
#define ANA_VCAP_S2_CFG_ARP_DIS_SET(x)\
354+
FIELD_PREP(ANA_VCAP_S2_CFG_ARP_DIS, x)
355+
#define ANA_VCAP_S2_CFG_ARP_DIS_GET(x)\
356+
FIELD_GET(ANA_VCAP_S2_CFG_ARP_DIS, x)
357+
358+
#define ANA_VCAP_S2_CFG_IP_TCPUDP_DIS GENMASK(9, 8)
359+
#define ANA_VCAP_S2_CFG_IP_TCPUDP_DIS_SET(x)\
360+
FIELD_PREP(ANA_VCAP_S2_CFG_IP_TCPUDP_DIS, x)
361+
#define ANA_VCAP_S2_CFG_IP_TCPUDP_DIS_GET(x)\
362+
FIELD_GET(ANA_VCAP_S2_CFG_IP_TCPUDP_DIS, x)
363+
364+
#define ANA_VCAP_S2_CFG_IP_OTHER_DIS GENMASK(7, 6)
365+
#define ANA_VCAP_S2_CFG_IP_OTHER_DIS_SET(x)\
366+
FIELD_PREP(ANA_VCAP_S2_CFG_IP_OTHER_DIS, x)
367+
#define ANA_VCAP_S2_CFG_IP_OTHER_DIS_GET(x)\
368+
FIELD_GET(ANA_VCAP_S2_CFG_IP_OTHER_DIS, x)
369+
370+
#define ANA_VCAP_S2_CFG_IP6_CFG GENMASK(5, 2)
371+
#define ANA_VCAP_S2_CFG_IP6_CFG_SET(x)\
372+
FIELD_PREP(ANA_VCAP_S2_CFG_IP6_CFG, x)
373+
#define ANA_VCAP_S2_CFG_IP6_CFG_GET(x)\
374+
FIELD_GET(ANA_VCAP_S2_CFG_IP6_CFG, x)
375+
376+
#define ANA_VCAP_S2_CFG_OAM_DIS GENMASK(1, 0)
377+
#define ANA_VCAP_S2_CFG_OAM_DIS_SET(x)\
378+
FIELD_PREP(ANA_VCAP_S2_CFG_OAM_DIS, x)
379+
#define ANA_VCAP_S2_CFG_OAM_DIS_GET(x)\
380+
FIELD_GET(ANA_VCAP_S2_CFG_OAM_DIS, x)
381+
318382
/* ANA:PORT:CPU_FWD_CFG */
319383
#define ANA_CPU_FWD_CFG(g) __REG(TARGET_ANA, 0, 1, 28672, g, 9, 128, 96, 0, 1, 4)
320384

@@ -1506,4 +1570,136 @@ enum lan966x_target {
15061570
#define SYS_RAM_INIT_RAM_INIT_GET(x)\
15071571
FIELD_GET(SYS_RAM_INIT_RAM_INIT, x)
15081572

1573+
/* VCAP:VCAP_CORE_CFG:VCAP_UPDATE_CTRL */
1574+
#define VCAP_UPDATE_CTRL(t) __REG(TARGET_VCAP, t, 3, 0, 0, 1, 8, 0, 0, 1, 4)
1575+
1576+
#define VCAP_UPDATE_CTRL_UPDATE_CMD GENMASK(24, 22)
1577+
#define VCAP_UPDATE_CTRL_UPDATE_CMD_SET(x)\
1578+
FIELD_PREP(VCAP_UPDATE_CTRL_UPDATE_CMD, x)
1579+
#define VCAP_UPDATE_CTRL_UPDATE_CMD_GET(x)\
1580+
FIELD_GET(VCAP_UPDATE_CTRL_UPDATE_CMD, x)
1581+
1582+
#define VCAP_UPDATE_CTRL_UPDATE_ENTRY_DIS BIT(21)
1583+
#define VCAP_UPDATE_CTRL_UPDATE_ENTRY_DIS_SET(x)\
1584+
FIELD_PREP(VCAP_UPDATE_CTRL_UPDATE_ENTRY_DIS, x)
1585+
#define VCAP_UPDATE_CTRL_UPDATE_ENTRY_DIS_GET(x)\
1586+
FIELD_GET(VCAP_UPDATE_CTRL_UPDATE_ENTRY_DIS, x)
1587+
1588+
#define VCAP_UPDATE_CTRL_UPDATE_ACTION_DIS BIT(20)
1589+
#define VCAP_UPDATE_CTRL_UPDATE_ACTION_DIS_SET(x)\
1590+
FIELD_PREP(VCAP_UPDATE_CTRL_UPDATE_ACTION_DIS, x)
1591+
#define VCAP_UPDATE_CTRL_UPDATE_ACTION_DIS_GET(x)\
1592+
FIELD_GET(VCAP_UPDATE_CTRL_UPDATE_ACTION_DIS, x)
1593+
1594+
#define VCAP_UPDATE_CTRL_UPDATE_CNT_DIS BIT(19)
1595+
#define VCAP_UPDATE_CTRL_UPDATE_CNT_DIS_SET(x)\
1596+
FIELD_PREP(VCAP_UPDATE_CTRL_UPDATE_CNT_DIS, x)
1597+
#define VCAP_UPDATE_CTRL_UPDATE_CNT_DIS_GET(x)\
1598+
FIELD_GET(VCAP_UPDATE_CTRL_UPDATE_CNT_DIS, x)
1599+
1600+
#define VCAP_UPDATE_CTRL_UPDATE_ADDR GENMASK(18, 3)
1601+
#define VCAP_UPDATE_CTRL_UPDATE_ADDR_SET(x)\
1602+
FIELD_PREP(VCAP_UPDATE_CTRL_UPDATE_ADDR, x)
1603+
#define VCAP_UPDATE_CTRL_UPDATE_ADDR_GET(x)\
1604+
FIELD_GET(VCAP_UPDATE_CTRL_UPDATE_ADDR, x)
1605+
1606+
#define VCAP_UPDATE_CTRL_UPDATE_SHOT BIT(2)
1607+
#define VCAP_UPDATE_CTRL_UPDATE_SHOT_SET(x)\
1608+
FIELD_PREP(VCAP_UPDATE_CTRL_UPDATE_SHOT, x)
1609+
#define VCAP_UPDATE_CTRL_UPDATE_SHOT_GET(x)\
1610+
FIELD_GET(VCAP_UPDATE_CTRL_UPDATE_SHOT, x)
1611+
1612+
#define VCAP_UPDATE_CTRL_CLEAR_CACHE BIT(1)
1613+
#define VCAP_UPDATE_CTRL_CLEAR_CACHE_SET(x)\
1614+
FIELD_PREP(VCAP_UPDATE_CTRL_CLEAR_CACHE, x)
1615+
#define VCAP_UPDATE_CTRL_CLEAR_CACHE_GET(x)\
1616+
FIELD_GET(VCAP_UPDATE_CTRL_CLEAR_CACHE, x)
1617+
1618+
#define VCAP_UPDATE_CTRL_MV_TRAFFIC_IGN BIT(0)
1619+
#define VCAP_UPDATE_CTRL_MV_TRAFFIC_IGN_SET(x)\
1620+
FIELD_PREP(VCAP_UPDATE_CTRL_MV_TRAFFIC_IGN, x)
1621+
#define VCAP_UPDATE_CTRL_MV_TRAFFIC_IGN_GET(x)\
1622+
FIELD_GET(VCAP_UPDATE_CTRL_MV_TRAFFIC_IGN, x)
1623+
1624+
/* VCAP:VCAP_CORE_CFG:VCAP_MV_CFG */
1625+
#define VCAP_MV_CFG(t) __REG(TARGET_VCAP, t, 3, 0, 0, 1, 8, 4, 0, 1, 4)
1626+
1627+
#define VCAP_MV_CFG_MV_NUM_POS GENMASK(31, 16)
1628+
#define VCAP_MV_CFG_MV_NUM_POS_SET(x)\
1629+
FIELD_PREP(VCAP_MV_CFG_MV_NUM_POS, x)
1630+
#define VCAP_MV_CFG_MV_NUM_POS_GET(x)\
1631+
FIELD_GET(VCAP_MV_CFG_MV_NUM_POS, x)
1632+
1633+
#define VCAP_MV_CFG_MV_SIZE GENMASK(15, 0)
1634+
#define VCAP_MV_CFG_MV_SIZE_SET(x)\
1635+
FIELD_PREP(VCAP_MV_CFG_MV_SIZE, x)
1636+
#define VCAP_MV_CFG_MV_SIZE_GET(x)\
1637+
FIELD_GET(VCAP_MV_CFG_MV_SIZE, x)
1638+
1639+
/* VCAP:VCAP_CORE_CACHE:VCAP_ENTRY_DAT */
1640+
#define VCAP_ENTRY_DAT(t, r) __REG(TARGET_VCAP, t, 3, 8, 0, 1, 904, 0, r, 64, 4)
1641+
1642+
/* VCAP:VCAP_CORE_CACHE:VCAP_MASK_DAT */
1643+
#define VCAP_MASK_DAT(t, r) __REG(TARGET_VCAP, t, 3, 8, 0, 1, 904, 256, r, 64, 4)
1644+
1645+
/* VCAP:VCAP_CORE_CACHE:VCAP_ACTION_DAT */
1646+
#define VCAP_ACTION_DAT(t, r) __REG(TARGET_VCAP, t, 3, 8, 0, 1, 904, 512, r, 64, 4)
1647+
1648+
/* VCAP:VCAP_CORE_CACHE:VCAP_CNT_DAT */
1649+
#define VCAP_CNT_DAT(t, r) __REG(TARGET_VCAP, t, 3, 8, 0, 1, 904, 768, r, 32, 4)
1650+
1651+
/* VCAP:VCAP_CORE_CACHE:VCAP_CNT_FW_DAT */
1652+
#define VCAP_CNT_FW_DAT(t) __REG(TARGET_VCAP, t, 3, 8, 0, 1, 904, 896, 0, 1, 4)
1653+
1654+
/* VCAP:VCAP_CORE_CACHE:VCAP_TG_DAT */
1655+
#define VCAP_TG_DAT(t) __REG(TARGET_VCAP, t, 3, 8, 0, 1, 904, 900, 0, 1, 4)
1656+
1657+
/* VCAP:VCAP_CORE_MAP:VCAP_CORE_IDX */
1658+
#define VCAP_CORE_IDX(t) __REG(TARGET_VCAP, t, 3, 912, 0, 1, 8, 0, 0, 1, 4)
1659+
1660+
#define VCAP_CORE_IDX_CORE_IDX GENMASK(3, 0)
1661+
#define VCAP_CORE_IDX_CORE_IDX_SET(x)\
1662+
FIELD_PREP(VCAP_CORE_IDX_CORE_IDX, x)
1663+
#define VCAP_CORE_IDX_CORE_IDX_GET(x)\
1664+
FIELD_GET(VCAP_CORE_IDX_CORE_IDX, x)
1665+
1666+
/* VCAP:VCAP_CORE_MAP:VCAP_CORE_MAP */
1667+
#define VCAP_CORE_MAP(t) __REG(TARGET_VCAP, t, 3, 912, 0, 1, 8, 4, 0, 1, 4)
1668+
1669+
#define VCAP_CORE_MAP_CORE_MAP GENMASK(2, 0)
1670+
#define VCAP_CORE_MAP_CORE_MAP_SET(x)\
1671+
FIELD_PREP(VCAP_CORE_MAP_CORE_MAP, x)
1672+
#define VCAP_CORE_MAP_CORE_MAP_GET(x)\
1673+
FIELD_GET(VCAP_CORE_MAP_CORE_MAP, x)
1674+
1675+
/* VCAP:VCAP_CONST:VCAP_VER */
1676+
#define VCAP_VER(t) __REG(TARGET_VCAP, t, 3, 924, 0, 1, 40, 0, 0, 1, 4)
1677+
1678+
/* VCAP:VCAP_CONST:ENTRY_WIDTH */
1679+
#define VCAP_ENTRY_WIDTH(t) __REG(TARGET_VCAP, t, 3, 924, 0, 1, 40, 4, 0, 1, 4)
1680+
1681+
/* VCAP:VCAP_CONST:ENTRY_CNT */
1682+
#define VCAP_ENTRY_CNT(t) __REG(TARGET_VCAP, t, 3, 924, 0, 1, 40, 8, 0, 1, 4)
1683+
1684+
/* VCAP:VCAP_CONST:ENTRY_SWCNT */
1685+
#define VCAP_ENTRY_SWCNT(t) __REG(TARGET_VCAP, t, 3, 924, 0, 1, 40, 12, 0, 1, 4)
1686+
1687+
/* VCAP:VCAP_CONST:ENTRY_TG_WIDTH */
1688+
#define VCAP_ENTRY_TG_WIDTH(t) __REG(TARGET_VCAP, t, 3, 924, 0, 1, 40, 16, 0, 1, 4)
1689+
1690+
/* VCAP:VCAP_CONST:ACTION_DEF_CNT */
1691+
#define VCAP_ACTION_DEF_CNT(t) __REG(TARGET_VCAP, t, 3, 924, 0, 1, 40, 20, 0, 1, 4)
1692+
1693+
/* VCAP:VCAP_CONST:ACTION_WIDTH */
1694+
#define VCAP_ACTION_WIDTH(t) __REG(TARGET_VCAP, t, 3, 924, 0, 1, 40, 24, 0, 1, 4)
1695+
1696+
/* VCAP:VCAP_CONST:CNT_WIDTH */
1697+
#define VCAP_CNT_WIDTH(t) __REG(TARGET_VCAP, t, 3, 924, 0, 1, 40, 28, 0, 1, 4)
1698+
1699+
/* VCAP:VCAP_CONST:CORE_CNT */
1700+
#define VCAP_CORE_CNT(t) __REG(TARGET_VCAP, t, 3, 924, 0, 1, 40, 32, 0, 1, 4)
1701+
1702+
/* VCAP:VCAP_CONST:IF_CNT */
1703+
#define VCAP_IF_CNT(t) __REG(TARGET_VCAP, t, 3, 924, 0, 1, 40, 36, 0, 1, 4)
1704+
15091705
#endif /* _LAN966X_REGS_H_ */

drivers/net/ethernet/microchip/lan966x/lan966x_tc.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ static int lan966x_tc_block_cb(enum tc_setup_type type, void *type_data,
6969
switch (type) {
7070
case TC_SETUP_CLSMATCHALL:
7171
return lan966x_tc_matchall(port, type_data, ingress);
72+
case TC_SETUP_CLSFLOWER:
73+
return lan966x_tc_flower(port, type_data);
7274
default:
7375
return -EOPNOTSUPP;
7476
}

0 commit comments

Comments
 (0)