ath9k: Merge ath_hal and ath_hal_5416 structures
[linux-block.git] / drivers / net / wireless / ath9k / calib.c
index 1690759fe7b82dedff1b168d8d667ce688dd3c49..8c44d5a439e737117629bfb985bb526e3bb4ce90 100644 (file)
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include "core.h"
-#include "hw.h"
-#include "reg.h"
-#include "phy.h"
-
-static const int16_t NOISE_FLOOR[] = { -96, -93, -98, -96, -93, -96 };
+#include "ath9k.h"
 
 /* We can tune this as we go by monitoring really low values */
 #define ATH9K_NF_TOO_LOW       -60
@@ -28,14 +23,14 @@ static const int16_t NOISE_FLOOR[] = { -96, -93, -98, -96, -93, -96 };
  * is incorrect and we should use the static NF value. Later we can try to
  * find out why they are reporting these values */
 
-static bool ath9k_hw_nf_in_range(struct ath_hal *ah, s16 nf)
+static bool ath9k_hw_nf_in_range(struct ath_hw *ah, s16 nf)
 {
        if (nf > ATH9K_NF_TOO_LOW) {
-               DPRINTF(ah->ah_sc, ATH_DBG_NF_CAL,
-                       "%s: noise floor value detected (%d) is "
+               DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
+                       "noise floor value detected (%d) is "
                        "lower than what we think is a "
                        "reasonable value (%d)\n",
-                       __func__, nf, ATH9K_NF_TOO_LOW);
+                       nf, ATH9K_NF_TOO_LOW);
                return false;
        }
        return true;
@@ -91,7 +86,7 @@ static void ath9k_hw_update_nfcal_hist_buffer(struct ath9k_nfcal_hist *h,
        return;
 }
 
-static void ath9k_hw_do_getnf(struct ath_hal *ah,
+static void ath9k_hw_do_getnf(struct ath_hw *ah,
                              int16_t nfarray[NUM_NF_READINGS])
 {
        int16_t nf;
@@ -107,27 +102,29 @@ static void ath9k_hw_do_getnf(struct ath_hal *ah,
                "NF calibrated [ctl] [chain 0] is %d\n", nf);
        nfarray[0] = nf;
 
-       if (AR_SREV_9280_10_OR_LATER(ah))
-               nf = MS(REG_READ(ah, AR_PHY_CH1_CCA),
-                       AR9280_PHY_CH1_MINCCA_PWR);
-       else
-               nf = MS(REG_READ(ah, AR_PHY_CH1_CCA),
-                       AR_PHY_CH1_MINCCA_PWR);
-
-       if (nf & 0x100)
-               nf = 0 - ((nf ^ 0x1ff) + 1);
-       DPRINTF(ah->ah_sc, ATH_DBG_NF_CAL,
-               "NF calibrated [ctl] [chain 1] is %d\n", nf);
-       nfarray[1] = nf;
+       if (!AR_SREV_9285(ah)) {
+               if (AR_SREV_9280_10_OR_LATER(ah))
+                       nf = MS(REG_READ(ah, AR_PHY_CH1_CCA),
+                                       AR9280_PHY_CH1_MINCCA_PWR);
+               else
+                       nf = MS(REG_READ(ah, AR_PHY_CH1_CCA),
+                                       AR_PHY_CH1_MINCCA_PWR);
 
-       if (!AR_SREV_9280(ah)) {
-               nf = MS(REG_READ(ah, AR_PHY_CH2_CCA),
-                       AR_PHY_CH2_MINCCA_PWR);
                if (nf & 0x100)
                        nf = 0 - ((nf ^ 0x1ff) + 1);
-               DPRINTF(ah->ah_sc, ATH_DBG_NF_CAL,
-                       "NF calibrated [ctl] [chain 2] is %d\n", nf);
-               nfarray[2] = nf;
+               DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
+                               "NF calibrated [ctl] [chain 1] is %d\n", nf);
+               nfarray[1] = nf;
+
+               if (!AR_SREV_9280(ah)) {
+                       nf = MS(REG_READ(ah, AR_PHY_CH2_CCA),
+                                       AR_PHY_CH2_MINCCA_PWR);
+                       if (nf & 0x100)
+                               nf = 0 - ((nf ^ 0x1ff) + 1);
+                       DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
+                               "NF calibrated [ctl] [chain 2] is %d\n", nf);
+                       nfarray[2] = nf;
+               }
        }
 
        if (AR_SREV_9280_10_OR_LATER(ah))
@@ -139,63 +136,56 @@ static void ath9k_hw_do_getnf(struct ath_hal *ah,
 
        if (nf & 0x100)
                nf = 0 - ((nf ^ 0x1ff) + 1);
-       DPRINTF(ah->ah_sc, ATH_DBG_NF_CAL,
+       DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
                "NF calibrated [ext] [chain 0] is %d\n", nf);
        nfarray[3] = nf;
 
-       if (AR_SREV_9280_10_OR_LATER(ah))
-               nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA),
-                       AR9280_PHY_CH1_EXT_MINCCA_PWR);
-       else
-               nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA),
-                       AR_PHY_CH1_EXT_MINCCA_PWR);
-
-       if (nf & 0x100)
-               nf = 0 - ((nf ^ 0x1ff) + 1);
-       DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
-               "NF calibrated [ext] [chain 1] is %d\n", nf);
-       nfarray[4] = nf;
+       if (!AR_SREV_9285(ah)) {
+               if (AR_SREV_9280_10_OR_LATER(ah))
+                       nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA),
+                                       AR9280_PHY_CH1_EXT_MINCCA_PWR);
+               else
+                       nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA),
+                                       AR_PHY_CH1_EXT_MINCCA_PWR);
 
