mlxsw: spectrum: Extend mlxsw_afa_ops for counter index and implement for Spectrum
authorJiri Pirko <jiri@mellanox.com>
Fri, 19 Jan 2018 08:24:46 +0000 (09:24 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sun, 21 Jan 2018 23:21:30 +0000 (18:21 -0500)
Introduce extension of mlxsw_afa_ops in order to get/put counter indexes
and implement the ops for Spectrum.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/core_acl_flex_actions.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_actions.c

index a8d3314c3a2477ae52b9a7f6e32c11686bff6d5f..89f977996ae29c506cdc2c9b0554fc3c0782c4da 100644 (file)
@@ -46,6 +46,8 @@ struct mlxsw_afa_ops {
        void (*kvdl_set_del)(void *priv, u32 kvdl_index, bool is_first);
        int (*kvdl_fwd_entry_add)(void *priv, u32 *p_kvdl_index, u8 local_port);
        void (*kvdl_fwd_entry_del)(void *priv, u32 kvdl_index);
+       int (*counter_index_get)(void *priv, unsigned int *p_counter_index);
+       void (*counter_index_put)(void *priv, unsigned int counter_index);
 };
 
 struct mlxsw_afa *mlxsw_afa_create(unsigned int max_acts_per_set,
index 4d3340ed029197761437963185cce7ae2039e90d..dae4d020024d8c6d2e3bee09b95fba1b1677e669 100644 (file)
@@ -108,11 +108,29 @@ static void mlxsw_sp_act_kvdl_fwd_entry_del(void *priv, u32 kvdl_index)
        mlxsw_sp_kvdl_free(mlxsw_sp, kvdl_index);
 }
 
+static int
+mlxsw_sp_act_counter_index_get(void *priv, unsigned int *p_counter_index)
+{
+       struct mlxsw_sp *mlxsw_sp = priv;
+
+       return mlxsw_sp_flow_counter_alloc(mlxsw_sp, p_counter_index);
+}
+
+static void
+mlxsw_sp_act_counter_index_put(void *priv, unsigned int counter_index)
+{
+       struct mlxsw_sp *mlxsw_sp = priv;
+
+       mlxsw_sp_flow_counter_free(mlxsw_sp, counter_index);
+}
+
 static const struct mlxsw_afa_ops mlxsw_sp_act_afa_ops = {
        .kvdl_set_add           = mlxsw_sp_act_kvdl_set_add,
        .kvdl_set_del           = mlxsw_sp_act_kvdl_set_del,
        .kvdl_fwd_entry_add     = mlxsw_sp_act_kvdl_fwd_entry_add,
        .kvdl_fwd_entry_del     = mlxsw_sp_act_kvdl_fwd_entry_del,
+       .counter_index_get      = mlxsw_sp_act_counter_index_get,
+       .counter_index_put      = mlxsw_sp_act_counter_index_put,
 };
 
 int mlxsw_sp_afa_init(struct mlxsw_sp *mlxsw_sp)