xref: /linux/drivers/net/wireless/ath/ath12k/debugfs.c (revision daa121128a2d2ac6006159e2c47676e4fcd21eab)
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
5  */
6 
7 #include "core.h"
8 #include "debugfs.h"
9 
10 static ssize_t ath12k_write_simulate_radar(struct file *file,
11 					   const char __user *user_buf,
12 					   size_t count, loff_t *ppos)
13 {
14 	struct ath12k *ar = file->private_data;
15 	int ret;
16 
17 	mutex_lock(&ar->conf_mutex);
18 	ret = ath12k_wmi_simulate_radar(ar);
19 	if (ret)
20 		goto exit;
21 
22 	ret = count;
23 exit:
24 	mutex_unlock(&ar->conf_mutex);
25 	return ret;
26 }
27 
28 static const struct file_operations fops_simulate_radar = {
29 	.write = ath12k_write_simulate_radar,
30 	.open = simple_open
31 };
32 
33 void ath12k_debugfs_soc_create(struct ath12k_base *ab)
34 {
35 	bool dput_needed;
36 	char soc_name[64] = { 0 };
37 	struct dentry *debugfs_ath12k;
38 
39 	debugfs_ath12k = debugfs_lookup("ath12k", NULL);
40 	if (debugfs_ath12k) {
41 		/* a dentry from lookup() needs dput() after we don't use it */
42 		dput_needed = true;
43 	} else {
44 		debugfs_ath12k = debugfs_create_dir("ath12k", NULL);
45 		if (IS_ERR_OR_NULL(debugfs_ath12k))
46 			return;
47 		dput_needed = false;
48 	}
49 
50 	scnprintf(soc_name, sizeof(soc_name), "%s-%s", ath12k_bus_str(ab->hif.bus),
51 		  dev_name(ab->dev));
52 
53 	ab->debugfs_soc = debugfs_create_dir(soc_name, debugfs_ath12k);
54 
55 	if (dput_needed)
56 		dput(debugfs_ath12k);
57 }
58 
59 void ath12k_debugfs_soc_destroy(struct ath12k_base *ab)
60 {
61 	debugfs_remove_recursive(ab->debugfs_soc);
62 	ab->debugfs_soc = NULL;
63 	/* We are not removing ath12k directory on purpose, even if it
64 	 * would be empty. This simplifies the directory handling and it's
65 	 * a minor cosmetic issue to leave an empty ath12k directory to
66 	 * debugfs.
67 	 */
68 }
69 
70 void ath12k_debugfs_register(struct ath12k *ar)
71 {
72 	struct ath12k_base *ab = ar->ab;
73 	struct ieee80211_hw *hw = ar->ah->hw;
74 	char pdev_name[5];
75 	char buf[100] = {0};
76 
77 	scnprintf(pdev_name, sizeof(pdev_name), "%s%d", "mac", ar->pdev_idx);
78 
79 	ar->debug.debugfs_pdev = debugfs_create_dir(pdev_name, ab->debugfs_soc);
80 
81 	/* Create a symlink under ieee80211/phy* */
82 	scnprintf(buf, sizeof(buf), "../../ath12k/%pd2", ar->debug.debugfs_pdev);
83 	debugfs_create_symlink("ath12k", hw->wiphy->debugfsdir, buf);
84 
85 	if (ar->mac.sbands[NL80211_BAND_5GHZ].channels) {
86 		debugfs_create_file("dfs_simulate_radar", 0200,
87 				    ar->debug.debugfs_pdev, ar,
88 				    &fops_simulate_radar);
89 	}
90 }
91