diff options
Diffstat (limited to 'package/mac80211/patches/510-ath9k_debugfs_regaccess.patch')
-rw-r--r-- | package/mac80211/patches/510-ath9k_debugfs_regaccess.patch | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/package/mac80211/patches/510-ath9k_debugfs_regaccess.patch b/package/mac80211/patches/510-ath9k_debugfs_regaccess.patch new file mode 100644 index 0000000000..02e4cac375 --- /dev/null +++ b/package/mac80211/patches/510-ath9k_debugfs_regaccess.patch @@ -0,0 +1,128 @@ +--- a/drivers/net/wireless/ath/ath9k/debug.c ++++ b/drivers/net/wireless/ath/ath9k/debug.c +@@ -774,6 +774,86 @@ static const struct file_operations fops + .owner = THIS_MODULE + }; + ++static ssize_t read_file_regidx(struct file *file, char __user *user_buf, ++ size_t count, loff_t *ppos) ++{ ++ struct ath_softc *sc = file->private_data; ++ char buf[32]; ++ unsigned int len; ++ ++ len = snprintf(buf, sizeof(buf), "0x%08x\n", sc->debug.regidx); ++ return simple_read_from_buffer(user_buf, count, ppos, buf, len); ++} ++ ++static ssize_t write_file_regidx(struct file *file, const char __user *user_buf, ++ size_t count, loff_t *ppos) ++{ ++ struct ath_softc *sc = file->private_data; ++ unsigned long regidx; ++ char buf[32]; ++ ssize_t len; ++ ++ len = min(count, sizeof(buf) - 1); ++ if (copy_from_user(buf, user_buf, len)) ++ return -EINVAL; ++ ++ buf[len] = '\0'; ++ if (strict_strtoul(buf, 0, ®idx)) ++ return -EINVAL; ++ ++ sc->debug.regidx = regidx; ++ return count; ++} ++ ++static const struct file_operations fops_regidx = { ++ .read = read_file_regidx, ++ .write = write_file_regidx, ++ .open = ath9k_debugfs_open, ++ .owner = THIS_MODULE ++}; ++ ++static ssize_t read_file_regval(struct file *file, char __user *user_buf, ++ size_t count, loff_t *ppos) ++{ ++ struct ath_softc *sc = file->private_data; ++ struct ath_hw *ah = sc->sc_ah; ++ char buf[32]; ++ unsigned int len; ++ u32 regval; ++ ++ regval = REG_READ_D(ah, sc->debug.regidx); ++ len = snprintf(buf, sizeof(buf), "0x%08x\n", regval); ++ return simple_read_from_buffer(user_buf, count, ppos, buf, len); ++} ++ ++static ssize_t write_file_regval(struct file *file, const char __user *user_buf, ++ size_t count, loff_t *ppos) ++{ ++ struct ath_softc *sc = file->private_data; ++ struct ath_hw *ah = sc->sc_ah; ++ unsigned long regval; ++ char buf[32]; ++ ssize_t len; ++ ++ len = min(count, sizeof(buf) - 1); ++ if (copy_from_user(buf, user_buf, len)) ++ return -EINVAL; ++ ++ buf[len] = '\0'; ++ if (strict_strtoul(buf, 0, ®val)) ++ return -EINVAL; ++ ++ REG_WRITE_D(ah, sc->debug.regidx, regval); ++ return count; ++} ++ ++static const struct file_operations fops_regval = { ++ .read = read_file_regval, ++ .write = write_file_regval, ++ .open = ath9k_debugfs_open, ++ .owner = THIS_MODULE ++}; ++ + int ath9k_init_debug(struct ath_hw *ah) + { + struct ath_common *common = ath9k_hw_common(ah); +@@ -843,6 +923,17 @@ int ath9k_init_debug(struct ath_hw *ah) + if (!sc->debug.debugfs_recv) + goto err; + ++ sc->debug.regidx = 0; ++ sc->debug.debugfs_regidx = debugfs_create_file("regidx", ++ S_IRUSR|S_IWUSR, sc->debug.debugfs_phy, sc, &fops_regidx); ++ if (!sc->debug.debugfs_regidx) ++ goto err; ++ ++ sc->debug.debugfs_regval = debugfs_create_file("regval", ++ S_IRUSR|S_IWUSR, sc->debug.debugfs_phy, sc, &fops_regval); ++ if (!sc->debug.debugfs_regval) ++ goto err; ++ + return 0; + err: + ath9k_exit_debug(ah); +@@ -856,6 +947,8 @@ void ath9k_exit_debug(struct ath_hw *ah) + + debugfs_remove(sc->debug.debugfs_tx_chainmask); + debugfs_remove(sc->debug.debugfs_rx_chainmask); ++ debugfs_remove(sc->debug.debugfs_regval); ++ debugfs_remove(sc->debug.debugfs_regidx); + debugfs_remove(sc->debug.debugfs_recv); + debugfs_remove(sc->debug.debugfs_xmit); + debugfs_remove(sc->debug.debugfs_wiphy); +--- a/drivers/net/wireless/ath/ath9k/debug.h ++++ b/drivers/net/wireless/ath/ath9k/debug.h +@@ -158,6 +158,9 @@ struct ath9k_debug { + struct dentry *debugfs_wiphy; + struct dentry *debugfs_xmit; + struct dentry *debugfs_recv; ++ struct dentry *debugfs_regidx; ++ struct dentry *debugfs_regval; ++ u32 regidx; + struct ath_stats stats; + }; + |