iwlagn: send RXON timing before associating
authorJohannes Berg <johannes.berg@intel.com>
Mon, 23 Aug 2010 08:46:52 +0000 (10:46 +0200)
committerWey-Yi Guy <wey-yi.w.guy@intel.com>
Fri, 27 Aug 2010 16:29:55 +0000 (09:29 -0700)
The PAN functionality requires us to send the
timing including a valid DTIM period to the
microcode before associating, so request this
data from mac80211 and send it to the device.

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-agn.c
drivers/net/wireless/iwlwifi/iwl-core.c

index 143c12a29fd8f77c7a7b6e31e05864fab6f6da16..79aff1fb85a12a74be9f3ad989e3591c2dca8425 100644 (file)
@@ -182,6 +182,21 @@ int iwl_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
 
        iwl_set_rxon_hwcrypto(priv, ctx, !priv->cfg->mod_params->sw_crypto);
 
+       if (new_assoc) {
+               if (WARN_ON(!ctx->vif))
+                       return -EINVAL;
+               /*
+                * First of all, before setting associated, we need to
+                * send RXON timing so the device knows about the DTIM
+                * period and other timing values
+                */
+               ret = iwl_send_rxon_timing(priv, ctx->vif);
+               if (ret) {
+                       IWL_ERR(priv, "Error setting RXON timing!\n");
+                       return ret;
+               }
+       }
+
        /* Apply the new configuration
         * RXON unassoc clears the station table in uCode so restoration of
         * stations is needed after it (the RXON command) completes
@@ -3355,6 +3370,7 @@ static int iwl_mac_setup_register(struct iwl_priv *priv,
        /* Tell mac80211 our characteristics */
        hw->flags = IEEE80211_HW_SIGNAL_DBM |
                    IEEE80211_HW_AMPDU_AGGREGATION |
+                   IEEE80211_HW_NEED_DTIM_PERIOD |
                    IEEE80211_HW_SPECTRUM_MGMT;
 
        if (!priv->cfg->broken_powersave)
index fb9173b1e5aa45a0be4e6cb3714cd80c0ee57af8..04d7894e0004d2e9c2904d3b7da9410b364e34fb 100644 (file)
@@ -536,6 +536,8 @@ int iwl_send_rxon_timing(struct iwl_priv *priv, struct ieee80211_vif *vif)
        rem = do_div(tsf, interval_tm);
        ctx->timing.beacon_init_val = cpu_to_le32(interval_tm - rem);
 
+       ctx->timing.dtim_period = vif->bss_conf.dtim_period;
+
        IWL_DEBUG_ASSOC(priv,
                        "beacon interval %d beacon timer %d beacon tim %d\n",
                        le16_to_cpu(ctx->timing.beacon_interval),