-       if (!AR_SREV_9280(ah)) {
-               nf = MS(REG_READ(ah, AR_PHY_CH2_EXT_CCA),
-                       AR_PHY_CH2_EXT_MINCCA_PWR);
                if (nf & 0x100)
                        nf = 0 - ((nf ^ 0x1ff) + 1);
-               DPRINTF(ah->ah_sc, ATH_DBG_NF_CAL,
-                       "NF calibrated [ext] [chain 2] is %d\n", nf);
-               nfarray[5] = nf;
+               DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
+                               "NF calibrated [ext] [chain 1] is %d\n", nf);
+               nfarray[4] = nf;
+
+               if (!AR_SREV_9280(ah)) {
+                       nf = MS(REG_READ(ah, AR_PHY_CH2_EXT_CCA),
+                                       AR_PHY_CH2_EXT_MINCCA_PWR);
+                       if (nf & 0x100)
+                               nf = 0 - ((nf ^ 0x1ff) + 1);
+                       DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
+                               "NF calibrated [ext] [chain 2] is %d\n", nf);
+                       nfarray[5] = nf;
+               }
        }
 }
 
-static bool getNoiseFloorThresh(struct ath_hal *ah,
-                               const struct ath9k_channel *chan,
+static bool getNoiseFloorThresh(struct ath_hw *ah,
+                               enum ieee80211_band band,
                                int16_t *nft)
 {
-       switch (chan->chanmode) {
-       case CHANNEL_A:
-       case CHANNEL_A_HT20:
-       case CHANNEL_A_HT40PLUS:
-       case CHANNEL_A_HT40MINUS:
-               *nft = (int16_t)ath9k_hw_get_eeprom(ah, EEP_NFTHRESH_5);
+       switch (band) {
+       case IEEE80211_BAND_5GHZ:
+               *nft = (int8_t)ath9k_hw_get_eeprom(ah, EEP_NFTHRESH_5);
                break;
-       case CHANNEL_B:
-       case CHANNEL_G:
-       case CHANNEL_G_HT20:
-       case CHANNEL_G_HT40PLUS:
-       case CHANNEL_G_HT40MINUS:
-               *nft = (int16_t)ath9k_hw_get_eeprom(ah, EEP_NFTHRESH_2);
+       case IEEE80211_BAND_2GHZ:
+               *nft = (int8_t)ath9k_hw_get_eeprom(ah, EEP_NFTHRESH_2);
                break;
        default:
-               DPRINTF(ah->ah_sc, ATH_DBG_CHANNEL,
-                       "%s: invalid channel flags 0x%x\n", __func__,
-                       chan->channelFlags);
+               BUG_ON(1);
                return false;
        }
 
        return true;
 }
 
-static void ath9k_hw_setup_calibration(struct ath_hal *ah,
+static void ath9k_hw_setup_calibration(struct ath_hw *ah,
                                       struct hal_cal_list *currCal)
 {
        REG_RMW_FIELD(ah, AR_PHY_TIMING_CTRL4(0),
@@ -206,24 +196,22 @@ static void ath9k_hw_setup_calibration(struct ath_hal *ah,
        case IQ_MISMATCH_CAL:
                REG_WRITE(ah, AR_PHY_CALMODE, AR_PHY_CALMODE_IQ);
                DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
-                       "%s: starting IQ Mismatch Calibration\n",
-                       __func__);
+                       "starting IQ Mismatch Calibration\n");
                break;
        case ADC_GAIN_CAL:
                REG_WRITE(ah, AR_PHY_CALMODE, AR_PHY_CALMODE_ADC_GAIN);
                DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
-                       "%s: starting ADC Gain Calibration\n", __func__);
+                       "starting ADC Gain Calibration\n");
                break;
        case ADC_DC_CAL:
                REG_WRITE(ah, AR_PHY_CALMODE, AR_PHY_CALMODE_ADC_DC_PER);
                DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
-                       "%s: starting ADC DC Calibration\n", __func__);
+                       "starting ADC DC Calibration\n");
                break;
        case ADC_DC_INIT_CAL:
                REG_WRITE(ah, AR_PHY_CALMODE, AR_PHY_CALMODE_ADC_DC_INIT);
                DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
-                       "%s: starting Init ADC DC Calibration\n",
-                       __func__);
+                       "starting Init ADC DC Calibration\n");
                break;
        }
 
@@ -231,10 +219,9 @@ static void ath9k_hw_setup_calibration(struct ath_hal *ah,
                    AR_PHY_TIMING_CTRL4_DO_CAL);
 }
 
