aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/wext.c
diff options
context:
space:
mode:
authorLuis R. Rodriguez <lrodriguez@atheros.com>2008-10-22 16:13:53 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-10-31 19:00:52 -0400
commitd9d2925713d92bbe33b2edff3d7de1ce5646ab54 (patch)
tree4158ac6cb1615183a2d7dcb34b97a341597b2d21 /net/mac80211/wext.c
parente2ef12d3fdb771002e7c7b6bd8f19902b1934e03 (diff)
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: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/wext.c')
-rw-r--r--net/mac80211/wext.c18
1 files changed, 6 insertions, 12 deletions
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c
index 31d2e74a1bc0..231cab57351f 100644
--- a/net/mac80211/wext.c
+++ b/net/mac80211/wext.c
@@ -656,6 +656,7 @@ static int ieee80211_ioctl_siwtxpower(struct net_device *dev,
656 union iwreq_data *data, char *extra) 656 union iwreq_data *data, char *extra)
657{ 657{
658 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); 658 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
659 struct ieee80211_channel* chan = local->hw.conf.channel;
659 u32 reconf_flags = 0; 660 u32 reconf_flags = 0;
660 int new_power_level; 661 int new_power_level;
661 662
@@ -663,20 +664,13 @@ static int ieee80211_ioctl_siwtxpower(struct net_device *dev,
663 return -EINVAL; 664 return -EINVAL;
664 if (data->txpower.flags & IW_TXPOW_RANGE) 665 if (data->txpower.flags & IW_TXPOW_RANGE)
665 return -EINVAL; 666 return -EINVAL;
667 if (!chan)
668 return -EINVAL;
666 669
667 if (data->txpower.fixed) { 670 if (data->txpower.fixed)
668 new_power_level = data->txpower.value; 671 new_power_level = min(data->txpower.value, chan->max_power);
669 } else { 672 else /* Automatic power level setting */
670 /*
671 * Automatic power level. Use maximum power for the current
672 * channel. Should be part of rate control.
673 */
674 struct ieee80211_channel* chan = local->hw.conf.channel;
675 if (!chan)
676 return -EINVAL;
677
678 new_power_level = chan->max_power; 673 new_power_level = chan->max_power;
679 }
680 674
681 if (local->hw.conf.power_level != new_power_level) { 675 if (local->hw.conf.power_level != new_power_level) {
682 local->hw.conf.power_level = new_power_level; 676 local->hw.conf.power_level = new_power_level;