mlxsw: spectrum: Use different arrays of FID families per-ASIC type
Egress VID for layer 2 multicast is determined from two tables, the MPE and PGT tables. The MPE table is a two dimensional table indexed by local port and SMPE index, which should be thought of as a FID index. In Spectrum-1 the SMPE index is derived from the PGT entry, whereas in Spectrum-2 and newer ASICs the SMPE index is a FID attribute configured via the SFMR register. The validity of the SMPE index in SFMR is influenced from two factors: 1. FID family. SMPE index is reserved for rFIDs, as their flooding is handled by firmware. 2. ASIC generation. SMPE index is always reserved for Spectrum-1. As such, the validity of the SMPE index should be an attribute of the FID family and have different arrays of FID families per-ASIC type. As a preparation for SMPE index configuration, create separate arrays of FID families for different ASICs. Signed-off-by: Amit Cohen <amcohen@nvidia.com> Signed-off-by: Ido Schimmel <idosch@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2c09104801
commit
04e85970ce
@ -3232,6 +3232,7 @@ static int mlxsw_sp1_init(struct mlxsw_core *mlxsw_core,
|
||||
mlxsw_sp->router_ops = &mlxsw_sp1_router_ops;
|
||||
mlxsw_sp->listeners = mlxsw_sp1_listener;
|
||||
mlxsw_sp->listeners_count = ARRAY_SIZE(mlxsw_sp1_listener);
|
||||
mlxsw_sp->fid_family_arr = mlxsw_sp1_fid_family_arr;
|
||||
mlxsw_sp->lowest_shaper_bs = MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP1;
|
||||
|
||||
return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info, extack);
|
||||
@ -3264,6 +3265,7 @@ static int mlxsw_sp2_init(struct mlxsw_core *mlxsw_core,
|
||||
mlxsw_sp->router_ops = &mlxsw_sp2_router_ops;
|
||||
mlxsw_sp->listeners = mlxsw_sp2_listener;
|
||||
mlxsw_sp->listeners_count = ARRAY_SIZE(mlxsw_sp2_listener);
|
||||
mlxsw_sp->fid_family_arr = mlxsw_sp2_fid_family_arr;
|
||||
mlxsw_sp->lowest_shaper_bs = MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP2;
|
||||
|
||||
return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info, extack);
|
||||
@ -3296,6 +3298,7 @@ static int mlxsw_sp3_init(struct mlxsw_core *mlxsw_core,
|
||||
mlxsw_sp->router_ops = &mlxsw_sp2_router_ops;
|
||||
mlxsw_sp->listeners = mlxsw_sp2_listener;
|
||||
mlxsw_sp->listeners_count = ARRAY_SIZE(mlxsw_sp2_listener);
|
||||
mlxsw_sp->fid_family_arr = mlxsw_sp2_fid_family_arr;
|
||||
mlxsw_sp->lowest_shaper_bs = MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP3;
|
||||
|
||||
return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info, extack);
|
||||
@ -3328,6 +3331,7 @@ static int mlxsw_sp4_init(struct mlxsw_core *mlxsw_core,
|
||||
mlxsw_sp->router_ops = &mlxsw_sp2_router_ops;
|
||||
mlxsw_sp->listeners = mlxsw_sp2_listener;
|
||||
mlxsw_sp->listeners_count = ARRAY_SIZE(mlxsw_sp2_listener);
|
||||
mlxsw_sp->fid_family_arr = mlxsw_sp2_fid_family_arr;
|
||||
mlxsw_sp->lowest_shaper_bs = MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP4;
|
||||
|
||||
return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info, extack);
|
||||
|
@ -211,6 +211,7 @@ struct mlxsw_sp {
|
||||
const struct mlxsw_sp_mall_ops *mall_ops;
|
||||
const struct mlxsw_sp_router_ops *router_ops;
|
||||
const struct mlxsw_listener *listeners;
|
||||
const struct mlxsw_sp_fid_family **fid_family_arr;
|
||||
size_t listeners_count;
|
||||
u32 lowest_shaper_bs;
|
||||
struct rhashtable ipv6_addr_ht;
|
||||
@ -1286,6 +1287,9 @@ void mlxsw_sp_port_fids_fini(struct mlxsw_sp_port *mlxsw_sp_port);
|
||||
int mlxsw_sp_fids_init(struct mlxsw_sp *mlxsw_sp);
|
||||
void mlxsw_sp_fids_fini(struct mlxsw_sp *mlxsw_sp);
|
||||
|
||||
extern const struct mlxsw_sp_fid_family *mlxsw_sp1_fid_family_arr[];
|
||||
extern const struct mlxsw_sp_fid_family *mlxsw_sp2_fid_family_arr[];
|
||||
|
||||
/* spectrum_mr.c */
|
||||
enum mlxsw_sp_mr_route_prio {
|
||||
MLXSW_SP_MR_ROUTE_PRIO_SG,
|
||||
|
@ -969,7 +969,14 @@ static const struct mlxsw_sp_fid_family mlxsw_sp_fid_dummy_family = {
|
||||
.ops = &mlxsw_sp_fid_dummy_ops,
|
||||
};
|
||||
|
||||
static const struct mlxsw_sp_fid_family *mlxsw_sp_fid_family_arr[] = {
|
||||
const struct mlxsw_sp_fid_family *mlxsw_sp1_fid_family_arr[] = {
|
||||
[MLXSW_SP_FID_TYPE_8021Q] = &mlxsw_sp_fid_8021q_emu_family,
|
||||
[MLXSW_SP_FID_TYPE_8021D] = &mlxsw_sp_fid_8021d_family,
|
||||
[MLXSW_SP_FID_TYPE_RFID] = &mlxsw_sp_fid_rfid_family,
|
||||
[MLXSW_SP_FID_TYPE_DUMMY] = &mlxsw_sp_fid_dummy_family,
|
||||
};
|
||||
|
||||
const struct mlxsw_sp_fid_family *mlxsw_sp2_fid_family_arr[] = {
|
||||
[MLXSW_SP_FID_TYPE_8021Q] = &mlxsw_sp_fid_8021q_emu_family,
|
||||
[MLXSW_SP_FID_TYPE_8021D] = &mlxsw_sp_fid_8021d_family,
|
||||
[MLXSW_SP_FID_TYPE_RFID] = &mlxsw_sp_fid_rfid_family,
|
||||
@ -1238,7 +1245,7 @@ int mlxsw_sp_fids_init(struct mlxsw_sp *mlxsw_sp)
|
||||
|
||||
for (i = 0; i < MLXSW_SP_FID_TYPE_MAX; i++) {
|
||||
err = mlxsw_sp_fid_family_register(mlxsw_sp,
|
||||
mlxsw_sp_fid_family_arr[i]);
|
||||
mlxsw_sp->fid_family_arr[i]);
|
||||
|
||||
if (err)
|
||||
goto err_fid_ops_register;
|
||||
|
Loading…
x
Reference in New Issue
Block a user