mlxsw: spectrum_trap: Split sampling traps between ASICs
authorIdo Schimmel <idosch@nvidia.com>
Thu, 11 Mar 2021 12:24:15 +0000 (14:24 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 12 Mar 2021 00:22:39 +0000 (16:22 -0800)
Sampling of ingress packets is supported using a dedicated sampling
mechanism on all Spectrum ASICs. However, Spectrum-2 and later ASICs
support more sophisticated sampling by mirroring packets to the CPU.

As a preparation for more advanced sampling configurations, split the trap
configuration used for sampled packets between Spectrum-1 and later ASICs.

This is needed since packets that are mirrored to the CPU are trapped
via a different trap identifier compared to packets that are sampled
using the dedicated sampling mechanism.

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

index 4ef12e3..6ecc77f 100644 (file)
@@ -464,11 +464,6 @@ static const struct mlxsw_sp_trap_group_item mlxsw_sp_trap_group_items_arr[] = {
                .priority = 2,
        },
        {
-               .group = DEVLINK_TRAP_GROUP_GENERIC(ACL_SAMPLE, 0),
-               .hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_PKT_SAMPLE,
-               .priority = 0,
-       },
-       {
                .group = DEVLINK_TRAP_GROUP_GENERIC(ACL_TRAP, 18),
                .hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_FLOW_LOGGING,
                .priority = 4,
@@ -993,14 +988,6 @@ static const struct mlxsw_sp_trap_item mlxsw_sp_trap_items_arr[] = {
                },
        },
        {
-               .trap = MLXSW_SP_TRAP_CONTROL(FLOW_ACTION_SAMPLE, ACL_SAMPLE,
-                                             MIRROR),
-               .listeners_arr = {
-                       MLXSW_RXL(mlxsw_sp_rx_sample_listener, PKT_SAMPLE,
-                                 MIRROR_TO_CPU, false, SP_PKT_SAMPLE, DISCARD),
-               },
-       },
-       {
                .trap = MLXSW_SP_TRAP_CONTROL(FLOW_ACTION_TRAP, ACL_TRAP, TRAP),
                .listeners_arr = {
                        MLXSW_SP_RXL_NO_MARK(ACL0, FLOW_LOGGING, TRAP_TO_CPU,
@@ -1709,10 +1696,23 @@ int mlxsw_sp_trap_group_policer_hw_id_get(struct mlxsw_sp *mlxsw_sp, u16 id,
 
 static const struct mlxsw_sp_trap_group_item
 mlxsw_sp1_trap_group_items_arr[] = {
+       {
+               .group = DEVLINK_TRAP_GROUP_GENERIC(ACL_SAMPLE, 0),
+               .hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_PKT_SAMPLE,
+               .priority = 0,
+       },
 };
 
 static const struct mlxsw_sp_trap_item
 mlxsw_sp1_trap_items_arr[] = {
+       {
+               .trap = MLXSW_SP_TRAP_CONTROL(FLOW_ACTION_SAMPLE, ACL_SAMPLE,
+                                             MIRROR),
+               .listeners_arr = {
+                       MLXSW_RXL(mlxsw_sp_rx_sample_listener, PKT_SAMPLE,
+                                 MIRROR_TO_CPU, false, SP_PKT_SAMPLE, DISCARD),
+               },
+       },
 };
 
 static int
@@ -1749,6 +1749,11 @@ mlxsw_sp2_trap_group_items_arr[] = {
                .priority = 0,
                .fixed_policer = true,
        },
+       {
+               .group = DEVLINK_TRAP_GROUP_GENERIC(ACL_SAMPLE, 0),
+               .hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_PKT_SAMPLE,
+               .priority = 0,
+       },
 };
 
 static const struct mlxsw_sp_trap_item
@@ -1760,6 +1765,14 @@ mlxsw_sp2_trap_items_arr[] = {
                },
                .is_source = true,
        },
+       {
+               .trap = MLXSW_SP_TRAP_CONTROL(FLOW_ACTION_SAMPLE, ACL_SAMPLE,
+                                             MIRROR),
+               .listeners_arr = {
+                       MLXSW_RXL(mlxsw_sp_rx_sample_listener, PKT_SAMPLE,
+                                 MIRROR_TO_CPU, false, SP_PKT_SAMPLE, DISCARD),
+               },
+       },
 };
 
 static int