mlxsw: core: Allow to register disabled traps using MLXSW_RXL_DIS

Introduce a new macro MLXSW_RXL_DIS that allows to register listeners
as disabled. That allows that from now on, the "action" can be
understood always as "enabled action" and "unreg_action" as "disabled
action". Rename them and treat them accordingly.

Use the new macro for defining drops in spectrum_trap.c.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Jiri Pirko 2020-02-24 08:35:44 +01:00 committed by David S. Miller
parent 1ef658a377
commit 76d4067fe1
3 changed files with 31 additions and 12 deletions

View File

@ -1628,6 +1628,7 @@ static void mlxsw_core_listener_unregister(struct mlxsw_core *mlxsw_core,
int mlxsw_core_trap_register(struct mlxsw_core *mlxsw_core, int mlxsw_core_trap_register(struct mlxsw_core *mlxsw_core,
const struct mlxsw_listener *listener, void *priv) const struct mlxsw_listener *listener, void *priv)
{ {
enum mlxsw_reg_hpkt_action action;
char hpkt_pl[MLXSW_REG_HPKT_LEN]; char hpkt_pl[MLXSW_REG_HPKT_LEN];
int err; int err;
@ -1635,7 +1636,9 @@ int mlxsw_core_trap_register(struct mlxsw_core *mlxsw_core,
if (err) if (err)
return err; return err;
mlxsw_reg_hpkt_pack(hpkt_pl, listener->action, listener->trap_id, action = listener->enabled_on_register ? listener->en_action :
listener->dis_action;
mlxsw_reg_hpkt_pack(hpkt_pl, action, listener->trap_id,
listener->trap_group, listener->is_ctrl); listener->trap_group, listener->is_ctrl);
err = mlxsw_reg_write(mlxsw_core, MLXSW_REG(hpkt), hpkt_pl); err = mlxsw_reg_write(mlxsw_core, MLXSW_REG(hpkt), hpkt_pl);
if (err) if (err)
@ -1656,7 +1659,7 @@ void mlxsw_core_trap_unregister(struct mlxsw_core *mlxsw_core,
char hpkt_pl[MLXSW_REG_HPKT_LEN]; char hpkt_pl[MLXSW_REG_HPKT_LEN];
if (!listener->is_event) { if (!listener->is_event) {
mlxsw_reg_hpkt_pack(hpkt_pl, listener->unreg_action, mlxsw_reg_hpkt_pack(hpkt_pl, listener->dis_action,
listener->trap_id, listener->trap_group, listener->trap_id, listener->trap_group,
listener->is_ctrl); listener->is_ctrl);
mlxsw_reg_write(mlxsw_core, MLXSW_REG(hpkt), hpkt_pl); mlxsw_reg_write(mlxsw_core, MLXSW_REG(hpkt), hpkt_pl);

View File

@ -76,15 +76,18 @@ struct mlxsw_listener {
struct mlxsw_rx_listener rx_listener; struct mlxsw_rx_listener rx_listener;
struct mlxsw_event_listener event_listener; struct mlxsw_event_listener event_listener;
}; };
enum mlxsw_reg_hpkt_action action; enum mlxsw_reg_hpkt_action en_action; /* Action when enabled */
enum mlxsw_reg_hpkt_action unreg_action; enum mlxsw_reg_hpkt_action dis_action; /* Action when disabled */
u8 trap_group; u8 trap_group;
u8 is_ctrl:1, /* should go via control buffer or not */ u8 is_ctrl:1, /* should go via control buffer or not */
is_event:1; is_event:1,
enabled_on_register:1; /* Trap should be enabled when listener
* is registered.
*/
}; };
#define MLXSW_RXL(_func, _trap_id, _action, _is_ctrl, _trap_group, \ #define __MLXSW_RXL(_func, _trap_id, _en_action, _is_ctrl, _trap_group, \
_unreg_action) \ _dis_action, _enabled_on_register) \
{ \ { \
.trap_id = MLXSW_TRAP_ID_##_trap_id, \ .trap_id = MLXSW_TRAP_ID_##_trap_id, \
.rx_listener = \ .rx_listener = \
@ -93,12 +96,23 @@ struct mlxsw_listener {
.local_port = MLXSW_PORT_DONT_CARE, \ .local_port = MLXSW_PORT_DONT_CARE, \
.trap_id = MLXSW_TRAP_ID_##_trap_id, \ .trap_id = MLXSW_TRAP_ID_##_trap_id, \
}, \ }, \
.action = MLXSW_REG_HPKT_ACTION_##_action, \ .en_action = MLXSW_REG_HPKT_ACTION_##_en_action, \
.unreg_action = MLXSW_REG_HPKT_ACTION_##_unreg_action, \ .dis_action = MLXSW_REG_HPKT_ACTION_##_dis_action, \
.trap_group = MLXSW_REG_HTGT_TRAP_GROUP_##_trap_group, \ .trap_group = MLXSW_REG_HTGT_TRAP_GROUP_##_trap_group, \
.is_ctrl = _is_ctrl, \ .is_ctrl = _is_ctrl, \
.enabled_on_register = _enabled_on_register, \
} }
#define MLXSW_RXL(_func, _trap_id, _en_action, _is_ctrl, _trap_group, \
_dis_action) \
__MLXSW_RXL(_func, _trap_id, _en_action, _is_ctrl, _trap_group, \
_dis_action, true)
#define MLXSW_RXL_DIS(_func, _trap_id, _en_action, _is_ctrl, _trap_group, \
_dis_action) \
__MLXSW_RXL(_func, _trap_id, _en_action, _is_ctrl, _trap_group, \
_dis_action, false)
#define MLXSW_EVENTL(_func, _trap_id, _trap_group) \ #define MLXSW_EVENTL(_func, _trap_id, _trap_group) \
{ \ { \
.trap_id = MLXSW_TRAP_ID_##_trap_id, \ .trap_id = MLXSW_TRAP_ID_##_trap_id, \
@ -107,9 +121,10 @@ struct mlxsw_listener {
.func = _func, \ .func = _func, \
.trap_id = MLXSW_TRAP_ID_##_trap_id, \ .trap_id = MLXSW_TRAP_ID_##_trap_id, \
}, \ }, \
.action = MLXSW_REG_HPKT_ACTION_TRAP_TO_CPU, \ .en_action = MLXSW_REG_HPKT_ACTION_TRAP_TO_CPU, \
.trap_group = MLXSW_REG_HTGT_TRAP_GROUP_##_trap_group, \ .trap_group = MLXSW_REG_HTGT_TRAP_GROUP_##_trap_group, \
.is_event = true, \ .is_event = true, \
.enabled_on_register = true, \
} }
int mlxsw_core_rx_listener_register(struct mlxsw_core *mlxsw_core, int mlxsw_core_rx_listener_register(struct mlxsw_core *mlxsw_core,

View File

@ -118,8 +118,9 @@ static void mlxsw_sp_rx_exception_listener(struct sk_buff *skb, u8 local_port,
MLXSW_SP_TRAP_METADATA) MLXSW_SP_TRAP_METADATA)
#define MLXSW_SP_RXL_DISCARD(_id, _group_id) \ #define MLXSW_SP_RXL_DISCARD(_id, _group_id) \
MLXSW_RXL(mlxsw_sp_rx_drop_listener, DISCARD_##_id, SET_FW_DEFAULT, \ MLXSW_RXL_DIS(mlxsw_sp_rx_drop_listener, DISCARD_##_id, \
false, SP_##_group_id, SET_FW_DEFAULT) TRAP_EXCEPTION_TO_CPU, false, SP_##_group_id, \
SET_FW_DEFAULT)
#define MLXSW_SP_RXL_EXCEPTION(_id, _group_id, _action) \ #define MLXSW_SP_RXL_EXCEPTION(_id, _group_id, _action) \
MLXSW_RXL(mlxsw_sp_rx_exception_listener, _id, \ MLXSW_RXL(mlxsw_sp_rx_exception_listener, _id, \