From: Felix Fietkau Date: Mon, 23 Nov 2009 22:01:45 +0000 (+0000) Subject: separate ath9k debugfs support from ath9k debugging, use the mac80211 debugfs config... X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=9fce92753fbaf50f800e991a20f697566374f7e8;p=openwrt%2Fstaging%2Frobimarko.git separate ath9k debugfs support from ath9k debugging, use the mac80211 debugfs config option to enable it SVN-Revision: 18505 --- diff --git a/package/mac80211/Makefile b/package/mac80211/Makefile index aef79373d7..2da34badac 100644 --- a/package/mac80211/Makefile +++ b/package/mac80211/Makefile @@ -22,6 +22,9 @@ PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION) PKG_CONFIG_DEPENDS:= \ CONFIG_PACKAGE_kmod-mac80211 \ + CONFIG_PACKAGE_MAC80211_DEBUGFS \ + CONFIG_PACKAGE_ATH_DEBUG \ + CONFIG_ATH_USER_REGD \ include $(INCLUDE_DIR)/package.mk @@ -498,8 +501,7 @@ BUILDFLAGS:= \ $(if $(CONFIG_PCI),-DCONFIG_SSB_SPROM) \ $(if $(CONFIG_LEDS_TRIGGERS), -DCONFIG_MAC80211_LEDS -DCONFIG_LEDS_TRIGGERS -DCONFIG_B43_LEDS -DCONFIG_B43LEGACY_LEDS -DCONFIG_AR9170_LEDS) \ -DCONFIG_B43_HWRNG -DCONFIG_B43LEGACY_HWRNG \ - $(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),-DCONFIG_MAC80211_DEBUGFS) \ - $(if $(CONFIG_PACKAGE_ATH9K_DEBUG),-DCONFIG_ATH9K_DEBUG) \ + $(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),-DCONFIG_MAC80211_DEBUGFS -DCONFIG_ATH9K_DEBUGFS) \ $(if $(CONFIG_PACKAGE_ATH_DEBUG),-DCONFIG_ATH_DEBUG) \ -D__CONFIG_MAC80211_RC_DEFAULT=minstrel \ $(if $(CONFIG_ATH_USER_REGD),-DATH_USER_REGD=1) @@ -530,7 +532,7 @@ MAKE_OPTS:= \ CONFIG_ATH_DEBUG=$(if $(CONFIG_PACKAGE_ATH_DEBUG),y) \ CONFIG_ATH5K=$(if $(CONFIG_PACKAGE_kmod-ath5k),m) \ CONFIG_ATH9K=$(if $(CONFIG_PACKAGE_kmod-ath9k),m) \ - CONFIG_ATH9K_DEBUG=$(if $(CONFIG_PACKAGE_ATH9K_DEBUG),y) \ + CONFIG_ATH9K_DEBUGFS=$(if $(CONFIG_PACKAGE_MAC80211_DEBUGFS),y) \ CONFIG_ZD1211RW=$(if $(CONFIG_PACKAGE_kmod-zd1211rw),m) \ CONFIG_P54_COMMON=$(if $(CONFIG_PACKAGE_kmod-p54-common),m) \ CONFIG_P54_PCI=$(if $(CONFIG_PACKAGE_kmod-p54-pci),m) \ diff --git a/package/mac80211/patches/520-ath9k_debugfs_chainmask.patch b/package/mac80211/patches/520-ath9k_debugfs_chainmask.patch deleted file mode 100644 index d8ca8dfbfb..0000000000 --- a/package/mac80211/patches/520-ath9k_debugfs_chainmask.patch +++ /dev/null @@ -1,130 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/debug.c -+++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -71,6 +71,90 @@ static const struct file_operations fops - .owner = THIS_MODULE - }; - -+static ssize_t read_file_tx_chainmask(struct file *file, char __user *user_buf, -+ size_t count, loff_t *ppos) -+{ -+ struct ath_softc *sc = file->private_data; -+ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -+ char buf[32]; -+ unsigned int len; -+ -+ len = snprintf(buf, sizeof(buf), "0x%08x\n", common->tx_chainmask); -+ return simple_read_from_buffer(user_buf, count, ppos, buf, len); -+} -+ -+static ssize_t write_file_tx_chainmask(struct file *file, const char __user *user_buf, -+ size_t count, loff_t *ppos) -+{ -+ struct ath_softc *sc = file->private_data; -+ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -+ unsigned long mask; -+ 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, &mask)) -+ return -EINVAL; -+ -+ common->tx_chainmask = mask; -+ sc->sc_ah->caps.tx_chainmask = mask; -+ return count; -+} -+ -+static const struct file_operations fops_tx_chainmask = { -+ .read = read_file_tx_chainmask, -+ .write = write_file_tx_chainmask, -+ .open = ath9k_debugfs_open, -+ .owner = THIS_MODULE -+}; -+ -+ -+static ssize_t read_file_rx_chainmask(struct file *file, char __user *user_buf, -+ size_t count, loff_t *ppos) -+{ -+ struct ath_softc *sc = file->private_data; -+ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -+ char buf[32]; -+ unsigned int len; -+ -+ len = snprintf(buf, sizeof(buf), "0x%08x\n", common->rx_chainmask); -+ return simple_read_from_buffer(user_buf, count, ppos, buf, len); -+} -+ -+static ssize_t write_file_rx_chainmask(struct file *file, const char __user *user_buf, -+ size_t count, loff_t *ppos) -+{ -+ struct ath_softc *sc = file->private_data; -+ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -+ unsigned long mask; -+ 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, &mask)) -+ return -EINVAL; -+ -+ common->rx_chainmask = mask; -+ sc->sc_ah->caps.rx_chainmask = mask; -+ return count; -+} -+ -+static const struct file_operations fops_rx_chainmask = { -+ .read = read_file_rx_chainmask, -+ .write = write_file_rx_chainmask, -+ .open = ath9k_debugfs_open, -+ .owner = THIS_MODULE -+}; -+ -+ - static ssize_t read_file_dma(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) - { -@@ -568,6 +652,16 @@ int ath9k_init_debug(struct ath_hw *ah) - if (!sc->debug.debugfs_debug) - goto err; - -+ sc->debug.debugfs_rx_chainmask = debugfs_create_file("rx_chainmask", -+ S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_rx_chainmask); -+ if (!sc->debug.debugfs_rx_chainmask) -+ goto err; -+ -+ sc->debug.debugfs_tx_chainmask = debugfs_create_file("tx_chainmask", -+ S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_tx_chainmask); -+ if (!sc->debug.debugfs_tx_chainmask) -+ goto err; -+ - sc->debug.debugfs_dma = debugfs_create_file("dma", S_IRUSR, - sc->debug.debugfs_phy, sc, &fops_dma); - if (!sc->debug.debugfs_dma) -@@ -611,6 +705,8 @@ void ath9k_exit_debug(struct ath_hw *ah) - struct ath_common *common = ath9k_hw_common(ah); - struct ath_softc *sc = (struct ath_softc *) common->priv; - -+ debugfs_remove(sc->debug.debugfs_tx_chainmask); -+ debugfs_remove(sc->debug.debugfs_rx_chainmask); - debugfs_remove(sc->debug.debugfs_xmit); - debugfs_remove(sc->debug.debugfs_wiphy); - debugfs_remove(sc->debug.debugfs_rcstat); ---- a/drivers/net/wireless/ath/ath9k/debug.h -+++ b/drivers/net/wireless/ath/ath9k/debug.h -@@ -123,6 +123,8 @@ struct ath_stats { - }; - - struct ath9k_debug { -+ struct dentry *debugfs_rx_chainmask; -+ struct dentry *debugfs_tx_chainmask; - struct dentry *debugfs_phy; - struct dentry *debugfs_debug; - struct dentry *debugfs_dma; diff --git a/package/mac80211/patches/520-ath9k_debugfs_config.patch b/package/mac80211/patches/520-ath9k_debugfs_config.patch new file mode 100644 index 0000000000..021338307d --- /dev/null +++ b/package/mac80211/patches/520-ath9k_debugfs_config.patch @@ -0,0 +1,81 @@ +--- a/drivers/net/wireless/ath/ath9k/Makefile ++++ b/drivers/net/wireless/ath/ath9k/Makefile +@@ -7,7 +7,7 @@ ath9k-y += beacon.o \ + + ath9k-$(CONFIG_PCI) += pci.o + ath9k-$(CONFIG_ATHEROS_AR71XX) += ahb.o +-ath9k-$(CONFIG_ATH9K_DEBUG) += debug.o ++ath9k-$(CONFIG_ATH9K_DEBUGFS) += debug.o + + obj-$(CONFIG_ATH9K) += ath9k.o + +--- a/drivers/net/wireless/ath/ath9k/ath9k.h ++++ b/drivers/net/wireless/ath/ath9k/ath9k.h +@@ -483,7 +483,7 @@ struct ath_softc { + + int beacon_interval; + +-#ifdef CONFIG_ATH9K_DEBUG ++#ifdef CONFIG_ATH9K_DEBUGFS + struct ath9k_debug debug; + #endif + struct ath_beacon_config cur_beacon_conf; +--- a/drivers/net/wireless/ath/ath9k/debug.c ++++ b/drivers/net/wireless/ath/ath9k/debug.c +@@ -31,6 +31,8 @@ static int ath9k_debugfs_open(struct ino + return 0; + } + ++#ifdef CONFIG_ATH_DEBUG ++ + static ssize_t read_file_debug(struct file *file, char __user *user_buf, + size_t count, loff_t *ppos) + { +@@ -71,6 +73,8 @@ static const struct file_operations fops + .owner = THIS_MODULE + }; + ++#endif ++ + static ssize_t read_file_dma(struct file *file, char __user *user_buf, + size_t count, loff_t *ppos) + { +@@ -563,10 +567,12 @@ int ath9k_init_debug(struct ath_hw *ah) + if (!sc->debug.debugfs_phy) + goto err; + ++#ifdef CONFIG_ATH_DEBUG + sc->debug.debugfs_debug = debugfs_create_file("debug", + S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_debug); + if (!sc->debug.debugfs_debug) + goto err; ++#endif + + sc->debug.debugfs_dma = debugfs_create_file("dma", S_IRUSR, + sc->debug.debugfs_phy, sc, &fops_dma); +--- a/drivers/net/wireless/ath/ath9k/debug.h ++++ b/drivers/net/wireless/ath/ath9k/debug.h +@@ -23,13 +23,13 @@ + struct ath_txq; + struct ath_buf; + +-#ifdef CONFIG_ATH9K_DEBUG ++#ifdef CONFIG_ATH9K_DEBUGFS + #define TX_STAT_INC(q, c) sc->debug.stats.txstats[q].c++ + #else + #define TX_STAT_INC(q, c) do { } while (0) + #endif + +-#ifdef CONFIG_ATH9K_DEBUG ++#ifdef CONFIG_ATH9K_DEBUGFS + + /** + * struct ath_interrupt_stats - Contains statistics about interrupts +@@ -186,6 +186,6 @@ static inline void ath_debug_stat_retrie + { + } + +-#endif /* CONFIG_ATH9K_DEBUG */ ++#endif /* CONFIG_ATH9K_DEBUGFS */ + + #endif /* DEBUG_H */ diff --git a/package/mac80211/patches/530-ath9k_debugfs_chainmask.patch b/package/mac80211/patches/530-ath9k_debugfs_chainmask.patch new file mode 100644 index 0000000000..a26b4dc8aa --- /dev/null +++ b/package/mac80211/patches/530-ath9k_debugfs_chainmask.patch @@ -0,0 +1,130 @@ +--- a/drivers/net/wireless/ath/ath9k/debug.c ++++ b/drivers/net/wireless/ath/ath9k/debug.c +@@ -75,6 +75,90 @@ static const struct file_operations fops + + #endif + ++static ssize_t read_file_tx_chainmask(struct file *file, char __user *user_buf, ++ size_t count, loff_t *ppos) ++{ ++ struct ath_softc *sc = file->private_data; ++ struct ath_common *common = ath9k_hw_common(sc->sc_ah); ++ char buf[32]; ++ unsigned int len; ++ ++ len = snprintf(buf, sizeof(buf), "0x%08x\n", common->tx_chainmask); ++ return simple_read_from_buffer(user_buf, count, ppos, buf, len); ++} ++ ++static ssize_t write_file_tx_chainmask(struct file *file, const char __user *user_buf, ++ size_t count, loff_t *ppos) ++{ ++ struct ath_softc *sc = file->private_data; ++ struct ath_common *common = ath9k_hw_common(sc->sc_ah); ++ unsigned long mask; ++ 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, &mask)) ++ return -EINVAL; ++ ++ common->tx_chainmask = mask; ++ sc->sc_ah->caps.tx_chainmask = mask; ++ return count; ++} ++ ++static const struct file_operations fops_tx_chainmask = { ++ .read = read_file_tx_chainmask, ++ .write = write_file_tx_chainmask, ++ .open = ath9k_debugfs_open, ++ .owner = THIS_MODULE ++}; ++ ++ ++static ssize_t read_file_rx_chainmask(struct file *file, char __user *user_buf, ++ size_t count, loff_t *ppos) ++{ ++ struct ath_softc *sc = file->private_data; ++ struct ath_common *common = ath9k_hw_common(sc->sc_ah); ++ char buf[32]; ++ unsigned int len; ++ ++ len = snprintf(buf, sizeof(buf), "0x%08x\n", common->rx_chainmask); ++ return simple_read_from_buffer(user_buf, count, ppos, buf, len); ++} ++ ++static ssize_t write_file_rx_chainmask(struct file *file, const char __user *user_buf, ++ size_t count, loff_t *ppos) ++{ ++ struct ath_softc *sc = file->private_data; ++ struct ath_common *common = ath9k_hw_common(sc->sc_ah); ++ unsigned long mask; ++ 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, &mask)) ++ return -EINVAL; ++ ++ common->rx_chainmask = mask; ++ sc->sc_ah->caps.rx_chainmask = mask; ++ return count; ++} ++ ++static const struct file_operations fops_rx_chainmask = { ++ .read = read_file_rx_chainmask, ++ .write = write_file_rx_chainmask, ++ .open = ath9k_debugfs_open, ++ .owner = THIS_MODULE ++}; ++ ++ + static ssize_t read_file_dma(struct file *file, char __user *user_buf, + size_t count, loff_t *ppos) + { +@@ -574,6 +658,16 @@ int ath9k_init_debug(struct ath_hw *ah) + goto err; + #endif + ++ sc->debug.debugfs_rx_chainmask = debugfs_create_file("rx_chainmask", ++ S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_rx_chainmask); ++ if (!sc->debug.debugfs_rx_chainmask) ++ goto err; ++ ++ sc->debug.debugfs_tx_chainmask = debugfs_create_file("tx_chainmask", ++ S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_tx_chainmask); ++ if (!sc->debug.debugfs_tx_chainmask) ++ goto err; ++ + sc->debug.debugfs_dma = debugfs_create_file("dma", S_IRUSR, + sc->debug.debugfs_phy, sc, &fops_dma); + if (!sc->debug.debugfs_dma) +@@ -617,6 +711,8 @@ void ath9k_exit_debug(struct ath_hw *ah) + struct ath_common *common = ath9k_hw_common(ah); + struct ath_softc *sc = (struct ath_softc *) common->priv; + ++ debugfs_remove(sc->debug.debugfs_tx_chainmask); ++ debugfs_remove(sc->debug.debugfs_rx_chainmask); + debugfs_remove(sc->debug.debugfs_xmit); + debugfs_remove(sc->debug.debugfs_wiphy); + debugfs_remove(sc->debug.debugfs_rcstat); +--- a/drivers/net/wireless/ath/ath9k/debug.h ++++ b/drivers/net/wireless/ath/ath9k/debug.h +@@ -123,6 +123,8 @@ struct ath_stats { + }; + + struct ath9k_debug { ++ struct dentry *debugfs_rx_chainmask; ++ struct dentry *debugfs_tx_chainmask; + struct dentry *debugfs_phy; + struct dentry *debugfs_debug; + struct dentry *debugfs_dma; diff --git a/package/mac80211/patches/530-ath9k_debugfs_regaccess.patch b/package/mac80211/patches/530-ath9k_debugfs_regaccess.patch deleted file mode 100644 index b973dbb2aa..0000000000 --- a/package/mac80211/patches/530-ath9k_debugfs_regaccess.patch +++ /dev/null @@ -1,128 +0,0 @@ ---- a/drivers/net/wireless/ath/ath9k/debug.c -+++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -634,6 +634,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); -@@ -694,6 +774,17 @@ int ath9k_init_debug(struct ath_hw *ah) - if (!sc->debug.debugfs_xmit) - 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); -@@ -707,6 +798,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_xmit); - debugfs_remove(sc->debug.debugfs_wiphy); - debugfs_remove(sc->debug.debugfs_rcstat); ---- a/drivers/net/wireless/ath/ath9k/debug.h -+++ b/drivers/net/wireless/ath/ath9k/debug.h -@@ -132,6 +132,9 @@ struct ath9k_debug { - struct dentry *debugfs_rcstat; - struct dentry *debugfs_wiphy; - struct dentry *debugfs_xmit; -+ struct dentry *debugfs_regidx; -+ struct dentry *debugfs_regval; -+ u32 regidx; - struct ath_stats stats; - }; - diff --git a/package/mac80211/patches/540-ath9k_debugfs_regaccess.patch b/package/mac80211/patches/540-ath9k_debugfs_regaccess.patch new file mode 100644 index 0000000000..b927b55137 --- /dev/null +++ b/package/mac80211/patches/540-ath9k_debugfs_regaccess.patch @@ -0,0 +1,128 @@ +--- a/drivers/net/wireless/ath/ath9k/debug.c ++++ b/drivers/net/wireless/ath/ath9k/debug.c +@@ -638,6 +638,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); +@@ -700,6 +780,17 @@ int ath9k_init_debug(struct ath_hw *ah) + if (!sc->debug.debugfs_xmit) + 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); +@@ -713,6 +804,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_xmit); + debugfs_remove(sc->debug.debugfs_wiphy); + debugfs_remove(sc->debug.debugfs_rcstat); +--- a/drivers/net/wireless/ath/ath9k/debug.h ++++ b/drivers/net/wireless/ath/ath9k/debug.h +@@ -132,6 +132,9 @@ struct ath9k_debug { + struct dentry *debugfs_rcstat; + struct dentry *debugfs_wiphy; + struct dentry *debugfs_xmit; ++ struct dentry *debugfs_regidx; ++ struct dentry *debugfs_regval; ++ u32 regidx; + struct ath_stats stats; + }; +