mlxsw: core: Allow to register disabled traps using MLXSW_RXL_DIS
authorJiri Pirko <jiri@mellanox.com>
Mon, 24 Feb 2020 07:35:44 +0000 (08:35 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 Feb 2020 19:55:06 +0000 (11:55 -0800)
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>
drivers/net/ethernet/mellanox/mlxsw/core.c
drivers/net/ethernet/mellanox/mlxsw/core.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_trap.c

index 4b92ba5..a018682 100644 (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,
                             const struct mlxsw_listener *listener, void *priv)
 {
+       enum mlxsw_reg_hpkt_action action;
        char hpkt_pl[MLXSW_REG_HPKT_LEN];
        int err;
 
@@ -1635,7 +1636,9 @@ int mlxsw_core_trap_register(struct mlxsw_core *mlxsw_core,
        if (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);
        err = mlxsw_reg_write(mlxsw_core,  MLXSW_REG(hpkt), hpkt_pl);
        if (err)
@@ -1656,7 +1659,7 @@ void mlxsw_core_trap_unregister(struct mlxsw_core *mlxsw_core,
        char hpkt_pl[MLXSW_REG_HPKT_LEN];
 
        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->is_ctrl);
                mlxsw_reg_write(mlxsw_core, MLXSW_REG(hpkt), hpkt_pl);
index 5773e25..9c4ce3f 100644 (file)
@@ -76,15 +76,18 @@ struct mlxsw_listener {
                struct mlxsw_rx_listener rx_listener;
                struct mlxsw_event_listener event_listener;
        };
-       enum mlxsw_reg_hpkt_action action;
-       enum mlxsw_reg_hpkt_action unreg_action;
+       enum mlxsw_reg_hpkt_action en_action; /* Action when enabled */
+       enum mlxsw_reg_hpkt_action dis_action; /* Action when disabled */
        u8 trap_group;
        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,     \
-                 _unreg_action)                                        \
+#define __MLXSW_RXL(_func, _trap_id, _en_action, _is_ctrl, _trap_group,        \
+                   _dis_action, _enabled_on_register)                  \
        {                                                               \
                .trap_id = MLXSW_TRAP_ID_##_trap_id,                    \
                .rx_listener =                                          \
@@ -93,12 +96,23 @@ struct mlxsw_listener {
                        .local_port = MLXSW_PORT_DONT_CARE,             \
                        .trap_id = MLXSW_TRAP_ID_##_trap_id,            \
                },                                                      \
-               .action = MLXSW_REG_HPKT_ACTION_##_action,              \
-               .unreg_action = MLXSW_REG_HPKT_ACTION_##_unreg_action,  \
+               .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,  \
                .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)                     \
        {                                                               \
                .trap_id = MLXSW_TRAP_ID_##_trap_id,                    \
@@ -107,9 +121,10 @@ struct mlxsw_listener {
                        .func = _func,                                  \
                        .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,  \
                .is_event = true,                                       \
+               .enabled_on_register = true,                            \
        }
 
 int mlxsw_core_rx_listener_register(struct mlxsw_core *mlxsw_core,
index 1622fec..7b0fb3c 100644 (file)
@@ -118,8 +118,9 @@ static void mlxsw_sp_rx_exception_listener(struct sk_buff *skb, u8 local_port,
                             MLXSW_SP_TRAP_METADATA)
 
 #define MLXSW_SP_RXL_DISCARD(_id, _group_id)                                 \
-       MLXSW_RXL(mlxsw_sp_rx_drop_listener, DISCARD_##_id, SET_FW_DEFAULT,   \
-                 false, SP_##_group_id, SET_FW_DEFAULT)
+       MLXSW_RXL_DIS(mlxsw_sp_rx_drop_listener, DISCARD_##_id,               \
+                     TRAP_EXCEPTION_TO_CPU, false, SP_##_group_id,           \
+                     SET_FW_DEFAULT)
 
 #define MLXSW_SP_RXL_EXCEPTION(_id, _group_id, _action)                              \
        MLXSW_RXL(mlxsw_sp_rx_exception_listener, _id,                        \