DEVLINK_TRAP_GROUP_GENERIC(L2_DROPS, 0),
 };
 
-static int mlx5_devlink_traps_register(struct devlink *devlink)
+int mlx5_devlink_traps_register(struct devlink *devlink)
 {
        struct mlx5_core_dev *core_dev = devlink_priv(devlink);
        int err;
        return err;
 }
 
-static void mlx5_devlink_traps_unregister(struct devlink *devlink)
+void mlx5_devlink_traps_unregister(struct devlink *devlink)
 {
        devl_traps_unregister(devlink, mlx5_traps_arr, ARRAY_SIZE(mlx5_traps_arr));
        devl_trap_groups_unregister(devlink, mlx5_trap_groups_arr,
        if (err)
                goto max_uc_list_err;
 
-       err = mlx5_devlink_traps_register(devlink);
-       if (err)
-               goto traps_reg_err;
-
        if (!mlx5_core_is_mp_slave(dev))
                devlink_set_features(devlink, DEVLINK_F_RELOAD);
 
        return 0;
 
-traps_reg_err:
-       mlx5_devlink_max_uc_list_param_unregister(devlink);
 max_uc_list_err:
        mlx5_devlink_auxdev_params_unregister(devlink);
 auxdev_reg_err:
 
 void mlx5_devlink_unregister(struct devlink *devlink)
 {
-       mlx5_devlink_traps_unregister(devlink);
        mlx5_devlink_max_uc_list_param_unregister(devlink);
        mlx5_devlink_auxdev_params_unregister(devlink);
        devlink_params_unregister(devlink, mlx5_devlink_params,
 
 int mlx5_devlink_trap_get_num_active(struct mlx5_core_dev *dev);
 int mlx5_devlink_traps_get_action(struct mlx5_core_dev *dev, int trap_id,
                                  enum devlink_trap_action *action);
+int mlx5_devlink_traps_register(struct devlink *devlink);
+void mlx5_devlink_traps_unregister(struct devlink *devlink);
 
 struct devlink *mlx5_devlink_alloc(struct device *dev);
 void mlx5_devlink_free(struct devlink *devlink);
 
 
        mlx5_sf_dev_table_create(dev);
 
+       err = mlx5_devlink_traps_register(priv_to_devlink(dev));
+       if (err)
+               goto err_traps_reg;
+
        return 0;
 
+err_traps_reg:
+       mlx5_sf_dev_table_destroy(dev);
+       mlx5_sriov_detach(dev);
 err_sriov:
        mlx5_lag_remove_mdev(dev);
        mlx5_ec_cleanup(dev);
 
 static void mlx5_unload(struct mlx5_core_dev *dev)
 {
+       mlx5_devlink_traps_unregister(priv_to_devlink(dev));
        mlx5_sf_dev_table_destroy(dev);
        mlx5_sriov_detach(dev);
        mlx5_eswitch_disable(dev->priv.eswitch);