goto err_release_fw;
        }
 
-       status = ath10k_debug_create(ar);
+       status = ath10k_debug_register(ar);
        if (status) {
                ath10k_err(ar, "unable to initialize debugfs\n");
                goto err_unregister_mac;
 
        ath10k_core_free_firmware_files(ar);
 
-       ath10k_debug_destroy(ar);
+       ath10k_debug_unregister(ar);
 }
 EXPORT_SYMBOL(ath10k_core_unregister);
 
                                  const struct ath10k_hif_ops *hif_ops)
 {
        struct ath10k *ar;
+       int ret;
 
        ar = ath10k_mac_create(priv_size);
        if (!ar)
 
        ar->workqueue = create_singlethread_workqueue("ath10k_wq");
        if (!ar->workqueue)
-               goto err_wq;
+               goto err_free_mac;
 
        mutex_init(&ar->conf_mutex);
        spin_lock_init(&ar->data_lock);
        INIT_WORK(&ar->register_work, ath10k_core_register_work);
        INIT_WORK(&ar->restart_work, ath10k_core_restart);
 
+       ret = ath10k_debug_create(ar);
+       if (ret)
+               goto err_free_wq;
+
        return ar;
 
-err_wq:
+err_free_wq:
+       destroy_workqueue(ar->workqueue);
+
+err_free_mac:
        ath10k_mac_destroy(ar);
+
        return NULL;
 }
 EXPORT_SYMBOL(ath10k_core_create);
        flush_workqueue(ar->workqueue);
        destroy_workqueue(ar->workqueue);
 
+       ath10k_debug_destroy(ar);
        ath10k_mac_destroy(ar);
 }
 EXPORT_SYMBOL(ath10k_core_destroy);
 
 
 int ath10k_debug_create(struct ath10k *ar)
 {
-       int ret;
-
        ar->debug.fw_crash_data = vzalloc(sizeof(*ar->debug.fw_crash_data));
-       if (!ar->debug.fw_crash_data) {
-               ret = -ENOMEM;
-               goto err;
-       }
+       if (!ar->debug.fw_crash_data)
+               return -ENOMEM;
 
+       return 0;
+}
+
+void ath10k_debug_destroy(struct ath10k *ar)
+{
+       vfree(ar->debug.fw_crash_data);
+       ar->debug.fw_crash_data = NULL;
+}
+
+int ath10k_debug_register(struct ath10k *ar)
+{
        ar->debug.debugfs_phy = debugfs_create_dir("ath10k",
                                                   ar->hw->wiphy->debugfsdir);
-       if (!ar->debug.debugfs_phy) {
-               ret = -ENOMEM;
-               goto err_free_fw_crash_data;
-       }
+       if (!ar->debug.debugfs_phy)
+               return -ENOMEM;
 
        INIT_DELAYED_WORK(&ar->debug.htt_stats_dwork,
                          ath10k_debug_htt_stats_dwork);
        }
 
        return 0;
-
-err_free_fw_crash_data:
-       vfree(ar->debug.fw_crash_data);
-
-err:
-       return ret;
 }
 
-void ath10k_debug_destroy(struct ath10k *ar)
+void ath10k_debug_unregister(struct ath10k *ar)
 {
-       vfree(ar->debug.fw_crash_data);
        cancel_delayed_work_sync(&ar->debug.htt_stats_dwork);
 }
 
 
 void ath10k_debug_stop(struct ath10k *ar);
 int ath10k_debug_create(struct ath10k *ar);
 void ath10k_debug_destroy(struct ath10k *ar);
+int ath10k_debug_register(struct ath10k *ar);
+void ath10k_debug_unregister(struct ath10k *ar);
 void ath10k_debug_read_service_map(struct ath10k *ar,
                                   void *service_map,
                                   size_t map_size);
 {
 }
 
+static inline int ath10k_debug_register(struct ath10k *ar)
+{
+       return 0;
+}
+
+static inline void ath10k_debug_unregister(struct ath10k *ar)
+{
+}
+
 static inline void ath10k_debug_read_service_map(struct ath10k *ar,
                                                 void *service_map,
                                                 size_t map_size)