iwlwifi: use only one chain for scan in PS
authorShanyu Zhao <shanyu.zhao@intel.com>
Fri, 6 Nov 2009 22:52:47 +0000 (14:52 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 11 Nov 2009 20:23:41 +0000 (15:23 -0500)
When doing scan in power saving mode, choose only 1 valid RX chain instead of
turning all chains on.

Signed-off-by: Shanyu Zhao <shanyu.zhao@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwlwifi/iwl-scan.c

index 1eb0d0bf1fe4f06d3e16f77e18f2e96e7448fe67..48bc2636a8efd944b796efc12388367f353975a4 100644 (file)
@@ -581,6 +581,7 @@ static void iwl_bg_request_scan(struct work_struct *data)
        u8 rate;
        bool is_active = false;
        int  chan_mod;
+       u8 active_chains;
 
        conf = ieee80211_get_hw_conf(priv->hw);
 
@@ -734,9 +735,22 @@ static void iwl_bg_request_scan(struct work_struct *data)
        rate_flags |= iwl_ant_idx_to_flags(priv->scan_tx_ant[band]);
        scan->tx_cmd.rate_n_flags = iwl_hw_set_rate_n_flags(rate, rate_flags);
 
+       /* In power save mode use one chain, otherwise use all chains */
+       if (test_bit(STATUS_POWER_PMI, &priv->status)) {
+               /* rx_ant has been set to all valid chains previously */
+               active_chains = rx_ant &
+                               ((u8)(priv->chain_noise_data.active_chains));
+               if (!active_chains)
+                       active_chains = rx_ant;
+
+               IWL_DEBUG_SCAN(priv, "chain_noise_data.active_chains: %u\n",
+                               priv->chain_noise_data.active_chains);
+
+               rx_ant = first_antenna(active_chains);
+       }
        /* MIMO is not used here, but value is required */
        rx_chain |= ANT_ABC << RXON_RX_CHAIN_VALID_POS;
-       rx_chain |= ANT_ABC << RXON_RX_CHAIN_FORCE_MIMO_SEL_POS;
+       rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_MIMO_SEL_POS;
        rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_SEL_POS;
        rx_chain |= 0x1 << RXON_RX_CHAIN_DRIVER_FORCE_POS;
        scan->rx_chain = cpu_to_le16(rx_chain);