Commit 7af2c460 authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

iwlwifi: clean up PS code

This removes all the dead code that tries to adjust the power
saving level based on the system AC state (inacceptable policy
in the kernel) or based on overtemp conditions (unused).

Also, pass _all_ policy wrt. enabling PS to mac80211, since
we do not use the power_disabled internally I now use that to
mirror the mac80211 CONF_PS setting. When mac80211 turns off
CONF_PS we follow suit. This means that the user power level
(which can currently only be set from sysfs) is not touched
for mac80211 powersave changes.

This means no "association status" checks are necessary since
mac80211 will not allow power save to be enabled when not
associated.
Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Acked-by: default avatarMohamed Abbas <mohamed.abbas@intel.com>
Signed-off-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent f0f74a0e
...@@ -1838,7 +1838,6 @@ void iwl_post_associate(struct iwl_priv *priv) ...@@ -1838,7 +1838,6 @@ void iwl_post_associate(struct iwl_priv *priv)
if (!priv->vif || !priv->is_open) if (!priv->vif || !priv->is_open)
return; return;
iwl_power_cancel_timeout(priv);
iwl_scan_cancel_timeout(priv, 200); iwl_scan_cancel_timeout(priv, 200);
conf = ieee80211_get_hw_conf(priv->hw); conf = ieee80211_get_hw_conf(priv->hw);
...@@ -1914,7 +1913,7 @@ void iwl_post_associate(struct iwl_priv *priv) ...@@ -1914,7 +1913,7 @@ void iwl_post_associate(struct iwl_priv *priv)
* If chain noise has already been run, then we need to enable * If chain noise has already been run, then we need to enable
* power management here */ * power management here */
if (priv->chain_noise_data.state == IWL_CHAIN_NOISE_DONE) if (priv->chain_noise_data.state == IWL_CHAIN_NOISE_DONE)
iwl_power_enable_management(priv); iwl_power_update_mode(priv, 0);
/* Enable Rx differential gain and sensitivity calibrations */ /* Enable Rx differential gain and sensitivity calibrations */
iwl_chain_noise_reset(priv); iwl_chain_noise_reset(priv);
...@@ -2465,26 +2464,11 @@ static ssize_t show_power_level(struct device *d, ...@@ -2465,26 +2464,11 @@ static ssize_t show_power_level(struct device *d,
{ {
struct iwl_priv *priv = dev_get_drvdata(d); struct iwl_priv *priv = dev_get_drvdata(d);
int mode = priv->power_data.user_power_setting; int mode = priv->power_data.user_power_setting;
int system = priv->power_data.system_power_setting;
int level = priv->power_data.power_mode; int level = priv->power_data.power_mode;
char *p = buf; char *p = buf;
switch (system) { p += sprintf(p, "INDEX:%d\t", level);
case IWL_POWER_SYS_AUTO: p += sprintf(p, "USER:%d\n", mode);
p += sprintf(p, "SYSTEM:auto");
break;
case IWL_POWER_SYS_AC:
p += sprintf(p, "SYSTEM:ac");
break;
case IWL_POWER_SYS_BATTERY:
p += sprintf(p, "SYSTEM:battery");
break;
}
p += sprintf(p, "\tMODE:%s", (mode < IWL_POWER_AUTO) ?
"fixed" : "auto");
p += sprintf(p, "\tINDEX:%d", level);
p += sprintf(p, "\n");
return p - buf + 1; return p - buf + 1;
} }
...@@ -2553,7 +2537,6 @@ static void iwl_setup_deferred_work(struct iwl_priv *priv) ...@@ -2553,7 +2537,6 @@ static void iwl_setup_deferred_work(struct iwl_priv *priv)
INIT_DELAYED_WORK(&priv->alive_start, iwl_bg_alive_start); INIT_DELAYED_WORK(&priv->alive_start, iwl_bg_alive_start);
iwl_setup_scan_deferred_work(priv); iwl_setup_scan_deferred_work(priv);
iwl_setup_power_deferred_work(priv);
if (priv->cfg->ops->lib->setup_deferred_work) if (priv->cfg->ops->lib->setup_deferred_work)
priv->cfg->ops->lib->setup_deferred_work(priv); priv->cfg->ops->lib->setup_deferred_work(priv);
...@@ -2573,7 +2556,6 @@ static void iwl_cancel_deferred_work(struct iwl_priv *priv) ...@@ -2573,7 +2556,6 @@ static void iwl_cancel_deferred_work(struct iwl_priv *priv)
cancel_delayed_work_sync(&priv->init_alive_start); cancel_delayed_work_sync(&priv->init_alive_start);
cancel_delayed_work(&priv->scan_check); cancel_delayed_work(&priv->scan_check);
cancel_delayed_work_sync(&priv->set_power_save);
cancel_delayed_work(&priv->alive_start); cancel_delayed_work(&priv->alive_start);
cancel_work_sync(&priv->beacon_update); cancel_work_sync(&priv->beacon_update);
del_timer_sync(&priv->statistics_periodic); del_timer_sync(&priv->statistics_periodic);
......
...@@ -857,7 +857,7 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv, ...@@ -857,7 +857,7 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv,
priv->cfg->ops->lib->update_chain_flags(priv); priv->cfg->ops->lib->update_chain_flags(priv);
data->state = IWL_CHAIN_NOISE_DONE; data->state = IWL_CHAIN_NOISE_DONE;
iwl_power_enable_management(priv); iwl_power_update_mode(priv, 0);
} }
EXPORT_SYMBOL(iwl_chain_noise_calibration); EXPORT_SYMBOL(iwl_chain_noise_calibration);
......
...@@ -1352,7 +1352,6 @@ int iwl_init_drv(struct iwl_priv *priv) ...@@ -1352,7 +1352,6 @@ int iwl_init_drv(struct iwl_priv *priv)
priv->ibss_beacon = NULL; priv->ibss_beacon = NULL;
spin_lock_init(&priv->lock); spin_lock_init(&priv->lock);
spin_lock_init(&priv->power_data.lock);
spin_lock_init(&priv->sta_lock); spin_lock_init(&priv->sta_lock);
spin_lock_init(&priv->hcmd_lock); spin_lock_init(&priv->hcmd_lock);
...@@ -2576,14 +2575,13 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed) ...@@ -2576,14 +2575,13 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
iwl_set_rate(priv); iwl_set_rate(priv);
} }
if (changed & IEEE80211_CONF_CHANGE_PS) { if (changed & IEEE80211_CONF_CHANGE_PS &&
if (conf->flags & IEEE80211_CONF_PS) priv->iw_mode == NL80211_IFTYPE_STATION) {
ret = iwl_power_set_user_mode(priv, IWL_POWER_INDEX_3); priv->power_data.power_disabled =
else !(conf->flags & IEEE80211_CONF_PS);
ret = iwl_power_set_user_mode(priv, IWL_POWER_MODE_CAM); ret = iwl_power_update_mode(priv, 0);
if (ret) if (ret)
IWL_DEBUG_MAC80211(priv, "Error setting power level\n"); IWL_DEBUG_MAC80211(priv, "Error setting power level\n");
} }
if (changed & IEEE80211_CONF_CHANGE_POWER) { if (changed & IEEE80211_CONF_CHANGE_POWER) {
...@@ -2719,21 +2717,7 @@ void iwl_mac_reset_tsf(struct ieee80211_hw *hw) ...@@ -2719,21 +2717,7 @@ void iwl_mac_reset_tsf(struct ieee80211_hw *hw)
iwlcore_commit_rxon(priv); iwlcore_commit_rxon(priv);
} }
iwl_power_update_mode(priv, 0);
/* Per mac80211.h: This is only used in IBSS mode... */
if (priv->iw_mode != NL80211_IFTYPE_ADHOC) { if (priv->iw_mode != NL80211_IFTYPE_ADHOC) {
/* switch to CAM during association period.
* the ucode will block any association/authentication
* frome during assiciation period if it can not hear
* the AP because of PM. the timer enable PM back is
* association do not complete
*/
if (priv->hw->conf.channel->flags &
(IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_RADAR))
iwl_power_disable_management(priv, 3000);
IWL_DEBUG_MAC80211(priv, "leave - not in IBSS\n"); IWL_DEBUG_MAC80211(priv, "leave - not in IBSS\n");
mutex_unlock(&priv->mutex); mutex_unlock(&priv->mutex);
return; return;
......
...@@ -1075,7 +1075,6 @@ struct iwl_priv { ...@@ -1075,7 +1075,6 @@ struct iwl_priv {
struct tasklet_struct irq_tasklet; struct tasklet_struct irq_tasklet;
struct delayed_work set_power_save;
struct delayed_work init_alive_start; struct delayed_work init_alive_start;
struct delayed_work alive_start; struct delayed_work alive_start;
struct delayed_work scan_check; struct delayed_work scan_check;
......
This diff is collapsed.
...@@ -40,56 +40,29 @@ enum { ...@@ -40,56 +40,29 @@ enum {
IWL_POWER_INDEX_3, IWL_POWER_INDEX_3,
IWL_POWER_INDEX_4, IWL_POWER_INDEX_4,
IWL_POWER_INDEX_5, IWL_POWER_INDEX_5,
IWL_POWER_AUTO, IWL_POWER_NUM
IWL_POWER_MAX = IWL_POWER_AUTO,
}; };
enum {
IWL_POWER_SYS_AUTO,
IWL_POWER_SYS_AC,
IWL_POWER_SYS_BATTERY,
IWL_POWER_SYS_MAX,
};
/* Power management (not Tx power) structures */ /* Power management (not Tx power) structures */
#define NOSLP cpu_to_le16(0), 0, 0
#define SLP IWL_POWER_DRIVER_ALLOW_SLEEP_MSK, 0, 0
#define SLP_TOUT(T) cpu_to_le32((T) * MSEC_TO_USEC)
#define SLP_VEC(X0, X1, X2, X3, X4) {cpu_to_le32(X0), \
cpu_to_le32(X1), \
cpu_to_le32(X2), \
cpu_to_le32(X3), \
cpu_to_le32(X4)}
struct iwl_power_vec_entry { struct iwl_power_vec_entry {
struct iwl_powertable_cmd cmd; struct iwl_powertable_cmd cmd;
u8 no_dtim; u8 no_dtim;
}; };
struct iwl_power_mgr { struct iwl_power_mgr {
spinlock_t lock; struct iwl_power_vec_entry pwr_range_0[IWL_POWER_NUM];
struct iwl_power_vec_entry pwr_range_0[IWL_POWER_MAX]; struct iwl_power_vec_entry pwr_range_1[IWL_POWER_NUM];
struct iwl_power_vec_entry pwr_range_1[IWL_POWER_MAX]; struct iwl_power_vec_entry pwr_range_2[IWL_POWER_NUM];
struct iwl_power_vec_entry pwr_range_2[IWL_POWER_MAX];
u32 dtim_period; u32 dtim_period;
/* final power level that used to calculate final power command */ /* final power level that used to calculate final power command */
u8 power_mode; u8 power_mode;
u8 user_power_setting; /* set by user through mac80211 or sysfs */ u8 user_power_setting; /* set by user through sysfs */
u8 system_power_setting; /* set by kernel system tools */ u8 power_disabled; /* set by mac80211's CONF_PS */
u8 critical_power_setting; /* set if driver over heated */
u8 is_battery_active; /* DC/AC power */
u8 power_disabled; /* flag to disable using power saving level */
}; };
void iwl_setup_power_deferred_work(struct iwl_priv *priv);
void iwl_power_cancel_timeout(struct iwl_priv *priv);
int iwl_power_update_mode(struct iwl_priv *priv, bool force); int iwl_power_update_mode(struct iwl_priv *priv, bool force);
int iwl_power_disable_management(struct iwl_priv *priv, u32 ms);
int iwl_power_enable_management(struct iwl_priv *priv);
int iwl_power_set_user_mode(struct iwl_priv *priv, u16 mode); int iwl_power_set_user_mode(struct iwl_priv *priv, u16 mode);
int iwl_power_set_system_mode(struct iwl_priv *priv, u16 mode);
void iwl_power_initialize(struct iwl_priv *priv); void iwl_power_initialize(struct iwl_priv *priv);
int iwl_power_temperature_change(struct iwl_priv *priv);
#endif /* __iwl_power_setting_h__ */ #endif /* __iwl_power_setting_h__ */
...@@ -3845,26 +3845,11 @@ static ssize_t show_power_level(struct device *d, ...@@ -3845,26 +3845,11 @@ static ssize_t show_power_level(struct device *d,
{ {
struct iwl_priv *priv = dev_get_drvdata(d); struct iwl_priv *priv = dev_get_drvdata(d);
int mode = priv->power_data.user_power_setting; int mode = priv->power_data.user_power_setting;
int system = priv->power_data.system_power_setting;
int level = priv->power_data.power_mode; int level = priv->power_data.power_mode;
char *p = buf; char *p = buf;
switch (system) { p += sprintf(p, "INDEX:%d\t", level);
case IWL_POWER_SYS_AUTO: p += sprintf(p, "USER:%d\n", mode);
p += sprintf(p, "SYSTEM:auto");
break;
case IWL_POWER_SYS_AC:
p += sprintf(p, "SYSTEM:ac");
break;
case IWL_POWER_SYS_BATTERY:
p += sprintf(p, "SYSTEM:battery");
break;
}
p += sprintf(p, "\tMODE:%s", (mode < IWL_POWER_AUTO) ?
"fixed" : "auto");
p += sprintf(p, "\tINDEX:%d", level);
p += sprintf(p, "\n");
return p - buf + 1; return p - buf + 1;
} }
...@@ -4108,7 +4093,6 @@ static int iwl3945_init_drv(struct iwl_priv *priv) ...@@ -4108,7 +4093,6 @@ static int iwl3945_init_drv(struct iwl_priv *priv)
priv->ibss_beacon = NULL; priv->ibss_beacon = NULL;
spin_lock_init(&priv->lock); spin_lock_init(&priv->lock);
spin_lock_init(&priv->power_data.lock);
spin_lock_init(&priv->sta_lock); spin_lock_init(&priv->sta_lock);
spin_lock_init(&priv->hcmd_lock); spin_lock_init(&priv->hcmd_lock);
......
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