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