diff options
| author | John W. Linville <[email protected]> | 2010-05-17 13:57:43 -0400 | 
|---|---|---|
| committer | John W. Linville <[email protected]> | 2010-05-17 13:57:43 -0400 | 
| commit | 6fe70aae0d128339febfabc073ba4c4a03de4f45 (patch) | |
| tree | 711dff90df5ca4e07b5bddf11b2819e5cf2b7a93 /drivers/net/wireless/ath/ath9k/debug.c | |
| parent | 278554bd6579206921f5d8a523649a7a57f8850d (diff) | |
| parent | 0c348d7c1422d59a86d6fb37b53d75788043e50b (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/debug.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/debug.c | 236 | 
1 files changed, 197 insertions, 39 deletions
| diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c index 64e30cd45d05..29898f8d1893 100644 --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c @@ -78,6 +78,90 @@ static const struct file_operations fops_debug = {  #define DMA_BUF_LEN 1024 +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)  { @@ -711,6 +795,86 @@ static const struct file_operations fops_recv = {  	.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); @@ -722,54 +886,55 @@ int ath9k_init_debug(struct ath_hw *ah)  	sc->debug.debugfs_phy = debugfs_create_dir(wiphy_name(sc->hw->wiphy),  						      ath9k_debugfs_root);  	if (!sc->debug.debugfs_phy) -		goto err; +		return -ENOMEM;  #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) +	if (!debugfs_create_file("debug", S_IRUSR | S_IWUSR, +			sc->debug.debugfs_phy, sc, &fops_debug))  		goto err;  #endif -	sc->debug.debugfs_dma = debugfs_create_file("dma", S_IRUSR, -				       sc->debug.debugfs_phy, sc, &fops_dma); -	if (!sc->debug.debugfs_dma) +	if (!debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, +			sc, &fops_dma)) +		goto err; + +	if (!debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, +			sc, &fops_interrupt)) +		goto err; + +	if (!debugfs_create_file("rcstat", S_IRUSR, sc->debug.debugfs_phy, +			sc, &fops_rcstat)) +		goto err; + +	if (!debugfs_create_file("wiphy", S_IRUSR | S_IWUSR, +			sc->debug.debugfs_phy, sc, &fops_wiphy)) +		goto err; + +	if (!debugfs_create_file("xmit", S_IRUSR, sc->debug.debugfs_phy, +			sc, &fops_xmit))  		goto err; -	sc->debug.debugfs_interrupt = debugfs_create_file("interrupt", -						     S_IRUSR, -						     sc->debug.debugfs_phy, -						     sc, &fops_interrupt); -	if (!sc->debug.debugfs_interrupt) +	if (!debugfs_create_file("recv", S_IRUSR, sc->debug.debugfs_phy, +			sc, &fops_recv))  		goto err; -	sc->debug.debugfs_rcstat = debugfs_create_file("rcstat", -						  S_IRUSR, -						  sc->debug.debugfs_phy, -						  sc, &fops_rcstat); -	if (!sc->debug.debugfs_rcstat) +	if (!debugfs_create_file("rx_chainmask", S_IRUSR | S_IWUSR, +			sc->debug.debugfs_phy, sc, &fops_rx_chainmask))  		goto err; -	sc->debug.debugfs_wiphy = debugfs_create_file( -		"wiphy", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, -		&fops_wiphy); -	if (!sc->debug.debugfs_wiphy) +	if (!debugfs_create_file("tx_chainmask", S_IRUSR | S_IWUSR, +			sc->debug.debugfs_phy, sc, &fops_tx_chainmask))  		goto err; -	sc->debug.debugfs_xmit = debugfs_create_file("xmit", -						     S_IRUSR, -						     sc->debug.debugfs_phy, -						     sc, &fops_xmit); -	if (!sc->debug.debugfs_xmit) +	if (!debugfs_create_file("regidx", S_IRUSR | S_IWUSR, +			sc->debug.debugfs_phy, sc, &fops_regidx))  		goto err; -	sc->debug.debugfs_recv = debugfs_create_file("recv", -						     S_IRUSR, -						     sc->debug.debugfs_phy, -						     sc, &fops_recv); -	if (!sc->debug.debugfs_recv) +	if (!debugfs_create_file("regval", S_IRUSR | S_IWUSR, +			sc->debug.debugfs_phy, sc, &fops_regval))  		goto err; +	sc->debug.regidx = 0;  	return 0;  err:  	ath9k_exit_debug(ah); @@ -781,14 +946,7 @@ 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_recv); -	debugfs_remove(sc->debug.debugfs_xmit); -	debugfs_remove(sc->debug.debugfs_wiphy); -	debugfs_remove(sc->debug.debugfs_rcstat); -	debugfs_remove(sc->debug.debugfs_interrupt); -	debugfs_remove(sc->debug.debugfs_dma); -	debugfs_remove(sc->debug.debugfs_debug); -	debugfs_remove(sc->debug.debugfs_phy); +	debugfs_remove_recursive(sc->debug.debugfs_phy);  }  int ath9k_debug_create_root(void) |