Search Linux Wireless

Re: [PATCH v2] ath9k_hw: Fix magnitude/phase average in TxIQ Calibration

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Sep 6, 2011 at 9:29 AM, Rajkumar Manoharan
<rmanohar@xxxxxxxxxxxxxxxx> wrote:
> 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@xxxxxxxxxxxxxxxx>
> Reported-by: Paul Stewart <pstew@xxxxxxxxxx>
> Signed-off-by: Rajkumar Manoharan <rmanohar@xxxxxxxxxxxxxxxx>

Signed-off-by: Paul Stewart <pstew@xxxxxxxxxx>
> ---
>  drivers/net/wireless/ath/ath9k/ar9003_calib.c |   17 +++++++++++++----
>  1 files changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath9k/ar9003_calib.c b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
> index ee3a8a2..695d9d3 100644
> --- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
> +++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
> @@ -615,11 +615,10 @@ static void ar9003_hw_detect_outlier(int *mp_coeff, int nmeasurement,
>  {
>        int mp_max = -64, max_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 */
>        for (i = 0; i < nmeasurement; i++) {
> -               mp_avg += mp_coeff[i];
>                if (mp_coeff[i] > mp_max) {
>                        mp_max = mp_coeff[i];
>                        max_idx = i;
> @@ -632,10 +631,20 @@ static void ar9003_hw_detect_outlier(int *mp_coeff, int nmeasurement,
>        /* find average (exclude max abs value) */
>        for (i = 0; i < nmeasurement; i++) {
>                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_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 */
>        if (abs(mp_max - mp_min) > max_delta) {
> --
> 1.7.6.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux