306
306
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
307
307
{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
309
{ { CTL(60, 1), CTL(60, 0), CTL(0, 0), CTL(0, 0) } },
309
{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
310
310
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
311
311
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
883
883
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
884
884
{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
886
{ { CTL(60, 1), CTL(60, 0), CTL(0, 0), CTL(0, 0) } },
886
{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
887
887
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
888
888
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2039
2039
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2040
2040
{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
2042
{ { CTL(60, 1), CTL(60, 0), CTL(0, 0), CTL(0, 0) } },
2042
{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
2043
2043
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2044
2044
{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
3330
3328
cptr = AR9300_BASE_ADDR;
3331
3329
ath_dbg(common, ATH_DBG_EEPROM,
3332
"Trying EEPROM accesss at Address 0x%04x\n", cptr);
3330
"Trying EEPROM access at Address 0x%04x\n", cptr);
3333
3331
if (ar9300_check_eeprom_header(ah, read, cptr))
3336
3334
cptr = AR9300_BASE_ADDR_512;
3337
3335
ath_dbg(common, ATH_DBG_EEPROM,
3338
"Trying EEPROM accesss at Address 0x%04x\n", cptr);
3336
"Trying EEPROM access at Address 0x%04x\n", cptr);
3339
3337
if (ar9300_check_eeprom_header(ah, read, cptr))
3342
3340
read = ar9300_read_otp;
3343
3341
cptr = AR9300_BASE_ADDR;
3344
3342
ath_dbg(common, ATH_DBG_EEPROM,
3345
"Trying OTP accesss at Address 0x%04x\n", cptr);
3343
"Trying OTP access at Address 0x%04x\n", cptr);
3346
3344
if (ar9300_check_eeprom_header(ah, read, cptr))
3349
3347
cptr = AR9300_BASE_ADDR_512;
3350
3348
ath_dbg(common, ATH_DBG_EEPROM,
3351
"Trying OTP accesss at Address 0x%04x\n", cptr);
3349
"Trying OTP access at Address 0x%04x\n", cptr);
3352
3350
if (ar9300_check_eeprom_header(ah, read, cptr))
3445
3443
int bias = ar9003_hw_xpa_bias_level_get(ah, is2ghz);
3447
if (AR_SREV_9485(ah))
3445
if (AR_SREV_9485(ah) || AR_SREV_9340(ah))
3448
3446
REG_RMW_FIELD(ah, AR_CH0_TOP2, AR_CH0_TOP2_XPABIASLVL, bias);
3450
3448
REG_RMW_FIELD(ah, AR_CH0_TOP, AR_CH0_TOP_XPABIASLVL, bias);
3451
REG_RMW_FIELD(ah, AR_CH0_THERM, AR_CH0_THERM_XPABIASLVL_MSB,
3453
REG_RMW_FIELD(ah, AR_CH0_THERM, AR_CH0_THERM_XPASHORT2GND, 1);
3449
REG_RMW_FIELD(ah, AR_CH0_THERM,
3450
AR_CH0_THERM_XPABIASLVL_MSB,
3452
REG_RMW_FIELD(ah, AR_CH0_THERM,
3453
AR_CH0_THERM_XPASHORT2GND, 1);
3498
3498
static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz)
3503
static const u32 switch_chain_reg[AR9300_MAX_CHAINS] = {
3504
AR_PHY_SWITCH_CHAIN_0,
3505
AR_PHY_SWITCH_CHAIN_1,
3506
AR_PHY_SWITCH_CHAIN_2,
3500
3509
u32 value = ar9003_hw_ant_ctrl_common_get(ah, is2ghz);
3501
3511
REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM, AR_SWITCH_TABLE_COM_ALL, value);
3503
3513
value = ar9003_hw_ant_ctrl_common_2_get(ah, is2ghz);
3504
3514
REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM_2, AR_SWITCH_TABLE_COM2_ALL, value);
3506
value = ar9003_hw_ant_ctrl_chain_get(ah, 0, is2ghz);
3507
REG_RMW_FIELD(ah, AR_PHY_SWITCH_CHAIN_0, AR_SWITCH_TABLE_ALL, value);
3509
if (!AR_SREV_9485(ah)) {
3510
value = ar9003_hw_ant_ctrl_chain_get(ah, 1, is2ghz);
3511
REG_RMW_FIELD(ah, AR_PHY_SWITCH_CHAIN_1, AR_SWITCH_TABLE_ALL,
3514
value = ar9003_hw_ant_ctrl_chain_get(ah, 2, is2ghz);
3515
REG_RMW_FIELD(ah, AR_PHY_SWITCH_CHAIN_2, AR_SWITCH_TABLE_ALL,
3516
for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
3517
if ((ah->rxchainmask & BIT(chain)) ||
3518
(ah->txchainmask & BIT(chain))) {
3519
value = ar9003_hw_ant_ctrl_chain_get(ah, chain,
3521
REG_RMW_FIELD(ah, switch_chain_reg[chain],
3522
AR_SWITCH_TABLE_ALL, value);
3519
3526
if (AR_SREV_9485(ah)) {
3520
3527
value = ath9k_hw_ar9300_get_eeprom(ah, EEP_ANT_DIV_CTL1);
3521
REG_RMW_FIELD(ah, AR_PHY_MC_GAIN_CTRL, AR_ANT_DIV_CTRL_ALL,
3523
REG_RMW_FIELD(ah, AR_PHY_MC_GAIN_CTRL, AR_ANT_DIV_ENABLE,
3525
REG_RMW_FIELD(ah, AR_PHY_CCK_DETECT, AR_FAST_DIV_ENABLE,
3529
* main_lnaconf, alt_lnaconf, main_tb, alt_tb
3530
* are the fields present
3532
regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
3533
regval &= (~AR_ANT_DIV_CTRL_ALL);
3534
regval |= (value & 0x3f) << AR_ANT_DIV_CTRL_ALL_S;
3536
regval &= (~AR_PHY_9485_ANT_DIV_LNADIV);
3537
regval |= ((value >> 6) & 0x1) <<
3538
AR_PHY_9485_ANT_DIV_LNADIV_S;
3539
REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval);
3541
/*enable fast_div */
3542
regval = REG_READ(ah, AR_PHY_CCK_DETECT);
3543
regval &= (~AR_FAST_DIV_ENABLE);
3544
regval |= ((value >> 7) & 0x1) <<
3545
AR_FAST_DIV_ENABLE_S;
3546
REG_WRITE(ah, AR_PHY_CCK_DETECT, regval);
3548
ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1);
3549
/* check whether antenna diversity is enabled */
3550
if ((ant_div_ctl1 >> 0x6) == 0x3) {
3551
regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
3553
* clear bits 25-30 main_lnaconf, alt_lnaconf,
3556
regval &= (~(AR_PHY_9485_ANT_DIV_MAIN_LNACONF |
3557
AR_PHY_9485_ANT_DIV_ALT_LNACONF |
3558
AR_PHY_9485_ANT_DIV_ALT_GAINTB |
3559
AR_PHY_9485_ANT_DIV_MAIN_GAINTB));
3560
/* by default use LNA1 for the main antenna */
3561
regval |= (AR_PHY_9485_ANT_DIV_LNA1 <<
3562
AR_PHY_9485_ANT_DIV_MAIN_LNACONF_S);
3563
regval |= (AR_PHY_9485_ANT_DIV_LNA2 <<
3564
AR_PHY_9485_ANT_DIV_ALT_LNACONF_S);
3565
REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval);
3530
3573
static void ar9003_hw_drive_strength_apply(struct ath_hw *ah)
3635
3678
/* Test value. if 0 then attenuation is unused. Don't load anything. */
3636
3679
for (i = 0; i < 3; i++) {
3637
value = ar9003_hw_atten_chain_get(ah, i, chan);
3638
REG_RMW_FIELD(ah, ext_atten_reg[i],
3639
AR_PHY_EXT_ATTEN_CTL_XATTEN1_DB, value);
3680
if (ah->txchainmask & BIT(i)) {
3681
value = ar9003_hw_atten_chain_get(ah, i, chan);
3682
REG_RMW_FIELD(ah, ext_atten_reg[i],
3683
AR_PHY_EXT_ATTEN_CTL_XATTEN1_DB, value);
3641
value = ar9003_hw_atten_chain_get_margin(ah, i, chan);
3642
REG_RMW_FIELD(ah, ext_atten_reg[i],
3643
AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN, value);
3685
value = ar9003_hw_atten_chain_get_margin(ah, i, chan);
3686
REG_RMW_FIELD(ah, ext_atten_reg[i],
3687
AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN,