mlxsw: core: Add API to set trap action
authorIdo Schimmel <idosch@mellanox.com>
Wed, 21 Aug 2019 07:19:31 +0000 (10:19 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 21 Aug 2019 19:58:39 +0000 (12:58 -0700)
Up until now the action of a trap was never changed during its lifetime.
This is going to change by subsequent patches that will allow devlink to
control the action of certain traps.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Acked-by: Jiri Pirko <jiri@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

index 17ceac7..6ec07ec 100644 (file)
@@ -1477,6 +1477,18 @@ void mlxsw_core_trap_unregister(struct mlxsw_core *mlxsw_core,
 }
 EXPORT_SYMBOL(mlxsw_core_trap_unregister);
 
+int mlxsw_core_trap_action_set(struct mlxsw_core *mlxsw_core,
+                              const struct mlxsw_listener *listener,
+                              enum mlxsw_reg_hpkt_action action)
+{
+       char hpkt_pl[MLXSW_REG_HPKT_LEN];
+
+       mlxsw_reg_hpkt_pack(hpkt_pl, action, listener->trap_id,
+                           listener->trap_group, listener->is_ctrl);
+       return mlxsw_reg_write(mlxsw_core, MLXSW_REG(hpkt), hpkt_pl);
+}
+EXPORT_SYMBOL(mlxsw_core_trap_action_set);
+
 static u64 mlxsw_core_tid_get(struct mlxsw_core *mlxsw_core)
 {
        return atomic64_inc_return(&mlxsw_core->emad.tid);
index 8efcff4..19cea16 100644 (file)
@@ -128,6 +128,9 @@ int mlxsw_core_trap_register(struct mlxsw_core *mlxsw_core,
 void mlxsw_core_trap_unregister(struct mlxsw_core *mlxsw_core,
                                const struct mlxsw_listener *listener,
                                void *priv);
+int mlxsw_core_trap_action_set(struct mlxsw_core *mlxsw_core,
+                              const struct mlxsw_listener *listener,
+                              enum mlxsw_reg_hpkt_action action);
 
 typedef void mlxsw_reg_trans_cb_t(struct mlxsw_core *mlxsw_core, char *payload,
                                  size_t payload_len, unsigned long cb_priv);