| From 1f528237cd9fffff8f801254bbe749234ce0c26e Mon Sep 17 00:00:00 2001 |
| From: Lorenzo Bianconi <lorenzo@kernel.org> |
| Date: Sun, 8 Aug 2021 21:11:49 +0200 |
| Subject: [PATCH] BACKPORT: FROMGIT: mt76: overwrite default reg_ops if |
| necessary |
| |
| Introduce mt76_register_debugfs_fops routine in order to |
| define per-driver regs file operations and make sure the |
| device is up before reading or writing its registers |
| |
| Fixes: 1d8efc741df8 'mt76: mt7921: introduce Runtime PM support' |
| Fixes: de5ff3c9d1a2 'mt76: mt7615: introduce pm_power_save delayed work' |
| Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> |
| Signed-off-by: Felix Fietkau <nbd@nbd.name> |
| |
| (cherry picked from commit c384de605e3319dc9298088ab01cdfc549f750d9 |
| https://github.com/nbd168/wireless.git mt76) |
| |
| Conflicts: |
| drivers/net/wireless/mediatek/mt76/debugfs.c |
| |
| Backport Notes: |
| It is context only. |
| |
| BUG=b:178754244, b:188614537 |
| TEST=build on cherry |
| |
| Signed-off-by: Sean Wang <objelf@gmail.com> |
| Change-Id: Ic940021e67842cee423485f29aa4966f4cef8d02 |
| Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/3151506 |
| Reviewed-by: Joshua Emele <jemele@chromium.org> |
| Tested-by: Joshua Emele <jemele@chromium.org> |
| Commit-Queue: Joshua Emele <jemele@chromium.org> |
| --- |
| drivers/net/wireless/mediatek/mt76/debugfs.c | 10 ++++--- |
| drivers/net/wireless/mediatek/mt76/mt76.h | 8 ++++- |
| .../wireless/mediatek/mt76/mt7615/debugfs.c | 29 ++++++++++++++++++- |
| .../wireless/mediatek/mt76/mt7921/debugfs.c | 28 +++++++++++++++++- |
| 4 files changed, 68 insertions(+), 7 deletions(-) |
| |
| diff --git a/drivers/net/wireless/mediatek/mt76/debugfs.c b/drivers/net/wireless/mediatek/mt76/debugfs.c |
| --- a/drivers/net/wireless/mediatek/mt76/debugfs.c |
| +++ b/drivers/net/wireless/mediatek/mt76/debugfs.c |
| @@ -116,8 +116,11 @@ static int mt76_read_rate_txpower(struct seq_file *s, void *data) |
| return 0; |
| } |
| |
| -struct dentry *mt76_register_debugfs(struct mt76_dev *dev) |
| +struct dentry * |
| +mt76_register_debugfs_fops(struct mt76_dev *dev, |
| + const struct file_operations *ops) |
| { |
| + const struct file_operations *fops = ops ? ops : &fops_regval; |
| struct dentry *dir; |
| |
| dir = debugfs_create_dir("mt76", dev->hw->wiphy->debugfsdir); |
| @@ -126,8 +129,7 @@ struct dentry *mt76_register_debugfs(struct mt76_dev *dev) |
| |
| debugfs_create_u8("led_pin", 0600, dir, &dev->led_pin); |
| debugfs_create_u32("regidx", 0600, dir, &dev->debugfs_reg); |
| - debugfs_create_file_unsafe("regval", 0600, dir, dev, |
| - &fops_regval); |
| + debugfs_create_file_unsafe("regval", 0600, dir, dev, fops); |
| debugfs_create_file_unsafe("napi_threaded", 0600, dir, dev, |
| &fops_napi_threaded); |
| debugfs_create_blob("eeprom", 0400, dir, &dev->eeprom); |
| @@ -140,4 +142,4 @@ struct dentry *mt76_register_debugfs(struct mt76_dev *dev) |
| |
| return dir; |
| } |
| -EXPORT_SYMBOL_GPL(mt76_register_debugfs); |
| +EXPORT_SYMBOL_GPL(mt76_register_debugfs_fops); |
| diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h |
| --- a/drivers/net/wireless/mediatek/mt76/mt76.h |
| +++ b/drivers/net/wireless/mediatek/mt76/mt76.h |
| @@ -879,7 +879,13 @@ struct mt76_phy *mt76_alloc_phy(struct mt76_dev *dev, unsigned int size, |
| int mt76_register_phy(struct mt76_phy *phy, bool vht, |
| struct ieee80211_rate *rates, int n_rates); |
| |
| -struct dentry *mt76_register_debugfs(struct mt76_dev *dev); |
| +struct dentry *mt76_register_debugfs_fops(struct mt76_dev *dev, |
| + const struct file_operations *ops); |
| +static inline struct dentry *mt76_register_debugfs(struct mt76_dev *dev) |
| +{ |
| + return mt76_register_debugfs_fops(dev, NULL); |
| +} |
| + |
| int mt76_queues_read(struct seq_file *s, void *data); |
| void mt76_seq_puts_array(struct seq_file *file, const char *str, |
| s8 *val, int len); |
| diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c |
| --- a/drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c |
| +++ b/drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c |
| @@ -2,6 +2,33 @@ |
| |
| #include "mt7615.h" |
| |
| +static int |
| +mt7615_reg_set(void *data, u64 val) |
| +{ |
| + struct mt7615_dev *dev = data; |
| + |
| + mt7615_mutex_acquire(dev); |
| + mt76_wr(dev, dev->mt76.debugfs_reg, val); |
| + mt7615_mutex_release(dev); |
| + |
| + return 0; |
| +} |
| + |
| +static int |
| +mt7615_reg_get(void *data, u64 *val) |
| +{ |
| + struct mt7615_dev *dev = data; |
| + |
| + mt7615_mutex_acquire(dev); |
| + *val = mt76_rr(dev, dev->mt76.debugfs_reg); |
| + mt7615_mutex_release(dev); |
| + |
| + return 0; |
| +} |
| + |
| +DEFINE_DEBUGFS_ATTRIBUTE(fops_regval, mt7615_reg_get, mt7615_reg_set, |
| + "0x%08llx\n"); |
| + |
| static int |
| mt7615_radar_pattern_set(void *data, u64 val) |
| { |
| @@ -506,7 +533,7 @@ int mt7615_init_debugfs(struct mt7615_dev *dev) |
| { |
| struct dentry *dir; |
| |
| - dir = mt76_register_debugfs(&dev->mt76); |
| + dir = mt76_register_debugfs_fops(&dev->mt76, &fops_regval); |
| if (!dir) |
| return -ENOMEM; |
| |
| diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c b/drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c |
| --- a/drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c |
| +++ b/drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c |
| @@ -4,6 +4,32 @@ |
| #include "mt7921.h" |
| #include "eeprom.h" |
| |
| +static int |
| +mt7921_reg_set(void *data, u64 val) |
| +{ |
| + struct mt7921_dev *dev = data; |
| + |
| + mt7921_mutex_acquire(dev); |
| + mt76_wr(dev, dev->mt76.debugfs_reg, val); |
| + mt7921_mutex_release(dev); |
| + |
| + return 0; |
| +} |
| + |
| +static int |
| +mt7921_reg_get(void *data, u64 *val) |
| +{ |
| + struct mt7921_dev *dev = data; |
| + |
| + mt7921_mutex_acquire(dev); |
| + *val = mt76_rr(dev, dev->mt76.debugfs_reg); |
| + mt7921_mutex_release(dev); |
| + |
| + return 0; |
| +} |
| + |
| +DEFINE_DEBUGFS_ATTRIBUTE(fops_regval, mt7921_reg_get, mt7921_reg_set, |
| + "0x%08llx\n"); |
| static int |
| mt7921_fw_debug_set(void *data, u64 val) |
| { |
| @@ -381,7 +407,7 @@ int mt7921_init_debugfs(struct mt7921_dev *dev) |
| { |
| struct dentry *dir; |
| |
| - dir = mt76_register_debugfs(&dev->mt76); |
| + dir = mt76_register_debugfs_fops(&dev->mt76, &fops_regval); |
| if (!dir) |
| return -ENOMEM; |
| |
| -- |
| 2.33.0.464.g1972c5931b-goog |
| |