Merge remote-tracking branch 'asoc/fix/compress' into asoc-linus
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / ath / ath9k / ar9003_calib.c
1 /*
2  * Copyright (c) 2010-2011 Atheros Communications Inc.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16
17 #include "hw.h"
18 #include "hw-ops.h"
19 #include "ar9003_phy.h"
20 #include "ar9003_rtt.h"
21 #include "ar9003_mci.h"
22
23 #define MAX_MEASUREMENT MAX_IQCAL_MEASUREMENT
24 #define MAX_MAG_DELTA   11
25 #define MAX_PHS_DELTA   10
26
27 struct coeff {
28         int mag_coeff[AR9300_MAX_CHAINS][MAX_MEASUREMENT];
29         int phs_coeff[AR9300_MAX_CHAINS][MAX_MEASUREMENT];
30         int iqc_coeff[2];
31 };
32
33 enum ar9003_cal_types {
34         IQ_MISMATCH_CAL = BIT(0),
35 };
36
37 static void ar9003_hw_setup_calibration(struct ath_hw *ah,
38                                         struct ath9k_cal_list *currCal)
39 {
40         struct ath_common *common = ath9k_hw_common(ah);
41
42         /* Select calibration to run */
43         switch (currCal->calData->calType) {
44         case IQ_MISMATCH_CAL:
45                 /*
46                  * Start calibration with
47                  * 2^(INIT_IQCAL_LOG_COUNT_MAX+1) samples
48                  */
49                 REG_RMW_FIELD(ah, AR_PHY_TIMING4,
50                               AR_PHY_TIMING4_IQCAL_LOG_COUNT_MAX,
51                               currCal->calData->calCountMax);
52                 REG_WRITE(ah, AR_PHY_CALMODE, AR_PHY_CALMODE_IQ);
53
54                 ath_dbg(common, CALIBRATE,
55                         "starting IQ Mismatch Calibration\n");
56
57                 /* Kick-off cal */
58                 REG_SET_BIT(ah, AR_PHY_TIMING4, AR_PHY_TIMING4_DO_CAL);
59                 break;
60         default:
61                 ath_err(common, "Invalid calibration type\n");
62                 break;
63         }
64 }
65
66 /*
67  * Generic calibration routine.
68  * Recalibrate the lower PHY chips to account for temperature/environment
69  * changes.
70  */
71 static bool ar9003_hw_per_calibration(struct ath_hw *ah,
72                                       struct ath9k_channel *ichan,
73                                       u8 rxchainmask,
74                                       struct ath9k_cal_list *currCal)
75 {
76         struct ath9k_hw_cal_data *caldata = ah->caldata;
77         /* Cal is assumed not done until explicitly set below */
78         bool iscaldone = false;
79
80         /* Calibration in progress. */
81         if (currCal->calState == CAL_RUNNING) {
82                 /* Check to see if it has finished. */
83                 if (!(REG_READ(ah, AR_PHY_TIMING4) & AR_PHY_TIMING4_DO_CAL)) {
84                         /*
85                         * Accumulate cal measures for active chains
86                         */
87                         currCal->calData->calCollect(ah);
88                         ah->cal_samples++;
89
90                         if (ah->cal_samples >=
91                             currCal->calData->calNumSamples) {
92                                 unsigned int i, numChains = 0;
93                                 for (i = 0; i < AR9300_MAX_CHAINS; i++) {
94                                         if (rxchainmask & (1 << i))
95                                                 numChains++;
96                                 }
97
98                                 /*
99                                 * Process accumulated data
100                                 */
101                                 currCal->calData->calPostProc(ah, numChains);
102
103                                 /* Calibration has finished. */
104                                 caldata->CalValid |= currCal->calData->calType;
105                                 currCal->calState = CAL_DONE;
106                                 iscaldone = true;
107                         } else {
108                         /*
109                          * Set-up collection of another sub-sample until we
110                          * get desired number
111                          */
112                         ar9003_hw_setup_calibration(ah, currCal);
113                         }
114                 }
115         } else if (!(caldata->CalValid & currCal->calData->calType)) {
116                 /* If current cal is marked invalid in channel, kick it off */
117                 ath9k_hw_reset_calibration(ah, currCal);
118         }
119
120         return iscaldone;
121 }
122
123 static bool ar9003_hw_calibrate(struct ath_hw *ah,
124                                 struct ath9k_channel *chan,
125                                 u8 rxchainmask,
126                                 bool longcal)
127 {
128         bool iscaldone = true;
129         struct ath9k_cal_list *currCal = ah->cal_list_curr;
130
131         /*
132          * For given calibration:
133          * 1. Call generic cal routine
134          * 2. When this cal is done (isCalDone) if we have more cals waiting
135          *    (eg after reset), mask this to upper layers by not propagating
136          *    isCalDone if it is set to TRUE.
137          *    Instead, change isCalDone to FALSE and setup the waiting cal(s)
138          *    to be run.
139          */
140         if (currCal &&
141             (currCal->calState == CAL_RUNNING ||
142              currCal->calState == CAL_WAITING)) {
143                 iscaldone = ar9003_hw_per_calibration(ah, chan,
144                                                       rxchainmask, currCal);
145                 if (iscaldone) {
146                         ah->cal_list_curr = currCal = currCal->calNext;
147
148                         if (currCal->calState == CAL_WAITING) {
149                                 iscaldone = false;
150                                 ath9k_hw_reset_calibration(ah, currCal);
151                         }
152                 }
153         }
154
155         /*
156          * Do NF cal only at longer intervals. Get the value from
157          * the previous NF cal and update history buffer.
158          */
159         if (longcal && ath9k_hw_getnf(ah, chan)) {
160                 /*
161                  * Load the NF from history buffer of the current channel.
162                  * NF is slow time-variant, so it is OK to use a historical
163                  * value.
164                  */
165                 ath9k_hw_loadnf(ah, ah->curchan);
166
167                 /* start NF calibration, without updating BB NF register */
168                 ath9k_hw_start_nfcal(ah, false);
169         }
170
171         return iscaldone;
172 }
173
174 static void ar9003_hw_iqcal_collect(struct ath_hw *ah)
175 {
176         int i;
177
178         /* Accumulate IQ cal measures for active chains */
179         for (i = 0; i < AR5416_MAX_CHAINS; i++) {
180                 if (ah->txchainmask & BIT(i)) {
181                         ah->totalPowerMeasI[i] +=
182                                 REG_READ(ah, AR_PHY_CAL_MEAS_0(i));
183                         ah->totalPowerMeasQ[i] +=
184                                 REG_READ(ah, AR_PHY_CAL_MEAS_1(i));
185                         ah->totalIqCorrMeas[i] +=
186                                 (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_2(i));
187                         ath_dbg(ath9k_hw_common(ah), CALIBRATE,
188                                 "%d: Chn %d pmi=0x%08x;pmq=0x%08x;iqcm=0x%08x;\n",
189                                 ah->cal_samples, i, ah->totalPowerMeasI[i],
190                                 ah->totalPowerMeasQ[i],
191                                 ah->totalIqCorrMeas[i]);
192                 }
193         }
194 }
195
196 static void ar9003_hw_iqcalibrate(struct ath_hw *ah, u8 numChains)
197 {
198         struct ath_common *common = ath9k_hw_common(ah);
199         u32 powerMeasQ, powerMeasI, iqCorrMeas;
200         u32 qCoffDenom, iCoffDenom;
201         int32_t qCoff, iCoff;
202         int iqCorrNeg, i;
203         static const u_int32_t offset_array[3] = {
204                 AR_PHY_RX_IQCAL_CORR_B0,
205                 AR_PHY_RX_IQCAL_CORR_B1,
206                 AR_PHY_RX_IQCAL_CORR_B2,
207         };
208
209         for (i = 0; i < numChains; i++) {
210                 powerMeasI = ah->totalPowerMeasI[i];
211                 powerMeasQ = ah->totalPowerMeasQ[i];
212                 iqCorrMeas = ah->totalIqCorrMeas[i];
213
214                 ath_dbg(common, CALIBRATE,
215                         "Starting IQ Cal and Correction for Chain %d\n", i);
216
217                 ath_dbg(common, CALIBRATE,
218                         "Original: Chn %d iq_corr_meas = 0x%08x\n",
219                         i, ah->totalIqCorrMeas[i]);
220
221                 iqCorrNeg = 0;
222
223                 if (iqCorrMeas > 0x80000000) {
224                         iqCorrMeas = (0xffffffff - iqCorrMeas) + 1;
225                         iqCorrNeg = 1;
226                 }
227
228                 ath_dbg(common, CALIBRATE, "Chn %d pwr_meas_i = 0x%08x\n",
229                         i, powerMeasI);
230                 ath_dbg(common, CALIBRATE, "Chn %d pwr_meas_q = 0x%08x\n",
231                         i, powerMeasQ);
232                 ath_dbg(common, CALIBRATE, "iqCorrNeg is 0x%08x\n", iqCorrNeg);
233
234                 iCoffDenom = (powerMeasI / 2 + powerMeasQ / 2) / 256;
235                 qCoffDenom = powerMeasQ / 64;
236
237                 if ((iCoffDenom != 0) && (qCoffDenom != 0)) {
238                         iCoff = iqCorrMeas / iCoffDenom;
239                         qCoff = powerMeasI / qCoffDenom - 64;
240                         ath_dbg(common, CALIBRATE, "Chn %d iCoff = 0x%08x\n",
241                                 i, iCoff);
242                         ath_dbg(common, CALIBRATE, "Chn %d qCoff = 0x%08x\n",
243                                 i, qCoff);
244
245                         /* Force bounds on iCoff */
246                         if (iCoff >= 63)
247                                 iCoff = 63;
248                         else if (iCoff <= -63)
249                                 iCoff = -63;
250
251                         /* Negate iCoff if iqCorrNeg == 0 */
252                         if (iqCorrNeg == 0x0)
253                                 iCoff = -iCoff;
254
255                         /* Force bounds on qCoff */
256                         if (qCoff >= 63)
257                                 qCoff = 63;
258                         else if (qCoff <= -63)
259                                 qCoff = -63;
260
261                         iCoff = iCoff & 0x7f;
262                         qCoff = qCoff & 0x7f;
263
264                         ath_dbg(common, CALIBRATE,
265                                 "Chn %d : iCoff = 0x%x  qCoff = 0x%x\n",
266                                 i, iCoff, qCoff);
267                         ath_dbg(common, CALIBRATE,
268                                 "Register offset (0x%04x) before update = 0x%x\n",
269                                 offset_array[i],
270                                 REG_READ(ah, offset_array[i]));
271
272                         if (AR_SREV_9565(ah) &&
273                             (iCoff == 63 || qCoff == 63 ||
274                              iCoff == -63 || qCoff == -63))
275                                 return;
276
277                         REG_RMW_FIELD(ah, offset_array[i],
278                                       AR_PHY_RX_IQCAL_CORR_IQCORR_Q_I_COFF,
279                                       iCoff);
280                         REG_RMW_FIELD(ah, offset_array[i],
281                                       AR_PHY_RX_IQCAL_CORR_IQCORR_Q_Q_COFF,
282                                       qCoff);
283                         ath_dbg(common, CALIBRATE,
284                                 "Register offset (0x%04x) QI COFF (bitfields 0x%08x) after update = 0x%x\n",
285                                 offset_array[i],
286                                 AR_PHY_RX_IQCAL_CORR_IQCORR_Q_I_COFF,
287                                 REG_READ(ah, offset_array[i]));
288                         ath_dbg(common, CALIBRATE,
289                                 "Register offset (0x%04x) QQ COFF (bitfields 0x%08x) after update = 0x%x\n",
290                                 offset_array[i],
291                                 AR_PHY_RX_IQCAL_CORR_IQCORR_Q_Q_COFF,
292                                 REG_READ(ah, offset_array[i]));
293
294                         ath_dbg(common, CALIBRATE,
295                                 "IQ Cal and Correction done for Chain %d\n", i);
296                 }
297         }
298
299         REG_SET_BIT(ah, AR_PHY_RX_IQCAL_CORR_B0,
300                     AR_PHY_RX_IQCAL_CORR_IQCORR_ENABLE);
301         ath_dbg(common, CALIBRATE,
302                 "IQ Cal and Correction (offset 0x%04x) enabled (bit position 0x%08x). New Value 0x%08x\n",
303                 (unsigned) (AR_PHY_RX_IQCAL_CORR_B0),
304                 AR_PHY_RX_IQCAL_CORR_IQCORR_ENABLE,
305                 REG_READ(ah, AR_PHY_RX_IQCAL_CORR_B0));
306 }
307
308 static const struct ath9k_percal_data iq_cal_single_sample = {
309         IQ_MISMATCH_CAL,
310         MIN_CAL_SAMPLES,
311         PER_MAX_LOG_COUNT,
312         ar9003_hw_iqcal_collect,
313         ar9003_hw_iqcalibrate
314 };
315
316 static void ar9003_hw_init_cal_settings(struct ath_hw *ah)
317 {
318         ah->iq_caldata.calData = &iq_cal_single_sample;
319
320         if (AR_SREV_9300_20_OR_LATER(ah)) {
321                 ah->enabled_cals |= TX_IQ_CAL;
322                 if (AR_SREV_9485_OR_LATER(ah) && !AR_SREV_9340(ah))
323                         ah->enabled_cals |= TX_IQ_ON_AGC_CAL;
324         }
325
326         ah->supp_cals = IQ_MISMATCH_CAL;
327 }
328
329 /*
330  * solve 4x4 linear equation used in loopback iq cal.
331  */
332 static bool ar9003_hw_solve_iq_cal(struct ath_hw *ah,
333                                    s32 sin_2phi_1,
334                                    s32 cos_2phi_1,
335                                    s32 sin_2phi_2,
336                                    s32 cos_2phi_2,
337                                    s32 mag_a0_d0,
338                                    s32 phs_a0_d0,
339                                    s32 mag_a1_d0,
340                                    s32 phs_a1_d0,
341                                    s32 solved_eq[])
342 {
343         s32 f1 = cos_2phi_1 - cos_2phi_2,
344             f3 = sin_2phi_1 - sin_2phi_2,
345             f2;
346         s32 mag_tx, phs_tx, mag_rx, phs_rx;
347         const s32 result_shift = 1 << 15;
348         struct ath_common *common = ath9k_hw_common(ah);
349
350         f2 = (f1 * f1 + f3 * f3) / result_shift;
351
352         if (!f2) {
353                 ath_dbg(common, CALIBRATE, "Divide by 0\n");
354                 return false;
355         }
356
357         /* mag mismatch, tx */
358         mag_tx = f1 * (mag_a0_d0  - mag_a1_d0) + f3 * (phs_a0_d0 - phs_a1_d0);
359         /* phs mismatch, tx */
360         phs_tx = f3 * (-mag_a0_d0 + mag_a1_d0) + f1 * (phs_a0_d0 - phs_a1_d0);
361
362         mag_tx = (mag_tx / f2);
363         phs_tx = (phs_tx / f2);
364
365         /* mag mismatch, rx */
366         mag_rx = mag_a0_d0 - (cos_2phi_1 * mag_tx + sin_2phi_1 * phs_tx) /
367                  result_shift;
368         /* phs mismatch, rx */
369         phs_rx = phs_a0_d0 + (sin_2phi_1 * mag_tx - cos_2phi_1 * phs_tx) /
370                  result_shift;
371
372         solved_eq[0] = mag_tx;
373         solved_eq[1] = phs_tx;
374         solved_eq[2] = mag_rx;
375         solved_eq[3] = phs_rx;
376
377         return true;
378 }
379
380 static s32 ar9003_hw_find_mag_approx(struct ath_hw *ah, s32 in_re, s32 in_im)
381 {
382         s32 abs_i = abs(in_re),
383             abs_q = abs(in_im),
384             max_abs, min_abs;
385
386         if (abs_i > abs_q) {
387                 max_abs = abs_i;
388                 min_abs = abs_q;
389         } else {
390                 max_abs = abs_q;
391                 min_abs = abs_i;
392         }
393
394         return max_abs - (max_abs / 32) + (min_abs / 8) + (min_abs / 4);
395 }
396
397 #define DELPT 32
398
399 static bool ar9003_hw_calc_iq_corr(struct ath_hw *ah,
400                                    s32 chain_idx,
401                                    const s32 iq_res[],
402                                    s32 iqc_coeff[])
403 {
404         s32 i2_m_q2_a0_d0, i2_p_q2_a0_d0, iq_corr_a0_d0,
405             i2_m_q2_a0_d1, i2_p_q2_a0_d1, iq_corr_a0_d1,
406             i2_m_q2_a1_d0, i2_p_q2_a1_d0, iq_corr_a1_d0,
407             i2_m_q2_a1_d1, i2_p_q2_a1_d1, iq_corr_a1_d1;
408         s32 mag_a0_d0, mag_a1_d0, mag_a0_d1, mag_a1_d1,
409             phs_a0_d0, phs_a1_d0, phs_a0_d1, phs_a1_d1,
410             sin_2phi_1, cos_2phi_1,
411             sin_2phi_2, cos_2phi_2;
412         s32 mag_tx, phs_tx, mag_rx, phs_rx;
413         s32 solved_eq[4], mag_corr_tx, phs_corr_tx, mag_corr_rx, phs_corr_rx,
414             q_q_coff, q_i_coff;
415         const s32 res_scale = 1 << 15;
416         const s32 delpt_shift = 1 << 8;
417         s32 mag1, mag2;
418         struct ath_common *common = ath9k_hw_common(ah);
419
420         i2_m_q2_a0_d0 = iq_res[0] & 0xfff;
421         i2_p_q2_a0_d0 = (iq_res[0] >> 12) & 0xfff;
422         iq_corr_a0_d0 = ((iq_res[0] >> 24) & 0xff) + ((iq_res[1] & 0xf) << 8);
423
424         if (i2_m_q2_a0_d0 > 0x800)
425                 i2_m_q2_a0_d0 = -((0xfff - i2_m_q2_a0_d0) + 1);
426
427         if (i2_p_q2_a0_d0 > 0x800)
428                 i2_p_q2_a0_d0 = -((0xfff - i2_p_q2_a0_d0) + 1);
429
430         if (iq_corr_a0_d0 > 0x800)
431                 iq_corr_a0_d0 = -((0xfff - iq_corr_a0_d0) + 1);
432
433         i2_m_q2_a0_d1 = (iq_res[1] >> 4) & 0xfff;
434         i2_p_q2_a0_d1 = (iq_res[2] & 0xfff);
435         iq_corr_a0_d1 = (iq_res[2] >> 12) & 0xfff;
436
437         if (i2_m_q2_a0_d1 > 0x800)
438                 i2_m_q2_a0_d1 = -((0xfff - i2_m_q2_a0_d1) + 1);
439
440         if (i2_p_q2_a0_d1 > 0x800)
441                 i2_p_q2_a0_d1 = -((0xfff - i2_p_q2_a0_d1) + 1);
442
443         if (iq_corr_a0_d1 > 0x800)
444                 iq_corr_a0_d1 = -((0xfff - iq_corr_a0_d1) + 1);
445
446         i2_m_q2_a1_d0 = ((iq_res[2] >> 24) & 0xff) + ((iq_res[3] & 0xf) << 8);
447         i2_p_q2_a1_d0 = (iq_res[3] >> 4) & 0xfff;
448         iq_corr_a1_d0 = iq_res[4] & 0xfff;
449
450         if (i2_m_q2_a1_d0 > 0x800)
451                 i2_m_q2_a1_d0 = -((0xfff - i2_m_q2_a1_d0) + 1);
452
453         if (i2_p_q2_a1_d0 > 0x800)
454                 i2_p_q2_a1_d0 = -((0xfff - i2_p_q2_a1_d0) + 1);
455
456         if (iq_corr_a1_d0 > 0x800)
457                 iq_corr_a1_d0 = -((0xfff - iq_corr_a1_d0) + 1);
458
459         i2_m_q2_a1_d1 = (iq_res[4] >> 12) & 0xfff;
460         i2_p_q2_a1_d1 = ((iq_res[4] >> 24) & 0xff) + ((iq_res[5] & 0xf) << 8);
461         iq_corr_a1_d1 = (iq_res[5] >> 4) & 0xfff;
462
463         if (i2_m_q2_a1_d1 > 0x800)
464                 i2_m_q2_a1_d1 = -((0xfff - i2_m_q2_a1_d1) + 1);
465
466         if (i2_p_q2_a1_d1 > 0x800)
467                 i2_p_q2_a1_d1 = -((0xfff - i2_p_q2_a1_d1) + 1);
468
469         if (iq_corr_a1_d1 > 0x800)
470                 iq_corr_a1_d1 = -((0xfff - iq_corr_a1_d1) + 1);
471
472         if ((i2_p_q2_a0_d0 == 0) || (i2_p_q2_a0_d1 == 0) ||
473             (i2_p_q2_a1_d0 == 0) || (i2_p_q2_a1_d1 == 0)) {
474                 ath_dbg(common, CALIBRATE,
475                         "Divide by 0:\n"
476                         "a0_d0=%d\n"
477                         "a0_d1=%d\n"
478                         "a2_d0=%d\n"
479                         "a1_d1=%d\n",
480                         i2_p_q2_a0_d0, i2_p_q2_a0_d1,
481                         i2_p_q2_a1_d0, i2_p_q2_a1_d1);
482                 return false;
483         }
484
485         mag_a0_d0 = (i2_m_q2_a0_d0 * res_scale) / i2_p_q2_a0_d0;
486         phs_a0_d0 = (iq_corr_a0_d0 * res_scale) / i2_p_q2_a0_d0;
487
488         mag_a0_d1 = (i2_m_q2_a0_d1 * res_scale) / i2_p_q2_a0_d1;
489         phs_a0_d1 = (iq_corr_a0_d1 * res_scale) / i2_p_q2_a0_d1;
490
491         mag_a1_d0 = (i2_m_q2_a1_d0 * res_scale) / i2_p_q2_a1_d0;
492         phs_a1_d0 = (iq_corr_a1_d0 * res_scale) / i2_p_q2_a1_d0;
493
494         mag_a1_d1 = (i2_m_q2_a1_d1 * res_scale) / i2_p_q2_a1_d1;
495         phs_a1_d1 = (iq_corr_a1_d1 * res_scale) / i2_p_q2_a1_d1;
496
497         /* w/o analog phase shift */
498         sin_2phi_1 = (((mag_a0_d0 - mag_a0_d1) * delpt_shift) / DELPT);
499         /* w/o analog phase shift */
500         cos_2phi_1 = (((phs_a0_d1 - phs_a0_d0) * delpt_shift) / DELPT);
501         /* w/  analog phase shift */
502         sin_2phi_2 = (((mag_a1_d0 - mag_a1_d1) * delpt_shift) / DELPT);
503         /* w/  analog phase shift */
504         cos_2phi_2 = (((phs_a1_d1 - phs_a1_d0) * delpt_shift) / DELPT);
505
506         /*
507          * force sin^2 + cos^2 = 1;
508          * find magnitude by approximation
509          */
510         mag1 = ar9003_hw_find_mag_approx(ah, cos_2phi_1, sin_2phi_1);
511         mag2 = ar9003_hw_find_mag_approx(ah, cos_2phi_2, sin_2phi_2);
512
513         if ((mag1 == 0) || (mag2 == 0)) {
514                 ath_dbg(common, CALIBRATE, "Divide by 0: mag1=%d, mag2=%d\n",
515                         mag1, mag2);
516                 return false;
517         }
518
519         /* normalization sin and cos by mag */
520         sin_2phi_1 = (sin_2phi_1 * res_scale / mag1);
521         cos_2phi_1 = (cos_2phi_1 * res_scale / mag1);
522         sin_2phi_2 = (sin_2phi_2 * res_scale / mag2);
523         cos_2phi_2 = (cos_2phi_2 * res_scale / mag2);
524
525         /* calculate IQ mismatch */
526         if (!ar9003_hw_solve_iq_cal(ah,
527                              sin_2phi_1, cos_2phi_1,
528                              sin_2phi_2, cos_2phi_2,
529                              mag_a0_d0, phs_a0_d0,
530                              mag_a1_d0,
531                              phs_a1_d0, solved_eq)) {
532                 ath_dbg(common, CALIBRATE,
533                         "Call to ar9003_hw_solve_iq_cal() failed\n");
534                 return false;
535         }
536
537         mag_tx = solved_eq[0];
538         phs_tx = solved_eq[1];
539         mag_rx = solved_eq[2];
540         phs_rx = solved_eq[3];
541
542         ath_dbg(common, CALIBRATE,
543                 "chain %d: mag mismatch=%d phase mismatch=%d\n",
544                 chain_idx, mag_tx/res_scale, phs_tx/res_scale);
545
546         if (res_scale == mag_tx) {
547                 ath_dbg(common, CALIBRATE,
548                         "Divide by 0: mag_tx=%d, res_scale=%d\n",
549                         mag_tx, res_scale);
550                 return false;
551         }
552
553         /* calculate and quantize Tx IQ correction factor */
554         mag_corr_tx = (mag_tx * res_scale) / (res_scale - mag_tx);
555         phs_corr_tx = -phs_tx;
556
557         q_q_coff = (mag_corr_tx * 128 / res_scale);
558         q_i_coff = (phs_corr_tx * 256 / res_scale);
559
560         ath_dbg(common, CALIBRATE, "tx chain %d: mag corr=%d  phase corr=%d\n",
561                 chain_idx, q_q_coff, q_i_coff);
562
563         if (q_i_coff < -63)
564                 q_i_coff = -63;
565         if (q_i_coff > 63)
566                 q_i_coff = 63;
567         if (q_q_coff < -63)
568                 q_q_coff = -63;
569         if (q_q_coff > 63)
570                 q_q_coff = 63;
571
572         iqc_coeff[0] = (q_q_coff * 128) + q_i_coff;
573
574         ath_dbg(common, CALIBRATE, "tx chain %d: iq corr coeff=%x\n",
575                 chain_idx, iqc_coeff[0]);
576
577         if (-mag_rx == res_scale) {
578                 ath_dbg(common, CALIBRATE,
579                         "Divide by 0: mag_rx=%d, res_scale=%d\n",
580                         mag_rx, res_scale);
581                 return false;
582         }
583
584         /* calculate and quantize Rx IQ correction factors */
585         mag_corr_rx = (-mag_rx * res_scale) / (res_scale + mag_rx);
586         phs_corr_rx = -phs_rx;
587
588         q_q_coff = (mag_corr_rx * 128 / res_scale);
589         q_i_coff = (phs_corr_rx * 256 / res_scale);
590
591         ath_dbg(common, CALIBRATE, "rx chain %d: mag corr=%d  phase corr=%d\n",
592                 chain_idx, q_q_coff, q_i_coff);
593
594         if (q_i_coff < -63)
595                 q_i_coff = -63;
596         if (q_i_coff > 63)
597                 q_i_coff = 63;
598         if (q_q_coff < -63)
599                 q_q_coff = -63;
600         if (q_q_coff > 63)
601                 q_q_coff = 63;
602
603         iqc_coeff[1] = (q_q_coff * 128) + q_i_coff;
604
605         ath_dbg(common, CALIBRATE, "rx chain %d: iq corr coeff=%x\n",
606                 chain_idx, iqc_coeff[1]);
607
608         return true;
609 }
610
611 static void ar9003_hw_detect_outlier(int *mp_coeff, int nmeasurement,
612                                      int max_delta)
613 {
614         int mp_max = -64, max_idx = 0;
615         int mp_min = 63, min_idx = 0;
616         int mp_avg = 0, i, outlier_idx = 0, mp_count = 0;
617
618         /* find min/max mismatch across all calibrated gains */
619         for (i = 0; i < nmeasurement; i++) {
620                 if (mp_coeff[i] > mp_max) {
621                         mp_max = mp_coeff[i];
622                         max_idx = i;
623                 } else if (mp_coeff[i] < mp_min) {
624                         mp_min = mp_coeff[i];
625                         min_idx = i;
626                 }
627         }
628
629         /* find average (exclude max abs value) */
630         for (i = 0; i < nmeasurement; i++) {
631                 if ((abs(mp_coeff[i]) < abs(mp_max)) ||
632                     (abs(mp_coeff[i]) < abs(mp_min))) {
633                         mp_avg += mp_coeff[i];
634                         mp_count++;
635                 }
636         }
637
638         /*
639          * finding mean magnitude/phase if possible, otherwise
640          * just use the last value as the mean
641          */
642         if (mp_count)
643                 mp_avg /= mp_count;
644         else
645                 mp_avg = mp_coeff[nmeasurement - 1];
646
647         /* detect outlier */
648         if (abs(mp_max - mp_min) > max_delta) {
649                 if (abs(mp_max - mp_avg) > abs(mp_min - mp_avg))
650                         outlier_idx = max_idx;
651                 else
652                         outlier_idx = min_idx;
653
654                 mp_coeff[outlier_idx] = mp_avg;
655         }
656 }
657
658 static void ar9003_hw_tx_iqcal_load_avg_2_passes(struct ath_hw *ah,
659                                                  struct coeff *coeff,
660                                                  bool is_reusable)
661 {
662         int i, im, nmeasurement;
663         u32 tx_corr_coeff[MAX_MEASUREMENT][AR9300_MAX_CHAINS];
664         struct ath9k_hw_cal_data *caldata = ah->caldata;
665
666         memset(tx_corr_coeff, 0, sizeof(tx_corr_coeff));
667         for (i = 0; i < MAX_MEASUREMENT / 2; i++) {
668                 tx_corr_coeff[i * 2][0] = tx_corr_coeff[(i * 2) + 1][0] =
669                                         AR_PHY_TX_IQCAL_CORR_COEFF_B0(i);
670                 if (!AR_SREV_9485(ah)) {
671                         tx_corr_coeff[i * 2][1] =
672                         tx_corr_coeff[(i * 2) + 1][1] =
673                                         AR_PHY_TX_IQCAL_CORR_COEFF_B1(i);
674
675                         tx_corr_coeff[i * 2][2] =
676                         tx_corr_coeff[(i * 2) + 1][2] =
677                                         AR_PHY_TX_IQCAL_CORR_COEFF_B2(i);
678                 }
679         }
680
681         /* Load the average of 2 passes */
682         for (i = 0; i < AR9300_MAX_CHAINS; i++) {
683                 if (!(ah->txchainmask & (1 << i)))
684                         continue;
685                 nmeasurement = REG_READ_FIELD(ah,
686                                 AR_PHY_TX_IQCAL_STATUS_B0,
687                                 AR_PHY_CALIBRATED_GAINS_0);
688
689                 if (nmeasurement > MAX_MEASUREMENT)
690                         nmeasurement = MAX_MEASUREMENT;
691
692                 /* detect outlier only if nmeasurement > 1 */
693                 if (nmeasurement > 1) {
694                         /* Detect magnitude outlier */
695                         ar9003_hw_detect_outlier(coeff->mag_coeff[i],
696                                         nmeasurement, MAX_MAG_DELTA);
697
698                         /* Detect phase outlier */
699                         ar9003_hw_detect_outlier(coeff->phs_coeff[i],
700                                         nmeasurement, MAX_PHS_DELTA);
701                 }
702
703                 for (im = 0; im < nmeasurement; im++) {
704
705                         coeff->iqc_coeff[0] = (coeff->mag_coeff[i][im] & 0x7f) |
706                                 ((coeff->phs_coeff[i][im] & 0x7f) << 7);
707
708                         if ((im % 2) == 0)
709                                 REG_RMW_FIELD(ah, tx_corr_coeff[im][i],
710                                         AR_PHY_TX_IQCAL_CORR_COEFF_00_COEFF_TABLE,
711                                         coeff->iqc_coeff[0]);
712                         else
713                                 REG_RMW_FIELD(ah, tx_corr_coeff[im][i],
714                                         AR_PHY_TX_IQCAL_CORR_COEFF_01_COEFF_TABLE,
715                                         coeff->iqc_coeff[0]);
716
717                         if (caldata)
718                                 caldata->tx_corr_coeff[im][i] =
719                                         coeff->iqc_coeff[0];
720                 }
721                 if (caldata)
722                         caldata->num_measures[i] = nmeasurement;
723         }
724
725         REG_RMW_FIELD(ah, AR_PHY_TX_IQCAL_CONTROL_3,
726                       AR_PHY_TX_IQCAL_CONTROL_3_IQCORR_EN, 0x1);
727         REG_RMW_FIELD(ah, AR_PHY_RX_IQCAL_CORR_B0,
728                       AR_PHY_RX_IQCAL_CORR_B0_LOOPBACK_IQCORR_EN, 0x1);
729
730         if (caldata)
731                 caldata->done_txiqcal_once = is_reusable;
732
733         return;
734 }
735
736 static bool ar9003_hw_tx_iq_cal_run(struct ath_hw *ah)
737 {
738         struct ath_common *common = ath9k_hw_common(ah);
739         u8 tx_gain_forced;
740
741         tx_gain_forced = REG_READ_FIELD(ah, AR_PHY_TX_FORCED_GAIN,
742                                         AR_PHY_TXGAIN_FORCE);
743         if (tx_gain_forced)
744                 REG_RMW_FIELD(ah, AR_PHY_TX_FORCED_GAIN,
745                               AR_PHY_TXGAIN_FORCE, 0);
746
747         REG_RMW_FIELD(ah, AR_PHY_TX_IQCAL_START,
748                       AR_PHY_TX_IQCAL_START_DO_CAL, 1);
749
750         if (!ath9k_hw_wait(ah, AR_PHY_TX_IQCAL_START,
751                         AR_PHY_TX_IQCAL_START_DO_CAL, 0,
752                         AH_WAIT_TIMEOUT)) {
753                 ath_dbg(common, CALIBRATE, "Tx IQ Cal is not completed\n");
754                 return false;
755         }
756         return true;
757 }
758
759 static void ar9003_hw_tx_iq_cal_post_proc(struct ath_hw *ah, bool is_reusable)
760 {
761         struct ath_common *common = ath9k_hw_common(ah);
762         const u32 txiqcal_status[AR9300_MAX_CHAINS] = {
763                 AR_PHY_TX_IQCAL_STATUS_B0,
764                 AR_PHY_TX_IQCAL_STATUS_B1,
765                 AR_PHY_TX_IQCAL_STATUS_B2,
766         };
767         const u_int32_t chan_info_tab[] = {
768                 AR_PHY_CHAN_INFO_TAB_0,
769                 AR_PHY_CHAN_INFO_TAB_1,
770                 AR_PHY_CHAN_INFO_TAB_2,
771         };
772         struct coeff coeff;
773         s32 iq_res[6];
774         int i, im, j;
775         int nmeasurement;
776
777         for (i = 0; i < AR9300_MAX_CHAINS; i++) {
778                 if (!(ah->txchainmask & (1 << i)))
779                         continue;
780
781                 nmeasurement = REG_READ_FIELD(ah,
782                                 AR_PHY_TX_IQCAL_STATUS_B0,
783                                 AR_PHY_CALIBRATED_GAINS_0);
784                 if (nmeasurement > MAX_MEASUREMENT)
785                         nmeasurement = MAX_MEASUREMENT;
786
787                 for (im = 0; im < nmeasurement; im++) {
788                         ath_dbg(common, CALIBRATE,
789                                 "Doing Tx IQ Cal for chain %d\n", i);
790
791                         if (REG_READ(ah, txiqcal_status[i]) &
792                                         AR_PHY_TX_IQCAL_STATUS_FAILED) {
793                                 ath_dbg(common, CALIBRATE,
794                                         "Tx IQ Cal failed for chain %d\n", i);
795                                 goto tx_iqcal_fail;
796                         }
797
798                         for (j = 0; j < 3; j++) {
799                                 u32 idx = 2 * j, offset = 4 * (3 * im + j);
800
801                                 REG_RMW_FIELD(ah,
802                                                 AR_PHY_CHAN_INFO_MEMORY,
803                                                 AR_PHY_CHAN_INFO_TAB_S2_READ,
804                                                 0);
805
806                                 /* 32 bits */
807                                 iq_res[idx] = REG_READ(ah,
808                                                 chan_info_tab[i] +
809                                                 offset);
810
811                                 REG_RMW_FIELD(ah,
812                                                 AR_PHY_CHAN_INFO_MEMORY,
813                                                 AR_PHY_CHAN_INFO_TAB_S2_READ,
814                                                 1);
815
816                                 /* 16 bits */
817                                 iq_res[idx + 1] = 0xffff & REG_READ(ah,
818                                                 chan_info_tab[i] + offset);
819
820                                 ath_dbg(common, CALIBRATE,
821                                         "IQ_RES[%d]=0x%x IQ_RES[%d]=0x%x\n",
822                                         idx, iq_res[idx], idx + 1,
823                                         iq_res[idx + 1]);
824                         }
825
826                         if (!ar9003_hw_calc_iq_corr(ah, i, iq_res,
827                                                 coeff.iqc_coeff)) {
828                                 ath_dbg(common, CALIBRATE,
829                                         "Failed in calculation of IQ correction\n");
830                                 goto tx_iqcal_fail;
831                         }
832
833                         coeff.mag_coeff[i][im] = coeff.iqc_coeff[0] & 0x7f;
834                         coeff.phs_coeff[i][im] =
835                                 (coeff.iqc_coeff[0] >> 7) & 0x7f;
836
837                         if (coeff.mag_coeff[i][im] > 63)
838                                 coeff.mag_coeff[i][im] -= 128;
839                         if (coeff.phs_coeff[i][im] > 63)
840                                 coeff.phs_coeff[i][im] -= 128;
841                 }
842         }
843         ar9003_hw_tx_iqcal_load_avg_2_passes(ah, &coeff, is_reusable);
844
845         return;
846
847 tx_iqcal_fail:
848         ath_dbg(common, CALIBRATE, "Tx IQ Cal failed\n");
849         return;
850 }
851
852 static void ar9003_hw_tx_iq_cal_reload(struct ath_hw *ah)
853 {
854         struct ath9k_hw_cal_data *caldata = ah->caldata;
855         u32 tx_corr_coeff[MAX_MEASUREMENT][AR9300_MAX_CHAINS];
856         int i, im;
857
858         memset(tx_corr_coeff, 0, sizeof(tx_corr_coeff));
859         for (i = 0; i < MAX_MEASUREMENT / 2; i++) {
860                 tx_corr_coeff[i * 2][0] = tx_corr_coeff[(i * 2) + 1][0] =
861                                         AR_PHY_TX_IQCAL_CORR_COEFF_B0(i);
862                 if (!AR_SREV_9485(ah)) {
863                         tx_corr_coeff[i * 2][1] =
864                         tx_corr_coeff[(i * 2) + 1][1] =
865                                         AR_PHY_TX_IQCAL_CORR_COEFF_B1(i);
866
867                         tx_corr_coeff[i * 2][2] =
868                         tx_corr_coeff[(i * 2) + 1][2] =
869                                         AR_PHY_TX_IQCAL_CORR_COEFF_B2(i);
870                 }
871         }
872
873         for (i = 0; i < AR9300_MAX_CHAINS; i++) {
874                 if (!(ah->txchainmask & (1 << i)))
875                         continue;
876
877                 for (im = 0; im < caldata->num_measures[i]; im++) {
878                         if ((im % 2) == 0)
879                                 REG_RMW_FIELD(ah, tx_corr_coeff[im][i],
880                                      AR_PHY_TX_IQCAL_CORR_COEFF_00_COEFF_TABLE,
881                                      caldata->tx_corr_coeff[im][i]);
882                         else
883                                 REG_RMW_FIELD(ah, tx_corr_coeff[im][i],
884                                      AR_PHY_TX_IQCAL_CORR_COEFF_01_COEFF_TABLE,
885                                      caldata->tx_corr_coeff[im][i]);
886                 }
887         }
888
889         REG_RMW_FIELD(ah, AR_PHY_TX_IQCAL_CONTROL_3,
890                       AR_PHY_TX_IQCAL_CONTROL_3_IQCORR_EN, 0x1);
891         REG_RMW_FIELD(ah, AR_PHY_RX_IQCAL_CORR_B0,
892                       AR_PHY_RX_IQCAL_CORR_B0_LOOPBACK_IQCORR_EN, 0x1);
893 }
894
895 static void ar9003_hw_manual_peak_cal(struct ath_hw *ah, u8 chain, bool is_2g)
896 {
897         int offset[8], total = 0, test;
898         int agc_out, i;
899
900         REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_GAINSTAGES(chain),
901                       AR_PHY_65NM_RXRF_GAINSTAGES_RX_OVERRIDE, 0x1);
902         REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_GAINSTAGES(chain),
903                       AR_PHY_65NM_RXRF_GAINSTAGES_LNAON_CALDC, 0x0);
904         if (is_2g)
905                 REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_GAINSTAGES(chain),
906                               AR_PHY_65NM_RXRF_GAINSTAGES_LNA2G_GAIN_OVR, 0x0);
907         else
908                 REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_GAINSTAGES(chain),
909                               AR_PHY_65NM_RXRF_GAINSTAGES_LNA5G_GAIN_OVR, 0x0);
910
911         REG_RMW_FIELD(ah, AR_PHY_65NM_RXTX2(chain),
912                       AR_PHY_65NM_RXTX2_RXON_OVR, 0x1);
913         REG_RMW_FIELD(ah, AR_PHY_65NM_RXTX2(chain),
914                       AR_PHY_65NM_RXTX2_RXON, 0x0);
915
916         REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
917                       AR_PHY_65NM_RXRF_AGC_AGC_OVERRIDE, 0x1);
918         REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
919                       AR_PHY_65NM_RXRF_AGC_AGC_ON_OVR, 0x1);
920         REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
921                       AR_PHY_65NM_RXRF_AGC_AGC_CAL_OVR, 0x1);
922         if (is_2g)
923                 REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
924                               AR_PHY_65NM_RXRF_AGC_AGC2G_DBDAC_OVR, 0x0);
925         else
926                 REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
927                               AR_PHY_65NM_RXRF_AGC_AGC5G_DBDAC_OVR, 0x0);
928
929         for (i = 6; i > 0; i--) {
930                 offset[i] = BIT(i - 1);
931                 test = total + offset[i];
932
933                 if (is_2g)
934                         REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
935                                       AR_PHY_65NM_RXRF_AGC_AGC2G_CALDAC_OVR,
936                                       test);
937                 else
938                         REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
939                                       AR_PHY_65NM_RXRF_AGC_AGC5G_CALDAC_OVR,
940                                       test);
941                 udelay(100);
942                 agc_out = REG_READ_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
943                                          AR_PHY_65NM_RXRF_AGC_AGC_OUT);
944                 offset[i] = (agc_out) ? 0 : 1;
945                 total += (offset[i] << (i - 1));
946         }
947
948         if (is_2g)
949                 REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
950                               AR_PHY_65NM_RXRF_AGC_AGC2G_CALDAC_OVR, total);
951         else
952                 REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
953                               AR_PHY_65NM_RXRF_AGC_AGC5G_CALDAC_OVR, total);
954
955         REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_GAINSTAGES(chain),
956                       AR_PHY_65NM_RXRF_GAINSTAGES_RX_OVERRIDE, 0);
957         REG_RMW_FIELD(ah, AR_PHY_65NM_RXTX2(chain),
958                       AR_PHY_65NM_RXTX2_RXON_OVR, 0);
959         REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
960                       AR_PHY_65NM_RXRF_AGC_AGC_CAL_OVR, 0);
961 }
962
963 static void ar9003_hw_do_manual_peak_cal(struct ath_hw *ah,
964                                          struct ath9k_channel *chan)
965 {
966         int i;
967
968         if (!AR_SREV_9462(ah) && !AR_SREV_9565(ah) && !AR_SREV_9485(ah))
969                 return;
970
971         for (i = 0; i < AR9300_MAX_CHAINS; i++) {
972                 if (!(ah->rxchainmask & (1 << i)))
973                         continue;
974                 ar9003_hw_manual_peak_cal(ah, i, IS_CHAN_2GHZ(chan));
975         }
976 }
977
978 static void ar9003_hw_cl_cal_post_proc(struct ath_hw *ah, bool is_reusable)
979 {
980         u32 cl_idx[AR9300_MAX_CHAINS] = { AR_PHY_CL_TAB_0,
981                                           AR_PHY_CL_TAB_1,
982                                           AR_PHY_CL_TAB_2 };
983         struct ath9k_hw_cal_data *caldata = ah->caldata;
984         bool txclcal_done = false;
985         int i, j;
986
987         if (!caldata || !(ah->enabled_cals & TX_CL_CAL))
988                 return;
989
990         txclcal_done = !!(REG_READ(ah, AR_PHY_AGC_CONTROL) &
991                           AR_PHY_AGC_CONTROL_CLC_SUCCESS);
992
993         if (caldata->done_txclcal_once) {
994                 for (i = 0; i < AR9300_MAX_CHAINS; i++) {
995                         if (!(ah->txchainmask & (1 << i)))
996                                 continue;
997                         for (j = 0; j < MAX_CL_TAB_ENTRY; j++)
998                                 REG_WRITE(ah, CL_TAB_ENTRY(cl_idx[i]),
999                                           caldata->tx_clcal[i][j]);
1000                 }
1001         } else if (is_reusable && txclcal_done) {
1002                 for (i = 0; i < AR9300_MAX_CHAINS; i++) {
1003                         if (!(ah->txchainmask & (1 << i)))
1004                                 continue;
1005                         for (j = 0; j < MAX_CL_TAB_ENTRY; j++)
1006                                 caldata->tx_clcal[i][j] =
1007                                         REG_READ(ah, CL_TAB_ENTRY(cl_idx[i]));
1008                 }
1009                 caldata->done_txclcal_once = true;
1010         }
1011 }
1012
1013 static bool ar9003_hw_init_cal(struct ath_hw *ah,
1014                                struct ath9k_channel *chan)
1015 {
1016         struct ath_common *common = ath9k_hw_common(ah);
1017         struct ath9k_hw_cal_data *caldata = ah->caldata;
1018         bool txiqcal_done = false;
1019         bool is_reusable = true, status = true;
1020         bool run_rtt_cal = false, run_agc_cal, sep_iq_cal = false;
1021         bool rtt = !!(ah->caps.hw_caps & ATH9K_HW_CAP_RTT);
1022         u32 agc_ctrl = 0, agc_supp_cals = AR_PHY_AGC_CONTROL_OFFSET_CAL |
1023                                           AR_PHY_AGC_CONTROL_FLTR_CAL   |
1024                                           AR_PHY_AGC_CONTROL_PKDET_CAL;
1025
1026         /* Use chip chainmask only for calibration */
1027         ar9003_hw_set_chain_masks(ah, ah->caps.rx_chainmask, ah->caps.tx_chainmask);
1028
1029         if (rtt) {
1030                 if (!ar9003_hw_rtt_restore(ah, chan))
1031                         run_rtt_cal = true;
1032
1033                 if (run_rtt_cal)
1034                         ath_dbg(common, CALIBRATE, "RTT calibration to be done\n");
1035         }
1036
1037         run_agc_cal = run_rtt_cal;
1038
1039         if (run_rtt_cal) {
1040                 ar9003_hw_rtt_enable(ah);
1041                 ar9003_hw_rtt_set_mask(ah, 0x00);
1042                 ar9003_hw_rtt_clear_hist(ah);
1043         }
1044
1045         if (rtt && !run_rtt_cal) {
1046                 agc_ctrl = REG_READ(ah, AR_PHY_AGC_CONTROL);
1047                 agc_supp_cals &= agc_ctrl;
1048                 agc_ctrl &= ~(AR_PHY_AGC_CONTROL_OFFSET_CAL |
1049                              AR_PHY_AGC_CONTROL_FLTR_CAL |
1050                              AR_PHY_AGC_CONTROL_PKDET_CAL);
1051                 REG_WRITE(ah, AR_PHY_AGC_CONTROL, agc_ctrl);
1052         }
1053
1054         if (ah->enabled_cals & TX_CL_CAL) {
1055                 if (caldata && caldata->done_txclcal_once)
1056                         REG_CLR_BIT(ah, AR_PHY_CL_CAL_CTL,
1057                                     AR_PHY_CL_CAL_ENABLE);
1058                 else {
1059                         REG_SET_BIT(ah, AR_PHY_CL_CAL_CTL,
1060                                     AR_PHY_CL_CAL_ENABLE);
1061                         run_agc_cal = true;
1062                 }
1063         }
1064
1065         if ((IS_CHAN_HALF_RATE(chan) || IS_CHAN_QUARTER_RATE(chan)) ||
1066             !(ah->enabled_cals & TX_IQ_CAL))
1067                 goto skip_tx_iqcal;
1068
1069         /* Do Tx IQ Calibration */
1070         REG_RMW_FIELD(ah, AR_PHY_TX_IQCAL_CONTROL_1,
1071                       AR_PHY_TX_IQCAL_CONTROL_1_IQCORR_I_Q_COFF_DELPT,
1072                       DELPT);
1073
1074         /*
1075          * For AR9485 or later chips, TxIQ cal runs as part of
1076          * AGC calibration
1077          */
1078         if (ah->enabled_cals & TX_IQ_ON_AGC_CAL) {
1079                 if (caldata && !caldata->done_txiqcal_once)
1080                         REG_SET_BIT(ah, AR_PHY_TX_IQCAL_CONTROL_0,
1081                                     AR_PHY_TX_IQCAL_CONTROL_0_ENABLE_TXIQ_CAL);
1082                 else
1083                         REG_CLR_BIT(ah, AR_PHY_TX_IQCAL_CONTROL_0,
1084                                     AR_PHY_TX_IQCAL_CONTROL_0_ENABLE_TXIQ_CAL);
1085                 txiqcal_done = run_agc_cal = true;
1086         } else if (caldata && !caldata->done_txiqcal_once) {
1087                 run_agc_cal = true;
1088                 sep_iq_cal = true;
1089         }
1090
1091 skip_tx_iqcal:
1092         if (ath9k_hw_mci_is_enabled(ah) && IS_CHAN_2GHZ(chan) && run_agc_cal)
1093                 ar9003_mci_init_cal_req(ah, &is_reusable);
1094
1095         if (sep_iq_cal) {
1096                 txiqcal_done = ar9003_hw_tx_iq_cal_run(ah);
1097                 REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_DIS);
1098                 udelay(5);
1099                 REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN);
1100         }
1101
1102         if (run_agc_cal || !(ah->ah_flags & AH_FASTCC)) {
1103                 /* Calibrate the AGC */
1104                 REG_WRITE(ah, AR_PHY_AGC_CONTROL,
1105                           REG_READ(ah, AR_PHY_AGC_CONTROL) |
1106                           AR_PHY_AGC_CONTROL_CAL);
1107
1108                 /* Poll for offset calibration complete */
1109                 status = ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL,
1110                                        AR_PHY_AGC_CONTROL_CAL,
1111                                        0, AH_WAIT_TIMEOUT);
1112
1113                 ar9003_hw_do_manual_peak_cal(ah, chan);
1114         }
1115
1116         if (ath9k_hw_mci_is_enabled(ah) && IS_CHAN_2GHZ(chan) && run_agc_cal)
1117                 ar9003_mci_init_cal_done(ah);
1118
1119         if (rtt && !run_rtt_cal) {
1120                 agc_ctrl |= agc_supp_cals;
1121                 REG_WRITE(ah, AR_PHY_AGC_CONTROL, agc_ctrl);
1122         }
1123
1124         if (!status) {
1125                 if (run_rtt_cal)
1126                         ar9003_hw_rtt_disable(ah);
1127
1128                 ath_dbg(common, CALIBRATE,
1129                         "offset calibration failed to complete in %d ms; noisy environment?\n",
1130                         AH_WAIT_TIMEOUT / 1000);
1131                 return false;
1132         }
1133
1134         if (txiqcal_done)
1135                 ar9003_hw_tx_iq_cal_post_proc(ah, is_reusable);
1136         else if (caldata && caldata->done_txiqcal_once)
1137                 ar9003_hw_tx_iq_cal_reload(ah);
1138
1139         ar9003_hw_cl_cal_post_proc(ah, is_reusable);
1140
1141         if (run_rtt_cal && caldata) {
1142                 if (is_reusable) {
1143                         if (!ath9k_hw_rfbus_req(ah))
1144                                 ath_err(ath9k_hw_common(ah),
1145                                         "Could not stop baseband\n");
1146                         else
1147                                 ar9003_hw_rtt_fill_hist(ah);
1148
1149                         ath9k_hw_rfbus_done(ah);
1150                 }
1151
1152                 ar9003_hw_rtt_disable(ah);
1153         }
1154
1155         /* Revert chainmask to runtime parameters */
1156         ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask);
1157
1158         /* Initialize list pointers */
1159         ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL;
1160
1161         INIT_CAL(&ah->iq_caldata);
1162         INSERT_CAL(ah, &ah->iq_caldata);
1163         ath_dbg(common, CALIBRATE, "enabling IQ Calibration\n");
1164
1165         /* Initialize current pointer to first element in list */
1166         ah->cal_list_curr = ah->cal_list;
1167
1168         if (ah->cal_list_curr)
1169                 ath9k_hw_reset_calibration(ah, ah->cal_list_curr);
1170
1171         if (caldata)
1172                 caldata->CalValid = 0;
1173
1174         return true;
1175 }
1176
1177 void ar9003_hw_attach_calib_ops(struct ath_hw *ah)
1178 {
1179         struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
1180         struct ath_hw_ops *ops = ath9k_hw_ops(ah);
1181
1182         priv_ops->init_cal_settings = ar9003_hw_init_cal_settings;
1183         priv_ops->init_cal = ar9003_hw_init_cal;
1184         priv_ops->setup_calibration = ar9003_hw_setup_calibration;
1185
1186         ops->calibrate = ar9003_hw_calibrate;
1187 }