diff options
Diffstat (limited to 'package/mac80211/patches/520-ath9k_debugfs_chainmask.patch')
-rw-r--r-- | package/mac80211/patches/520-ath9k_debugfs_chainmask.patch | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/package/mac80211/patches/520-ath9k_debugfs_chainmask.patch b/package/mac80211/patches/520-ath9k_debugfs_chainmask.patch new file mode 100644 index 000000000..d8ca8dfbf --- /dev/null +++ b/package/mac80211/patches/520-ath9k_debugfs_chainmask.patch @@ -0,0 +1,130 @@ +--- 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; |