Commit e3c92df0 authored by Vasanthakumar Thiagarajan's avatar Vasanthakumar Thiagarajan Committed by John W. Linville

mac80211: Fix tx power setting

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: default avatarVasanthakumar Thiagarajan <vasanth@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent a085ff71
...@@ -546,6 +546,7 @@ enum ieee80211_conf_changed { ...@@ -546,6 +546,7 @@ enum ieee80211_conf_changed {
* @listen_interval: listen interval in units of beacon interval * @listen_interval: listen interval in units of beacon interval
* @flags: configuration flags defined above * @flags: configuration flags defined above
* @power_level: requested transmit power (in dBm) * @power_level: requested transmit power (in dBm)
* @user_power_level: User configured transmit power (in dBm)
* @channel: the channel to tune to * @channel: the channel to tune to
* @ht: the HT configuration for the device * @ht: the HT configuration for the device
* @long_frame_max_tx_count: Maximum number of transmissions for a "long" frame * @long_frame_max_tx_count: Maximum number of transmissions for a "long" frame
...@@ -559,6 +560,7 @@ struct ieee80211_conf { ...@@ -559,6 +560,7 @@ struct ieee80211_conf {
int beacon_int; int beacon_int;
u32 flags; u32 flags;
int power_level; int power_level;
int user_power_level;
u16 listen_interval; u16 listen_interval;
bool radio_enabled; bool radio_enabled;
......
...@@ -214,10 +214,10 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed) ...@@ -214,10 +214,10 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed)
changed |= IEEE80211_CONF_CHANGE_CHANNEL; changed |= IEEE80211_CONF_CHANGE_CHANNEL;
} }
if (!local->hw.conf.power_level) if (!local->hw.conf.user_power_level)
power = chan->max_power; power = chan->max_power;
else 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) { if (local->hw.conf.power_level != power) {
changed |= IEEE80211_CONF_CHANGE_POWER; changed |= IEEE80211_CONF_CHANGE_POWER;
local->hw.conf.power_level = power; local->hw.conf.power_level = power;
......
...@@ -549,10 +549,9 @@ static int ieee80211_ioctl_siwtxpower(struct net_device *dev, ...@@ -549,10 +549,9 @@ static int ieee80211_ioctl_siwtxpower(struct net_device *dev,
else /* Automatic power level setting */ else /* Automatic power level setting */
new_power_level = chan->max_power; new_power_level = chan->max_power;
if (local->hw.conf.power_level != new_power_level) { local->hw.conf.user_power_level = new_power_level;
local->hw.conf.power_level = new_power_level; if (local->hw.conf.power_level != new_power_level)
reconf_flags |= IEEE80211_CONF_CHANGE_POWER; reconf_flags |= IEEE80211_CONF_CHANGE_POWER;
}
if (local->hw.conf.radio_enabled != !(data->txpower.disabled)) { if (local->hw.conf.radio_enabled != !(data->txpower.disabled)) {
local->hw.conf.radio_enabled = !(data->txpower.disabled); local->hw.conf.radio_enabled = !(data->txpower.disabled);
......
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