mlxsw_sib_pude_ib_event_func(mlxsw_sib_port, status);
}
-static struct mlxsw_event_listener mlxsw_sib_pude_event = {
- .func = mlxsw_sib_pude_event_func,
- .trap_id = MLXSW_TRAP_ID_PUDE,
+static const struct mlxsw_listener mlxsw_sib_listener[] = {
+ MLXSW_EVENTL(mlxsw_sib_pude_event_func, PUDE),
};
-static int mlxsw_sib_event_register(struct mlxsw_sib *mlxsw_sib,
- enum mlxsw_event_trap_id trap_id)
+static int mlxsw_sib_taps_init(struct mlxsw_sib *mlxsw_sib)
{
- struct mlxsw_event_listener *el;
- char hpkt_pl[MLXSW_REG_HPKT_LEN];
+ int i;
int err;
- switch (trap_id) {
- case MLXSW_TRAP_ID_PUDE:
- el = &mlxsw_sib_pude_event;
- break;
+ for (i = 0; i < ARRAY_SIZE(mlxsw_sib_listener); i++) {
+ err = mlxsw_core_trap_register(mlxsw_sib->core,
+ &mlxsw_sib_listener[i],
+ mlxsw_sib);
+ if (err)
+ goto err_rx_listener_register;
}
- err = mlxsw_core_event_listener_register(mlxsw_sib->core, el,
- mlxsw_sib);
- if (err)
- return err;
-
- mlxsw_reg_hpkt_pack(hpkt_pl, MLXSW_REG_HPKT_ACTION_FORWARD, trap_id);
- err = mlxsw_reg_write(mlxsw_sib->core, MLXSW_REG(hpkt), hpkt_pl);
- if (err)
- goto err_event_trap_set;
return 0;
-err_event_trap_set:
- mlxsw_core_event_listener_unregister(mlxsw_sib->core, el, mlxsw_sib);
+err_rx_listener_register:
+ for (i--; i >= 0; i--) {
+ mlxsw_core_trap_unregister(mlxsw_sib->core,
+ &mlxsw_sib_listener[i],
+ mlxsw_sib);
+ }
+
return err;
}
-static void mlxsw_sib_event_unregister(struct mlxsw_sib *mlxsw_sib,
- enum mlxsw_event_trap_id trap_id)
+static void mlxsw_sib_traps_fini(struct mlxsw_sib *mlxsw_sib)
{
- struct mlxsw_event_listener *el;
+ int i;
- switch (trap_id) {
- case MLXSW_TRAP_ID_PUDE:
- el = &mlxsw_sib_pude_event;
- break;
+ for (i = 0; i < ARRAY_SIZE(mlxsw_sib_listener); i++) {
+ mlxsw_core_trap_unregister(mlxsw_sib->core,
+ &mlxsw_sib_listener[i], mlxsw_sib);
}
- mlxsw_core_event_listener_unregister(mlxsw_sib->core, el, mlxsw_sib);
}
static int mlxsw_sib_init(struct mlxsw_core *mlxsw_core,
return err;
}
- err = mlxsw_sib_event_register(mlxsw_sib, MLXSW_TRAP_ID_PUDE);
+ err = mlxsw_sib_taps_init(mlxsw_sib);
if (err) {
- dev_err(mlxsw_sib->bus_info->dev, "Failed to register for PUDE events\n");
- goto err_event_register;
+ dev_err(mlxsw_sib->bus_info->dev, "Failed to set traps\n");
+ goto err_traps_init_err;
}
return 0;
-err_event_register:
+err_traps_init_err:
mlxsw_sib_ports_remove(mlxsw_sib);
return err;
}
{
struct mlxsw_sib *mlxsw_sib = mlxsw_core_driver_priv(mlxsw_core);
- mlxsw_sib_event_unregister(mlxsw_sib, MLXSW_TRAP_ID_PUDE);
+ mlxsw_sib_traps_fini(mlxsw_sib);
mlxsw_sib_ports_remove(mlxsw_sib);
}