Commit dbd1ddad authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller
Browse files

mlxsw: core: Extend MLXSW_RXL_DIS to register disabled trap group



Extend the mlxsw_listener struct to contain trap group for disabled
traps too. Rename the original "trap_group" item to "en_trap_group" as
it represents enabled state. Let both groups be the same for MLXSW_RXL
however extend MLXSW_RXL_DIS to register separate groups for enable and
disable.

Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c83da292
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -1645,6 +1645,7 @@ static void mlxsw_core_listener_unregister(struct mlxsw_core *mlxsw_core,
int mlxsw_core_trap_register(struct mlxsw_core *mlxsw_core,
			     const struct mlxsw_listener *listener, void *priv)
{
	enum mlxsw_reg_htgt_trap_group trap_group;
	enum mlxsw_reg_hpkt_action action;
	char hpkt_pl[MLXSW_REG_HPKT_LEN];
	int err;
@@ -1656,8 +1657,10 @@ int mlxsw_core_trap_register(struct mlxsw_core *mlxsw_core,

	action = listener->enabled_on_register ? listener->en_action :
						 listener->dis_action;
	trap_group = listener->enabled_on_register ? listener->en_trap_group :
						     listener->dis_trap_group;
	mlxsw_reg_hpkt_pack(hpkt_pl, action, listener->trap_id,
			    listener->trap_group, listener->is_ctrl);
			    trap_group, listener->is_ctrl);
	err = mlxsw_reg_write(mlxsw_core,  MLXSW_REG(hpkt), hpkt_pl);
	if (err)
		goto err_trap_set;
@@ -1678,7 +1681,7 @@ void mlxsw_core_trap_unregister(struct mlxsw_core *mlxsw_core,

	if (!listener->is_event) {
		mlxsw_reg_hpkt_pack(hpkt_pl, listener->dis_action,
				    listener->trap_id, listener->trap_group,
				    listener->trap_id, listener->dis_trap_group,
				    listener->is_ctrl);
		mlxsw_reg_write(mlxsw_core, MLXSW_REG(hpkt), hpkt_pl);
	}
@@ -1691,6 +1694,7 @@ int mlxsw_core_trap_state_set(struct mlxsw_core *mlxsw_core,
			      const struct mlxsw_listener *listener,
			      bool enabled)
{
	enum mlxsw_reg_htgt_trap_group trap_group;
	enum mlxsw_reg_hpkt_action action;
	char hpkt_pl[MLXSW_REG_HPKT_LEN];
	int err;
@@ -1700,8 +1704,10 @@ int mlxsw_core_trap_state_set(struct mlxsw_core *mlxsw_core,
		return -EINVAL;

	action = enabled ? listener->en_action : listener->dis_action;
	trap_group = enabled ? listener->en_trap_group :
			       listener->dis_trap_group;
	mlxsw_reg_hpkt_pack(hpkt_pl, action, listener->trap_id,
			    listener->trap_group, listener->is_ctrl);
			    trap_group, listener->is_ctrl);
	err = mlxsw_reg_write(mlxsw_core, MLXSW_REG(hpkt), hpkt_pl);
	if (err)
		return err;
+37 −35
Original line number Diff line number Diff line
@@ -78,7 +78,8 @@ struct mlxsw_listener {
	};
	enum mlxsw_reg_hpkt_action en_action; /* Action when enabled */
	enum mlxsw_reg_hpkt_action dis_action; /* Action when disabled */
	u8 trap_group;
	u8 en_trap_group; /* Trap group when enabled */
	u8 dis_trap_group; /* Trap group when disabled */
	u8 is_ctrl:1, /* should go via control buffer or not */
	   is_event:1,
	   enabled_on_register:1; /* Trap should be enabled when listener
@@ -86,8 +87,8 @@ struct mlxsw_listener {
				   */
};

#define __MLXSW_RXL(_func, _trap_id, _en_action, _is_ctrl, _trap_group,	\
		    _dis_action, _enabled_on_register)			\
#define __MLXSW_RXL(_func, _trap_id, _en_action, _is_ctrl, _en_trap_group,	\
		    _dis_action, _enabled_on_register, _dis_trap_group)		\
	{									\
		.trap_id = MLXSW_TRAP_ID_##_trap_id,				\
		.rx_listener =							\
@@ -98,7 +99,8 @@ struct mlxsw_listener {
		},								\
		.en_action = MLXSW_REG_HPKT_ACTION_##_en_action,		\
		.dis_action = MLXSW_REG_HPKT_ACTION_##_dis_action,		\
		.trap_group = MLXSW_REG_HTGT_TRAP_GROUP_##_trap_group,	\
		.en_trap_group = MLXSW_REG_HTGT_TRAP_GROUP_##_en_trap_group,	\
		.dis_trap_group = MLXSW_REG_HTGT_TRAP_GROUP_##_dis_trap_group,	\
		.is_ctrl = _is_ctrl,						\
		.enabled_on_register = _enabled_on_register,			\
	}
@@ -106,12 +108,12 @@ struct mlxsw_listener {
#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)
		    _dis_action, true, _trap_group)

#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_RXL_DIS(_func, _trap_id, _en_action, _is_ctrl, _en_trap_group,	\
		      _dis_action, _dis_trap_group)				\
	__MLXSW_RXL(_func, _trap_id, _en_action, _is_ctrl, _en_trap_group,	\
		    _dis_action, false, _dis_trap_group)

#define MLXSW_EVENTL(_func, _trap_id, _trap_group)				\
	{									\
@@ -122,7 +124,7 @@ struct mlxsw_listener {
			.trap_id = MLXSW_TRAP_ID_##_trap_id,			\
		},								\
		.en_action = MLXSW_REG_HPKT_ACTION_TRAP_TO_CPU,			\
		.trap_group = MLXSW_REG_HTGT_TRAP_GROUP_##_trap_group,	\
		.en_trap_group = MLXSW_REG_HTGT_TRAP_GROUP_##_trap_group,	\
		.is_event = true,						\
		.enabled_on_register = true,					\
	}
+1 −1
Original line number Diff line number Diff line
@@ -120,7 +120,7 @@ static void mlxsw_sp_rx_exception_listener(struct sk_buff *skb, u8 local_port,
#define MLXSW_SP_RXL_DISCARD(_id, _group_id)				      \
	MLXSW_RXL_DIS(mlxsw_sp_rx_drop_listener, DISCARD_##_id,		      \
		      TRAP_EXCEPTION_TO_CPU, false, SP_##_group_id,	      \
		      SET_FW_DEFAULT)
		      SET_FW_DEFAULT, SP_##_group_id)

#define MLXSW_SP_RXL_EXCEPTION(_id, _group_id, _action)			      \
	MLXSW_RXL(mlxsw_sp_rx_exception_listener, _id,			      \