aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorSujith Manoharan <c_manoha@qca.qualcomm.com>2013-08-04 04:52:02 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-08-05 14:52:45 -0400
commit84893817aa382b923e3d7491e7081eeb6d9ec213 (patch)
treecbc42dc4029d2469a9a03b3e3854d27fafac4aa1 /drivers/net
parent31fd216db9cb7a50e0e64aff813bc6c12e9437d3 (diff)
ath9k: Support ANT diversity for WB225
WB225 based cards like CUS198 and CUS230 support both fast antenna diversity and LNA combining. Add support for this and also program the SWCOM register with the correct "ant_ctrl_comm2g_switch_enable" value. Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_eeprom.c5
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_eeprom.h2
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_phy.c120
3 files changed, 86 insertions, 41 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
index c2f1f18e364b..178052fc4d88 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
@@ -3541,13 +3541,12 @@ static u16 ar9003_switch_com_spdt_get(struct ath_hw *ah, bool is2ghz)
3541 return le16_to_cpu(ar9003_modal_header(ah, is2ghz)->switchcomspdt); 3541 return le16_to_cpu(ar9003_modal_header(ah, is2ghz)->switchcomspdt);
3542} 3542}
3543 3543
3544 3544u32 ar9003_hw_ant_ctrl_common_get(struct ath_hw *ah, bool is2ghz)
3545static u32 ar9003_hw_ant_ctrl_common_get(struct ath_hw *ah, bool is2ghz)
3546{ 3545{
3547 return le32_to_cpu(ar9003_modal_header(ah, is2ghz)->antCtrlCommon); 3546 return le32_to_cpu(ar9003_modal_header(ah, is2ghz)->antCtrlCommon);
3548} 3547}
3549 3548
3550static u32 ar9003_hw_ant_ctrl_common_2_get(struct ath_hw *ah, bool is2ghz) 3549u32 ar9003_hw_ant_ctrl_common_2_get(struct ath_hw *ah, bool is2ghz)
3551{ 3550{
3552 return le32_to_cpu(ar9003_modal_header(ah, is2ghz)->antCtrlCommon2); 3551 return le32_to_cpu(ar9003_modal_header(ah, is2ghz)->antCtrlCommon2);
3553} 3552}
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
index 874f6570bd1c..75d4fb41962f 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
@@ -334,6 +334,8 @@ struct ar9300_eeprom {
334 334
335s32 ar9003_hw_get_tx_gain_idx(struct ath_hw *ah); 335s32 ar9003_hw_get_tx_gain_idx(struct ath_hw *ah);
336s32 ar9003_hw_get_rx_gain_idx(struct ath_hw *ah); 336s32 ar9003_hw_get_rx_gain_idx(struct ath_hw *ah);
337u32 ar9003_hw_ant_ctrl_common_get(struct ath_hw *ah, bool is2ghz);
338u32 ar9003_hw_ant_ctrl_common_2_get(struct ath_hw *ah, bool is2ghz);
337 339
338u8 *ar9003_get_spur_chan_ptr(struct ath_hw *ah, bool is_2ghz); 340u8 *ar9003_get_spur_chan_ptr(struct ath_hw *ah, bool is_2ghz);
339 341
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
index 55021f1a9c35..4898829e6549 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
@@ -1414,58 +1414,102 @@ static void ar9003_hw_antdiv_comb_conf_set(struct ath_hw *ah,
1414 1414
1415static void ar9003_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable) 1415static void ar9003_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable)
1416{ 1416{
1417 struct ath9k_hw_capabilities *pCap = &ah->caps;
1417 u8 ant_div_ctl1; 1418 u8 ant_div_ctl1;
1418 u32 regval; 1419 u32 regval;
1419 1420
1420 if (!AR_SREV_9565(ah)) 1421 if (!AR_SREV_9485(ah) && !AR_SREV_9565(ah))
1421 return; 1422 return;
1422 1423
1424 if (AR_SREV_9485(ah)) {
1425 regval = ar9003_hw_ant_ctrl_common_2_get(ah,
1426 IS_CHAN_2GHZ(ah->curchan));
1427 if (enable) {
1428 regval &= ~AR_SWITCH_TABLE_COM2_ALL;
1429 regval |= ah->config.ant_ctrl_comm2g_switch_enable;
1430 }
1431 REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM_2,
1432 AR_SWITCH_TABLE_COM2_ALL, regval);
1433 }
1434
1423 ant_div_ctl1 = ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1); 1435 ant_div_ctl1 = ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1);
1424 1436
1437 /*
1438 * Set MAIN/ALT LNA conf.
1439 * Set MAIN/ALT gain_tb.
1440 */
1425 regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL); 1441 regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
1426 regval &= (~AR_ANT_DIV_CTRL_ALL); 1442 regval &= (~AR_ANT_DIV_CTRL_ALL);
1427 regval |= (ant_div_ctl1 & 0x3f) << AR_ANT_DIV_CTRL_ALL_S; 1443 regval |= (ant_div_ctl1 & 0x3f) << AR_ANT_DIV_CTRL_ALL_S;
1428 regval &= ~AR_PHY_ANT_DIV_LNADIV;
1429 regval |= ((ant_div_ctl1 >> 6) & 0x1) << AR_PHY_ANT_DIV_LNADIV_S;
1430
1431 if (enable)
1432 regval |= AR_ANT_DIV_ENABLE;
1433
1434 REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval); 1444 REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval);
1435 1445
1436 regval = REG_READ(ah, AR_PHY_CCK_DETECT); 1446 if (AR_SREV_9485_11(ah)) {
1437 regval &= ~AR_FAST_DIV_ENABLE; 1447 /*
1438 regval |= ((ant_div_ctl1 >> 7) & 0x1) << AR_FAST_DIV_ENABLE_S; 1448 * Enable LNA diversity.
1439 1449 */
1440 if (enable)
1441 regval |= AR_FAST_DIV_ENABLE;
1442
1443 REG_WRITE(ah, AR_PHY_CCK_DETECT, regval);
1444
1445 if (enable) {
1446 REG_SET_BIT(ah, AR_PHY_MC_GAIN_CTRL,
1447 (1 << AR_PHY_ANT_SW_RX_PROT_S));
1448 if (ah->curchan && IS_CHAN_2GHZ(ah->curchan))
1449 REG_SET_BIT(ah, AR_PHY_RESTART,
1450 AR_PHY_RESTART_ENABLE_DIV_M2FLAG);
1451 REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV,
1452 AR_BTCOEX_WL_LNADIV_FORCE_ON);
1453 } else {
1454 REG_CLR_BIT(ah, AR_PHY_MC_GAIN_CTRL, AR_ANT_DIV_ENABLE);
1455 REG_CLR_BIT(ah, AR_PHY_MC_GAIN_CTRL,
1456 (1 << AR_PHY_ANT_SW_RX_PROT_S));
1457 REG_CLR_BIT(ah, AR_PHY_CCK_DETECT, AR_FAST_DIV_ENABLE);
1458 REG_CLR_BIT(ah, AR_BTCOEX_WL_LNADIV,
1459 AR_BTCOEX_WL_LNADIV_FORCE_ON);
1460
1461 regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL); 1450 regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
1462 regval &= ~(AR_PHY_ANT_DIV_MAIN_LNACONF | 1451 regval &= ~AR_PHY_ANT_DIV_LNADIV;
1463 AR_PHY_ANT_DIV_ALT_LNACONF | 1452 regval |= ((ant_div_ctl1 >> 6) & 0x1) << AR_PHY_ANT_DIV_LNADIV_S;
1464 AR_PHY_ANT_DIV_MAIN_GAINTB | 1453 if (enable)
1465 AR_PHY_ANT_DIV_ALT_GAINTB); 1454 regval |= AR_ANT_DIV_ENABLE;
1466 regval |= (ATH_ANT_DIV_COMB_LNA1 << AR_PHY_ANT_DIV_MAIN_LNACONF_S); 1455
1467 regval |= (ATH_ANT_DIV_COMB_LNA2 << AR_PHY_ANT_DIV_ALT_LNACONF_S);
1468 REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval); 1456 REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval);
1457
1458 /*
1459 * Enable fast antenna diversity.
1460 */
1461 regval = REG_READ(ah, AR_PHY_CCK_DETECT);
1462 regval &= ~AR_FAST_DIV_ENABLE;
1463 regval |= ((ant_div_ctl1 >> 7) & 0x1) << AR_FAST_DIV_ENABLE_S;
1464 if (enable)
1465 regval |= AR_FAST_DIV_ENABLE;
1466
1467 REG_WRITE(ah, AR_PHY_CCK_DETECT, regval);
1468
1469 if (pCap->hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) {
1470 regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
1471 regval &= (~(AR_PHY_ANT_DIV_MAIN_LNACONF |
1472 AR_PHY_ANT_DIV_ALT_LNACONF |
1473 AR_PHY_ANT_DIV_ALT_GAINTB |
1474 AR_PHY_ANT_DIV_MAIN_GAINTB));
1475 /*
1476 * Set MAIN to LNA1 and ALT to LNA2 at the
1477 * beginning.
1478 */
1479 regval |= (ATH_ANT_DIV_COMB_LNA1 <<
1480 AR_PHY_ANT_DIV_MAIN_LNACONF_S);
1481 regval |= (ATH_ANT_DIV_COMB_LNA2 <<
1482 AR_PHY_ANT_DIV_ALT_LNACONF_S);
1483 REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval);
1484 }
1485 } else if (AR_SREV_9565(ah)) {
1486 if (enable) {
1487 REG_SET_BIT(ah, AR_PHY_MC_GAIN_CTRL,
1488 (1 << AR_PHY_ANT_SW_RX_PROT_S));
1489 if (ah->curchan && IS_CHAN_2GHZ(ah->curchan))
1490 REG_SET_BIT(ah, AR_PHY_RESTART,
1491 AR_PHY_RESTART_ENABLE_DIV_M2FLAG);
1492 REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV,
1493 AR_BTCOEX_WL_LNADIV_FORCE_ON);
1494 } else {
1495 REG_CLR_BIT(ah, AR_PHY_MC_GAIN_CTRL, AR_ANT_DIV_ENABLE);
1496 REG_CLR_BIT(ah, AR_PHY_MC_GAIN_CTRL,
1497 (1 << AR_PHY_ANT_SW_RX_PROT_S));
1498 REG_CLR_BIT(ah, AR_PHY_CCK_DETECT, AR_FAST_DIV_ENABLE);
1499 REG_CLR_BIT(ah, AR_BTCOEX_WL_LNADIV,
1500 AR_BTCOEX_WL_LNADIV_FORCE_ON);
1501
1502 regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
1503 regval &= ~(AR_PHY_ANT_DIV_MAIN_LNACONF |
1504 AR_PHY_ANT_DIV_ALT_LNACONF |
1505 AR_PHY_ANT_DIV_MAIN_GAINTB |
1506 AR_PHY_ANT_DIV_ALT_GAINTB);
1507 regval |= (ATH_ANT_DIV_COMB_LNA1 <<
1508 AR_PHY_ANT_DIV_MAIN_LNACONF_S);
1509 regval |= (ATH_ANT_DIV_COMB_LNA2 <<
1510 AR_PHY_ANT_DIV_ALT_LNACONF_S);
1511 REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval);
1512 }
1469 } 1513 }
1470} 1514}
1471 1515