mlxsw: spectrum: Extract a helper for trap registration
authorPetr Machata <petrm@mellanox.com>
Sun, 30 Jun 2019 06:04:49 +0000 (09:04 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 2 Jul 2019 01:58:34 +0000 (18:58 -0700)
On Spectrum-1, timestamps for PTP packets are delivered through queues
of ingress and egress timestamps. There are two event traps
corresponding to activity on each of those queues. This mechanism is
absent on Spectrum-2, and therefore the traps should only be registered
on Spectrum-1.

Extract out of mlxsw_sp_traps_init() a generic helper,
mlxsw_sp_traps_register(), and likewise with _unregister(). The new helpers
will later be called with Spectrum-1-specific traps.

Signed-off-by: Petr Machata <petrm@mellanox.com>
Acked-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/spectrum.c

index 3e8593824b33c2eb692696f34b4b854fac5aa179..0119efe0ea7a86939d83bc48818952f7fc60bebb 100644 (file)
@@ -4251,22 +4251,16 @@ static int mlxsw_sp_trap_groups_set(struct mlxsw_core *mlxsw_core)
        return 0;
 }
 
-static int mlxsw_sp_traps_init(struct mlxsw_sp *mlxsw_sp)
+static int mlxsw_sp_traps_register(struct mlxsw_sp *mlxsw_sp,
+                                  const struct mlxsw_listener listeners[],
+                                  size_t listeners_count)
 {
        int i;
        int err;
 
-       err = mlxsw_sp_cpu_policers_set(mlxsw_sp->core);
-       if (err)
-               return err;
-
-       err = mlxsw_sp_trap_groups_set(mlxsw_sp->core);
-       if (err)
-               return err;
-
-       for (i = 0; i < ARRAY_SIZE(mlxsw_sp_listener); i++) {
+       for (i = 0; i < listeners_count; i++) {
                err = mlxsw_core_trap_register(mlxsw_sp->core,
-                                              &mlxsw_sp_listener[i],
+                                              &listeners[i],
                                               mlxsw_sp);
                if (err)
                        goto err_listener_register;
@@ -4277,23 +4271,47 @@ static int mlxsw_sp_traps_init(struct mlxsw_sp *mlxsw_sp)
 err_listener_register:
        for (i--; i >= 0; i--) {
                mlxsw_core_trap_unregister(mlxsw_sp->core,
-                                          &mlxsw_sp_listener[i],
+                                          &listeners[i],
                                           mlxsw_sp);
        }
        return err;
 }
 
-static void mlxsw_sp_traps_fini(struct mlxsw_sp *mlxsw_sp)
+static void mlxsw_sp_traps_unregister(struct mlxsw_sp *mlxsw_sp,
+                                     const struct mlxsw_listener listeners[],
+                                     size_t listeners_count)
 {
        int i;
 
-       for (i = 0; i < ARRAY_SIZE(mlxsw_sp_listener); i++) {
+       for (i = 0; i < listeners_count; i++) {
                mlxsw_core_trap_unregister(mlxsw_sp->core,
-                                          &mlxsw_sp_listener[i],
+                                          &listeners[i],
                                           mlxsw_sp);
        }
 }
 
+static int mlxsw_sp_traps_init(struct mlxsw_sp *mlxsw_sp)
+{
+       int err;
+
+       err = mlxsw_sp_cpu_policers_set(mlxsw_sp->core);
+       if (err)
+               return err;
+
+       err = mlxsw_sp_trap_groups_set(mlxsw_sp->core);
+       if (err)
+               return err;
+
+       return mlxsw_sp_traps_register(mlxsw_sp, mlxsw_sp_listener,
+                                      ARRAY_SIZE(mlxsw_sp_listener));
+}
+
+static void mlxsw_sp_traps_fini(struct mlxsw_sp *mlxsw_sp)
+{
+       mlxsw_sp_traps_unregister(mlxsw_sp, mlxsw_sp_listener,
+                                 ARRAY_SIZE(mlxsw_sp_listener));
+}
+
 #define MLXSW_SP_LAG_SEED_INIT 0xcafecafe
 
 static int mlxsw_sp_lag_init(struct mlxsw_sp *mlxsw_sp)