Patch "wifi: ath11k: debugfs: fix to work with multiple PCI devices" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    wifi: ath11k: debugfs: fix to work with multiple PCI devices

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     wifi-ath11k-debugfs-fix-to-work-with-multiple-pci-de.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 5ca6f914763a45a9c43e546b7994a6aa19ed6783
Author: Kalle Valo <quic_kvalo@xxxxxxxxxxx>
Date:   Thu Dec 22 19:15:59 2022 +0200

    wifi: ath11k: debugfs: fix to work with multiple PCI devices
    
    [ Upstream commit 323d91d4684d238f6bc3693fed93caf795378fe0 ]
    
    ath11k fails to load if there are multiple ath11k PCI devices with same name:
    
     ath11k_pci 0000:01:00.0: Hardware name qcn9074 hw1.0
     debugfs: Directory 'ath11k' with parent '/' already present!
     ath11k_pci 0000:01:00.0: failed to create ath11k debugfs
     ath11k_pci 0000:01:00.0: failed to create soc core: -17
     ath11k_pci 0000:01:00.0: failed to init core: -17
     ath11k_pci: probe of 0000:01:00.0 failed with error -17
    
    Fix this by creating a directory for each ath11k device using schema
    <bus>-<devname>, for example "pci-0000:06:00.0". This directory created under
    the top-level ath11k directory, for example /sys/kernel/debug/ath11k.
    
    The reference to the toplevel ath11k directory is not stored anymore within ath11k, instead
    it's retrieved using debugfs_lookup(). If the directory does not exist it will
    be created. After the last directory from the ath11k directory is removed, for
    example when doing rmmod ath11k, the empty ath11k directory is left in place,
    it's a minor cosmetic issue anyway.
    
    Here's an example hierarchy with one WCN6855:
    
    ath11k
    `-- pci-0000:06:00.0
        |-- mac0
        |   |-- dfs_block_radar_events
        |   |-- dfs_simulate_radar
        |   |-- ext_rx_stats
        |   |-- ext_tx_stats
        |   |-- fw_dbglog_config
        |   |-- fw_stats
        |   |   |-- beacon_stats
        |   |   |-- pdev_stats
        |   |   `-- vdev_stats
        |   |-- htt_stats
        |   |-- htt_stats_reset
        |   |-- htt_stats_type
        |   `-- pktlog_filter
        |-- simulate_fw_crash
        `-- soc_dp_stats
    
    I didn't have a test setup where I could connect multiple ath11k devices to the
    same the host, so I have only tested this with one device.
    
    Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.9
    Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1
    Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1
    
    Tested-by: Robert Marko <robert.marko@xxxxxxxxxx>
    Signed-off-by: Kalle Valo <quic_kvalo@xxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20221220121231.20120-1-kvalo@xxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/wireless/ath/ath11k/core.h b/drivers/net/wireless/ath/ath11k/core.h
index d2f2898d17b49..a66e275af1eb4 100644
--- a/drivers/net/wireless/ath/ath11k/core.h
+++ b/drivers/net/wireless/ath/ath11k/core.h
@@ -712,7 +712,6 @@ struct ath11k_base {
 	enum ath11k_dfs_region dfs_region;
 #ifdef CONFIG_ATH11K_DEBUGFS
 	struct dentry *debugfs_soc;
-	struct dentry *debugfs_ath11k;
 #endif
 	struct ath11k_soc_dp_stats soc_stats;
 
diff --git a/drivers/net/wireless/ath/ath11k/debugfs.c b/drivers/net/wireless/ath/ath11k/debugfs.c
index 1b914e67d314d..196314ab4ff0b 100644
--- a/drivers/net/wireless/ath/ath11k/debugfs.c
+++ b/drivers/net/wireless/ath/ath11k/debugfs.c
@@ -836,10 +836,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);
 
@@ -857,15 +853,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.
+	 */
 }
 
 void ath11k_debugfs_fw_stats_init(struct ath11k *ar)



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux