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