ath9k: add a few calibration related fixes

Signed-off-by: Felix Fietkau <nbd@openwrt.org>

SVN-Revision: 43058
This commit is contained in:
Felix Fietkau 2014-10-25 14:45:22 +00:00
parent a0d9489e84
commit 78bd998e49
3 changed files with 22 additions and 10 deletions

View File

@ -164,7 +164,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
void (*set_txdesc)(struct ath_hw *ah, void *ds, void (*set_txdesc)(struct ath_hw *ah, void *ds,
--- a/drivers/net/wireless/ath/ath9k/link.c --- a/drivers/net/wireless/ath/ath9k/link.c
+++ b/drivers/net/wireless/ath/ath9k/link.c +++ b/drivers/net/wireless/ath/ath9k/link.c
@@ -371,9 +371,14 @@ void ath_ani_calibrate(unsigned long dat @@ -371,9 +371,15 @@ void ath_ani_calibrate(unsigned long dat
/* Perform calibration if necessary */ /* Perform calibration if necessary */
if (longcal || shortcal) { if (longcal || shortcal) {
@ -174,6 +174,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+ int ret = ath9k_hw_calibrate(ah, ah->curchan, ah->rxchainmask, + int ret = ath9k_hw_calibrate(ah, ah->curchan, ah->rxchainmask,
+ longcal); + longcal);
+ if (ret < 0) { + if (ret < 0) {
+ common->ani.caldone = 0;
+ ath9k_queue_reset(sc, RESET_TYPE_CALIBRATION); + ath9k_queue_reset(sc, RESET_TYPE_CALIBRATION);
+ return; + return;
+ } + }

View File

@ -11,18 +11,23 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c --- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
+++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c +++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
@@ -660,7 +660,6 @@ static void ar9002_hw_olc_temp_compensat @@ -660,27 +660,26 @@ static void ar9002_hw_olc_temp_compensat
static int ar9002_hw_calibrate(struct ath_hw *ah, struct ath9k_channel *chan, static int ar9002_hw_calibrate(struct ath_hw *ah, struct ath9k_channel *chan,
u8 rxchainmask, bool longcal) u8 rxchainmask, bool longcal)
{ {
- bool iscaldone = true; - bool iscaldone = true;
struct ath9k_cal_list *currCal = ah->cal_list_curr; struct ath9k_cal_list *currCal = ah->cal_list_curr;
bool nfcal, nfcal_pending = false; - bool nfcal, nfcal_pending = false;
+ bool nfcal, nfcal_pending = false, percal_pending;
int ret; int ret;
@@ -672,15 +671,13 @@ static int ar9002_hw_calibrate(struct at
if (currCal && !nfcal && nfcal = !!(REG_READ(ah, AR_PHY_AGC_CONTROL) & AR_PHY_AGC_CONTROL_NF);
(currCal->calState == CAL_RUNNING || if (ah->caldata)
currCal->calState == CAL_WAITING)) { nfcal_pending = test_bit(NFCAL_PENDING, &ah->caldata->cal_flags);
- if (currCal && !nfcal &&
- (currCal->calState == CAL_RUNNING ||
- currCal->calState == CAL_WAITING)) {
- iscaldone = ar9002_hw_per_calibration(ah, chan, - iscaldone = ar9002_hw_per_calibration(ah, chan,
- rxchainmask, currCal); - rxchainmask, currCal);
- if (iscaldone) { - if (iscaldone) {
@ -32,6 +37,11 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
- iscaldone = false; - iscaldone = false;
- ath9k_hw_reset_calibration(ah, currCal); - ath9k_hw_reset_calibration(ah, currCal);
- } - }
+ percal_pending = (currCal &&
+ (currCal->calState == CAL_RUNNING ||
+ currCal->calState == CAL_WAITING));
+
+ if (percal_pending && !nfcal) {
+ if (!ar9002_hw_per_calibration(ah, chan, rxchainmask, currCal)) + if (!ar9002_hw_per_calibration(ah, chan, rxchainmask, currCal))
+ return 0; + return 0;
+ +
@ -42,12 +52,12 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
} }
} }
@@ -710,7 +707,7 @@ static int ar9002_hw_calibrate(struct at @@ -710,7 +709,7 @@ static int ar9002_hw_calibrate(struct at
} }
} }
- return iscaldone; - return iscaldone;
+ return 1; + return !percal_pending;
} }
/* Carrier leakage Calibration fix */ /* Carrier leakage Calibration fix */

View File

@ -10,10 +10,11 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
--- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c --- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
+++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c +++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
@@ -854,6 +854,7 @@ static bool ar9002_hw_init_cal(struct at @@ -856,6 +856,8 @@ static bool ar9002_hw_init_cal(struct at
/* Do PA Calibration */ /* Do PA Calibration */
ar9002_hw_pa_cal(ah, true); ar9002_hw_pa_cal(ah, true);
+ ath9k_hw_loadnf(ah, chan);
+ ath9k_hw_start_nfcal(ah, true); + ath9k_hw_start_nfcal(ah, true);
if (ah->caldata) if (ah->caldata)