|
@@ -687,8 +687,13 @@ static bool ar9002_hw_calibrate(struct ath_hw *ah,
|
|
|
{
|
|
|
bool iscaldone = true;
|
|
|
struct ath9k_cal_list *currCal = ah->cal_list_curr;
|
|
|
+ bool nfcal, nfcal_pending = false;
|
|
|
|
|
|
- if (currCal &&
|
|
|
+ nfcal = !!(REG_READ(ah, AR_PHY_AGC_CONTROL) & AR_PHY_AGC_CONTROL_NF);
|
|
|
+ if (ah->caldata)
|
|
|
+ nfcal_pending = ah->caldata->nfcal_pending;
|
|
|
+
|
|
|
+ if (currCal && !nfcal &&
|
|
|
(currCal->calState == CAL_RUNNING ||
|
|
|
currCal->calState == CAL_WAITING)) {
|
|
|
iscaldone = ar9002_hw_per_calibration(ah, chan,
|
|
@@ -704,7 +709,7 @@ static bool ar9002_hw_calibrate(struct ath_hw *ah,
|
|
|
}
|
|
|
|
|
|
/* Do NF cal only at longer intervals */
|
|
|
- if (longcal) {
|
|
|
+ if (longcal || nfcal_pending) {
|
|
|
/* Do periodic PAOffset Cal */
|
|
|
ar9002_hw_pa_cal(ah, false);
|
|
|
ar9002_hw_olc_temp_compensation(ah);
|
|
@@ -713,16 +718,18 @@ static bool ar9002_hw_calibrate(struct ath_hw *ah,
|
|
|
* Get the value from the previous NF cal and update
|
|
|
* history buffer.
|
|
|
*/
|
|
|
- ath9k_hw_getnf(ah, chan);
|
|
|
-
|
|
|
- /*
|
|
|
- * Load the NF from history buffer of the current channel.
|
|
|
- * NF is slow time-variant, so it is OK to use a historical
|
|
|
- * value.
|
|
|
- */
|
|
|
- ath9k_hw_loadnf(ah, ah->curchan);
|
|
|
+ if (ath9k_hw_getnf(ah, chan)) {
|
|
|
+ /*
|
|
|
+ * Load the NF from history buffer of the current
|
|
|
+ * channel.
|
|
|
+ * NF is slow time-variant, so it is OK to use a
|
|
|
+ * historical value.
|
|
|
+ */
|
|
|
+ ath9k_hw_loadnf(ah, ah->curchan);
|
|
|
+ }
|
|
|
|
|
|
- ath9k_hw_start_nfcal(ah, false);
|
|
|
+ if (longcal)
|
|
|
+ ath9k_hw_start_nfcal(ah, false);
|
|
|
}
|
|
|
|
|
|
return iscaldone;
|
|
@@ -872,6 +879,9 @@ static bool ar9002_hw_init_cal(struct ath_hw *ah, struct ath9k_channel *chan)
|
|
|
/* Do NF Calibration after DC offset and other calibrations */
|
|
|
ath9k_hw_start_nfcal(ah, true);
|
|
|
|
|
|
+ if (ah->caldata)
|
|
|
+ ah->caldata->nfcal_pending = true;
|
|
|
+
|
|
|
ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL;
|
|
|
|
|
|
/* Enable IQ, ADC Gain and ADC DC offset CALs */
|