hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/net/wireless/ath/ath9k/ar9002_calib.c
....@@ -19,6 +19,8 @@
1919 #include "ar9002_phy.h"
2020
2121 #define AR9285_CLCAL_REDO_THRESH 1
22
+/* AGC & I/Q calibrations time limit, ms */
23
+#define AR9002_CAL_MAX_TIME 30000
2224
2325 enum ar9002_cal_types {
2426 ADC_GAIN_CAL = BIT(0),
....@@ -37,9 +39,8 @@
3739 break;
3840 case ADC_GAIN_CAL:
3941 case ADC_DC_CAL:
40
- /* Run ADC Gain Cal for non-CCK & non 2GHz-HT20 only */
41
- if (!((IS_CHAN_2GHZ(chan) || IS_CHAN_A_FAST_CLOCK(ah, chan)) &&
42
- IS_CHAN_HT20(chan)))
42
+ /* Run even/odd ADCs calibrations for HT40 channels only */
43
+ if (IS_CHAN_HT40(chan))
4344 supported = true;
4445 break;
4546 }
....@@ -105,6 +106,14 @@
105106 } else {
106107 ar9002_hw_setup_calibration(ah, currCal);
107108 }
109
+ } else if (time_after(jiffies, ah->cal_start_time +
110
+ msecs_to_jiffies(AR9002_CAL_MAX_TIME))) {
111
+ REG_CLR_BIT(ah, AR_PHY_TIMING_CTRL4(0),
112
+ AR_PHY_TIMING_CTRL4_DO_CAL);
113
+ ath_dbg(ath9k_hw_common(ah), CALIBRATE,
114
+ "calibration timeout\n");
115
+ currCal->calState = CAL_WAITING; /* Try later */
116
+ iscaldone = true;
108117 }
109118 } else if (!(caldata->CalValid & currCal->calData->calType)) {
110119 ath9k_hw_reset_calibration(ah, currCal);
....@@ -664,8 +673,13 @@
664673 int ret;
665674
666675 nfcal = !!(REG_READ(ah, AR_PHY_AGC_CONTROL) & AR_PHY_AGC_CONTROL_NF);
667
- if (ah->caldata)
676
+ if (ah->caldata) {
668677 nfcal_pending = test_bit(NFCAL_PENDING, &ah->caldata->cal_flags);
678
+ if (longcal) /* Remember to not miss */
679
+ set_bit(LONGCAL_PENDING, &ah->caldata->cal_flags);
680
+ else if (test_bit(LONGCAL_PENDING, &ah->caldata->cal_flags))
681
+ longcal = true; /* Respin a previous one */
682
+ }
669683
670684 percal_pending = (currCal &&
671685 (currCal->calState == CAL_RUNNING ||
....@@ -675,9 +689,24 @@
675689 if (!ar9002_hw_per_calibration(ah, chan, rxchainmask, currCal))
676690 return 0;
677691
678
- ah->cal_list_curr = currCal = currCal->calNext;
679
- if (currCal->calState == CAL_WAITING)
680
- ath9k_hw_reset_calibration(ah, currCal);
692
+ /* Looking for next waiting calibration if any */
693
+ for (currCal = currCal->calNext; currCal != ah->cal_list_curr;
694
+ currCal = currCal->calNext) {
695
+ if (currCal->calState == CAL_WAITING)
696
+ break;
697
+ }
698
+ if (currCal->calState == CAL_WAITING) {
699
+ percal_pending = true;
700
+ ah->cal_list_curr = currCal;
701
+ } else {
702
+ percal_pending = false;
703
+ ah->cal_list_curr = ah->cal_list;
704
+ }
705
+ }
706
+
707
+ /* Do not start a next calibration if the longcal is in action */
708
+ if (percal_pending && !nfcal && !longcal) {
709
+ ath9k_hw_reset_calibration(ah, currCal);
681710
682711 return 0;
683712 }
....@@ -701,6 +730,9 @@
701730 }
702731
703732 if (longcal) {
733
+ if (ah->caldata)
734
+ clear_bit(LONGCAL_PENDING,
735
+ &ah->caldata->cal_flags);
704736 ath9k_hw_start_nfcal(ah, false);
705737 /* Do periodic PAOffset Cal */
706738 ar9002_hw_pa_cal(ah, false);
....@@ -857,9 +889,6 @@
857889 ar9002_hw_pa_cal(ah, true);
858890 ath9k_hw_loadnf(ah, chan);
859891 ath9k_hw_start_nfcal(ah, true);
860
-
861
- if (ah->caldata)
862
- set_bit(NFCAL_PENDING, &ah->caldata->cal_flags);
863892
864893 ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL;
865894