Commit d57ca103 authored by Sascha Hauer's avatar Sascha Hauer Committed by Kalle Valo

wifi: rtw88: Drop rf_lock

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: default avatarSascha Hauer <s.hauer@pengutronix.de>
Reviewed-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20221202081224.2779981-4-s.hauer@pengutronix.de
parent 69020957
...@@ -144,7 +144,9 @@ static int rtw_debugfs_get_rf_read(struct seq_file *m, void *v) ...@@ -144,7 +144,9 @@ static int rtw_debugfs_get_rf_read(struct seq_file *m, void *v)
addr = debugfs_priv->rf_addr; addr = debugfs_priv->rf_addr;
mask = debugfs_priv->rf_mask; mask = debugfs_priv->rf_mask;
mutex_lock(&rtwdev->mutex);
val = rtw_read_rf(rtwdev, path, addr, mask); 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", seq_printf(m, "rf_read path:%d addr:0x%08x mask:0x%08x val=0x%08x\n",
path, addr, mask, val); path, addr, mask, val);
...@@ -414,7 +416,9 @@ static ssize_t rtw_debugfs_set_rf_write(struct file *filp, ...@@ -414,7 +416,9 @@ static ssize_t rtw_debugfs_set_rf_write(struct file *filp,
return count; return count;
} }
mutex_lock(&rtwdev->mutex);
rtw_write_rf(rtwdev, path, addr, mask, val); rtw_write_rf(rtwdev, path, addr, mask, val);
mutex_unlock(&rtwdev->mutex);
rtw_dbg(rtwdev, RTW_DBG_DEBUGFS, rtw_dbg(rtwdev, RTW_DBG_DEBUGFS,
"write_rf path:%d addr:0x%08x mask:0x%08x, val:0x%08x\n", "write_rf path:%d addr:0x%08x mask:0x%08x, val:0x%08x\n",
path, addr, mask, val); path, addr, mask, val);
...@@ -519,6 +523,8 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v) ...@@ -519,6 +523,8 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v)
u32 addr, offset, data; u32 addr, offset, data;
u8 path; u8 path;
mutex_lock(&rtwdev->mutex);
for (path = 0; path < rtwdev->hal.rf_path_num; path++) { for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
seq_printf(m, "RF path:%d\n", path); seq_printf(m, "RF path:%d\n", path);
for (addr = 0; addr < 0x100; addr += 4) { for (addr = 0; addr < 0x100; addr += 4) {
...@@ -533,6 +539,8 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v) ...@@ -533,6 +539,8 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v)
seq_puts(m, "\n"); seq_puts(m, "\n");
} }
mutex_unlock(&rtwdev->mutex);
return 0; return 0;
} }
...@@ -1026,6 +1034,8 @@ static void dump_gapk_status(struct rtw_dev *rtwdev, struct seq_file *m) ...@@ -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) ? '-' : '+', dm_info->dm_flags & BIT(RTW_DM_CAP_TXGAPK) ? '-' : '+',
rtw_dm_cap_strs[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++) { for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
val = rtw_read_rf(rtwdev, path, RF_GAINTX, RFREG_MASK); val = rtw_read_rf(rtwdev, path, RF_GAINTX, RFREG_MASK);
seq_printf(m, "path %d:\n0x%x = 0x%x\n", path, RF_GAINTX, val); 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) ...@@ -1035,6 +1045,7 @@ static void dump_gapk_status(struct rtw_dev *rtwdev, struct seq_file *m)
txgapk->rf3f_fs[path][i], i); txgapk->rf3f_fs[path][i], i);
seq_puts(m, "\n"); seq_puts(m, "\n");
} }
mutex_unlock(&rtwdev->mutex);
} }
static int rtw_debugfs_get_dm_cap(struct seq_file *m, void *v) static int rtw_debugfs_get_dm_cap(struct seq_file *m, void *v)
......
...@@ -166,12 +166,11 @@ static inline u32 ...@@ -166,12 +166,11 @@ static inline u32
rtw_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path, rtw_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
u32 addr, u32 mask) u32 addr, u32 mask)
{ {
unsigned long flags;
u32 val; 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); val = rtwdev->chip->ops->read_rf(rtwdev, rf_path, addr, mask);
spin_unlock_irqrestore(&rtwdev->rf_lock, flags);
return val; return val;
} }
...@@ -180,11 +179,9 @@ static inline void ...@@ -180,11 +179,9 @@ static inline void
rtw_write_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path, rtw_write_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
u32 addr, u32 mask, u32 data) 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); rtwdev->chip->ops->write_rf(rtwdev, rf_path, addr, mask, data);
spin_unlock_irqrestore(&rtwdev->rf_lock, flags);
} }
static inline u32 static inline u32
......
...@@ -2067,7 +2067,6 @@ int rtw_core_init(struct rtw_dev *rtwdev) ...@@ -2067,7 +2067,6 @@ int rtw_core_init(struct rtw_dev *rtwdev)
skb_queue_head_init(&rtwdev->coex.queue); skb_queue_head_init(&rtwdev->coex.queue);
skb_queue_head_init(&rtwdev->tx_report.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->h2c.lock);
spin_lock_init(&rtwdev->txq_lock); spin_lock_init(&rtwdev->txq_lock);
spin_lock_init(&rtwdev->tx_report.q_lock); spin_lock_init(&rtwdev->tx_report.q_lock);
......
...@@ -1995,9 +1995,6 @@ struct rtw_dev { ...@@ -1995,9 +1995,6 @@ struct rtw_dev {
/* ensures exclusive access from mac80211 callbacks */ /* ensures exclusive access from mac80211 callbacks */
struct mutex mutex; struct mutex mutex;
/* read/write rf register */
spinlock_t rf_lock;
/* watch dog every 2 sec */ /* watch dog every 2 sec */
struct delayed_work watch_dog_work; struct delayed_work watch_dog_work;
u32 watch_dog_cnt; u32 watch_dog_cnt;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment