aboutsummaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/531-ath9k_cal_cleanup.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/531-ath9k_cal_cleanup.patch')
-rw-r--r--package/mac80211/patches/531-ath9k_cal_cleanup.patch248
1 files changed, 248 insertions, 0 deletions
diff --git a/package/mac80211/patches/531-ath9k_cal_cleanup.patch b/package/mac80211/patches/531-ath9k_cal_cleanup.patch
new file mode 100644
index 0000000000..3a14d52894
--- /dev/null
+++ b/package/mac80211/patches/531-ath9k_cal_cleanup.patch
@@ -0,0 +1,248 @@
+--- 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 {
+ bool (*macversion_supported)(u32 macversion);
+ void (*setup_calibration)(struct ath_hw *ah,
+ struct ath9k_cal_list *currCal);
+- bool (*iscal_supported)(struct ath_hw *ah,
+- enum ath9k_cal_types calType);
+
+ /* PHY ops */
+ int (*rf_set_freq)(struct ath_hw *ah,
+@@ -689,7 +687,7 @@ struct ath_hw {
+ u32 atim_window;
+
+ /* Calibration */
+- enum ath9k_cal_types supp_cals;
++ u32 supp_cals;
+ struct ath9k_cal_list iq_caldata;
+ struct ath9k_cal_list adcgain_caldata;
+ struct ath9k_cal_list adcdc_caldata;
+--- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
++++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
+@@ -20,6 +20,13 @@
+
+ #define AR9285_CLCAL_REDO_THRESH 1
+
++enum ar9002_cal_types {
++ ADC_GAIN_CAL = BIT(0),
++ ADC_DC_CAL = BIT(1),
++ IQ_MISMATCH_CAL = BIT(2),
++};
++
++
+ static void ar9002_hw_setup_calibration(struct ath_hw *ah,
+ struct ath9k_cal_list *currCal)
+ {
+@@ -45,8 +52,6 @@ static void ar9002_hw_setup_calibration(
+ ath_print(common, ATH_DBG_CALIBRATE,
+ "starting ADC DC Calibration\n");
+ break;
+- case TEMP_COMP_CAL:
+- break; /* Not supported */
+ }
+
+ REG_SET_BIT(ah, AR_PHY_TIMING_CTRL4(0),
+@@ -91,25 +96,6 @@ static bool ar9002_hw_per_calibration(st
+ return iscaldone;
+ }
+
+-/* Assumes you are talking about the currently configured channel */
+-static bool ar9002_hw_iscal_supported(struct ath_hw *ah,
+- enum ath9k_cal_types calType)
+-{
+- struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
+-
+- switch (calType & ah->supp_cals) {
+- case IQ_MISMATCH_CAL: /* Both 2 GHz and 5 GHz support OFDM */
+- return true;
+- case ADC_GAIN_CAL:
+- case ADC_DC_CAL:
+- if (!(conf->channel->band == IEEE80211_BAND_2GHZ &&
+- conf_is_ht20(conf)))
+- return true;
+- break;
+- }
+- return false;
+-}
+-
+ static void ar9002_hw_iqcal_collect(struct ath_hw *ah)
+ {
+ int i;
+@@ -872,24 +858,28 @@ static bool ar9002_hw_init_cal(struct at
+
+ /* Enable IQ, ADC Gain and ADC DC offset CALs */
+ if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah)) {
+- if (ar9002_hw_iscal_supported(ah, ADC_GAIN_CAL)) {
++ ah->supp_cals = IQ_MISMATCH_CAL;
++
++ if (AR_SREV_9160_10_OR_LATER(ah) &&
++ !(IS_CHAN_2GHZ(chan) && IS_CHAN_HT20(chan))) {
++ ah->supp_cals |= ADC_GAIN_CAL | ADC_DC_CAL;
++
++
+ INIT_CAL(&ah->adcgain_caldata);
+ INSERT_CAL(ah, &ah->adcgain_caldata);
+ ath_print(common, ATH_DBG_CALIBRATE,
+ "enabling ADC Gain Calibration.\n");
+- }
+- if (ar9002_hw_iscal_supported(ah, ADC_DC_CAL)) {
++
+ INIT_CAL(&ah->adcdc_caldata);
+ INSERT_CAL(ah, &ah->adcdc_caldata);
+ ath_print(common, ATH_DBG_CALIBRATE,
+ "enabling ADC DC Calibration.\n");
+ }
+- if (ar9002_hw_iscal_supported(ah, IQ_MISMATCH_CAL)) {
+- INIT_CAL(&ah->iq_caldata);
+- INSERT_CAL(ah, &ah->iq_caldata);
+- ath_print(common, ATH_DBG_CALIBRATE,
+- "enabling IQ Calibration.\n");
+- }
++
++ INIT_CAL(&ah->iq_caldata);
++ INSERT_CAL(ah, &ah->iq_caldata);
++ ath_print(common, ATH_DBG_CALIBRATE,
++ "enabling IQ Calibration.\n");
+
+ ah->cal_list_curr = ah->cal_list;
+
+@@ -980,7 +970,6 @@ void ar9002_hw_attach_calib_ops(struct a
+ priv_ops->init_cal_settings = ar9002_hw_init_cal_settings;
+ priv_ops->init_cal = ar9002_hw_init_cal;
+ priv_ops->setup_calibration = ar9002_hw_setup_calibration;
+- priv_ops->iscal_supported = ar9002_hw_iscal_supported;
+
+ ops->calibrate = ar9002_hw_calibrate;
+ }
+--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
++++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
+@@ -18,6 +18,11 @@
+ #include "hw-ops.h"
+ #include "ar9003_phy.h"
+
++enum ar9003_cal_types {
++ IQ_MISMATCH_CAL = BIT(0),
++ TEMP_COMP_CAL = BIT(1),
++};
++
+ static void ar9003_hw_setup_calibration(struct ath_hw *ah,
+ struct ath9k_cal_list *currCal)
+ {
+@@ -50,10 +55,6 @@ static void ar9003_hw_setup_calibration(
+ ath_print(common, ATH_DBG_CALIBRATE,
+ "starting Temperature Compensation Calibration\n");
+ break;
+- case ADC_GAIN_CAL:
+- case ADC_DC_CAL:
+- /* Not yet */
+- break;
+ }
+ }
+
+@@ -313,27 +314,6 @@ static const struct ath9k_percal_data iq
+ static void ar9003_hw_init_cal_settings(struct ath_hw *ah)
+ {
+ ah->iq_caldata.calData = &iq_cal_single_sample;
+- ah->supp_cals = IQ_MISMATCH_CAL;
+-}
+-
+-static bool ar9003_hw_iscal_supported(struct ath_hw *ah,
+- enum ath9k_cal_types calType)
+-{
+- switch (calType & ah->supp_cals) {
+- case IQ_MISMATCH_CAL:
+- /*
+- * XXX: Run IQ Mismatch for non-CCK only
+- * Note that CHANNEL_B is never set though.
+- */
+- return true;
+- case ADC_GAIN_CAL:
+- case ADC_DC_CAL:
+- return false;
+- case TEMP_COMP_CAL:
+- return true;
+- }
+-
+- return false;
+ }
+
+ /*
+@@ -772,15 +752,16 @@ static bool ar9003_hw_init_cal(struct at
+
+ /* Initialize list pointers */
+ ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL;
++ ah->supp_cals = IQ_MISMATCH_CAL;
+
+- if (ar9003_hw_iscal_supported(ah, IQ_MISMATCH_CAL)) {
++ if (ah->supp_cals & IQ_MISMATCH_CAL) {
+ INIT_CAL(&ah->iq_caldata);
+ INSERT_CAL(ah, &ah->iq_caldata);
+ ath_print(common, ATH_DBG_CALIBRATE,
+ "enabling IQ Calibration.\n");
+ }
+
+- if (ar9003_hw_iscal_supported(ah, TEMP_COMP_CAL)) {
++ if (ah->supp_cals & TEMP_COMP_CAL) {
+ INIT_CAL(&ah->tempCompCalData);
+ INSERT_CAL(ah, &ah->tempCompCalData);
+ ath_print(common, ATH_DBG_CALIBRATE,
+@@ -807,7 +788,6 @@ void ar9003_hw_attach_calib_ops(struct a
+ priv_ops->init_cal_settings = ar9003_hw_init_cal_settings;
+ priv_ops->init_cal = ar9003_hw_init_cal;
+ priv_ops->setup_calibration = ar9003_hw_setup_calibration;
+- priv_ops->iscal_supported = ar9003_hw_iscal_supported;
+
+ ops->calibrate = ar9003_hw_calibrate;
+ }
+--- a/drivers/net/wireless/ath/ath9k/calib.h
++++ b/drivers/net/wireless/ath/ath9k/calib.h
+@@ -58,13 +58,6 @@ struct ar5416IniArray {
+ } \
+ } while (0)
+
+-enum ath9k_cal_types {
+- ADC_GAIN_CAL = 0x2,
+- ADC_DC_CAL = 0x4,
+- IQ_MISMATCH_CAL = 0x8,
+- TEMP_COMP_CAL = 0x10,
+-};
+-
+ enum ath9k_cal_state {
+ CAL_INACTIVE,
+ CAL_WAITING,
+@@ -79,7 +72,7 @@ enum ath9k_cal_state {
+ #define PER_MAX_LOG_COUNT 10
+
+ struct ath9k_percal_data {
+- enum ath9k_cal_types calType;
++ u32 calType;
+ u32 calNumSamples;
+ u32 calCountMax;
+ void (*calCollect) (struct ath_hw *);
+--- 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_calibr
+ ath9k_hw_private_ops(ah)->setup_calibration(ah, currCal);
+ }
+
+-static inline bool ath9k_hw_iscal_supported(struct ath_hw *ah,
+- enum ath9k_cal_types calType)
+-{
+- return ath9k_hw_private_ops(ah)->iscal_supported(ah, calType);
+-}
+-
+ static inline void ath9k_ani_reset(struct ath_hw *ah, bool is_scanning)
+ {
+ ath9k_hw_private_ops(ah)->ani_reset(ah, is_scanning);
+--- 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_
+ return true;
+ }
+
+- if (!ath9k_hw_iscal_supported(ah, currCal->calData->calType))
++ if (!(ah->supp_cals & currCal->calData->calType))
+ return true;
+
+ ath_print(common, ATH_DBG_CALIBRATE,