-static void ath9k_hw_reset_calibration(struct ath_hal *ah,
+static void ath9k_hw_reset_calibration(struct ath_hw *ah,
                                       struct hal_cal_list *currCal)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
        int i;
 
        ath9k_hw_setup_calibration(ah, currCal);
@@ -242,23 +229,21 @@ static void ath9k_hw_reset_calibration(struct ath_hal *ah,
        currCal->calState = CAL_RUNNING;
 
        for (i = 0; i < AR5416_MAX_CHAINS; i++) {
-               ahp->ah_Meas0.sign[i] = 0;
-               ahp->ah_Meas1.sign[i] = 0;
-               ahp->ah_Meas2.sign[i] = 0;
-               ahp->ah_Meas3.sign[i] = 0;
+               ah->ah_Meas0.sign[i] = 0;
+               ah->ah_Meas1.sign[i] = 0;
+               ah->ah_Meas2.sign[i] = 0;
+               ah->ah_Meas3.sign[i] = 0;
        }
 
-       ahp->ah_CalSamples = 0;
+       ah->ah_CalSamples = 0;
 }
 
-static void ath9k_hw_per_calibration(struct ath_hal *ah,
+static void ath9k_hw_per_calibration(struct ath_hw *ah,
                                     struct ath9k_channel *ichan,
                                     u8 rxchainmask,
                                     struct hal_cal_list *currCal,
                                     bool *isCalDone)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-
        *isCalDone = false;
 
        if (currCal->calState == CAL_RUNNING) {
@@ -266,9 +251,9 @@ static void ath9k_hw_per_calibration(struct ath_hal *ah,
                      AR_PHY_TIMING_CTRL4_DO_CAL)) {
 
                        currCal->calData->calCollect(ah);
-                       ahp->ah_CalSamples++;
+                       ah->ah_CalSamples++;
 
-                       if (ahp->ah_CalSamples >= currCal->calData->calNumSamples) {
+                       if (ah->ah_CalSamples >= currCal->calData->calNumSamples) {
                                int i, numChains = 0;
                                for (i = 0; i < AR5416_MAX_CHAINS; i++) {
                                        if (rxchainmask & (1 << i))
@@ -288,113 +273,105 @@ static void ath9k_hw_per_calibration(struct ath_hal *ah,
        }
 }
 
-static bool ath9k_hw_iscal_supported(struct ath_hal *ah,
-                                    struct ath9k_channel *chan,
+/* Assumes you are talking about the currently configured channel */
+static bool ath9k_hw_iscal_supported(struct ath_hw *ah,
                                     enum hal_cal_types calType)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-       bool retval = false;
+       struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
 
-       switch (calType & ahp->ah_suppCals) {
-       case IQ_MISMATCH_CAL:
-               if (!IS_CHAN_B(chan))
-                       retval = true;
-               break;
+       switch (calType & ah->ah_suppCals) {
+       case IQ_MISMATCH_CAL: /* Both 2 GHz and 5 GHz support OFDM */
+               return true;
        case ADC_GAIN_CAL:
        case ADC_DC_CAL:
-               if (!IS_CHAN_B(chan)
-                   && !(IS_CHAN_2GHZ(chan) && IS_CHAN_HT20(chan)))
-                       retval = true;
+               if (conf->channel->band == IEEE80211_BAND_5GHZ &&
+                 conf_is_ht20(conf))
+                       return true;
                break;
        }
-
-       return retval;
+       return false;
 }
 
-static void ath9k_hw_iqcal_collect(struct ath_hal *ah)
+static void ath9k_hw_iqcal_collect(struct ath_hw *ah)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
        int i;
 
        for (i = 0; i < AR5416_MAX_CHAINS; i++) {
-               ahp->ah_totalPowerMeasI[i] +=
+               ah->ah_totalPowerMeasI[i] +=
                        REG_READ(ah, AR_PHY_CAL_MEAS_0(i));
-               ahp->ah_totalPowerMeasQ[i] +=
+               ah->ah_totalPowerMeasQ[i] +=
                        REG_READ(ah, AR_PHY_CAL_MEAS_1(i));
-               ahp->ah_totalIqCorrMeas[i] +=
+               ah->ah_totalIqCorrMeas[i] +=
                        (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_2(i));
                DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
                        "%d: Chn %d pmi=0x%08x;pmq=0x%08x;iqcm=0x%08x;\n",
-                       ahp->ah_CalSamples, i, ahp->ah_totalPowerMeasI[i],
-                       ahp->ah_totalPowerMeasQ[i],
-                       ahp->ah_totalIqCorrMeas[i]);
+                       ah->ah_CalSamples, i, ah->ah_totalPowerMeasI[i],
+                       ah->ah_totalPowerMeasQ[i],
+                       ah->ah_totalIqCorrMeas[i]);
        }
 }
 
-static void ath9k_hw_adc_gaincal_collect(struct ath_hal *ah)
+static void ath9k_hw_adc_gaincal_collect(struct ath_hw *ah)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
        int i;
 
        for (i = 0; i < AR5416_MAX_CHAINS; i++) {
-               ahp->ah_totalAdcIOddPhase[i] +=
+               ah->ah_totalAdcIOddPhase[i] +=
                        REG_READ(ah, AR_PHY_CAL_MEAS_0(i));
-               ahp->ah_totalAdcIEvenPhase[i] +=
+               ah->ah_totalAdcIEvenPhase[i] +=
                        REG_READ(ah, AR_PHY_CAL_MEAS_1(i));
-               ahp->ah_totalAdcQOddPhase[i] +=
+               ah->ah_totalAdcQOddPhase[i] +=
                        REG_READ(ah, AR_PHY_CAL_MEAS_2(i));
-               ahp->ah_totalAdcQEvenPhase[i] +=
+               ah->ah_totalAdcQEvenPhase[i] +=
                        REG_READ(ah, AR_PHY_CAL_MEAS_3(i));
 
                DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
                        "%d: Chn %d oddi=0x%08x; eveni=0x%08x; "
                        "oddq=0x%08x; evenq=0x%08x;\n",
-                       ahp->ah_CalSamples, i,
-                       ahp->ah_totalAdcIOddPhase[i],
-                       ahp->ah_totalAdcIEvenPhase[i],
-                       ahp->ah_totalAdcQOddPhase[i],
-                       ahp->ah_totalAdcQEvenPhase[i]);
+                       ah->ah_CalSamples, i,
+                       ah->ah_totalAdcIOddPhase[i],
+                       ah->ah_totalAdcIEvenPhase[i],
+                       ah->ah_totalAdcQOddPhase[i],
+                       ah->ah_totalAdcQEvenPhase[i]);
        }
 }
 
-static void ath9k_hw_adc_dccal_collect(struct ath_hal *ah)
+static void ath9k_hw_adc_dccal_collect(struct ath_hw *ah)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
        int i;
 
        for (i = 0; i < AR5416_MAX_CHAINS; i++) {
-               ahp->ah_totalAdcDcOffsetIOddPhase[i] +=
+               ah->ah_totalAdcDcOffsetIOddPhase[i] +=
                        (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_0(i));
-               ahp->ah_totalAdcDcOffsetIEvenPhase[i] +=
+               ah->ah_totalAdcDcOffsetIEvenPhase[i] +=
                        (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_1(i));
-               ahp->ah_totalAdcDcOffsetQOddPhase[i] +=
+               ah->ah_totalAdcDcOffsetQOddPhase[i] +=
                        (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_2(i));
-               ahp->ah_totalAdcDcOffsetQEvenPhase[i] +=
+               ah->ah_totalAdcDcOffsetQEvenPhase[i] +=
                        (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_3(i));
 
                DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
                        "%d: Chn %d oddi=0x%08x; eveni=0x%08x; "
                        "oddq=0x%08x; evenq=0x%08x;\n",
-                       ahp->ah_CalSamples, i,
-                       ahp->ah_totalAdcDcOffsetIOddPhase[i],
-                       ahp->ah_totalAdcDcOffsetIEvenPhase[i],
-                       ahp->ah_totalAdcDcOffsetQOddPhase[i],
-                       ahp->ah_totalAdcDcOffsetQEvenPhase[i]);
+                       ah->ah_CalSamples, i,
+                       ah->ah_totalAdcDcOffsetIOddPhase[i],
+                       ah->ah_totalAdcDcOffsetIEvenPhase[i],
+                       ah->ah_totalAdcDcOffsetQOddPhase[i],
+                       ah->ah_totalAdcDcOffsetQEvenPhase[i]);
        }
 }
 
-static void ath9k_hw_iqcalibrate(struct ath_hal *ah, u8 numChains)
+static void ath9k_hw_iqcalibrate(struct ath_hw *ah, u8 numChains)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
        u32 powerMeasQ, powerMeasI, iqCorrMeas;
        u32 qCoffDenom, iCoffDenom;
        int32_t qCoff, iCoff;
        int iqCorrNeg, i;
 
        for (i = 0; i < numChains; i++) {
-               powerMeasI = ahp->ah_totalPowerMeasI[i];
-               powerMeasQ = ahp->ah_totalPowerMeasQ[i];
-               iqCorrMeas = ahp->ah_totalIqCorrMeas[i];
+               powerMeasI = ah->ah_totalPowerMeasI[i];
+               powerMeasQ = ah->ah_totalPowerMeasQ[i];
+               iqCorrMeas = ah->ah_totalIqCorrMeas[i];
 
                DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
                        "Starting IQ Cal and Correction for Chain %d\n",
@@ -402,7 +379,7 @@ static void ath9k_hw_iqcalibrate(struct ath_hal *ah, u8 numChains)
 
                DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
                        "Orignal: Chn %diq_corr_meas = 0x%08x\n",
-                       i, ahp->ah_totalIqCorrMeas[i]);
+                       i, ah->ah_totalIqCorrMeas[i]);
 
                iqCorrNeg = 0;
 
@@ -460,17 +437,16 @@ static void ath9k_hw_iqcalibrate(struct ath_hal *ah, u8 numChains)
                    AR_PHY_TIMING_CTRL4_IQCORR_ENABLE);
 }
 
