wifi: ath11k: debugfs: fix to work with multiple PCI devices
[platform/kernel/linux-starfive.git] / drivers / net / wireless / ath / ath11k / debugfs.c
index ccdf3d5..5bb6fd1 100644 (file)
@@ -976,10 +976,6 @@ int ath11k_debugfs_pdev_create(struct ath11k_base *ab)
        if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
                return 0;
 
-       ab->debugfs_soc = debugfs_create_dir(ab->hw_params.name, ab->debugfs_ath11k);
-       if (IS_ERR(ab->debugfs_soc))
-               return PTR_ERR(ab->debugfs_soc);
-
        debugfs_create_file("simulate_fw_crash", 0600, ab->debugfs_soc, ab,
                            &fops_simulate_fw_crash);
 
@@ -1001,15 +997,51 @@ void ath11k_debugfs_pdev_destroy(struct ath11k_base *ab)
 
 int ath11k_debugfs_soc_create(struct ath11k_base *ab)
 {
-       ab->debugfs_ath11k = debugfs_create_dir("ath11k", NULL);
+       struct dentry *root;
+       bool dput_needed;
+       char name[64];
+       int ret;
+
+       root = debugfs_lookup("ath11k", NULL);
+       if (!root) {
+               root = debugfs_create_dir("ath11k", NULL);
+               if (IS_ERR_OR_NULL(root))
+                       return PTR_ERR(root);
+
+               dput_needed = false;
+       } else {
+               /* a dentry from lookup() needs dput() after we don't use it */
+               dput_needed = true;
+       }
+
+       scnprintf(name, sizeof(name), "%s-%s", ath11k_bus_str(ab->hif.bus),
+                 dev_name(ab->dev));
+
+       ab->debugfs_soc = debugfs_create_dir(name, root);
+       if (IS_ERR_OR_NULL(ab->debugfs_soc)) {
+               ret = PTR_ERR(ab->debugfs_soc);
+               goto out;
+       }
+
+       ret = 0;
 
-       return PTR_ERR_OR_ZERO(ab->debugfs_ath11k);
+out:
+       if (dput_needed)
+               dput(root);
+
+       return ret;
 }
 
 void ath11k_debugfs_soc_destroy(struct ath11k_base *ab)
 {
-       debugfs_remove_recursive(ab->debugfs_ath11k);
-       ab->debugfs_ath11k = NULL;
+       debugfs_remove_recursive(ab->debugfs_soc);
+       ab->debugfs_soc = NULL;
+
+       /* We are not removing ath11k directory on purpose, even if it
+        * would be empty. This simplifies the directory handling and it's
+        * a minor cosmetic issue to leave an empty ath11k directory to
+        * debugfs.
+        */
 }
 EXPORT_SYMBOL(ath11k_debugfs_soc_destroy);