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@xxxxxxx> --- diff -urN compat-wireless-2009-01-19/drivers/net/wireless/ath9k/ath9k.h compat-wireless-2009-01-19.orig/drivers/net/wireless/ath9k/ath9k.h --- compat-wireless-2009-01-19.orig/drivers/net/wireless/ath9k/ath9k.h 2009-01-19 20:07:21.000000000 +0100 +++ compat-wireless-2009-01-19/drivers/net/wireless/ath9k/ath9k.h 2009-01-23 01:54:41.000000000 +0100 @@ -916,6 +916,7 @@ bool ath9k_hw_setbssidmask(struct ath_hal *ah, const u8 *mask); void ath9k_hw_write_associd(struct ath_hal *ah, const u8 *bssid, u16 assocId); u64 ath9k_hw_gettsf64(struct ath_hal *ah); +void ath9k_hw_settsf64(struct ath_hal *ah, u64 tsf64); void ath9k_hw_reset_tsf(struct ath_hal *ah); bool ath9k_hw_set_tsfadjust(struct ath_hal *ah, u32 setting); bool ath9k_hw_setslottime(struct ath_hal *ah, u32 us); diff -urN compat-wireless-2009-01-19/drivers/net/wireless/ath9k/core.h compat-wireless-2009-01-19.orig/drivers/net/wireless/ath9k/core.h --- compat-wireless-2009-01-19.orig/drivers/net/wireless/ath9k/core.h 2009-01-19 20:07:21.000000000 +0100 +++ compat-wireless-2009-01-19/drivers/net/wireless/ath9k/core.h 2009-01-23 02:40:53.000000000 +0100 @@ -141,6 +141,7 @@ struct dentry *debugfs_phy; struct dentry *debugfs_dma; struct dentry *debugfs_interrupt; + struct dentry *debugfs_tsf; struct ath_stats stats; }; diff -urN compat-wireless-2009-01-19/drivers/net/wireless/ath9k/debug.c compat-wireless-2009-01-19.orig/drivers/net/wireless/ath9k/debug.c --- compat-wireless-2009-01-19.orig/drivers/net/wireless/ath9k/debug.c 2009-01-19 20:07:21.000000000 +0100 +++ compat-wireless-2009-01-19/drivers/net/wireless/ath9k/debug.c 2009-01-23 02:45:34.000000000 +0100 @@ -222,6 +222,49 @@ .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 @@ 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 @@ 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); diff -urN compat-wireless-2009-01-19/drivers/net/wireless/ath9k/hw.c compat-wireless-2009-01-19.orig/drivers/net/wireless/ath9k/hw.c --- compat-wireless-2009-01-19.orig/drivers/net/wireless/ath9k/hw.c 2009-01-19 20:07:21.000000000 +0100 +++ compat-wireless-2009-01-19/drivers/net/wireless/ath9k/hw.c 2009-01-23 02:39:11.000000000 +0100 @@ -3810,6 +3810,13 @@ return tsf; } +void ath9k_hw_settsf64(struct ath_hal *ah, u64 tsf64) +{ + REG_WRITE(ah, AR_TSF_L32, 0x00000000); + REG_WRITE(ah, AR_TSF_U32, (tsf64 >> 32) & 0xffffffff); + REG_WRITE(ah, AR_TSF_L32, tsf64 & 0xffffffff); +} + void ath9k_hw_reset_tsf(struct ath_hal *ah) { int count; -- NUR NOCH BIS 31.01.! GMX FreeDSL - Telefonanschluss + DSL für nur 16,37 EURO/mtl.!* http://dsl.gmx.de/?ac=OM.AD.PD003K11308T4569a -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html