Commit 3b5d665b authored by Alina Friedrichsen's avatar Alina Friedrichsen Committed by John W. Linville
Browse files

mac80211: Generic TSF debugging



This patch enables low-level driver independent debugging of the TSF and remove the driver specific things of ath5k and ath9k from the debugfs.

Signed-off-by: default avatarAlina Friedrichsen <x-alina@gmx.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 3978e5bc
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -239,6 +239,7 @@ static int ath5k_get_stats(struct ieee80211_hw *hw,
static int ath5k_get_tx_stats(struct ieee80211_hw *hw,
		struct ieee80211_tx_queue_stats *stats);
static u64 ath5k_get_tsf(struct ieee80211_hw *hw);
static void ath5k_set_tsf(struct ieee80211_hw *hw, u64 tsf);
static void ath5k_reset_tsf(struct ieee80211_hw *hw);
static int ath5k_beacon_update(struct ath5k_softc *sc,
		struct sk_buff *skb);
@@ -261,6 +262,7 @@ static struct ieee80211_ops ath5k_hw_ops = {
	.conf_tx 	= NULL,
	.get_tx_stats 	= ath5k_get_tx_stats,
	.get_tsf 	= ath5k_get_tsf,
	.set_tsf 	= ath5k_set_tsf,
	.reset_tsf 	= ath5k_reset_tsf,
	.bss_info_changed = ath5k_bss_info_changed,
};
@@ -3110,6 +3112,14 @@ ath5k_get_tsf(struct ieee80211_hw *hw)
	return ath5k_hw_get_tsf64(sc->ah);
}

static void
ath5k_set_tsf(struct ieee80211_hw *hw, u64 tsf)
{
	struct ath5k_softc *sc = hw->priv;

	ath5k_hw_set_tsf64(sc->ah, tsf);
}

static void
ath5k_reset_tsf(struct ieee80211_hw *hw)
{
+0 −48
Original line number Diff line number Diff line
@@ -193,50 +193,6 @@ static const struct file_operations fops_registers = {
};


/* debugfs: TSF */

static ssize_t read_file_tsf(struct file *file, char __user *user_buf,
				   size_t count, loff_t *ppos)
{
	struct ath5k_softc *sc = file->private_data;
	char buf[100];
	snprintf(buf, sizeof(buf), "0x%016llx\n",
		 (unsigned long long)ath5k_hw_get_tsf64(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 *userbuf,
				 size_t count, loff_t *ppos)
{
	struct ath5k_softc *sc = file->private_data;
	char buf[21];
	unsigned long long tsf;

	if (copy_from_user(buf, userbuf, min(count, sizeof(buf) - 1)))
		return -EFAULT;
	buf[sizeof(buf) - 1] = '\0';

	if (strncmp(buf, "reset", 5) == 0) {
		ath5k_hw_reset_tsf(sc->ah);
		printk(KERN_INFO "debugfs reset TSF\n");
	} else {
		tsf = simple_strtoul(buf, NULL, 0);
		ath5k_hw_set_tsf64(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 = ath5k_debugfs_open,
	.owner = THIS_MODULE,
};


/* debugfs: beacons */

static ssize_t read_file_beacon(struct file *file, char __user *user_buf,
@@ -430,9 +386,6 @@ ath5k_debug_init_device(struct ath5k_softc *sc)
	sc->debug.debugfs_registers = debugfs_create_file("registers", S_IRUGO,
				sc->debug.debugfs_phydir, sc, &fops_registers);

	sc->debug.debugfs_tsf = debugfs_create_file("tsf", S_IWUSR | S_IRUGO,
				sc->debug.debugfs_phydir, sc, &fops_tsf);

	sc->debug.debugfs_beacon = debugfs_create_file("beacon", S_IWUSR | S_IRUGO,
				sc->debug.debugfs_phydir, sc, &fops_beacon);

@@ -451,7 +404,6 @@ ath5k_debug_finish_device(struct ath5k_softc *sc)
{
	debugfs_remove(sc->debug.debugfs_debug);
	debugfs_remove(sc->debug.debugfs_registers);
	debugfs_remove(sc->debug.debugfs_tsf);
	debugfs_remove(sc->debug.debugfs_beacon);
	debugfs_remove(sc->debug.debugfs_reset);
	debugfs_remove(sc->debug.debugfs_phydir);
+0 −1
Original line number Diff line number Diff line
@@ -72,7 +72,6 @@ struct ath5k_dbg_info {
	struct dentry		*debugfs_phydir;
	struct dentry		*debugfs_debug;
	struct dentry		*debugfs_registers;
	struct dentry		*debugfs_tsf;
	struct dentry		*debugfs_beacon;
	struct dentry		*debugfs_reset;
};
+0 −1
Original line number Diff line number Diff line
@@ -141,7 +141,6 @@ struct ath9k_debug {
	struct dentry *debugfs_phy;
	struct dentry *debugfs_dma;
	struct dentry *debugfs_interrupt;
	struct dentry *debugfs_tsf;
	struct ath_stats stats;
};

+0 −48
Original line number Diff line number Diff line
@@ -223,48 +223,6 @@ static const struct file_operations fops_interrupt = {
};


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;
@@ -290,11 +248,6 @@ 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);
@@ -303,7 +256,6 @@ 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);
Loading