For testing purposes, this patch adds a file named "power_level" to the debugfs for bcm43xx-mac80211. If this file is read, it returns the current setting for the "Desired power level". Writing a number between 5 and 18 will set that value as the new value for the desired power setting. Signed-off-by: Larry Finger <Larry.Finger@xxxxxxxxxxxx> --- Michael, The error before is fixed in this version. Larry Index: wireless-dev/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_debugfs.c =================================================================== --- wireless-dev.orig/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_debugfs.c +++ wireless-dev/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_debugfs.c @@ -151,6 +151,74 @@ out_unlock_bb: return res; } +static ssize_t power_read_file(struct file *file, char __user *userbuf, + size_t count, loff_t *ppos) +{ + struct bcm43xx_wldev *dev = file->private_data; + const size_t len = ARRAY_SIZE(big_buffer); + char *buf = big_buffer; + size_t pos = 0; + ssize_t res; + unsigned long flags; + + mutex_lock(&big_buffer_mutex); + mutex_lock(&dev->wl->mutex); + spin_lock_irqsave(&dev->wl->irq_lock, flags); + if (bcm43xx_status(dev) < BCM43xx_STAT_STARTED) { + fappend("Board not initialized.\n"); + goto out; + } + fappend("%d dBm\n",dev->phy.power_level); + +out: + spin_unlock_irqrestore(&dev->wl->irq_lock, flags); + mutex_unlock(&dev->wl->mutex); + res = simple_read_from_buffer(userbuf, count, ppos, buf, pos); + mutex_unlock(&big_buffer_mutex); + + return res; +} + +static ssize_t power_write_file(struct file *file, const char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct bcm43xx_wldev *dev = file->private_data; + char *buf = big_buffer; + ssize_t buf_size; + ssize_t res; + unsigned long flags; + int power; + + mutex_lock(&big_buffer_mutex); + buf_size = min(count, ARRAY_SIZE(big_buffer) - 1); + if (copy_from_user(buf, user_buf, buf_size)) { + res = -EFAULT; + goto out_unlock_bb; + } + mutex_lock(&dev->wl->mutex); + spin_lock_irqsave(&dev->wl->irq_lock, flags); + if (bcm43xx_status(dev) < BCM43xx_STAT_STARTED) { + bcmerr(dev->wl, "debugfs: Board not initialized.\n"); + res = -EFAULT; + goto out_unlock; + } + if ((sscanf(buf, "%d", &power) != 1) || (power > 18 || power < 5)) { + bcmerr(dev->wl, "debugfs: Invalid values for power level\n"); + res = -EINVAL; + goto out_unlock; + } + dev->phy.power_level = power; + res = buf_size; + +out_unlock: + spin_unlock_irqrestore(&dev->wl->irq_lock, flags); + mutex_unlock(&dev->wl->mutex); +out_unlock_bb: + mutex_unlock(&big_buffer_mutex); + + return res; +} + static ssize_t txstat_read_file(struct file *file, char __user *userbuf, size_t count, loff_t *ppos) { @@ -405,6 +473,12 @@ static struct file_operations restart_fo .open = open_file_generic, }; +static struct file_operations power_fops = { + .read = power_read_file, + .write = power_write_file, + .open = open_file_generic, +}; + int bcm43xx_debug(struct bcm43xx_wldev *dev, enum bcm43xx_dyndbg feature) { @@ -495,6 +569,11 @@ void bcm43xx_debugfs_add_device(struct b if (IS_ERR(e->dentry_restart)) e->dentry_restart = NULL; + e->dentry_power = debugfs_create_file("power_level", 0600, e->subdir, + dev, &power_fops); + if (IS_ERR(e->dentry_power)) + e->dentry_power = NULL; + bcm43xx_add_dynamic_debug(dev); } @@ -512,6 +591,7 @@ void bcm43xx_debugfs_remove_device(struc debugfs_remove(e->dentry_txstat); debugfs_remove(e->dentry_restart); debugfs_remove(e->dentry_txpower_g); + debugfs_remove(e->dentry_power); debugfs_remove(e->subdir); kfree(e->txstatlog.log); kfree(e); Index: wireless-dev/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_debugfs.h =================================================================== --- wireless-dev.orig/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_debugfs.h +++ wireless-dev/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_debugfs.h @@ -35,6 +35,7 @@ struct bcm43xx_dfsentry { struct dentry *dentry_txstat; struct dentry *dentry_txpower_g; struct dentry *dentry_restart; + struct dentry *dentry_power; struct bcm43xx_wldev *dev; Index: wireless-dev/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_main.c =================================================================== --- wireless-dev.orig/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_main.c +++ wireless-dev/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_main.c @@ -2763,7 +2763,8 @@ static int bcm43xx_dev_config(struct iee /* Adjust the desired TX power level. */ if (conf->power_level != 0) { - if (conf->power_level != phy->power_level) { + if (conf->power_level != phy->power_level && + phy->power_level == 0) { phy->power_level = conf->power_level; bcm43xx_phy_xmitpower(dev); } - 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