提交 85d5c9cd 编写于 作者: N Nogah Frankel 提交者: David S. Miller

mlxsw: switchib: Use generic listener struct for events

Change the event handling in Switchib to be comptible with Spectrum and
Switchx2.
Use the generic listener struct for the events. Init and fini them by loop
(and not by calling each event by its name).
Signed-off-by: NNogah Frankel <nogahf@mellanox.com>
Signed-off-by: NJiri Pirko <jiri@mellanox.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 6bf08b53
...@@ -408,51 +408,43 @@ static void mlxsw_sib_pude_event_func(const struct mlxsw_reg_info *reg, ...@@ -408,51 +408,43 @@ static void mlxsw_sib_pude_event_func(const struct mlxsw_reg_info *reg,
mlxsw_sib_pude_ib_event_func(mlxsw_sib_port, status); mlxsw_sib_pude_ib_event_func(mlxsw_sib_port, status);
} }
static struct mlxsw_event_listener mlxsw_sib_pude_event = { static const struct mlxsw_listener mlxsw_sib_listener[] = {
.func = mlxsw_sib_pude_event_func, MLXSW_EVENTL(mlxsw_sib_pude_event_func, PUDE),
.trap_id = MLXSW_TRAP_ID_PUDE,
}; };
static int mlxsw_sib_event_register(struct mlxsw_sib *mlxsw_sib, static int mlxsw_sib_taps_init(struct mlxsw_sib *mlxsw_sib)
enum mlxsw_event_trap_id trap_id)
{ {
struct mlxsw_event_listener *el; int i;
char hpkt_pl[MLXSW_REG_HPKT_LEN];
int err; int err;
switch (trap_id) { for (i = 0; i < ARRAY_SIZE(mlxsw_sib_listener); i++) {
case MLXSW_TRAP_ID_PUDE: err = mlxsw_core_trap_register(mlxsw_sib->core,
el = &mlxsw_sib_pude_event; &mlxsw_sib_listener[i],
break;
}
err = mlxsw_core_event_listener_register(mlxsw_sib->core, el,
mlxsw_sib); mlxsw_sib);
if (err) if (err)
return err; goto err_rx_listener_register;
}
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; return 0;
err_event_trap_set: err_rx_listener_register:
mlxsw_core_event_listener_unregister(mlxsw_sib->core, el, mlxsw_sib); for (i--; i >= 0; i--) {
mlxsw_core_trap_unregister(mlxsw_sib->core,
&mlxsw_sib_listener[i],
mlxsw_sib);
}
return err; return err;
} }
static void mlxsw_sib_event_unregister(struct mlxsw_sib *mlxsw_sib, static void mlxsw_sib_traps_fini(struct mlxsw_sib *mlxsw_sib)
enum mlxsw_event_trap_id trap_id)
{ {
struct mlxsw_event_listener *el; int i;
switch (trap_id) { for (i = 0; i < ARRAY_SIZE(mlxsw_sib_listener); i++) {
case MLXSW_TRAP_ID_PUDE: mlxsw_core_trap_unregister(mlxsw_sib->core,
el = &mlxsw_sib_pude_event; &mlxsw_sib_listener[i], mlxsw_sib);
break;
} }
mlxsw_core_event_listener_unregister(mlxsw_sib->core, el, mlxsw_sib);
} }
static int mlxsw_sib_init(struct mlxsw_core *mlxsw_core, static int mlxsw_sib_init(struct mlxsw_core *mlxsw_core,
...@@ -470,15 +462,15 @@ static int mlxsw_sib_init(struct mlxsw_core *mlxsw_core, ...@@ -470,15 +462,15 @@ static int mlxsw_sib_init(struct mlxsw_core *mlxsw_core,
return err; return err;
} }
err = mlxsw_sib_event_register(mlxsw_sib, MLXSW_TRAP_ID_PUDE); err = mlxsw_sib_taps_init(mlxsw_sib);
if (err) { if (err) {
dev_err(mlxsw_sib->bus_info->dev, "Failed to register for PUDE events\n"); dev_err(mlxsw_sib->bus_info->dev, "Failed to set traps\n");
goto err_event_register; goto err_traps_init_err;
} }
return 0; return 0;
err_event_register: err_traps_init_err:
mlxsw_sib_ports_remove(mlxsw_sib); mlxsw_sib_ports_remove(mlxsw_sib);
return err; return err;
} }
...@@ -487,7 +479,7 @@ static void mlxsw_sib_fini(struct mlxsw_core *mlxsw_core) ...@@ -487,7 +479,7 @@ static void mlxsw_sib_fini(struct mlxsw_core *mlxsw_core)
{ {
struct mlxsw_sib *mlxsw_sib = mlxsw_core_driver_priv(mlxsw_core); 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); mlxsw_sib_ports_remove(mlxsw_sib);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册