net/mlx5: Register to devlink ingress VLAN filter trap
authorAya Levin <ayal@nvidia.com>
Tue, 26 Jan 2021 23:24:08 +0000 (15:24 -0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 28 Jan 2021 03:53:50 +0000 (19:53 -0800)
Add traps registration to mlx5_core devlink register/unregister flow.
This patch registers INGRESS_VLAN_FILTER trap.

Signed-off-by: Aya Levin <ayal@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/devlink.c

index f04afaf785cb1fdb57af4bf0eca37fe551037a70..8c2f886ac78e83fff9c2f955f47130c1e9873afa 100644 (file)
@@ -442,6 +442,48 @@ static void mlx5_devlink_set_params_init_values(struct devlink *devlink)
 #endif
 }
 
+#define MLX5_TRAP_DROP(_id, _group_id)                                 \
+       DEVLINK_TRAP_GENERIC(DROP, DROP, _id,                           \
+                            DEVLINK_TRAP_GROUP_GENERIC_ID_##_group_id, \
+                            DEVLINK_TRAP_METADATA_TYPE_F_IN_PORT)
+
+static const struct devlink_trap mlx5_traps_arr[] = {
+       MLX5_TRAP_DROP(INGRESS_VLAN_FILTER, L2_DROPS),
+};
+
+static const struct devlink_trap_group mlx5_trap_groups_arr[] = {
+       DEVLINK_TRAP_GROUP_GENERIC(L2_DROPS, 0),
+};
+
+static int mlx5_devlink_traps_register(struct devlink *devlink)
+{
+       struct mlx5_core_dev *core_dev = devlink_priv(devlink);
+       int err;
+
+       err = devlink_trap_groups_register(devlink, mlx5_trap_groups_arr,
+                                          ARRAY_SIZE(mlx5_trap_groups_arr));
+       if (err)
+               return err;
+
+       err = devlink_traps_register(devlink, mlx5_traps_arr, ARRAY_SIZE(mlx5_traps_arr),
+                                    &core_dev->priv);
+       if (err)
+               goto err_trap_group;
+       return 0;
+
+err_trap_group:
+       devlink_trap_groups_unregister(devlink, mlx5_trap_groups_arr,
+                                      ARRAY_SIZE(mlx5_trap_groups_arr));
+       return err;
+}
+
+static void mlx5_devlink_traps_unregister(struct devlink *devlink)
+{
+       devlink_traps_unregister(devlink, mlx5_traps_arr, ARRAY_SIZE(mlx5_traps_arr));
+       devlink_trap_groups_unregister(devlink, mlx5_trap_groups_arr,
+                                      ARRAY_SIZE(mlx5_trap_groups_arr));
+}
+
 int mlx5_devlink_register(struct devlink *devlink, struct device *dev)
 {
        int err;
@@ -456,8 +498,16 @@ int mlx5_devlink_register(struct devlink *devlink, struct device *dev)
                goto params_reg_err;
        mlx5_devlink_set_params_init_values(devlink);
        devlink_params_publish(devlink);
+
+       err = mlx5_devlink_traps_register(devlink);
+       if (err)
+               goto traps_reg_err;
+
        return 0;
 
+traps_reg_err:
+       devlink_params_unregister(devlink, mlx5_devlink_params,
+                                 ARRAY_SIZE(mlx5_devlink_params));
 params_reg_err:
        devlink_unregister(devlink);
        return err;
@@ -465,6 +515,7 @@ params_reg_err:
 
 void mlx5_devlink_unregister(struct devlink *devlink)
 {
+       mlx5_devlink_traps_unregister(devlink);
        devlink_params_unregister(devlink, mlx5_devlink_params,
                                  ARRAY_SIZE(mlx5_devlink_params));
        devlink_unregister(devlink);