-static void ath9k_hw_adc_gaincal_calibrate(struct ath_hal *ah, u8 numChains)
+static void ath9k_hw_adc_gaincal_calibrate(struct ath_hw *ah, u8 numChains)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
        u32 iOddMeasOffset, iEvenMeasOffset, qOddMeasOffset, qEvenMeasOffset;
        u32 qGainMismatch, iGainMismatch, val, i;
 
        for (i = 0; i < numChains; i++) {
-               iOddMeasOffset = ahp->ah_totalAdcIOddPhase[i];
-               iEvenMeasOffset = ahp->ah_totalAdcIEvenPhase[i];
-               qOddMeasOffset = ahp->ah_totalAdcQOddPhase[i];
-               qEvenMeasOffset = ahp->ah_totalAdcQEvenPhase[i];
+               iOddMeasOffset = ah->ah_totalAdcIOddPhase[i];
+               iEvenMeasOffset = ah->ah_totalAdcIEvenPhase[i];
+               qOddMeasOffset = ah->ah_totalAdcQOddPhase[i];
+               qEvenMeasOffset = ah->ah_totalAdcQEvenPhase[i];
 
                DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
                        "Starting ADC Gain Cal for Chain %d\n", i);
@@ -518,21 +494,20 @@ static void ath9k_hw_adc_gaincal_calibrate(struct ath_hal *ah, u8 numChains)
                  AR_PHY_NEW_ADC_GAIN_CORR_ENABLE);
 }
 
-static void ath9k_hw_adc_dccal_calibrate(struct ath_hal *ah, u8 numChains)
+static void ath9k_hw_adc_dccal_calibrate(struct ath_hw *ah, u8 numChains)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
        u32 iOddMeasOffset, iEvenMeasOffset, val, i;
        int32_t qOddMeasOffset, qEvenMeasOffset, qDcMismatch, iDcMismatch;
        const struct hal_percal_data *calData =
-               ahp->ah_cal_list_curr->calData;
+               ah->ah_cal_list_curr->calData;
        u32 numSamples =
                (1 << (calData->calCountMax + 5)) * calData->calNumSamples;
 
        for (i = 0; i < numChains; i++) {
-               iOddMeasOffset = ahp->ah_totalAdcDcOffsetIOddPhase[i];
-               iEvenMeasOffset = ahp->ah_totalAdcDcOffsetIEvenPhase[i];
-               qOddMeasOffset = ahp->ah_totalAdcDcOffsetQOddPhase[i];
-               qEvenMeasOffset = ahp->ah_totalAdcDcOffsetQEvenPhase[i];
+               iOddMeasOffset = ah->ah_totalAdcDcOffsetIOddPhase[i];
+               iEvenMeasOffset = ah->ah_totalAdcDcOffsetIEvenPhase[i];
+               qOddMeasOffset = ah->ah_totalAdcDcOffsetQOddPhase[i];
+               qEvenMeasOffset = ah->ah_totalAdcDcOffsetQEvenPhase[i];
 
                DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
                        "Starting ADC DC Offset Cal for Chain %d\n", i);
@@ -576,53 +551,42 @@ static void ath9k_hw_adc_dccal_calibrate(struct ath_hal *ah, u8 numChains)
                  AR_PHY_NEW_ADC_DC_OFFSET_CORR_ENABLE);
 }
 
-void ath9k_hw_reset_calvalid(struct ath_hal *ah, struct ath9k_channel *chan,
-                            bool *isCalDone)
+/* This is done for the currently configured channel */
+bool ath9k_hw_reset_calvalid(struct ath_hw *ah)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-       struct ath9k_channel *ichan =
-               ath9k_regd_check_channel(ah, chan);
-       struct hal_cal_list *currCal = ahp->ah_cal_list_curr;
+       struct ieee80211_conf *conf = &ah->ah_sc->hw->conf;
+       struct hal_cal_list *currCal = ah->ah_cal_list_curr;
 
-       *isCalDone = true;
+       if (!ah->ah_curchan)
+               return true;
 
        if (!AR_SREV_9100(ah) && !AR_SREV_9160_10_OR_LATER(ah))
-               return;
+               return true;
 
        if (currCal == NULL)
-               return;
-
-       if (ichan == NULL) {
-               DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
-                       "%s: invalid channel %u/0x%x; no mapping\n",
-                       __func__, chan->channel, chan->channelFlags);
-               return;
-       }
-
+               return true;
 
        if (currCal->calState != CAL_DONE) {
                DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
-                       "%s: Calibration state incorrect, %d\n",
-                       __func__, currCal->calState);
-               return;
+                       "Calibration state incorrect, %d\n",
+                       currCal->calState);
+               return true;
        }
 
-
-       if (!ath9k_hw_iscal_supported(ah, chan, currCal->calData->calType))
-               return;
+       if (!ath9k_hw_iscal_supported(ah, currCal->calData->calType))
+               return true;
 
        DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
-               "%s: Resetting Cal %d state for channel %u/0x%x\n",
-               __func__, currCal->calData->calType, chan->channel,
-               chan->channelFlags);
+               "Resetting Cal %d state for channel %u\n",
+               currCal->calData->calType, conf->channel->center_freq);
 
-       ichan->CalValid &= ~currCal->calData->calType;
+       ah->ah_curchan->CalValid &= ~currCal->calData->calType;
        currCal->calState = CAL_WAITING;
 
-       *isCalDone = false;
+       return false;
 }
 
