]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/net/wireless/iwlwifi/iwl-agn-calib.c
Merge tag 'v2.6.37' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / net / wireless / iwlwifi / iwl-agn-calib.c
index c4c5691032a601a0dcc34e9d7f44fa8f81f1eab2..e2019e756936e2280fa8f1365fe31ca0bb295a51 100644 (file)
@@ -65,7 +65,7 @@
 
 #include "iwl-dev.h"
 #include "iwl-core.h"
-#include "iwl-calib.h"
+#include "iwl-agn-calib.h"
 
 /*****************************************************************************
  * INIT calibrations framework
@@ -625,13 +625,14 @@ void iwl_sensitivity_calibration(struct iwl_priv *priv, void *resp)
 
        data = &(priv->sensitivity_data);
 
-       if (!iwl_is_associated(priv)) {
+       if (!iwl_is_any_associated(priv)) {
                IWL_DEBUG_CALIB(priv, "<< - not associated\n");
                return;
        }
 
        spin_lock_irqsave(&priv->lock, flags);
-       if (priv->cfg->bt_statistics) {
+       if (priv->cfg->bt_params &&
+           priv->cfg->bt_params->bt_statistics) {
                rx_info = &(((struct iwl_bt_notif_statistics *)resp)->
                              rx.general.common);
                ofdm = &(((struct iwl_bt_notif_statistics *)resp)->rx.ofdm);
@@ -763,6 +764,12 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv, void *stat_resp)
        unsigned long flags;
        struct statistics_rx_non_phy *rx_info;
        u8 first_chain;
+       /*
+        * MULTI-FIXME:
+        * When we support multiple interfaces on different channels,
+        * this must be modified/fixed.
+        */
+       struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
 
        if (priv->disable_chain_noise_cal)
                return;
@@ -780,7 +787,8 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv, void *stat_resp)
        }
 
        spin_lock_irqsave(&priv->lock, flags);
-       if (priv->cfg->bt_statistics) {
+       if (priv->cfg->bt_params &&
+           priv->cfg->bt_params->bt_statistics) {
                rx_info = &(((struct iwl_bt_notif_statistics *)stat_resp)->
                              rx.general.common);
        } else {
@@ -793,9 +801,10 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv, void *stat_resp)
                return;
        }
 
-       rxon_band24 = !!(priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK);
-       rxon_chnum = le16_to_cpu(priv->staging_rxon.channel);
-       if (priv->cfg->bt_statistics) {
+       rxon_band24 = !!(ctx->staging.flags & RXON_FLG_BAND_24G_MSK);
+       rxon_chnum = le16_to_cpu(ctx->staging.channel);
+       if (priv->cfg->bt_params &&
+           priv->cfg->bt_params->bt_statistics) {
                stat_band24 = !!(((struct iwl_bt_notif_statistics *)
                                 stat_resp)->flag &
                                 STATISTICS_REPLY_FLG_BAND_24G_MSK);
@@ -855,16 +864,17 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv, void *stat_resp)
        /* If this is the "chain_noise_num_beacons", determine:
         * 1)  Disconnected antennas (using signal strengths)
         * 2)  Differential gain (using silence noise) to balance receivers */
-       if (data->beacon_count != priv->cfg->chain_noise_num_beacons)
+       if (data->beacon_count !=
+               priv->cfg->base_params->chain_noise_num_beacons)
                return;
 
        /* Analyze signal for disconnected antenna */
-       average_sig[0] =
-               (data->chain_signal_a) / priv->cfg->chain_noise_num_beacons;
-       average_sig[1] =
-               (data->chain_signal_b) / priv->cfg->chain_noise_num_beacons;
-       average_sig[2] =
-               (data->chain_signal_c) / priv->cfg->chain_noise_num_beacons;
+       average_sig[0] = data->chain_signal_a /
+                        priv->cfg->base_params->chain_noise_num_beacons;
+       average_sig[1] = data->chain_signal_b /
+                        priv->cfg->base_params->chain_noise_num_beacons;
+       average_sig[2] = data->chain_signal_c /
+                        priv->cfg->base_params->chain_noise_num_beacons;
 
        if (average_sig[0] >= average_sig[1]) {
                max_average_sig = average_sig[0];
@@ -914,7 +924,13 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv, void *stat_resp)
         * To be safe, simply mask out any chains that we know
         * are not on the device.
         */
-       active_chains &= priv->hw_params.valid_rx_ant;
+       if (priv->cfg->bt_params &&
+           priv->cfg->bt_params->advanced_bt_coexist &&
+           priv->bt_full_concurrent) {
+               /* operated as 1x1 in full concurrency mode */
+               active_chains &= first_antenna(priv->hw_params.valid_rx_ant);
+       } else
+               active_chains &= priv->hw_params.valid_rx_ant;
 
        num_tx_chains = 0;
        for (i = 0; i < NUM_RX_CHAINS; i++) {
@@ -957,12 +973,12 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv, void *stat_resp)
                        active_chains);
 
        /* Analyze noise for rx balance */
-       average_noise[0] =
-               ((data->chain_noise_a) / priv->cfg->chain_noise_num_beacons);
-       average_noise[1] =
-               ((data->chain_noise_b) / priv->cfg->chain_noise_num_beacons);
-       average_noise[2] =
-               ((data->chain_noise_c) / priv->cfg->chain_noise_num_beacons);
+       average_noise[0] = data->chain_noise_a /
+                          priv->cfg->base_params->chain_noise_num_beacons;
+       average_noise[1] = data->chain_noise_b /
+                          priv->cfg->base_params->chain_noise_num_beacons;
+       average_noise[2] = data->chain_noise_c /
+                          priv->cfg->base_params->chain_noise_num_beacons;
 
        for (i = 0; i < NUM_RX_CHAINS; i++) {
                if (!(data->disconn_array[i]) &&