Commit e948b99d authored by Rajkumar Manoharan's avatar Rajkumar Manoharan Committed by John W. Linville

ath9k_hw: Fix magnitude/phase average in TxIQ Calibration

The commit "ath9k_hw: Fix Tx IQ Calibration hang issue in
AR9003 chips" did not consider more than one potential sample
while calculating magnitude/phase average if more than one
sample has the same value which could affect post-processing
of outlier detection that causes an undesirable Tx IQ
correction value will be assigned to tx gain settings where
outlier happens.

Cc: Kai Shi <kaishi@qca.qualcomm.com>
Reported-by: default avatarPaul Stewart <pstew@google.com>
Signed-off-by: default avatarRajkumar Manoharan <rmanohar@qca.qualcomm.com>
Signed-off-by: default avatarPaul Stewart <pstew@google.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 6bc05a95
...@@ -615,11 +615,10 @@ static void ar9003_hw_detect_outlier(int *mp_coeff, int nmeasurement, ...@@ -615,11 +615,10 @@ static void ar9003_hw_detect_outlier(int *mp_coeff, int nmeasurement,
{ {
int mp_max = -64, max_idx = 0; int mp_max = -64, max_idx = 0;
int mp_min = 63, min_idx = 0; int mp_min = 63, min_idx = 0;
int mp_avg = 0, i, outlier_idx = 0; int mp_avg = 0, i, outlier_idx = 0, mp_count = 0;
/* find min/max mismatch across all calibrated gains */ /* find min/max mismatch across all calibrated gains */
for (i = 0; i < nmeasurement; i++) { for (i = 0; i < nmeasurement; i++) {
mp_avg += mp_coeff[i];
if (mp_coeff[i] > mp_max) { if (mp_coeff[i] > mp_max) {
mp_max = mp_coeff[i]; mp_max = mp_coeff[i];
max_idx = i; max_idx = i;
...@@ -632,10 +631,20 @@ static void ar9003_hw_detect_outlier(int *mp_coeff, int nmeasurement, ...@@ -632,10 +631,20 @@ static void ar9003_hw_detect_outlier(int *mp_coeff, int nmeasurement,
/* find average (exclude max abs value) */ /* find average (exclude max abs value) */
for (i = 0; i < nmeasurement; i++) { for (i = 0; i < nmeasurement; i++) {
if ((abs(mp_coeff[i]) < abs(mp_max)) || if ((abs(mp_coeff[i]) < abs(mp_max)) ||
(abs(mp_coeff[i]) < abs(mp_min))) (abs(mp_coeff[i]) < abs(mp_min))) {
mp_avg += mp_coeff[i]; mp_avg += mp_coeff[i];
mp_count++;
}
} }
mp_avg /= (nmeasurement - 1);
/*
* finding mean magnitude/phase if possible, otherwise
* just use the last value as the mean
*/
if (mp_count)
mp_avg /= mp_count;
else
mp_avg = mp_coeff[nmeasurement - 1];
/* detect outlier */ /* detect outlier */
if (abs(mp_max - mp_min) > max_delta) { if (abs(mp_max - mp_min) > max_delta) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment