xref: /freebsd/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_paprd.c (revision d1d015864103b253b3fcb2f72a0da5b0cfeb31b6)
176bd547bSAdrian Chadd /*
276bd547bSAdrian Chadd  * Copyright (c) 2013 Qualcomm Atheros, Inc.
376bd547bSAdrian Chadd  *
476bd547bSAdrian Chadd  * Permission to use, copy, modify, and/or distribute this software for any
576bd547bSAdrian Chadd  * purpose with or without fee is hereby granted, provided that the above
676bd547bSAdrian Chadd  * copyright notice and this permission notice appear in all copies.
776bd547bSAdrian Chadd  *
876bd547bSAdrian Chadd  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
976bd547bSAdrian Chadd  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
1076bd547bSAdrian Chadd  * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
1176bd547bSAdrian Chadd  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
1276bd547bSAdrian Chadd  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
1376bd547bSAdrian Chadd  * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1476bd547bSAdrian Chadd  * PERFORMANCE OF THIS SOFTWARE.
1576bd547bSAdrian Chadd  */
1676bd547bSAdrian Chadd 
1776bd547bSAdrian Chadd #include "opt_ah.h"
1876bd547bSAdrian Chadd #include "ah.h"
1976bd547bSAdrian Chadd #include "ar9300.h"
2076bd547bSAdrian Chadd #include "ah_internal.h"
2176bd547bSAdrian Chadd #include "ar9300paprd.h"
2276bd547bSAdrian Chadd #include "ar9300reg.h"
2376bd547bSAdrian Chadd 
2476bd547bSAdrian Chadd 
2576bd547bSAdrian Chadd #if ATH_SUPPORT_PAPRD
2676bd547bSAdrian Chadd 
2776bd547bSAdrian Chadd static struct ar9300_paprd_pwr_adjust ar9300_paprd_pwr_adj_array[] = {
2876bd547bSAdrian Chadd /*   rate index     ,   register offset   ,  mask of register               , */
2976bd547bSAdrian Chadd   {ALL_TARGET_HT20_5, AR_PHY_POWERTX_RATE5, AR_PHY_POWERTX_RATE5_POWERTXHT20_3,
3076bd547bSAdrian Chadd /* mask offset of register             ,  offset  dB*/
3176bd547bSAdrian Chadd    AR_PHY_POWERTX_RATE5_POWERTXHT20_3_S,      1},
3276bd547bSAdrian Chadd   {ALL_TARGET_HT20_6, AR_PHY_POWERTX_RATE6, AR_PHY_POWERTX_RATE6_POWERTXHT20_4,
3376bd547bSAdrian Chadd    AR_PHY_POWERTX_RATE6_POWERTXHT20_4_S,      2},
3476bd547bSAdrian Chadd   {ALL_TARGET_HT20_7, AR_PHY_POWERTX_RATE6, AR_PHY_POWERTX_RATE6_POWERTXHT20_5,
3576bd547bSAdrian Chadd    AR_PHY_POWERTX_RATE6_POWERTXHT20_5_S,      2},
3676bd547bSAdrian Chadd   {ALL_TARGET_HT40_5, AR_PHY_POWERTX_RATE7, AR_PHY_POWERTX_RATE7_POWERTXHT40_3,
3776bd547bSAdrian Chadd    AR_PHY_POWERTX_RATE7_POWERTXHT40_3_S,      1},
3876bd547bSAdrian Chadd   {ALL_TARGET_HT40_6, AR_PHY_POWERTX_RATE8, AR_PHY_POWERTX_RATE8_POWERTXHT40_4,
3976bd547bSAdrian Chadd    AR_PHY_POWERTX_RATE8_POWERTXHT40_4_S,      2},
4076bd547bSAdrian Chadd   {ALL_TARGET_HT40_7, AR_PHY_POWERTX_RATE8, AR_PHY_POWERTX_RATE8_POWERTXHT40_5,
4176bd547bSAdrian Chadd    AR_PHY_POWERTX_RATE8_POWERTXHT40_5_S,      2},
4276bd547bSAdrian Chadd  {ALL_TARGET_LEGACY_54, AR_PHY_POWERTX_RATE2, AR_PHY_POWERTX_RATE2_POWERTX54M_7,
4376bd547bSAdrian Chadd    AR_PHY_POWERTX_RATE2_POWERTX54M_7_S,       2},
4476bd547bSAdrian Chadd };
4576bd547bSAdrian Chadd 
4676bd547bSAdrian Chadd HAL_BOOL create_pa_curve(u_int32_t * paprd_train_data_l,
4776bd547bSAdrian Chadd     u_int32_t *paprd_train_data_u, u_int32_t *pa_table, u_int32_t *g_fxp_ext,
4876bd547bSAdrian Chadd     int * pa_in);
4976bd547bSAdrian Chadd 
5076bd547bSAdrian Chadd static int
ar9300_paprd_setup_single_table(struct ath_hal * ah,struct ieee80211_channel * chan)51*e113789bSAdrian Chadd ar9300_paprd_setup_single_table(struct ath_hal *ah, struct ieee80211_channel * chan)
5276bd547bSAdrian Chadd {
53*e113789bSAdrian Chadd     int is_2g = IEEE80211_IS_CHAN_2GHZ(chan);
54*e113789bSAdrian Chadd     HAL_CHANNEL_INTERNAL *ichan = ath_hal_checkchannel(ah, chan);
5576bd547bSAdrian Chadd     struct ath_hal_9300 *ahp = AH9300(ah);
5676bd547bSAdrian Chadd     int is_ht40 = 0;
5776bd547bSAdrian Chadd     u_int32_t am_mask = 0;
5876bd547bSAdrian Chadd     u_int32_t val = OS_REG_READ(ah, AR_2040_MODE);
5976bd547bSAdrian Chadd     u_int8_t target_power_val_t2[ar9300_rate_size];
6076bd547bSAdrian Chadd     int      power_tblindex = 0, power_delta = 0;
6176bd547bSAdrian Chadd     int      paprd_scale_factor = 5;
6276bd547bSAdrian Chadd 
6376bd547bSAdrian Chadd     const u_int8_t mask2num[8] = {
6476bd547bSAdrian Chadd         0 /* 000 */,
6576bd547bSAdrian Chadd         1 /* 001 */,
6676bd547bSAdrian Chadd         1 /* 010 */,
6776bd547bSAdrian Chadd         2 /* 011 */,
6876bd547bSAdrian Chadd         1 /* 100 */,
6976bd547bSAdrian Chadd         2 /* 101 */,
7076bd547bSAdrian Chadd         2 /* 110 */,
7176bd547bSAdrian Chadd         3 /* 111 */
7276bd547bSAdrian Chadd     };
7376bd547bSAdrian Chadd 
7476bd547bSAdrian Chadd     ar9300_eeprom_t *eep = &AH9300(ah)->ah_eeprom;
7576bd547bSAdrian Chadd 
7676bd547bSAdrian Chadd #define ABS(_x, _y) ((int)_x > (int)_y ? (int)_x - (int)_y : (int)_y - (int)_x)
7776bd547bSAdrian Chadd 
78*e113789bSAdrian Chadd     ar9300_set_target_power_from_eeprom(ah, ichan->channel, target_power_val_t2);
7976bd547bSAdrian Chadd     if (val & HAL_HT_MACMODE_2040) {
8076bd547bSAdrian Chadd         is_ht40 = 1;
8176bd547bSAdrian Chadd     }
8276bd547bSAdrian Chadd 
8376bd547bSAdrian Chadd     /*
8476bd547bSAdrian Chadd      * Note on paprd_scale_factor
8576bd547bSAdrian Chadd      * This factor is saved in eeprom as 3 bit fields in following fashion.
8676bd547bSAdrian Chadd      * In 5G there are 3 scale factors -- upper, mid and lower band.
8776bd547bSAdrian Chadd      * Upper band scale factor is coded in bits 25-27 of
8876bd547bSAdrian Chadd      * modal_header_5g.paprd_rate_mask_ht20.
8976bd547bSAdrian Chadd      * Mid band scale factor is coded in bits 28-30 of
9076bd547bSAdrian Chadd      * modal_header_5g.paprd_rate_mask_ht40.
9176bd547bSAdrian Chadd      * Lower band scale factor is coded in bits 25-27 of
9276bd547bSAdrian Chadd      * modal_header_5g.paprd_rate_mask_ht40.
9376bd547bSAdrian Chadd      * For 2G there is only one scale factor. It is saved in bits 25-27 of
9476bd547bSAdrian Chadd      * modal_header_2g.paprd_rate_mask_ht20.
9576bd547bSAdrian Chadd      */
96*e113789bSAdrian Chadd     AH_PAPRD_GET_SCALE_FACTOR(paprd_scale_factor, eep, is_2g, ichan->channel);
9776bd547bSAdrian Chadd     if (is_2g) {
9876bd547bSAdrian Chadd         if (is_ht40) {
9976bd547bSAdrian Chadd             am_mask = ahp->ah_2g_paprd_rate_mask_ht40 & AH_PAPRD_AM_PM_MASK;
10076bd547bSAdrian Chadd             power_tblindex = ALL_TARGET_HT40_0_8_16;
10176bd547bSAdrian Chadd         } else {
10276bd547bSAdrian Chadd             am_mask = ahp->ah_2g_paprd_rate_mask_ht20 & AH_PAPRD_AM_PM_MASK;
10376bd547bSAdrian Chadd             power_tblindex = ALL_TARGET_HT20_0_8_16;
10476bd547bSAdrian Chadd         }
10576bd547bSAdrian Chadd         if (AR_SREV_HORNET(ah) || AR_SREV_WASP(ah) || AR_SREV_JUPITER(ah) || AR_SREV_APHRODITE(ah)) {
10676bd547bSAdrian Chadd             if (is_ht40) {
10776bd547bSAdrian Chadd                 ahp->paprd_training_power =
10876bd547bSAdrian Chadd                     target_power_val_t2[ALL_TARGET_HT40_7] + 2;
10976bd547bSAdrian Chadd             } else {
11076bd547bSAdrian Chadd                 ahp->paprd_training_power =
11176bd547bSAdrian Chadd                     target_power_val_t2[ALL_TARGET_HT20_7] + 2;
11276bd547bSAdrian Chadd             }
11376bd547bSAdrian Chadd 		} else if (AR_SREV_POSEIDON(ah)) {
11476bd547bSAdrian Chadd             ahp->paprd_training_power = 25;
11576bd547bSAdrian Chadd         } else {
11676bd547bSAdrian Chadd             ahp->paprd_training_power =
11776bd547bSAdrian Chadd                 OS_REG_READ_FIELD_ALT(ah, AR_PHY_POWERTX_RATE5,
11876bd547bSAdrian Chadd                 AR_PHY_POWERTX_RATE5_POWERTXHT20_0);
11976bd547bSAdrian Chadd             if (ABS(target_power_val_t2[power_tblindex],
12076bd547bSAdrian Chadd                 ahp->paprd_training_power) >  paprd_scale_factor)
12176bd547bSAdrian Chadd             {
12276bd547bSAdrian Chadd                 HALDEBUG(ah, HAL_DEBUG_CALIBRATE,
12376bd547bSAdrian Chadd                     "%s[%d]: Chan %d paprd failing EEP PWR 0x%08x"
124*e113789bSAdrian Chadd                     "TGT PWR 0x%08x\n", __func__, __LINE__, ichan->channel,
12576bd547bSAdrian Chadd                     target_power_val_t2[power_tblindex],
12676bd547bSAdrian Chadd                     ahp->paprd_training_power);
12776bd547bSAdrian Chadd                 goto FAILED;
12876bd547bSAdrian Chadd             }
12976bd547bSAdrian Chadd 
13076bd547bSAdrian Chadd             power_delta =
13176bd547bSAdrian Chadd                 ABS(ahp->paprd_training_power,
13276bd547bSAdrian Chadd                     target_power_val_t2[power_tblindex]);
13376bd547bSAdrian Chadd 
13476bd547bSAdrian Chadd             power_delta = power_delta > 4 ? 0 : 4 - power_delta;
13576bd547bSAdrian Chadd             ahp->paprd_training_power =
13676bd547bSAdrian Chadd                 ahp->paprd_training_power - power_delta;
13776bd547bSAdrian Chadd         }
13876bd547bSAdrian Chadd 
13976bd547bSAdrian Chadd 
14076bd547bSAdrian Chadd     } else {
14176bd547bSAdrian Chadd         if (is_ht40) {
14276bd547bSAdrian Chadd             ahp->paprd_training_power =
14376bd547bSAdrian Chadd 			    OS_REG_READ_FIELD_ALT(ah, AR_PHY_POWERTX_RATE8,
14476bd547bSAdrian Chadd 				AR_PHY_POWERTX_RATE8_POWERTXHT40_5);
14576bd547bSAdrian Chadd             am_mask = ahp->ah_5g_paprd_rate_mask_ht40 & AH_PAPRD_AM_PM_MASK;
14676bd547bSAdrian Chadd             switch (mask2num[ahp->ah_tx_chainmask])
14776bd547bSAdrian Chadd             {
14876bd547bSAdrian Chadd             case 1:
14976bd547bSAdrian Chadd                 power_delta = 6;
15076bd547bSAdrian Chadd                 break;
15176bd547bSAdrian Chadd             case 2:
15276bd547bSAdrian Chadd                 power_delta = 4;
15376bd547bSAdrian Chadd                 break;
15476bd547bSAdrian Chadd             case 3:
15576bd547bSAdrian Chadd                 power_delta = 2;
15676bd547bSAdrian Chadd                 break;
15776bd547bSAdrian Chadd             default:
15876bd547bSAdrian Chadd                 goto FAILED;
15976bd547bSAdrian Chadd                 break;
16076bd547bSAdrian Chadd             }
16176bd547bSAdrian Chadd             power_tblindex = ALL_TARGET_HT40_7;
16276bd547bSAdrian Chadd         } else {
16376bd547bSAdrian Chadd             ahp->paprd_training_power =
16476bd547bSAdrian Chadd 			    OS_REG_READ_FIELD_ALT(ah, AR_PHY_POWERTX_RATE6,
16576bd547bSAdrian Chadd 				AR_PHY_POWERTX_RATE6_POWERTXHT20_5);
16676bd547bSAdrian Chadd             am_mask = ahp->ah_5g_paprd_rate_mask_ht20 & AH_PAPRD_AM_PM_MASK;
16776bd547bSAdrian Chadd             switch (mask2num[ahp->ah_tx_chainmask])
16876bd547bSAdrian Chadd             {
16976bd547bSAdrian Chadd             case 1:
17076bd547bSAdrian Chadd                 power_delta = 6;
17176bd547bSAdrian Chadd                 break;
17276bd547bSAdrian Chadd             case 2:
17376bd547bSAdrian Chadd                 power_delta = 4;
17476bd547bSAdrian Chadd                 break;
17576bd547bSAdrian Chadd             case 3:
17676bd547bSAdrian Chadd                 power_delta = 2;
17776bd547bSAdrian Chadd                 break;
17876bd547bSAdrian Chadd             default:
17976bd547bSAdrian Chadd                 goto FAILED;
18076bd547bSAdrian Chadd                 break;
18176bd547bSAdrian Chadd             }
18276bd547bSAdrian Chadd             power_tblindex = ALL_TARGET_HT20_7;
18376bd547bSAdrian Chadd         }
18476bd547bSAdrian Chadd         /* Adjust for scale factor */
18576bd547bSAdrian Chadd         ahp->paprd_training_power += paprd_scale_factor;
18676bd547bSAdrian Chadd         /*
18776bd547bSAdrian Chadd         ath_hal_printf(ah, "%s[%d] paprd_scale_factor %d power_delta %d\n",
18876bd547bSAdrian Chadd             __func__, __LINE__, paprd_scale_factor, power_delta);
18976bd547bSAdrian Chadd          */
19076bd547bSAdrian Chadd         if (ABS(target_power_val_t2[power_tblindex], ahp->paprd_training_power)
19176bd547bSAdrian Chadd             >  paprd_scale_factor)
19276bd547bSAdrian Chadd         {
19376bd547bSAdrian Chadd             HALDEBUG(ah, HAL_DEBUG_CALIBRATE,
19476bd547bSAdrian Chadd                 "%s[%d]: Chan %d paprd failing EEP PWR 0x%08x TGT PWR 0x%08x\n",
195*e113789bSAdrian Chadd                 __func__, __LINE__, ichan->channel,
19676bd547bSAdrian Chadd                 target_power_val_t2[power_tblindex], ahp->paprd_training_power);
19776bd547bSAdrian Chadd             goto FAILED;
19876bd547bSAdrian Chadd         }
19976bd547bSAdrian Chadd         ahp->paprd_training_power = ahp->paprd_training_power + power_delta;
20076bd547bSAdrian Chadd     }
20176bd547bSAdrian Chadd 
20276bd547bSAdrian Chadd     HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s 2G %d HT40 %d am_mask 0x%08x\n",
20376bd547bSAdrian Chadd         __func__, is_2g, is_ht40, am_mask);
20476bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_AM2AM, AR_PHY_PAPRD_AM2AM_MASK,
20576bd547bSAdrian Chadd         am_mask);
20676bd547bSAdrian Chadd     if (AR_SREV_HORNET(ah)) {
20776bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK,
20876bd547bSAdrian Chadd             0);
20976bd547bSAdrian Chadd     }
21076bd547bSAdrian Chadd     else {
21176bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK,
21276bd547bSAdrian Chadd             am_mask);
21376bd547bSAdrian Chadd     }
21476bd547bSAdrian Chadd 
21576bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_HT40, AR_PHY_PAPRD_HT40_MASK,
21676bd547bSAdrian Chadd         AR_PHY_PAPRD_HT40_MASK);
21776bd547bSAdrian Chadd     /* chain0 */
21876bd547bSAdrian Chadd     if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN0_MASK) {
21976bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0,
22076bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL0_B0_USE_SINGLE_TABLE_MASK, 1);
22176bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0,
22276bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_AM2PM_ENABLE_0, 1);
22376bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0,
22476bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_AM2AM_ENABLE_0, 1);
22576bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0,
22676bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_SCALING_ENA, 0);
22776bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0,
22876bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B0_PA_GAIN_SCALE_FACT_0_MASK, 181);
22976bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0,
23076bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B0_PAPRD_MAG_SCALE_FACT_0, 361);
23176bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0,
23276bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_SCALING_ENA, 0);
23376bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0,
23476bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL0_B0_PAPRD_MAG_THRSH_0, 3);
23576bd547bSAdrian Chadd     }
23676bd547bSAdrian Chadd 
23776bd547bSAdrian Chadd     /* chain1 */
23876bd547bSAdrian Chadd     if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN1_MASK) {
23976bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1,
24076bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL0_B1_PAPRD_ADAPTIVE_USE_SINGLE_TABLE_1, 1);
24176bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1,
24276bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_AM2PM_ENABLE_1, 1);
24376bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1,
24476bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_AM2AM_ENABLE_1, 1);
24576bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1,
24676bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_SCALING_ENA, 0);
24776bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1,
24876bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B1_PA_GAIN_SCALE_FACT_1_MASK, 181);
24976bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1,
25076bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B1_PAPRD_MAG_SCALE_FACT_1, 361);
25176bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1,
25276bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_SCALING_ENA, 0);
25376bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1,
25476bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL0_B1_PAPRD_MAG_THRSH_1, 3);
25576bd547bSAdrian Chadd     }
25676bd547bSAdrian Chadd 
25776bd547bSAdrian Chadd     /* chain2 */
25876bd547bSAdrian Chadd     if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN2_MASK) {
25976bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2,
26076bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL0_B2_PAPRD_ADAPTIVE_USE_SINGLE_TABLE_2, 1);
26176bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2,
26276bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_AM2PM_ENABLE_2, 1);
26376bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2,
26476bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_AM2AM_ENABLE_2, 1);
26576bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2,
26676bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_SCALING_ENA, 0);
26776bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2,
26876bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B2_PA_GAIN_SCALE_FACT_2_MASK, 181);
26976bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2,
27076bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B2_PAPRD_MAG_SCALE_FACT_2, 361);
27176bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2,
27276bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_SCALING_ENA, 0);
27376bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2,
27476bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL0_B2_PAPRD_MAG_THRSH_2, 3);
27576bd547bSAdrian Chadd     }
27676bd547bSAdrian Chadd 
27776bd547bSAdrian Chadd     ar9300_enable_paprd(ah, AH_FALSE, chan);
27876bd547bSAdrian Chadd     if (AR_SREV_POSEIDON(ah)) {
27976bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON,
28076bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_SKIP, 0x30);
28176bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON,
28276bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_ENABLE, 1);
28376bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON,
28476bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_TX_GAIN_FORCE, 1);
28576bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON,
28676bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_RX_BB_GAIN_FORCE, 0);
28776bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON,
28876bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_IQCORR_ENABLE, 0);
28976bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON,
29076bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_AGC2_SETTLING, 28);
29176bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON,
29276bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_CF_PAPRD_TRAIN_ENABLE, 1);
29376bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL2_POSEIDON,
29476bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL2_CF_PAPRD_INIT_RX_BB_GAIN, 148);
29576bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
29676bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_FINE_CORR_LEN, 4);
29776bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
29876bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_COARSE_CORR_LEN, 4);
29976bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
30076bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_NUM_CORR_STAGES, 7);
30176bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
30276bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_MIN_LOOPBACK_DEL, 1);
30376bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
30476bd547bSAdrian Chadd 	        AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP, -3);
30576bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
30676bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_ADC_DESIRED_SIZE, -15);
30776bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
30876bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_BBTXMIX_DISABLE, 1);
30976bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4_POSEIDON,
31076bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_SAFETY_DELTA, 0);
31176bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4_POSEIDON,
31276bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_MIN_CORR, 400);
31376bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4_POSEIDON,
31476bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_NUM_TRAIN_SAMPLES, 100);
31576bd547bSAdrian Chadd     } else {
31676bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1,
31776bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_SKIP, 0x30);
31876bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1,
31976bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_ENABLE, 1);
32076bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1,
32176bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_TX_GAIN_FORCE, 1);
32276bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1,
32376bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_RX_BB_GAIN_FORCE, 0);
32476bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1,
32576bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_IQCORR_ENABLE, 0);
32676bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1,
32776bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_AGC2_SETTLING, 28);
32876bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1,
32976bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_CF_PAPRD_TRAIN_ENABLE, 1);
33076bd547bSAdrian Chadd         if (is_2g) {
33176bd547bSAdrian Chadd         	 if(AR_SREV_JUPITER(ah) || AR_SREV_APHRODITE(ah)){
33276bd547bSAdrian Chadd              OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL2,
33376bd547bSAdrian Chadd                  AR_PHY_PAPRD_TRAINER_CNTL2_CF_PAPRD_INIT_RX_BB_GAIN, 0x91);
33476bd547bSAdrian Chadd            }else{
33576bd547bSAdrian Chadd              OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL2,
33676bd547bSAdrian Chadd                  AR_PHY_PAPRD_TRAINER_CNTL2_CF_PAPRD_INIT_RX_BB_GAIN, 147);
33776bd547bSAdrian Chadd            }
33876bd547bSAdrian Chadd         }
33976bd547bSAdrian Chadd 		else if (AR_SREV_WASP(ah) && !is_2g) {
34076bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL2,
34176bd547bSAdrian Chadd 	            AR_PHY_PAPRD_TRAINER_CNTL2_CF_PAPRD_INIT_RX_BB_GAIN, 137);
34276bd547bSAdrian Chadd 		} else {
34376bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL2,
34476bd547bSAdrian Chadd 	            AR_PHY_PAPRD_TRAINER_CNTL2_CF_PAPRD_INIT_RX_BB_GAIN, 147);
34576bd547bSAdrian Chadd         }
34676bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
34776bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_FINE_CORR_LEN, 4);
34876bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
34976bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_COARSE_CORR_LEN, 4);
35076bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
35176bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_NUM_CORR_STAGES, 7);
35276bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
35376bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_MIN_LOOPBACK_DEL, 1);
35476bd547bSAdrian Chadd         if (AR_SREV_HORNET(ah) || AR_SREV_WASP(ah) || AR_SREV_JUPITER(ah) || AR_SREV_APHRODITE(ah)) {
35576bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
35676bd547bSAdrian Chadd                 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP, -3);
35776bd547bSAdrian Chadd         } else {
35876bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
35976bd547bSAdrian Chadd                 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP, -6);
36076bd547bSAdrian Chadd         }
36176bd547bSAdrian Chadd         if (is_2g) {
36276bd547bSAdrian Chadd             if(AR_SREV_JUPITER(ah) || AR_SREV_APHRODITE(ah)){
36376bd547bSAdrian Chadd                 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
36476bd547bSAdrian Chadd                     AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_ADC_DESIRED_SIZE, -10);
36576bd547bSAdrian Chadd             }else{
36676bd547bSAdrian Chadd                 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
36776bd547bSAdrian Chadd                     AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_ADC_DESIRED_SIZE, -15);
36876bd547bSAdrian Chadd             }
36976bd547bSAdrian Chadd         }
37076bd547bSAdrian Chadd         else {
37176bd547bSAdrian Chadd              OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
37276bd547bSAdrian Chadd                  AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_ADC_DESIRED_SIZE, -10);
37376bd547bSAdrian Chadd         }
37476bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
37576bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_BBTXMIX_DISABLE, 1);
37676bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4,
37776bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_SAFETY_DELTA, 0);
37876bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4,
37976bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_MIN_CORR, 400);
38076bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4,
38176bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_NUM_TRAIN_SAMPLES, 100);
38276bd547bSAdrian Chadd     }
38376bd547bSAdrian Chadd 
38476bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_0_B0,
38576bd547bSAdrian Chadd         AR_PHY_PAPRD_PRE_POST_SCALE_0_B0_PAPRD_PRE_POST_SCALING_0_0, 261376);
38676bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_1_B0,
38776bd547bSAdrian Chadd         AR_PHY_PAPRD_PRE_POST_SCALE_1_B0_PAPRD_PRE_POST_SCALING_1_0, 248079);
38876bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_2_B0,
38976bd547bSAdrian Chadd         AR_PHY_PAPRD_PRE_POST_SCALE_2_B0_PAPRD_PRE_POST_SCALING_2_0, 233759);
39076bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_3_B0,
39176bd547bSAdrian Chadd         AR_PHY_PAPRD_PRE_POST_SCALE_3_B0_PAPRD_PRE_POST_SCALING_3_0, 220464);
39276bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_4_B0,
39376bd547bSAdrian Chadd         AR_PHY_PAPRD_PRE_POST_SCALE_4_B0_PAPRD_PRE_POST_SCALING_4_0, 208194);
39476bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_5_B0,
39576bd547bSAdrian Chadd         AR_PHY_PAPRD_PRE_POST_SCALE_5_B0_PAPRD_PRE_POST_SCALING_5_0, 196949);
39676bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_6_B0,
39776bd547bSAdrian Chadd         AR_PHY_PAPRD_PRE_POST_SCALE_6_B0_PAPRD_PRE_POST_SCALING_6_0, 185706);
39876bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_7_B0,
39976bd547bSAdrian Chadd         AR_PHY_PAPRD_PRE_POST_SCALE_7_B0_PAPRD_PRE_POST_SCALING_7_0, 175487);
40076bd547bSAdrian Chadd     return 0;
40176bd547bSAdrian Chadd 
40276bd547bSAdrian Chadd FAILED:
40376bd547bSAdrian Chadd     return -1;
40476bd547bSAdrian Chadd #undef ABS
40576bd547bSAdrian Chadd }
40676bd547bSAdrian Chadd 
407*e113789bSAdrian Chadd /*
408*e113789bSAdrian Chadd  * XXX There's another copy of this in ar9300_reset.c, use that!
409*e113789bSAdrian Chadd  */
410*e113789bSAdrian Chadd #if 0
41176bd547bSAdrian Chadd static inline HAL_CHANNEL_INTERNAL*
41276bd547bSAdrian Chadd ar9300_check_chan(struct ath_hal *ah, HAL_CHANNEL *chan)
41376bd547bSAdrian Chadd {
41476bd547bSAdrian Chadd     if ((AR9300_IS_CHAN(chan, CHANNEL_2GHZ) ^
41576bd547bSAdrian Chadd          AR9300_IS_CHAN(chan, CHANNEL_5GHZ)) == 0)
41676bd547bSAdrian Chadd     {
41776bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_CHANNEL,
41876bd547bSAdrian Chadd             "%s: invalid channel %u/0x%x; not marked as 2GHz or 5GHz\n",
41976bd547bSAdrian Chadd             __func__, chan->channel, chan->channel_flags);
42076bd547bSAdrian Chadd         return AH_NULL;
42176bd547bSAdrian Chadd     }
42276bd547bSAdrian Chadd 
42376bd547bSAdrian Chadd     if ((AR9300_IS_CHAN(chan, CHANNEL_OFDM)     ^
42476bd547bSAdrian Chadd          AR9300_IS_CHAN(chan, CHANNEL_CCK)      ^
42576bd547bSAdrian Chadd          AR9300_IS_CHAN(chan, CHANNEL_HT20)     ^
42676bd547bSAdrian Chadd          AR9300_IS_CHAN(chan, CHANNEL_HT40PLUS) ^
42776bd547bSAdrian Chadd          AR9300_IS_CHAN(chan, CHANNEL_HT40MINUS)) == 0)
42876bd547bSAdrian Chadd     {
42976bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_CHANNEL,
43076bd547bSAdrian Chadd             "%s: invalid channel %u/0x%x; not marked as "
43176bd547bSAdrian Chadd             "OFDM or CCK or HT20 or HT40PLUS or HT40MINUS\n", __func__,
43276bd547bSAdrian Chadd             chan->channel, chan->channel_flags);
43376bd547bSAdrian Chadd         return AH_NULL;
43476bd547bSAdrian Chadd     }
43576bd547bSAdrian Chadd 
43676bd547bSAdrian Chadd     return (ath_hal_checkchannel(ah, chan));
43776bd547bSAdrian Chadd }
438*e113789bSAdrian Chadd #endif
43976bd547bSAdrian Chadd 
ar9300_enable_paprd(struct ath_hal * ah,HAL_BOOL enable_flag,struct ieee80211_channel * chan)44076bd547bSAdrian Chadd void ar9300_enable_paprd(struct ath_hal *ah, HAL_BOOL enable_flag,
441*e113789bSAdrian Chadd     struct ieee80211_channel * chan)
44276bd547bSAdrian Chadd {
44376bd547bSAdrian Chadd     HAL_BOOL enable = enable_flag;
44476bd547bSAdrian Chadd     u_int32_t am_mask = 0;
44576bd547bSAdrian Chadd     u_int32_t val = OS_REG_READ(ah, AR_2040_MODE);
446*e113789bSAdrian Chadd     int is_2g = IEEE80211_IS_CHAN_2GHZ(chan);
447*e113789bSAdrian Chadd     HAL_CHANNEL_INTERNAL *ichan = ath_hal_checkchannel(ah, chan);
44876bd547bSAdrian Chadd     int is_ht40 = 0;
44976bd547bSAdrian Chadd     struct ath_hal_9300 *ahp = AH9300(ah);
45076bd547bSAdrian Chadd 
45176bd547bSAdrian Chadd     if (val & HAL_HT_MACMODE_2040) {
45276bd547bSAdrian Chadd         is_ht40 = 1;
45376bd547bSAdrian Chadd     }
45476bd547bSAdrian Chadd     if (enable_flag == AH_TRUE) {
45576bd547bSAdrian Chadd         ar9300_eeprom_t *eep = &AH9300(ah)->ah_eeprom;
45676bd547bSAdrian Chadd 
45776bd547bSAdrian Chadd         if (!is_2g) {
45876bd547bSAdrian Chadd             /*
45976bd547bSAdrian Chadd              * 3 bits for modal_header_5g.paprd_rate_mask_ht20
46076bd547bSAdrian Chadd              * is used for sub band disabling of paprd.
46176bd547bSAdrian Chadd              * 5G band is divided into 3 sub bands -- upper, mid, lower.
46276bd547bSAdrian Chadd              * If bit 30 of modal_header_5g.paprd_rate_mask_ht20 is set
46376bd547bSAdrian Chadd              * to one -- disable paprd for upper 5G
46476bd547bSAdrian Chadd              * If bit 29 of modal_header_5g.paprd_rate_mask_ht20 is set
46576bd547bSAdrian Chadd              * to one -- disable paprd for mid 5G
46676bd547bSAdrian Chadd              * If bit 28 of modal_header_5g.paprd_rate_mask_ht20 is set
46776bd547bSAdrian Chadd              * to one -- disable paprd for lower 5G
46876bd547bSAdrian Chadd              * u_int32_t am_mask = eep->modal_header_5g.paprd_rate_mask_ht20;
46976bd547bSAdrian Chadd              */
470*e113789bSAdrian Chadd             if (ichan->channel >= UPPER_5G_SUB_BANDSTART) {
47176bd547bSAdrian Chadd                 if (eep->modal_header_5g.paprd_rate_mask_ht20 & (1 << 30)) {
47276bd547bSAdrian Chadd                     enable = AH_FALSE;
47376bd547bSAdrian Chadd                 }
474*e113789bSAdrian Chadd             } else if (ichan->channel >= MID_5G_SUB_BANDSTART) {
47576bd547bSAdrian Chadd                 if (eep->modal_header_5g.paprd_rate_mask_ht20 & (1 << 29)) {
47676bd547bSAdrian Chadd                     enable = AH_FALSE;
47776bd547bSAdrian Chadd                 }
47876bd547bSAdrian Chadd             } else { /* must be in the lower 5G subband */
47976bd547bSAdrian Chadd                 if (eep->modal_header_5g.paprd_rate_mask_ht20 & (1 << 28)) {
48076bd547bSAdrian Chadd                     enable = AH_FALSE;
48176bd547bSAdrian Chadd                 }
48276bd547bSAdrian Chadd             }
48376bd547bSAdrian Chadd         }
48476bd547bSAdrian Chadd 
48576bd547bSAdrian Chadd         if (ahp->ah_paprd_broken) {
48676bd547bSAdrian Chadd             ahp->ah_paprd_broken = AH_FALSE;
48776bd547bSAdrian Chadd             enable = AH_FALSE;
48876bd547bSAdrian Chadd 
48976bd547bSAdrian Chadd             HALDEBUG(ah, HAL_DEBUG_UNMASKABLE,
49076bd547bSAdrian Chadd                      "%s: PAPRD is in bad state. Don't enable PAPRD\n",
49176bd547bSAdrian Chadd                      __func__);
49276bd547bSAdrian Chadd         }
49376bd547bSAdrian Chadd     }
49476bd547bSAdrian Chadd     if (enable) {
49576bd547bSAdrian Chadd         HAL_CHANNEL_INTERNAL *ichan;
49676bd547bSAdrian Chadd         if (is_2g) {
49776bd547bSAdrian Chadd             if (is_ht40) {
49876bd547bSAdrian Chadd                 am_mask = ahp->ah_2g_paprd_rate_mask_ht40 & AH_PAPRD_AM_PM_MASK;
49976bd547bSAdrian Chadd             } else {
50076bd547bSAdrian Chadd                 am_mask = ahp->ah_2g_paprd_rate_mask_ht20 & AH_PAPRD_AM_PM_MASK;
50176bd547bSAdrian Chadd             }
50276bd547bSAdrian Chadd         } else {
50376bd547bSAdrian Chadd             if (is_ht40) {
50476bd547bSAdrian Chadd                 am_mask = ahp->ah_5g_paprd_rate_mask_ht40 & AH_PAPRD_AM_PM_MASK;
50576bd547bSAdrian Chadd             } else {
50676bd547bSAdrian Chadd                 am_mask = ahp->ah_5g_paprd_rate_mask_ht20 & AH_PAPRD_AM_PM_MASK;
50776bd547bSAdrian Chadd             }
50876bd547bSAdrian Chadd         }
50976bd547bSAdrian Chadd         /* Earlier we promgrammed TGT Power with Scaled down value, since
51076bd547bSAdrian Chadd          * PAPRD CAL was not done.
51176bd547bSAdrian Chadd          * Now we finish PAPRD CAL, so bump up the TGT PWR to original
51276bd547bSAdrian Chadd          * EEPROM Power. CTLs calc and Maverickd in
51376bd547bSAdrian Chadd          * "ar9300_eeprom_set_transmit_power"
51476bd547bSAdrian Chadd          */
51576bd547bSAdrian Chadd         ichan = ar9300_check_chan(ah, chan);
51676bd547bSAdrian Chadd         ichan->paprd_table_write_done = 1;
517*e113789bSAdrian Chadd //        chan->paprd_table_write_done = 1;
51876bd547bSAdrian Chadd         /*
51976bd547bSAdrian Chadd         ath_hal_printf(ah, "%s[%d] eeprom_set_transmit_power PAPRD\n",
52076bd547bSAdrian Chadd             __func__, __LINE__);
52176bd547bSAdrian Chadd          */
522*e113789bSAdrian Chadd         if (ar9300_eeprom_set_transmit_power(ah, &ahp->ah_eeprom, chan,
52376bd547bSAdrian Chadd             ath_hal_getctl(ah, chan), ath_hal_getantennaallowed(ah, chan),
52476bd547bSAdrian Chadd             ath_hal_get_twice_max_regpower(AH_PRIVATE(ah), ichan, chan),
525*e113789bSAdrian Chadd             AH_MIN(MAX_RATE_POWER, AH_PRIVATE(ah)->ah_powerLimit)) != HAL_OK) {
52676bd547bSAdrian Chadd             ichan->paprd_table_write_done = 0;
527*e113789bSAdrian Chadd //            chan->paprd_table_write_done = 0;
52876bd547bSAdrian Chadd             /* Intentional print */
52976bd547bSAdrian Chadd             ath_hal_printf(ah,
53076bd547bSAdrian Chadd                 "%s[%d] eeprom_set_transmit_power failed ABORT PAPRD\n",
53176bd547bSAdrian Chadd                 __func__, __LINE__);
53276bd547bSAdrian Chadd 
53376bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0,
53476bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL0_B0_PAPRD_ENABLE_0, 0);
53576bd547bSAdrian Chadd             if (!AR_SREV_POSEIDON(ah) && !AR_SREV_HORNET(ah)) {
53676bd547bSAdrian Chadd                 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1,
53776bd547bSAdrian Chadd                     AR_PHY_PAPRD_CTRL0_B1_PAPRD_ENABLE_1, 0);
53876bd547bSAdrian Chadd                 if (!AR_SREV_JUPITER(ah) || (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN2_MASK)) {
53976bd547bSAdrian Chadd                     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2,
54076bd547bSAdrian Chadd                         AR_PHY_PAPRD_CTRL0_B2_PAPRD_ENABLE_2, 0);
54176bd547bSAdrian Chadd 
54276bd547bSAdrian Chadd                 }
54376bd547bSAdrian Chadd             }
54476bd547bSAdrian Chadd             return;
54576bd547bSAdrian Chadd         }
54676bd547bSAdrian Chadd 
54776bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s 2G %d HT40 %d am_mask 0x%08x\n",
54876bd547bSAdrian Chadd             __func__, is_2g, is_ht40, am_mask);
54976bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_AM2AM, AR_PHY_PAPRD_AM2AM_MASK,
55076bd547bSAdrian Chadd             am_mask);
55176bd547bSAdrian Chadd         if (AR_SREV_HORNET(ah)) {
55276bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah,
55376bd547bSAdrian Chadd                 AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK, 0);
55476bd547bSAdrian Chadd         } else {
55576bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah,
55676bd547bSAdrian Chadd                 AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK, am_mask);
55776bd547bSAdrian Chadd         }
55876bd547bSAdrian Chadd 
55976bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_HT40, AR_PHY_PAPRD_HT40_MASK,
56076bd547bSAdrian Chadd             AR_PHY_PAPRD_HT40_MASK);
56176bd547bSAdrian Chadd         /* chain0 */
56276bd547bSAdrian Chadd         if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN0_MASK) {
56376bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0,
56476bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL0_B0_USE_SINGLE_TABLE_MASK, 1);
56576bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0,
56676bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_AM2PM_ENABLE_0, 1);
56776bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0,
56876bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_AM2AM_ENABLE_0, 1);
56976bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0,
57076bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_SCALING_ENA, 0);
57176bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0,
57276bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B0_PA_GAIN_SCALE_FACT_0_MASK, 181);
57376bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0,
57476bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B0_PAPRD_MAG_SCALE_FACT_0, 361);
57576bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0,
57676bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_SCALING_ENA, 0);
57776bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0,
57876bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL0_B0_PAPRD_MAG_THRSH_0, 3);
57976bd547bSAdrian Chadd         }
58076bd547bSAdrian Chadd         /* chain1 */
58176bd547bSAdrian Chadd         if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN1_MASK) {
58276bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1,
58376bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL0_B1_PAPRD_ADAPTIVE_USE_SINGLE_TABLE_1, 1);
58476bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1,
58576bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_AM2PM_ENABLE_1, 1);
58676bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1,
58776bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_AM2AM_ENABLE_1, 1);
58876bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1,
58976bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_SCALING_ENA, 0);
59076bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1,
59176bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B1_PA_GAIN_SCALE_FACT_1_MASK, 181);
59276bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1,
59376bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B1_PAPRD_MAG_SCALE_FACT_1, 361);
59476bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1,
59576bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_SCALING_ENA, 0);
59676bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1,
59776bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL0_B1_PAPRD_MAG_THRSH_1, 3);
59876bd547bSAdrian Chadd         }
59976bd547bSAdrian Chadd         /* chain2 */
60076bd547bSAdrian Chadd         if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN2_MASK) {
60176bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2,
60276bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL0_B2_PAPRD_ADAPTIVE_USE_SINGLE_TABLE_2, 1);
60376bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2,
60476bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_AM2PM_ENABLE_2, 1);
60576bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2,
60676bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_AM2AM_ENABLE_2, 1);
60776bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2,
60876bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_SCALING_ENA, 0);
60976bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2,
61076bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B2_PA_GAIN_SCALE_FACT_2_MASK, 181);
61176bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2,
61276bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B2_PAPRD_MAG_SCALE_FACT_2, 361);
61376bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2,
61476bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_SCALING_ENA, 0);
61576bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2,
61676bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL0_B2_PAPRD_MAG_THRSH_2, 3);
61776bd547bSAdrian Chadd         }
61876bd547bSAdrian Chadd 
61976bd547bSAdrian Chadd         if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN0_MASK) {
62076bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0,
62176bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL0_B0_PAPRD_ENABLE_0, 1);
62276bd547bSAdrian Chadd         }
62376bd547bSAdrian Chadd 
62476bd547bSAdrian Chadd         if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN1_MASK) {
62576bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1,
62676bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL0_B1_PAPRD_ENABLE_1, 1);
62776bd547bSAdrian Chadd         }
62876bd547bSAdrian Chadd 
62976bd547bSAdrian Chadd         if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN2_MASK) {
63076bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2,
63176bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL0_B2_PAPRD_ENABLE_2, 1);
63276bd547bSAdrian Chadd         }
63376bd547bSAdrian Chadd 
63476bd547bSAdrian Chadd     } else {
63576bd547bSAdrian Chadd         if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN0_MASK) {
63676bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0,
63776bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL0_B0_PAPRD_ENABLE_0, 0);
63876bd547bSAdrian Chadd         }
63976bd547bSAdrian Chadd 
64076bd547bSAdrian Chadd         if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN1_MASK) {
64176bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1,
64276bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL0_B1_PAPRD_ENABLE_1, 0);
64376bd547bSAdrian Chadd         }
64476bd547bSAdrian Chadd 
64576bd547bSAdrian Chadd         if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN2_MASK) {
64676bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2,
64776bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL0_B2_PAPRD_ENABLE_2, 0);
64876bd547bSAdrian Chadd         }
64976bd547bSAdrian Chadd     }
65076bd547bSAdrian Chadd }
65176bd547bSAdrian Chadd 
ar9300_gain_table_entries(struct ath_hal * ah)65276bd547bSAdrian Chadd static void ar9300_gain_table_entries(struct ath_hal *ah)
65376bd547bSAdrian Chadd {
65476bd547bSAdrian Chadd     int i;
65576bd547bSAdrian Chadd     u_int32_t reg;
65676bd547bSAdrian Chadd     u_int32_t *gain_table_entries = AH9300(ah)->paprd_gain_table_entries;
65776bd547bSAdrian Chadd     u_int32_t *gain_vs_table_index = AH9300(ah)->paprd_gain_table_index;
65876bd547bSAdrian Chadd 
65976bd547bSAdrian Chadd     reg = AR_PHY_TXGAIN_TAB(1);
66076bd547bSAdrian Chadd 
66176bd547bSAdrian Chadd     for (i = 0; i < 32; i++) {
66276bd547bSAdrian Chadd         gain_table_entries[i] = OS_REG_READ(ah, reg);
66376bd547bSAdrian Chadd         gain_vs_table_index[i] = (gain_table_entries[i] >> 24) & 0xff;
66476bd547bSAdrian Chadd         /*
66576bd547bSAdrian Chadd          * ath_hal_printf(
66676bd547bSAdrian Chadd          *     ah, "+++reg 0x%08x gain_table_entries[%d] = 0x%08x \n",
66776bd547bSAdrian Chadd          *     reg, i, gain_table_entries[i]);
66876bd547bSAdrian Chadd          */
66976bd547bSAdrian Chadd         reg = reg + 4;
67076bd547bSAdrian Chadd     }
67176bd547bSAdrian Chadd }
67276bd547bSAdrian Chadd 
67376bd547bSAdrian Chadd /* Get gain index for Target power */
ar9300_get_desired_gain_for_chain(struct ath_hal * ah,int chain_num,int target_power)67476bd547bSAdrian Chadd static unsigned int ar9300_get_desired_gain_for_chain(struct ath_hal *ah,
67576bd547bSAdrian Chadd     int chain_num, int target_power)
67676bd547bSAdrian Chadd {
67776bd547bSAdrian Chadd     int olpc_gain_delta = 0;
67876bd547bSAdrian Chadd     int alpha_therm = 0, alpha_volt = 0;
67976bd547bSAdrian Chadd     int therm_cal_value = 0, volt_cal_value = 0;
68076bd547bSAdrian Chadd     int latest_therm_value = 0, latest_volt_value = 0, olpc_gain_delta_tmp = 0;
68176bd547bSAdrian Chadd     int thermal_gain_corr = 0, voltage_gain_corr = 0, desired_scale = 0;
68276bd547bSAdrian Chadd     int desired_gain = 0;
68376bd547bSAdrian Chadd     int cl_gain_mod = 0;
68476bd547bSAdrian Chadd 
68576bd547bSAdrian Chadd     /* Clear the training done bit */
68676bd547bSAdrian Chadd     if (AR_SREV_POSEIDON(ah)) {
68776bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON,
68876bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE, 0);
68976bd547bSAdrian Chadd     } else {
69076bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1,
69176bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE, 0);
69276bd547bSAdrian Chadd     }
69376bd547bSAdrian Chadd     /*field_read("BB_tpc_12.desired_scale_ht40_5", &desired_scale);*/
69476bd547bSAdrian Chadd     desired_scale =
69576bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_12,
69676bd547bSAdrian Chadd         AR_PHY_TPC_12_DESIRED_SCALE_HT40_5);
69776bd547bSAdrian Chadd     /*field_read("BB_tpc_19.alpha_therm", &alpha_therm);*/
69876bd547bSAdrian Chadd     alpha_therm =
69976bd547bSAdrian Chadd         OS_REG_READ_FIELD(ah, AR_PHY_TPC_19, AR_PHY_TPC_19_ALPHA_THERM);
70076bd547bSAdrian Chadd     /*field_read("BB_tpc_19.alpha_volt", &alpha_volt);*/
70176bd547bSAdrian Chadd     alpha_volt =
70276bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_19, AR_PHY_TPC_19_ALT_ALPHA_VOLT);
70376bd547bSAdrian Chadd 
70476bd547bSAdrian Chadd     /*field_read("BB_tpc_18.therm_cal_value", &therm_cal_value);*/
70576bd547bSAdrian Chadd     therm_cal_value =
70676bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_18,
70776bd547bSAdrian Chadd         AR_PHY_TPC_18_ALT_THERM_CAL_VALUE);
70876bd547bSAdrian Chadd     /*field_read("BB_tpc_18.volt_cal_value", &volt_cal_value);*/
70976bd547bSAdrian Chadd     volt_cal_value =
71076bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_18,
71176bd547bSAdrian Chadd         AR_PHY_TPC_18_ALT_VOLT_CAL_VALUE);
71276bd547bSAdrian Chadd 
71376bd547bSAdrian Chadd     /*field_read("BB_therm_adc_4.latest_therm_value", &latest_therm_value);*/
71476bd547bSAdrian Chadd     latest_therm_value =
71576bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_THERM_ADC_4,
71676bd547bSAdrian Chadd         AR_PHY_THERM_ADC_4_LATEST_THERM_VALUE);
71776bd547bSAdrian Chadd     /*field_read("BB_therm_adc_4.latest_volt_value", &latest_volt_value);*/
71876bd547bSAdrian Chadd     latest_volt_value =
71976bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_THERM_ADC_4,
72076bd547bSAdrian Chadd         AR_PHY_THERM_ADC_4_LATEST_VOLT_VALUE);
72176bd547bSAdrian Chadd 
72276bd547bSAdrian Chadd     /*
72376bd547bSAdrian Chadd      * sprintf(
72476bd547bSAdrian Chadd      *     field_name, "%s%d%s%d\0", "BB_tpc_11_b",
72576bd547bSAdrian Chadd      *     chain_num, ".olpc_gain_delta_", chain_num);
72676bd547bSAdrian Chadd      */
72776bd547bSAdrian Chadd     /*field_read(field_name, &olpc_gain_delta_tmp);*/
72876bd547bSAdrian Chadd 
72976bd547bSAdrian Chadd 
73076bd547bSAdrian Chadd     if (chain_num == 0) {
73176bd547bSAdrian Chadd         olpc_gain_delta_tmp =
73276bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_11_B0,
73376bd547bSAdrian Chadd             AR_PHY_TPC_11_B0_OLPC_GAIN_DELTA_0);
73476bd547bSAdrian Chadd         cl_gain_mod = OS_REG_READ_FIELD_ALT(ah, AR_PHY_CL_TAB_0,
73576bd547bSAdrian Chadd             AR_PHY_CL_TAB_0_CL_GAIN_MOD);
73676bd547bSAdrian Chadd     } else if (chain_num == 1) {
73776bd547bSAdrian Chadd         if (!AR_SREV_POSEIDON(ah)) {
73876bd547bSAdrian Chadd             olpc_gain_delta_tmp =
73976bd547bSAdrian Chadd                 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_11_B1,
74076bd547bSAdrian Chadd                 AR_PHY_TPC_11_B1_OLPC_GAIN_DELTA_1);
74176bd547bSAdrian Chadd             cl_gain_mod = OS_REG_READ_FIELD_ALT(ah, AR_PHY_CL_TAB_1,
74276bd547bSAdrian Chadd                 AR_PHY_CL_TAB_1_CL_GAIN_MOD);
74376bd547bSAdrian Chadd         }
74476bd547bSAdrian Chadd     } else if (chain_num == 2) {
74576bd547bSAdrian Chadd         if (!AR_SREV_POSEIDON(ah)) {
74676bd547bSAdrian Chadd             olpc_gain_delta_tmp =
74776bd547bSAdrian Chadd                 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_11_B2,
74876bd547bSAdrian Chadd                 AR_PHY_TPC_11_B2_OLPC_GAIN_DELTA_2);
74976bd547bSAdrian Chadd             cl_gain_mod = OS_REG_READ_FIELD_ALT(ah, AR_PHY_CL_TAB_2,
75076bd547bSAdrian Chadd                 AR_PHY_CL_TAB_2_CL_GAIN_MOD);
75176bd547bSAdrian Chadd         }
75276bd547bSAdrian Chadd     } else {
75376bd547bSAdrian Chadd         /* invalid chain_num */
75476bd547bSAdrian Chadd     }
75576bd547bSAdrian Chadd 
75676bd547bSAdrian Chadd     if (olpc_gain_delta_tmp < 128) {
75776bd547bSAdrian Chadd         olpc_gain_delta = olpc_gain_delta_tmp;
75876bd547bSAdrian Chadd     } else {
75976bd547bSAdrian Chadd         olpc_gain_delta = olpc_gain_delta_tmp - 256;
76076bd547bSAdrian Chadd     }
76176bd547bSAdrian Chadd 
76276bd547bSAdrian Chadd     thermal_gain_corr =
76376bd547bSAdrian Chadd         (int) (alpha_therm * (latest_therm_value - therm_cal_value) +
76476bd547bSAdrian Chadd         128) >> 8;
76576bd547bSAdrian Chadd     voltage_gain_corr =
76676bd547bSAdrian Chadd         (int) (alpha_volt * (latest_volt_value - volt_cal_value) + 64) >> 7;
76776bd547bSAdrian Chadd     desired_gain =
76876bd547bSAdrian Chadd         target_power - olpc_gain_delta - thermal_gain_corr -
76976bd547bSAdrian Chadd         voltage_gain_corr + desired_scale + cl_gain_mod;
77076bd547bSAdrian Chadd     /*
77176bd547bSAdrian Chadd      * printf(
77276bd547bSAdrian Chadd      *     "olpc_gain_delta %d, desired_gain %d\n",
77376bd547bSAdrian Chadd      *     olpc_gain_delta, desired_gain);
77476bd547bSAdrian Chadd      */
77576bd547bSAdrian Chadd #if 0
77676bd547bSAdrian Chadd     ath_hal_printf(ah,
77776bd547bSAdrian Chadd         "+++ target_power %d olpc_gain_delta %d, cl_gain_mod %d,"
77876bd547bSAdrian Chadd         "thermal_gain_corr %d  voltage_gain_corr %d desired_scale %d"
77976bd547bSAdrian Chadd         "desired_gain %d\n",
78076bd547bSAdrian Chadd         target_power, olpc_gain_delta, cl_gain_mod, thermal_gain_corr,
78176bd547bSAdrian Chadd         voltage_gain_corr,
78276bd547bSAdrian Chadd         desired_scale, desired_gain);
78376bd547bSAdrian Chadd #endif
78476bd547bSAdrian Chadd     return (unsigned int) desired_gain;
78576bd547bSAdrian Chadd }
78676bd547bSAdrian Chadd 
ar9300_tx_force_gain(struct ath_hal * ah,unsigned int gain_index)78776bd547bSAdrian Chadd static void ar9300_tx_force_gain(struct ath_hal *ah, unsigned int gain_index)
78876bd547bSAdrian Chadd {
78976bd547bSAdrian Chadd     int selected_gain_entry, txbb1dbgain, txbb6dbgain, txmxrgain;
79076bd547bSAdrian Chadd     int padrvgn_a, padrvgn_b, padrvgn_c, padrvgn_d;
79176bd547bSAdrian Chadd     u_int32_t *gain_table_entries = AH9300(ah)->paprd_gain_table_entries;
79276bd547bSAdrian Chadd 
79376bd547bSAdrian Chadd     /*u_int32_t *gain_vs_table_index = ah->paprd_gain_table_index;*/
79476bd547bSAdrian Chadd     selected_gain_entry = gain_table_entries[gain_index];
79576bd547bSAdrian Chadd     txbb1dbgain = selected_gain_entry & 0x7;
79676bd547bSAdrian Chadd     txbb6dbgain = (selected_gain_entry >> 3) & 0x3;
79776bd547bSAdrian Chadd     txmxrgain = (selected_gain_entry >> 5) & 0xf;
79876bd547bSAdrian Chadd     padrvgn_a = (selected_gain_entry >> 9) & 0xf;
79976bd547bSAdrian Chadd     padrvgn_b = (selected_gain_entry >> 13) & 0xf;
80076bd547bSAdrian Chadd     padrvgn_c = (selected_gain_entry >> 17) & 0xf;
80176bd547bSAdrian Chadd     padrvgn_d = (selected_gain_entry >> 21) & 0x3;
80276bd547bSAdrian Chadd 
80376bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
80476bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_TXBB1DBGAIN, txbb1dbgain);
80576bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
80676bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_TXBB6DBGAIN, txbb6dbgain);
80776bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
80876bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_TXMXRGAIN, txmxrgain);
80976bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
81076bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGNA, padrvgn_a);
81176bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
81276bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGNB, padrvgn_b);
81376bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
81476bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGNC, padrvgn_c);
81576bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
81676bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGND, padrvgn_d);
81776bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
81876bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_ENABLE_PAL, 0);
81976bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
82076bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCE_TX_GAIN, 0);
82176bd547bSAdrian Chadd 
82276bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TPC_1, AR_PHY_TPC_1_FORCED_DAC_GAIN, 0);
82376bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TPC_1, AR_PHY_TPC_1_FORCE_DAC_GAIN, 0);
82476bd547bSAdrian Chadd }
82576bd547bSAdrian Chadd 
82676bd547bSAdrian Chadd #define HAL_DEBUG_PAPRD HAL_DEBUG_CALIBRATE  /* driver: conditionally print */
82776bd547bSAdrian Chadd 
82876bd547bSAdrian Chadd #if defined(ART_PAPRD_DEBUG) || defined(AH_DEBUG)
ar9300_paprd_debug_print(struct ath_hal * ah)82976bd547bSAdrian Chadd static void ar9300_paprd_debug_print(struct ath_hal *ah)
83076bd547bSAdrian Chadd {
83176bd547bSAdrian Chadd     int temp;
83276bd547bSAdrian Chadd     int txbb1dbgain, txbb6dbgain, txmxrgain;
83376bd547bSAdrian Chadd     int padrvgn_a, padrvgn_b, padrvgn_c, padrvgn_d;
83476bd547bSAdrian Chadd 
83576bd547bSAdrian Chadd     if (AR_SREV_POSEIDON(ah)) {
83676bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl1.cf_paprd_lb_skip", &temp);*/
83776bd547bSAdrian Chadd         temp =
83876bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON,
83976bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_SKIP);
84076bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
84176bd547bSAdrian Chadd             "BB_paprd_trainer_cntl1.cf_paprd_lb_skip=0x%x\n", temp);
84276bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl1.cf_paprd_lb_enable", &temp);*/
84376bd547bSAdrian Chadd         temp =
84476bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON,
84576bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_ENABLE);
84676bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
84776bd547bSAdrian Chadd             "BB_paprd_trainer_cntl1.cf_paprd_lb_enable=0x%x\n", temp);
84876bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl1.cf_paprd_tx_gain_force", &temp);*/
84976bd547bSAdrian Chadd         temp =
85076bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON,
85176bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_TX_GAIN_FORCE);
85276bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
85376bd547bSAdrian Chadd             "BB_paprd_trainer_cntl1.cf_paprd_tx_gain_force=0x%x\n", temp);
85476bd547bSAdrian Chadd         /*
85576bd547bSAdrian Chadd          * field_read(
85676bd547bSAdrian Chadd          *     "BB_paprd_trainer_cntl1.cf_paprd_rx_bb_gain_force", &temp);
85776bd547bSAdrian Chadd          */
85876bd547bSAdrian Chadd         temp =
85976bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON,
86076bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_RX_BB_GAIN_FORCE);
86176bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
86276bd547bSAdrian Chadd             "BB_paprd_trainer_cntl1.cf_paprd_rx_bb_gain_force=0x%x\n", temp);
86376bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl1.cf_paprd_iqcorr_enable", &temp);*/
86476bd547bSAdrian Chadd         temp =
86576bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON,
86676bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_IQCORR_ENABLE);
86776bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
86876bd547bSAdrian Chadd             "BB_paprd_trainer_cntl1.cf_paprd_iqcorr_enable=0x%x\n", temp);
86976bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl1.cf_paprd_agc2_settling", &temp);*/
87076bd547bSAdrian Chadd         temp =
87176bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON,
87276bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_AGC2_SETTLING);
87376bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
87476bd547bSAdrian Chadd             "BB_paprd_trainer_cntl1.cf_paprd_agc2_settling=0x%x\n", temp);
87576bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl1.cf_paprd_train_enable", &temp);*/
87676bd547bSAdrian Chadd         temp =
87776bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON,
87876bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_CF_PAPRD_TRAIN_ENABLE);
87976bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
88076bd547bSAdrian Chadd             "BB_paprd_trainer_cntl1.cf_paprd_train_enable=0x%x\n", temp);
88176bd547bSAdrian Chadd         /*
88276bd547bSAdrian Chadd          * field_read("BB_paprd_trainer_cntl2.cf_paprd_init_rx_bb_gain", &temp);
88376bd547bSAdrian Chadd          */
88476bd547bSAdrian Chadd         temp =
88576bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL2_POSEIDON,
88676bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL2_CF_PAPRD_INIT_RX_BB_GAIN);
88776bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
88876bd547bSAdrian Chadd             "BB_paprd_trainer_cntl2.cf_paprd_init_rx_bb_gain=0x%x\n", temp);
88976bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl3.cf_paprd_fine_corr_len", &temp);*/
89076bd547bSAdrian Chadd         temp =
89176bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
89276bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_FINE_CORR_LEN);
89376bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
89476bd547bSAdrian Chadd             "BB_paprd_trainer_cntl3.cf_paprd_fine_corr_len=0x%x\n", temp);
89576bd547bSAdrian Chadd         /*
89676bd547bSAdrian Chadd          * field_read("BB_paprd_trainer_cntl3.cf_paprd_coarse_corr_len", &temp);
89776bd547bSAdrian Chadd          */
89876bd547bSAdrian Chadd         temp =
89976bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
90076bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_COARSE_CORR_LEN);
90176bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
90276bd547bSAdrian Chadd             "BB_paprd_trainer_cntl3.cf_paprd_coarse_corr_len=0x%x\n", temp);
90376bd547bSAdrian Chadd         /*
90476bd547bSAdrian Chadd          * field_read("BB_paprd_trainer_cntl3.cf_paprd_num_corr_stages", &temp);
90576bd547bSAdrian Chadd          */
90676bd547bSAdrian Chadd         temp =
90776bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
90876bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_NUM_CORR_STAGES);
90976bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
91076bd547bSAdrian Chadd             "BB_paprd_trainer_cntl3.cf_paprd_num_corr_stages=0x%x\n", temp);
91176bd547bSAdrian Chadd         /*
91276bd547bSAdrian Chadd          * field_read(
91376bd547bSAdrian Chadd          *     "BB_paprd_trainer_cntl3.cf_paprd_min_loopback_del", &temp);
91476bd547bSAdrian Chadd          */
91576bd547bSAdrian Chadd         temp =
91676bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
91776bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_MIN_LOOPBACK_DEL);
91876bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
91976bd547bSAdrian Chadd             "BB_paprd_trainer_cntl3.cf_paprd_min_loopback_del=0x%x\n", temp);
92076bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl3.cf_paprd_quick_drop", &temp);*/
92176bd547bSAdrian Chadd         temp =
92276bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
92376bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP);
92476bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
92576bd547bSAdrian Chadd             "BB_paprd_trainer_cntl3.cf_paprd_quick_drop=0x%x\n", temp);
92676bd547bSAdrian Chadd         /*
92776bd547bSAdrian Chadd          * field_read(
92876bd547bSAdrian Chadd          *     "BB_paprd_trainer_cntl3.cf_paprd_adc_desired_size", &temp);
92976bd547bSAdrian Chadd          */
93076bd547bSAdrian Chadd         temp =
93176bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
93276bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_ADC_DESIRED_SIZE);
93376bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
93476bd547bSAdrian Chadd             "BB_paprd_trainer_cntl3.cf_paprd_adc_desired_size=0x%x\n", temp);
93576bd547bSAdrian Chadd         /*
93676bd547bSAdrian Chadd          * field_read("BB_paprd_trainer_cntl3.cf_paprd_bbtxmix_disable", &temp);
93776bd547bSAdrian Chadd          */
93876bd547bSAdrian Chadd         temp =
93976bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
94076bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_BBTXMIX_DISABLE);
94176bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
94276bd547bSAdrian Chadd             "BB_paprd_trainer_cntl3.cf_paprd_bbtxmix_disable=0x%x\n", temp);
94376bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl4.cf_paprd_safety_delta", &temp);*/
94476bd547bSAdrian Chadd         temp =
94576bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4_POSEIDON,
94676bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_SAFETY_DELTA);
94776bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
94876bd547bSAdrian Chadd             "BB_paprd_trainer_cntl4.cf_paprd_safety_delta=0x%x\n", temp);
94976bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl4.cf_paprd_min_corr", &temp);*/
95076bd547bSAdrian Chadd         temp =
95176bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4_POSEIDON,
95276bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_MIN_CORR);
95376bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
95476bd547bSAdrian Chadd             "BB_paprd_trainer_cntl4.cf_paprd_min_corr=0x%x\n", temp);
95576bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat1.paprd_agc2_pwr", &temp);*/
95676bd547bSAdrian Chadd         temp =
95776bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON,
95876bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_AGC2_PWR);
95976bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
96076bd547bSAdrian Chadd             "    paprd_agc2_pwr              = 0x%02x\n", temp);
96176bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat1.paprd_rx_gain_idx", &temp);*/
96276bd547bSAdrian Chadd         temp =
96376bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON,
96476bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_RX_GAIN_IDX);
96576bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
96676bd547bSAdrian Chadd             "    paprd_rx_gain_idx           = 0x%02x\n", temp);
96776bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat1.paprd_train_active", &temp);*/
96876bd547bSAdrian Chadd         temp =
96976bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON,
97076bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_ACTIVE);
97176bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
97276bd547bSAdrian Chadd             "    paprd_train_active          = 0x%08x\n", temp);
97376bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat1.paprd_corr_err", &temp);*/
97476bd547bSAdrian Chadd         temp =
97576bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON,
97676bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_CORR_ERR);
97776bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
97876bd547bSAdrian Chadd             "    paprd_corr_err              = 0x%08x\n", temp);
97976bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat1.paprd_train_incomplete", &temp);*/
98076bd547bSAdrian Chadd         temp =
98176bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON,
98276bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_INCOMPLETE);
98376bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
98476bd547bSAdrian Chadd             "    paprd_train_incomplete      = 0x%08x\n", temp);
98576bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat1.paprd_train_done", &temp);*/
98676bd547bSAdrian Chadd         temp =
98776bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON,
98876bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE);
98976bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
99076bd547bSAdrian Chadd             "    paprd_train_done            = 0x%08x\n", temp);
99176bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat2.paprd_fine_idx", &temp);*/
99276bd547bSAdrian Chadd         temp =
99376bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT2_POSEIDON,
99476bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT2_PAPRD_FINE_IDX);
99576bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
99676bd547bSAdrian Chadd             "    paprd_fine_idx              = 0x%08x\n", temp);
99776bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat2.paprd_coarse_idx", &temp);*/
99876bd547bSAdrian Chadd         temp =
99976bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT2_POSEIDON,
100076bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT2_PAPRD_COARSE_IDX);
100176bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
100276bd547bSAdrian Chadd             "    paprd_coarse_idx            = 0x%08x\n", temp);
100376bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat2.paprd_fine_val", &temp);*/
100476bd547bSAdrian Chadd         temp =
100576bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT2_POSEIDON,
100676bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT2_PAPRD_FINE_VAL);
100776bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
100876bd547bSAdrian Chadd             "    paprd_fine_val              = 0x%08x\n", temp);
100976bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat3.paprd_train_samples_cnt", &temp);*/
101076bd547bSAdrian Chadd         temp =
101176bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT3_POSEIDON,
101276bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT3_PAPRD_TRAIN_SAMPLES_CNT);
101376bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
101476bd547bSAdrian Chadd             "    paprd_train_samples_cnt     = 0x%08x\n", temp);
101576bd547bSAdrian Chadd     } else {
101676bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl1.cf_paprd_lb_skip", &temp);*/
101776bd547bSAdrian Chadd         temp =
101876bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1,
101976bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_SKIP);
102076bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
102176bd547bSAdrian Chadd             "BB_paprd_trainer_cntl1.cf_paprd_lb_skip=0x%x\n", temp);
102276bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl1.cf_paprd_lb_enable", &temp);*/
102376bd547bSAdrian Chadd         temp =
102476bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1,
102576bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_ENABLE);
102676bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
102776bd547bSAdrian Chadd             "BB_paprd_trainer_cntl1.cf_paprd_lb_enable=0x%x\n", temp);
102876bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl1.cf_paprd_tx_gain_force", &temp);*/
102976bd547bSAdrian Chadd         temp =
103076bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1,
103176bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_TX_GAIN_FORCE);
103276bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
103376bd547bSAdrian Chadd             "BB_paprd_trainer_cntl1.cf_paprd_tx_gain_force=0x%x\n", temp);
103476bd547bSAdrian Chadd         /*
103576bd547bSAdrian Chadd          * field_read(
103676bd547bSAdrian Chadd          *     "BB_paprd_trainer_cntl1.cf_paprd_rx_bb_gain_force", &temp);
103776bd547bSAdrian Chadd          */
103876bd547bSAdrian Chadd         temp =
103976bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1,
104076bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_RX_BB_GAIN_FORCE);
104176bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
104276bd547bSAdrian Chadd             "BB_paprd_trainer_cntl1.cf_paprd_rx_bb_gain_force=0x%x\n", temp);
104376bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl1.cf_paprd_iqcorr_enable", &temp);*/
104476bd547bSAdrian Chadd         temp =
104576bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1,
104676bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_IQCORR_ENABLE);
104776bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
104876bd547bSAdrian Chadd             "BB_paprd_trainer_cntl1.cf_paprd_iqcorr_enable=0x%x\n", temp);
104976bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl1.cf_paprd_agc2_settling", &temp);*/
105076bd547bSAdrian Chadd         temp =
105176bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1,
105276bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_AGC2_SETTLING);
105376bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
105476bd547bSAdrian Chadd             "BB_paprd_trainer_cntl1.cf_paprd_agc2_settling=0x%x\n", temp);
105576bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl1.cf_paprd_train_enable", &temp);*/
105676bd547bSAdrian Chadd         temp =
105776bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1,
105876bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL1_CF_CF_PAPRD_TRAIN_ENABLE);
105976bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
106076bd547bSAdrian Chadd             "BB_paprd_trainer_cntl1.cf_paprd_train_enable=0x%x\n", temp);
106176bd547bSAdrian Chadd         /*
106276bd547bSAdrian Chadd          * field_read("BB_paprd_trainer_cntl2.cf_paprd_init_rx_bb_gain", &temp);
106376bd547bSAdrian Chadd          */
106476bd547bSAdrian Chadd         temp =
106576bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL2,
106676bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL2_CF_PAPRD_INIT_RX_BB_GAIN);
106776bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
106876bd547bSAdrian Chadd             "BB_paprd_trainer_cntl2.cf_paprd_init_rx_bb_gain=0x%x\n", temp);
106976bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl3.cf_paprd_fine_corr_len", &temp);*/
107076bd547bSAdrian Chadd         temp =
107176bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
107276bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_FINE_CORR_LEN);
107376bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
107476bd547bSAdrian Chadd             "BB_paprd_trainer_cntl3.cf_paprd_fine_corr_len=0x%x\n", temp);
107576bd547bSAdrian Chadd         /*
107676bd547bSAdrian Chadd          * field_read("BB_paprd_trainer_cntl3.cf_paprd_coarse_corr_len", &temp);
107776bd547bSAdrian Chadd          */
107876bd547bSAdrian Chadd         temp =
107976bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
108076bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_COARSE_CORR_LEN);
108176bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
108276bd547bSAdrian Chadd             "BB_paprd_trainer_cntl3.cf_paprd_coarse_corr_len=0x%x\n", temp);
108376bd547bSAdrian Chadd         /*
108476bd547bSAdrian Chadd          * field_read("BB_paprd_trainer_cntl3.cf_paprd_num_corr_stages", &temp);
108576bd547bSAdrian Chadd          */
108676bd547bSAdrian Chadd         temp =
108776bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
108876bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_NUM_CORR_STAGES);
108976bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
109076bd547bSAdrian Chadd             "BB_paprd_trainer_cntl3.cf_paprd_num_corr_stages=0x%x\n", temp);
109176bd547bSAdrian Chadd         /*
109276bd547bSAdrian Chadd          * field_read(
109376bd547bSAdrian Chadd          *     "BB_paprd_trainer_cntl3.cf_paprd_min_loopback_del", &temp);
109476bd547bSAdrian Chadd          */
109576bd547bSAdrian Chadd         temp =
109676bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
109776bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_MIN_LOOPBACK_DEL);
109876bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
109976bd547bSAdrian Chadd             "BB_paprd_trainer_cntl3.cf_paprd_min_loopback_del=0x%x\n", temp);
110076bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl3.cf_paprd_quick_drop", &temp);*/
110176bd547bSAdrian Chadd         temp =
110276bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
110376bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP);
110476bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
110576bd547bSAdrian Chadd             "BB_paprd_trainer_cntl3.cf_paprd_quick_drop=0x%x\n", temp);
110676bd547bSAdrian Chadd         /*
110776bd547bSAdrian Chadd          * field_read(
110876bd547bSAdrian Chadd          *     "BB_paprd_trainer_cntl3.cf_paprd_adc_desired_size", &temp);
110976bd547bSAdrian Chadd          */
111076bd547bSAdrian Chadd         temp =
111176bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
111276bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_ADC_DESIRED_SIZE);
111376bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
111476bd547bSAdrian Chadd             "BB_paprd_trainer_cntl3.cf_paprd_adc_desired_size=0x%x\n", temp);
111576bd547bSAdrian Chadd         /*
111676bd547bSAdrian Chadd          * field_read(
111776bd547bSAdrian Chadd          *     "BB_paprd_trainer_cntl3.cf_paprd_bbtxmix_disable", &temp);
111876bd547bSAdrian Chadd          */
111976bd547bSAdrian Chadd         temp =
112076bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
112176bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_BBTXMIX_DISABLE);
112276bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
112376bd547bSAdrian Chadd             "BB_paprd_trainer_cntl3.cf_paprd_bbtxmix_disable=0x%x\n", temp);
112476bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl4.cf_paprd_safety_delta", &temp);*/
112576bd547bSAdrian Chadd         temp =
112676bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4,
112776bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_SAFETY_DELTA);
112876bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
112976bd547bSAdrian Chadd             "BB_paprd_trainer_cntl4.cf_paprd_safety_delta=0x%x\n", temp);
113076bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_cntl4.cf_paprd_min_corr", &temp);*/
113176bd547bSAdrian Chadd         temp =
113276bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4,
113376bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_MIN_CORR);
113476bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
113576bd547bSAdrian Chadd             "BB_paprd_trainer_cntl4.cf_paprd_min_corr=0x%x\n", temp);
113676bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat1.paprd_agc2_pwr", &temp);*/
113776bd547bSAdrian Chadd         temp =
113876bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1,
113976bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_AGC2_PWR);
114076bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
114176bd547bSAdrian Chadd             "    paprd_agc2_pwr              = 0x%02x\n", temp);
114276bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat1.paprd_rx_gain_idx", &temp);*/
114376bd547bSAdrian Chadd         temp =
114476bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1,
114576bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_RX_GAIN_IDX);
114676bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
114776bd547bSAdrian Chadd             "    paprd_rx_gain_idx           = 0x%02x\n", temp);
114876bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat1.paprd_train_active", &temp);*/
114976bd547bSAdrian Chadd         temp =
115076bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1,
115176bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_ACTIVE);
115276bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
115376bd547bSAdrian Chadd             "    paprd_train_active          = 0x%08x\n", temp);
115476bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat1.paprd_corr_err", &temp);*/
115576bd547bSAdrian Chadd         temp =
115676bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1,
115776bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_CORR_ERR);
115876bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
115976bd547bSAdrian Chadd             "    paprd_corr_err              = 0x%08x\n", temp);
116076bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat1.paprd_train_incomplete", &temp);*/
116176bd547bSAdrian Chadd         temp =
116276bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1,
116376bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_INCOMPLETE);
116476bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
116576bd547bSAdrian Chadd             "    paprd_train_incomplete      = 0x%08x\n", temp);
116676bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat1.paprd_train_done", &temp);*/
116776bd547bSAdrian Chadd         temp =
116876bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1,
116976bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE);
117076bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
117176bd547bSAdrian Chadd             "    paprd_train_done            = 0x%08x\n", temp);
117276bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat2.paprd_fine_idx", &temp);*/
117376bd547bSAdrian Chadd         temp =
117476bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT2,
117576bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT2_PAPRD_FINE_IDX);
117676bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
117776bd547bSAdrian Chadd             "    paprd_fine_idx              = 0x%08x\n", temp);
117876bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat2.paprd_coarse_idx", &temp);*/
117976bd547bSAdrian Chadd         temp =
118076bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT2,
118176bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT2_PAPRD_COARSE_IDX);
118276bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
118376bd547bSAdrian Chadd             "    paprd_coarse_idx            = 0x%08x\n", temp);
118476bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat2.paprd_fine_val", &temp);*/
118576bd547bSAdrian Chadd         temp =
118676bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT2,
118776bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT2_PAPRD_FINE_VAL);
118876bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
118976bd547bSAdrian Chadd             "    paprd_fine_val              = 0x%08x\n", temp);
119076bd547bSAdrian Chadd         /*field_read("BB_paprd_trainer_stat3.paprd_train_samples_cnt", &temp);*/
119176bd547bSAdrian Chadd         temp =
119276bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT3,
119376bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT3_PAPRD_TRAIN_SAMPLES_CNT);
119476bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
119576bd547bSAdrian Chadd             "    paprd_train_samples_cnt     = 0x%08x\n", temp);
119676bd547bSAdrian Chadd     }
119776bd547bSAdrian Chadd 
119876bd547bSAdrian Chadd     /*field_read("BB_tpc_1.force_dac_gain", &temp);*/
119976bd547bSAdrian Chadd     temp =
120076bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_1, AR_PHY_TPC_1_FORCE_DAC_GAIN);
120176bd547bSAdrian Chadd     HALDEBUG(ah, HAL_DEBUG_PAPRD, "    dac_gain_forced     = 0x%08x\n",
120276bd547bSAdrian Chadd         temp);
120376bd547bSAdrian Chadd     /*field_read("BB_tpc_1.forced_dac_gain", &temp);*/
120476bd547bSAdrian Chadd     temp =
120576bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_1, AR_PHY_TPC_1_FORCED_DAC_GAIN);
120676bd547bSAdrian Chadd     HALDEBUG(ah, HAL_DEBUG_PAPRD, "    forced_dac_gain     = 0x%08x\n",
120776bd547bSAdrian Chadd         temp);
120876bd547bSAdrian Chadd 
120976bd547bSAdrian Chadd     /*field_read("BB_paprd_ctrl0_b0.paprd_enable_0", &temp);*/
121076bd547bSAdrian Chadd     temp =
121176bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0,
121276bd547bSAdrian Chadd         AR_PHY_PAPRD_CTRL0_B0_PAPRD_ENABLE_0);
121376bd547bSAdrian Chadd     HALDEBUG(ah, HAL_DEBUG_PAPRD,
121476bd547bSAdrian Chadd         "    BB_paprd_ctrl0_b0.paprd_enable_0     = 0x%08x\n", temp);
121576bd547bSAdrian Chadd     if (!AR_SREV_POSEIDON(ah)) {
121676bd547bSAdrian Chadd         /*field_read("BB_paprd_ctrl0_b1.paprd_enable_1", &temp);*/
121776bd547bSAdrian Chadd         temp =
121876bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1,
121976bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL0_B1_PAPRD_ENABLE_1);
122076bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_PAPRD,
122176bd547bSAdrian Chadd             "    BB_paprd_ctrl0_b1.paprd_enable_1     = 0x%08x\n", temp);
122276bd547bSAdrian Chadd         if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN2_MASK) {
122376bd547bSAdrian Chadd             /*field_read("BB_paprd_ctrl0_b2.paprd_enable_2", &temp);*/
122476bd547bSAdrian Chadd             temp =
122576bd547bSAdrian Chadd                 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2,
122676bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL0_B2_PAPRD_ENABLE_2);
122776bd547bSAdrian Chadd             HALDEBUG(ah, HAL_DEBUG_PAPRD,
122876bd547bSAdrian Chadd                 "    BB_paprd_ctrl0_b2.paprd_enable_2     = 0x%08x\n", temp);
122976bd547bSAdrian Chadd         }
123076bd547bSAdrian Chadd     }
123176bd547bSAdrian Chadd 
123276bd547bSAdrian Chadd     /*field_read("BB_tx_forced_gain.forced_txbb1dbgain", &txbb1dbgain);*/
123376bd547bSAdrian Chadd     txbb1dbgain =
123476bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
123576bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_TXBB1DBGAIN);
123676bd547bSAdrian Chadd     /*field_read("BB_tx_forced_gain.forced_txbb6dbgain", &txbb6dbgain);*/
123776bd547bSAdrian Chadd     txbb6dbgain =
123876bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
123976bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_TXBB6DBGAIN);
124076bd547bSAdrian Chadd     /*field_read("BB_tx_forced_gain.forced_txmxrgain", &txmxrgain);*/
124176bd547bSAdrian Chadd     txmxrgain =
124276bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
124376bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_TXMXRGAIN);
124476bd547bSAdrian Chadd     /*field_read("BB_tx_forced_gain.forced_padrvgn_a", &padrvgn_a);*/
124576bd547bSAdrian Chadd     padrvgn_a =
124676bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
124776bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGNA);
124876bd547bSAdrian Chadd     /*field_read("BB_tx_forced_gain.forced_padrvgn_b", &padrvgn_b);*/
124976bd547bSAdrian Chadd     padrvgn_b =
125076bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
125176bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGNB);
125276bd547bSAdrian Chadd     /*field_read("BB_tx_forced_gain.forced_padrvgn_c", &padrvgn_c);*/
125376bd547bSAdrian Chadd     padrvgn_c =
125476bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
125576bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGNC);
125676bd547bSAdrian Chadd     /*field_read("BB_tx_forced_gain.forced_padrvgn_d", &padrvgn_d);*/
125776bd547bSAdrian Chadd     padrvgn_d =
125876bd547bSAdrian Chadd         OS_REG_READ_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN,
125976bd547bSAdrian Chadd         AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGND);
126076bd547bSAdrian Chadd 
126176bd547bSAdrian Chadd     HALDEBUG(ah, HAL_DEBUG_PAPRD,
126276bd547bSAdrian Chadd         "txbb1dbgain=0x%x, txbb6dbgain=0x%x, txmxrgain=0x%x\n",
126376bd547bSAdrian Chadd         txbb1dbgain, txbb6dbgain, txmxrgain);
126476bd547bSAdrian Chadd     HALDEBUG(ah, HAL_DEBUG_PAPRD,
126576bd547bSAdrian Chadd         "padrvgn_a=0x%x, padrvgn_b=0x%x\n", padrvgn_a, padrvgn_b);
126676bd547bSAdrian Chadd     HALDEBUG(ah, HAL_DEBUG_PAPRD,
126776bd547bSAdrian Chadd         "padrvgn_c=0x%x, padrvgn_d=0x%x\n", padrvgn_c, padrvgn_d);
126876bd547bSAdrian Chadd }
126976bd547bSAdrian Chadd #else
127076bd547bSAdrian Chadd #define ar9300_paprd_debug_print(ah) /* dummy macro */
127176bd547bSAdrian Chadd #endif /* defined(ART_PAPRD_DEBUG) || defined(AH_DEBUG) */
127276bd547bSAdrian Chadd 
ar9300_create_pa_curve(struct ath_hal * ah,u_int32_t * pa_table,u_int32_t * small_signal_gain,int * pa_in)127376bd547bSAdrian Chadd static int ar9300_create_pa_curve(struct ath_hal *ah, u_int32_t * pa_table,
127476bd547bSAdrian Chadd     u_int32_t * small_signal_gain, int * pa_in)
127576bd547bSAdrian Chadd {
127676bd547bSAdrian Chadd     int i;
127776bd547bSAdrian Chadd     int status;
127876bd547bSAdrian Chadd     /*char field_name[100];*/
127976bd547bSAdrian Chadd     u_int32_t paprd_train_data_l[48], paprd_train_data_u[48];
128076bd547bSAdrian Chadd     u_int32_t reg;
128176bd547bSAdrian Chadd 
128276bd547bSAdrian Chadd     ar9300_paprd_debug_print(ah);
128376bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_CHAN_INFO_MEMORY,
128476bd547bSAdrian Chadd         AR_PHY_CHAN_INFO_MEMORY_CHANINFOMEM_S2_READ, 0);
128576bd547bSAdrian Chadd     reg = AR_PHY_CHAN_INFO_TAB_0;
128676bd547bSAdrian Chadd 
128776bd547bSAdrian Chadd     for (i = 0; i < 48; i++) {
128876bd547bSAdrian Chadd         /*
128976bd547bSAdrian Chadd          * sprintf(
129076bd547bSAdrian Chadd          *     field_name, "%s%d%s\0", "BB_chan_info_chan_tab_b0[",
129176bd547bSAdrian Chadd          *     i, "].chaninfo_word");
129276bd547bSAdrian Chadd          */
129376bd547bSAdrian Chadd         /*field_read(field_name, &paprd_train_data_l[i]);*/
129476bd547bSAdrian Chadd         paprd_train_data_l[i] = OS_REG_READ(ah, reg);
129576bd547bSAdrian Chadd         reg = reg + 4;
129676bd547bSAdrian Chadd     }
129776bd547bSAdrian Chadd 
129876bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_CHAN_INFO_MEMORY,
129976bd547bSAdrian Chadd         AR_PHY_CHAN_INFO_MEMORY_CHANINFOMEM_S2_READ, 1);
130076bd547bSAdrian Chadd     reg = AR_PHY_CHAN_INFO_TAB_0;
130176bd547bSAdrian Chadd 
130276bd547bSAdrian Chadd     for (i = 0; i < 48; i++) {
130376bd547bSAdrian Chadd         /*
130476bd547bSAdrian Chadd          * sprintf(
130576bd547bSAdrian Chadd          *     field_name, "%s%d%s\0", "BB_chan_info_chan_tab_b0[",
130676bd547bSAdrian Chadd          *     i, "].chaninfo_word");
130776bd547bSAdrian Chadd          */
130876bd547bSAdrian Chadd         /*field_read(field_name, &paprd_train_data_u[i]);*/
130976bd547bSAdrian Chadd         paprd_train_data_u[i] = OS_REG_READ(ah, reg);
131076bd547bSAdrian Chadd         reg = reg + 4;
131176bd547bSAdrian Chadd     }
131276bd547bSAdrian Chadd 
131376bd547bSAdrian Chadd     /*
131476bd547bSAdrian Chadd      * for(i=0; i<48; i++)
131576bd547bSAdrian Chadd      *     ath_hal_printf(
131676bd547bSAdrian Chadd      *         ah, "%08x%08x\n", paprd_train_data_u[i], paprd_train_data_l[i]);
131776bd547bSAdrian Chadd      */
131876bd547bSAdrian Chadd     status = 0;
131976bd547bSAdrian Chadd     if (create_pa_curve(
132076bd547bSAdrian Chadd             paprd_train_data_l, paprd_train_data_u,
132176bd547bSAdrian Chadd             pa_table, small_signal_gain, pa_in) ==
132276bd547bSAdrian Chadd             AH_FALSE)
132376bd547bSAdrian Chadd     {
132476bd547bSAdrian Chadd         status = -2;
132576bd547bSAdrian Chadd     }
132676bd547bSAdrian Chadd     /* Clear the training done bit */
132776bd547bSAdrian Chadd     if (AR_SREV_POSEIDON(ah)) {
132876bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON,
132976bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE, 0);
133076bd547bSAdrian Chadd     } else {
133176bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1,
133276bd547bSAdrian Chadd             AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE, 0);
133376bd547bSAdrian Chadd     }
133476bd547bSAdrian Chadd     return status;
133576bd547bSAdrian Chadd }
133676bd547bSAdrian Chadd 
find_expn(int num)133776bd547bSAdrian Chadd static int find_expn(int num)
133876bd547bSAdrian Chadd {
133976bd547bSAdrian Chadd     int tmp, exp;
134076bd547bSAdrian Chadd 
134176bd547bSAdrian Chadd     exp = 0;
134276bd547bSAdrian Chadd     tmp = num >> 1;
134376bd547bSAdrian Chadd 
134476bd547bSAdrian Chadd     while (tmp != 0) {
134576bd547bSAdrian Chadd         tmp = tmp >> 1;
134676bd547bSAdrian Chadd         exp++;
134776bd547bSAdrian Chadd     }
134876bd547bSAdrian Chadd 
134976bd547bSAdrian Chadd     return exp;
135076bd547bSAdrian Chadd }
135176bd547bSAdrian Chadd 
find_proper_scale(int expn,int n)135276bd547bSAdrian Chadd static int find_proper_scale(int expn, int n)
135376bd547bSAdrian Chadd {
135476bd547bSAdrian Chadd     int q_pw;
135576bd547bSAdrian Chadd 
135676bd547bSAdrian Chadd     q_pw = (expn > n) ? expn - 10 : 0;
135776bd547bSAdrian Chadd     return q_pw;
135876bd547bSAdrian Chadd }
135976bd547bSAdrian Chadd 
find_max(int * array,int length)136076bd547bSAdrian Chadd static int find_max(int *array, int length)
136176bd547bSAdrian Chadd {
136276bd547bSAdrian Chadd     int i, loc_max;
136376bd547bSAdrian Chadd 
136476bd547bSAdrian Chadd     loc_max = 0;
136576bd547bSAdrian Chadd 
136676bd547bSAdrian Chadd     for (i = 0; i < length; i++) {
136776bd547bSAdrian Chadd         if (array[i] > loc_max) {
136876bd547bSAdrian Chadd             loc_max = array[i];
136976bd547bSAdrian Chadd         }
137076bd547bSAdrian Chadd     }
137176bd547bSAdrian Chadd 
137276bd547bSAdrian Chadd     return loc_max;
137376bd547bSAdrian Chadd }
137476bd547bSAdrian Chadd 
paprd_abs(int num)137576bd547bSAdrian Chadd static int paprd_abs(int num)
137676bd547bSAdrian Chadd {
137776bd547bSAdrian Chadd     if (num < 0) {
137876bd547bSAdrian Chadd         return -num;
137976bd547bSAdrian Chadd     }
138076bd547bSAdrian Chadd     return num;
138176bd547bSAdrian Chadd }
138276bd547bSAdrian Chadd 
138376bd547bSAdrian Chadd #define NUM_BIN 23
138476bd547bSAdrian Chadd 
create_pa_curve(u_int32_t * paprd_train_data_l,u_int32_t * paprd_train_data_u,u_int32_t * pa_table,u_int32_t * g_fxp_ext,int * pa_in)138576bd547bSAdrian Chadd HAL_BOOL create_pa_curve(u_int32_t * paprd_train_data_l,
138676bd547bSAdrian Chadd     u_int32_t * paprd_train_data_u, u_int32_t * pa_table,
138776bd547bSAdrian Chadd     u_int32_t * g_fxp_ext, int *pa_in)
138876bd547bSAdrian Chadd {
138976bd547bSAdrian Chadd     unsigned int accum_cnt[NUM_BIN + 1];
139076bd547bSAdrian Chadd     unsigned int accum_tx[NUM_BIN + 1];
139176bd547bSAdrian Chadd     unsigned int accum_rx[NUM_BIN + 1];
139276bd547bSAdrian Chadd     unsigned int accum_ang[NUM_BIN + 1];
139376bd547bSAdrian Chadd     unsigned int thresh_accum_cnt;
139476bd547bSAdrian Chadd 
139576bd547bSAdrian Chadd     int max_index;
139676bd547bSAdrian Chadd     int scale_factor;
139776bd547bSAdrian Chadd 
139876bd547bSAdrian Chadd     int x_est[NUM_BIN + 1];
139976bd547bSAdrian Chadd     int y[NUM_BIN + 1];
140076bd547bSAdrian Chadd     int theta[NUM_BIN + 1];
140176bd547bSAdrian Chadd     int y_sqr[NUM_BIN + 1];
140276bd547bSAdrian Chadd     int y_quad[NUM_BIN + 1];
140376bd547bSAdrian Chadd     int theta_tilde[NUM_BIN + 1];
140476bd547bSAdrian Chadd     int pa_angle[NUM_BIN + 1];
140576bd547bSAdrian Chadd 
140676bd547bSAdrian Chadd     int b1_tmp[NUM_BIN + 1];
140776bd547bSAdrian Chadd     int b2_tmp[NUM_BIN + 1];
140876bd547bSAdrian Chadd     int b1_abs[NUM_BIN + 1];
140976bd547bSAdrian Chadd     int b2_abs[NUM_BIN + 1];
141076bd547bSAdrian Chadd 
141176bd547bSAdrian Chadd     int y_lin[NUM_BIN + 1];
141276bd547bSAdrian Chadd     int y_est[NUM_BIN + 1];
141376bd547bSAdrian Chadd     int x_est_fxp1_nonlin[NUM_BIN + 1];
141476bd547bSAdrian Chadd     int x_tilde[NUM_BIN + 1];
141576bd547bSAdrian Chadd     int x_tilde_abs[NUM_BIN + 1];
141676bd547bSAdrian Chadd 
141776bd547bSAdrian Chadd     int g_fxp;
141876bd547bSAdrian Chadd     int y_intercept;
141976bd547bSAdrian Chadd     int order_x_by_y;
142076bd547bSAdrian Chadd     int m, half_lo, half_hi;
142176bd547bSAdrian Chadd     int sum_y_sqr;
142276bd547bSAdrian Chadd     int sum_y_quad;
142376bd547bSAdrian Chadd     int q_x, q_b1, q_b2;
142476bd547bSAdrian Chadd     int beta_raw, alpha_raw, scale_b;
142576bd547bSAdrian Chadd     int q_scale_b, q_beta, q_alpha;
142676bd547bSAdrian Chadd     int alpha, beta;
142776bd547bSAdrian Chadd     int order_1, order_2;
142876bd547bSAdrian Chadd     int order1_5x, order2_3x;
142976bd547bSAdrian Chadd     int order1_5x_rem, order2_3x_rem;
143076bd547bSAdrian Chadd     int y5, y3, tmp;
143176bd547bSAdrian Chadd     int bin, idx;
143276bd547bSAdrian Chadd     int theta_low_bin = 0;
143376bd547bSAdrian Chadd 
143476bd547bSAdrian Chadd     /*
143576bd547bSAdrian Chadd      * [15:00] u16, accum_cnt[15:00]: number of samples in the bin
143676bd547bSAdrian Chadd      * [42:16] u27, accum_tx[26:00]: sum(tx amplitude) of the bin
143776bd547bSAdrian Chadd      * [63:43] u21, accum_rx[20:00]:
143876bd547bSAdrian Chadd      *     sum(rx amplitude distance to lower bin edge) of the bin
143976bd547bSAdrian Chadd      * [90:64] s27, accum_ang[26:00]: sum(angles) of the bin
144076bd547bSAdrian Chadd      */
144176bd547bSAdrian Chadd     max_index = 0;
144276bd547bSAdrian Chadd     /*
144376bd547bSAdrian Chadd      * Disregard any bin that contains less than
144476bd547bSAdrian Chadd      * or equal to 16 counts of samples
144576bd547bSAdrian Chadd      */
144676bd547bSAdrian Chadd     thresh_accum_cnt = 16;
144776bd547bSAdrian Chadd     scale_factor = 5;
144876bd547bSAdrian Chadd 
144976bd547bSAdrian Chadd     for (bin = 0; bin < NUM_BIN; bin++) {
145076bd547bSAdrian Chadd         accum_cnt[bin] = paprd_train_data_l[bin] & 0xffff;
145176bd547bSAdrian Chadd         /* lower 16 bit OR-ed  upper 11 bits */
145276bd547bSAdrian Chadd         accum_tx[bin] =
145376bd547bSAdrian Chadd             ((paprd_train_data_l[bin] >> 16) & 0xffff) |
145476bd547bSAdrian Chadd             ((paprd_train_data_u[bin] & 0x7ff) << 16);
145576bd547bSAdrian Chadd         accum_rx[bin] =
145676bd547bSAdrian Chadd             ((paprd_train_data_u[bin] >> 11) & 0x1f) |
145776bd547bSAdrian Chadd              ((paprd_train_data_l[bin + 23] & 0xffff) << 5);
145876bd547bSAdrian Chadd         accum_ang[bin] =
145976bd547bSAdrian Chadd             ((paprd_train_data_l[bin + 23] >> 16) & 0xffff) |
146076bd547bSAdrian Chadd              ((paprd_train_data_u[bin + 23] & 0x7ff) << 16);
146176bd547bSAdrian Chadd         /*
146276bd547bSAdrian Chadd          * printf(
146376bd547bSAdrian Chadd          *     "%d\t%d\t%d\t%d\n", accum_cnt[bin], accum_tx[bin],
146476bd547bSAdrian Chadd          *     accum_rx[bin], accum_ang[bin]);
146576bd547bSAdrian Chadd          */
146676bd547bSAdrian Chadd         if (accum_cnt[bin] > thresh_accum_cnt) {
146776bd547bSAdrian Chadd             /* accum_cnt[i] will be non-zero at this point */
146876bd547bSAdrian Chadd             x_est[bin + 1] =
146976bd547bSAdrian Chadd                 ((((accum_tx[bin] << scale_factor) +
147076bd547bSAdrian Chadd                     accum_cnt[bin]) / accum_cnt[bin]) + 32) >> scale_factor;
147176bd547bSAdrian Chadd             y[bin + 1] =
147276bd547bSAdrian Chadd                 (((((accum_rx[bin] << scale_factor) +
147376bd547bSAdrian Chadd                      accum_cnt[bin]) / accum_cnt[bin]) + 32) >> scale_factor) +
147476bd547bSAdrian Chadd                 (1 << scale_factor) * max_index + 16;
147576bd547bSAdrian Chadd             if (accum_ang[bin] >= (1 << 26)) {
147676bd547bSAdrian Chadd                 theta[bin + 1] =
147776bd547bSAdrian Chadd                     ((accum_ang[bin] - (1 << 27)) * (1 << scale_factor) +
147876bd547bSAdrian Chadd                     accum_cnt[bin]);
147976bd547bSAdrian Chadd                 theta[bin + 1] = theta[bin + 1] / (int) accum_cnt[bin];
148076bd547bSAdrian Chadd                 /*
148176bd547bSAdrian Chadd                  *  theta[i+1] =
148276bd547bSAdrian Chadd                  *      ((accum_ang[i] - (1 << 27)) *
148376bd547bSAdrian Chadd                  *      (1 << scale_factor) + zz) / zz;
148476bd547bSAdrian Chadd                  */
148576bd547bSAdrian Chadd             } else {
148676bd547bSAdrian Chadd                 theta[bin + 1] =
148776bd547bSAdrian Chadd                     ((accum_ang[bin] * (1 << scale_factor)) +
148876bd547bSAdrian Chadd                     accum_cnt[bin]) / accum_cnt[bin];
148976bd547bSAdrian Chadd             }
149076bd547bSAdrian Chadd             max_index++;
149176bd547bSAdrian Chadd         }
149276bd547bSAdrian Chadd         /*
149376bd547bSAdrian Chadd          * printf(
149476bd547bSAdrian Chadd          *     "i=%d, theta[i+1]=%d\t%d\t%d\t%d\t%d\n",
149576bd547bSAdrian Chadd          *     i, theta[i+1], accum_cnt[i],
149676bd547bSAdrian Chadd          *     accum_tx[i], accum_rx[i], accum_ang[i]);
149776bd547bSAdrian Chadd          */
149876bd547bSAdrian Chadd     }
149976bd547bSAdrian Chadd 
150076bd547bSAdrian Chadd     /*
150176bd547bSAdrian Chadd      * Find average theta of first 5 bin and all of those to same value.
150276bd547bSAdrian Chadd      * Curve is linear at that range.
150376bd547bSAdrian Chadd      */
150476bd547bSAdrian Chadd     for (bin = 1; bin < 6; bin++) {
150576bd547bSAdrian Chadd         theta_low_bin += theta[bin];
150676bd547bSAdrian Chadd     }
150776bd547bSAdrian Chadd     theta_low_bin = theta_low_bin / 5;
150876bd547bSAdrian Chadd     for (bin = 1; bin < 6; bin++) {
150976bd547bSAdrian Chadd         theta[bin] = theta_low_bin;
151076bd547bSAdrian Chadd     }
151176bd547bSAdrian Chadd 
151276bd547bSAdrian Chadd     /* Set values at origin */
151376bd547bSAdrian Chadd     theta[0] = theta_low_bin;
151476bd547bSAdrian Chadd 
151576bd547bSAdrian Chadd     for (bin = 0; bin <= max_index; bin++) {
151676bd547bSAdrian Chadd         theta[bin] = theta[bin] - theta_low_bin;
151776bd547bSAdrian Chadd         /*printf("bin=%d, theta[bin] = %d\n", bin, theta[bin]);*/
151876bd547bSAdrian Chadd     }
151976bd547bSAdrian Chadd 
152076bd547bSAdrian Chadd     x_est[0] = 0;
152176bd547bSAdrian Chadd     y[0] = 0;
152276bd547bSAdrian Chadd     scale_factor = 8;
152376bd547bSAdrian Chadd     /* low signal gain */
152476bd547bSAdrian Chadd     if (x_est[6] == x_est[3]) {
152576bd547bSAdrian Chadd         return AH_FALSE;
152676bd547bSAdrian Chadd     }
152776bd547bSAdrian Chadd     g_fxp =
152876bd547bSAdrian Chadd         (((y[6] - y[3]) * 1 << scale_factor) + (x_est[6] - x_est[3])) /
152976bd547bSAdrian Chadd         (x_est[6] - x_est[3]);
153076bd547bSAdrian Chadd     if (g_fxp == 0) {
153176bd547bSAdrian Chadd         /*
153276bd547bSAdrian Chadd          * ath_hal_printf(
153376bd547bSAdrian Chadd          *     NULL, "%s[%d] Potential divide by zero error\n",
153476bd547bSAdrian Chadd          *     __func__, __LINE__);
153576bd547bSAdrian Chadd          */
153676bd547bSAdrian Chadd         return AH_FALSE;
153776bd547bSAdrian Chadd     }
153876bd547bSAdrian Chadd 
153976bd547bSAdrian Chadd     for (bin = 0; bin <= max_index; bin++) {
154076bd547bSAdrian Chadd         y_lin[bin] =
154176bd547bSAdrian Chadd             (g_fxp * (x_est[bin] - x_est[3]) + (1 << scale_factor)) /
154276bd547bSAdrian Chadd             (1 << scale_factor) + y[3];
154376bd547bSAdrian Chadd     }
154476bd547bSAdrian Chadd     y_intercept = y_lin[0];
154576bd547bSAdrian Chadd 
154676bd547bSAdrian Chadd     for (bin = 0; bin <= max_index; bin++) {
154776bd547bSAdrian Chadd         y_est[bin] = y[bin] - y_intercept;
154876bd547bSAdrian Chadd         y_lin[bin] = y_lin[bin] - y_intercept;
154976bd547bSAdrian Chadd     }
155076bd547bSAdrian Chadd 
155176bd547bSAdrian Chadd     for (bin = 0; bin <= 3; bin++) {
155276bd547bSAdrian Chadd         y_est[bin] = bin * 32;
155376bd547bSAdrian Chadd         /* g_fxp was checked for zero already */
155476bd547bSAdrian Chadd         x_est[bin] = ((y_est[bin] * 1 << scale_factor) + g_fxp) / g_fxp;
155576bd547bSAdrian Chadd     }
155676bd547bSAdrian Chadd 
155776bd547bSAdrian Chadd     /*
155876bd547bSAdrian Chadd      *  for (bin = 0; bin <= max_index; bin++) {
155976bd547bSAdrian Chadd      *      printf("y_est[%d] = %d, x_est[%d]=%d\n",
156076bd547bSAdrian Chadd      *          bin, y_est[bin], bin, x_est[bin]);
156176bd547bSAdrian Chadd      *  }
156276bd547bSAdrian Chadd      */
156376bd547bSAdrian Chadd     for (bin = 0; bin <= max_index; bin++) {
156476bd547bSAdrian Chadd         x_est_fxp1_nonlin[bin] =
156576bd547bSAdrian Chadd             x_est[bin] - ((1 << scale_factor) * y_est[bin] + g_fxp) / g_fxp;
156676bd547bSAdrian Chadd         /*printf("x_est_fxp1_nonlin[%d] = %d\n", bin, x_est_fxp1_nonlin[bin]);*/
156776bd547bSAdrian Chadd     }
156876bd547bSAdrian Chadd 
156976bd547bSAdrian Chadd     /* Check for divide by 0 */
157076bd547bSAdrian Chadd     if (y_est[max_index] == 0) {
157176bd547bSAdrian Chadd         return AH_FALSE;
157276bd547bSAdrian Chadd     }
157376bd547bSAdrian Chadd     order_x_by_y =
157476bd547bSAdrian Chadd         (x_est_fxp1_nonlin[max_index] + y_est[max_index]) / y_est[max_index];
157576bd547bSAdrian Chadd     if (order_x_by_y == 0) {
157676bd547bSAdrian Chadd         m = 10;
157776bd547bSAdrian Chadd     } else if (order_x_by_y == 1) {
157876bd547bSAdrian Chadd         m = 9;
157976bd547bSAdrian Chadd     } else {
158076bd547bSAdrian Chadd         m = 8;
158176bd547bSAdrian Chadd     }
158276bd547bSAdrian Chadd 
158376bd547bSAdrian Chadd     half_lo = (max_index > 15) ? 7 : max_index >> 1;
158476bd547bSAdrian Chadd     half_hi = max_index - half_lo;
158576bd547bSAdrian Chadd     scale_factor = 8;
158676bd547bSAdrian Chadd     sum_y_sqr = 0;
158776bd547bSAdrian Chadd     sum_y_quad = 0;
158876bd547bSAdrian Chadd 
158976bd547bSAdrian Chadd     for (bin = 0; bin <= half_hi; bin++) {
159076bd547bSAdrian Chadd         if (y_est[bin + half_lo] == 0) {
159176bd547bSAdrian Chadd             /*
159276bd547bSAdrian Chadd              * ath_hal_printf(
159376bd547bSAdrian Chadd              *     NULL, "%s Potential divide by zero error\n", __func__);
159476bd547bSAdrian Chadd              */
159576bd547bSAdrian Chadd             return AH_FALSE;
159676bd547bSAdrian Chadd         }
159776bd547bSAdrian Chadd 
159876bd547bSAdrian Chadd         x_tilde[bin] =
159976bd547bSAdrian Chadd             (x_est_fxp1_nonlin[bin + half_lo] * (1 << m) +
160076bd547bSAdrian Chadd              y_est[bin + half_lo]) / y_est[bin + half_lo];
160176bd547bSAdrian Chadd         x_tilde[bin] = (x_tilde[bin] * (1 << m) + y_est[bin + half_lo]) /
160276bd547bSAdrian Chadd             y_est[bin + half_lo];
160376bd547bSAdrian Chadd         x_tilde[bin] = (x_tilde[bin] * (1 << m) + y_est[bin + half_lo]) /
160476bd547bSAdrian Chadd             y_est[bin + half_lo];
160576bd547bSAdrian Chadd 
160676bd547bSAdrian Chadd         y_sqr[bin] =
160776bd547bSAdrian Chadd             (y_est[bin + half_lo] * y_est[bin + half_lo] +
160876bd547bSAdrian Chadd              (scale_factor * scale_factor)) / (scale_factor * scale_factor);
160976bd547bSAdrian Chadd         x_tilde_abs[bin] = paprd_abs(x_tilde[bin]);
161076bd547bSAdrian Chadd         y_quad[bin] = y_sqr[bin] * y_sqr[bin];
161176bd547bSAdrian Chadd         sum_y_sqr = sum_y_sqr + y_sqr[bin];
161276bd547bSAdrian Chadd         sum_y_quad = sum_y_quad + y_quad[bin];
161376bd547bSAdrian Chadd     }
161476bd547bSAdrian Chadd 
161576bd547bSAdrian Chadd     /*printf("sum_y_sqr = %d, sum_y_quad=%d\n", sum_y_sqr, sum_y_quad);*/
161676bd547bSAdrian Chadd 
161776bd547bSAdrian Chadd     for (bin = 0; bin <= half_hi; bin++) {
161876bd547bSAdrian Chadd         b1_tmp[bin] = y_sqr[bin] * (half_hi + 1) - sum_y_sqr;
161976bd547bSAdrian Chadd         b2_tmp[bin] = sum_y_quad - sum_y_sqr * y_sqr[bin];
162076bd547bSAdrian Chadd         b1_abs[bin] = paprd_abs(b1_tmp[bin]);
162176bd547bSAdrian Chadd         b2_abs[bin] = paprd_abs(b2_tmp[bin]);
162276bd547bSAdrian Chadd 
162376bd547bSAdrian Chadd         /*
162476bd547bSAdrian Chadd          * printf(
162576bd547bSAdrian Chadd          *     "bin=%d, b1_tmp[bin] = %d, b2_tmp[bin] = %d\n",
162676bd547bSAdrian Chadd          *     bin, b1_tmp[bin], b2_tmp[bin]);
162776bd547bSAdrian Chadd          */
162876bd547bSAdrian Chadd     }
162976bd547bSAdrian Chadd 
163076bd547bSAdrian Chadd     q_x = find_proper_scale(find_expn(find_max(x_tilde_abs, half_hi + 1)), 10);
163176bd547bSAdrian Chadd     q_b1 = find_proper_scale(find_expn(find_max(b1_abs, half_hi + 1)), 10);
163276bd547bSAdrian Chadd     q_b2 = find_proper_scale(find_expn(find_max(b2_abs, half_hi + 1)), 10);
163376bd547bSAdrian Chadd 
163476bd547bSAdrian Chadd     beta_raw = 0;
163576bd547bSAdrian Chadd     alpha_raw = 0;
163676bd547bSAdrian Chadd 
163776bd547bSAdrian Chadd     for (bin = 0; bin <= half_hi; bin++) {
163876bd547bSAdrian Chadd         x_tilde[bin] = x_tilde[bin] / (1 << q_x);
163976bd547bSAdrian Chadd         b1_tmp[bin] = b1_tmp[bin] / (1 << q_b1);
164076bd547bSAdrian Chadd         b2_tmp[bin] = b2_tmp[bin] / (1 << q_b2);
164176bd547bSAdrian Chadd 
164276bd547bSAdrian Chadd         /*
164376bd547bSAdrian Chadd          * printf(
164476bd547bSAdrian Chadd          *     "bin=%d, b1_tmp[bin]=%d b2_tmp[bin]=%d x_tilde[bin] = %d\n",
164576bd547bSAdrian Chadd          *     bin, b1_tmp[bin], b2_tmp[bin], x_tilde[bin]);
164676bd547bSAdrian Chadd          */
164776bd547bSAdrian Chadd         beta_raw = beta_raw + b1_tmp[bin] * x_tilde[bin];
164876bd547bSAdrian Chadd         alpha_raw = alpha_raw + b2_tmp[bin] * x_tilde[bin];
164976bd547bSAdrian Chadd     }
165076bd547bSAdrian Chadd 
165176bd547bSAdrian Chadd     scale_b =
165276bd547bSAdrian Chadd         ((sum_y_quad / scale_factor) * (half_hi + 1) -
165376bd547bSAdrian Chadd         (sum_y_sqr / scale_factor) * sum_y_sqr) * scale_factor;
165476bd547bSAdrian Chadd     q_scale_b = find_proper_scale(find_expn(paprd_abs(scale_b)), 10);
165576bd547bSAdrian Chadd     scale_b = scale_b / (1 << q_scale_b);
165676bd547bSAdrian Chadd     /* Check for divide by 0 */
165776bd547bSAdrian Chadd     if (scale_b == 0) {
165876bd547bSAdrian Chadd         return AH_FALSE;
165976bd547bSAdrian Chadd     }
166076bd547bSAdrian Chadd     q_beta = find_proper_scale(find_expn(paprd_abs(beta_raw)), 10);
166176bd547bSAdrian Chadd     q_alpha = find_proper_scale(find_expn(paprd_abs(alpha_raw)), 10);
166276bd547bSAdrian Chadd 
166376bd547bSAdrian Chadd     beta_raw = beta_raw / (1 << q_beta);
166476bd547bSAdrian Chadd     alpha_raw = alpha_raw / (1 << q_alpha);
166576bd547bSAdrian Chadd     alpha = (alpha_raw << 10) / scale_b;
166676bd547bSAdrian Chadd     beta = (beta_raw << 10) / scale_b;
166776bd547bSAdrian Chadd     order_1 = 3 * m - q_x - q_b1 - q_beta + 10 + q_scale_b;
166876bd547bSAdrian Chadd     order_2 = 3 * m - q_x - q_b2 - q_alpha + 10 + q_scale_b;
166976bd547bSAdrian Chadd 
167076bd547bSAdrian Chadd     order1_5x = order_1 / 5;
167176bd547bSAdrian Chadd     order2_3x = order_2 / 3;
167276bd547bSAdrian Chadd 
167376bd547bSAdrian Chadd     order1_5x_rem = order_1 - 5 * order1_5x;
167476bd547bSAdrian Chadd     order2_3x_rem = order_2 - 3 * order2_3x;
167576bd547bSAdrian Chadd 
167676bd547bSAdrian Chadd     for (idx = 0; idx < AR9300_PAPRD_TABLE_SZ; idx++) {
167776bd547bSAdrian Chadd         tmp = idx * 32;
167876bd547bSAdrian Chadd         y5 = ((beta * tmp) >> 6) >> order1_5x;
167976bd547bSAdrian Chadd         y5 = (y5 * tmp) >> order1_5x;
168076bd547bSAdrian Chadd         y5 = (y5 * tmp) >> order1_5x;
168176bd547bSAdrian Chadd         y5 = (y5 * tmp) >> order1_5x;
168276bd547bSAdrian Chadd         y5 = (y5 * tmp) >> order1_5x;
168376bd547bSAdrian Chadd 
168476bd547bSAdrian Chadd         y5 = y5 >> order1_5x_rem;
168576bd547bSAdrian Chadd         y3 = (alpha * tmp) >> order2_3x;
168676bd547bSAdrian Chadd         y3 = (y3 * tmp) >> order2_3x;
168776bd547bSAdrian Chadd         y3 = (y3 * tmp) >> order2_3x;
168876bd547bSAdrian Chadd 
168976bd547bSAdrian Chadd         y3 = y3 >> order2_3x_rem;
169076bd547bSAdrian Chadd         /* g_fxp was checked for zero already */
169176bd547bSAdrian Chadd         pa_in[idx] = y5 + y3 + (256 * tmp) / g_fxp;
169276bd547bSAdrian Chadd     }
169376bd547bSAdrian Chadd 
169476bd547bSAdrian Chadd     for (idx = 1; idx < 23; idx++) {
169576bd547bSAdrian Chadd         tmp = pa_in[idx + 1] - pa_in[idx];
169676bd547bSAdrian Chadd         if (tmp < 0) {
169776bd547bSAdrian Chadd             pa_in[idx + 1] = pa_in[idx] + (pa_in[idx] - pa_in[idx - 1]);
169876bd547bSAdrian Chadd         }
169976bd547bSAdrian Chadd     }
170076bd547bSAdrian Chadd 
170176bd547bSAdrian Chadd     for (idx = 0; idx < AR9300_PAPRD_TABLE_SZ; idx++) {
170276bd547bSAdrian Chadd         pa_in[idx] = (pa_in[idx] < 1400) ? pa_in[idx] : 1400;
170376bd547bSAdrian Chadd         /*printf("idx=%d, pa_in[idx]=%d\n", i, pa_in[idx]);*/
170476bd547bSAdrian Chadd     }
170576bd547bSAdrian Chadd 
170676bd547bSAdrian Chadd     beta_raw = 0;
170776bd547bSAdrian Chadd     alpha_raw = 0;
170876bd547bSAdrian Chadd 
170976bd547bSAdrian Chadd     for (bin = 0; bin <= half_hi; bin++) {
171076bd547bSAdrian Chadd         /*
171176bd547bSAdrian Chadd          *  printf(
171276bd547bSAdrian Chadd          *      "bin=%d half_lo=%d m=%d theta[bin+half_lo]=%d "
171376bd547bSAdrian Chadd          *      "y_est[bin+half_lo]=%d\n",
171476bd547bSAdrian Chadd          *      bin, half_lo, m, theta[bin+half_lo], y_est[bin+half_lo]);
171576bd547bSAdrian Chadd          */
171676bd547bSAdrian Chadd         /* y_est[] was already checked for zero */
171776bd547bSAdrian Chadd         theta_tilde[bin] =
171876bd547bSAdrian Chadd             ((theta[bin + half_lo] << m) + y_est[bin + half_lo]) /
171976bd547bSAdrian Chadd             y_est[bin + half_lo];
172076bd547bSAdrian Chadd         theta_tilde[bin] = ((theta_tilde[bin] << m) + y_est[bin + half_lo]) /
172176bd547bSAdrian Chadd             y_est[bin + half_lo];
172276bd547bSAdrian Chadd         theta_tilde[bin] = ((theta_tilde[bin] << m) + y_est[bin + half_lo]) /
172376bd547bSAdrian Chadd             y_est[bin + half_lo];
172476bd547bSAdrian Chadd 
172576bd547bSAdrian Chadd         /*printf("bin=%d theta_tilde[bin]=%d\n", bin, theta_tilde[bin]);*/
172676bd547bSAdrian Chadd         beta_raw = beta_raw + b1_tmp[bin] * theta_tilde[bin];
172776bd547bSAdrian Chadd         alpha_raw = alpha_raw + b2_tmp[bin] * theta_tilde[bin];
172876bd547bSAdrian Chadd 
172976bd547bSAdrian Chadd         /*
173076bd547bSAdrian Chadd         printf("bin=%d, alpha_raw=%d, beta_raw=%d\n", bin, alpha_raw, beta_raw);
173176bd547bSAdrian Chadd          */
173276bd547bSAdrian Chadd     }
173376bd547bSAdrian Chadd 
173476bd547bSAdrian Chadd     q_beta = find_proper_scale(find_expn(paprd_abs(beta_raw)), 10);
173576bd547bSAdrian Chadd     q_alpha = find_proper_scale(find_expn(paprd_abs(alpha_raw)), 10);
173676bd547bSAdrian Chadd 
173776bd547bSAdrian Chadd     beta_raw = beta_raw / (1 << q_beta);
173876bd547bSAdrian Chadd     alpha_raw = alpha_raw / (1 << q_alpha);
173976bd547bSAdrian Chadd     /* scale_b checked for zero previously */
174076bd547bSAdrian Chadd     alpha = (alpha_raw << 10) / scale_b;
174176bd547bSAdrian Chadd     beta = (beta_raw << 10) / scale_b;
174276bd547bSAdrian Chadd     order_1 = 3 * m - q_x - q_b1 - q_beta + 10 + q_scale_b + 5;
174376bd547bSAdrian Chadd     order_2 = 3 * m - q_x - q_b2 - q_alpha + 10 + q_scale_b + 5;
174476bd547bSAdrian Chadd 
174576bd547bSAdrian Chadd     order1_5x = order_1 / 5;
174676bd547bSAdrian Chadd     order2_3x = order_2 / 3;
174776bd547bSAdrian Chadd 
174876bd547bSAdrian Chadd     order1_5x_rem = order_1 - 5 * order1_5x;
174976bd547bSAdrian Chadd     order2_3x_rem = order_2 - 3 * order2_3x;
175076bd547bSAdrian Chadd 
175176bd547bSAdrian Chadd     for (idx = 0; idx < AR9300_PAPRD_TABLE_SZ; idx++) {
175276bd547bSAdrian Chadd         tmp = idx * 32;
175376bd547bSAdrian Chadd 
175476bd547bSAdrian Chadd         if (beta > 0) {
175576bd547bSAdrian Chadd             y5 = (((beta * tmp - 64) >> 6) -
175676bd547bSAdrian Chadd                 (1 << order1_5x)) / (1 << order1_5x);
175776bd547bSAdrian Chadd         } else {
175876bd547bSAdrian Chadd             y5 = ((((beta * tmp - 64) >> 6) +
175976bd547bSAdrian Chadd                     (1 << order1_5x)) / (1 << order1_5x));
176076bd547bSAdrian Chadd         }
176176bd547bSAdrian Chadd 
176276bd547bSAdrian Chadd         y5 = (y5 * tmp) / (1 << order1_5x);
176376bd547bSAdrian Chadd         y5 = (y5 * tmp) / (1 << order1_5x);
176476bd547bSAdrian Chadd         y5 = (y5 * tmp) / (1 << order1_5x);
176576bd547bSAdrian Chadd         y5 = (y5 * tmp) / (1 << order1_5x);
176676bd547bSAdrian Chadd 
176776bd547bSAdrian Chadd         y5 = y5 / (1 << order1_5x_rem);
176876bd547bSAdrian Chadd 
176976bd547bSAdrian Chadd         if (beta > 0) {
177076bd547bSAdrian Chadd             y3 = (alpha * tmp - (1 << order2_3x)) / (1 << order2_3x);
177176bd547bSAdrian Chadd         } else {
177276bd547bSAdrian Chadd             y3 = (alpha * tmp + (1 << order2_3x)) / (1 << order2_3x);
177376bd547bSAdrian Chadd         }
177476bd547bSAdrian Chadd 
177576bd547bSAdrian Chadd         y3 = (y3 * tmp) / (1 << order2_3x);
177676bd547bSAdrian Chadd         y3 = (y3 * tmp) / (1 << order2_3x);
177776bd547bSAdrian Chadd 
177876bd547bSAdrian Chadd         y3 = y3 / (1 << order2_3x_rem);
177976bd547bSAdrian Chadd         pa_angle[idx] = y5 + y3;
178076bd547bSAdrian Chadd         /*printf("idx=%d, y5 = %d, y3=%d\n", idx, y5, y3);*/
178176bd547bSAdrian Chadd         pa_angle[idx] =
178276bd547bSAdrian Chadd             (pa_angle[idx] < -150) ? -150 : ((pa_angle[idx] >
178376bd547bSAdrian Chadd                 150) ? 150 : pa_angle[idx]);
178476bd547bSAdrian Chadd     }
178576bd547bSAdrian Chadd 
178676bd547bSAdrian Chadd     pa_angle[0] = 0;
178776bd547bSAdrian Chadd     pa_angle[1] = 0;
178876bd547bSAdrian Chadd     pa_angle[2] = 0;
178976bd547bSAdrian Chadd     pa_angle[3] = 0;
179076bd547bSAdrian Chadd 
179176bd547bSAdrian Chadd     pa_angle[4] = (pa_angle[5] + 2) >> 1;
179276bd547bSAdrian Chadd 
179376bd547bSAdrian Chadd     for (idx = 0; idx < AR9300_PAPRD_TABLE_SZ; idx++) {
179476bd547bSAdrian Chadd         pa_table[idx] = ((pa_in[idx] & 0x7ff) << 11) + (pa_angle[idx] & 0x7ff);
179576bd547bSAdrian Chadd         /*
179676bd547bSAdrian Chadd          * HALDEBUG(
179776bd547bSAdrian Chadd          *     NULL, HAL_DEBUG_UNMASKABLE,"%d\t%d\t0x%x\n",
179876bd547bSAdrian Chadd          *     pa_in[idx], pa_angle[idx], pa_table[idx]);
179976bd547bSAdrian Chadd          */
180076bd547bSAdrian Chadd     }
180176bd547bSAdrian Chadd 
180276bd547bSAdrian Chadd     /*HALDEBUG(NULL, HAL_DEBUG_UNMASKABLE, "g_fxp = %d\n", g_fxp);*/
180376bd547bSAdrian Chadd     *g_fxp_ext = g_fxp;
180476bd547bSAdrian Chadd     return AH_TRUE;
180576bd547bSAdrian Chadd }
180676bd547bSAdrian Chadd 
180776bd547bSAdrian Chadd // Due to a hardware bug, when transmitting with just one chain the papd
180876bd547bSAdrian Chadd // data for chain 0 is always used. So when using chain 2 or 4, the
180976bd547bSAdrian Chadd // corresponding data must be copied into the chain 0 area.
ar9300_swizzle_paprd_entries(struct ath_hal * ah,unsigned int txchain)181076bd547bSAdrian Chadd void ar9300_swizzle_paprd_entries(struct ath_hal *ah, unsigned int txchain)
181176bd547bSAdrian Chadd {
181276bd547bSAdrian Chadd     int i;
181376bd547bSAdrian Chadd     u_int32_t *paprd_table_val = NULL;
181476bd547bSAdrian Chadd     u_int32_t small_signal_gain = 0;
181576bd547bSAdrian Chadd     u_int32_t reg = 0;
181676bd547bSAdrian Chadd 
181776bd547bSAdrian Chadd     reg = AR_PHY_PAPRD_MEM_TAB_B0;
181876bd547bSAdrian Chadd     switch (txchain) {
181976bd547bSAdrian Chadd     case 0x1:
182076bd547bSAdrian Chadd     case 0x3:
182176bd547bSAdrian Chadd     case 0x7:
182276bd547bSAdrian Chadd 	paprd_table_val = &AH9300(ah)->pa_table[0][0];
182376bd547bSAdrian Chadd 	small_signal_gain = AH9300(ah)->small_signal_gain[0];
182476bd547bSAdrian Chadd 	break;
182576bd547bSAdrian Chadd     case 0x2:
182676bd547bSAdrian Chadd 	paprd_table_val = &AH9300(ah)->pa_table[1][0];
182776bd547bSAdrian Chadd 	small_signal_gain = AH9300(ah)->small_signal_gain[1];
182876bd547bSAdrian Chadd 	break;
182976bd547bSAdrian Chadd     case 0x4:
183076bd547bSAdrian Chadd 	paprd_table_val = &AH9300(ah)->pa_table[2][0];
183176bd547bSAdrian Chadd 	small_signal_gain = AH9300(ah)->small_signal_gain[2];
183276bd547bSAdrian Chadd 	break;
183376bd547bSAdrian Chadd     default:
183476bd547bSAdrian Chadd 	// Error out.
183576bd547bSAdrian Chadd 	ath_hal_printf(ah, "YAK! Bad chain mask %x\n", txchain);
183676bd547bSAdrian Chadd 	return;
183776bd547bSAdrian Chadd     }
183876bd547bSAdrian Chadd     for (i = 0; i < AR9300_PAPRD_TABLE_SZ; i++) {
183976bd547bSAdrian Chadd         OS_REG_WRITE(ah, reg, paprd_table_val[i]);
184076bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x = 0x%08x\n", __func__,
184176bd547bSAdrian Chadd 		 __LINE__, reg, paprd_table_val[i]);
184276bd547bSAdrian Chadd 
184376bd547bSAdrian Chadd         reg = reg + 4;
184476bd547bSAdrian Chadd     }
184576bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PA_GAIN123_B0,AR_PHY_PA_GAIN123_B0_PA_GAIN1_0, small_signal_gain);
184676bd547bSAdrian Chadd     HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x small_signal_gain 0x%08x\n", __func__, __LINE__,
184776bd547bSAdrian Chadd 	     (unsigned) AR_PHY_PA_GAIN123_B0, OS_REG_READ(ah, AR_PHY_PA_GAIN123_B0));
184876bd547bSAdrian Chadd 
184976bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, AR_PHY_PAPRD_CTRL1_B0_PAPRD_POWER_AT_AM2AM_CAL_0,
185076bd547bSAdrian Chadd 			 AH9300(ah)->paprd_training_power);
185176bd547bSAdrian Chadd     HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x = 0x%08x\n", __func__, __LINE__,
185276bd547bSAdrian Chadd 	     (unsigned) AR_PHY_PAPRD_CTRL1_B0, OS_REG_READ(ah, AR_PHY_PAPRD_CTRL1_B0));
185376bd547bSAdrian Chadd 
185476bd547bSAdrian Chadd }
185576bd547bSAdrian Chadd 
ar9300_populate_paprd_single_table(struct ath_hal * ah,struct ieee80211_channel * chan,int chain_num)1856*e113789bSAdrian Chadd void ar9300_populate_paprd_single_table(struct ath_hal *ah,
1857*e113789bSAdrian Chadd     struct ieee80211_channel *chan, int chain_num)
185876bd547bSAdrian Chadd {
185976bd547bSAdrian Chadd     int i, j, bad_read = 0;
1860*e113789bSAdrian Chadd #ifdef	AH_DEBUG
1861*e113789bSAdrian Chadd     HAL_CHANNEL_INTERNAL *ichan = ath_hal_checkchannel(ah, chan);
1862*e113789bSAdrian Chadd #endif
186376bd547bSAdrian Chadd     u_int32_t *paprd_table_val = &AH9300(ah)->pa_table[chain_num][0];
186476bd547bSAdrian Chadd     u_int32_t small_signal_gain = AH9300(ah)->small_signal_gain[chain_num];
186576bd547bSAdrian Chadd     u_int32_t reg = 0;
186676bd547bSAdrian Chadd 
186776bd547bSAdrian Chadd     HALDEBUG(ah, HAL_DEBUG_CALIBRATE,
186876bd547bSAdrian Chadd         "%s[%d]: channel %d paprd_done %d write %d\n", __func__, __LINE__,
1869*e113789bSAdrian Chadd         ichan->channel, ichan->paprd_done, ichan->paprd_table_write_done);
187076bd547bSAdrian Chadd 
187176bd547bSAdrian Chadd     if (chain_num == 0) {
187276bd547bSAdrian Chadd         reg = AR_PHY_PAPRD_MEM_TAB_B0;
187376bd547bSAdrian Chadd     } else if (chain_num == 1) {
187476bd547bSAdrian Chadd         reg = AR_PHY_PAPRD_MEM_TAB_B1;
187576bd547bSAdrian Chadd     } else if (chain_num == 2) {
187676bd547bSAdrian Chadd         reg = AR_PHY_PAPRD_MEM_TAB_B2;
187776bd547bSAdrian Chadd     }
187876bd547bSAdrian Chadd 
187976bd547bSAdrian Chadd     for (i = 0; i < AR9300_PAPRD_TABLE_SZ; i++) {
188076bd547bSAdrian Chadd         if (AR_SREV_POSEIDON(ah)) {
188176bd547bSAdrian Chadd             HALASSERT(chain_num == 0x1);
188276bd547bSAdrian Chadd             if ((reg == AR_PHY_PAPRD_MEM_TAB_B1) ||
188376bd547bSAdrian Chadd                 (reg == AR_PHY_PAPRD_MEM_TAB_B2)) {
188476bd547bSAdrian Chadd                 continue;
188576bd547bSAdrian Chadd             }
188676bd547bSAdrian Chadd         }
188776bd547bSAdrian Chadd         /*
188876bd547bSAdrian Chadd          * sprintf(
188976bd547bSAdrian Chadd          *     field_name, "%s%d[%d]%s\0", "BB_paprd_mem_tab_b",
189076bd547bSAdrian Chadd          *     chain_num, i, ".paprd_mem");
189176bd547bSAdrian Chadd          */
189276bd547bSAdrian Chadd         OS_REG_WRITE(ah, reg, paprd_table_val[i]);
189376bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x = 0x%08x\n", __func__,
189476bd547bSAdrian Chadd             __LINE__, reg, paprd_table_val[i]);
189576bd547bSAdrian Chadd         /*
189676bd547bSAdrian Chadd          * printf(
189776bd547bSAdrian Chadd          *     "%s[%d] reg %08x = 0x%08x\n",
189876bd547bSAdrian Chadd          *     __func__, __LINE__, reg, paprd_table_val[i]);
189976bd547bSAdrian Chadd          */
190076bd547bSAdrian Chadd          if (OS_REG_READ(ah, reg) == 0xdeadbeef) {
190176bd547bSAdrian Chadd             HALDEBUG(ah, HAL_DEBUG_UNMASKABLE,
190276bd547bSAdrian Chadd                      "%s: Reg0x%x = 0xdeadbeef\n", __func__, reg);
190376bd547bSAdrian Chadd             bad_read++;
190476bd547bSAdrian Chadd             for (j = AR_PHY_PAPRD_MEM_TAB_B0; j < (AR_PHY_PAPRD_MEM_TAB_B0 + 0x10); j+=4)
190576bd547bSAdrian Chadd             {
190676bd547bSAdrian Chadd                 if (OS_REG_READ(ah, j) == 0xdeadbeef) {
190776bd547bSAdrian Chadd                     HALDEBUG(ah, HAL_DEBUG_UNMASKABLE,
190876bd547bSAdrian Chadd                              "%s: Reg0x%x = 0xdeadbeef\n", __func__, j);
190976bd547bSAdrian Chadd                     bad_read++;
191076bd547bSAdrian Chadd                 }
191176bd547bSAdrian Chadd             }
191276bd547bSAdrian Chadd             for (j = AR_PHY_PAPRD_MEM_TAB_B1; j < (AR_PHY_PAPRD_MEM_TAB_B1 + 0x10); j+=4)
191376bd547bSAdrian Chadd             {
191476bd547bSAdrian Chadd                 if (OS_REG_READ(ah, j) == 0xdeadbeef) {
191576bd547bSAdrian Chadd                     HALDEBUG(ah, HAL_DEBUG_UNMASKABLE,
191676bd547bSAdrian Chadd                              "%s: Reg0x%x = 0xdeadbeef\n", __func__, j);
191776bd547bSAdrian Chadd                     bad_read++;
191876bd547bSAdrian Chadd                 }
191976bd547bSAdrian Chadd             }
192076bd547bSAdrian Chadd          }
192176bd547bSAdrian Chadd 
192276bd547bSAdrian Chadd         reg = reg + 4;
192376bd547bSAdrian Chadd     }
192476bd547bSAdrian Chadd 
192576bd547bSAdrian Chadd     if (bad_read > 4) {
192676bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_UNMASKABLE,
192776bd547bSAdrian Chadd                  "%s: Get %d 0xdeadbeef. Mark PAPRD as broken.\n",
192876bd547bSAdrian Chadd                  __func__, bad_read);
192976bd547bSAdrian Chadd         AH9300(ah)->ah_paprd_broken = AH_TRUE;
193076bd547bSAdrian Chadd     }
193176bd547bSAdrian Chadd 
193276bd547bSAdrian Chadd     if (chain_num == 0) {
193376bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PA_GAIN123_B0,
193476bd547bSAdrian Chadd             AR_PHY_PA_GAIN123_B0_PA_GAIN1_0, small_signal_gain);
193576bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_CALIBRATE,
193676bd547bSAdrian Chadd             "%s[%d] reg %08x small_signal_gain 0x%08x\n", __func__, __LINE__,
193776bd547bSAdrian Chadd             (unsigned) AR_PHY_PA_GAIN123_B0,
193876bd547bSAdrian Chadd             OS_REG_READ(ah, AR_PHY_PA_GAIN123_B0));
193976bd547bSAdrian Chadd     } else if (chain_num == 1) {
194076bd547bSAdrian Chadd         if (!AR_SREV_POSEIDON(ah) && !AR_SREV_HORNET(ah) && !AR_SREV_APHRODITE(ah)) {
194176bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PA_GAIN123_B1,
194276bd547bSAdrian Chadd                 AR_PHY_PA_GAIN123_B1_PA_GAIN1_1, small_signal_gain);
194376bd547bSAdrian Chadd             HALDEBUG(ah, HAL_DEBUG_CALIBRATE,
194476bd547bSAdrian Chadd                 "%s[%d] reg %08x small_signal_gain 0x%08x\n",
194576bd547bSAdrian Chadd                 __func__, __LINE__,
194676bd547bSAdrian Chadd                 (unsigned) AR_PHY_PA_GAIN123_B1,
194776bd547bSAdrian Chadd                 OS_REG_READ(ah, AR_PHY_PA_GAIN123_B1));
194876bd547bSAdrian Chadd         }
194976bd547bSAdrian Chadd     } else if (chain_num == 2) {
195076bd547bSAdrian Chadd         if (!AR_SREV_POSEIDON(ah) && !AR_SREV_HORNET(ah) && !AR_SREV_APHRODITE(ah)) {
195176bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PA_GAIN123_B2,
195276bd547bSAdrian Chadd                 AR_PHY_PA_GAIN123_B2_PA_GAIN1_2, small_signal_gain);
195376bd547bSAdrian Chadd             HALDEBUG(ah, HAL_DEBUG_CALIBRATE,
195476bd547bSAdrian Chadd                 "%s[%d] reg %08x small_signal_gain 0x%08x\n",
195576bd547bSAdrian Chadd                 __func__, __LINE__,
195676bd547bSAdrian Chadd                 (unsigned) AR_PHY_PA_GAIN123_B2,
195776bd547bSAdrian Chadd                 OS_REG_READ(ah, AR_PHY_PA_GAIN123_B2));
195876bd547bSAdrian Chadd         }
195976bd547bSAdrian Chadd     } else {
196076bd547bSAdrian Chadd         /* invalid channel number */
196176bd547bSAdrian Chadd     }
196276bd547bSAdrian Chadd 
196376bd547bSAdrian Chadd     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0,
196476bd547bSAdrian Chadd         AR_PHY_PAPRD_CTRL1_B0_PAPRD_POWER_AT_AM2AM_CAL_0,
196576bd547bSAdrian Chadd         AH9300(ah)->paprd_training_power);
196676bd547bSAdrian Chadd     HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x = 0x%08x\n", __func__,
196776bd547bSAdrian Chadd         __LINE__, (unsigned) AR_PHY_PAPRD_CTRL1_B0,
196876bd547bSAdrian Chadd         OS_REG_READ(ah, AR_PHY_PAPRD_CTRL1_B0));
196976bd547bSAdrian Chadd     if (!AR_SREV_POSEIDON(ah) && !AR_SREV_HORNET(ah) && !AR_SREV_APHRODITE(ah)) {
197076bd547bSAdrian Chadd         OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1,
197176bd547bSAdrian Chadd             AR_PHY_PAPRD_CTRL1_B1_PAPRD_POWER_AT_AM2AM_CAL_1,
197276bd547bSAdrian Chadd             AH9300(ah)->paprd_training_power);
197376bd547bSAdrian Chadd         HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x = 0x%08x\n", __func__,
197476bd547bSAdrian Chadd             __LINE__, (unsigned) AR_PHY_PAPRD_CTRL1_B1,
197576bd547bSAdrian Chadd             OS_REG_READ(ah, AR_PHY_PAPRD_CTRL1_B1));
197676bd547bSAdrian Chadd         if (!AR_SREV_WASP(ah) && !AR_SREV_JUPITER(ah)) {
197776bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2,
197876bd547bSAdrian Chadd                 AR_PHY_PAPRD_CTRL1_B2_PAPRD_POWER_AT_AM2AM_CAL_2,
197976bd547bSAdrian Chadd                 AH9300(ah)->paprd_training_power);
198076bd547bSAdrian Chadd             HALDEBUG(ah, HAL_DEBUG_CALIBRATE,
198176bd547bSAdrian Chadd                 "%s[%d] reg %08x = 0x%08x\n", __func__,
198276bd547bSAdrian Chadd                 __LINE__, (unsigned) AR_PHY_PAPRD_CTRL1_B2,
198376bd547bSAdrian Chadd                 OS_REG_READ(ah, AR_PHY_PAPRD_CTRL1_B2));
198476bd547bSAdrian Chadd         }
198576bd547bSAdrian Chadd     }
198676bd547bSAdrian Chadd     /*ar9300_enable_paprd(ah, AH_TRUE);*/
198776bd547bSAdrian Chadd }
198876bd547bSAdrian Chadd 
ar9300_paprd_setup_gain_table(struct ath_hal * ah,int chain_num)198976bd547bSAdrian Chadd HAL_STATUS ar9300_paprd_setup_gain_table(struct ath_hal *ah, int chain_num)
199076bd547bSAdrian Chadd {
199176bd547bSAdrian Chadd     unsigned int i, desired_gain, gain_index;
199276bd547bSAdrian Chadd     HALDEBUG(ah, HAL_DEBUG_CALIBRATE,
199376bd547bSAdrian Chadd         "Run papredistortion single table algorithm:: Training power = %d\n",
199476bd547bSAdrian Chadd         AH9300(ah)->paprd_training_power / 2);
199576bd547bSAdrian Chadd 
199676bd547bSAdrian Chadd     if (AH9300(ah)->ah_tx_chainmask & (1 << chain_num)) {
199776bd547bSAdrian Chadd         /* this is an active chain */
199876bd547bSAdrian Chadd         desired_gain = ar9300_get_desired_gain_for_chain(
199976bd547bSAdrian Chadd             ah, chain_num, AH9300(ah)->paprd_training_power);
200076bd547bSAdrian Chadd         /* find out gain index */
200176bd547bSAdrian Chadd         gain_index = 0;
200276bd547bSAdrian Chadd 
200376bd547bSAdrian Chadd         for (i = 0; i < 32; i++) {
200476bd547bSAdrian Chadd             if (AH9300(ah)->paprd_gain_table_index[i] < desired_gain) {
200576bd547bSAdrian Chadd                 gain_index = gain_index + 1;
200676bd547bSAdrian Chadd             } else {
200776bd547bSAdrian Chadd                 break;
200876bd547bSAdrian Chadd             }
200976bd547bSAdrian Chadd         }
201076bd547bSAdrian Chadd 
201176bd547bSAdrian Chadd         /*printf("gain_index = %d\n", gain_index);*/
201276bd547bSAdrian Chadd         /*ath_hal_printf(ah, "++++ gain_index = %d\n", gain_index);*/
201376bd547bSAdrian Chadd         ar9300_tx_force_gain(ah, gain_index);
201476bd547bSAdrian Chadd         if (AR_SREV_POSEIDON(ah)) {
201576bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON,
201676bd547bSAdrian Chadd                 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE, 0);
201776bd547bSAdrian Chadd         } else {
201876bd547bSAdrian Chadd             OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1,
201976bd547bSAdrian Chadd                 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE, 0);
202076bd547bSAdrian Chadd         }
202176bd547bSAdrian Chadd     }
202276bd547bSAdrian Chadd 
202376bd547bSAdrian Chadd     return HAL_OK;
202476bd547bSAdrian Chadd }
202576bd547bSAdrian Chadd 
ar9300_paprd_retrain_pain(struct ath_hal * ah,int * pa_in)202676bd547bSAdrian Chadd static HAL_BOOL ar9300_paprd_retrain_pain(struct ath_hal * ah, int * pa_in)
202776bd547bSAdrian Chadd {
202876bd547bSAdrian Chadd     int count = 0, i;
202976bd547bSAdrian Chadd     int capdiv_offset = 0, quick_drop_offset;
203076bd547bSAdrian Chadd     int capdiv2g, quick_drop;
203176bd547bSAdrian Chadd 
203276bd547bSAdrian Chadd     capdiv2g = (OS_REG_READ(ah, AR_PHY_65NM_CH0_TXRF3) >> 1) & 0xF;
203376bd547bSAdrian Chadd     if (!AR_SREV_POSEIDON(ah)) {
203476bd547bSAdrian Chadd         quick_drop =
203576bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
203676bd547bSAdrian Chadd                 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP);
203776bd547bSAdrian Chadd     } else {
203876bd547bSAdrian Chadd         quick_drop =
203976bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
204076bd547bSAdrian Chadd                 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP);
204176bd547bSAdrian Chadd     }
204276bd547bSAdrian Chadd 
204376bd547bSAdrian Chadd     if ( quick_drop != 0 ) {
204476bd547bSAdrian Chadd         quick_drop -= 0x40;
204576bd547bSAdrian Chadd     }
204676bd547bSAdrian Chadd     for (i = 0; i < (NUM_BIN + 1); i++) {
204776bd547bSAdrian Chadd         if (pa_in[i] == 1400) {
204876bd547bSAdrian Chadd             count++;
204976bd547bSAdrian Chadd         }
205076bd547bSAdrian Chadd     }
205176bd547bSAdrian Chadd 
205276bd547bSAdrian Chadd     if (AR_SREV_POSEIDON(ah)) {
205376bd547bSAdrian Chadd         if ((pa_in[23] < 800) || (pa_in[23] == 1400)) {
205476bd547bSAdrian Chadd             if (pa_in[23] < 800) {
205576bd547bSAdrian Chadd                 capdiv_offset = (int)((1000 - pa_in[23] + 75) / 150);
205676bd547bSAdrian Chadd                 capdiv2g = capdiv2g + capdiv_offset;
205776bd547bSAdrian Chadd                 if (capdiv2g > 7) {
205876bd547bSAdrian Chadd                     capdiv2g = 7;
205976bd547bSAdrian Chadd                     if (pa_in[23] < 600) {
206076bd547bSAdrian Chadd                         quick_drop = quick_drop + 1;
206176bd547bSAdrian Chadd                         if (quick_drop > 0) {
206276bd547bSAdrian Chadd                             quick_drop = 0;
206376bd547bSAdrian Chadd                         }
206476bd547bSAdrian Chadd                     }
206576bd547bSAdrian Chadd                 }
206676bd547bSAdrian Chadd 
206776bd547bSAdrian Chadd                 OS_REG_RMW_FIELD(ah,
206876bd547bSAdrian Chadd                     AR_PHY_65NM_CH0_TXRF3,
206976bd547bSAdrian Chadd     			    AR_PHY_65NM_CH0_TXRF3_CAPDIV2G,
207076bd547bSAdrian Chadd     			    capdiv2g);
207176bd547bSAdrian Chadd 
207276bd547bSAdrian Chadd                 OS_REG_RMW_FIELD_ALT(ah,
207376bd547bSAdrian Chadd                     AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
207476bd547bSAdrian Chadd                     AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP,
207576bd547bSAdrian Chadd                     quick_drop);
207676bd547bSAdrian Chadd 
207776bd547bSAdrian Chadd                 return AH_TRUE;
207876bd547bSAdrian Chadd             } /* end of if (pa_in[23] < 800) */
207976bd547bSAdrian Chadd             else if (pa_in[23] == 1400) {
208076bd547bSAdrian Chadd                 quick_drop_offset = (int)(count / 3);
208176bd547bSAdrian Chadd                 if (quick_drop_offset > 2) {
208276bd547bSAdrian Chadd                     quick_drop_offset = 2;
208376bd547bSAdrian Chadd                 }
208476bd547bSAdrian Chadd                 quick_drop = quick_drop + quick_drop_offset;
208576bd547bSAdrian Chadd                 capdiv2g = capdiv2g + (int)(quick_drop_offset / 2);
208676bd547bSAdrian Chadd                 if (capdiv2g > 7) {
208776bd547bSAdrian Chadd                     capdiv2g = 7;
208876bd547bSAdrian Chadd                 }
208976bd547bSAdrian Chadd                 if (quick_drop > 0) {
209076bd547bSAdrian Chadd                     quick_drop = 0;
209176bd547bSAdrian Chadd                     capdiv2g = capdiv2g - (int)(quick_drop_offset / 1);
209276bd547bSAdrian Chadd     				if (capdiv2g < 0) {
209376bd547bSAdrian Chadd                         capdiv2g = 0;
209476bd547bSAdrian Chadd     				}
209576bd547bSAdrian Chadd                 }
209676bd547bSAdrian Chadd                 OS_REG_RMW_FIELD(ah,
209776bd547bSAdrian Chadd                         AR_PHY_65NM_CH0_TXRF3,
209876bd547bSAdrian Chadd     			        AR_PHY_65NM_CH0_TXRF3_CAPDIV2G,
209976bd547bSAdrian Chadd     			        capdiv2g);
210076bd547bSAdrian Chadd 
210176bd547bSAdrian Chadd                 OS_REG_RMW_FIELD_ALT(ah,
210276bd547bSAdrian Chadd                         AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON,
210376bd547bSAdrian Chadd         			    AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP,
210476bd547bSAdrian Chadd                         quick_drop);
210576bd547bSAdrian Chadd 
210676bd547bSAdrian Chadd                 return AH_TRUE;
210776bd547bSAdrian Chadd                 /* sleep(1); */
210876bd547bSAdrian Chadd             } /* end of if (pa_in[23] == 1400)*/
210976bd547bSAdrian Chadd         } /* end of if ((pa_in[23] < 800) || (pa_in[23] == 1400)) */
211076bd547bSAdrian Chadd     }else if (AR_SREV_HORNET(ah)) {
211176bd547bSAdrian Chadd         if ((pa_in[23] < 1000) || (pa_in[23] == 1400)) {
211276bd547bSAdrian Chadd             if (pa_in[23] < 1000) {
211376bd547bSAdrian Chadd                 capdiv_offset = ((1000 - pa_in[23]) / 100);
211476bd547bSAdrian Chadd                 capdiv2g = capdiv2g + capdiv_offset;
211576bd547bSAdrian Chadd                 if (capdiv_offset > 3) {
211676bd547bSAdrian Chadd                     quick_drop_offset = 1;
211776bd547bSAdrian Chadd                     quick_drop = quick_drop - quick_drop_offset;
211876bd547bSAdrian Chadd                     capdiv2g = capdiv2g + 1;
211976bd547bSAdrian Chadd                     if (capdiv2g > 6) {
212076bd547bSAdrian Chadd                         capdiv2g = 6;
212176bd547bSAdrian Chadd                     }
212276bd547bSAdrian Chadd                     if (quick_drop < -4) {
212376bd547bSAdrian Chadd                         quick_drop = -4;
212476bd547bSAdrian Chadd                     }
212576bd547bSAdrian Chadd                     OS_REG_RMW_FIELD(ah,
212676bd547bSAdrian Chadd                         AR_PHY_65NM_CH0_TXRF3,
212776bd547bSAdrian Chadd                         AR_PHY_65NM_CH0_TXRF3_CAPDIV2G,
212876bd547bSAdrian Chadd                         capdiv2g);
212976bd547bSAdrian Chadd                     OS_REG_RMW_FIELD_ALT(ah,
213076bd547bSAdrian Chadd                         AR_PHY_PAPRD_TRAINER_CNTL3,
213176bd547bSAdrian Chadd                         AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP,
213276bd547bSAdrian Chadd                         quick_drop);
213376bd547bSAdrian Chadd                     return AH_TRUE;
213476bd547bSAdrian Chadd                 } else {
213576bd547bSAdrian Chadd                     capdiv2g = capdiv2g + capdiv_offset;
213676bd547bSAdrian Chadd                     if (capdiv2g > 6) {
213776bd547bSAdrian Chadd                         capdiv2g = 6;
213876bd547bSAdrian Chadd                     }
213976bd547bSAdrian Chadd                     if (quick_drop < -4) {
214076bd547bSAdrian Chadd                         quick_drop = -4;
214176bd547bSAdrian Chadd                     }
214276bd547bSAdrian Chadd                     OS_REG_RMW_FIELD(ah,
214376bd547bSAdrian Chadd                         AR_PHY_65NM_CH0_TXRF3,
214476bd547bSAdrian Chadd                         AR_PHY_65NM_CH0_TXRF3_CAPDIV2G,
214576bd547bSAdrian Chadd                         capdiv2g);
214676bd547bSAdrian Chadd                     OS_REG_RMW_FIELD_ALT(ah,
214776bd547bSAdrian Chadd                         AR_PHY_PAPRD_TRAINER_CNTL3,
214876bd547bSAdrian Chadd                         AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP,
214976bd547bSAdrian Chadd                         quick_drop);
215076bd547bSAdrian Chadd                     return AH_TRUE;
215176bd547bSAdrian Chadd                 }
215276bd547bSAdrian Chadd             } /* end of if (PA_in[23] < 1000) */
215376bd547bSAdrian Chadd             else if (pa_in[23] == 1400) {
215476bd547bSAdrian Chadd                 if (count > 3) {
215576bd547bSAdrian Chadd                     quick_drop_offset = 1;
215676bd547bSAdrian Chadd                     quick_drop = quick_drop + quick_drop_offset;
215776bd547bSAdrian Chadd                     capdiv2g = capdiv2g - (count / 4);
215876bd547bSAdrian Chadd                     if (capdiv2g < 0) {
215976bd547bSAdrian Chadd                         capdiv2g = 0;
216076bd547bSAdrian Chadd                     }
216176bd547bSAdrian Chadd                     if (quick_drop > -2) {
216276bd547bSAdrian Chadd                         quick_drop = -2;
216376bd547bSAdrian Chadd                     }
216476bd547bSAdrian Chadd                     OS_REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_TXRF3,
216576bd547bSAdrian Chadd                         AR_PHY_65NM_CH0_TXRF3_CAPDIV2G,
216676bd547bSAdrian Chadd                         capdiv2g);
216776bd547bSAdrian Chadd                     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
216876bd547bSAdrian Chadd                         AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP,
216976bd547bSAdrian Chadd                         quick_drop);
217076bd547bSAdrian Chadd                     return AH_TRUE;
217176bd547bSAdrian Chadd                 } else {
217276bd547bSAdrian Chadd                     capdiv2g = capdiv2g - 1;
217376bd547bSAdrian Chadd                     if (capdiv2g < 0) {
217476bd547bSAdrian Chadd                         capdiv2g = 0;
217576bd547bSAdrian Chadd                     }
217676bd547bSAdrian Chadd                     OS_REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_TXRF3,
217776bd547bSAdrian Chadd                         AR_PHY_65NM_CH0_TXRF3_CAPDIV2G,
217876bd547bSAdrian Chadd                         capdiv2g);
217976bd547bSAdrian Chadd                     OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
218076bd547bSAdrian Chadd                         AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP,
218176bd547bSAdrian Chadd                         quick_drop);
218276bd547bSAdrian Chadd                     return AH_TRUE;
218376bd547bSAdrian Chadd                 }
218476bd547bSAdrian Chadd             } /* end of if (PA_in[23] == 1400)*/
218576bd547bSAdrian Chadd         } /* end of if ((PA_in[23] < 1000) || (PA_in[23] == 1400)) */
218676bd547bSAdrian Chadd     }
218776bd547bSAdrian Chadd 
218876bd547bSAdrian Chadd     return AH_FALSE;
218976bd547bSAdrian Chadd }
219076bd547bSAdrian Chadd 
ar9300_paprd_create_curve(struct ath_hal * ah,struct ieee80211_channel * chan,int chain_num)2191*e113789bSAdrian Chadd HAL_STATUS ar9300_paprd_create_curve(struct ath_hal * ah,
2192*e113789bSAdrian Chadd   struct ieee80211_channel * chan, int chain_num)
219376bd547bSAdrian Chadd {
219476bd547bSAdrian Chadd     int status = 0;
219576bd547bSAdrian Chadd     u_int32_t *pa_table, small_signal_gain;
219676bd547bSAdrian Chadd     int pa_in[NUM_BIN + 1];
219776bd547bSAdrian Chadd 
219876bd547bSAdrian Chadd     if (AH9300(ah)->ah_tx_chainmask & (1 << chain_num)) {
219976bd547bSAdrian Chadd         pa_table = &AH9300(ah)->pa_table[chain_num][0];
220076bd547bSAdrian Chadd         /* Compute PA table and gain index */
220176bd547bSAdrian Chadd         status = ar9300_create_pa_curve(ah, &pa_table[0], &small_signal_gain,
220276bd547bSAdrian Chadd                     &pa_in[0]);
220376bd547bSAdrian Chadd 
220476bd547bSAdrian Chadd 		if (AR_SREV_WASP(ah)) {
220576bd547bSAdrian Chadd 			OS_DELAY(1000);
220676bd547bSAdrian Chadd 		}
220776bd547bSAdrian Chadd 
220876bd547bSAdrian Chadd         if (status != 0) {
220976bd547bSAdrian Chadd             ath_hal_printf(ah, "ERROR:: paprd failed with error code = %d\n",
221076bd547bSAdrian Chadd                 status);
221176bd547bSAdrian Chadd             return -1;
221276bd547bSAdrian Chadd         }
221376bd547bSAdrian Chadd         AH9300(ah)->small_signal_gain[chain_num] = small_signal_gain;
221476bd547bSAdrian Chadd 
221576bd547bSAdrian Chadd         if (AR_SREV_POSEIDON(ah) || AR_SREV_HORNET(ah)) {
221676bd547bSAdrian Chadd             if (ar9300_paprd_retrain_pain(ah, pa_in)) {
221776bd547bSAdrian Chadd                 /* need re-train PAPRD */
221876bd547bSAdrian Chadd                 return HAL_EINPROGRESS;
221976bd547bSAdrian Chadd 		    }
222076bd547bSAdrian Chadd         }
222176bd547bSAdrian Chadd     }
222276bd547bSAdrian Chadd     return HAL_OK;
222376bd547bSAdrian Chadd }
222476bd547bSAdrian Chadd 
ar9300_paprd_init_table(struct ath_hal * ah,struct ieee80211_channel * chan)2225*e113789bSAdrian Chadd int ar9300_paprd_init_table(struct ath_hal *ah, struct ieee80211_channel * chan)
222676bd547bSAdrian Chadd {
2227*e113789bSAdrian Chadd     HAL_CHANNEL_INTERNAL *ichan = ath_hal_checkchannel(ah, chan);
2228*e113789bSAdrian Chadd 
2229*e113789bSAdrian Chadd     if ((AR_SREV_WASP(ah) && IS_CHAN_5GHZ(ichan)) ||
223076bd547bSAdrian Chadd          ar9300_paprd_setup_single_table(ah, chan)) {
223176bd547bSAdrian Chadd         goto FAIL;
223276bd547bSAdrian Chadd     }
223376bd547bSAdrian Chadd     OS_MEMZERO(AH9300(ah)->paprd_gain_table_entries,
223476bd547bSAdrian Chadd         sizeof(AH9300(ah)->paprd_gain_table_entries));
223576bd547bSAdrian Chadd     OS_MEMZERO(AH9300(ah)->paprd_gain_table_index,
223676bd547bSAdrian Chadd         sizeof(AH9300(ah)->paprd_gain_table_index));
223776bd547bSAdrian Chadd 
223876bd547bSAdrian Chadd     ar9300_gain_table_entries(ah);
223976bd547bSAdrian Chadd     return 0;
224076bd547bSAdrian Chadd FAIL:
224176bd547bSAdrian Chadd     return -1;
224276bd547bSAdrian Chadd }
224376bd547bSAdrian Chadd 
ar9300_paprd_is_done(struct ath_hal * ah)224476bd547bSAdrian Chadd int ar9300_paprd_is_done(struct ath_hal *ah)
224576bd547bSAdrian Chadd {
224676bd547bSAdrian Chadd     int temp, agc2_pwr;
224776bd547bSAdrian Chadd 
224876bd547bSAdrian Chadd     /*field_read("BB_paprd_trainer_stat1.paprd_train_done", &temp);*/
224976bd547bSAdrian Chadd     if (!AR_SREV_POSEIDON(ah)) {
225076bd547bSAdrian Chadd         temp =
225176bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1,
225276bd547bSAdrian Chadd                 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE);
225376bd547bSAdrian Chadd 
225476bd547bSAdrian Chadd         if (temp == 0x1) {
225576bd547bSAdrian Chadd             agc2_pwr =
225676bd547bSAdrian Chadd                 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1,
225776bd547bSAdrian Chadd                    AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_AGC2_PWR);
225876bd547bSAdrian Chadd 
225976bd547bSAdrian Chadd             HALDEBUG(ah, HAL_DEBUG_CALIBRATE,
226076bd547bSAdrian Chadd                    "%s AGC2_PWR=0x%2x Training done=0x%2x\n",
226176bd547bSAdrian Chadd                    __func__, agc2_pwr, temp);
226276bd547bSAdrian Chadd 
226376bd547bSAdrian Chadd             /* Retrain if agc2_pwr is not in ideal range */
226476bd547bSAdrian Chadd             if (agc2_pwr <= AH_PAPRD_IDEAL_AGC2_PWR_RANGE) {
226576bd547bSAdrian Chadd                 temp = 0;
226676bd547bSAdrian Chadd             }
226776bd547bSAdrian Chadd 		}
226876bd547bSAdrian Chadd     } else {
226976bd547bSAdrian Chadd         temp =
227076bd547bSAdrian Chadd             OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON,
227176bd547bSAdrian Chadd                 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE);
227276bd547bSAdrian Chadd     }
227376bd547bSAdrian Chadd     if (!temp) {
227476bd547bSAdrian Chadd         /*ath_hal_printf(ah, "%s[%d] PAPRD TEMp Error\n", __func__, __LINE__);*/
227576bd547bSAdrian Chadd     }
227676bd547bSAdrian Chadd 
227776bd547bSAdrian Chadd     return temp;
227876bd547bSAdrian Chadd }
227976bd547bSAdrian Chadd 
228076bd547bSAdrian Chadd /*
228176bd547bSAdrian Chadd  * ar9300_paprd_dec_tx_pwr
228276bd547bSAdrian Chadd  *
228376bd547bSAdrian Chadd  * This function do decrease tx power if Paprd is off or train failed.
228476bd547bSAdrian Chadd  */
228576bd547bSAdrian Chadd void
ar9300_paprd_dec_tx_pwr(struct ath_hal * ah)228676bd547bSAdrian Chadd ar9300_paprd_dec_tx_pwr(struct ath_hal *ah)
228776bd547bSAdrian Chadd {
228876bd547bSAdrian Chadd     u_int32_t   pwr_temp, pwr_reg;
228976bd547bSAdrian Chadd     int         i, loop_cnt;
229076bd547bSAdrian Chadd     struct ar9300_paprd_pwr_adjust  *p_item;
229176bd547bSAdrian Chadd     struct ath_hal_9300 *ahp = AH9300(ah);
229276bd547bSAdrian Chadd 
229376bd547bSAdrian Chadd     if (AR_SREV_POSEIDON(ah)) {
229476bd547bSAdrian Chadd         loop_cnt =
229576bd547bSAdrian Chadd         (sizeof(ar9300_paprd_pwr_adj_array) /
229676bd547bSAdrian Chadd             sizeof(struct ar9300_paprd_pwr_adjust));
229776bd547bSAdrian Chadd         for (i = 0; i < loop_cnt; i++ )
229876bd547bSAdrian Chadd         {
229976bd547bSAdrian Chadd             p_item = &ar9300_paprd_pwr_adj_array[i];
230076bd547bSAdrian Chadd             pwr_reg = OS_REG_READ(ah, p_item->reg_addr);
230176bd547bSAdrian Chadd             pwr_temp = ahp->ah_default_tx_power[p_item->target_rate];
230276bd547bSAdrian Chadd             pwr_temp -= (p_item->sub_db * 2);
230376bd547bSAdrian Chadd             pwr_temp = pwr_temp << p_item->reg_mask_offset;
230476bd547bSAdrian Chadd             pwr_temp |= (pwr_reg&~(p_item->reg_mask <<p_item->reg_mask_offset));
230576bd547bSAdrian Chadd 
230676bd547bSAdrian Chadd             if (pwr_temp != pwr_reg)
230776bd547bSAdrian Chadd             {
230876bd547bSAdrian Chadd                 OS_REG_WRITE(ah, p_item->reg_addr, pwr_temp);
230976bd547bSAdrian Chadd             }
231076bd547bSAdrian Chadd         }
231176bd547bSAdrian Chadd     }
231276bd547bSAdrian Chadd     return;
231376bd547bSAdrian Chadd }
231476bd547bSAdrian Chadd 
ar9300_paprd_thermal_send(struct ath_hal * ah)231576bd547bSAdrian Chadd int ar9300_paprd_thermal_send(struct ath_hal *ah)
231676bd547bSAdrian Chadd {
231776bd547bSAdrian Chadd     if (AR_SREV_HORNET(ah)) {
231876bd547bSAdrian Chadd         return OS_REG_READ(ah, AR_TFCNT);
231976bd547bSAdrian Chadd     } else {
232076bd547bSAdrian Chadd         return 1;
232176bd547bSAdrian Chadd     }
232276bd547bSAdrian Chadd }
232376bd547bSAdrian Chadd 
232476bd547bSAdrian Chadd #if 0
232576bd547bSAdrian Chadd void ar9300_paprd_test_prints(struct ath_hal *ah)
232676bd547bSAdrian Chadd {
232776bd547bSAdrian Chadd     u_int32_t i, reg = 0;
232876bd547bSAdrian Chadd 
232976bd547bSAdrian Chadd     HALDEBUG(NULL, HAL_DEBUG_CALIBRATE, "=====ar9300_paprd_test_prints=======\n");
233076bd547bSAdrian Chadd     /*printf("=====ar9300_paprd_test_prints=======\n");*/
233176bd547bSAdrian Chadd     HALDEBUG(NULL, HAL_DEBUG_CALIBRATE, "BB_paprd_ctrl0_b0 = 0x%08x\n",
233276bd547bSAdrian Chadd         OS_REG_READ(ah, AR_PHY_PAPRD_CTRL0_B0));
233376bd547bSAdrian Chadd     /*
233476bd547bSAdrian Chadd      * printf(
233576bd547bSAdrian Chadd      *     "BB_paprd_ctrl0_b0 = 0x%08x\n",
233676bd547bSAdrian Chadd      *     OS_REG_READ(ah, AR_PHY_PAPRD_CTRL0_B0));
233776bd547bSAdrian Chadd      */
233876bd547bSAdrian Chadd     if (!AR_SREV_POSEIDON(ah) && !AR_SREV_HORNET(ah)) {
233976bd547bSAdrian Chadd         HALDEBUG(NULL, HAL_DEBUG_CALIBRATE, "BB_paprd_ctrl0_b1 = 0x%08x\n",
234076bd547bSAdrian Chadd             OS_REG_READ(ah, AR_PHY_PAPRD_CTRL0_B1));
234176bd547bSAdrian Chadd         /*
234276bd547bSAdrian Chadd          * printf(
234376bd547bSAdrian Chadd          *     "BB_paprd_ctrl0_b1 = 0x%08x\n",
234476bd547bSAdrian Chadd          *     OS_REG_READ(ah, AR_PHY_PAPRD_CTRL0_B1));
234576bd547bSAdrian Chadd          */
234676bd547bSAdrian Chadd         HALDEBUG(NULL, HAL_DEBUG_CALIBRATE, "BB_paprd_ctrl0_b2 = 0x%08x\n",
234776bd547bSAdrian Chadd             OS_REG_READ(ah, AR_PHY_PAPRD_CTRL0_B2));
234876bd547bSAdrian Chadd         /*
234976bd547bSAdrian Chadd          * printf(
235076bd547bSAdrian Chadd          *     "BB_paprd_ctrl0_b2 = 0x%08x\n",
235176bd547bSAdrian Chadd          *     OS_REG_READ(ah, AR_PHY_PAPRD_CTRL0_B2));
235276bd547bSAdrian Chadd          */
235376bd547bSAdrian Chadd     }
235476bd547bSAdrian Chadd 
235576bd547bSAdrian Chadd     reg = AR_PHY_PAPRD_MEM_TAB_B0;
235676bd547bSAdrian Chadd     HALDEBUG(NULL, HAL_DEBUG_CALIBRATE,
235776bd547bSAdrian Chadd         "%s[%d] reg %08lx small_signal_gain ch0 0x%08x\n", __func__, __LINE__,
235876bd547bSAdrian Chadd         AR_PHY_PA_GAIN123_B0, OS_REG_READ(ah, AR_PHY_PA_GAIN123_B0));
235976bd547bSAdrian Chadd     /*
236076bd547bSAdrian Chadd      * printf(
236176bd547bSAdrian Chadd      *     "%s[%d] reg %08lx small_signal_gain ch0 0x%08x\n",
236276bd547bSAdrian Chadd      *     __func__,  __LINE__, AR_PHY_PA_GAIN123_B0,
236376bd547bSAdrian Chadd      *     OS_REG_READ(ah, AR_PHY_PA_GAIN123_B0));
236476bd547bSAdrian Chadd      */
236576bd547bSAdrian Chadd 
236676bd547bSAdrian Chadd     for (i = 0; i < 24; i++) {
236776bd547bSAdrian Chadd         HALDEBUG(NULL, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x = 0x%08x\n",
236876bd547bSAdrian Chadd             __func__, __LINE__, reg, OS_REG_READ(ah, reg));
236976bd547bSAdrian Chadd         /*
237076bd547bSAdrian Chadd          * printf(
237176bd547bSAdrian Chadd          *     "%s[%d] reg %08x = 0x%08x\n", __func__, __LINE__,
237276bd547bSAdrian Chadd          *     reg, OS_REG_READ(ah, reg));
237376bd547bSAdrian Chadd          */
237476bd547bSAdrian Chadd         reg = reg + 4;
237576bd547bSAdrian Chadd     }
237676bd547bSAdrian Chadd 
237776bd547bSAdrian Chadd     ar9300_paprd_debug_print(ah);
237876bd547bSAdrian Chadd     HALDEBUG(NULL, HAL_DEBUG_CALIBRATE,
237976bd547bSAdrian Chadd         "=====ar9300_paprd_test_prints end=======\n");
238076bd547bSAdrian Chadd     /*printf("=====ar9300_paprd_test_prints end=======\n");*/
238176bd547bSAdrian Chadd 
238276bd547bSAdrian Chadd     if (!AR_SREV_POSEIDON(ah)) {
238376bd547bSAdrian Chadd         reg = AR_PHY_PAPRD_MEM_TAB_B1;
238476bd547bSAdrian Chadd         printf("%s[%d] reg %08lx small_signal_gain ch1 0x%08x\n",
238576bd547bSAdrian Chadd             __func__, __LINE__,
238676bd547bSAdrian Chadd             AR_PHY_PA_GAIN123_B1, OS_REG_READ(ah, AR_PHY_PA_GAIN123_B1));
238776bd547bSAdrian Chadd         for (i = 0; i < 24; i++) {
238876bd547bSAdrian Chadd             OS_REG_WRITE(ah, reg, paprd_table_val[i]);
238976bd547bSAdrian Chadd             HALDEBUG(NULL, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x = 0x%08x\n",
239076bd547bSAdrian Chadd                 __func__, __LINE__, reg, OS_REG_READ(ah, reg));
239176bd547bSAdrian Chadd             printf("%s[%d] reg %08x = 0x%08x\n", __func__, __LINE__, reg,
239276bd547bSAdrian Chadd                 OS_REG_READ(ah, reg));
239376bd547bSAdrian Chadd             reg = reg + 4;
239476bd547bSAdrian Chadd         }
239576bd547bSAdrian Chadd 
239676bd547bSAdrian Chadd         reg = AR_PHY_PAPRD_MEM_TAB_B2;
239776bd547bSAdrian Chadd         printf("%s[%d] reg %08lx small_signal_gain ch2 0x%08x\n",
239876bd547bSAdrian Chadd             __func__, __LINE__,
239976bd547bSAdrian Chadd             AR_PHY_PA_GAIN123_B2, OS_REG_READ(ah, AR_PHY_PA_GAIN123_B2));
240076bd547bSAdrian Chadd     }
240176bd547bSAdrian Chadd }
240276bd547bSAdrian Chadd #endif
240376bd547bSAdrian Chadd 
240476bd547bSAdrian Chadd #else
240576bd547bSAdrian Chadd int
ar9300_paprd_init_table(struct ath_hal * ah,HAL_CHANNEL * chan)240676bd547bSAdrian Chadd ar9300_paprd_init_table(struct ath_hal *ah, HAL_CHANNEL * chan)
240776bd547bSAdrian Chadd {
240876bd547bSAdrian Chadd     return 0;
240976bd547bSAdrian Chadd }
241076bd547bSAdrian Chadd 
241176bd547bSAdrian Chadd HAL_STATUS
ar9300_paprd_setup_gain_table(struct ath_hal * ah,int chain_num)241276bd547bSAdrian Chadd ar9300_paprd_setup_gain_table(struct ath_hal * ah, int chain_num)
241376bd547bSAdrian Chadd {
241476bd547bSAdrian Chadd     return HAL_OK;
241576bd547bSAdrian Chadd }
241676bd547bSAdrian Chadd 
241776bd547bSAdrian Chadd HAL_STATUS
ar9300_paprd_create_curve(struct ath_hal * ah,HAL_CHANNEL * chan,int chain_num)241876bd547bSAdrian Chadd ar9300_paprd_create_curve(struct ath_hal * ah, HAL_CHANNEL * chan,
241976bd547bSAdrian Chadd     int chain_num)
242076bd547bSAdrian Chadd {
242176bd547bSAdrian Chadd     return HAL_OK;
242276bd547bSAdrian Chadd }
242376bd547bSAdrian Chadd 
242476bd547bSAdrian Chadd int
ar9300_paprd_is_done(struct ath_hal * ah)242576bd547bSAdrian Chadd ar9300_paprd_is_done(struct ath_hal *ah)
242676bd547bSAdrian Chadd {
242776bd547bSAdrian Chadd     return 0;
242876bd547bSAdrian Chadd }
242976bd547bSAdrian Chadd 
243076bd547bSAdrian Chadd void
ar9300_enable_paprd(struct ath_hal * ah,HAL_BOOL enable_flag,HAL_CHANNEL * chan)243176bd547bSAdrian Chadd ar9300_enable_paprd(struct ath_hal *ah, HAL_BOOL enable_flag, HAL_CHANNEL * chan)
243276bd547bSAdrian Chadd {
243376bd547bSAdrian Chadd     return;
243476bd547bSAdrian Chadd }
243576bd547bSAdrian Chadd 
243676bd547bSAdrian Chadd void
ar9300_populate_paprd_single_table(struct ath_hal * ah,HAL_CHANNEL * chan,int chain_num)243776bd547bSAdrian Chadd ar9300_populate_paprd_single_table(struct ath_hal *ah, HAL_CHANNEL * chan,
243876bd547bSAdrian Chadd     int chain_num)
243976bd547bSAdrian Chadd {
244076bd547bSAdrian Chadd     return;
244176bd547bSAdrian Chadd }
244276bd547bSAdrian Chadd 
244376bd547bSAdrian Chadd void
ar9300_paprd_dec_tx_pwr(struct ath_hal * ah)244476bd547bSAdrian Chadd ar9300_paprd_dec_tx_pwr(struct ath_hal *ah)
244576bd547bSAdrian Chadd {
244676bd547bSAdrian Chadd     return;
244776bd547bSAdrian Chadd }
244876bd547bSAdrian Chadd 
ar9300_paprd_thermal_send(struct ath_hal * ah)244976bd547bSAdrian Chadd int ar9300_paprd_thermal_send(struct ath_hal *ah)
245076bd547bSAdrian Chadd {
245176bd547bSAdrian Chadd     return 1;
245276bd547bSAdrian Chadd }
245376bd547bSAdrian Chadd #endif                          /* ATH_SUPPORT_PAPRD */
2454