iwlwifi: mvm: Fix the keep_alive calculation
authorAvri Altman <avri.altman@intel.com>
Tue, 11 Nov 2014 05:29:59 +0000 (07:29 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Sun, 23 Nov 2014 17:59:19 +0000 (19:59 +0200)
The driver must set the keep alive period regardless of power
management state. The keep alive period must be greater or equal to
both the NIC's maximum sleep period, and the listen interval.
However, we were confusing time units (TU) and msec, so fix that.

Signed-off-by: Avri Altman <avri.altman@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/iwlwifi/mvm/power.c

index cb653ac104127d72996934a7c9a78d82237395ec..2620dd0c45f9638c949fd34b7482533b13c33126 100644 (file)
@@ -329,7 +329,7 @@ static void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm,
                                    struct ieee80211_vif *vif,
                                    struct iwl_mac_power_cmd *cmd)
 {
-       int dtimper, dtimper_msec, bi;
+       int dtimper, bi;
        int keep_alive;
        bool radar_detect = false;
        struct iwl_mvm_vif *mvmvif __maybe_unused =
@@ -346,10 +346,9 @@ static void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm,
         * immediately after association. Check that keep alive period
         * is at least 3 * DTIM
         */
-       dtimper_msec = dtimper * bi;
-       keep_alive = max_t(int, 3 * dtimper_msec,
-                          MSEC_PER_SEC * POWER_KEEP_ALIVE_PERIOD_SEC);
-       keep_alive = DIV_ROUND_UP(keep_alive, MSEC_PER_SEC);
+       keep_alive = DIV_ROUND_UP(ieee80211_tu_to_usec(3 * dtimper * bi),
+                                 USEC_PER_SEC);
+       keep_alive = max(keep_alive, POWER_KEEP_ALIVE_PERIOD_SEC);
        cmd->keep_alive_seconds = cpu_to_le16(keep_alive);
 
        if (mvm->ps_disabled)