Commit d9d29257 authored by Luis R. Rodriguez's avatar Luis R. Rodriguez Committed by John W. Linville

mac80211: make use of regulatory tx power settings on change of tx power

We do not know what max power to allow until a device is targeting
a channel, therefore only allow changing tx power if a channel is defined.
Also make use of the channel's max power setting as defined by
regulatory rules before allowing the user to use the requested power
setting. If the user asked us to figure it out we use the max allowed
by regulatory.
Signed-off-by: default avatarLuis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent e2ef12d3
...@@ -656,6 +656,7 @@ static int ieee80211_ioctl_siwtxpower(struct net_device *dev, ...@@ -656,6 +656,7 @@ static int ieee80211_ioctl_siwtxpower(struct net_device *dev,
union iwreq_data *data, char *extra) union iwreq_data *data, char *extra)
{ {
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
struct ieee80211_channel* chan = local->hw.conf.channel;
u32 reconf_flags = 0; u32 reconf_flags = 0;
int new_power_level; int new_power_level;
...@@ -663,20 +664,13 @@ static int ieee80211_ioctl_siwtxpower(struct net_device *dev, ...@@ -663,20 +664,13 @@ static int ieee80211_ioctl_siwtxpower(struct net_device *dev,
return -EINVAL; return -EINVAL;
if (data->txpower.flags & IW_TXPOW_RANGE) if (data->txpower.flags & IW_TXPOW_RANGE)
return -EINVAL; return -EINVAL;
if (!chan)
return -EINVAL;
if (data->txpower.fixed) { if (data->txpower.fixed)
new_power_level = data->txpower.value; new_power_level = min(data->txpower.value, chan->max_power);
} else { else /* Automatic power level setting */
/*
* Automatic power level. Use maximum power for the current
* channel. Should be part of rate control.
*/
struct ieee80211_channel* chan = local->hw.conf.channel;
if (!chan)
return -EINVAL;
new_power_level = chan->max_power; new_power_level = chan->max_power;
}
if (local->hw.conf.power_level != new_power_level) { if (local->hw.conf.power_level != new_power_level) {
local->hw.conf.power_level = new_power_level; local->hw.conf.power_level = new_power_level;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment