Commit 2332d8c7 authored by Nogah Frankel's avatar Nogah Frankel Committed by David S. Miller

mlxsw: switchx2: Use generic listener struct for rx traps

Reorganize the traps to use the new generic listener struct and
functions. Use macros to shorten the traps list.
Signed-off-by: default avatarNogah Frankel <nogahf@mellanox.com>
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 14eeda99
...@@ -1494,84 +1494,29 @@ static int mlxsw_sx_port_type_set(struct mlxsw_core *mlxsw_core, u8 local_port, ...@@ -1494,84 +1494,29 @@ static int mlxsw_sx_port_type_set(struct mlxsw_core *mlxsw_core, u8 local_port,
return err; return err;
} }
static const struct mlxsw_rx_listener mlxsw_sx_rx_listener[] = { #define MLXSW_SX_RXL(_trap_id) \
{ MLXSW_RXL(mlxsw_sx_rx_listener_func, _trap_id, TRAP_TO_CPU, FORWARD)
.func = mlxsw_sx_rx_listener_func,
.local_port = MLXSW_PORT_DONT_CARE, static const struct mlxsw_listener mlxsw_sx_rx_listener[] = {
.trap_id = MLXSW_TRAP_ID_FDB_MC, MLXSW_SX_RXL(FDB_MC),
}, MLXSW_SX_RXL(STP),
/* Traps for specific L2 packet types, not trapped as FDB MC */ MLXSW_SX_RXL(LACP),
{ MLXSW_SX_RXL(EAPOL),
.func = mlxsw_sx_rx_listener_func, MLXSW_SX_RXL(LLDP),
.local_port = MLXSW_PORT_DONT_CARE, MLXSW_SX_RXL(MMRP),
.trap_id = MLXSW_TRAP_ID_STP, MLXSW_SX_RXL(MVRP),
}, MLXSW_SX_RXL(RPVST),
{ MLXSW_SX_RXL(DHCP),
.func = mlxsw_sx_rx_listener_func, MLXSW_SX_RXL(IGMP_QUERY),
.local_port = MLXSW_PORT_DONT_CARE, MLXSW_SX_RXL(IGMP_V1_REPORT),
.trap_id = MLXSW_TRAP_ID_LACP, MLXSW_SX_RXL(IGMP_V2_REPORT),
}, MLXSW_SX_RXL(IGMP_V2_LEAVE),
{ MLXSW_SX_RXL(IGMP_V3_REPORT),
.func = mlxsw_sx_rx_listener_func,
.local_port = MLXSW_PORT_DONT_CARE,
.trap_id = MLXSW_TRAP_ID_EAPOL,
},
{
.func = mlxsw_sx_rx_listener_func,
.local_port = MLXSW_PORT_DONT_CARE,
.trap_id = MLXSW_TRAP_ID_LLDP,
},
{
.func = mlxsw_sx_rx_listener_func,
.local_port = MLXSW_PORT_DONT_CARE,
.trap_id = MLXSW_TRAP_ID_MMRP,
},
{
.func = mlxsw_sx_rx_listener_func,
.local_port = MLXSW_PORT_DONT_CARE,
.trap_id = MLXSW_TRAP_ID_MVRP,
},
{
.func = mlxsw_sx_rx_listener_func,
.local_port = MLXSW_PORT_DONT_CARE,
.trap_id = MLXSW_TRAP_ID_RPVST,
},
{
.func = mlxsw_sx_rx_listener_func,
.local_port = MLXSW_PORT_DONT_CARE,
.trap_id = MLXSW_TRAP_ID_DHCP,
},
{
.func = mlxsw_sx_rx_listener_func,
.local_port = MLXSW_PORT_DONT_CARE,
.trap_id = MLXSW_TRAP_ID_IGMP_QUERY,
},
{
.func = mlxsw_sx_rx_listener_func,
.local_port = MLXSW_PORT_DONT_CARE,
.trap_id = MLXSW_TRAP_ID_IGMP_V1_REPORT,
},
{
.func = mlxsw_sx_rx_listener_func,
.local_port = MLXSW_PORT_DONT_CARE,
.trap_id = MLXSW_TRAP_ID_IGMP_V2_REPORT,
},
{
.func = mlxsw_sx_rx_listener_func,
.local_port = MLXSW_PORT_DONT_CARE,
.trap_id = MLXSW_TRAP_ID_IGMP_V2_LEAVE,
},
{
.func = mlxsw_sx_rx_listener_func,
.local_port = MLXSW_PORT_DONT_CARE,
.trap_id = MLXSW_TRAP_ID_IGMP_V3_REPORT,
},
}; };
static int mlxsw_sx_traps_init(struct mlxsw_sx *mlxsw_sx) static int mlxsw_sx_traps_init(struct mlxsw_sx *mlxsw_sx)
{ {
char htgt_pl[MLXSW_REG_HTGT_LEN]; char htgt_pl[MLXSW_REG_HTGT_LEN];
char hpkt_pl[MLXSW_REG_HPKT_LEN];
int i; int i;
int err; int err;
...@@ -1586,50 +1531,32 @@ static int mlxsw_sx_traps_init(struct mlxsw_sx *mlxsw_sx) ...@@ -1586,50 +1531,32 @@ static int mlxsw_sx_traps_init(struct mlxsw_sx *mlxsw_sx)
return err; return err;
for (i = 0; i < ARRAY_SIZE(mlxsw_sx_rx_listener); i++) { for (i = 0; i < ARRAY_SIZE(mlxsw_sx_rx_listener); i++) {
err = mlxsw_core_rx_listener_register(mlxsw_sx->core, err = mlxsw_core_trap_register(mlxsw_sx->core,
&mlxsw_sx_rx_listener[i], &mlxsw_sx_rx_listener[i],
mlxsw_sx); mlxsw_sx);
if (err) if (err)
goto err_rx_listener_register; goto err_rx_listener_register;
mlxsw_reg_hpkt_pack(hpkt_pl, MLXSW_REG_HPKT_ACTION_TRAP_TO_CPU,
mlxsw_sx_rx_listener[i].trap_id);
err = mlxsw_reg_write(mlxsw_sx->core, MLXSW_REG(hpkt), hpkt_pl);
if (err)
goto err_rx_trap_set;
} }
return 0; return 0;
err_rx_trap_set:
mlxsw_core_rx_listener_unregister(mlxsw_sx->core,
&mlxsw_sx_rx_listener[i],
mlxsw_sx);
err_rx_listener_register: err_rx_listener_register:
for (i--; i >= 0; i--) { for (i--; i >= 0; i--) {
mlxsw_reg_hpkt_pack(hpkt_pl, MLXSW_REG_HPKT_ACTION_FORWARD, mlxsw_core_trap_unregister(mlxsw_sx->core,
mlxsw_sx_rx_listener[i].trap_id); &mlxsw_sx_rx_listener[i],
mlxsw_reg_write(mlxsw_sx->core, MLXSW_REG(hpkt), hpkt_pl); mlxsw_sx);
mlxsw_core_rx_listener_unregister(mlxsw_sx->core,
&mlxsw_sx_rx_listener[i],
mlxsw_sx);
} }
return err; return err;
} }
static void mlxsw_sx_traps_fini(struct mlxsw_sx *mlxsw_sx) static void mlxsw_sx_traps_fini(struct mlxsw_sx *mlxsw_sx)
{ {
char hpkt_pl[MLXSW_REG_HPKT_LEN];
int i; int i;
for (i = 0; i < ARRAY_SIZE(mlxsw_sx_rx_listener); i++) { for (i = 0; i < ARRAY_SIZE(mlxsw_sx_rx_listener); i++) {
mlxsw_reg_hpkt_pack(hpkt_pl, MLXSW_REG_HPKT_ACTION_FORWARD, mlxsw_core_trap_unregister(mlxsw_sx->core,
mlxsw_sx_rx_listener[i].trap_id); &mlxsw_sx_rx_listener[i],
mlxsw_reg_write(mlxsw_sx->core, MLXSW_REG(hpkt), hpkt_pl); mlxsw_sx);
mlxsw_core_rx_listener_unregister(mlxsw_sx->core,
&mlxsw_sx_rx_listener[i],
mlxsw_sx);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment