ath9k_hw: fix IQ calibration chain index
authorRajkumar Manoharan <rmanohar@qca.qualcomm.com>
Mon, 4 Jun 2012 10:58:14 +0000 (16:28 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 6 Jun 2012 19:20:28 +0000 (15:20 -0400)
The chain index to perform IQ calibration is counted to number of valid
tx chains and then used for indexing chain specific registers. If the
chainmask is set to 0x2 (i.e chain 1 only), still it accesses chain 0
registers for chain 1. So use real chain index instead sequential one.

Signed-off-by: Rajkumar Manoharan <rmanohar@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/ar9003_calib.c

index f83a4a2e1da25db1d203ba8a4315e17e119b6f8e..d7deb8c9f29952c295fa094d0274953d6368d352 100644 (file)
@@ -653,7 +653,6 @@ static void ar9003_hw_detect_outlier(int *mp_coeff, int nmeasurement,
 }
 
 static void ar9003_hw_tx_iqcal_load_avg_2_passes(struct ath_hw *ah,
-                                                u8 num_chains,
                                                 struct coeff *coeff,
                                                 bool is_reusable)
 {
@@ -677,7 +676,9 @@ static void ar9003_hw_tx_iqcal_load_avg_2_passes(struct ath_hw *ah,
        }
 
        /* Load the average of 2 passes */
-       for (i = 0; i < num_chains; i++) {
+       for (i = 0; i < AR9300_MAX_CHAINS; i++) {
+               if (!(ah->txchainmask & (1 << i)))
+                       continue;
                nmeasurement = REG_READ_FIELD(ah,
                                AR_PHY_TX_IQCAL_STATUS_B0,
                                AR_PHY_CALIBRATED_GAINS_0);
@@ -767,16 +768,13 @@ static void ar9003_hw_tx_iq_cal_post_proc(struct ath_hw *ah, bool is_reusable)
        };
        struct coeff coeff;
        s32 iq_res[6];
-       u8 num_chains = 0;
        int i, im, j;
        int nmeasurement;
 
        for (i = 0; i < AR9300_MAX_CHAINS; i++) {
-               if (ah->txchainmask & (1 << i))
-                       num_chains++;
-       }
+               if (!(ah->txchainmask & (1 << i)))
+                       continue;
 
-       for (i = 0; i < num_chains; i++) {
                nmeasurement = REG_READ_FIELD(ah,
                                AR_PHY_TX_IQCAL_STATUS_B0,
                                AR_PHY_CALIBRATED_GAINS_0);
@@ -839,8 +837,7 @@ static void ar9003_hw_tx_iq_cal_post_proc(struct ath_hw *ah, bool is_reusable)
                                coeff.phs_coeff[i][im] -= 128;
                }
        }
-       ar9003_hw_tx_iqcal_load_avg_2_passes(ah, num_chains,
-                                            &coeff, is_reusable);
+       ar9003_hw_tx_iqcal_load_avg_2_passes(ah, &coeff, is_reusable);
 
        return;