iwlwifi: clamp scanning dwell time to all contexts
authorJohannes Berg <johannes.berg@intel.com>
Mon, 23 Aug 2010 08:46:41 +0000 (10:46 +0200)
committerWey-Yi Guy <wey-yi.w.guy@intel.com>
Fri, 27 Aug 2010 16:15:51 +0000 (09:15 -0700)
The dwell time should at least fit into all
context's beacon intervals.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
drivers/net/wireless/iwlwifi/iwl-scan.c

index fe4cb57..556dcaa 100644 (file)
@@ -286,19 +286,28 @@ u16 iwl_get_passive_dwell_time(struct iwl_priv *priv,
                               enum ieee80211_band band,
                               struct ieee80211_vif *vif)
 {
+       struct iwl_rxon_context *ctx;
        u16 passive = (band == IEEE80211_BAND_2GHZ) ?
            IWL_PASSIVE_DWELL_BASE + IWL_PASSIVE_DWELL_TIME_24 :
            IWL_PASSIVE_DWELL_BASE + IWL_PASSIVE_DWELL_TIME_52;
 
        if (iwl_is_any_associated(priv)) {
-               /* TODO: should use minimum of all contexts */
-               /* If we're associated, we clamp the maximum passive
-                * dwell time to be 98% of the beacon interval (minus
-                * 2 * channel tune time) */
-               passive = vif ? vif->bss_conf.beacon_int : 0;
-               if ((passive > IWL_PASSIVE_DWELL_BASE) || !passive)
-                       passive = IWL_PASSIVE_DWELL_BASE;
-               passive = (passive * 98) / 100 - IWL_CHANNEL_TUNE_TIME * 2;
+               /*
+                * If we're associated, we clamp the maximum passive
+                * dwell time to be 98% of the smallest beacon interval
+                * (minus 2 * channel tune time)
+                */
+               for_each_context(priv, ctx) {
+                       u16 value;
+
+                       if (!iwl_is_associated_ctx(ctx))
+                               continue;
+                       value = ctx->vif ? ctx->vif->bss_conf.beacon_int : 0;
+                       if ((value > IWL_PASSIVE_DWELL_BASE) || !value)
+                               value = IWL_PASSIVE_DWELL_BASE;
+                       value = (value * 98) / 100 - IWL_CHANNEL_TUNE_TIME * 2;
+                       passive = min(value, passive);
+               }
        }
 
        return passive;