Commit 46f2c4bd authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville
Browse files

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: default avatarJohannes Berg <johannes@sipsolutions.net>
Reviewed-by: default avatarKalle Valo <kalle.valo@nokia.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent e9aeabae
Loading
Loading
Loading
Loading
+7 −4
Original line number Original line Diff line number Diff line
@@ -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;
+0 −1
Original line number Original line Diff line number Diff line
@@ -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;
+3 −2
Original line number Original line Diff line number Diff line
@@ -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;
+2 −2
Original line number Original line Diff line number Diff line
@@ -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));
+8 −6
Original line number Original line Diff line number Diff line
@@ -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);