diff options
Diffstat (limited to 'package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch')
-rw-r--r-- | package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch b/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch new file mode 100644 index 0000000..cff32ad --- /dev/null +++ b/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch @@ -0,0 +1,97 @@ +From: Felix Fietkau <nbd@nbd.name> +Date: Mon, 11 Jul 2016 11:35:55 +0200 +Subject: [PATCH] ath9k_hw: implement temperature compensation support for + AR9003+ + +Signed-off-by: Felix Fietkau <nbd@nbd.name> +--- + +--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c ++++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c +@@ -33,6 +33,7 @@ struct coeff { + + enum ar9003_cal_types { + IQ_MISMATCH_CAL = BIT(0), ++ TEMP_COMP_CAL = BIT(1), + }; + + static void ar9003_hw_setup_calibration(struct ath_hw *ah, +@@ -58,6 +59,12 @@ static void ar9003_hw_setup_calibration( + /* Kick-off cal */ + REG_SET_BIT(ah, AR_PHY_TIMING4, AR_PHY_TIMING4_DO_CAL); + break; ++ case TEMP_COMP_CAL: ++ ath_dbg(common, CALIBRATE, ++ "starting Temperature Compensation Calibration\n"); ++ REG_SET_BIT(ah, AR_CH0_THERM, AR_CH0_THERM_LOCAL); ++ REG_SET_BIT(ah, AR_CH0_THERM, AR_CH0_THERM_START); ++ break; + default: + ath_err(common, "Invalid calibration type\n"); + break; +@@ -86,7 +93,8 @@ static bool ar9003_hw_per_calibration(st + /* + * Accumulate cal measures for active chains + */ +- cur_caldata->calCollect(ah); ++ if (cur_caldata->calCollect) ++ cur_caldata->calCollect(ah); + ah->cal_samples++; + + if (ah->cal_samples >= cur_caldata->calNumSamples) { +@@ -99,7 +107,8 @@ static bool ar9003_hw_per_calibration(st + /* + * Process accumulated data + */ +- cur_caldata->calPostProc(ah, numChains); ++ if (cur_caldata->calPostProc) ++ cur_caldata->calPostProc(ah, numChains); + + /* Calibration has finished. */ + caldata->CalValid |= cur_caldata->calType; +@@ -314,9 +323,16 @@ static const struct ath9k_percal_data iq + ar9003_hw_iqcalibrate + }; + ++static const struct ath9k_percal_data temp_cal_single_sample = { ++ TEMP_COMP_CAL, ++ MIN_CAL_SAMPLES, ++ PER_MAX_LOG_COUNT, ++}; ++ + static void ar9003_hw_init_cal_settings(struct ath_hw *ah) + { + ah->iq_caldata.calData = &iq_cal_single_sample; ++ ah->temp_caldata.calData = &temp_cal_single_sample; + + if (AR_SREV_9300_20_OR_LATER(ah)) { + ah->enabled_cals |= TX_IQ_CAL; +@@ -324,7 +340,7 @@ static void ar9003_hw_init_cal_settings( + ah->enabled_cals |= TX_IQ_ON_AGC_CAL; + } + +- ah->supp_cals = IQ_MISMATCH_CAL; ++ ah->supp_cals = IQ_MISMATCH_CAL | TEMP_COMP_CAL; + } + + #define OFF_UPPER_LT 24 +@@ -1383,6 +1399,9 @@ static void ar9003_hw_init_cal_common(st + INIT_CAL(&ah->iq_caldata); + INSERT_CAL(ah, &ah->iq_caldata); + ++ INIT_CAL(&ah->temp_caldata); ++ INSERT_CAL(ah, &ah->temp_caldata); ++ + /* Initialize current pointer to first element in list */ + ah->cal_list_curr = ah->cal_list; + +--- a/drivers/net/wireless/ath/ath9k/hw.h ++++ b/drivers/net/wireless/ath/ath9k/hw.h +@@ -830,6 +830,7 @@ struct ath_hw { + /* Calibration */ + u32 supp_cals; + struct ath9k_cal_list iq_caldata; ++ struct ath9k_cal_list temp_caldata; + struct ath9k_cal_list adcgain_caldata; + struct ath9k_cal_list adcdc_caldata; + struct ath9k_cal_list *cal_list; |