wifi: rtw88: Drop rf_lock
authorSascha Hauer <s.hauer@pengutronix.de>
Fri, 2 Dec 2022 08:12:16 +0000 (09:12 +0100)
committerKalle Valo <kvalo@kernel.org>
Thu, 8 Dec 2022 14:48:40 +0000 (16:48 +0200)
The rtwdev->rf_lock spinlock protects the rf register accesses in
rtw_read_rf() and rtw_write_rf(). Most callers of these functions hold
rtwdev->mutex already with the exception of the callsites in the debugfs
code. The debugfs code doesn't justify an extra lock, so acquire the mutex
there as well before calling rf register accessors and drop the now
unnecessary spinlock.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20221202081224.2779981-4-s.hauer@pengutronix.de
drivers/net/wireless/realtek/rtw88/debug.c
drivers/net/wireless/realtek/rtw88/hci.h
drivers/net/wireless/realtek/rtw88/main.c
drivers/net/wireless/realtek/rtw88/main.h

index 9ebe544e51d0d37a1ade8f02c56dea8fb6ddbfe3..70e19f2a1a355334c7da30bc88276641cb036ffc 100644 (file)
@@ -144,7 +144,9 @@ static int rtw_debugfs_get_rf_read(struct seq_file *m, void *v)
        addr = debugfs_priv->rf_addr;
        mask = debugfs_priv->rf_mask;
 
+       mutex_lock(&rtwdev->mutex);
        val = rtw_read_rf(rtwdev, path, addr, mask);
+       mutex_unlock(&rtwdev->mutex);
 
        seq_printf(m, "rf_read path:%d addr:0x%08x mask:0x%08x val=0x%08x\n",
                   path, addr, mask, val);
@@ -414,7 +416,9 @@ static ssize_t rtw_debugfs_set_rf_write(struct file *filp,
                return count;
        }
 
+       mutex_lock(&rtwdev->mutex);
        rtw_write_rf(rtwdev, path, addr, mask, val);
+       mutex_unlock(&rtwdev->mutex);
        rtw_dbg(rtwdev, RTW_DBG_DEBUGFS,
                "write_rf path:%d addr:0x%08x mask:0x%08x, val:0x%08x\n",
                path, addr, mask, val);
@@ -519,6 +523,8 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v)
        u32 addr, offset, data;
        u8 path;
 
+       mutex_lock(&rtwdev->mutex);
+
        for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
                seq_printf(m, "RF path:%d\n", path);
                for (addr = 0; addr < 0x100; addr += 4) {
@@ -533,6 +539,8 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v)
                seq_puts(m, "\n");
        }
 
+       mutex_unlock(&rtwdev->mutex);
+
        return 0;
 }
 
@@ -1026,6 +1034,8 @@ static void dump_gapk_status(struct rtw_dev *rtwdev, struct seq_file *m)
                   dm_info->dm_flags & BIT(RTW_DM_CAP_TXGAPK) ? '-' : '+',
                   rtw_dm_cap_strs[RTW_DM_CAP_TXGAPK]);
 
+       mutex_lock(&rtwdev->mutex);
+
        for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
                val = rtw_read_rf(rtwdev, path, RF_GAINTX, RFREG_MASK);
                seq_printf(m, "path %d:\n0x%x = 0x%x\n", path, RF_GAINTX, val);
@@ -1035,6 +1045,7 @@ static void dump_gapk_status(struct rtw_dev *rtwdev, struct seq_file *m)
                                   txgapk->rf3f_fs[path][i], i);
                seq_puts(m, "\n");
        }
+       mutex_unlock(&rtwdev->mutex);
 }
 
 static int rtw_debugfs_get_dm_cap(struct seq_file *m, void *v)
index 4c6fc6fb3f83b6dd53013f0568b4024452740b7a..830d7532f2a35a8c973f61087fe3860034770cc0 100644 (file)
@@ -166,12 +166,11 @@ static inline u32
 rtw_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
            u32 addr, u32 mask)
 {
-       unsigned long flags;
        u32 val;
 
-       spin_lock_irqsave(&rtwdev->rf_lock, flags);
+       lockdep_assert_held(&rtwdev->mutex);
+
        val = rtwdev->chip->ops->read_rf(rtwdev, rf_path, addr, mask);
-       spin_unlock_irqrestore(&rtwdev->rf_lock, flags);
 
        return val;
 }
@@ -180,11 +179,9 @@ static inline void
 rtw_write_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
             u32 addr, u32 mask, u32 data)
 {
-       unsigned long flags;
+       lockdep_assert_held(&rtwdev->mutex);
 
-       spin_lock_irqsave(&rtwdev->rf_lock, flags);
        rtwdev->chip->ops->write_rf(rtwdev, rf_path, addr, mask, data);
-       spin_unlock_irqrestore(&rtwdev->rf_lock, flags);
 }
 
 static inline u32
index a7331872e8530edbf5e322b44d6463af60a3341a..710ddb0283c82e016a4d8ad904282f02229fa80b 100644 (file)
@@ -2067,7 +2067,6 @@ int rtw_core_init(struct rtw_dev *rtwdev)
        skb_queue_head_init(&rtwdev->coex.queue);
        skb_queue_head_init(&rtwdev->tx_report.queue);
 
-       spin_lock_init(&rtwdev->rf_lock);
        spin_lock_init(&rtwdev->h2c.lock);
        spin_lock_init(&rtwdev->txq_lock);
        spin_lock_init(&rtwdev->tx_report.q_lock);
index 6e5875f6d07f474ad8be8a5a9ea61662e757d99d..f24d17f482aaaccc6daaabaa02755bed7ca642b1 100644 (file)
@@ -1995,9 +1995,6 @@ struct rtw_dev {
        /* ensures exclusive access from mac80211 callbacks */
        struct mutex mutex;
 
-       /* read/write rf register */
-       spinlock_t rf_lock;
-
        /* watch dog every 2 sec */
        struct delayed_work watch_dog_work;
        u32 watch_dog_cnt;