aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-08-28 12:44:48 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-08-31 14:42:10 -0400
commit4c561a02291326c50f9b1f647eae891af9d1f3b2 (patch)
tree6953c5d26d45745aa27824208b902891e91c6322
parent31513be8a06874eb359908b7b735929837831a9a (diff)
iwlwifi: use sleep interval succession
Some concerns were raised about the automatic adjustment of sleep intervals to all the same, potentially high, value, and I can imagine the hardware behaving better when we don't ask too much of it. So let's convert to use a succession of sleep levels when requesting to go to deeper sleeps (which can only happen with large DTIM intervals), using the succession values from power level three, which have the benefit of also having been tested extensively already. As a result, the automatic sleep level adjustment will now be mostly equivalent to power level three, except for the RX/TX timeouts and possibly using smaller sleep vectors to account for networking latency. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-power.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-power.c b/drivers/net/wireless/iwlwifi/iwl-power.c
index 0b16841f45f4..081a7ea40c6c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-power.c
+++ b/drivers/net/wireless/iwlwifi/iwl-power.c
@@ -216,8 +216,27 @@ static void iwl_power_fill_sleep_cmd(struct iwl_priv *priv,
216 struct iwl_powertable_cmd *cmd, 216 struct iwl_powertable_cmd *cmd,
217 int dynps_ms, int wakeup_period) 217 int dynps_ms, int wakeup_period)
218{ 218{
219 /*
220 * These are the original power level 3 sleep successions. The
221 * device may behave better with such succession and was also
222 * only tested with that. Just like the original sleep commands,
223 * also adjust the succession here to the wakeup_period below.
224 * The ranges are the same as for the sleep commands, 0-2, 3-9
225 * and >10, which is selected based on the DTIM interval for
226 * the sleep index but here we use the wakeup period since that
227 * is what we need to do for the latency requirements.
228 */
229 static const u8 slp_succ_r0[IWL_POWER_VEC_SIZE] = { 2, 2, 2, 2, 2 };
230 static const u8 slp_succ_r1[IWL_POWER_VEC_SIZE] = { 2, 4, 6, 7, 9 };
231 static const u8 slp_succ_r2[IWL_POWER_VEC_SIZE] = { 2, 7, 9, 9, 0xFF };
232 const u8 *slp_succ = slp_succ_r0;
219 int i; 233 int i;
220 234
235 if (wakeup_period > IWL_DTIM_RANGE_0_MAX)
236 slp_succ = slp_succ_r1;
237 if (wakeup_period > IWL_DTIM_RANGE_1_MAX)
238 slp_succ = slp_succ_r2;
239
221 memset(cmd, 0, sizeof(*cmd)); 240 memset(cmd, 0, sizeof(*cmd));
222 241
223 cmd->flags = IWL_POWER_DRIVER_ALLOW_SLEEP_MSK | 242 cmd->flags = IWL_POWER_DRIVER_ALLOW_SLEEP_MSK |
@@ -230,7 +249,8 @@ static void iwl_power_fill_sleep_cmd(struct iwl_priv *priv,
230 cmd->tx_data_timeout = cpu_to_le32(1000 * dynps_ms); 249 cmd->tx_data_timeout = cpu_to_le32(1000 * dynps_ms);
231 250
232 for (i = 0; i < IWL_POWER_VEC_SIZE; i++) 251 for (i = 0; i < IWL_POWER_VEC_SIZE; i++)
233 cmd->sleep_interval[i] = cpu_to_le32(wakeup_period); 252 cmd->sleep_interval[i] =
253 cpu_to_le32(min_t(int, slp_succ[i], wakeup_period));
234 254
235 IWL_DEBUG_POWER(priv, "Automatic sleep command\n"); 255 IWL_DEBUG_POWER(priv, "Automatic sleep command\n");
236} 256}