Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ath9k: Program HW for WB195 diversity

The MC_GAIN_CTL/CCK_DETECT registers have to be programmed
with the correct configuration values if WLAN/BT RX diversity
is enabled. Add this and also take care of the BTCOEX mode
when fast diversity is enabled/disabled.

Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Sujith Manoharan and committed by
John W. Linville
d7150908 a5354cca

+66
+60
drivers/net/wireless/ath/ath9k/ar9002_phy.c
··· 555 555 REG_WRITE(ah, AR_PHY_MULTICHAIN_GAIN_CTL, regval); 556 556 } 557 557 558 + static void ar9002_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable) 559 + { 560 + struct ath_btcoex_hw *btcoex = &ah->btcoex_hw; 561 + u8 antdiv_ctrl1, antdiv_ctrl2; 562 + u32 regval; 563 + 564 + if (enable) { 565 + antdiv_ctrl1 = ATH_BT_COEX_ANTDIV_CONTROL1_ENABLE; 566 + antdiv_ctrl2 = ATH_BT_COEX_ANTDIV_CONTROL2_ENABLE; 567 + 568 + /* 569 + * Don't disable BT ant to allow BB to control SWCOM. 570 + */ 571 + btcoex->bt_coex_mode2 &= (~(AR_BT_DISABLE_BT_ANT)); 572 + REG_WRITE(ah, AR_BT_COEX_MODE2, btcoex->bt_coex_mode2); 573 + 574 + REG_WRITE(ah, AR_PHY_SWITCH_COM, ATH_BT_COEX_ANT_DIV_SWITCH_COM); 575 + REG_RMW(ah, AR_PHY_SWITCH_CHAIN_0, 0, 0xf0000000); 576 + } else { 577 + /* 578 + * Disable antenna diversity, use LNA1 only. 579 + */ 580 + antdiv_ctrl1 = ATH_BT_COEX_ANTDIV_CONTROL1_FIXED_A; 581 + antdiv_ctrl2 = ATH_BT_COEX_ANTDIV_CONTROL2_FIXED_A; 582 + 583 + /* 584 + * Disable BT Ant. to allow concurrent BT and WLAN receive. 585 + */ 586 + btcoex->bt_coex_mode2 |= AR_BT_DISABLE_BT_ANT; 587 + REG_WRITE(ah, AR_BT_COEX_MODE2, btcoex->bt_coex_mode2); 588 + 589 + /* 590 + * Program SWCOM table to make sure RF switch always parks 591 + * at BT side. 592 + */ 593 + REG_WRITE(ah, AR_PHY_SWITCH_COM, 0); 594 + REG_RMW(ah, AR_PHY_SWITCH_CHAIN_0, 0, 0xf0000000); 595 + } 596 + 597 + regval = REG_READ(ah, AR_PHY_MULTICHAIN_GAIN_CTL); 598 + regval &= (~(AR_PHY_9285_ANT_DIV_CTL_ALL)); 599 + /* 600 + * Clear ant_fast_div_bias [14:9] since for WB195, 601 + * the main LNA is always LNA1. 602 + */ 603 + regval &= (~(AR_PHY_9285_FAST_DIV_BIAS)); 604 + regval |= SM(antdiv_ctrl1, AR_PHY_9285_ANT_DIV_CTL); 605 + regval |= SM(antdiv_ctrl2, AR_PHY_9285_ANT_DIV_ALT_LNACONF); 606 + regval |= SM((antdiv_ctrl2 >> 2), AR_PHY_9285_ANT_DIV_MAIN_LNACONF); 607 + regval |= SM((antdiv_ctrl1 >> 1), AR_PHY_9285_ANT_DIV_ALT_GAINTB); 608 + regval |= SM((antdiv_ctrl1 >> 2), AR_PHY_9285_ANT_DIV_MAIN_GAINTB); 609 + REG_WRITE(ah, AR_PHY_MULTICHAIN_GAIN_CTL, regval); 610 + 611 + regval = REG_READ(ah, AR_PHY_CCK_DETECT); 612 + regval &= (~AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV); 613 + regval |= SM((antdiv_ctrl1 >> 3), AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV); 614 + REG_WRITE(ah, AR_PHY_CCK_DETECT, regval); 615 + } 616 + 558 617 static void ar9002_hw_spectral_scan_config(struct ath_hw *ah, 559 618 struct ath_spec_scan *param) 560 619 { ··· 689 630 690 631 ops->antdiv_comb_conf_get = ar9002_hw_antdiv_comb_conf_get; 691 632 ops->antdiv_comb_conf_set = ar9002_hw_antdiv_comb_conf_set; 633 + ops->set_bt_ant_diversity = ar9002_hw_set_bt_ant_diversity; 692 634 ops->spectral_scan_config = ar9002_hw_spectral_scan_config; 693 635 ops->spectral_scan_trigger = ar9002_hw_spectral_scan_trigger; 694 636 ops->spectral_scan_wait = ar9002_hw_spectral_scan_wait;
+6
drivers/net/wireless/ath/ath9k/ar9002_phy.h
··· 320 320 #define AR_PHY_9285_ANT_DIV_GAINTB_0 0 321 321 #define AR_PHY_9285_ANT_DIV_GAINTB_1 1 322 322 323 + #define ATH_BT_COEX_ANTDIV_CONTROL1_ENABLE 0x0b 324 + #define ATH_BT_COEX_ANTDIV_CONTROL2_ENABLE 0x09 325 + #define ATH_BT_COEX_ANTDIV_CONTROL1_FIXED_A 0x04 326 + #define ATH_BT_COEX_ANTDIV_CONTROL2_FIXED_A 0x09 327 + #define ATH_BT_COEX_ANT_DIV_SWITCH_COM 0x66666666 328 + 323 329 #define AR_PHY_EXT_CCA0 0x99b8 324 330 #define AR_PHY_EXT_CCA0_THRESH62 0x000000FF 325 331 #define AR_PHY_EXT_CCA0_THRESH62_S 0