iwlwifi: use sleep interval succession
[pandora-kernel.git] / drivers / net / wireless / iwlwifi / iwl-power.c
index 0b16841..081a7ea 100644 (file)
@@ -216,8 +216,27 @@ static void iwl_power_fill_sleep_cmd(struct iwl_priv *priv,
                                     struct iwl_powertable_cmd *cmd,
                                     int dynps_ms, int wakeup_period)
 {
+       /*
+        * These are the original power level 3 sleep successions. The
+        * device may behave better with such succession and was also
+        * only tested with that. Just like the original sleep commands,
+        * also adjust the succession here to the wakeup_period below.
+        * The ranges are the same as for the sleep commands, 0-2, 3-9
+        * and >10, which is selected based on the DTIM interval for
+        * the sleep index but here we use the wakeup period since that
+        * is what we need to do for the latency requirements.
+        */
+       static const u8 slp_succ_r0[IWL_POWER_VEC_SIZE] = { 2, 2, 2, 2, 2 };
+       static const u8 slp_succ_r1[IWL_POWER_VEC_SIZE] = { 2, 4, 6, 7, 9 };
+       static const u8 slp_succ_r2[IWL_POWER_VEC_SIZE] = { 2, 7, 9, 9, 0xFF };
+       const u8 *slp_succ = slp_succ_r0;
        int i;
 
+       if (wakeup_period > IWL_DTIM_RANGE_0_MAX)
+               slp_succ = slp_succ_r1;
+       if (wakeup_period > IWL_DTIM_RANGE_1_MAX)
+               slp_succ = slp_succ_r2;
+
        memset(cmd, 0, sizeof(*cmd));
 
        cmd->flags = IWL_POWER_DRIVER_ALLOW_SLEEP_MSK |
@@ -230,7 +249,8 @@ static void iwl_power_fill_sleep_cmd(struct iwl_priv *priv,
        cmd->tx_data_timeout = cpu_to_le32(1000 * dynps_ms);
 
        for (i = 0; i < IWL_POWER_VEC_SIZE; i++)
-               cmd->sleep_interval[i] = cpu_to_le32(wakeup_period);
+               cmd->sleep_interval[i] =
+                       cpu_to_le32(min_t(int, slp_succ[i], wakeup_period));
 
        IWL_DEBUG_POWER(priv, "Automatic sleep command\n");
 }