-void ath9k_hw_start_nfcal(struct ath_hal *ah)
+void ath9k_hw_start_nfcal(struct ath_hw *ah)
 {
        REG_SET_BIT(ah, AR_PHY_AGC_CONTROL,
                    AR_PHY_AGC_CONTROL_ENABLE_NF);
@@ -631,7 +595,7 @@ void ath9k_hw_start_nfcal(struct ath_hal *ah)
        REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF);
 }
 
-void ath9k_hw_loadnf(struct ath_hal *ah, struct ath9k_channel *chan)
+void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan)
 {
        struct ath9k_nfcal_hist *h;
        int i, j;
@@ -646,16 +610,14 @@ void ath9k_hw_loadnf(struct ath_hal *ah, struct ath9k_channel *chan)
        };
        u8 chainmask;
 
-       if (AR_SREV_9280(ah))
+       if (AR_SREV_9285(ah))
+               chainmask = 0x9;
+       else if (AR_SREV_9280(ah))
                chainmask = 0x1B;
        else
                chainmask = 0x3F;
 
-#ifdef ATH_NF_PER_CHAN
-       h = chan->nfCalHist;
-#else
        h = ah->nfCalHist;
-#endif
 
        for (i = 0; i < NUM_NF_READINGS; i++) {
                if (chainmask & (1 << i)) {
@@ -689,45 +651,35 @@ void ath9k_hw_loadnf(struct ath_hal *ah, struct ath9k_channel *chan)
        }
 }
 
-int16_t ath9k_hw_getnf(struct ath_hal *ah,
+int16_t ath9k_hw_getnf(struct ath_hw *ah,
                       struct ath9k_channel *chan)
 {
        int16_t nf, nfThresh;
        int16_t nfarray[NUM_NF_READINGS] = { 0 };
        struct ath9k_nfcal_hist *h;
-       u8 chainmask;
-
-       if (AR_SREV_9280(ah))
-               chainmask = 0x1B;
-       else
-               chainmask = 0x3F;
+       struct ieee80211_channel *c = chan->chan;
 
        chan->channelFlags &= (~CHANNEL_CW_INT);
        if (REG_READ(ah, AR_PHY_AGC_CONTROL) & AR_PHY_AGC_CONTROL_NF) {
                DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
-                       "%s: NF did not complete in calibration window\n",
-                       __func__);
+                       "NF did not complete in calibration window\n");
                nf = 0;
                chan->rawNoiseFloor = nf;
                return chan->rawNoiseFloor;
        } else {
                ath9k_hw_do_getnf(ah, nfarray);
                nf = nfarray[0];
-               if (getNoiseFloorThresh(ah, chan, &nfThresh)
+               if (getNoiseFloorThresh(ah, c->band, &nfThresh)
                    && nf > nfThresh) {
                        DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
-                               "%s: noise floor failed detected; "
-                               "detected %d, threshold %d\n", __func__,
+                               "noise floor failed detected; "
+                               "detected %d, threshold %d\n",
                                nf, nfThresh);
                        chan->channelFlags |= CHANNEL_CW_INT;
                }
        }
 
-#ifdef ATH_NF_PER_CHAN
-       h = chan->nfCalHist;
-#else
        h = ah->nfCalHist;
-#endif
 
        ath9k_hw_update_nfcal_hist_buffer(h, nfarray);
        chan->rawNoiseFloor = h[0].privNF;
@@ -735,7 +687,7 @@ int16_t ath9k_hw_getnf(struct ath_hal *ah,
        return chan->rawNoiseFloor;
 }
 
-void ath9k_init_nfcal_hist_buffer(struct ath_hal *ah)
+void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah)
 {
        int i, j;
 
@@ -749,26 +701,16 @@ void ath9k_init_nfcal_hist_buffer(struct ath_hal *ah)
                                AR_PHY_CCA_MAX_GOOD_VALUE;
                }
        }
-       return;
 }
 
-s16 ath9k_hw_getchan_noise(struct ath_hal *ah, struct ath9k_channel *chan)
+s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan)
 {
-       struct ath9k_channel *ichan;
        s16 nf;
 
-       ichan = ath9k_regd_check_channel(ah, chan);
-       if (ichan == NULL) {
-               DPRINTF(ah->ah_sc, ATH_DBG_NF_CAL,
-                       "%s: invalid channel %u/0x%x; no mapping\n",
-                       __func__, chan->channel, chan->channelFlags);
-               return ATH_DEFAULT_NOISE_FLOOR;
-       }
-       if (ichan->rawNoiseFloor == 0) {
-               enum wireless_mode mode = ath9k_hw_chan2wmode(ah, chan);
-               nf = NOISE_FLOOR[mode];
-       } else
-               nf = ichan->rawNoiseFloor;
+       if (chan->rawNoiseFloor == 0)
+               nf = -96;
+       else
+               nf = chan->rawNoiseFloor;
 
        if (!ath9k_hw_nf_in_range(ah, nf))
                nf = ATH_DEFAULT_NOISE_FLOOR;
@@ -776,30 +718,21 @@ s16 ath9k_hw_getchan_noise(struct ath_hal *ah, struct ath9k_channel *chan)
        return nf;
 }
 
-bool ath9k_hw_calibrate(struct ath_hal *ah, struct ath9k_channel *chan,
+bool ath9k_hw_calibrate(struct ath_hw *ah, struct ath9k_channel *chan,
                        u8 rxchainmask, bool longcal,
                        bool *isCalDone)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-       struct hal_cal_list *currCal = ahp->ah_cal_list_curr;
-       struct ath9k_channel *ichan = ath9k_regd_check_channel(ah, chan);
+       struct hal_cal_list *currCal = ah->ah_cal_list_curr;
 
        *isCalDone = true;
 
-       if (ichan == NULL) {
-               DPRINTF(ah->ah_sc, ATH_DBG_CHANNEL,
-                       "%s: invalid channel %u/0x%x; no mapping\n",
-                       __func__, chan->channel, chan->channelFlags);
-               return false;
-       }
-
        if (currCal &&
            (currCal->calState == CAL_RUNNING ||
             currCal->calState == CAL_WAITING)) {
-               ath9k_hw_per_calibration(ah, ichan, rxchainmask, currCal,
+               ath9k_hw_per_calibration(ah, chan, rxchainmask, currCal,
                                         isCalDone);
                if (*isCalDone) {
-                       ahp->ah_cal_list_curr = currCal = currCal->calNext;
+                       ah->ah_cal_list_curr = currCal = currCal->calNext;
 
                        if (currCal->calState == CAL_WAITING) {
                                *isCalDone = false;
@@ -809,72 +742,162 @@ bool ath9k_hw_calibrate(struct ath_hal *ah, struct ath9k_channel *chan,
        }
 
        if (longcal) {
-               ath9k_hw_getnf(ah, ichan);
+               ath9k_hw_getnf(ah, chan);
                ath9k_hw_loadnf(ah, ah->ah_curchan);
                ath9k_hw_start_nfcal(ah);
 
-               if ((ichan->channelFlags & CHANNEL_CW_INT) != 0) {
-                       chan->channelFlags |= CHANNEL_CW_INT;
-                       ichan->channelFlags &= ~CHANNEL_CW_INT;
-               }
+               if (chan->channelFlags & CHANNEL_CW_INT)
+                       chan->channelFlags &= ~CHANNEL_CW_INT;
        }
 
        return true;
 }
 
-bool ath9k_hw_init_cal(struct ath_hal *ah,
-                      struct ath9k_channel *chan)
+static inline void ath9k_hw_9285_pa_cal(struct ath_hw *ah)
 {
-       struct ath_hal_5416 *ahp = AH5416(ah);
-       struct ath9k_channel *ichan = ath9k_regd_check_channel(ah, chan);
 
+       u32 regVal;
+       int i, offset, offs_6_1, offs_0;
+       u32 ccomp_org, reg_field;
+       u32 regList[][2] = {
+               { 0x786c, 0 },
+               { 0x7854, 0 },
+               { 0x7820, 0 },
+               { 0x7824, 0 },
+               { 0x7868, 0 },
+               { 0x783c, 0 },
+               { 0x7838, 0 },
+       };
+
+       if (AR_SREV_9285_11(ah)) {
+               REG_WRITE(ah, AR9285_AN_TOP4, (AR9285_AN_TOP4_DEFAULT | 0x14));
+               udelay(10);
+       }
+
+       for (i = 0; i < ARRAY_SIZE(regList); i++)
+               regList[i][1] = REG_READ(ah, regList[i][0]);
+
+       regVal = REG_READ(ah, 0x7834);
+       regVal &= (~(0x1));
+       REG_WRITE(ah, 0x7834, regVal);
+       regVal = REG_READ(ah, 0x9808);
+       regVal |= (0x1 << 27);
+       REG_WRITE(ah, 0x9808, regVal);
+
+       REG_RMW_FIELD(ah, AR9285_AN_TOP3, AR9285_AN_TOP3_PWDDAC, 1);
+       REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDRXTXBB1, 1);
+       REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDV2I, 1);
+       REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDDACIF, 1);
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G2, AR9285_AN_RF2G2_OFFCAL, 0);
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PWDDB, 0);
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_ENPACAL, 0);
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1, 1);
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV2, 0);
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPAOUT, 0);
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G8, AR9285_AN_RF2G8_PADRVGN2TAB0, 7);
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PADRVGN2TAB0, 0);
+       ccomp_org = MS(REG_READ(ah, AR9285_AN_RF2G6), AR9285_AN_RF2G6_CCOMP);
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_CCOMP, 7);
+
+       REG_WRITE(ah, AR9285_AN_TOP2, 0xca0358a0);
+       udelay(30);
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_OFFS, 0);
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, 0);
+
+       for (i = 6; i > 0; i--) {
+               regVal = REG_READ(ah, 0x7834);
+               regVal |= (1 << (19 + i));
+               REG_WRITE(ah, 0x7834, regVal);
+               udelay(1);
+               regVal = REG_READ(ah, 0x7834);
+               regVal &= (~(0x1 << (19 + i)));
+               reg_field = MS(REG_READ(ah, 0x7840), AR9285_AN_RXTXBB1_SPARE9);
+               regVal |= (reg_field << (19 + i));
+               REG_WRITE(ah, 0x7834, regVal);
+       }
+
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, 1);
+       udelay(1);
+       reg_field = MS(REG_READ(ah, AR9285_AN_RF2G9), AR9285_AN_RXTXBB1_SPARE9);
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, reg_field);
+       offs_6_1 = MS(REG_READ(ah, AR9285_AN_RF2G6), AR9285_AN_RF2G6_OFFS);
+       offs_0   = MS(REG_READ(ah, AR9285_AN_RF2G3), AR9285_AN_RF2G3_PDVCCOMP);
+
+       offset = (offs_6_1<<1) | offs_0;
+       offset = offset - 0;
+       offs_6_1 = offset>>1;
+       offs_0 = offset & 1;
+
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_OFFS, offs_6_1);
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, offs_0);
+
+       regVal = REG_READ(ah, 0x7834);
+       regVal |= 0x1;
+       REG_WRITE(ah, 0x7834, regVal);
+       regVal = REG_READ(ah, 0x9808);
+       regVal &= (~(0x1 << 27));
+       REG_WRITE(ah, 0x9808, regVal);
+
+       for (i = 0; i < ARRAY_SIZE(regList); i++)
+               REG_WRITE(ah, regList[i][0], regList[i][1]);
+
+       REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_CCOMP, ccomp_org);
+
+       if (AR_SREV_9285_11(ah))
+               REG_WRITE(ah, AR9285_AN_TOP4, AR9285_AN_TOP4_DEFAULT);
+
+}
+
+bool ath9k_hw_init_cal(struct ath_hw *ah,
+                      struct ath9k_channel *chan)
+{
        REG_WRITE(ah, AR_PHY_AGC_CONTROL,
                  REG_READ(ah, AR_PHY_AGC_CONTROL) |
                  AR_PHY_AGC_CONTROL_CAL);
 
        if (!ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_CAL, 0)) {
                DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
-                       "%s: offset calibration failed to complete in 1ms; "
-                       "noisy environment?\n", __func__);
+                       "offset calibration failed to complete in 1ms; "
+                       "noisy environment?\n");
                return false;
        }
 
