]> www.infradead.org Git - linux.git/commitdiff
wifi: rtw89: debugfs: support multiple adapters debugging
authorPing-Ke Shih <pkshih@realtek.com>
Fri, 16 Aug 2024 11:57:00 +0000 (19:57 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Thu, 22 Aug 2024 02:03:24 +0000 (10:03 +0800)
The rtw89 uses debugfs to access registers and driver states. To get
a range of registers, the range value is set and stored to a variable, and
get the set of register values by the stored range. However, the variable
is a static global variable, which multiple adapters will be a problem,
so move the variable to adapter context rtw89_dev.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20240816115700.17390-1-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/debug.c
drivers/net/wireless/realtek/rtw89/debug.h

index 7b28f2c2a08eb42c96f187772a6d62376ec39e0a..885c759e694a0803abab1fb4bd13b5bbce314520 100644 (file)
@@ -4767,6 +4767,8 @@ EXPORT_SYMBOL(rtw89_core_register);
 void rtw89_core_unregister(struct rtw89_dev *rtwdev)
 {
        rtw89_core_unregister_hw(rtwdev);
+
+       rtw89_debugfs_deinit(rtwdev);
 }
 EXPORT_SYMBOL(rtw89_core_unregister);
 
index 3edb2f4372e441166ce08737f77027b67ebfabc9..c4702882367e688b0d775469a735eaa2aee29714 100644 (file)
@@ -21,6 +21,7 @@ struct rtw89_efuse_block_cfg;
 struct rtw89_h2c_rf_tssi;
 struct rtw89_fw_txpwr_track_cfg;
 struct rtw89_phy_rfk_log_fmt;
+struct rtw89_debugfs;
 
 extern const struct ieee80211_ops rtw89_ops;
 
@@ -5529,6 +5530,8 @@ struct rtw89_dev {
        struct napi_struct napi;
        int napi_budget_countdown;
 
+       struct rtw89_debugfs *debugfs;
+
        /* HCI related data, keep last */
        u8 priv[] __aligned(sizeof(void *));
 };
index bb65b814585a580b91918f0ef395677898bc13fc..29f85210f91964bade6ccada1a1224aa2f411528 100644 (file)
@@ -52,6 +52,27 @@ struct rtw89_debugfs_priv {
        };
 };
 
+struct rtw89_debugfs {
+       struct rtw89_debugfs_priv read_reg;
+       struct rtw89_debugfs_priv write_reg;
+       struct rtw89_debugfs_priv read_rf;
+       struct rtw89_debugfs_priv write_rf;
+       struct rtw89_debugfs_priv rf_reg_dump;
+       struct rtw89_debugfs_priv txpwr_table;
+       struct rtw89_debugfs_priv mac_reg_dump;
+       struct rtw89_debugfs_priv mac_mem_dump;
+       struct rtw89_debugfs_priv mac_dbg_port_dump;
+       struct rtw89_debugfs_priv send_h2c;
+       struct rtw89_debugfs_priv early_h2c;
+       struct rtw89_debugfs_priv fw_crash;
+       struct rtw89_debugfs_priv btc_info;
+       struct rtw89_debugfs_priv btc_manual;
+       struct rtw89_debugfs_priv fw_log_manual;
+       struct rtw89_debugfs_priv phy_info;
+       struct rtw89_debugfs_priv stations;
+       struct rtw89_debugfs_priv disable_dm;
+};
+
 static const u16 rtw89_rate_info_bw_to_mhz_map[] = {
        [RATE_INFO_BW_20] = 20,
        [RATE_INFO_BW_40] = 40,
@@ -3463,9 +3484,9 @@ static ssize_t rtw89_debug_priv_btc_manual_set(struct file *filp,
        return count;
 }
 
-static ssize_t rtw89_debug_fw_log_manual_set(struct file *filp,
-                                            const char __user *user_buf,
-                                            size_t count, loff_t *loff)
+static ssize_t rtw89_debug_priv_fw_log_manual_set(struct file *filp,
+                                                 const char __user *user_buf,
+                                                 size_t count, loff_t *loff)
 {
        struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
        struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
@@ -3854,92 +3875,55 @@ rtw89_debug_priv_disable_dm_set(struct file *filp, const char __user *user_buf,
        return count;
 }
 
-static struct rtw89_debugfs_priv rtw89_debug_priv_read_reg = {
-       .cb_read = rtw89_debug_priv_read_reg_get,
-       .cb_write = rtw89_debug_priv_read_reg_select,
-};
-
-static struct rtw89_debugfs_priv rtw89_debug_priv_write_reg = {
-       .cb_write = rtw89_debug_priv_write_reg_set,
-};
-
-static struct rtw89_debugfs_priv rtw89_debug_priv_read_rf = {
-       .cb_read = rtw89_debug_priv_read_rf_get,
-       .cb_write = rtw89_debug_priv_read_rf_select,
-};
-
-static struct rtw89_debugfs_priv rtw89_debug_priv_write_rf = {
-       .cb_write = rtw89_debug_priv_write_rf_set,
-};
-
-static struct rtw89_debugfs_priv rtw89_debug_priv_rf_reg_dump = {
-       .cb_read = rtw89_debug_priv_rf_reg_dump_get,
-};
-
-static struct rtw89_debugfs_priv rtw89_debug_priv_txpwr_table = {
-       .cb_read = rtw89_debug_priv_txpwr_table_get,
-};
-
-static struct rtw89_debugfs_priv rtw89_debug_priv_mac_reg_dump = {
-       .cb_read = rtw89_debug_priv_mac_reg_dump_get,
-       .cb_write = rtw89_debug_priv_mac_reg_dump_select,
-};
-
-static struct rtw89_debugfs_priv rtw89_debug_priv_mac_mem_dump = {
-       .cb_read = rtw89_debug_priv_mac_mem_dump_get,
-       .cb_write = rtw89_debug_priv_mac_mem_dump_select,
-};
-
-static struct rtw89_debugfs_priv rtw89_debug_priv_mac_dbg_port_dump = {
-       .cb_read = rtw89_debug_priv_mac_dbg_port_dump_get,
-       .cb_write = rtw89_debug_priv_mac_dbg_port_dump_select,
-};
-
-static struct rtw89_debugfs_priv rtw89_debug_priv_send_h2c = {
-       .cb_write = rtw89_debug_priv_send_h2c_set,
-};
-
-static struct rtw89_debugfs_priv rtw89_debug_priv_early_h2c = {
-       .cb_read = rtw89_debug_priv_early_h2c_get,
-       .cb_write = rtw89_debug_priv_early_h2c_set,
-};
-
-static struct rtw89_debugfs_priv rtw89_debug_priv_fw_crash = {
-       .cb_read = rtw89_debug_priv_fw_crash_get,
-       .cb_write = rtw89_debug_priv_fw_crash_set,
-};
-
-static struct rtw89_debugfs_priv rtw89_debug_priv_btc_info = {
-       .cb_read = rtw89_debug_priv_btc_info_get,
-};
-
-static struct rtw89_debugfs_priv rtw89_debug_priv_btc_manual = {
-       .cb_write = rtw89_debug_priv_btc_manual_set,
-};
+#define rtw89_debug_priv_get(name)                             \
+{                                                              \
+       .cb_read = rtw89_debug_priv_ ##name## _get,             \
+}
 
-static struct rtw89_debugfs_priv rtw89_debug_priv_fw_log_manual = {
-       .cb_write = rtw89_debug_fw_log_manual_set,
-};
+#define rtw89_debug_priv_set(name)                             \
+{                                                              \
+       .cb_write = rtw89_debug_priv_ ##name## _set,            \
+}
 
-static struct rtw89_debugfs_priv rtw89_debug_priv_phy_info = {
-       .cb_read = rtw89_debug_priv_phy_info_get,
-};
+#define rtw89_debug_priv_select_and_get(name)                  \
+{                                                              \
+       .cb_write = rtw89_debug_priv_ ##name## _select,         \
+       .cb_read = rtw89_debug_priv_ ##name## _get,             \
+}
 
-static struct rtw89_debugfs_priv rtw89_debug_priv_stations = {
-       .cb_read = rtw89_debug_priv_stations_get,
-};
+#define rtw89_debug_priv_set_and_get(name)                     \
+{                                                              \
+       .cb_write = rtw89_debug_priv_ ##name## _set,            \
+       .cb_read = rtw89_debug_priv_ ##name## _get,             \
+}
 
-static struct rtw89_debugfs_priv rtw89_debug_priv_disable_dm = {
-       .cb_read = rtw89_debug_priv_disable_dm_get,
-       .cb_write = rtw89_debug_priv_disable_dm_set,
+static const struct rtw89_debugfs rtw89_debugfs_templ = {
+       .read_reg = rtw89_debug_priv_select_and_get(read_reg),
+       .write_reg = rtw89_debug_priv_set(write_reg),
+       .read_rf = rtw89_debug_priv_select_and_get(read_rf),
+       .write_rf = rtw89_debug_priv_set(write_rf),
+       .rf_reg_dump = rtw89_debug_priv_get(rf_reg_dump),
+       .txpwr_table = rtw89_debug_priv_get(txpwr_table),
+       .mac_reg_dump = rtw89_debug_priv_select_and_get(mac_reg_dump),
+       .mac_mem_dump = rtw89_debug_priv_select_and_get(mac_mem_dump),
+       .mac_dbg_port_dump = rtw89_debug_priv_select_and_get(mac_dbg_port_dump),
+       .send_h2c = rtw89_debug_priv_set(send_h2c),
+       .early_h2c = rtw89_debug_priv_set_and_get(early_h2c),
+       .fw_crash = rtw89_debug_priv_set_and_get(fw_crash),
+       .btc_info = rtw89_debug_priv_get(btc_info),
+       .btc_manual = rtw89_debug_priv_set(btc_manual),
+       .fw_log_manual = rtw89_debug_priv_set(fw_log_manual),
+       .phy_info = rtw89_debug_priv_get(phy_info),
+       .stations = rtw89_debug_priv_get(stations),
+       .disable_dm = rtw89_debug_priv_set_and_get(disable_dm),
 };
 
 #define rtw89_debugfs_add(name, mode, fopname, parent)                         \
        do {                                                                    \
-               rtw89_debug_priv_ ##name.rtwdev = rtwdev;                       \
-               if (!debugfs_create_file(#name, mode,                           \
-                                        parent, &rtw89_debug_priv_ ##name,     \
-                                        &file_ops_ ##fopname))                 \
+               struct rtw89_debugfs_priv *priv = &rtwdev->debugfs->name;       \
+               priv->rtwdev = rtwdev;                                          \
+               if (IS_ERR(debugfs_create_file(#name, mode, parent, priv,       \
+                                              &file_ops_ ##fopname)))          \
                        pr_debug("Unable to initialize debugfs:%s\n", #name);   \
        } while (0)
 
@@ -3950,13 +3934,9 @@ static struct rtw89_debugfs_priv rtw89_debug_priv_disable_dm = {
 #define rtw89_debugfs_add_r(name)                                              \
        rtw89_debugfs_add(name, S_IFREG | 0444, single_r, debugfs_topdir)
 
-void rtw89_debugfs_init(struct rtw89_dev *rtwdev)
+static
+void rtw89_debugfs_add_sec0(struct rtw89_dev *rtwdev, struct dentry *debugfs_topdir)
 {
-       struct dentry *debugfs_topdir;
-
-       debugfs_topdir = debugfs_create_dir("rtw89",
-                                           rtwdev->hw->wiphy->debugfsdir);
-
        rtw89_debugfs_add_rw(read_reg);
        rtw89_debugfs_add_w(write_reg);
        rtw89_debugfs_add_rw(read_rf);
@@ -3966,6 +3946,11 @@ void rtw89_debugfs_init(struct rtw89_dev *rtwdev)
        rtw89_debugfs_add_rw(mac_reg_dump);
        rtw89_debugfs_add_rw(mac_mem_dump);
        rtw89_debugfs_add_rw(mac_dbg_port_dump);
+}
+
+static
+void rtw89_debugfs_add_sec1(struct rtw89_dev *rtwdev, struct dentry *debugfs_topdir)
+{
        rtw89_debugfs_add_w(send_h2c);
        rtw89_debugfs_add_rw(early_h2c);
        rtw89_debugfs_add_rw(fw_crash);
@@ -3976,6 +3961,27 @@ void rtw89_debugfs_init(struct rtw89_dev *rtwdev)
        rtw89_debugfs_add_r(stations);
        rtw89_debugfs_add_rw(disable_dm);
 }
+
+void rtw89_debugfs_init(struct rtw89_dev *rtwdev)
+{
+       struct dentry *debugfs_topdir;
+
+       rtwdev->debugfs = kmemdup(&rtw89_debugfs_templ,
+                                 sizeof(rtw89_debugfs_templ), GFP_KERNEL);
+       if (!rtwdev->debugfs)
+               return;
+
+       debugfs_topdir = debugfs_create_dir("rtw89",
+                                           rtwdev->hw->wiphy->debugfsdir);
+
+       rtw89_debugfs_add_sec0(rtwdev, debugfs_topdir);
+       rtw89_debugfs_add_sec1(rtwdev, debugfs_topdir);
+}
+
+void rtw89_debugfs_deinit(struct rtw89_dev *rtwdev)
+{
+       kfree(rtwdev->debugfs);
+}
 #endif
 
 #ifdef CONFIG_RTW89_DEBUGMSG
index 800ea59873a1d8ba3184a876a7f98168ca8e627f..fc690f7c55dc7a550bd3912f4cf9080388fcda73 100644 (file)
@@ -49,8 +49,10 @@ enum rtw89_debug_mac_reg_sel {
 
 #ifdef CONFIG_RTW89_DEBUGFS
 void rtw89_debugfs_init(struct rtw89_dev *rtwdev);
+void rtw89_debugfs_deinit(struct rtw89_dev *rtwdev);
 #else
 static inline void rtw89_debugfs_init(struct rtw89_dev *rtwdev) {}
+static inline void rtw89_debugfs_deinit(struct rtw89_dev *rtwdev) {}
 #endif
 
 #define rtw89_info(rtwdev, a...) dev_info((rtwdev)->dev, ##a)