Skip to content

Commit

Permalink
iwlwifi: default to using all chains
Browse files Browse the repository at this point in the history
When instructing the microcode to use just a single
chain when we have power saving enabled, we should
also tell the AP that we are doing SM powersave.
However, using a single chain doesn't actually have
any power saving advantage while idle -- measurements
show that the power consumption is no different when
using one vs. two or three chains.

Therefore, always instruct the microcode to use all
chains.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Johannes Berg authored and John W. Linville committed Oct 7, 2009
1 parent 9bddbab commit 2b396a1
Showing 1 changed file with 17 additions and 13 deletions.
30 changes: 17 additions & 13 deletions drivers/net/wireless/iwlwifi/iwl-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -948,8 +948,13 @@ EXPORT_SYMBOL(iwl_set_rxon_ht);
#define IWL_NUM_IDLE_CHAINS_DUAL 2
#define IWL_NUM_IDLE_CHAINS_SINGLE 1

/* Determine how many receiver/antenna chains to use.
* More provides better reception via diversity. Fewer saves power.
/*
* Determine how many receiver/antenna chains to use.
*
* More provides better reception via diversity. Fewer saves power
* at the expense of throughput, but only when not in powersave to
* start with.
*
* MIMO (dual stream) requires at least 2, but works better with 3.
* This does not determine *which* chains to use, just how many.
*/
Expand All @@ -962,19 +967,18 @@ static int iwl_get_active_rx_chain_count(struct iwl_priv *priv)
return IWL_NUM_RX_CHAINS_MULTIPLE;
}

/*
* When we are in power saving, there's no difference between
* using multiple chains or just a single chain, but due to the
* lack of SM PS we lose a lot of throughput if we use just a
* single chain.
*
* Therefore, use the active count here (which will use multiple
* chains unless connected to a legacy AP).
*/
static int iwl_get_idle_rx_chain_count(struct iwl_priv *priv, int active_cnt)
{
bool is_cam = !test_bit(STATUS_POWER_PMI, &priv->status);

/* # Rx chains when idling and maybe trying to save power */

/*
* XXX: this is incorrect!!
* we always indicate to the AP that
* our SM PS mode is "disabled"
*/

return is_cam ? active_cnt : IWL_NUM_IDLE_CHAINS_SINGLE;
return active_cnt;
}

/* up to 4 chains */
Expand Down

0 comments on commit 2b396a1

Please sign in to comment.