+       if (AR_SREV_9285(ah) && AR_SREV_9285_11_OR_LATER(ah))
+               ath9k_hw_9285_pa_cal(ah);
+
        REG_WRITE(ah, AR_PHY_AGC_CONTROL,
                  REG_READ(ah, AR_PHY_AGC_CONTROL) |
                  AR_PHY_AGC_CONTROL_NF);
 
-       ahp->ah_cal_list = ahp->ah_cal_list_last = ahp->ah_cal_list_curr = NULL;
+       ah->ah_cal_list = ah->ah_cal_list_last = ah->ah_cal_list_curr = NULL;
 
        if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah)) {
-               if (ath9k_hw_iscal_supported(ah, chan, ADC_GAIN_CAL)) {
-                       INIT_CAL(&ahp->ah_adcGainCalData);
-                       INSERT_CAL(ahp, &ahp->ah_adcGainCalData);
+               if (ath9k_hw_iscal_supported(ah, ADC_GAIN_CAL)) {
+                       INIT_CAL(&ah->ah_adcGainCalData);
+                       INSERT_CAL(ah, &ah->ah_adcGainCalData);
                        DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
-                               "%s: enabling ADC Gain Calibration.\n",
-                               __func__);
+                               "enabling ADC Gain Calibration.\n");
                }
-               if (ath9k_hw_iscal_supported(ah, chan, ADC_DC_CAL)) {
-                       INIT_CAL(&ahp->ah_adcDcCalData);
-                       INSERT_CAL(ahp, &ahp->ah_adcDcCalData);
+               if (ath9k_hw_iscal_supported(ah, ADC_DC_CAL)) {
+                       INIT_CAL(&ah->ah_adcDcCalData);
+                       INSERT_CAL(ah, &ah->ah_adcDcCalData);
                        DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
-                               "%s: enabling ADC DC Calibration.\n",
-                               __func__);
+                               "enabling ADC DC Calibration.\n");
                }
-               if (ath9k_hw_iscal_supported(ah, chan, IQ_MISMATCH_CAL)) {
-                       INIT_CAL(&ahp->ah_iqCalData);
-                       INSERT_CAL(ahp, &ahp->ah_iqCalData);
+               if (ath9k_hw_iscal_supported(ah, IQ_MISMATCH_CAL)) {
+                       INIT_CAL(&ah->ah_iqCalData);
+                       INSERT_CAL(ah, &ah->ah_iqCalData);
                        DPRINTF(ah->ah_sc, ATH_DBG_CALIBRATE,
-                               "%s: enabling IQ Calibration.\n",
-                               __func__);
+                               "enabling IQ Calibration.\n");
                }
 
-               ahp->ah_cal_list_curr = ahp->ah_cal_list;
+               ah->ah_cal_list_curr = ah->ah_cal_list;
 
-               if (ahp->ah_cal_list_curr)
-                       ath9k_hw_reset_calibration(ah, ahp->ah_cal_list_curr);
+               if (ah->ah_cal_list_curr)
+                       ath9k_hw_reset_calibration(ah, ah->ah_cal_list_curr);
        }
 
-       ichan->CalValid = 0;
+       chan->CalValid = 0;
 
        return true;
 }