iwlwifi: make scan antenna forcing more generic
authorJohannes Berg <johannes.berg@intel.com>
Tue, 13 Apr 2010 08:04:35 +0000 (01:04 -0700)
committerReinette Chatre <reinette.chatre@intel.com>
Fri, 16 Apr 2010 20:54:29 +0000 (13:54 -0700)
Some future hardware will also require some antenna
overrides so make the current logic more generic;
right now it is semantically based on a workaround
for off-channel reception but the reasons for the
new antenna overrides will be different.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
drivers/net/wireless/iwlwifi/iwl-4965.c
drivers/net/wireless/iwlwifi/iwl-agn-lib.c
drivers/net/wireless/iwlwifi/iwl-core.h

index 2861819..136c290 100644 (file)
@@ -2261,8 +2261,13 @@ struct iwl_cfg iwl4965_agn_cfg = {
        .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF,
        .monitor_recover_period = IWL_MONITORING_PERIOD,
        .temperature_kelvin = true,
-       .off_channel_workaround = true,
        .max_event_log_size = 512,
+
+       /*
+        * Force use of chains B and C for scan RX on 5 GHz band
+        * because the device has off-channel reception on chain A.
+        */
+       .scan_antennas[IEEE80211_BAND_5GHZ] = ANT_BC,
 };
 
 /* Module firmware */
index ccf3357..4bd0aec 100644 (file)
@@ -1405,13 +1405,6 @@ void iwlagn_request_scan(struct iwl_priv *priv)
                 * detect transmissions.
                 */
                scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0;
-
-               /* Force use of chains B and C (0x6) for scan Rx
-                * Avoid A (0x1) for the device has off-channel reception
-                * on A-band.
-                */
-               if (priv->cfg->off_channel_workaround)
-                       rx_ant = ANT_BC;
                break;
        default:
                IWL_WARN(priv, "Invalid scan band count\n");
@@ -1420,6 +1413,9 @@ void iwlagn_request_scan(struct iwl_priv *priv)
 
        band = priv->scan_band;
 
+       if (priv->cfg->scan_antennas[band])
+               rx_ant = priv->cfg->scan_antennas[band];
+
        priv->scan_tx_ant[band] =
                        iwl_toggle_tx_ant(priv, priv->scan_tx_ant[band]);
        rate_flags |= iwl_ant_idx_to_flags(priv->scan_tx_ant[band]);
index e267a21..a0cc11e 100644 (file)
@@ -318,8 +318,8 @@ struct iwl_cfg {
        /* timer period for monitor the driver queues */
        u32 monitor_recover_period;
        bool temperature_kelvin;
-       bool off_channel_workaround;
        u32 max_event_log_size;
+       u8 scan_antennas[IEEE80211_NUM_BANDS];
 };
 
 /***************************