1 /* 2 * Copyright (c) 2013 Qualcomm Atheros, Inc. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 13 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14 * PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #include "opt_ah.h" 18 #include "ah.h" 19 #include "ar9300.h" 20 #include "ah_internal.h" 21 #include "ar9300paprd.h" 22 #include "ar9300reg.h" 23 24 25 #if ATH_SUPPORT_PAPRD 26 27 static struct ar9300_paprd_pwr_adjust ar9300_paprd_pwr_adj_array[] = { 28 /* rate index , register offset , mask of register , */ 29 {ALL_TARGET_HT20_5, AR_PHY_POWERTX_RATE5, AR_PHY_POWERTX_RATE5_POWERTXHT20_3, 30 /* mask offset of register , offset dB*/ 31 AR_PHY_POWERTX_RATE5_POWERTXHT20_3_S, 1}, 32 {ALL_TARGET_HT20_6, AR_PHY_POWERTX_RATE6, AR_PHY_POWERTX_RATE6_POWERTXHT20_4, 33 AR_PHY_POWERTX_RATE6_POWERTXHT20_4_S, 2}, 34 {ALL_TARGET_HT20_7, AR_PHY_POWERTX_RATE6, AR_PHY_POWERTX_RATE6_POWERTXHT20_5, 35 AR_PHY_POWERTX_RATE6_POWERTXHT20_5_S, 2}, 36 {ALL_TARGET_HT40_5, AR_PHY_POWERTX_RATE7, AR_PHY_POWERTX_RATE7_POWERTXHT40_3, 37 AR_PHY_POWERTX_RATE7_POWERTXHT40_3_S, 1}, 38 {ALL_TARGET_HT40_6, AR_PHY_POWERTX_RATE8, AR_PHY_POWERTX_RATE8_POWERTXHT40_4, 39 AR_PHY_POWERTX_RATE8_POWERTXHT40_4_S, 2}, 40 {ALL_TARGET_HT40_7, AR_PHY_POWERTX_RATE8, AR_PHY_POWERTX_RATE8_POWERTXHT40_5, 41 AR_PHY_POWERTX_RATE8_POWERTXHT40_5_S, 2}, 42 {ALL_TARGET_LEGACY_54, AR_PHY_POWERTX_RATE2, AR_PHY_POWERTX_RATE2_POWERTX54M_7, 43 AR_PHY_POWERTX_RATE2_POWERTX54M_7_S, 2}, 44 }; 45 46 HAL_BOOL create_pa_curve(u_int32_t * paprd_train_data_l, 47 u_int32_t *paprd_train_data_u, u_int32_t *pa_table, u_int32_t *g_fxp_ext, 48 int * pa_in); 49 50 static int 51 ar9300_paprd_setup_single_table(struct ath_hal *ah, struct ieee80211_channel * chan) 52 { 53 int is_2g = IEEE80211_IS_CHAN_2GHZ(chan); 54 HAL_CHANNEL_INTERNAL *ichan = ath_hal_checkchannel(ah, chan); 55 struct ath_hal_9300 *ahp = AH9300(ah); 56 int is_ht40 = 0; 57 u_int32_t am_mask = 0; 58 u_int32_t val = OS_REG_READ(ah, AR_2040_MODE); 59 u_int8_t target_power_val_t2[ar9300_rate_size]; 60 int power_tblindex = 0, power_delta = 0; 61 int paprd_scale_factor = 5; 62 63 const u_int8_t mask2num[8] = { 64 0 /* 000 */, 65 1 /* 001 */, 66 1 /* 010 */, 67 2 /* 011 */, 68 1 /* 100 */, 69 2 /* 101 */, 70 2 /* 110 */, 71 3 /* 111 */ 72 }; 73 74 ar9300_eeprom_t *eep = &AH9300(ah)->ah_eeprom; 75 76 #define ABS(_x, _y) ((int)_x > (int)_y ? (int)_x - (int)_y : (int)_y - (int)_x) 77 78 ar9300_set_target_power_from_eeprom(ah, ichan->channel, target_power_val_t2); 79 if (val & HAL_HT_MACMODE_2040) { 80 is_ht40 = 1; 81 } 82 83 /* 84 * Note on paprd_scale_factor 85 * This factor is saved in eeprom as 3 bit fields in following fashion. 86 * In 5G there are 3 scale factors -- upper, mid and lower band. 87 * Upper band scale factor is coded in bits 25-27 of 88 * modal_header_5g.paprd_rate_mask_ht20. 89 * Mid band scale factor is coded in bits 28-30 of 90 * modal_header_5g.paprd_rate_mask_ht40. 91 * Lower band scale factor is coded in bits 25-27 of 92 * modal_header_5g.paprd_rate_mask_ht40. 93 * For 2G there is only one scale factor. It is saved in bits 25-27 of 94 * modal_header_2g.paprd_rate_mask_ht20. 95 */ 96 AH_PAPRD_GET_SCALE_FACTOR(paprd_scale_factor, eep, is_2g, ichan->channel); 97 if (is_2g) { 98 if (is_ht40) { 99 am_mask = ahp->ah_2g_paprd_rate_mask_ht40 & AH_PAPRD_AM_PM_MASK; 100 power_tblindex = ALL_TARGET_HT40_0_8_16; 101 } else { 102 am_mask = ahp->ah_2g_paprd_rate_mask_ht20 & AH_PAPRD_AM_PM_MASK; 103 power_tblindex = ALL_TARGET_HT20_0_8_16; 104 } 105 if (AR_SREV_HORNET(ah) || AR_SREV_WASP(ah) || AR_SREV_JUPITER(ah) || AR_SREV_APHRODITE(ah)) { 106 if (is_ht40) { 107 ahp->paprd_training_power = 108 target_power_val_t2[ALL_TARGET_HT40_7] + 2; 109 } else { 110 ahp->paprd_training_power = 111 target_power_val_t2[ALL_TARGET_HT20_7] + 2; 112 } 113 } else if (AR_SREV_POSEIDON(ah)) { 114 ahp->paprd_training_power = 25; 115 } else { 116 ahp->paprd_training_power = 117 OS_REG_READ_FIELD_ALT(ah, AR_PHY_POWERTX_RATE5, 118 AR_PHY_POWERTX_RATE5_POWERTXHT20_0); 119 if (ABS(target_power_val_t2[power_tblindex], 120 ahp->paprd_training_power) > paprd_scale_factor) 121 { 122 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, 123 "%s[%d]: Chan %d paprd failing EEP PWR 0x%08x" 124 "TGT PWR 0x%08x\n", __func__, __LINE__, ichan->channel, 125 target_power_val_t2[power_tblindex], 126 ahp->paprd_training_power); 127 goto FAILED; 128 } 129 130 power_delta = 131 ABS(ahp->paprd_training_power, 132 target_power_val_t2[power_tblindex]); 133 134 power_delta = power_delta > 4 ? 0 : 4 - power_delta; 135 ahp->paprd_training_power = 136 ahp->paprd_training_power - power_delta; 137 } 138 139 140 } else { 141 if (is_ht40) { 142 ahp->paprd_training_power = 143 OS_REG_READ_FIELD_ALT(ah, AR_PHY_POWERTX_RATE8, 144 AR_PHY_POWERTX_RATE8_POWERTXHT40_5); 145 am_mask = ahp->ah_5g_paprd_rate_mask_ht40 & AH_PAPRD_AM_PM_MASK; 146 switch (mask2num[ahp->ah_tx_chainmask]) 147 { 148 case 1: 149 power_delta = 6; 150 break; 151 case 2: 152 power_delta = 4; 153 break; 154 case 3: 155 power_delta = 2; 156 break; 157 default: 158 goto FAILED; 159 break; 160 } 161 power_tblindex = ALL_TARGET_HT40_7; 162 } else { 163 ahp->paprd_training_power = 164 OS_REG_READ_FIELD_ALT(ah, AR_PHY_POWERTX_RATE6, 165 AR_PHY_POWERTX_RATE6_POWERTXHT20_5); 166 am_mask = ahp->ah_5g_paprd_rate_mask_ht20 & AH_PAPRD_AM_PM_MASK; 167 switch (mask2num[ahp->ah_tx_chainmask]) 168 { 169 case 1: 170 power_delta = 6; 171 break; 172 case 2: 173 power_delta = 4; 174 break; 175 case 3: 176 power_delta = 2; 177 break; 178 default: 179 goto FAILED; 180 break; 181 } 182 power_tblindex = ALL_TARGET_HT20_7; 183 } 184 /* Adjust for scale factor */ 185 ahp->paprd_training_power += paprd_scale_factor; 186 /* 187 ath_hal_printf(ah, "%s[%d] paprd_scale_factor %d power_delta %d\n", 188 __func__, __LINE__, paprd_scale_factor, power_delta); 189 */ 190 if (ABS(target_power_val_t2[power_tblindex], ahp->paprd_training_power) 191 > paprd_scale_factor) 192 { 193 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, 194 "%s[%d]: Chan %d paprd failing EEP PWR 0x%08x TGT PWR 0x%08x\n", 195 __func__, __LINE__, ichan->channel, 196 target_power_val_t2[power_tblindex], ahp->paprd_training_power); 197 goto FAILED; 198 } 199 ahp->paprd_training_power = ahp->paprd_training_power + power_delta; 200 } 201 202 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s 2G %d HT40 %d am_mask 0x%08x\n", 203 __func__, is_2g, is_ht40, am_mask); 204 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_AM2AM, AR_PHY_PAPRD_AM2AM_MASK, 205 am_mask); 206 if (AR_SREV_HORNET(ah)) { 207 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK, 208 0); 209 } 210 else { 211 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK, 212 am_mask); 213 } 214 215 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_HT40, AR_PHY_PAPRD_HT40_MASK, 216 AR_PHY_PAPRD_HT40_MASK); 217 /* chain0 */ 218 if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN0_MASK) { 219 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0, 220 AR_PHY_PAPRD_CTRL0_B0_USE_SINGLE_TABLE_MASK, 1); 221 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, 222 AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_AM2PM_ENABLE_0, 1); 223 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, 224 AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_AM2AM_ENABLE_0, 1); 225 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, 226 AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_SCALING_ENA, 0); 227 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, 228 AR_PHY_PAPRD_CTRL1_B0_PA_GAIN_SCALE_FACT_0_MASK, 181); 229 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, 230 AR_PHY_PAPRD_CTRL1_B0_PAPRD_MAG_SCALE_FACT_0, 361); 231 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, 232 AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_SCALING_ENA, 0); 233 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0, 234 AR_PHY_PAPRD_CTRL0_B0_PAPRD_MAG_THRSH_0, 3); 235 } 236 237 /* chain1 */ 238 if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN1_MASK) { 239 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1, 240 AR_PHY_PAPRD_CTRL0_B1_PAPRD_ADAPTIVE_USE_SINGLE_TABLE_1, 1); 241 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1, 242 AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_AM2PM_ENABLE_1, 1); 243 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1, 244 AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_AM2AM_ENABLE_1, 1); 245 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1, 246 AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_SCALING_ENA, 0); 247 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1, 248 AR_PHY_PAPRD_CTRL1_B1_PA_GAIN_SCALE_FACT_1_MASK, 181); 249 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1, 250 AR_PHY_PAPRD_CTRL1_B1_PAPRD_MAG_SCALE_FACT_1, 361); 251 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1, 252 AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_SCALING_ENA, 0); 253 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1, 254 AR_PHY_PAPRD_CTRL0_B1_PAPRD_MAG_THRSH_1, 3); 255 } 256 257 /* chain2 */ 258 if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN2_MASK) { 259 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2, 260 AR_PHY_PAPRD_CTRL0_B2_PAPRD_ADAPTIVE_USE_SINGLE_TABLE_2, 1); 261 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2, 262 AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_AM2PM_ENABLE_2, 1); 263 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2, 264 AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_AM2AM_ENABLE_2, 1); 265 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2, 266 AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_SCALING_ENA, 0); 267 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2, 268 AR_PHY_PAPRD_CTRL1_B2_PA_GAIN_SCALE_FACT_2_MASK, 181); 269 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2, 270 AR_PHY_PAPRD_CTRL1_B2_PAPRD_MAG_SCALE_FACT_2, 361); 271 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2, 272 AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_SCALING_ENA, 0); 273 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2, 274 AR_PHY_PAPRD_CTRL0_B2_PAPRD_MAG_THRSH_2, 3); 275 } 276 277 ar9300_enable_paprd(ah, AH_FALSE, chan); 278 if (AR_SREV_POSEIDON(ah)) { 279 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON, 280 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_SKIP, 0x30); 281 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON, 282 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_ENABLE, 1); 283 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON, 284 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_TX_GAIN_FORCE, 1); 285 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON, 286 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_RX_BB_GAIN_FORCE, 0); 287 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON, 288 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_IQCORR_ENABLE, 0); 289 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON, 290 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_AGC2_SETTLING, 28); 291 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON, 292 AR_PHY_PAPRD_TRAINER_CNTL1_CF_CF_PAPRD_TRAIN_ENABLE, 1); 293 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL2_POSEIDON, 294 AR_PHY_PAPRD_TRAINER_CNTL2_CF_PAPRD_INIT_RX_BB_GAIN, 148); 295 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 296 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_FINE_CORR_LEN, 4); 297 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 298 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_COARSE_CORR_LEN, 4); 299 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 300 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_NUM_CORR_STAGES, 7); 301 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 302 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_MIN_LOOPBACK_DEL, 1); 303 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 304 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP, -3); 305 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 306 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_ADC_DESIRED_SIZE, -15); 307 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 308 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_BBTXMIX_DISABLE, 1); 309 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4_POSEIDON, 310 AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_SAFETY_DELTA, 0); 311 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4_POSEIDON, 312 AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_MIN_CORR, 400); 313 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4_POSEIDON, 314 AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_NUM_TRAIN_SAMPLES, 100); 315 } else { 316 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1, 317 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_SKIP, 0x30); 318 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1, 319 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_ENABLE, 1); 320 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1, 321 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_TX_GAIN_FORCE, 1); 322 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1, 323 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_RX_BB_GAIN_FORCE, 0); 324 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1, 325 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_IQCORR_ENABLE, 0); 326 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1, 327 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_AGC2_SETTLING, 28); 328 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1, 329 AR_PHY_PAPRD_TRAINER_CNTL1_CF_CF_PAPRD_TRAIN_ENABLE, 1); 330 if (is_2g) { 331 if(AR_SREV_JUPITER(ah) || AR_SREV_APHRODITE(ah)){ 332 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL2, 333 AR_PHY_PAPRD_TRAINER_CNTL2_CF_PAPRD_INIT_RX_BB_GAIN, 0x91); 334 }else{ 335 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL2, 336 AR_PHY_PAPRD_TRAINER_CNTL2_CF_PAPRD_INIT_RX_BB_GAIN, 147); 337 } 338 } 339 else if (AR_SREV_WASP(ah) && !is_2g) { 340 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL2, 341 AR_PHY_PAPRD_TRAINER_CNTL2_CF_PAPRD_INIT_RX_BB_GAIN, 137); 342 } else { 343 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL2, 344 AR_PHY_PAPRD_TRAINER_CNTL2_CF_PAPRD_INIT_RX_BB_GAIN, 147); 345 } 346 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 347 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_FINE_CORR_LEN, 4); 348 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 349 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_COARSE_CORR_LEN, 4); 350 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 351 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_NUM_CORR_STAGES, 7); 352 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 353 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_MIN_LOOPBACK_DEL, 1); 354 if (AR_SREV_HORNET(ah) || AR_SREV_WASP(ah) || AR_SREV_JUPITER(ah) || AR_SREV_APHRODITE(ah)) { 355 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 356 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP, -3); 357 } else { 358 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 359 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP, -6); 360 } 361 if (is_2g) { 362 if(AR_SREV_JUPITER(ah) || AR_SREV_APHRODITE(ah)){ 363 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 364 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_ADC_DESIRED_SIZE, -10); 365 }else{ 366 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 367 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_ADC_DESIRED_SIZE, -15); 368 } 369 } 370 else { 371 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 372 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_ADC_DESIRED_SIZE, -10); 373 } 374 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 375 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_BBTXMIX_DISABLE, 1); 376 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4, 377 AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_SAFETY_DELTA, 0); 378 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4, 379 AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_MIN_CORR, 400); 380 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4, 381 AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_NUM_TRAIN_SAMPLES, 100); 382 } 383 384 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_0_B0, 385 AR_PHY_PAPRD_PRE_POST_SCALE_0_B0_PAPRD_PRE_POST_SCALING_0_0, 261376); 386 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_1_B0, 387 AR_PHY_PAPRD_PRE_POST_SCALE_1_B0_PAPRD_PRE_POST_SCALING_1_0, 248079); 388 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_2_B0, 389 AR_PHY_PAPRD_PRE_POST_SCALE_2_B0_PAPRD_PRE_POST_SCALING_2_0, 233759); 390 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_3_B0, 391 AR_PHY_PAPRD_PRE_POST_SCALE_3_B0_PAPRD_PRE_POST_SCALING_3_0, 220464); 392 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_4_B0, 393 AR_PHY_PAPRD_PRE_POST_SCALE_4_B0_PAPRD_PRE_POST_SCALING_4_0, 208194); 394 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_5_B0, 395 AR_PHY_PAPRD_PRE_POST_SCALE_5_B0_PAPRD_PRE_POST_SCALING_5_0, 196949); 396 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_6_B0, 397 AR_PHY_PAPRD_PRE_POST_SCALE_6_B0_PAPRD_PRE_POST_SCALING_6_0, 185706); 398 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_PRE_POST_SCALE_7_B0, 399 AR_PHY_PAPRD_PRE_POST_SCALE_7_B0_PAPRD_PRE_POST_SCALING_7_0, 175487); 400 return 0; 401 402 FAILED: 403 return -1; 404 #undef ABS 405 } 406 407 /* 408 * XXX There's another copy of this in ar9300_reset.c, use that! 409 */ 410 #if 0 411 static inline HAL_CHANNEL_INTERNAL* 412 ar9300_check_chan(struct ath_hal *ah, HAL_CHANNEL *chan) 413 { 414 if ((AR9300_IS_CHAN(chan, CHANNEL_2GHZ) ^ 415 AR9300_IS_CHAN(chan, CHANNEL_5GHZ)) == 0) 416 { 417 HALDEBUG(ah, HAL_DEBUG_CHANNEL, 418 "%s: invalid channel %u/0x%x; not marked as 2GHz or 5GHz\n", 419 __func__, chan->channel, chan->channel_flags); 420 return AH_NULL; 421 } 422 423 if ((AR9300_IS_CHAN(chan, CHANNEL_OFDM) ^ 424 AR9300_IS_CHAN(chan, CHANNEL_CCK) ^ 425 AR9300_IS_CHAN(chan, CHANNEL_HT20) ^ 426 AR9300_IS_CHAN(chan, CHANNEL_HT40PLUS) ^ 427 AR9300_IS_CHAN(chan, CHANNEL_HT40MINUS)) == 0) 428 { 429 HALDEBUG(ah, HAL_DEBUG_CHANNEL, 430 "%s: invalid channel %u/0x%x; not marked as " 431 "OFDM or CCK or HT20 or HT40PLUS or HT40MINUS\n", __func__, 432 chan->channel, chan->channel_flags); 433 return AH_NULL; 434 } 435 436 return (ath_hal_checkchannel(ah, chan)); 437 } 438 #endif 439 440 void ar9300_enable_paprd(struct ath_hal *ah, HAL_BOOL enable_flag, 441 struct ieee80211_channel * chan) 442 { 443 HAL_BOOL enable = enable_flag; 444 u_int32_t am_mask = 0; 445 u_int32_t val = OS_REG_READ(ah, AR_2040_MODE); 446 int is_2g = IEEE80211_IS_CHAN_2GHZ(chan); 447 HAL_CHANNEL_INTERNAL *ichan = ath_hal_checkchannel(ah, chan); 448 int is_ht40 = 0; 449 struct ath_hal_9300 *ahp = AH9300(ah); 450 451 if (val & HAL_HT_MACMODE_2040) { 452 is_ht40 = 1; 453 } 454 if (enable_flag == AH_TRUE) { 455 ar9300_eeprom_t *eep = &AH9300(ah)->ah_eeprom; 456 457 if (!is_2g) { 458 /* 459 * 3 bits for modal_header_5g.paprd_rate_mask_ht20 460 * is used for sub band disabling of paprd. 461 * 5G band is divided into 3 sub bands -- upper, mid, lower. 462 * If bit 30 of modal_header_5g.paprd_rate_mask_ht20 is set 463 * to one -- disable paprd for upper 5G 464 * If bit 29 of modal_header_5g.paprd_rate_mask_ht20 is set 465 * to one -- disable paprd for mid 5G 466 * If bit 28 of modal_header_5g.paprd_rate_mask_ht20 is set 467 * to one -- disable paprd for lower 5G 468 * u_int32_t am_mask = eep->modal_header_5g.paprd_rate_mask_ht20; 469 */ 470 if (ichan->channel >= UPPER_5G_SUB_BANDSTART) { 471 if (eep->modal_header_5g.paprd_rate_mask_ht20 & (1 << 30)) { 472 enable = AH_FALSE; 473 } 474 } else if (ichan->channel >= MID_5G_SUB_BANDSTART) { 475 if (eep->modal_header_5g.paprd_rate_mask_ht20 & (1 << 29)) { 476 enable = AH_FALSE; 477 } 478 } else { /* must be in the lower 5G subband */ 479 if (eep->modal_header_5g.paprd_rate_mask_ht20 & (1 << 28)) { 480 enable = AH_FALSE; 481 } 482 } 483 } 484 485 if (ahp->ah_paprd_broken) { 486 ahp->ah_paprd_broken = AH_FALSE; 487 enable = AH_FALSE; 488 489 HALDEBUG(ah, HAL_DEBUG_UNMASKABLE, 490 "%s: PAPRD is in bad state. Don't enable PAPRD\n", 491 __func__); 492 } 493 } 494 if (enable) { 495 HAL_CHANNEL_INTERNAL *ichan; 496 if (is_2g) { 497 if (is_ht40) { 498 am_mask = ahp->ah_2g_paprd_rate_mask_ht40 & AH_PAPRD_AM_PM_MASK; 499 } else { 500 am_mask = ahp->ah_2g_paprd_rate_mask_ht20 & AH_PAPRD_AM_PM_MASK; 501 } 502 } else { 503 if (is_ht40) { 504 am_mask = ahp->ah_5g_paprd_rate_mask_ht40 & AH_PAPRD_AM_PM_MASK; 505 } else { 506 am_mask = ahp->ah_5g_paprd_rate_mask_ht20 & AH_PAPRD_AM_PM_MASK; 507 } 508 } 509 /* Earlier we promgrammed TGT Power with Scaled down value, since 510 * PAPRD CAL was not done. 511 * Now we finish PAPRD CAL, so bump up the TGT PWR to original 512 * EEPROM Power. CTLs calc and Maverickd in 513 * "ar9300_eeprom_set_transmit_power" 514 */ 515 ichan = ar9300_check_chan(ah, chan); 516 ichan->paprd_table_write_done = 1; 517 // chan->paprd_table_write_done = 1; 518 /* 519 ath_hal_printf(ah, "%s[%d] eeprom_set_transmit_power PAPRD\n", 520 __func__, __LINE__); 521 */ 522 if (ar9300_eeprom_set_transmit_power(ah, &ahp->ah_eeprom, chan, 523 ath_hal_getctl(ah, chan), ath_hal_getantennaallowed(ah, chan), 524 ath_hal_get_twice_max_regpower(AH_PRIVATE(ah), ichan, chan), 525 AH_MIN(MAX_RATE_POWER, AH_PRIVATE(ah)->ah_powerLimit)) != HAL_OK) { 526 ichan->paprd_table_write_done = 0; 527 // chan->paprd_table_write_done = 0; 528 /* Intentional print */ 529 ath_hal_printf(ah, 530 "%s[%d] eeprom_set_transmit_power failed ABORT PAPRD\n", 531 __func__, __LINE__); 532 533 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0, 534 AR_PHY_PAPRD_CTRL0_B0_PAPRD_ENABLE_0, 0); 535 if (!AR_SREV_POSEIDON(ah) && !AR_SREV_HORNET(ah)) { 536 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1, 537 AR_PHY_PAPRD_CTRL0_B1_PAPRD_ENABLE_1, 0); 538 if (!AR_SREV_JUPITER(ah) || (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN2_MASK)) { 539 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2, 540 AR_PHY_PAPRD_CTRL0_B2_PAPRD_ENABLE_2, 0); 541 542 } 543 } 544 return; 545 } 546 547 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s 2G %d HT40 %d am_mask 0x%08x\n", 548 __func__, is_2g, is_ht40, am_mask); 549 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_AM2AM, AR_PHY_PAPRD_AM2AM_MASK, 550 am_mask); 551 if (AR_SREV_HORNET(ah)) { 552 OS_REG_RMW_FIELD_ALT(ah, 553 AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK, 0); 554 } else { 555 OS_REG_RMW_FIELD_ALT(ah, 556 AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK, am_mask); 557 } 558 559 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_HT40, AR_PHY_PAPRD_HT40_MASK, 560 AR_PHY_PAPRD_HT40_MASK); 561 /* chain0 */ 562 if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN0_MASK) { 563 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0, 564 AR_PHY_PAPRD_CTRL0_B0_USE_SINGLE_TABLE_MASK, 1); 565 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, 566 AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_AM2PM_ENABLE_0, 1); 567 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, 568 AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_AM2AM_ENABLE_0, 1); 569 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, 570 AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_SCALING_ENA, 0); 571 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, 572 AR_PHY_PAPRD_CTRL1_B0_PA_GAIN_SCALE_FACT_0_MASK, 181); 573 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, 574 AR_PHY_PAPRD_CTRL1_B0_PAPRD_MAG_SCALE_FACT_0, 361); 575 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, 576 AR_PHY_PAPRD_CTRL1_B0_ADAPTIVE_SCALING_ENA, 0); 577 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0, 578 AR_PHY_PAPRD_CTRL0_B0_PAPRD_MAG_THRSH_0, 3); 579 } 580 /* chain1 */ 581 if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN1_MASK) { 582 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1, 583 AR_PHY_PAPRD_CTRL0_B1_PAPRD_ADAPTIVE_USE_SINGLE_TABLE_1, 1); 584 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1, 585 AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_AM2PM_ENABLE_1, 1); 586 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1, 587 AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_AM2AM_ENABLE_1, 1); 588 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1, 589 AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_SCALING_ENA, 0); 590 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1, 591 AR_PHY_PAPRD_CTRL1_B1_PA_GAIN_SCALE_FACT_1_MASK, 181); 592 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1, 593 AR_PHY_PAPRD_CTRL1_B1_PAPRD_MAG_SCALE_FACT_1, 361); 594 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1, 595 AR_PHY_PAPRD_CTRL1_B1_ADAPTIVE_SCALING_ENA, 0); 596 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1, 597 AR_PHY_PAPRD_CTRL0_B1_PAPRD_MAG_THRSH_1, 3); 598 } 599 /* chain2 */ 600 if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN2_MASK) { 601 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2, 602 AR_PHY_PAPRD_CTRL0_B2_PAPRD_ADAPTIVE_USE_SINGLE_TABLE_2, 1); 603 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2, 604 AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_AM2PM_ENABLE_2, 1); 605 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2, 606 AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_AM2AM_ENABLE_2, 1); 607 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2, 608 AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_SCALING_ENA, 0); 609 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2, 610 AR_PHY_PAPRD_CTRL1_B2_PA_GAIN_SCALE_FACT_2_MASK, 181); 611 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2, 612 AR_PHY_PAPRD_CTRL1_B2_PAPRD_MAG_SCALE_FACT_2, 361); 613 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2, 614 AR_PHY_PAPRD_CTRL1_B2_ADAPTIVE_SCALING_ENA, 0); 615 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2, 616 AR_PHY_PAPRD_CTRL0_B2_PAPRD_MAG_THRSH_2, 3); 617 } 618 619 if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN0_MASK) { 620 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0, 621 AR_PHY_PAPRD_CTRL0_B0_PAPRD_ENABLE_0, 1); 622 } 623 624 if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN1_MASK) { 625 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1, 626 AR_PHY_PAPRD_CTRL0_B1_PAPRD_ENABLE_1, 1); 627 } 628 629 if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN2_MASK) { 630 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2, 631 AR_PHY_PAPRD_CTRL0_B2_PAPRD_ENABLE_2, 1); 632 } 633 634 } else { 635 if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN0_MASK) { 636 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0, 637 AR_PHY_PAPRD_CTRL0_B0_PAPRD_ENABLE_0, 0); 638 } 639 640 if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN1_MASK) { 641 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1, 642 AR_PHY_PAPRD_CTRL0_B1_PAPRD_ENABLE_1, 0); 643 } 644 645 if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN2_MASK) { 646 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2, 647 AR_PHY_PAPRD_CTRL0_B2_PAPRD_ENABLE_2, 0); 648 } 649 } 650 } 651 652 static void ar9300_gain_table_entries(struct ath_hal *ah) 653 { 654 int i; 655 u_int32_t reg; 656 u_int32_t *gain_table_entries = AH9300(ah)->paprd_gain_table_entries; 657 u_int32_t *gain_vs_table_index = AH9300(ah)->paprd_gain_table_index; 658 659 reg = AR_PHY_TXGAIN_TAB(1); 660 661 for (i = 0; i < 32; i++) { 662 gain_table_entries[i] = OS_REG_READ(ah, reg); 663 gain_vs_table_index[i] = (gain_table_entries[i] >> 24) & 0xff; 664 /* 665 * ath_hal_printf( 666 * ah, "+++reg 0x%08x gain_table_entries[%d] = 0x%08x \n", 667 * reg, i, gain_table_entries[i]); 668 */ 669 reg = reg + 4; 670 } 671 } 672 673 /* Get gain index for Target power */ 674 static unsigned int ar9300_get_desired_gain_for_chain(struct ath_hal *ah, 675 int chain_num, int target_power) 676 { 677 int olpc_gain_delta = 0; 678 int alpha_therm = 0, alpha_volt = 0; 679 int therm_cal_value = 0, volt_cal_value = 0; 680 int latest_therm_value = 0, latest_volt_value = 0, olpc_gain_delta_tmp = 0; 681 int thermal_gain_corr = 0, voltage_gain_corr = 0, desired_scale = 0; 682 int desired_gain = 0; 683 int cl_gain_mod = 0; 684 685 /* Clear the training done bit */ 686 if (AR_SREV_POSEIDON(ah)) { 687 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON, 688 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE, 0); 689 } else { 690 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1, 691 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE, 0); 692 } 693 /*field_read("BB_tpc_12.desired_scale_ht40_5", &desired_scale);*/ 694 desired_scale = 695 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_12, 696 AR_PHY_TPC_12_DESIRED_SCALE_HT40_5); 697 /*field_read("BB_tpc_19.alpha_therm", &alpha_therm);*/ 698 alpha_therm = 699 OS_REG_READ_FIELD(ah, AR_PHY_TPC_19, AR_PHY_TPC_19_ALPHA_THERM); 700 /*field_read("BB_tpc_19.alpha_volt", &alpha_volt);*/ 701 alpha_volt = 702 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_19, AR_PHY_TPC_19_ALT_ALPHA_VOLT); 703 704 /*field_read("BB_tpc_18.therm_cal_value", &therm_cal_value);*/ 705 therm_cal_value = 706 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_18, 707 AR_PHY_TPC_18_ALT_THERM_CAL_VALUE); 708 /*field_read("BB_tpc_18.volt_cal_value", &volt_cal_value);*/ 709 volt_cal_value = 710 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_18, 711 AR_PHY_TPC_18_ALT_VOLT_CAL_VALUE); 712 713 /*field_read("BB_therm_adc_4.latest_therm_value", &latest_therm_value);*/ 714 latest_therm_value = 715 OS_REG_READ_FIELD_ALT(ah, AR_PHY_THERM_ADC_4, 716 AR_PHY_THERM_ADC_4_LATEST_THERM_VALUE); 717 /*field_read("BB_therm_adc_4.latest_volt_value", &latest_volt_value);*/ 718 latest_volt_value = 719 OS_REG_READ_FIELD_ALT(ah, AR_PHY_THERM_ADC_4, 720 AR_PHY_THERM_ADC_4_LATEST_VOLT_VALUE); 721 722 /* 723 * sprintf( 724 * field_name, "%s%d%s%d\0", "BB_tpc_11_b", 725 * chain_num, ".olpc_gain_delta_", chain_num); 726 */ 727 /*field_read(field_name, &olpc_gain_delta_tmp);*/ 728 729 730 if (chain_num == 0) { 731 olpc_gain_delta_tmp = 732 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_11_B0, 733 AR_PHY_TPC_11_B0_OLPC_GAIN_DELTA_0); 734 cl_gain_mod = OS_REG_READ_FIELD_ALT(ah, AR_PHY_CL_TAB_0, 735 AR_PHY_CL_TAB_0_CL_GAIN_MOD); 736 } else if (chain_num == 1) { 737 if (!AR_SREV_POSEIDON(ah)) { 738 olpc_gain_delta_tmp = 739 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_11_B1, 740 AR_PHY_TPC_11_B1_OLPC_GAIN_DELTA_1); 741 cl_gain_mod = OS_REG_READ_FIELD_ALT(ah, AR_PHY_CL_TAB_1, 742 AR_PHY_CL_TAB_1_CL_GAIN_MOD); 743 } 744 } else if (chain_num == 2) { 745 if (!AR_SREV_POSEIDON(ah)) { 746 olpc_gain_delta_tmp = 747 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_11_B2, 748 AR_PHY_TPC_11_B2_OLPC_GAIN_DELTA_2); 749 cl_gain_mod = OS_REG_READ_FIELD_ALT(ah, AR_PHY_CL_TAB_2, 750 AR_PHY_CL_TAB_2_CL_GAIN_MOD); 751 } 752 } else { 753 /* invalid chain_num */ 754 } 755 756 if (olpc_gain_delta_tmp < 128) { 757 olpc_gain_delta = olpc_gain_delta_tmp; 758 } else { 759 olpc_gain_delta = olpc_gain_delta_tmp - 256; 760 } 761 762 thermal_gain_corr = 763 (int) (alpha_therm * (latest_therm_value - therm_cal_value) + 764 128) >> 8; 765 voltage_gain_corr = 766 (int) (alpha_volt * (latest_volt_value - volt_cal_value) + 64) >> 7; 767 desired_gain = 768 target_power - olpc_gain_delta - thermal_gain_corr - 769 voltage_gain_corr + desired_scale + cl_gain_mod; 770 /* 771 * printf( 772 * "olpc_gain_delta %d, desired_gain %d\n", 773 * olpc_gain_delta, desired_gain); 774 */ 775 #if 0 776 ath_hal_printf(ah, 777 "+++ target_power %d olpc_gain_delta %d, cl_gain_mod %d," 778 "thermal_gain_corr %d voltage_gain_corr %d desired_scale %d" 779 "desired_gain %d\n", 780 target_power, olpc_gain_delta, cl_gain_mod, thermal_gain_corr, 781 voltage_gain_corr, 782 desired_scale, desired_gain); 783 #endif 784 return (unsigned int) desired_gain; 785 } 786 787 static void ar9300_tx_force_gain(struct ath_hal *ah, unsigned int gain_index) 788 { 789 int selected_gain_entry, txbb1dbgain, txbb6dbgain, txmxrgain; 790 int padrvgn_a, padrvgn_b, padrvgn_c, padrvgn_d; 791 u_int32_t *gain_table_entries = AH9300(ah)->paprd_gain_table_entries; 792 793 /*u_int32_t *gain_vs_table_index = ah->paprd_gain_table_index;*/ 794 selected_gain_entry = gain_table_entries[gain_index]; 795 txbb1dbgain = selected_gain_entry & 0x7; 796 txbb6dbgain = (selected_gain_entry >> 3) & 0x3; 797 txmxrgain = (selected_gain_entry >> 5) & 0xf; 798 padrvgn_a = (selected_gain_entry >> 9) & 0xf; 799 padrvgn_b = (selected_gain_entry >> 13) & 0xf; 800 padrvgn_c = (selected_gain_entry >> 17) & 0xf; 801 padrvgn_d = (selected_gain_entry >> 21) & 0x3; 802 803 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 804 AR_PHY_TX_FORCED_GAIN_FORCED_TXBB1DBGAIN, txbb1dbgain); 805 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 806 AR_PHY_TX_FORCED_GAIN_FORCED_TXBB6DBGAIN, txbb6dbgain); 807 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 808 AR_PHY_TX_FORCED_GAIN_FORCED_TXMXRGAIN, txmxrgain); 809 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 810 AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGNA, padrvgn_a); 811 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 812 AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGNB, padrvgn_b); 813 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 814 AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGNC, padrvgn_c); 815 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 816 AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGND, padrvgn_d); 817 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 818 AR_PHY_TX_FORCED_GAIN_FORCED_ENABLE_PAL, 0); 819 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 820 AR_PHY_TX_FORCED_GAIN_FORCE_TX_GAIN, 0); 821 822 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TPC_1, AR_PHY_TPC_1_FORCED_DAC_GAIN, 0); 823 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_TPC_1, AR_PHY_TPC_1_FORCE_DAC_GAIN, 0); 824 } 825 826 #define HAL_DEBUG_PAPRD HAL_DEBUG_CALIBRATE /* driver: conditionally print */ 827 828 #if defined(ART_PAPRD_DEBUG) || defined(AH_DEBUG) 829 static void ar9300_paprd_debug_print(struct ath_hal *ah) 830 { 831 int temp; 832 int txbb1dbgain, txbb6dbgain, txmxrgain; 833 int padrvgn_a, padrvgn_b, padrvgn_c, padrvgn_d; 834 835 if (AR_SREV_POSEIDON(ah)) { 836 /*field_read("BB_paprd_trainer_cntl1.cf_paprd_lb_skip", &temp);*/ 837 temp = 838 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON, 839 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_SKIP); 840 HALDEBUG(ah, HAL_DEBUG_PAPRD, 841 "BB_paprd_trainer_cntl1.cf_paprd_lb_skip=0x%x\n", temp); 842 /*field_read("BB_paprd_trainer_cntl1.cf_paprd_lb_enable", &temp);*/ 843 temp = 844 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON, 845 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_ENABLE); 846 HALDEBUG(ah, HAL_DEBUG_PAPRD, 847 "BB_paprd_trainer_cntl1.cf_paprd_lb_enable=0x%x\n", temp); 848 /*field_read("BB_paprd_trainer_cntl1.cf_paprd_tx_gain_force", &temp);*/ 849 temp = 850 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON, 851 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_TX_GAIN_FORCE); 852 HALDEBUG(ah, HAL_DEBUG_PAPRD, 853 "BB_paprd_trainer_cntl1.cf_paprd_tx_gain_force=0x%x\n", temp); 854 /* 855 * field_read( 856 * "BB_paprd_trainer_cntl1.cf_paprd_rx_bb_gain_force", &temp); 857 */ 858 temp = 859 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON, 860 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_RX_BB_GAIN_FORCE); 861 HALDEBUG(ah, HAL_DEBUG_PAPRD, 862 "BB_paprd_trainer_cntl1.cf_paprd_rx_bb_gain_force=0x%x\n", temp); 863 /*field_read("BB_paprd_trainer_cntl1.cf_paprd_iqcorr_enable", &temp);*/ 864 temp = 865 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON, 866 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_IQCORR_ENABLE); 867 HALDEBUG(ah, HAL_DEBUG_PAPRD, 868 "BB_paprd_trainer_cntl1.cf_paprd_iqcorr_enable=0x%x\n", temp); 869 /*field_read("BB_paprd_trainer_cntl1.cf_paprd_agc2_settling", &temp);*/ 870 temp = 871 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON, 872 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_AGC2_SETTLING); 873 HALDEBUG(ah, HAL_DEBUG_PAPRD, 874 "BB_paprd_trainer_cntl1.cf_paprd_agc2_settling=0x%x\n", temp); 875 /*field_read("BB_paprd_trainer_cntl1.cf_paprd_train_enable", &temp);*/ 876 temp = 877 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1_POSEIDON, 878 AR_PHY_PAPRD_TRAINER_CNTL1_CF_CF_PAPRD_TRAIN_ENABLE); 879 HALDEBUG(ah, HAL_DEBUG_PAPRD, 880 "BB_paprd_trainer_cntl1.cf_paprd_train_enable=0x%x\n", temp); 881 /* 882 * field_read("BB_paprd_trainer_cntl2.cf_paprd_init_rx_bb_gain", &temp); 883 */ 884 temp = 885 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL2_POSEIDON, 886 AR_PHY_PAPRD_TRAINER_CNTL2_CF_PAPRD_INIT_RX_BB_GAIN); 887 HALDEBUG(ah, HAL_DEBUG_PAPRD, 888 "BB_paprd_trainer_cntl2.cf_paprd_init_rx_bb_gain=0x%x\n", temp); 889 /*field_read("BB_paprd_trainer_cntl3.cf_paprd_fine_corr_len", &temp);*/ 890 temp = 891 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 892 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_FINE_CORR_LEN); 893 HALDEBUG(ah, HAL_DEBUG_PAPRD, 894 "BB_paprd_trainer_cntl3.cf_paprd_fine_corr_len=0x%x\n", temp); 895 /* 896 * field_read("BB_paprd_trainer_cntl3.cf_paprd_coarse_corr_len", &temp); 897 */ 898 temp = 899 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 900 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_COARSE_CORR_LEN); 901 HALDEBUG(ah, HAL_DEBUG_PAPRD, 902 "BB_paprd_trainer_cntl3.cf_paprd_coarse_corr_len=0x%x\n", temp); 903 /* 904 * field_read("BB_paprd_trainer_cntl3.cf_paprd_num_corr_stages", &temp); 905 */ 906 temp = 907 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 908 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_NUM_CORR_STAGES); 909 HALDEBUG(ah, HAL_DEBUG_PAPRD, 910 "BB_paprd_trainer_cntl3.cf_paprd_num_corr_stages=0x%x\n", temp); 911 /* 912 * field_read( 913 * "BB_paprd_trainer_cntl3.cf_paprd_min_loopback_del", &temp); 914 */ 915 temp = 916 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 917 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_MIN_LOOPBACK_DEL); 918 HALDEBUG(ah, HAL_DEBUG_PAPRD, 919 "BB_paprd_trainer_cntl3.cf_paprd_min_loopback_del=0x%x\n", temp); 920 /*field_read("BB_paprd_trainer_cntl3.cf_paprd_quick_drop", &temp);*/ 921 temp = 922 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 923 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP); 924 HALDEBUG(ah, HAL_DEBUG_PAPRD, 925 "BB_paprd_trainer_cntl3.cf_paprd_quick_drop=0x%x\n", temp); 926 /* 927 * field_read( 928 * "BB_paprd_trainer_cntl3.cf_paprd_adc_desired_size", &temp); 929 */ 930 temp = 931 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 932 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_ADC_DESIRED_SIZE); 933 HALDEBUG(ah, HAL_DEBUG_PAPRD, 934 "BB_paprd_trainer_cntl3.cf_paprd_adc_desired_size=0x%x\n", temp); 935 /* 936 * field_read("BB_paprd_trainer_cntl3.cf_paprd_bbtxmix_disable", &temp); 937 */ 938 temp = 939 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 940 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_BBTXMIX_DISABLE); 941 HALDEBUG(ah, HAL_DEBUG_PAPRD, 942 "BB_paprd_trainer_cntl3.cf_paprd_bbtxmix_disable=0x%x\n", temp); 943 /*field_read("BB_paprd_trainer_cntl4.cf_paprd_safety_delta", &temp);*/ 944 temp = 945 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4_POSEIDON, 946 AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_SAFETY_DELTA); 947 HALDEBUG(ah, HAL_DEBUG_PAPRD, 948 "BB_paprd_trainer_cntl4.cf_paprd_safety_delta=0x%x\n", temp); 949 /*field_read("BB_paprd_trainer_cntl4.cf_paprd_min_corr", &temp);*/ 950 temp = 951 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4_POSEIDON, 952 AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_MIN_CORR); 953 HALDEBUG(ah, HAL_DEBUG_PAPRD, 954 "BB_paprd_trainer_cntl4.cf_paprd_min_corr=0x%x\n", temp); 955 /*field_read("BB_paprd_trainer_stat1.paprd_agc2_pwr", &temp);*/ 956 temp = 957 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON, 958 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_AGC2_PWR); 959 HALDEBUG(ah, HAL_DEBUG_PAPRD, 960 " paprd_agc2_pwr = 0x%02x\n", temp); 961 /*field_read("BB_paprd_trainer_stat1.paprd_rx_gain_idx", &temp);*/ 962 temp = 963 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON, 964 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_RX_GAIN_IDX); 965 HALDEBUG(ah, HAL_DEBUG_PAPRD, 966 " paprd_rx_gain_idx = 0x%02x\n", temp); 967 /*field_read("BB_paprd_trainer_stat1.paprd_train_active", &temp);*/ 968 temp = 969 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON, 970 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_ACTIVE); 971 HALDEBUG(ah, HAL_DEBUG_PAPRD, 972 " paprd_train_active = 0x%08x\n", temp); 973 /*field_read("BB_paprd_trainer_stat1.paprd_corr_err", &temp);*/ 974 temp = 975 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON, 976 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_CORR_ERR); 977 HALDEBUG(ah, HAL_DEBUG_PAPRD, 978 " paprd_corr_err = 0x%08x\n", temp); 979 /*field_read("BB_paprd_trainer_stat1.paprd_train_incomplete", &temp);*/ 980 temp = 981 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON, 982 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_INCOMPLETE); 983 HALDEBUG(ah, HAL_DEBUG_PAPRD, 984 " paprd_train_incomplete = 0x%08x\n", temp); 985 /*field_read("BB_paprd_trainer_stat1.paprd_train_done", &temp);*/ 986 temp = 987 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON, 988 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE); 989 HALDEBUG(ah, HAL_DEBUG_PAPRD, 990 " paprd_train_done = 0x%08x\n", temp); 991 /*field_read("BB_paprd_trainer_stat2.paprd_fine_idx", &temp);*/ 992 temp = 993 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT2_POSEIDON, 994 AR_PHY_PAPRD_TRAINER_STAT2_PAPRD_FINE_IDX); 995 HALDEBUG(ah, HAL_DEBUG_PAPRD, 996 " paprd_fine_idx = 0x%08x\n", temp); 997 /*field_read("BB_paprd_trainer_stat2.paprd_coarse_idx", &temp);*/ 998 temp = 999 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT2_POSEIDON, 1000 AR_PHY_PAPRD_TRAINER_STAT2_PAPRD_COARSE_IDX); 1001 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1002 " paprd_coarse_idx = 0x%08x\n", temp); 1003 /*field_read("BB_paprd_trainer_stat2.paprd_fine_val", &temp);*/ 1004 temp = 1005 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT2_POSEIDON, 1006 AR_PHY_PAPRD_TRAINER_STAT2_PAPRD_FINE_VAL); 1007 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1008 " paprd_fine_val = 0x%08x\n", temp); 1009 /*field_read("BB_paprd_trainer_stat3.paprd_train_samples_cnt", &temp);*/ 1010 temp = 1011 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT3_POSEIDON, 1012 AR_PHY_PAPRD_TRAINER_STAT3_PAPRD_TRAIN_SAMPLES_CNT); 1013 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1014 " paprd_train_samples_cnt = 0x%08x\n", temp); 1015 } else { 1016 /*field_read("BB_paprd_trainer_cntl1.cf_paprd_lb_skip", &temp);*/ 1017 temp = 1018 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1, 1019 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_SKIP); 1020 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1021 "BB_paprd_trainer_cntl1.cf_paprd_lb_skip=0x%x\n", temp); 1022 /*field_read("BB_paprd_trainer_cntl1.cf_paprd_lb_enable", &temp);*/ 1023 temp = 1024 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1, 1025 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_LB_ENABLE); 1026 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1027 "BB_paprd_trainer_cntl1.cf_paprd_lb_enable=0x%x\n", temp); 1028 /*field_read("BB_paprd_trainer_cntl1.cf_paprd_tx_gain_force", &temp);*/ 1029 temp = 1030 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1, 1031 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_TX_GAIN_FORCE); 1032 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1033 "BB_paprd_trainer_cntl1.cf_paprd_tx_gain_force=0x%x\n", temp); 1034 /* 1035 * field_read( 1036 * "BB_paprd_trainer_cntl1.cf_paprd_rx_bb_gain_force", &temp); 1037 */ 1038 temp = 1039 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1, 1040 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_RX_BB_GAIN_FORCE); 1041 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1042 "BB_paprd_trainer_cntl1.cf_paprd_rx_bb_gain_force=0x%x\n", temp); 1043 /*field_read("BB_paprd_trainer_cntl1.cf_paprd_iqcorr_enable", &temp);*/ 1044 temp = 1045 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1, 1046 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_IQCORR_ENABLE); 1047 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1048 "BB_paprd_trainer_cntl1.cf_paprd_iqcorr_enable=0x%x\n", temp); 1049 /*field_read("BB_paprd_trainer_cntl1.cf_paprd_agc2_settling", &temp);*/ 1050 temp = 1051 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1, 1052 AR_PHY_PAPRD_TRAINER_CNTL1_CF_PAPRD_AGC2_SETTLING); 1053 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1054 "BB_paprd_trainer_cntl1.cf_paprd_agc2_settling=0x%x\n", temp); 1055 /*field_read("BB_paprd_trainer_cntl1.cf_paprd_train_enable", &temp);*/ 1056 temp = 1057 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL1, 1058 AR_PHY_PAPRD_TRAINER_CNTL1_CF_CF_PAPRD_TRAIN_ENABLE); 1059 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1060 "BB_paprd_trainer_cntl1.cf_paprd_train_enable=0x%x\n", temp); 1061 /* 1062 * field_read("BB_paprd_trainer_cntl2.cf_paprd_init_rx_bb_gain", &temp); 1063 */ 1064 temp = 1065 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL2, 1066 AR_PHY_PAPRD_TRAINER_CNTL2_CF_PAPRD_INIT_RX_BB_GAIN); 1067 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1068 "BB_paprd_trainer_cntl2.cf_paprd_init_rx_bb_gain=0x%x\n", temp); 1069 /*field_read("BB_paprd_trainer_cntl3.cf_paprd_fine_corr_len", &temp);*/ 1070 temp = 1071 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 1072 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_FINE_CORR_LEN); 1073 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1074 "BB_paprd_trainer_cntl3.cf_paprd_fine_corr_len=0x%x\n", temp); 1075 /* 1076 * field_read("BB_paprd_trainer_cntl3.cf_paprd_coarse_corr_len", &temp); 1077 */ 1078 temp = 1079 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 1080 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_COARSE_CORR_LEN); 1081 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1082 "BB_paprd_trainer_cntl3.cf_paprd_coarse_corr_len=0x%x\n", temp); 1083 /* 1084 * field_read("BB_paprd_trainer_cntl3.cf_paprd_num_corr_stages", &temp); 1085 */ 1086 temp = 1087 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 1088 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_NUM_CORR_STAGES); 1089 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1090 "BB_paprd_trainer_cntl3.cf_paprd_num_corr_stages=0x%x\n", temp); 1091 /* 1092 * field_read( 1093 * "BB_paprd_trainer_cntl3.cf_paprd_min_loopback_del", &temp); 1094 */ 1095 temp = 1096 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 1097 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_MIN_LOOPBACK_DEL); 1098 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1099 "BB_paprd_trainer_cntl3.cf_paprd_min_loopback_del=0x%x\n", temp); 1100 /*field_read("BB_paprd_trainer_cntl3.cf_paprd_quick_drop", &temp);*/ 1101 temp = 1102 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 1103 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP); 1104 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1105 "BB_paprd_trainer_cntl3.cf_paprd_quick_drop=0x%x\n", temp); 1106 /* 1107 * field_read( 1108 * "BB_paprd_trainer_cntl3.cf_paprd_adc_desired_size", &temp); 1109 */ 1110 temp = 1111 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 1112 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_ADC_DESIRED_SIZE); 1113 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1114 "BB_paprd_trainer_cntl3.cf_paprd_adc_desired_size=0x%x\n", temp); 1115 /* 1116 * field_read( 1117 * "BB_paprd_trainer_cntl3.cf_paprd_bbtxmix_disable", &temp); 1118 */ 1119 temp = 1120 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 1121 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_BBTXMIX_DISABLE); 1122 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1123 "BB_paprd_trainer_cntl3.cf_paprd_bbtxmix_disable=0x%x\n", temp); 1124 /*field_read("BB_paprd_trainer_cntl4.cf_paprd_safety_delta", &temp);*/ 1125 temp = 1126 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4, 1127 AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_SAFETY_DELTA); 1128 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1129 "BB_paprd_trainer_cntl4.cf_paprd_safety_delta=0x%x\n", temp); 1130 /*field_read("BB_paprd_trainer_cntl4.cf_paprd_min_corr", &temp);*/ 1131 temp = 1132 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL4, 1133 AR_PHY_PAPRD_TRAINER_CNTL4_CF_PAPRD_MIN_CORR); 1134 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1135 "BB_paprd_trainer_cntl4.cf_paprd_min_corr=0x%x\n", temp); 1136 /*field_read("BB_paprd_trainer_stat1.paprd_agc2_pwr", &temp);*/ 1137 temp = 1138 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1, 1139 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_AGC2_PWR); 1140 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1141 " paprd_agc2_pwr = 0x%02x\n", temp); 1142 /*field_read("BB_paprd_trainer_stat1.paprd_rx_gain_idx", &temp);*/ 1143 temp = 1144 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1, 1145 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_RX_GAIN_IDX); 1146 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1147 " paprd_rx_gain_idx = 0x%02x\n", temp); 1148 /*field_read("BB_paprd_trainer_stat1.paprd_train_active", &temp);*/ 1149 temp = 1150 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1, 1151 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_ACTIVE); 1152 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1153 " paprd_train_active = 0x%08x\n", temp); 1154 /*field_read("BB_paprd_trainer_stat1.paprd_corr_err", &temp);*/ 1155 temp = 1156 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1, 1157 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_CORR_ERR); 1158 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1159 " paprd_corr_err = 0x%08x\n", temp); 1160 /*field_read("BB_paprd_trainer_stat1.paprd_train_incomplete", &temp);*/ 1161 temp = 1162 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1, 1163 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_INCOMPLETE); 1164 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1165 " paprd_train_incomplete = 0x%08x\n", temp); 1166 /*field_read("BB_paprd_trainer_stat1.paprd_train_done", &temp);*/ 1167 temp = 1168 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1, 1169 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE); 1170 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1171 " paprd_train_done = 0x%08x\n", temp); 1172 /*field_read("BB_paprd_trainer_stat2.paprd_fine_idx", &temp);*/ 1173 temp = 1174 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT2, 1175 AR_PHY_PAPRD_TRAINER_STAT2_PAPRD_FINE_IDX); 1176 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1177 " paprd_fine_idx = 0x%08x\n", temp); 1178 /*field_read("BB_paprd_trainer_stat2.paprd_coarse_idx", &temp);*/ 1179 temp = 1180 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT2, 1181 AR_PHY_PAPRD_TRAINER_STAT2_PAPRD_COARSE_IDX); 1182 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1183 " paprd_coarse_idx = 0x%08x\n", temp); 1184 /*field_read("BB_paprd_trainer_stat2.paprd_fine_val", &temp);*/ 1185 temp = 1186 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT2, 1187 AR_PHY_PAPRD_TRAINER_STAT2_PAPRD_FINE_VAL); 1188 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1189 " paprd_fine_val = 0x%08x\n", temp); 1190 /*field_read("BB_paprd_trainer_stat3.paprd_train_samples_cnt", &temp);*/ 1191 temp = 1192 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT3, 1193 AR_PHY_PAPRD_TRAINER_STAT3_PAPRD_TRAIN_SAMPLES_CNT); 1194 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1195 " paprd_train_samples_cnt = 0x%08x\n", temp); 1196 } 1197 1198 /*field_read("BB_tpc_1.force_dac_gain", &temp);*/ 1199 temp = 1200 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_1, AR_PHY_TPC_1_FORCE_DAC_GAIN); 1201 HALDEBUG(ah, HAL_DEBUG_PAPRD, " dac_gain_forced = 0x%08x\n", 1202 temp); 1203 /*field_read("BB_tpc_1.forced_dac_gain", &temp);*/ 1204 temp = 1205 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TPC_1, AR_PHY_TPC_1_FORCED_DAC_GAIN); 1206 HALDEBUG(ah, HAL_DEBUG_PAPRD, " forced_dac_gain = 0x%08x\n", 1207 temp); 1208 1209 /*field_read("BB_paprd_ctrl0_b0.paprd_enable_0", &temp);*/ 1210 temp = 1211 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B0, 1212 AR_PHY_PAPRD_CTRL0_B0_PAPRD_ENABLE_0); 1213 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1214 " BB_paprd_ctrl0_b0.paprd_enable_0 = 0x%08x\n", temp); 1215 if (!AR_SREV_POSEIDON(ah)) { 1216 /*field_read("BB_paprd_ctrl0_b1.paprd_enable_1", &temp);*/ 1217 temp = 1218 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B1, 1219 AR_PHY_PAPRD_CTRL0_B1_PAPRD_ENABLE_1); 1220 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1221 " BB_paprd_ctrl0_b1.paprd_enable_1 = 0x%08x\n", temp); 1222 if (AH9300(ah)->ah_tx_chainmask & AR9300_CHAIN2_MASK) { 1223 /*field_read("BB_paprd_ctrl0_b2.paprd_enable_2", &temp);*/ 1224 temp = 1225 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL0_B2, 1226 AR_PHY_PAPRD_CTRL0_B2_PAPRD_ENABLE_2); 1227 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1228 " BB_paprd_ctrl0_b2.paprd_enable_2 = 0x%08x\n", temp); 1229 } 1230 } 1231 1232 /*field_read("BB_tx_forced_gain.forced_txbb1dbgain", &txbb1dbgain);*/ 1233 txbb1dbgain = 1234 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 1235 AR_PHY_TX_FORCED_GAIN_FORCED_TXBB1DBGAIN); 1236 /*field_read("BB_tx_forced_gain.forced_txbb6dbgain", &txbb6dbgain);*/ 1237 txbb6dbgain = 1238 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 1239 AR_PHY_TX_FORCED_GAIN_FORCED_TXBB6DBGAIN); 1240 /*field_read("BB_tx_forced_gain.forced_txmxrgain", &txmxrgain);*/ 1241 txmxrgain = 1242 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 1243 AR_PHY_TX_FORCED_GAIN_FORCED_TXMXRGAIN); 1244 /*field_read("BB_tx_forced_gain.forced_padrvgn_a", &padrvgn_a);*/ 1245 padrvgn_a = 1246 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 1247 AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGNA); 1248 /*field_read("BB_tx_forced_gain.forced_padrvgn_b", &padrvgn_b);*/ 1249 padrvgn_b = 1250 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 1251 AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGNB); 1252 /*field_read("BB_tx_forced_gain.forced_padrvgn_c", &padrvgn_c);*/ 1253 padrvgn_c = 1254 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 1255 AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGNC); 1256 /*field_read("BB_tx_forced_gain.forced_padrvgn_d", &padrvgn_d);*/ 1257 padrvgn_d = 1258 OS_REG_READ_FIELD_ALT(ah, AR_PHY_TX_FORCED_GAIN, 1259 AR_PHY_TX_FORCED_GAIN_FORCED_PADRVGND); 1260 1261 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1262 "txbb1dbgain=0x%x, txbb6dbgain=0x%x, txmxrgain=0x%x\n", 1263 txbb1dbgain, txbb6dbgain, txmxrgain); 1264 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1265 "padrvgn_a=0x%x, padrvgn_b=0x%x\n", padrvgn_a, padrvgn_b); 1266 HALDEBUG(ah, HAL_DEBUG_PAPRD, 1267 "padrvgn_c=0x%x, padrvgn_d=0x%x\n", padrvgn_c, padrvgn_d); 1268 } 1269 #else 1270 #define ar9300_paprd_debug_print(ah) /* dummy macro */ 1271 #endif /* defined(ART_PAPRD_DEBUG) || defined(AH_DEBUG) */ 1272 1273 static int ar9300_create_pa_curve(struct ath_hal *ah, u_int32_t * pa_table, 1274 u_int32_t * small_signal_gain, int * pa_in) 1275 { 1276 int i; 1277 int status; 1278 /*char field_name[100];*/ 1279 u_int32_t paprd_train_data_l[48], paprd_train_data_u[48]; 1280 u_int32_t reg; 1281 1282 ar9300_paprd_debug_print(ah); 1283 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_CHAN_INFO_MEMORY, 1284 AR_PHY_CHAN_INFO_MEMORY_CHANINFOMEM_S2_READ, 0); 1285 reg = AR_PHY_CHAN_INFO_TAB_0; 1286 1287 for (i = 0; i < 48; i++) { 1288 /* 1289 * sprintf( 1290 * field_name, "%s%d%s\0", "BB_chan_info_chan_tab_b0[", 1291 * i, "].chaninfo_word"); 1292 */ 1293 /*field_read(field_name, &paprd_train_data_l[i]);*/ 1294 paprd_train_data_l[i] = OS_REG_READ(ah, reg); 1295 reg = reg + 4; 1296 } 1297 1298 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_CHAN_INFO_MEMORY, 1299 AR_PHY_CHAN_INFO_MEMORY_CHANINFOMEM_S2_READ, 1); 1300 reg = AR_PHY_CHAN_INFO_TAB_0; 1301 1302 for (i = 0; i < 48; i++) { 1303 /* 1304 * sprintf( 1305 * field_name, "%s%d%s\0", "BB_chan_info_chan_tab_b0[", 1306 * i, "].chaninfo_word"); 1307 */ 1308 /*field_read(field_name, &paprd_train_data_u[i]);*/ 1309 paprd_train_data_u[i] = OS_REG_READ(ah, reg); 1310 reg = reg + 4; 1311 } 1312 1313 /* 1314 * for(i=0; i<48; i++) 1315 * ath_hal_printf( 1316 * ah, "%08x%08x\n", paprd_train_data_u[i], paprd_train_data_l[i]); 1317 */ 1318 status = 0; 1319 if (create_pa_curve( 1320 paprd_train_data_l, paprd_train_data_u, 1321 pa_table, small_signal_gain, pa_in) == 1322 AH_FALSE) 1323 { 1324 status = -2; 1325 } 1326 /* Clear the training done bit */ 1327 if (AR_SREV_POSEIDON(ah)) { 1328 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON, 1329 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE, 0); 1330 } else { 1331 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1, 1332 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE, 0); 1333 } 1334 return status; 1335 } 1336 1337 static int find_expn(int num) 1338 { 1339 int tmp, exp; 1340 1341 exp = 0; 1342 tmp = num >> 1; 1343 1344 while (tmp != 0) { 1345 tmp = tmp >> 1; 1346 exp++; 1347 } 1348 1349 return exp; 1350 } 1351 1352 static int find_proper_scale(int expn, int n) 1353 { 1354 int q_pw; 1355 1356 q_pw = (expn > n) ? expn - 10 : 0; 1357 return q_pw; 1358 } 1359 1360 static int find_max(int *array, int length) 1361 { 1362 int i, loc_max; 1363 1364 loc_max = 0; 1365 1366 for (i = 0; i < length; i++) { 1367 if (array[i] > loc_max) { 1368 loc_max = array[i]; 1369 } 1370 } 1371 1372 return loc_max; 1373 } 1374 1375 static int paprd_abs(int num) 1376 { 1377 if (num < 0) { 1378 return -num; 1379 } 1380 return num; 1381 } 1382 1383 #define NUM_BIN 23 1384 1385 HAL_BOOL create_pa_curve(u_int32_t * paprd_train_data_l, 1386 u_int32_t * paprd_train_data_u, u_int32_t * pa_table, 1387 u_int32_t * g_fxp_ext, int *pa_in) 1388 { 1389 unsigned int accum_cnt[NUM_BIN + 1]; 1390 unsigned int accum_tx[NUM_BIN + 1]; 1391 unsigned int accum_rx[NUM_BIN + 1]; 1392 unsigned int accum_ang[NUM_BIN + 1]; 1393 unsigned int thresh_accum_cnt; 1394 1395 int max_index; 1396 int scale_factor; 1397 1398 int x_est[NUM_BIN + 1]; 1399 int y[NUM_BIN + 1]; 1400 int theta[NUM_BIN + 1]; 1401 int y_sqr[NUM_BIN + 1]; 1402 int y_quad[NUM_BIN + 1]; 1403 int theta_tilde[NUM_BIN + 1]; 1404 int pa_angle[NUM_BIN + 1]; 1405 1406 int b1_tmp[NUM_BIN + 1]; 1407 int b2_tmp[NUM_BIN + 1]; 1408 int b1_abs[NUM_BIN + 1]; 1409 int b2_abs[NUM_BIN + 1]; 1410 1411 int y_lin[NUM_BIN + 1]; 1412 int y_est[NUM_BIN + 1]; 1413 int x_est_fxp1_nonlin[NUM_BIN + 1]; 1414 int x_tilde[NUM_BIN + 1]; 1415 int x_tilde_abs[NUM_BIN + 1]; 1416 1417 int g_fxp; 1418 int y_intercept; 1419 int order_x_by_y; 1420 int m, half_lo, half_hi; 1421 int sum_y_sqr; 1422 int sum_y_quad; 1423 int q_x, q_b1, q_b2; 1424 int beta_raw, alpha_raw, scale_b; 1425 int q_scale_b, q_beta, q_alpha; 1426 int alpha, beta; 1427 int order_1, order_2; 1428 int order1_5x, order2_3x; 1429 int order1_5x_rem, order2_3x_rem; 1430 int y5, y3, tmp; 1431 int bin, idx; 1432 int theta_low_bin = 0; 1433 1434 /* 1435 * [15:00] u16, accum_cnt[15:00]: number of samples in the bin 1436 * [42:16] u27, accum_tx[26:00]: sum(tx amplitude) of the bin 1437 * [63:43] u21, accum_rx[20:00]: 1438 * sum(rx amplitude distance to lower bin edge) of the bin 1439 * [90:64] s27, accum_ang[26:00]: sum(angles) of the bin 1440 */ 1441 max_index = 0; 1442 /* 1443 * Disregard any bin that contains less than 1444 * or equal to 16 counts of samples 1445 */ 1446 thresh_accum_cnt = 16; 1447 scale_factor = 5; 1448 1449 for (bin = 0; bin < NUM_BIN; bin++) { 1450 accum_cnt[bin] = paprd_train_data_l[bin] & 0xffff; 1451 /* lower 16 bit OR-ed upper 11 bits */ 1452 accum_tx[bin] = 1453 ((paprd_train_data_l[bin] >> 16) & 0xffff) | 1454 ((paprd_train_data_u[bin] & 0x7ff) << 16); 1455 accum_rx[bin] = 1456 ((paprd_train_data_u[bin] >> 11) & 0x1f) | 1457 ((paprd_train_data_l[bin + 23] & 0xffff) << 5); 1458 accum_ang[bin] = 1459 ((paprd_train_data_l[bin + 23] >> 16) & 0xffff) | 1460 ((paprd_train_data_u[bin + 23] & 0x7ff) << 16); 1461 /* 1462 * printf( 1463 * "%d\t%d\t%d\t%d\n", accum_cnt[bin], accum_tx[bin], 1464 * accum_rx[bin], accum_ang[bin]); 1465 */ 1466 if (accum_cnt[bin] > thresh_accum_cnt) { 1467 /* accum_cnt[i] will be non-zero at this point */ 1468 x_est[bin + 1] = 1469 ((((accum_tx[bin] << scale_factor) + 1470 accum_cnt[bin]) / accum_cnt[bin]) + 32) >> scale_factor; 1471 y[bin + 1] = 1472 (((((accum_rx[bin] << scale_factor) + 1473 accum_cnt[bin]) / accum_cnt[bin]) + 32) >> scale_factor) + 1474 (1 << scale_factor) * max_index + 16; 1475 if (accum_ang[bin] >= (1 << 26)) { 1476 theta[bin + 1] = 1477 ((accum_ang[bin] - (1 << 27)) * (1 << scale_factor) + 1478 accum_cnt[bin]); 1479 theta[bin + 1] = theta[bin + 1] / (int) accum_cnt[bin]; 1480 /* 1481 * theta[i+1] = 1482 * ((accum_ang[i] - (1 << 27)) * 1483 * (1 << scale_factor) + zz) / zz; 1484 */ 1485 } else { 1486 theta[bin + 1] = 1487 ((accum_ang[bin] * (1 << scale_factor)) + 1488 accum_cnt[bin]) / accum_cnt[bin]; 1489 } 1490 max_index++; 1491 } 1492 /* 1493 * printf( 1494 * "i=%d, theta[i+1]=%d\t%d\t%d\t%d\t%d\n", 1495 * i, theta[i+1], accum_cnt[i], 1496 * accum_tx[i], accum_rx[i], accum_ang[i]); 1497 */ 1498 } 1499 1500 /* 1501 * Find average theta of first 5 bin and all of those to same value. 1502 * Curve is linear at that range. 1503 */ 1504 for (bin = 1; bin < 6; bin++) { 1505 theta_low_bin += theta[bin]; 1506 } 1507 theta_low_bin = theta_low_bin / 5; 1508 for (bin = 1; bin < 6; bin++) { 1509 theta[bin] = theta_low_bin; 1510 } 1511 1512 /* Set values at origin */ 1513 theta[0] = theta_low_bin; 1514 1515 for (bin = 0; bin <= max_index; bin++) { 1516 theta[bin] = theta[bin] - theta_low_bin; 1517 /*printf("bin=%d, theta[bin] = %d\n", bin, theta[bin]);*/ 1518 } 1519 1520 x_est[0] = 0; 1521 y[0] = 0; 1522 scale_factor = 8; 1523 /* low signal gain */ 1524 if (x_est[6] == x_est[3]) { 1525 return AH_FALSE; 1526 } 1527 g_fxp = 1528 (((y[6] - y[3]) * 1 << scale_factor) + (x_est[6] - x_est[3])) / 1529 (x_est[6] - x_est[3]); 1530 if (g_fxp == 0) { 1531 /* 1532 * ath_hal_printf( 1533 * NULL, "%s[%d] Potential divide by zero error\n", 1534 * __func__, __LINE__); 1535 */ 1536 return AH_FALSE; 1537 } 1538 1539 for (bin = 0; bin <= max_index; bin++) { 1540 y_lin[bin] = 1541 (g_fxp * (x_est[bin] - x_est[3]) + (1 << scale_factor)) / 1542 (1 << scale_factor) + y[3]; 1543 } 1544 y_intercept = y_lin[0]; 1545 1546 for (bin = 0; bin <= max_index; bin++) { 1547 y_est[bin] = y[bin] - y_intercept; 1548 y_lin[bin] = y_lin[bin] - y_intercept; 1549 } 1550 1551 for (bin = 0; bin <= 3; bin++) { 1552 y_est[bin] = bin * 32; 1553 /* g_fxp was checked for zero already */ 1554 x_est[bin] = ((y_est[bin] * 1 << scale_factor) + g_fxp) / g_fxp; 1555 } 1556 1557 /* 1558 * for (bin = 0; bin <= max_index; bin++) { 1559 * printf("y_est[%d] = %d, x_est[%d]=%d\n", 1560 * bin, y_est[bin], bin, x_est[bin]); 1561 * } 1562 */ 1563 for (bin = 0; bin <= max_index; bin++) { 1564 x_est_fxp1_nonlin[bin] = 1565 x_est[bin] - ((1 << scale_factor) * y_est[bin] + g_fxp) / g_fxp; 1566 /*printf("x_est_fxp1_nonlin[%d] = %d\n", bin, x_est_fxp1_nonlin[bin]);*/ 1567 } 1568 1569 /* Check for divide by 0 */ 1570 if (y_est[max_index] == 0) { 1571 return AH_FALSE; 1572 } 1573 order_x_by_y = 1574 (x_est_fxp1_nonlin[max_index] + y_est[max_index]) / y_est[max_index]; 1575 if (order_x_by_y == 0) { 1576 m = 10; 1577 } else if (order_x_by_y == 1) { 1578 m = 9; 1579 } else { 1580 m = 8; 1581 } 1582 1583 half_lo = (max_index > 15) ? 7 : max_index >> 1; 1584 half_hi = max_index - half_lo; 1585 scale_factor = 8; 1586 sum_y_sqr = 0; 1587 sum_y_quad = 0; 1588 1589 for (bin = 0; bin <= half_hi; bin++) { 1590 if (y_est[bin + half_lo] == 0) { 1591 /* 1592 * ath_hal_printf( 1593 * NULL, "%s Potential divide by zero error\n", __func__); 1594 */ 1595 return AH_FALSE; 1596 } 1597 1598 x_tilde[bin] = 1599 (x_est_fxp1_nonlin[bin + half_lo] * (1 << m) + 1600 y_est[bin + half_lo]) / y_est[bin + half_lo]; 1601 x_tilde[bin] = (x_tilde[bin] * (1 << m) + y_est[bin + half_lo]) / 1602 y_est[bin + half_lo]; 1603 x_tilde[bin] = (x_tilde[bin] * (1 << m) + y_est[bin + half_lo]) / 1604 y_est[bin + half_lo]; 1605 1606 y_sqr[bin] = 1607 (y_est[bin + half_lo] * y_est[bin + half_lo] + 1608 (scale_factor * scale_factor)) / (scale_factor * scale_factor); 1609 x_tilde_abs[bin] = paprd_abs(x_tilde[bin]); 1610 y_quad[bin] = y_sqr[bin] * y_sqr[bin]; 1611 sum_y_sqr = sum_y_sqr + y_sqr[bin]; 1612 sum_y_quad = sum_y_quad + y_quad[bin]; 1613 } 1614 1615 /*printf("sum_y_sqr = %d, sum_y_quad=%d\n", sum_y_sqr, sum_y_quad);*/ 1616 1617 for (bin = 0; bin <= half_hi; bin++) { 1618 b1_tmp[bin] = y_sqr[bin] * (half_hi + 1) - sum_y_sqr; 1619 b2_tmp[bin] = sum_y_quad - sum_y_sqr * y_sqr[bin]; 1620 b1_abs[bin] = paprd_abs(b1_tmp[bin]); 1621 b2_abs[bin] = paprd_abs(b2_tmp[bin]); 1622 1623 /* 1624 * printf( 1625 * "bin=%d, b1_tmp[bin] = %d, b2_tmp[bin] = %d\n", 1626 * bin, b1_tmp[bin], b2_tmp[bin]); 1627 */ 1628 } 1629 1630 q_x = find_proper_scale(find_expn(find_max(x_tilde_abs, half_hi + 1)), 10); 1631 q_b1 = find_proper_scale(find_expn(find_max(b1_abs, half_hi + 1)), 10); 1632 q_b2 = find_proper_scale(find_expn(find_max(b2_abs, half_hi + 1)), 10); 1633 1634 beta_raw = 0; 1635 alpha_raw = 0; 1636 1637 for (bin = 0; bin <= half_hi; bin++) { 1638 x_tilde[bin] = x_tilde[bin] / (1 << q_x); 1639 b1_tmp[bin] = b1_tmp[bin] / (1 << q_b1); 1640 b2_tmp[bin] = b2_tmp[bin] / (1 << q_b2); 1641 1642 /* 1643 * printf( 1644 * "bin=%d, b1_tmp[bin]=%d b2_tmp[bin]=%d x_tilde[bin] = %d\n", 1645 * bin, b1_tmp[bin], b2_tmp[bin], x_tilde[bin]); 1646 */ 1647 beta_raw = beta_raw + b1_tmp[bin] * x_tilde[bin]; 1648 alpha_raw = alpha_raw + b2_tmp[bin] * x_tilde[bin]; 1649 } 1650 1651 scale_b = 1652 ((sum_y_quad / scale_factor) * (half_hi + 1) - 1653 (sum_y_sqr / scale_factor) * sum_y_sqr) * scale_factor; 1654 q_scale_b = find_proper_scale(find_expn(paprd_abs(scale_b)), 10); 1655 scale_b = scale_b / (1 << q_scale_b); 1656 /* Check for divide by 0 */ 1657 if (scale_b == 0) { 1658 return AH_FALSE; 1659 } 1660 q_beta = find_proper_scale(find_expn(paprd_abs(beta_raw)), 10); 1661 q_alpha = find_proper_scale(find_expn(paprd_abs(alpha_raw)), 10); 1662 1663 beta_raw = beta_raw / (1 << q_beta); 1664 alpha_raw = alpha_raw / (1 << q_alpha); 1665 alpha = (alpha_raw << 10) / scale_b; 1666 beta = (beta_raw << 10) / scale_b; 1667 order_1 = 3 * m - q_x - q_b1 - q_beta + 10 + q_scale_b; 1668 order_2 = 3 * m - q_x - q_b2 - q_alpha + 10 + q_scale_b; 1669 1670 order1_5x = order_1 / 5; 1671 order2_3x = order_2 / 3; 1672 1673 order1_5x_rem = order_1 - 5 * order1_5x; 1674 order2_3x_rem = order_2 - 3 * order2_3x; 1675 1676 for (idx = 0; idx < AR9300_PAPRD_TABLE_SZ; idx++) { 1677 tmp = idx * 32; 1678 y5 = ((beta * tmp) >> 6) >> order1_5x; 1679 y5 = (y5 * tmp) >> order1_5x; 1680 y5 = (y5 * tmp) >> order1_5x; 1681 y5 = (y5 * tmp) >> order1_5x; 1682 y5 = (y5 * tmp) >> order1_5x; 1683 1684 y5 = y5 >> order1_5x_rem; 1685 y3 = (alpha * tmp) >> order2_3x; 1686 y3 = (y3 * tmp) >> order2_3x; 1687 y3 = (y3 * tmp) >> order2_3x; 1688 1689 y3 = y3 >> order2_3x_rem; 1690 /* g_fxp was checked for zero already */ 1691 pa_in[idx] = y5 + y3 + (256 * tmp) / g_fxp; 1692 } 1693 1694 for (idx = 1; idx < 23; idx++) { 1695 tmp = pa_in[idx + 1] - pa_in[idx]; 1696 if (tmp < 0) { 1697 pa_in[idx + 1] = pa_in[idx] + (pa_in[idx] - pa_in[idx - 1]); 1698 } 1699 } 1700 1701 for (idx = 0; idx < AR9300_PAPRD_TABLE_SZ; idx++) { 1702 pa_in[idx] = (pa_in[idx] < 1400) ? pa_in[idx] : 1400; 1703 /*printf("idx=%d, pa_in[idx]=%d\n", i, pa_in[idx]);*/ 1704 } 1705 1706 beta_raw = 0; 1707 alpha_raw = 0; 1708 1709 for (bin = 0; bin <= half_hi; bin++) { 1710 /* 1711 * printf( 1712 * "bin=%d half_lo=%d m=%d theta[bin+half_lo]=%d " 1713 * "y_est[bin+half_lo]=%d\n", 1714 * bin, half_lo, m, theta[bin+half_lo], y_est[bin+half_lo]); 1715 */ 1716 /* y_est[] was already checked for zero */ 1717 theta_tilde[bin] = 1718 ((theta[bin + half_lo] << m) + y_est[bin + half_lo]) / 1719 y_est[bin + half_lo]; 1720 theta_tilde[bin] = ((theta_tilde[bin] << m) + y_est[bin + half_lo]) / 1721 y_est[bin + half_lo]; 1722 theta_tilde[bin] = ((theta_tilde[bin] << m) + y_est[bin + half_lo]) / 1723 y_est[bin + half_lo]; 1724 1725 /*printf("bin=%d theta_tilde[bin]=%d\n", bin, theta_tilde[bin]);*/ 1726 beta_raw = beta_raw + b1_tmp[bin] * theta_tilde[bin]; 1727 alpha_raw = alpha_raw + b2_tmp[bin] * theta_tilde[bin]; 1728 1729 /* 1730 printf("bin=%d, alpha_raw=%d, beta_raw=%d\n", bin, alpha_raw, beta_raw); 1731 */ 1732 } 1733 1734 q_beta = find_proper_scale(find_expn(paprd_abs(beta_raw)), 10); 1735 q_alpha = find_proper_scale(find_expn(paprd_abs(alpha_raw)), 10); 1736 1737 beta_raw = beta_raw / (1 << q_beta); 1738 alpha_raw = alpha_raw / (1 << q_alpha); 1739 /* scale_b checked for zero previously */ 1740 alpha = (alpha_raw << 10) / scale_b; 1741 beta = (beta_raw << 10) / scale_b; 1742 order_1 = 3 * m - q_x - q_b1 - q_beta + 10 + q_scale_b + 5; 1743 order_2 = 3 * m - q_x - q_b2 - q_alpha + 10 + q_scale_b + 5; 1744 1745 order1_5x = order_1 / 5; 1746 order2_3x = order_2 / 3; 1747 1748 order1_5x_rem = order_1 - 5 * order1_5x; 1749 order2_3x_rem = order_2 - 3 * order2_3x; 1750 1751 for (idx = 0; idx < AR9300_PAPRD_TABLE_SZ; idx++) { 1752 tmp = idx * 32; 1753 1754 if (beta > 0) { 1755 y5 = (((beta * tmp - 64) >> 6) - 1756 (1 << order1_5x)) / (1 << order1_5x); 1757 } else { 1758 y5 = ((((beta * tmp - 64) >> 6) + 1759 (1 << order1_5x)) / (1 << order1_5x)); 1760 } 1761 1762 y5 = (y5 * tmp) / (1 << order1_5x); 1763 y5 = (y5 * tmp) / (1 << order1_5x); 1764 y5 = (y5 * tmp) / (1 << order1_5x); 1765 y5 = (y5 * tmp) / (1 << order1_5x); 1766 1767 y5 = y5 / (1 << order1_5x_rem); 1768 1769 if (beta > 0) { 1770 y3 = (alpha * tmp - (1 << order2_3x)) / (1 << order2_3x); 1771 } else { 1772 y3 = (alpha * tmp + (1 << order2_3x)) / (1 << order2_3x); 1773 } 1774 1775 y3 = (y3 * tmp) / (1 << order2_3x); 1776 y3 = (y3 * tmp) / (1 << order2_3x); 1777 1778 y3 = y3 / (1 << order2_3x_rem); 1779 pa_angle[idx] = y5 + y3; 1780 /*printf("idx=%d, y5 = %d, y3=%d\n", idx, y5, y3);*/ 1781 pa_angle[idx] = 1782 (pa_angle[idx] < -150) ? -150 : ((pa_angle[idx] > 1783 150) ? 150 : pa_angle[idx]); 1784 } 1785 1786 pa_angle[0] = 0; 1787 pa_angle[1] = 0; 1788 pa_angle[2] = 0; 1789 pa_angle[3] = 0; 1790 1791 pa_angle[4] = (pa_angle[5] + 2) >> 1; 1792 1793 for (idx = 0; idx < AR9300_PAPRD_TABLE_SZ; idx++) { 1794 pa_table[idx] = ((pa_in[idx] & 0x7ff) << 11) + (pa_angle[idx] & 0x7ff); 1795 /* 1796 * HALDEBUG( 1797 * NULL, HAL_DEBUG_UNMASKABLE,"%d\t%d\t0x%x\n", 1798 * pa_in[idx], pa_angle[idx], pa_table[idx]); 1799 */ 1800 } 1801 1802 /*HALDEBUG(NULL, HAL_DEBUG_UNMASKABLE, "g_fxp = %d\n", g_fxp);*/ 1803 *g_fxp_ext = g_fxp; 1804 return AH_TRUE; 1805 } 1806 1807 // Due to a hardware bug, when transmitting with just one chain the papd 1808 // data for chain 0 is always used. So when using chain 2 or 4, the 1809 // corresponding data must be copied into the chain 0 area. 1810 void ar9300_swizzle_paprd_entries(struct ath_hal *ah, unsigned int txchain) 1811 { 1812 int i; 1813 u_int32_t *paprd_table_val = NULL; 1814 u_int32_t small_signal_gain = 0; 1815 u_int32_t reg = 0; 1816 1817 reg = AR_PHY_PAPRD_MEM_TAB_B0; 1818 switch (txchain) { 1819 case 0x1: 1820 case 0x3: 1821 case 0x7: 1822 paprd_table_val = &AH9300(ah)->pa_table[0][0]; 1823 small_signal_gain = AH9300(ah)->small_signal_gain[0]; 1824 break; 1825 case 0x2: 1826 paprd_table_val = &AH9300(ah)->pa_table[1][0]; 1827 small_signal_gain = AH9300(ah)->small_signal_gain[1]; 1828 break; 1829 case 0x4: 1830 paprd_table_val = &AH9300(ah)->pa_table[2][0]; 1831 small_signal_gain = AH9300(ah)->small_signal_gain[2]; 1832 break; 1833 default: 1834 // Error out. 1835 ath_hal_printf(ah, "YAK! Bad chain mask %x\n", txchain); 1836 return; 1837 } 1838 for (i = 0; i < AR9300_PAPRD_TABLE_SZ; i++) { 1839 OS_REG_WRITE(ah, reg, paprd_table_val[i]); 1840 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x = 0x%08x\n", __func__, 1841 __LINE__, reg, paprd_table_val[i]); 1842 1843 reg = reg + 4; 1844 } 1845 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PA_GAIN123_B0,AR_PHY_PA_GAIN123_B0_PA_GAIN1_0, small_signal_gain); 1846 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x small_signal_gain 0x%08x\n", __func__, __LINE__, 1847 (unsigned) AR_PHY_PA_GAIN123_B0, OS_REG_READ(ah, AR_PHY_PA_GAIN123_B0)); 1848 1849 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, AR_PHY_PAPRD_CTRL1_B0_PAPRD_POWER_AT_AM2AM_CAL_0, 1850 AH9300(ah)->paprd_training_power); 1851 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x = 0x%08x\n", __func__, __LINE__, 1852 (unsigned) AR_PHY_PAPRD_CTRL1_B0, OS_REG_READ(ah, AR_PHY_PAPRD_CTRL1_B0)); 1853 1854 } 1855 1856 void ar9300_populate_paprd_single_table(struct ath_hal *ah, 1857 struct ieee80211_channel *chan, int chain_num) 1858 { 1859 int i, j, bad_read = 0; 1860 #ifdef AH_DEBUG 1861 HAL_CHANNEL_INTERNAL *ichan = ath_hal_checkchannel(ah, chan); 1862 #endif 1863 u_int32_t *paprd_table_val = &AH9300(ah)->pa_table[chain_num][0]; 1864 u_int32_t small_signal_gain = AH9300(ah)->small_signal_gain[chain_num]; 1865 u_int32_t reg = 0; 1866 1867 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, 1868 "%s[%d]: channel %d paprd_done %d write %d\n", __func__, __LINE__, 1869 ichan->channel, ichan->paprd_done, ichan->paprd_table_write_done); 1870 1871 if (chain_num == 0) { 1872 reg = AR_PHY_PAPRD_MEM_TAB_B0; 1873 } else if (chain_num == 1) { 1874 reg = AR_PHY_PAPRD_MEM_TAB_B1; 1875 } else if (chain_num == 2) { 1876 reg = AR_PHY_PAPRD_MEM_TAB_B2; 1877 } 1878 1879 for (i = 0; i < AR9300_PAPRD_TABLE_SZ; i++) { 1880 if (AR_SREV_POSEIDON(ah)) { 1881 HALASSERT(chain_num == 0x1); 1882 if ((reg == AR_PHY_PAPRD_MEM_TAB_B1) || 1883 (reg == AR_PHY_PAPRD_MEM_TAB_B2)) { 1884 continue; 1885 } 1886 } 1887 /* 1888 * sprintf( 1889 * field_name, "%s%d[%d]%s\0", "BB_paprd_mem_tab_b", 1890 * chain_num, i, ".paprd_mem"); 1891 */ 1892 OS_REG_WRITE(ah, reg, paprd_table_val[i]); 1893 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x = 0x%08x\n", __func__, 1894 __LINE__, reg, paprd_table_val[i]); 1895 /* 1896 * printf( 1897 * "%s[%d] reg %08x = 0x%08x\n", 1898 * __func__, __LINE__, reg, paprd_table_val[i]); 1899 */ 1900 if (OS_REG_READ(ah, reg) == 0xdeadbeef) { 1901 HALDEBUG(ah, HAL_DEBUG_UNMASKABLE, 1902 "%s: Reg0x%x = 0xdeadbeef\n", __func__, reg); 1903 bad_read++; 1904 for (j = AR_PHY_PAPRD_MEM_TAB_B0; j < (AR_PHY_PAPRD_MEM_TAB_B0 + 0x10); j+=4) 1905 { 1906 if (OS_REG_READ(ah, j) == 0xdeadbeef) { 1907 HALDEBUG(ah, HAL_DEBUG_UNMASKABLE, 1908 "%s: Reg0x%x = 0xdeadbeef\n", __func__, j); 1909 bad_read++; 1910 } 1911 } 1912 for (j = AR_PHY_PAPRD_MEM_TAB_B1; j < (AR_PHY_PAPRD_MEM_TAB_B1 + 0x10); j+=4) 1913 { 1914 if (OS_REG_READ(ah, j) == 0xdeadbeef) { 1915 HALDEBUG(ah, HAL_DEBUG_UNMASKABLE, 1916 "%s: Reg0x%x = 0xdeadbeef\n", __func__, j); 1917 bad_read++; 1918 } 1919 } 1920 } 1921 1922 reg = reg + 4; 1923 } 1924 1925 if (bad_read > 4) { 1926 HALDEBUG(ah, HAL_DEBUG_UNMASKABLE, 1927 "%s: Get %d 0xdeadbeef. Mark PAPRD as broken.\n", 1928 __func__, bad_read); 1929 AH9300(ah)->ah_paprd_broken = AH_TRUE; 1930 } 1931 1932 if (chain_num == 0) { 1933 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PA_GAIN123_B0, 1934 AR_PHY_PA_GAIN123_B0_PA_GAIN1_0, small_signal_gain); 1935 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, 1936 "%s[%d] reg %08x small_signal_gain 0x%08x\n", __func__, __LINE__, 1937 (unsigned) AR_PHY_PA_GAIN123_B0, 1938 OS_REG_READ(ah, AR_PHY_PA_GAIN123_B0)); 1939 } else if (chain_num == 1) { 1940 if (!AR_SREV_POSEIDON(ah) && !AR_SREV_HORNET(ah) && !AR_SREV_APHRODITE(ah)) { 1941 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PA_GAIN123_B1, 1942 AR_PHY_PA_GAIN123_B1_PA_GAIN1_1, small_signal_gain); 1943 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, 1944 "%s[%d] reg %08x small_signal_gain 0x%08x\n", 1945 __func__, __LINE__, 1946 (unsigned) AR_PHY_PA_GAIN123_B1, 1947 OS_REG_READ(ah, AR_PHY_PA_GAIN123_B1)); 1948 } 1949 } else if (chain_num == 2) { 1950 if (!AR_SREV_POSEIDON(ah) && !AR_SREV_HORNET(ah) && !AR_SREV_APHRODITE(ah)) { 1951 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PA_GAIN123_B2, 1952 AR_PHY_PA_GAIN123_B2_PA_GAIN1_2, small_signal_gain); 1953 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, 1954 "%s[%d] reg %08x small_signal_gain 0x%08x\n", 1955 __func__, __LINE__, 1956 (unsigned) AR_PHY_PA_GAIN123_B2, 1957 OS_REG_READ(ah, AR_PHY_PA_GAIN123_B2)); 1958 } 1959 } else { 1960 /* invalid channel number */ 1961 } 1962 1963 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B0, 1964 AR_PHY_PAPRD_CTRL1_B0_PAPRD_POWER_AT_AM2AM_CAL_0, 1965 AH9300(ah)->paprd_training_power); 1966 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x = 0x%08x\n", __func__, 1967 __LINE__, (unsigned) AR_PHY_PAPRD_CTRL1_B0, 1968 OS_REG_READ(ah, AR_PHY_PAPRD_CTRL1_B0)); 1969 if (!AR_SREV_POSEIDON(ah) && !AR_SREV_HORNET(ah) && !AR_SREV_APHRODITE(ah)) { 1970 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B1, 1971 AR_PHY_PAPRD_CTRL1_B1_PAPRD_POWER_AT_AM2AM_CAL_1, 1972 AH9300(ah)->paprd_training_power); 1973 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x = 0x%08x\n", __func__, 1974 __LINE__, (unsigned) AR_PHY_PAPRD_CTRL1_B1, 1975 OS_REG_READ(ah, AR_PHY_PAPRD_CTRL1_B1)); 1976 if (!AR_SREV_WASP(ah) && !AR_SREV_JUPITER(ah)) { 1977 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_CTRL1_B2, 1978 AR_PHY_PAPRD_CTRL1_B2_PAPRD_POWER_AT_AM2AM_CAL_2, 1979 AH9300(ah)->paprd_training_power); 1980 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, 1981 "%s[%d] reg %08x = 0x%08x\n", __func__, 1982 __LINE__, (unsigned) AR_PHY_PAPRD_CTRL1_B2, 1983 OS_REG_READ(ah, AR_PHY_PAPRD_CTRL1_B2)); 1984 } 1985 } 1986 /*ar9300_enable_paprd(ah, AH_TRUE);*/ 1987 } 1988 1989 HAL_STATUS ar9300_paprd_setup_gain_table(struct ath_hal *ah, int chain_num) 1990 { 1991 unsigned int i, desired_gain, gain_index; 1992 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, 1993 "Run papredistortion single table algorithm:: Training power = %d\n", 1994 AH9300(ah)->paprd_training_power / 2); 1995 1996 if (AH9300(ah)->ah_tx_chainmask & (1 << chain_num)) { 1997 /* this is an active chain */ 1998 desired_gain = ar9300_get_desired_gain_for_chain( 1999 ah, chain_num, AH9300(ah)->paprd_training_power); 2000 /* find out gain index */ 2001 gain_index = 0; 2002 2003 for (i = 0; i < 32; i++) { 2004 if (AH9300(ah)->paprd_gain_table_index[i] < desired_gain) { 2005 gain_index = gain_index + 1; 2006 } else { 2007 break; 2008 } 2009 } 2010 2011 /*printf("gain_index = %d\n", gain_index);*/ 2012 /*ath_hal_printf(ah, "++++ gain_index = %d\n", gain_index);*/ 2013 ar9300_tx_force_gain(ah, gain_index); 2014 if (AR_SREV_POSEIDON(ah)) { 2015 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON, 2016 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE, 0); 2017 } else { 2018 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1, 2019 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE, 0); 2020 } 2021 } 2022 2023 return HAL_OK; 2024 } 2025 2026 static HAL_BOOL ar9300_paprd_retrain_pain(struct ath_hal * ah, int * pa_in) 2027 { 2028 int count = 0, i; 2029 int capdiv_offset = 0, quick_drop_offset; 2030 int capdiv2g, quick_drop; 2031 2032 capdiv2g = (OS_REG_READ(ah, AR_PHY_65NM_CH0_TXRF3) >> 1) & 0xF; 2033 if (!AR_SREV_POSEIDON(ah)) { 2034 quick_drop = 2035 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 2036 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP); 2037 } else { 2038 quick_drop = 2039 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 2040 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP); 2041 } 2042 2043 if ( quick_drop != 0 ) { 2044 quick_drop -= 0x40; 2045 } 2046 for (i = 0; i < (NUM_BIN + 1); i++) { 2047 if (pa_in[i] == 1400) { 2048 count++; 2049 } 2050 } 2051 2052 if (AR_SREV_POSEIDON(ah)) { 2053 if ((pa_in[23] < 800) || (pa_in[23] == 1400)) { 2054 if (pa_in[23] < 800) { 2055 capdiv_offset = (int)((1000 - pa_in[23] + 75) / 150); 2056 capdiv2g = capdiv2g + capdiv_offset; 2057 if (capdiv2g > 7) { 2058 capdiv2g = 7; 2059 if (pa_in[23] < 600) { 2060 quick_drop = quick_drop + 1; 2061 if (quick_drop > 0) { 2062 quick_drop = 0; 2063 } 2064 } 2065 } 2066 2067 OS_REG_RMW_FIELD(ah, 2068 AR_PHY_65NM_CH0_TXRF3, 2069 AR_PHY_65NM_CH0_TXRF3_CAPDIV2G, 2070 capdiv2g); 2071 2072 OS_REG_RMW_FIELD_ALT(ah, 2073 AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 2074 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP, 2075 quick_drop); 2076 2077 return AH_TRUE; 2078 } /* end of if (pa_in[23] < 800) */ 2079 else if (pa_in[23] == 1400) { 2080 quick_drop_offset = (int)(count / 3); 2081 if (quick_drop_offset > 2) { 2082 quick_drop_offset = 2; 2083 } 2084 quick_drop = quick_drop + quick_drop_offset; 2085 capdiv2g = capdiv2g + (int)(quick_drop_offset / 2); 2086 if (capdiv2g > 7) { 2087 capdiv2g = 7; 2088 } 2089 if (quick_drop > 0) { 2090 quick_drop = 0; 2091 capdiv2g = capdiv2g - (int)(quick_drop_offset / 1); 2092 if (capdiv2g < 0) { 2093 capdiv2g = 0; 2094 } 2095 } 2096 OS_REG_RMW_FIELD(ah, 2097 AR_PHY_65NM_CH0_TXRF3, 2098 AR_PHY_65NM_CH0_TXRF3_CAPDIV2G, 2099 capdiv2g); 2100 2101 OS_REG_RMW_FIELD_ALT(ah, 2102 AR_PHY_PAPRD_TRAINER_CNTL3_POSEIDON, 2103 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP, 2104 quick_drop); 2105 2106 return AH_TRUE; 2107 /* sleep(1); */ 2108 } /* end of if (pa_in[23] == 1400)*/ 2109 } /* end of if ((pa_in[23] < 800) || (pa_in[23] == 1400)) */ 2110 }else if (AR_SREV_HORNET(ah)) { 2111 if ((pa_in[23] < 1000) || (pa_in[23] == 1400)) { 2112 if (pa_in[23] < 1000) { 2113 capdiv_offset = ((1000 - pa_in[23]) / 100); 2114 capdiv2g = capdiv2g + capdiv_offset; 2115 if (capdiv_offset > 3) { 2116 quick_drop_offset = 1; 2117 quick_drop = quick_drop - quick_drop_offset; 2118 capdiv2g = capdiv2g + 1; 2119 if (capdiv2g > 6) { 2120 capdiv2g = 6; 2121 } 2122 if (quick_drop < -4) { 2123 quick_drop = -4; 2124 } 2125 OS_REG_RMW_FIELD(ah, 2126 AR_PHY_65NM_CH0_TXRF3, 2127 AR_PHY_65NM_CH0_TXRF3_CAPDIV2G, 2128 capdiv2g); 2129 OS_REG_RMW_FIELD_ALT(ah, 2130 AR_PHY_PAPRD_TRAINER_CNTL3, 2131 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP, 2132 quick_drop); 2133 return AH_TRUE; 2134 } else { 2135 capdiv2g = capdiv2g + capdiv_offset; 2136 if (capdiv2g > 6) { 2137 capdiv2g = 6; 2138 } 2139 if (quick_drop < -4) { 2140 quick_drop = -4; 2141 } 2142 OS_REG_RMW_FIELD(ah, 2143 AR_PHY_65NM_CH0_TXRF3, 2144 AR_PHY_65NM_CH0_TXRF3_CAPDIV2G, 2145 capdiv2g); 2146 OS_REG_RMW_FIELD_ALT(ah, 2147 AR_PHY_PAPRD_TRAINER_CNTL3, 2148 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP, 2149 quick_drop); 2150 return AH_TRUE; 2151 } 2152 } /* end of if (PA_in[23] < 1000) */ 2153 else if (pa_in[23] == 1400) { 2154 if (count > 3) { 2155 quick_drop_offset = 1; 2156 quick_drop = quick_drop + quick_drop_offset; 2157 capdiv2g = capdiv2g - (count / 4); 2158 if (capdiv2g < 0) { 2159 capdiv2g = 0; 2160 } 2161 if (quick_drop > -2) { 2162 quick_drop = -2; 2163 } 2164 OS_REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_TXRF3, 2165 AR_PHY_65NM_CH0_TXRF3_CAPDIV2G, 2166 capdiv2g); 2167 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 2168 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP, 2169 quick_drop); 2170 return AH_TRUE; 2171 } else { 2172 capdiv2g = capdiv2g - 1; 2173 if (capdiv2g < 0) { 2174 capdiv2g = 0; 2175 } 2176 OS_REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_TXRF3, 2177 AR_PHY_65NM_CH0_TXRF3_CAPDIV2G, 2178 capdiv2g); 2179 OS_REG_RMW_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_CNTL3, 2180 AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP, 2181 quick_drop); 2182 return AH_TRUE; 2183 } 2184 } /* end of if (PA_in[23] == 1400)*/ 2185 } /* end of if ((PA_in[23] < 1000) || (PA_in[23] == 1400)) */ 2186 } 2187 2188 return AH_FALSE; 2189 } 2190 2191 HAL_STATUS ar9300_paprd_create_curve(struct ath_hal * ah, 2192 struct ieee80211_channel * chan, int chain_num) 2193 { 2194 int status = 0; 2195 u_int32_t *pa_table, small_signal_gain; 2196 int pa_in[NUM_BIN + 1]; 2197 2198 if (AH9300(ah)->ah_tx_chainmask & (1 << chain_num)) { 2199 pa_table = &AH9300(ah)->pa_table[chain_num][0]; 2200 /* Compute PA table and gain index */ 2201 status = ar9300_create_pa_curve(ah, &pa_table[0], &small_signal_gain, 2202 &pa_in[0]); 2203 2204 if (AR_SREV_WASP(ah)) { 2205 OS_DELAY(1000); 2206 } 2207 2208 if (status != 0) { 2209 ath_hal_printf(ah, "ERROR:: paprd failed with error code = %d\n", 2210 status); 2211 return -1; 2212 } 2213 AH9300(ah)->small_signal_gain[chain_num] = small_signal_gain; 2214 2215 if (AR_SREV_POSEIDON(ah) || AR_SREV_HORNET(ah)) { 2216 if (ar9300_paprd_retrain_pain(ah, pa_in)) { 2217 /* need re-train PAPRD */ 2218 return HAL_EINPROGRESS; 2219 } 2220 } 2221 } 2222 return HAL_OK; 2223 } 2224 2225 int ar9300_paprd_init_table(struct ath_hal *ah, struct ieee80211_channel * chan) 2226 { 2227 HAL_CHANNEL_INTERNAL *ichan = ath_hal_checkchannel(ah, chan); 2228 2229 if ((AR_SREV_WASP(ah) && IS_CHAN_5GHZ(ichan)) || 2230 ar9300_paprd_setup_single_table(ah, chan)) { 2231 goto FAIL; 2232 } 2233 OS_MEMZERO(AH9300(ah)->paprd_gain_table_entries, 2234 sizeof(AH9300(ah)->paprd_gain_table_entries)); 2235 OS_MEMZERO(AH9300(ah)->paprd_gain_table_index, 2236 sizeof(AH9300(ah)->paprd_gain_table_index)); 2237 2238 ar9300_gain_table_entries(ah); 2239 return 0; 2240 FAIL: 2241 return -1; 2242 } 2243 2244 int ar9300_paprd_is_done(struct ath_hal *ah) 2245 { 2246 int temp, agc2_pwr; 2247 2248 /*field_read("BB_paprd_trainer_stat1.paprd_train_done", &temp);*/ 2249 if (!AR_SREV_POSEIDON(ah)) { 2250 temp = 2251 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1, 2252 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE); 2253 2254 if (temp == 0x1) { 2255 agc2_pwr = 2256 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1, 2257 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_AGC2_PWR); 2258 2259 HALDEBUG(ah, HAL_DEBUG_CALIBRATE, 2260 "%s AGC2_PWR=0x%2x Training done=0x%2x\n", 2261 __func__, agc2_pwr, temp); 2262 2263 /* Retrain if agc2_pwr is not in ideal range */ 2264 if (agc2_pwr <= AH_PAPRD_IDEAL_AGC2_PWR_RANGE) { 2265 temp = 0; 2266 } 2267 } 2268 } else { 2269 temp = 2270 OS_REG_READ_FIELD_ALT(ah, AR_PHY_PAPRD_TRAINER_STAT1_POSEIDON, 2271 AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE); 2272 } 2273 if (!temp) { 2274 /*ath_hal_printf(ah, "%s[%d] PAPRD TEMp Error\n", __func__, __LINE__);*/ 2275 } 2276 2277 return temp; 2278 } 2279 2280 /* 2281 * ar9300_paprd_dec_tx_pwr 2282 * 2283 * This function do decrease tx power if Paprd is off or train failed. 2284 */ 2285 void 2286 ar9300_paprd_dec_tx_pwr(struct ath_hal *ah) 2287 { 2288 u_int32_t pwr_temp, pwr_reg; 2289 int i, loop_cnt; 2290 struct ar9300_paprd_pwr_adjust *p_item; 2291 struct ath_hal_9300 *ahp = AH9300(ah); 2292 2293 if (AR_SREV_POSEIDON(ah)) { 2294 loop_cnt = 2295 (sizeof(ar9300_paprd_pwr_adj_array) / 2296 sizeof(struct ar9300_paprd_pwr_adjust)); 2297 for (i = 0; i < loop_cnt; i++ ) 2298 { 2299 p_item = &ar9300_paprd_pwr_adj_array[i]; 2300 pwr_reg = OS_REG_READ(ah, p_item->reg_addr); 2301 pwr_temp = ahp->ah_default_tx_power[p_item->target_rate]; 2302 pwr_temp -= (p_item->sub_db * 2); 2303 pwr_temp = pwr_temp << p_item->reg_mask_offset; 2304 pwr_temp |= (pwr_reg&~(p_item->reg_mask <<p_item->reg_mask_offset)); 2305 2306 if (pwr_temp != pwr_reg) 2307 { 2308 OS_REG_WRITE(ah, p_item->reg_addr, pwr_temp); 2309 } 2310 } 2311 } 2312 return; 2313 } 2314 2315 int ar9300_paprd_thermal_send(struct ath_hal *ah) 2316 { 2317 if (AR_SREV_HORNET(ah)) { 2318 return OS_REG_READ(ah, AR_TFCNT); 2319 } else { 2320 return 1; 2321 } 2322 } 2323 2324 #if 0 2325 void ar9300_paprd_test_prints(struct ath_hal *ah) 2326 { 2327 u_int32_t i, reg = 0; 2328 2329 HALDEBUG(NULL, HAL_DEBUG_CALIBRATE, "=====ar9300_paprd_test_prints=======\n"); 2330 /*printf("=====ar9300_paprd_test_prints=======\n");*/ 2331 HALDEBUG(NULL, HAL_DEBUG_CALIBRATE, "BB_paprd_ctrl0_b0 = 0x%08x\n", 2332 OS_REG_READ(ah, AR_PHY_PAPRD_CTRL0_B0)); 2333 /* 2334 * printf( 2335 * "BB_paprd_ctrl0_b0 = 0x%08x\n", 2336 * OS_REG_READ(ah, AR_PHY_PAPRD_CTRL0_B0)); 2337 */ 2338 if (!AR_SREV_POSEIDON(ah) && !AR_SREV_HORNET(ah)) { 2339 HALDEBUG(NULL, HAL_DEBUG_CALIBRATE, "BB_paprd_ctrl0_b1 = 0x%08x\n", 2340 OS_REG_READ(ah, AR_PHY_PAPRD_CTRL0_B1)); 2341 /* 2342 * printf( 2343 * "BB_paprd_ctrl0_b1 = 0x%08x\n", 2344 * OS_REG_READ(ah, AR_PHY_PAPRD_CTRL0_B1)); 2345 */ 2346 HALDEBUG(NULL, HAL_DEBUG_CALIBRATE, "BB_paprd_ctrl0_b2 = 0x%08x\n", 2347 OS_REG_READ(ah, AR_PHY_PAPRD_CTRL0_B2)); 2348 /* 2349 * printf( 2350 * "BB_paprd_ctrl0_b2 = 0x%08x\n", 2351 * OS_REG_READ(ah, AR_PHY_PAPRD_CTRL0_B2)); 2352 */ 2353 } 2354 2355 reg = AR_PHY_PAPRD_MEM_TAB_B0; 2356 HALDEBUG(NULL, HAL_DEBUG_CALIBRATE, 2357 "%s[%d] reg %08lx small_signal_gain ch0 0x%08x\n", __func__, __LINE__, 2358 AR_PHY_PA_GAIN123_B0, OS_REG_READ(ah, AR_PHY_PA_GAIN123_B0)); 2359 /* 2360 * printf( 2361 * "%s[%d] reg %08lx small_signal_gain ch0 0x%08x\n", 2362 * __func__, __LINE__, AR_PHY_PA_GAIN123_B0, 2363 * OS_REG_READ(ah, AR_PHY_PA_GAIN123_B0)); 2364 */ 2365 2366 for (i = 0; i < 24; i++) { 2367 HALDEBUG(NULL, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x = 0x%08x\n", 2368 __func__, __LINE__, reg, OS_REG_READ(ah, reg)); 2369 /* 2370 * printf( 2371 * "%s[%d] reg %08x = 0x%08x\n", __func__, __LINE__, 2372 * reg, OS_REG_READ(ah, reg)); 2373 */ 2374 reg = reg + 4; 2375 } 2376 2377 ar9300_paprd_debug_print(ah); 2378 HALDEBUG(NULL, HAL_DEBUG_CALIBRATE, 2379 "=====ar9300_paprd_test_prints end=======\n"); 2380 /*printf("=====ar9300_paprd_test_prints end=======\n");*/ 2381 2382 if (!AR_SREV_POSEIDON(ah)) { 2383 reg = AR_PHY_PAPRD_MEM_TAB_B1; 2384 printf("%s[%d] reg %08lx small_signal_gain ch1 0x%08x\n", 2385 __func__, __LINE__, 2386 AR_PHY_PA_GAIN123_B1, OS_REG_READ(ah, AR_PHY_PA_GAIN123_B1)); 2387 for (i = 0; i < 24; i++) { 2388 OS_REG_WRITE(ah, reg, paprd_table_val[i]); 2389 HALDEBUG(NULL, HAL_DEBUG_CALIBRATE, "%s[%d] reg %08x = 0x%08x\n", 2390 __func__, __LINE__, reg, OS_REG_READ(ah, reg)); 2391 printf("%s[%d] reg %08x = 0x%08x\n", __func__, __LINE__, reg, 2392 OS_REG_READ(ah, reg)); 2393 reg = reg + 4; 2394 } 2395 2396 reg = AR_PHY_PAPRD_MEM_TAB_B2; 2397 printf("%s[%d] reg %08lx small_signal_gain ch2 0x%08x\n", 2398 __func__, __LINE__, 2399 AR_PHY_PA_GAIN123_B2, OS_REG_READ(ah, AR_PHY_PA_GAIN123_B2)); 2400 } 2401 } 2402 #endif 2403 2404 #else 2405 int 2406 ar9300_paprd_init_table(struct ath_hal *ah, HAL_CHANNEL * chan) 2407 { 2408 return 0; 2409 } 2410 2411 HAL_STATUS 2412 ar9300_paprd_setup_gain_table(struct ath_hal * ah, int chain_num) 2413 { 2414 return HAL_OK; 2415 } 2416 2417 HAL_STATUS 2418 ar9300_paprd_create_curve(struct ath_hal * ah, HAL_CHANNEL * chan, 2419 int chain_num) 2420 { 2421 return HAL_OK; 2422 } 2423 2424 int 2425 ar9300_paprd_is_done(struct ath_hal *ah) 2426 { 2427 return 0; 2428 } 2429 2430 void 2431 ar9300_enable_paprd(struct ath_hal *ah, HAL_BOOL enable_flag, HAL_CHANNEL * chan) 2432 { 2433 return; 2434 } 2435 2436 void 2437 ar9300_populate_paprd_single_table(struct ath_hal *ah, HAL_CHANNEL * chan, 2438 int chain_num) 2439 { 2440 return; 2441 } 2442 2443 void 2444 ar9300_paprd_dec_tx_pwr(struct ath_hal *ah) 2445 { 2446 return; 2447 } 2448 2449 int ar9300_paprd_thermal_send(struct ath_hal *ah) 2450 { 2451 return 1; 2452 } 2453 #endif /* ATH_SUPPORT_PAPRD */ 2454