mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-05 16:37:50 +00:00
mac80211: move dynamic PS timeout to hardware config
This will be needed for drivers that set the IEEE80211_HW_NO_STACK_DYNAMIC_PS flag and still want to handle dynamic PS. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Reviewed-by: Kalle Valo <kalle.valo@nokia.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
e9aeabaeb9
commit
46f2c4bd7e
5 changed files with 20 additions and 15 deletions
|
@ -515,6 +515,7 @@ static inline int __deprecated __IEEE80211_CONF_SHORT_SLOT_TIME(void)
|
||||||
* @IEEE80211_CONF_CHANGE_LISTEN_INTERVAL: the listen interval changed
|
* @IEEE80211_CONF_CHANGE_LISTEN_INTERVAL: the listen interval changed
|
||||||
* @IEEE80211_CONF_CHANGE_RADIOTAP: the radiotap flag changed
|
* @IEEE80211_CONF_CHANGE_RADIOTAP: the radiotap flag changed
|
||||||
* @IEEE80211_CONF_CHANGE_PS: the PS flag changed
|
* @IEEE80211_CONF_CHANGE_PS: the PS flag changed
|
||||||
|
* @IEEE80211_CONF_CHANGE_DYNPS_TIMEOUT: the dynamic PS timeout changed
|
||||||
* @IEEE80211_CONF_CHANGE_POWER: the TX power changed
|
* @IEEE80211_CONF_CHANGE_POWER: the TX power changed
|
||||||
* @IEEE80211_CONF_CHANGE_CHANNEL: the channel/channel_type changed
|
* @IEEE80211_CONF_CHANGE_CHANNEL: the channel/channel_type changed
|
||||||
* @IEEE80211_CONF_CHANGE_RETRY_LIMITS: retry limits changed
|
* @IEEE80211_CONF_CHANGE_RETRY_LIMITS: retry limits changed
|
||||||
|
@ -525,9 +526,10 @@ enum ieee80211_conf_changed {
|
||||||
IEEE80211_CONF_CHANGE_LISTEN_INTERVAL = BIT(2),
|
IEEE80211_CONF_CHANGE_LISTEN_INTERVAL = BIT(2),
|
||||||
IEEE80211_CONF_CHANGE_RADIOTAP = BIT(3),
|
IEEE80211_CONF_CHANGE_RADIOTAP = BIT(3),
|
||||||
IEEE80211_CONF_CHANGE_PS = BIT(4),
|
IEEE80211_CONF_CHANGE_PS = BIT(4),
|
||||||
IEEE80211_CONF_CHANGE_POWER = BIT(5),
|
IEEE80211_CONF_CHANGE_DYNPS_TIMEOUT = BIT(5),
|
||||||
IEEE80211_CONF_CHANGE_CHANNEL = BIT(6),
|
IEEE80211_CONF_CHANGE_POWER = BIT(6),
|
||||||
IEEE80211_CONF_CHANGE_RETRY_LIMITS = BIT(7),
|
IEEE80211_CONF_CHANGE_CHANNEL = BIT(7),
|
||||||
|
IEEE80211_CONF_CHANGE_RETRY_LIMITS = BIT(8),
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -540,6 +542,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)
|
||||||
|
* @dynamic_ps_timeout: dynamic powersave timeout (in ms)
|
||||||
* @channel: the channel to tune to
|
* @channel: the channel to tune to
|
||||||
* @channel_type: the channel (HT) type
|
* @channel_type: the channel (HT) type
|
||||||
* @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
|
||||||
|
@ -552,7 +555,7 @@ enum ieee80211_conf_changed {
|
||||||
struct ieee80211_conf {
|
struct ieee80211_conf {
|
||||||
int beacon_int;
|
int beacon_int;
|
||||||
u32 flags;
|
u32 flags;
|
||||||
int power_level;
|
int power_level, dynamic_ps_timeout;
|
||||||
|
|
||||||
u16 listen_interval;
|
u16 listen_interval;
|
||||||
bool radio_enabled;
|
bool radio_enabled;
|
||||||
|
|
|
@ -700,7 +700,6 @@ struct ieee80211_local {
|
||||||
unsigned int wmm_acm; /* bit field of ACM bits (BIT(802.1D tag)) */
|
unsigned int wmm_acm; /* bit field of ACM bits (BIT(802.1D tag)) */
|
||||||
|
|
||||||
bool powersave;
|
bool powersave;
|
||||||
int dynamic_ps_timeout;
|
|
||||||
struct work_struct dynamic_ps_enable_work;
|
struct work_struct dynamic_ps_enable_work;
|
||||||
struct work_struct dynamic_ps_disable_work;
|
struct work_struct dynamic_ps_disable_work;
|
||||||
struct timer_list dynamic_ps_timer;
|
struct timer_list dynamic_ps_timer;
|
||||||
|
|
|
@ -777,9 +777,10 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
if (local->powersave &&
|
if (local->powersave &&
|
||||||
!(local->hw.flags & IEEE80211_HW_NO_STACK_DYNAMIC_PS)) {
|
!(local->hw.flags & IEEE80211_HW_NO_STACK_DYNAMIC_PS)) {
|
||||||
if (local->dynamic_ps_timeout > 0)
|
if (local->hw.conf.dynamic_ps_timeout > 0)
|
||||||
mod_timer(&local->dynamic_ps_timer, jiffies +
|
mod_timer(&local->dynamic_ps_timer, jiffies +
|
||||||
msecs_to_jiffies(local->dynamic_ps_timeout));
|
msecs_to_jiffies(
|
||||||
|
local->hw.conf.dynamic_ps_timeout));
|
||||||
else {
|
else {
|
||||||
ieee80211_send_nullfunc(local, sdata, 1);
|
ieee80211_send_nullfunc(local, sdata, 1);
|
||||||
conf->flags |= IEEE80211_CONF_PS;
|
conf->flags |= IEEE80211_CONF_PS;
|
||||||
|
|
|
@ -1296,7 +1296,7 @@ int ieee80211_master_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(local->hw.flags & IEEE80211_HW_NO_STACK_DYNAMIC_PS) &&
|
if (!(local->hw.flags & IEEE80211_HW_NO_STACK_DYNAMIC_PS) &&
|
||||||
local->dynamic_ps_timeout > 0) {
|
local->hw.conf.dynamic_ps_timeout > 0) {
|
||||||
if (local->hw.conf.flags & IEEE80211_CONF_PS) {
|
if (local->hw.conf.flags & IEEE80211_CONF_PS) {
|
||||||
ieee80211_stop_queues_by_reason(&local->hw,
|
ieee80211_stop_queues_by_reason(&local->hw,
|
||||||
IEEE80211_QUEUE_STOP_REASON_PS);
|
IEEE80211_QUEUE_STOP_REASON_PS);
|
||||||
|
@ -1305,7 +1305,7 @@ int ieee80211_master_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
mod_timer(&local->dynamic_ps_timer, jiffies +
|
mod_timer(&local->dynamic_ps_timer, jiffies +
|
||||||
msecs_to_jiffies(local->dynamic_ps_timeout));
|
msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout));
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(info, 0, sizeof(*info));
|
memset(info, 0, sizeof(*info));
|
||||||
|
|
|
@ -863,17 +863,19 @@ static int ieee80211_ioctl_siwpower(struct net_device *dev,
|
||||||
timeout = wrq->value / 1000;
|
timeout = wrq->value / 1000;
|
||||||
|
|
||||||
set:
|
set:
|
||||||
if (ps == local->powersave && timeout == local->dynamic_ps_timeout)
|
if (ps == local->powersave && timeout == conf->dynamic_ps_timeout)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
local->powersave = ps;
|
local->powersave = ps;
|
||||||
local->dynamic_ps_timeout = timeout;
|
conf->dynamic_ps_timeout = timeout;
|
||||||
|
|
||||||
if (!(local->hw.flags & IEEE80211_HW_NO_STACK_DYNAMIC_PS) &&
|
if (local->hw.flags & IEEE80211_HW_NO_STACK_DYNAMIC_PS) {
|
||||||
(sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED)) {
|
ret = ieee80211_hw_config(local,
|
||||||
if (local->dynamic_ps_timeout > 0)
|
IEEE80211_CONF_CHANGE_DYNPS_TIMEOUT);
|
||||||
|
} else if (sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED) {
|
||||||
|
if (conf->dynamic_ps_timeout > 0)
|
||||||
mod_timer(&local->dynamic_ps_timer, jiffies +
|
mod_timer(&local->dynamic_ps_timer, jiffies +
|
||||||
msecs_to_jiffies(local->dynamic_ps_timeout));
|
msecs_to_jiffies(conf->dynamic_ps_timeout));
|
||||||
else {
|
else {
|
||||||
if (local->powersave) {
|
if (local->powersave) {
|
||||||
ieee80211_send_nullfunc(local, sdata, 1);
|
ieee80211_send_nullfunc(local, sdata, 1);
|
||||||
|
|
Loading…
Reference in a new issue