162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/* Texas Instruments ICSSG Ethernet Driver
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) 2018-2022 Texas Instruments Incorporated - https://www.ti.com/
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/etherdevice.h>
962306a36Sopenharmony_ci#include <linux/types.h>
1062306a36Sopenharmony_ci#include <linux/regmap.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include "icssg_prueth.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define ICSSG_NUM_CLASSIFIERS	16
1562306a36Sopenharmony_ci#define ICSSG_NUM_FT1_SLOTS	8
1662306a36Sopenharmony_ci#define ICSSG_NUM_FT3_SLOTS	16
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define ICSSG_NUM_CLASSIFIERS_IN_USE	5
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci/* Filter 1 - FT1 */
2162306a36Sopenharmony_ci#define FT1_NUM_SLOTS	8
2262306a36Sopenharmony_ci#define FT1_SLOT_SIZE	0x10	/* bytes */
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/* offsets from FT1 slot base i.e. slot 1 start */
2562306a36Sopenharmony_ci#define FT1_DA0		0x0
2662306a36Sopenharmony_ci#define FT1_DA1		0x4
2762306a36Sopenharmony_ci#define FT1_DA0_MASK	0x8
2862306a36Sopenharmony_ci#define FT1_DA1_MASK	0xc
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#define FT1_N_REG(slize, n, reg)	\
3162306a36Sopenharmony_ci	(offs[slice].ft1_slot_base + FT1_SLOT_SIZE * (n) + (reg))
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci#define FT1_LEN_MASK		GENMASK(19, 16)
3462306a36Sopenharmony_ci#define FT1_LEN_SHIFT		16
3562306a36Sopenharmony_ci#define FT1_LEN(len)		(((len) << FT1_LEN_SHIFT) & FT1_LEN_MASK)
3662306a36Sopenharmony_ci#define FT1_START_MASK		GENMASK(14, 0)
3762306a36Sopenharmony_ci#define FT1_START(start)	((start) & FT1_START_MASK)
3862306a36Sopenharmony_ci#define FT1_MATCH_SLOT(n)	(GENMASK(23, 16) & (BIT(n) << 16))
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/* FT1 config type */
4162306a36Sopenharmony_cienum ft1_cfg_type {
4262306a36Sopenharmony_ci	FT1_CFG_TYPE_DISABLED = 0,
4362306a36Sopenharmony_ci	FT1_CFG_TYPE_EQ,
4462306a36Sopenharmony_ci	FT1_CFG_TYPE_GT,
4562306a36Sopenharmony_ci	FT1_CFG_TYPE_LT,
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#define FT1_CFG_SHIFT(n)	(2 * (n))
4962306a36Sopenharmony_ci#define FT1_CFG_MASK(n)		(0x3 << FT1_CFG_SHIFT((n)))
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/* Filter 3 -  FT3 */
5262306a36Sopenharmony_ci#define FT3_NUM_SLOTS	16
5362306a36Sopenharmony_ci#define FT3_SLOT_SIZE	0x20	/* bytes */
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci/* offsets from FT3 slot n's base */
5662306a36Sopenharmony_ci#define FT3_START		0
5762306a36Sopenharmony_ci#define FT3_START_AUTO		0x4
5862306a36Sopenharmony_ci#define FT3_START_OFFSET	0x8
5962306a36Sopenharmony_ci#define FT3_JUMP_OFFSET		0xc
6062306a36Sopenharmony_ci#define FT3_LEN			0x10
6162306a36Sopenharmony_ci#define FT3_CFG			0x14
6262306a36Sopenharmony_ci#define FT3_T			0x18
6362306a36Sopenharmony_ci#define FT3_T_MASK		0x1c
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci#define FT3_N_REG(slize, n, reg)	\
6662306a36Sopenharmony_ci	(offs[slice].ft3_slot_base + FT3_SLOT_SIZE * (n) + (reg))
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci/* offsets from rx_class n's base */
6962306a36Sopenharmony_ci#define RX_CLASS_AND_EN		0
7062306a36Sopenharmony_ci#define RX_CLASS_OR_EN		0x4
7162306a36Sopenharmony_ci#define RX_CLASS_NUM_SLOTS	16
7262306a36Sopenharmony_ci#define RX_CLASS_EN_SIZE	0x8	/* bytes */
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci#define RX_CLASS_N_REG(slice, n, reg)	\
7562306a36Sopenharmony_ci	(offs[slice].rx_class_base + RX_CLASS_EN_SIZE * (n) + (reg))
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci/* RX Class Gates */
7862306a36Sopenharmony_ci#define RX_CLASS_GATES_SIZE	0x4	/* bytes */
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci#define RX_CLASS_GATES_N_REG(slice, n)	\
8162306a36Sopenharmony_ci	(offs[slice].rx_class_gates_base + RX_CLASS_GATES_SIZE * (n))
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci#define RX_CLASS_GATES_ALLOW_MASK	BIT(6)
8462306a36Sopenharmony_ci#define RX_CLASS_GATES_RAW_MASK		BIT(5)
8562306a36Sopenharmony_ci#define RX_CLASS_GATES_PHASE_MASK	BIT(4)
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci/* RX Class traffic data matching bits */
8862306a36Sopenharmony_ci#define RX_CLASS_FT_UC				BIT(31)
8962306a36Sopenharmony_ci#define RX_CLASS_FT_MC			BIT(30)
9062306a36Sopenharmony_ci#define RX_CLASS_FT_BC			BIT(29)
9162306a36Sopenharmony_ci#define RX_CLASS_FT_FW			BIT(28)
9262306a36Sopenharmony_ci#define RX_CLASS_FT_RCV			BIT(27)
9362306a36Sopenharmony_ci#define RX_CLASS_FT_VLAN		BIT(26)
9462306a36Sopenharmony_ci#define RX_CLASS_FT_DA_P		BIT(25)
9562306a36Sopenharmony_ci#define RX_CLASS_FT_DA_I		BIT(24)
9662306a36Sopenharmony_ci#define RX_CLASS_FT_FT1_MATCH_MASK	GENMASK(23, 16)
9762306a36Sopenharmony_ci#define RX_CLASS_FT_FT1_MATCH_SHIFT	16
9862306a36Sopenharmony_ci#define RX_CLASS_FT_FT3_MATCH_MASK	GENMASK(15, 0)
9962306a36Sopenharmony_ci#define RX_CLASS_FT_FT3_MATCH_SHIFT	0
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci#define RX_CLASS_FT_FT1_MATCH(slot)	\
10262306a36Sopenharmony_ci	((BIT(slot) << RX_CLASS_FT_FT1_MATCH_SHIFT) & \
10362306a36Sopenharmony_ci	RX_CLASS_FT_FT1_MATCH_MASK)
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci/* RX class type */
10662306a36Sopenharmony_cienum rx_class_sel_type {
10762306a36Sopenharmony_ci	RX_CLASS_SEL_TYPE_OR = 0,
10862306a36Sopenharmony_ci	RX_CLASS_SEL_TYPE_AND = 1,
10962306a36Sopenharmony_ci	RX_CLASS_SEL_TYPE_OR_AND_AND = 2,
11062306a36Sopenharmony_ci	RX_CLASS_SEL_TYPE_OR_OR_AND = 3,
11162306a36Sopenharmony_ci};
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci#define FT1_CFG_SHIFT(n)	(2 * (n))
11462306a36Sopenharmony_ci#define FT1_CFG_MASK(n)		(0x3 << FT1_CFG_SHIFT((n)))
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci#define RX_CLASS_SEL_SHIFT(n)	(2 * (n))
11762306a36Sopenharmony_ci#define RX_CLASS_SEL_MASK(n)	(0x3 << RX_CLASS_SEL_SHIFT((n)))
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci#define ICSSG_CFG_OFFSET	0
12062306a36Sopenharmony_ci#define MAC_INTERFACE_0		0x18
12162306a36Sopenharmony_ci#define MAC_INTERFACE_1		0x1c
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci#define ICSSG_CFG_RX_L2_G_EN	BIT(2)
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci/* These are register offsets per PRU */
12662306a36Sopenharmony_cistruct miig_rt_offsets {
12762306a36Sopenharmony_ci	u32 mac0;
12862306a36Sopenharmony_ci	u32 mac1;
12962306a36Sopenharmony_ci	u32 ft1_start_len;
13062306a36Sopenharmony_ci	u32 ft1_cfg;
13162306a36Sopenharmony_ci	u32 ft1_slot_base;
13262306a36Sopenharmony_ci	u32 ft3_slot_base;
13362306a36Sopenharmony_ci	u32 ft3_p_base;
13462306a36Sopenharmony_ci	u32 ft_rx_ptr;
13562306a36Sopenharmony_ci	u32 rx_class_base;
13662306a36Sopenharmony_ci	u32 rx_class_cfg1;
13762306a36Sopenharmony_ci	u32 rx_class_cfg2;
13862306a36Sopenharmony_ci	u32 rx_class_gates_base;
13962306a36Sopenharmony_ci	u32 rx_green;
14062306a36Sopenharmony_ci	u32 rx_rate_cfg_base;
14162306a36Sopenharmony_ci	u32 rx_rate_src_sel0;
14262306a36Sopenharmony_ci	u32 rx_rate_src_sel1;
14362306a36Sopenharmony_ci	u32 tx_rate_cfg_base;
14462306a36Sopenharmony_ci	u32 stat_base;
14562306a36Sopenharmony_ci	u32 tx_hsr_tag;
14662306a36Sopenharmony_ci	u32 tx_hsr_seq;
14762306a36Sopenharmony_ci	u32 tx_vlan_type;
14862306a36Sopenharmony_ci	u32 tx_vlan_ins;
14962306a36Sopenharmony_ci};
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci/* These are the offset values for miig_rt_offsets registers */
15262306a36Sopenharmony_cistatic const struct miig_rt_offsets offs[] = {
15362306a36Sopenharmony_ci	/* PRU0 */
15462306a36Sopenharmony_ci	{
15562306a36Sopenharmony_ci		0x8,
15662306a36Sopenharmony_ci		0xc,
15762306a36Sopenharmony_ci		0x80,
15862306a36Sopenharmony_ci		0x84,
15962306a36Sopenharmony_ci		0x88,
16062306a36Sopenharmony_ci		0x108,
16162306a36Sopenharmony_ci		0x308,
16262306a36Sopenharmony_ci		0x408,
16362306a36Sopenharmony_ci		0x40c,
16462306a36Sopenharmony_ci		0x48c,
16562306a36Sopenharmony_ci		0x490,
16662306a36Sopenharmony_ci		0x494,
16762306a36Sopenharmony_ci		0x4d4,
16862306a36Sopenharmony_ci		0x4e4,
16962306a36Sopenharmony_ci		0x504,
17062306a36Sopenharmony_ci		0x508,
17162306a36Sopenharmony_ci		0x50c,
17262306a36Sopenharmony_ci		0x54c,
17362306a36Sopenharmony_ci		0x63c,
17462306a36Sopenharmony_ci		0x640,
17562306a36Sopenharmony_ci		0x644,
17662306a36Sopenharmony_ci		0x648,
17762306a36Sopenharmony_ci	},
17862306a36Sopenharmony_ci	/* PRU1 */
17962306a36Sopenharmony_ci	{
18062306a36Sopenharmony_ci		0x10,
18162306a36Sopenharmony_ci		0x14,
18262306a36Sopenharmony_ci		0x64c,
18362306a36Sopenharmony_ci		0x650,
18462306a36Sopenharmony_ci		0x654,
18562306a36Sopenharmony_ci		0x6d4,
18662306a36Sopenharmony_ci		0x8d4,
18762306a36Sopenharmony_ci		0x9d4,
18862306a36Sopenharmony_ci		0x9d8,
18962306a36Sopenharmony_ci		0xa58,
19062306a36Sopenharmony_ci		0xa5c,
19162306a36Sopenharmony_ci		0xa60,
19262306a36Sopenharmony_ci		0xaa0,
19362306a36Sopenharmony_ci		0xab0,
19462306a36Sopenharmony_ci		0xad0,
19562306a36Sopenharmony_ci		0xad4,
19662306a36Sopenharmony_ci		0xad8,
19762306a36Sopenharmony_ci		0xb18,
19862306a36Sopenharmony_ci		0xc08,
19962306a36Sopenharmony_ci		0xc0c,
20062306a36Sopenharmony_ci		0xc10,
20162306a36Sopenharmony_ci		0xc14,
20262306a36Sopenharmony_ci	},
20362306a36Sopenharmony_ci};
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_cistatic void rx_class_ft1_set_start_len(struct regmap *miig_rt, int slice,
20662306a36Sopenharmony_ci				       u16 start, u8 len)
20762306a36Sopenharmony_ci{
20862306a36Sopenharmony_ci	u32 offset, val;
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci	offset = offs[slice].ft1_start_len;
21162306a36Sopenharmony_ci	val = FT1_LEN(len) | FT1_START(start);
21262306a36Sopenharmony_ci	regmap_write(miig_rt, offset, val);
21362306a36Sopenharmony_ci}
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_cistatic void rx_class_ft1_set_da(struct regmap *miig_rt, int slice,
21662306a36Sopenharmony_ci				int n, const u8 *addr)
21762306a36Sopenharmony_ci{
21862306a36Sopenharmony_ci	u32 offset;
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	offset = FT1_N_REG(slice, n, FT1_DA0);
22162306a36Sopenharmony_ci	regmap_write(miig_rt, offset, (u32)(addr[0] | addr[1] << 8 |
22262306a36Sopenharmony_ci		     addr[2] << 16 | addr[3] << 24));
22362306a36Sopenharmony_ci	offset = FT1_N_REG(slice, n, FT1_DA1);
22462306a36Sopenharmony_ci	regmap_write(miig_rt, offset, (u32)(addr[4] | addr[5] << 8));
22562306a36Sopenharmony_ci}
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_cistatic void rx_class_ft1_set_da_mask(struct regmap *miig_rt, int slice,
22862306a36Sopenharmony_ci				     int n, const u8 *addr)
22962306a36Sopenharmony_ci{
23062306a36Sopenharmony_ci	u32 offset;
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci	offset = FT1_N_REG(slice, n, FT1_DA0_MASK);
23362306a36Sopenharmony_ci	regmap_write(miig_rt, offset, (u32)(addr[0] | addr[1] << 8 |
23462306a36Sopenharmony_ci		     addr[2] << 16 | addr[3] << 24));
23562306a36Sopenharmony_ci	offset = FT1_N_REG(slice, n, FT1_DA1_MASK);
23662306a36Sopenharmony_ci	regmap_write(miig_rt, offset, (u32)(addr[4] | addr[5] << 8));
23762306a36Sopenharmony_ci}
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_cistatic void rx_class_ft1_cfg_set_type(struct regmap *miig_rt, int slice, int n,
24062306a36Sopenharmony_ci				      enum ft1_cfg_type type)
24162306a36Sopenharmony_ci{
24262306a36Sopenharmony_ci	u32 offset;
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci	offset = offs[slice].ft1_cfg;
24562306a36Sopenharmony_ci	regmap_update_bits(miig_rt, offset, FT1_CFG_MASK(n),
24662306a36Sopenharmony_ci			   type << FT1_CFG_SHIFT(n));
24762306a36Sopenharmony_ci}
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_cistatic void rx_class_sel_set_type(struct regmap *miig_rt, int slice, int n,
25062306a36Sopenharmony_ci				  enum rx_class_sel_type type)
25162306a36Sopenharmony_ci{
25262306a36Sopenharmony_ci	u32 offset;
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci	offset = offs[slice].rx_class_cfg1;
25562306a36Sopenharmony_ci	regmap_update_bits(miig_rt, offset, RX_CLASS_SEL_MASK(n),
25662306a36Sopenharmony_ci			   type << RX_CLASS_SEL_SHIFT(n));
25762306a36Sopenharmony_ci}
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_cistatic void rx_class_set_and(struct regmap *miig_rt, int slice, int n,
26062306a36Sopenharmony_ci			     u32 data)
26162306a36Sopenharmony_ci{
26262306a36Sopenharmony_ci	u32 offset;
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci	offset = RX_CLASS_N_REG(slice, n, RX_CLASS_AND_EN);
26562306a36Sopenharmony_ci	regmap_write(miig_rt, offset, data);
26662306a36Sopenharmony_ci}
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_cistatic void rx_class_set_or(struct regmap *miig_rt, int slice, int n,
26962306a36Sopenharmony_ci			    u32 data)
27062306a36Sopenharmony_ci{
27162306a36Sopenharmony_ci	u32 offset;
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci	offset = RX_CLASS_N_REG(slice, n, RX_CLASS_OR_EN);
27462306a36Sopenharmony_ci	regmap_write(miig_rt, offset, data);
27562306a36Sopenharmony_ci}
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_civoid icssg_class_set_host_mac_addr(struct regmap *miig_rt, const u8 *mac)
27862306a36Sopenharmony_ci{
27962306a36Sopenharmony_ci	regmap_write(miig_rt, MAC_INTERFACE_0, (u32)(mac[0] | mac[1] << 8 |
28062306a36Sopenharmony_ci		     mac[2] << 16 | mac[3] << 24));
28162306a36Sopenharmony_ci	regmap_write(miig_rt, MAC_INTERFACE_1, (u32)(mac[4] | mac[5] << 8));
28262306a36Sopenharmony_ci}
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_civoid icssg_class_set_mac_addr(struct regmap *miig_rt, int slice, u8 *mac)
28562306a36Sopenharmony_ci{
28662306a36Sopenharmony_ci	regmap_write(miig_rt, offs[slice].mac0, (u32)(mac[0] | mac[1] << 8 |
28762306a36Sopenharmony_ci		     mac[2] << 16 | mac[3] << 24));
28862306a36Sopenharmony_ci	regmap_write(miig_rt, offs[slice].mac1, (u32)(mac[4] | mac[5] << 8));
28962306a36Sopenharmony_ci}
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci/* disable all RX traffic */
29262306a36Sopenharmony_civoid icssg_class_disable(struct regmap *miig_rt, int slice)
29362306a36Sopenharmony_ci{
29462306a36Sopenharmony_ci	u32 data, offset;
29562306a36Sopenharmony_ci	int n;
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci	/* Enable RX_L2_G */
29862306a36Sopenharmony_ci	regmap_update_bits(miig_rt, ICSSG_CFG_OFFSET, ICSSG_CFG_RX_L2_G_EN,
29962306a36Sopenharmony_ci			   ICSSG_CFG_RX_L2_G_EN);
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci	for (n = 0; n < ICSSG_NUM_CLASSIFIERS; n++) {
30262306a36Sopenharmony_ci		/* AND_EN = 0 */
30362306a36Sopenharmony_ci		rx_class_set_and(miig_rt, slice, n, 0);
30462306a36Sopenharmony_ci		/* OR_EN = 0 */
30562306a36Sopenharmony_ci		rx_class_set_or(miig_rt, slice, n, 0);
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci		/* set CFG1 to OR */
30862306a36Sopenharmony_ci		rx_class_sel_set_type(miig_rt, slice, n, RX_CLASS_SEL_TYPE_OR);
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci		/* configure gate */
31162306a36Sopenharmony_ci		offset = RX_CLASS_GATES_N_REG(slice, n);
31262306a36Sopenharmony_ci		regmap_read(miig_rt, offset, &data);
31362306a36Sopenharmony_ci		/* clear class_raw so we go through filters */
31462306a36Sopenharmony_ci		data &= ~RX_CLASS_GATES_RAW_MASK;
31562306a36Sopenharmony_ci		/* set allow and phase mask */
31662306a36Sopenharmony_ci		data |= RX_CLASS_GATES_ALLOW_MASK | RX_CLASS_GATES_PHASE_MASK;
31762306a36Sopenharmony_ci		regmap_write(miig_rt, offset, data);
31862306a36Sopenharmony_ci	}
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci	/* FT1 Disabled */
32162306a36Sopenharmony_ci	for (n = 0; n < ICSSG_NUM_FT1_SLOTS; n++) {
32262306a36Sopenharmony_ci		const u8 addr[] = { 0, 0, 0, 0, 0, 0, };
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci		rx_class_ft1_cfg_set_type(miig_rt, slice, n,
32562306a36Sopenharmony_ci					  FT1_CFG_TYPE_DISABLED);
32662306a36Sopenharmony_ci		rx_class_ft1_set_da(miig_rt, slice, n, addr);
32762306a36Sopenharmony_ci		rx_class_ft1_set_da_mask(miig_rt, slice, n, addr);
32862306a36Sopenharmony_ci	}
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci	/* clear CFG2 */
33162306a36Sopenharmony_ci	regmap_write(miig_rt, offs[slice].rx_class_cfg2, 0);
33262306a36Sopenharmony_ci}
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_civoid icssg_class_default(struct regmap *miig_rt, int slice, bool allmulti)
33562306a36Sopenharmony_ci{
33662306a36Sopenharmony_ci	u32 data;
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	/* defaults */
33962306a36Sopenharmony_ci	icssg_class_disable(miig_rt, slice);
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	/* Setup Classifier */
34262306a36Sopenharmony_ci	/* match on Broadcast or MAC_PRU address */
34362306a36Sopenharmony_ci	data = RX_CLASS_FT_BC | RX_CLASS_FT_DA_P;
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci	/* multicast */
34662306a36Sopenharmony_ci	if (allmulti)
34762306a36Sopenharmony_ci		data |= RX_CLASS_FT_MC;
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci	rx_class_set_or(miig_rt, slice, 0, data);
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci	/* set CFG1 for OR_OR_AND for classifier */
35262306a36Sopenharmony_ci	rx_class_sel_set_type(miig_rt, slice, 0, RX_CLASS_SEL_TYPE_OR_OR_AND);
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci	/* clear CFG2 */
35562306a36Sopenharmony_ci	regmap_write(miig_rt, offs[slice].rx_class_cfg2, 0);
35662306a36Sopenharmony_ci}
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_ci/* required for SAV check */
35962306a36Sopenharmony_civoid icssg_ft1_set_mac_addr(struct regmap *miig_rt, int slice, u8 *mac_addr)
36062306a36Sopenharmony_ci{
36162306a36Sopenharmony_ci	const u8 mask_addr[] = { 0, 0, 0, 0, 0, 0, };
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci	rx_class_ft1_set_start_len(miig_rt, slice, 0, 6);
36462306a36Sopenharmony_ci	rx_class_ft1_set_da(miig_rt, slice, 0, mac_addr);
36562306a36Sopenharmony_ci	rx_class_ft1_set_da_mask(miig_rt, slice, 0, mask_addr);
36662306a36Sopenharmony_ci	rx_class_ft1_cfg_set_type(miig_rt, slice, 0, FT1_CFG_TYPE_EQ);
36762306a36Sopenharmony_ci}
368