mac80211: Fix tx power setting
authorVasanthakumar Thiagarajan <vasanth@atheros.com>
Wed, 24 Dec 2008 08:23:11 +0000 (13:53 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 29 Jan 2009 20:59:36 +0000 (15:59 -0500)
power_level in ieee80211_conf is being used for more than one
purpose. It being used as user configured power limit and the
final power limit given to the driver. By doing so, except very
first time, the tx power limit is taken from min(chan->max_power,
local->hw.conf.power_level) which is not what we want. This patch
defines a new memeber in ieee80211_conf which is meant only for
user configured power limit.

Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/net/mac80211.h
net/mac80211/main.c
net/mac80211/wext.c

index 9d67fdf1c26acbb3851c0635d037a2ede14420e7..ffcbd12775a485931f75097bc7a393bd06c66b45 100644 (file)
@@ -546,6 +546,7 @@ enum ieee80211_conf_changed {
  * @listen_interval: listen interval in units of beacon interval
  * @flags: configuration flags defined above
  * @power_level: requested transmit power (in dBm)
+ * @user_power_level: User configured transmit power (in dBm)
  * @channel: the channel to tune to
  * @ht: the HT configuration for the device
  * @long_frame_max_tx_count: Maximum number of transmissions for a "long" frame
@@ -559,6 +560,7 @@ struct ieee80211_conf {
        int beacon_int;
        u32 flags;
        int power_level;
+       int user_power_level;
 
        u16 listen_interval;
        bool radio_enabled;
index a6cb480dda0dee275087cde13821aaff89886f9f..dca4b7da6cade958e56057ec504098cea1737a2f 100644 (file)
@@ -214,10 +214,10 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed)
                changed |= IEEE80211_CONF_CHANGE_CHANNEL;
        }
 
-       if (!local->hw.conf.power_level)
+       if (!local->hw.conf.user_power_level)
                power = chan->max_power;
        else
-               power = min(chan->max_power, local->hw.conf.power_level);
+               power = min(chan->max_power, local->hw.conf.user_power_level);
        if (local->hw.conf.power_level != power) {
                changed |= IEEE80211_CONF_CHANGE_POWER;
                local->hw.conf.power_level = power;
index 48fc6b9a62a4e58a0b3073e924e7a80d44dd8f54..654041b93736e03f57164114815ebaac27f39918 100644 (file)
@@ -549,10 +549,9 @@ static int ieee80211_ioctl_siwtxpower(struct net_device *dev,
        else /* Automatic power level setting */
                new_power_level = chan->max_power;
 
-       if (local->hw.conf.power_level != new_power_level) {
-               local->hw.conf.power_level = new_power_level;
+       local->hw.conf.user_power_level = new_power_level;
+       if (local->hw.conf.power_level != new_power_level)
                reconf_flags |= IEEE80211_CONF_CHANGE_POWER;
-       }
 
        if (local->hw.conf.radio_enabled != !(data->txpower.disabled)) {
                local->hw.conf.radio_enabled = !(data->txpower.disabled);