aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRick Farrington <rickdic@hotmail.com>2009-01-23 16:45:10 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-01-29 16:01:31 -0500
commit7b841727d2715d97592f46164804b34d6241644f (patch)
tree44541bb608cd175511ae35ac60b0e0c77ba3451f
parent4c4df78f5e224fd59fe337773878eca681ed02a9 (diff)
iwlagn: reduce off channel reception for 4965
Force use of chains B and C (0x6) for Rx for 4965 Avoid A (0x1) because of its off-channel reception on A-band. Signed-off-by: Rick Farrington <rickdic@hotmail.com> Signed-off-by: Ben Cahill <ben.m.cahill@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c3
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-commands.h1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c13
3 files changed, 17 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index c72a99a9ab36..61788a508971 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -2698,6 +2698,9 @@ static int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
2698 2698
2699 iwl_set_rate(priv); 2699 iwl_set_rate(priv);
2700 2700
2701 /* call to ensure that 4965 rx_chain is set properly in monitor mode */
2702 iwl_set_rxon_chain(priv);
2703
2701 if (memcmp(&priv->active_rxon, 2704 if (memcmp(&priv->active_rxon,
2702 &priv->staging_rxon, sizeof(priv->staging_rxon))) 2705 &priv->staging_rxon, sizeof(priv->staging_rxon)))
2703 iwl_commit_rxon(priv); 2706 iwl_commit_rxon(priv);
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h
index 3ced5e5b6823..7571110f5f15 100644
--- a/drivers/net/wireless/iwlwifi/iwl-commands.h
+++ b/drivers/net/wireless/iwlwifi/iwl-commands.h
@@ -563,6 +563,7 @@ enum {
563 563
564 564
565#define RXON_RX_CHAIN_DRIVER_FORCE_MSK cpu_to_le16(0x1 << 0) 565#define RXON_RX_CHAIN_DRIVER_FORCE_MSK cpu_to_le16(0x1 << 0)
566#define RXON_RX_CHAIN_DRIVER_FORCE_POS (0)
566#define RXON_RX_CHAIN_VALID_MSK cpu_to_le16(0x7 << 1) 567#define RXON_RX_CHAIN_VALID_MSK cpu_to_le16(0x7 << 1)
567#define RXON_RX_CHAIN_VALID_POS (1) 568#define RXON_RX_CHAIN_VALID_POS (1)
568#define RXON_RX_CHAIN_FORCE_SEL_MSK cpu_to_le16(0x7 << 4) 569#define RXON_RX_CHAIN_FORCE_SEL_MSK cpu_to_le16(0x7 << 4)
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index ef4a7c54c736..b64377e760e5 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -753,6 +753,19 @@ void iwl_set_rxon_chain(struct iwl_priv *priv)
753 rx_chain |= active_rx_cnt << RXON_RX_CHAIN_MIMO_CNT_POS; 753 rx_chain |= active_rx_cnt << RXON_RX_CHAIN_MIMO_CNT_POS;
754 rx_chain |= idle_rx_cnt << RXON_RX_CHAIN_CNT_POS; 754 rx_chain |= idle_rx_cnt << RXON_RX_CHAIN_CNT_POS;
755 755
756 /* copied from 'iwl_bg_request_scan()' */
757 /* Force use of chains B and C (0x6) for Rx for 4965
758 * Avoid A (0x1) because of its off-channel reception on A-band.
759 * MIMO is not used here, but value is required */
760 if (iwl_is_monitor_mode(priv) &&
761 !(priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK) &&
762 ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_4965)) {
763 rx_chain = 0x07 << RXON_RX_CHAIN_VALID_POS;
764 rx_chain |= 0x06 << RXON_RX_CHAIN_FORCE_SEL_POS;
765 rx_chain |= 0x07 << RXON_RX_CHAIN_FORCE_MIMO_SEL_POS;
766 rx_chain |= 0x01 << RXON_RX_CHAIN_DRIVER_FORCE_POS;
767 }
768
756 priv->staging_rxon.rx_chain = cpu_to_le16(rx_chain); 769 priv->staging_rxon.rx_chain = cpu_to_le16(rx_chain);
757 770
758 if (!is_single && (active_rx_cnt >= IWL_NUM_RX_CHAINS_SINGLE) && is_cam) 771 if (!is_single && (active_rx_cnt >= IWL_NUM_RX_CHAINS_SINGLE) && is_cam)