diff options
author | Mattias Nissler <mattias.nissler@gmx.de> | 2007-10-24 23:30:36 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 23:54:19 +0100 |
commit | 6a4329554c527e86c2745bc001c29bb8d1b8efaf (patch) | |
tree | e85887daee02c3df9af312c83b085a39c414b218 /net | |
parent | [NETPOLL]: Don't need rx_flags. (diff) | |
download | linux-6a4329554c527e86c2745bc001c29bb8d1b8efaf.tar.xz linux-6a4329554c527e86c2745bc001c29bb8d1b8efaf.zip |
mac80211: Accept auto txpower setting
This changes the SIWTXPOWER ioctl to also accept a txpower setting of
"automatic". Since mac80211 currently cannot tell drivers to automatically
adjust tx power, we select the tx power level of the current channel. While
this is kind of a hack, it certainly saves some iwconfig users from headaches.
Signed-off-by: Mattias Nissler <mattias.nissler@gmx.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/ieee80211_ioctl.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/net/mac80211/ieee80211_ioctl.c b/net/mac80211/ieee80211_ioctl.c index 308bbe4a1333..da3350d44da1 100644 --- a/net/mac80211/ieee80211_ioctl.c +++ b/net/mac80211/ieee80211_ioctl.c @@ -634,22 +634,35 @@ static int ieee80211_ioctl_siwtxpower(struct net_device *dev, { struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); bool need_reconfig = 0; + u8 new_power_level; if ((data->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM) return -EINVAL; if (data->txpower.flags & IW_TXPOW_RANGE) return -EINVAL; - if (!data->txpower.fixed) - return -EINVAL; - if (local->hw.conf.power_level != data->txpower.value) { - local->hw.conf.power_level = data->txpower.value; + if (data->txpower.fixed) { + new_power_level = data->txpower.value; + } else { + /* Automatic power level. Get the px power from the current + * channel. */ + struct ieee80211_channel* chan = local->oper_channel; + if (!chan) + return -EINVAL; + + new_power_level = chan->power_level; + } + + if (local->hw.conf.power_level != new_power_level) { + local->hw.conf.power_level = new_power_level; need_reconfig = 1; } + if (local->hw.conf.radio_enabled != !(data->txpower.disabled)) { local->hw.conf.radio_enabled = !(data->txpower.disabled); need_reconfig = 1; } + if (need_reconfig) { ieee80211_hw_config(local); /* The return value of hw_config is not of big interest here, |