diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9002_calib.c | 51 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_calib.c | 36 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/calib.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/calib.h | 9 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw-ops.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.h | 4 |
6 files changed, 31 insertions, 77 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_calib.c b/drivers/net/wireless/ath/ath9k/ar9002_calib.c index f2da119bbf02..f0525fb62a2c 100644 --- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c +++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c | |||
@@ -20,6 +20,13 @@ | |||
20 | 20 | ||
21 | #define AR9285_CLCAL_REDO_THRESH 1 | 21 | #define AR9285_CLCAL_REDO_THRESH 1 |
22 | 22 | ||
23 | enum ar9002_cal_types { | ||
24 | ADC_GAIN_CAL = BIT(0), | ||
25 | ADC_DC_CAL = BIT(1), | ||
26 | IQ_MISMATCH_CAL = BIT(2), | ||
27 | }; | ||
28 | |||
29 | |||
23 | static void ar9002_hw_setup_calibration(struct ath_hw *ah, | 30 | static void ar9002_hw_setup_calibration(struct ath_hw *ah, |
24 | struct ath9k_cal_list *currCal) | 31 | struct ath9k_cal_list *currCal) |
25 | { | 32 | { |
@@ -45,8 +52,6 @@ static void ar9002_hw_setup_calibration(struct ath_hw *ah, | |||
45 | ath_print(common, ATH_DBG_CALIBRATE, | 52 | ath_print(common, ATH_DBG_CALIBRATE, |
46 | "starting ADC DC Calibration\n"); | 53 | "starting ADC DC Calibration\n"); |
47 | break; | 54 | break; |
48 | case TEMP_COMP_CAL: | ||
49 | break; /* Not supported */ | ||
50 | } | 55 | } |
51 | 56 | ||
52 | REG_SET_BIT(ah, AR_PHY_TIMING_CTRL4(0), | 57 | REG_SET_BIT(ah, AR_PHY_TIMING_CTRL4(0), |
@@ -91,25 +96,6 @@ static bool ar9002_hw_per_calibration(struct ath_hw *ah, | |||
91 | return iscaldone; | 96 | return iscaldone; |
92 | } | 97 | } |
93 | 98 | ||
94 | /* Assumes you are talking about the currently configured channel */ | ||
95 | static bool ar9002_hw_iscal_supported(struct ath_hw *ah, | ||
96 | enum ath9k_cal_types calType) | ||
97 | { | ||
98 | struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; | ||
99 | |||
100 | switch (calType & ah->supp_cals) { | ||
101 | case IQ_MISMATCH_CAL: /* Both 2 GHz and 5 GHz support OFDM */ | ||
102 | return true; | ||
103 | case ADC_GAIN_CAL: | ||
104 | case ADC_DC_CAL: | ||
105 | if (!(conf->channel->band == IEEE80211_BAND_2GHZ && | ||
106 | conf_is_ht20(conf))) | ||
107 | return true; | ||
108 | break; | ||
109 | } | ||
110 | return false; | ||
111 | } | ||
112 | |||
113 | static void ar9002_hw_iqcal_collect(struct ath_hw *ah) | 99 | static void ar9002_hw_iqcal_collect(struct ath_hw *ah) |
114 | { | 100 | { |
115 | int i; | 101 | int i; |
@@ -872,24 +858,28 @@ static bool ar9002_hw_init_cal(struct ath_hw *ah, struct ath9k_channel *chan) | |||
872 | 858 | ||
873 | /* Enable IQ, ADC Gain and ADC DC offset CALs */ | 859 | /* Enable IQ, ADC Gain and ADC DC offset CALs */ |
874 | if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah)) { | 860 | if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah)) { |
875 | if (ar9002_hw_iscal_supported(ah, ADC_GAIN_CAL)) { | 861 | ah->supp_cals = IQ_MISMATCH_CAL; |
862 | |||
863 | if (AR_SREV_9160_10_OR_LATER(ah) && | ||
864 | !(IS_CHAN_2GHZ(chan) && IS_CHAN_HT20(chan))) { | ||
865 | ah->supp_cals |= ADC_GAIN_CAL | ADC_DC_CAL; | ||
866 | |||
867 | |||
876 | INIT_CAL(&ah->adcgain_caldata); | 868 | INIT_CAL(&ah->adcgain_caldata); |
877 | INSERT_CAL(ah, &ah->adcgain_caldata); | 869 | INSERT_CAL(ah, &ah->adcgain_caldata); |
878 | ath_print(common, ATH_DBG_CALIBRATE, | 870 | ath_print(common, ATH_DBG_CALIBRATE, |
879 | "enabling ADC Gain Calibration.\n"); | 871 | "enabling ADC Gain Calibration.\n"); |
880 | } | 872 | |
881 | if (ar9002_hw_iscal_supported(ah, ADC_DC_CAL)) { | ||
882 | INIT_CAL(&ah->adcdc_caldata); | 873 | INIT_CAL(&ah->adcdc_caldata); |
883 | INSERT_CAL(ah, &ah->adcdc_caldata); | 874 | INSERT_CAL(ah, &ah->adcdc_caldata); |
884 | ath_print(common, ATH_DBG_CALIBRATE, | 875 | ath_print(common, ATH_DBG_CALIBRATE, |
885 | "enabling ADC DC Calibration.\n"); | 876 | "enabling ADC DC Calibration.\n"); |
886 | } | 877 | } |
887 | if (ar9002_hw_iscal_supported(ah, IQ_MISMATCH_CAL)) { | 878 | |
888 | INIT_CAL(&ah->iq_caldata); | 879 | INIT_CAL(&ah->iq_caldata); |
889 | INSERT_CAL(ah, &ah->iq_caldata); | 880 | INSERT_CAL(ah, &ah->iq_caldata); |
890 | ath_print(common, ATH_DBG_CALIBRATE, | 881 | ath_print(common, ATH_DBG_CALIBRATE, |
891 | "enabling IQ Calibration.\n"); | 882 | "enabling IQ Calibration.\n"); |
892 | } | ||
893 | 883 | ||
894 | ah->cal_list_curr = ah->cal_list; | 884 | ah->cal_list_curr = ah->cal_list; |
895 | 885 | ||
@@ -980,7 +970,6 @@ void ar9002_hw_attach_calib_ops(struct ath_hw *ah) | |||
980 | priv_ops->init_cal_settings = ar9002_hw_init_cal_settings; | 970 | priv_ops->init_cal_settings = ar9002_hw_init_cal_settings; |
981 | priv_ops->init_cal = ar9002_hw_init_cal; | 971 | priv_ops->init_cal = ar9002_hw_init_cal; |
982 | priv_ops->setup_calibration = ar9002_hw_setup_calibration; | 972 | priv_ops->setup_calibration = ar9002_hw_setup_calibration; |
983 | priv_ops->iscal_supported = ar9002_hw_iscal_supported; | ||
984 | 973 | ||
985 | ops->calibrate = ar9002_hw_calibrate; | 974 | ops->calibrate = ar9002_hw_calibrate; |
986 | } | 975 | } |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_calib.c b/drivers/net/wireless/ath/ath9k/ar9003_calib.c index b41f5cda824b..9e6edffe0bd1 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c | |||
@@ -18,6 +18,11 @@ | |||
18 | #include "hw-ops.h" | 18 | #include "hw-ops.h" |
19 | #include "ar9003_phy.h" | 19 | #include "ar9003_phy.h" |
20 | 20 | ||
21 | enum ar9003_cal_types { | ||
22 | IQ_MISMATCH_CAL = BIT(0), | ||
23 | TEMP_COMP_CAL = BIT(1), | ||
24 | }; | ||
25 | |||
21 | static void ar9003_hw_setup_calibration(struct ath_hw *ah, | 26 | static void ar9003_hw_setup_calibration(struct ath_hw *ah, |
22 | struct ath9k_cal_list *currCal) | 27 | struct ath9k_cal_list *currCal) |
23 | { | 28 | { |
@@ -50,10 +55,6 @@ static void ar9003_hw_setup_calibration(struct ath_hw *ah, | |||
50 | ath_print(common, ATH_DBG_CALIBRATE, | 55 | ath_print(common, ATH_DBG_CALIBRATE, |
51 | "starting Temperature Compensation Calibration\n"); | 56 | "starting Temperature Compensation Calibration\n"); |
52 | break; | 57 | break; |
53 | case ADC_GAIN_CAL: | ||
54 | case ADC_DC_CAL: | ||
55 | /* Not yet */ | ||
56 | break; | ||
57 | } | 58 | } |
58 | } | 59 | } |
59 | 60 | ||
@@ -313,27 +314,6 @@ static const struct ath9k_percal_data iq_cal_single_sample = { | |||
313 | static void ar9003_hw_init_cal_settings(struct ath_hw *ah) | 314 | static void ar9003_hw_init_cal_settings(struct ath_hw *ah) |
314 | { | 315 | { |
315 | ah->iq_caldata.calData = &iq_cal_single_sample; | 316 | ah->iq_caldata.calData = &iq_cal_single_sample; |
316 | ah->supp_cals = IQ_MISMATCH_CAL; | ||
317 | } | ||
318 | |||
319 | static bool ar9003_hw_iscal_supported(struct ath_hw *ah, | ||
320 | enum ath9k_cal_types calType) | ||
321 | { | ||
322 | switch (calType & ah->supp_cals) { | ||
323 | case IQ_MISMATCH_CAL: | ||
324 | /* | ||
325 | * XXX: Run IQ Mismatch for non-CCK only | ||
326 | * Note that CHANNEL_B is never set though. | ||
327 | */ | ||
328 | return true; | ||
329 | case ADC_GAIN_CAL: | ||
330 | case ADC_DC_CAL: | ||
331 | return false; | ||
332 | case TEMP_COMP_CAL: | ||
333 | return true; | ||
334 | } | ||
335 | |||
336 | return false; | ||
337 | } | 317 | } |
338 | 318 | ||
339 | /* | 319 | /* |
@@ -772,15 +752,16 @@ static bool ar9003_hw_init_cal(struct ath_hw *ah, | |||
772 | 752 | ||
773 | /* Initialize list pointers */ | 753 | /* Initialize list pointers */ |
774 | ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL; | 754 | ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL; |
755 | ah->supp_cals = IQ_MISMATCH_CAL; | ||
775 | 756 | ||
776 | if (ar9003_hw_iscal_supported(ah, IQ_MISMATCH_CAL)) { | 757 | if (ah->supp_cals & IQ_MISMATCH_CAL) { |
777 | INIT_CAL(&ah->iq_caldata); | 758 | INIT_CAL(&ah->iq_caldata); |
778 | INSERT_CAL(ah, &ah->iq_caldata); | 759 | INSERT_CAL(ah, &ah->iq_caldata); |
779 | ath_print(common, ATH_DBG_CALIBRATE, | 760 | ath_print(common, ATH_DBG_CALIBRATE, |
780 | "enabling IQ Calibration.\n"); | 761 | "enabling IQ Calibration.\n"); |
781 | } | 762 | } |
782 | 763 | ||
783 | if (ar9003_hw_iscal_supported(ah, TEMP_COMP_CAL)) { | 764 | if (ah->supp_cals & TEMP_COMP_CAL) { |
784 | INIT_CAL(&ah->tempCompCalData); | 765 | INIT_CAL(&ah->tempCompCalData); |
785 | INSERT_CAL(ah, &ah->tempCompCalData); | 766 | INSERT_CAL(ah, &ah->tempCompCalData); |
786 | ath_print(common, ATH_DBG_CALIBRATE, | 767 | ath_print(common, ATH_DBG_CALIBRATE, |
@@ -807,7 +788,6 @@ void ar9003_hw_attach_calib_ops(struct ath_hw *ah) | |||
807 | priv_ops->init_cal_settings = ar9003_hw_init_cal_settings; | 788 | priv_ops->init_cal_settings = ar9003_hw_init_cal_settings; |
808 | priv_ops->init_cal = ar9003_hw_init_cal; | 789 | priv_ops->init_cal = ar9003_hw_init_cal; |
809 | priv_ops->setup_calibration = ar9003_hw_setup_calibration; | 790 | priv_ops->setup_calibration = ar9003_hw_setup_calibration; |
810 | priv_ops->iscal_supported = ar9003_hw_iscal_supported; | ||
811 | 791 | ||
812 | ops->calibrate = ar9003_hw_calibrate; | 792 | ops->calibrate = ar9003_hw_calibrate; |
813 | } | 793 | } |
diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c index 6351e76792a6..6c38c72915c1 100644 --- a/drivers/net/wireless/ath/ath9k/calib.c +++ b/drivers/net/wireless/ath/ath9k/calib.c | |||
@@ -186,7 +186,7 @@ bool ath9k_hw_reset_calvalid(struct ath_hw *ah) | |||
186 | return true; | 186 | return true; |
187 | } | 187 | } |
188 | 188 | ||
189 | if (!ath9k_hw_iscal_supported(ah, currCal->calData->calType)) | 189 | if (!(ah->supp_cals & currCal->calData->calType)) |
190 | return true; | 190 | return true; |
191 | 191 | ||
192 | ath_print(common, ATH_DBG_CALIBRATE, | 192 | ath_print(common, ATH_DBG_CALIBRATE, |
diff --git a/drivers/net/wireless/ath/ath9k/calib.h b/drivers/net/wireless/ath/ath9k/calib.h index 1fa56c91a894..b8973eb8d858 100644 --- a/drivers/net/wireless/ath/ath9k/calib.h +++ b/drivers/net/wireless/ath/ath9k/calib.h | |||
@@ -58,13 +58,6 @@ struct ar5416IniArray { | |||
58 | } \ | 58 | } \ |
59 | } while (0) | 59 | } while (0) |
60 | 60 | ||
61 | enum ath9k_cal_types { | ||
62 | ADC_GAIN_CAL = 0x2, | ||
63 | ADC_DC_CAL = 0x4, | ||
64 | IQ_MISMATCH_CAL = 0x8, | ||
65 | TEMP_COMP_CAL = 0x10, | ||
66 | }; | ||
67 | |||
68 | enum ath9k_cal_state { | 61 | enum ath9k_cal_state { |
69 | CAL_INACTIVE, | 62 | CAL_INACTIVE, |
70 | CAL_WAITING, | 63 | CAL_WAITING, |
@@ -79,7 +72,7 @@ enum ath9k_cal_state { | |||
79 | #define PER_MAX_LOG_COUNT 10 | 72 | #define PER_MAX_LOG_COUNT 10 |
80 | 73 | ||
81 | struct ath9k_percal_data { | 74 | struct ath9k_percal_data { |
82 | enum ath9k_cal_types calType; | 75 | u32 calType; |
83 | u32 calNumSamples; | 76 | u32 calNumSamples; |
84 | u32 calCountMax; | 77 | u32 calCountMax; |
85 | void (*calCollect) (struct ath_hw *); | 78 | void (*calCollect) (struct ath_hw *); |
diff --git a/drivers/net/wireless/ath/ath9k/hw-ops.h b/drivers/net/wireless/ath/ath9k/hw-ops.h index ffecbadaea4a..9c4dd0ec9a15 100644 --- a/drivers/net/wireless/ath/ath9k/hw-ops.h +++ b/drivers/net/wireless/ath/ath9k/hw-ops.h | |||
@@ -276,12 +276,6 @@ static inline void ath9k_hw_setup_calibration(struct ath_hw *ah, | |||
276 | ath9k_hw_private_ops(ah)->setup_calibration(ah, currCal); | 276 | ath9k_hw_private_ops(ah)->setup_calibration(ah, currCal); |
277 | } | 277 | } |
278 | 278 | ||
279 | static inline bool ath9k_hw_iscal_supported(struct ath_hw *ah, | ||
280 | enum ath9k_cal_types calType) | ||
281 | { | ||
282 | return ath9k_hw_private_ops(ah)->iscal_supported(ah, calType); | ||
283 | } | ||
284 | |||
285 | static inline void ath9k_ani_reset(struct ath_hw *ah, bool is_scanning) | 279 | static inline void ath9k_ani_reset(struct ath_hw *ah, bool is_scanning) |
286 | { | 280 | { |
287 | ath9k_hw_private_ops(ah)->ani_reset(ah, is_scanning); | 281 | ath9k_hw_private_ops(ah)->ani_reset(ah, is_scanning); |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index 235cb5357a22..246c707cea00 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
@@ -535,8 +535,6 @@ struct ath_hw_private_ops { | |||
535 | bool (*macversion_supported)(u32 macversion); | 535 | bool (*macversion_supported)(u32 macversion); |
536 | void (*setup_calibration)(struct ath_hw *ah, | 536 | void (*setup_calibration)(struct ath_hw *ah, |
537 | struct ath9k_cal_list *currCal); | 537 | struct ath9k_cal_list *currCal); |
538 | bool (*iscal_supported)(struct ath_hw *ah, | ||
539 | enum ath9k_cal_types calType); | ||
540 | 538 | ||
541 | /* PHY ops */ | 539 | /* PHY ops */ |
542 | int (*rf_set_freq)(struct ath_hw *ah, | 540 | int (*rf_set_freq)(struct ath_hw *ah, |
@@ -689,7 +687,7 @@ struct ath_hw { | |||
689 | u32 atim_window; | 687 | u32 atim_window; |
690 | 688 | ||
691 | /* Calibration */ | 689 | /* Calibration */ |
692 | enum ath9k_cal_types supp_cals; | 690 | u32 supp_cals; |
693 | struct ath9k_cal_list iq_caldata; | 691 | struct ath9k_cal_list iq_caldata; |
694 | struct ath9k_cal_list adcgain_caldata; | 692 | struct ath9k_cal_list adcgain_caldata; |
695 | struct ath9k_cal_list adcdc_caldata; | 693 | struct ath9k_cal_list adcdc_caldata; |