diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-05-11 12:59:32 +0200 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-05-11 12:59:37 +0200 | 
| commit | 7961386fe9596e6bf03d09948a73c5df9653325b (patch) | |
| tree | 60fa2586a0d340ef8f7473956eef17430d8250c7 /net/mac80211/wext.c | |
| parent | aa47b7e0f89b9998dad4d1667447e8cb7703ff4e (diff) | |
| parent | 091bf7624d1c90cec9e578a18529f615213ff847 (diff) | |
| download | olio-linux-3.10-7961386fe9596e6bf03d09948a73c5df9653325b.tar.xz olio-linux-3.10-7961386fe9596e6bf03d09948a73c5df9653325b.zip  | |
Merge commit 'v2.6.30-rc5' into sched/core
Merge reason: sched/core was on .30-rc1 before, update to latest fixes
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'net/mac80211/wext.c')
| -rw-r--r-- | net/mac80211/wext.c | 43 | 
1 files changed, 34 insertions, 9 deletions
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c index deb4ecec122..959aa8379cc 100644 --- a/net/mac80211/wext.c +++ b/net/mac80211/wext.c @@ -417,6 +417,7 @@ static int ieee80211_ioctl_siwtxpower(struct net_device *dev,  {  	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);  	struct ieee80211_channel* chan = local->hw.conf.channel; +	bool reconf = false;  	u32 reconf_flags = 0;  	int new_power_level; @@ -427,14 +428,38 @@ static int ieee80211_ioctl_siwtxpower(struct net_device *dev,  	if (!chan)  		return -EINVAL; -	if (data->txpower.fixed) -		new_power_level = min(data->txpower.value, chan->max_power); -	else /* Automatic power level setting */ -		new_power_level = chan->max_power; +	/* only change when not disabling */ +	if (!data->txpower.disabled) { +		if (data->txpower.fixed) { +			if (data->txpower.value < 0) +				return -EINVAL; +			new_power_level = data->txpower.value; +			/* +			 * Debatable, but we cannot do a fixed power +			 * level above the regulatory constraint. +			 * Use "iwconfig wlan0 txpower 15dBm" instead. +			 */ +			if (new_power_level > chan->max_power) +				return -EINVAL; +		} else { +			/* +			 * Automatic power level setting, max being the value +			 * passed in from userland. +			 */ +			if (data->txpower.value < 0) +				new_power_level = -1; +			else +				new_power_level = data->txpower.value; +		} + +		reconf = true; -	local->user_power_level = new_power_level; -	if (local->hw.conf.power_level != new_power_level) -		reconf_flags |= IEEE80211_CONF_CHANGE_POWER; +		/* +		 * ieee80211_hw_config() will limit to the channel's +		 * max power and possibly power constraint from AP. +		 */ +		local->user_power_level = new_power_level; +	}  	if (local->hw.conf.radio_enabled != !(data->txpower.disabled)) {  		local->hw.conf.radio_enabled = !(data->txpower.disabled); @@ -442,7 +467,7 @@ static int ieee80211_ioctl_siwtxpower(struct net_device *dev,  		ieee80211_led_radio(local, local->hw.conf.radio_enabled);  	} -	if (reconf_flags) +	if (reconf || reconf_flags)  		ieee80211_hw_config(local, reconf_flags);  	return 0; @@ -530,7 +555,7 @@ static int ieee80211_ioctl_giwfrag(struct net_device *dev,  	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);  	frag->value = local->fragmentation_threshold; -	frag->disabled = (frag->value >= IEEE80211_MAX_RTS_THRESHOLD); +	frag->disabled = (frag->value >= IEEE80211_MAX_FRAG_THRESHOLD);  	frag->fixed = 1;  	return 0;  |