summaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath9k/debug.c
diff options
context:
space:
mode:
authorAlina Friedrichsen <x-alina@gmx.net>2009-01-23 05:44:21 +0100
committerJohn W. Linville <linville@tuxdriver.com>2009-01-29 16:01:22 -0500
commit27abe060aa9d3410545ef663676c7183fc2512c6 (patch)
tree33dc2e0c3e783a0446e92436540c69a87778b48e /drivers/net/wireless/ath9k/debug.c
parent8cab7581dba90b0519e25784e08feb5dedde737f (diff)
ath9k: Read and write the TSF via debugfs
This patch adds an ath9k specific entry to read, write and reset the TSF into the debugfs, like in ath5k. This makes debugging the IBSS handling of wifi drivers _much_ easier. Signed-off-by: Alina Friedrichsen <x-alina@gmx.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath9k/debug.c')
-rw-r--r--drivers/net/wireless/ath9k/debug.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath9k/debug.c b/drivers/net/wireless/ath9k/debug.c
index a80ed576830..05e1f82cc7a 100644
--- a/drivers/net/wireless/ath9k/debug.c
+++ b/drivers/net/wireless/ath9k/debug.c
@@ -222,6 +222,49 @@ static const struct file_operations fops_interrupt = {
.owner = THIS_MODULE
};
+
+static ssize_t read_file_tsf(struct file *file, char __user *user_buf,
+ size_t count, loff_t *ppos)
+{
+ struct ath_softc *sc = file->private_data;
+ char buf[100];
+ snprintf(buf, sizeof(buf), "0x%016llx\n",
+ (unsigned long long)ath9k_hw_gettsf64(sc->sc_ah));
+ return simple_read_from_buffer(user_buf, count, ppos, buf, 19);
+}
+
+static ssize_t write_file_tsf(struct file *file,
+ const char __user *user_buf,
+ size_t count, loff_t *ppos)
+{
+ struct ath_softc *sc = file->private_data;
+ char buf[21];
+ unsigned long long tsf;
+
+ if (copy_from_user(buf, user_buf, min(count, sizeof(buf) - 1)))
+ return -EFAULT;
+ buf[sizeof(buf) - 1] = '\0';
+
+ if (strncmp(buf, "reset", 5) == 0) {
+ ath9k_hw_reset_tsf(sc->sc_ah);
+ printk(KERN_INFO "debugfs reset TSF\n");
+ } else {
+ tsf = simple_strtoul(buf, NULL, 0);
+ ath9k_hw_settsf64(sc->sc_ah, tsf);
+ printk(KERN_INFO "debugfs set TSF to %#018llx\n", tsf);
+ }
+
+ return count;
+}
+
+static const struct file_operations fops_tsf = {
+ .read = read_file_tsf,
+ .write = write_file_tsf,
+ .open = ath9k_debugfs_open,
+ .owner = THIS_MODULE
+};
+
+
int ath9k_init_debug(struct ath_softc *sc)
{
sc->sc_debug.debug_mask = ath9k_debug;
@@ -247,6 +290,11 @@ int ath9k_init_debug(struct ath_softc *sc)
if (!sc->sc_debug.debugfs_interrupt)
goto err;
+ sc->sc_debug.debugfs_tsf = debugfs_create_file("tsf", S_IRUGO,
+ sc->sc_debug.debugfs_phy, sc, &fops_tsf);
+ if (!sc->sc_debug.debugfs_tsf)
+ goto err;
+
return 0;
err:
ath9k_exit_debug(sc);
@@ -255,6 +303,7 @@ err:
void ath9k_exit_debug(struct ath_softc *sc)
{
+ debugfs_remove(sc->sc_debug.debugfs_tsf);
debugfs_remove(sc->sc_debug.debugfs_interrupt);
debugfs_remove(sc->sc_debug.debugfs_dma);
debugfs_remove(sc->sc_debug.debugfs_phy);