diff options
| author | Sujith Manoharan <c_manoha@qca.qualcomm.com> | 2013-11-14 04:56:06 -0500 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2013-11-15 14:27:26 -0500 |
| commit | 6fcbe538be43e360dc286da532f5add2fe7f46d8 (patch) | |
| tree | eae5cceccfa4d49f95b24ce589ae37f8b7eb7016 | |
| parent | c7ce155bf81d9b010f5710e32f749a7dfa8ad248 (diff) | |
ath9k: Fix issue with MCS15
On some boards which are based on AR9300, AR9580 or
AR9550, MCS15 usage is problematic.
This is because these boards use a "frequency doubler",
which doubles the refclk to get better EVM, but causes
spurs. Handle this properly in the driver to recover
throughput.
Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_phy.c | 50 | ||||
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_phy.h | 11 |
2 files changed, 61 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c index 11f53589a3f3..d39b79f5e841 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c | |||
| @@ -701,6 +701,54 @@ static int ar9550_hw_get_modes_txgain_index(struct ath_hw *ah, | |||
| 701 | return ret; | 701 | return ret; |
| 702 | } | 702 | } |
| 703 | 703 | ||
| 704 | static void ar9003_doubler_fix(struct ath_hw *ah) | ||
| 705 | { | ||
| 706 | if (AR_SREV_9300(ah) || AR_SREV_9580(ah) || AR_SREV_9550(ah)) { | ||
| 707 | REG_RMW(ah, AR_PHY_65NM_CH0_RXTX2, | ||
| 708 | 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK_S | | ||
| 709 | 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK_S, 0); | ||
| 710 | REG_RMW(ah, AR_PHY_65NM_CH1_RXTX2, | ||
| 711 | 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK_S | | ||
| 712 | 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK_S, 0); | ||
| 713 | REG_RMW(ah, AR_PHY_65NM_CH2_RXTX2, | ||
| 714 | 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK_S | | ||
| 715 | 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK_S, 0); | ||
| 716 | |||
| 717 | udelay(200); | ||
| 718 | |||
| 719 | REG_CLR_BIT(ah, AR_PHY_65NM_CH0_RXTX2, | ||
| 720 | AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK); | ||
| 721 | REG_CLR_BIT(ah, AR_PHY_65NM_CH1_RXTX2, | ||
| 722 | AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK); | ||
| 723 | REG_CLR_BIT(ah, AR_PHY_65NM_CH2_RXTX2, | ||
| 724 | AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK); | ||
| 725 | |||
| 726 | udelay(1); | ||
| 727 | |||
| 728 | REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_RXTX2, | ||
| 729 | AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK, 1); | ||
| 730 | REG_RMW_FIELD(ah, AR_PHY_65NM_CH1_RXTX2, | ||
| 731 | AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK, 1); | ||
| 732 | REG_RMW_FIELD(ah, AR_PHY_65NM_CH2_RXTX2, | ||
| 733 | AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK, 1); | ||
| 734 | |||
| 735 | udelay(200); | ||
| 736 | |||
| 737 | REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_SYNTH12, | ||
| 738 | AR_PHY_65NM_CH0_SYNTH12_VREFMUL3, 0xf); | ||
| 739 | |||
| 740 | REG_RMW(ah, AR_PHY_65NM_CH0_RXTX2, 0, | ||
| 741 | 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK_S | | ||
| 742 | 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK_S); | ||
| 743 | REG_RMW(ah, AR_PHY_65NM_CH1_RXTX2, 0, | ||
| 744 | 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK_S | | ||
| 745 | 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK_S); | ||
| 746 | REG_RMW(ah, AR_PHY_65NM_CH2_RXTX2, 0, | ||
| 747 | 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK_S | | ||
| 748 | 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK_S); | ||
| 749 | } | ||
| 750 | } | ||
| 751 | |||
| 704 | static int ar9003_hw_process_ini(struct ath_hw *ah, | 752 | static int ar9003_hw_process_ini(struct ath_hw *ah, |
| 705 | struct ath9k_channel *chan) | 753 | struct ath9k_channel *chan) |
| 706 | { | 754 | { |
| @@ -726,6 +774,8 @@ static int ar9003_hw_process_ini(struct ath_hw *ah, | |||
| 726 | modesIndex); | 774 | modesIndex); |
| 727 | } | 775 | } |
| 728 | 776 | ||
| 777 | ar9003_doubler_fix(ah); | ||
| 778 | |||
| 729 | /* | 779 | /* |
| 730 | * RXGAIN initvals. | 780 | * RXGAIN initvals. |
| 731 | */ | 781 | */ |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.h b/drivers/net/wireless/ath/ath9k/ar9003_phy.h index fca624322dc8..2af667beb273 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h | |||
| @@ -656,13 +656,24 @@ | |||
| 656 | #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT ((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0x00000001 : 0x00000002) | 656 | #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT ((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0x00000001 : 0x00000002) |
| 657 | #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT_S ((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0 : 1) | 657 | #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT_S ((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0 : 1) |
| 658 | #define AR_PHY_65NM_CH0_SYNTH7 0x16098 | 658 | #define AR_PHY_65NM_CH0_SYNTH7 0x16098 |
| 659 | #define AR_PHY_65NM_CH0_SYNTH12 0x160ac | ||
| 659 | #define AR_PHY_65NM_CH0_BIAS1 0x160c0 | 660 | #define AR_PHY_65NM_CH0_BIAS1 0x160c0 |
| 660 | #define AR_PHY_65NM_CH0_BIAS2 0x160c4 | 661 | #define AR_PHY_65NM_CH0_BIAS2 0x160c4 |
| 661 | #define AR_PHY_65NM_CH0_BIAS4 0x160cc | 662 | #define AR_PHY_65NM_CH0_BIAS4 0x160cc |
| 663 | #define AR_PHY_65NM_CH0_RXTX2 0x16104 | ||
| 664 | #define AR_PHY_65NM_CH1_RXTX2 0x16504 | ||
| 665 | #define AR_PHY_65NM_CH2_RXTX2 0x16904 | ||
| 662 | #define AR_PHY_65NM_CH0_RXTX4 0x1610c | 666 | #define AR_PHY_65NM_CH0_RXTX4 0x1610c |
| 663 | #define AR_PHY_65NM_CH1_RXTX4 0x1650c | 667 | #define AR_PHY_65NM_CH1_RXTX4 0x1650c |
| 664 | #define AR_PHY_65NM_CH2_RXTX4 0x1690c | 668 | #define AR_PHY_65NM_CH2_RXTX4 0x1690c |
| 665 | 669 | ||
| 670 | #define AR_PHY_65NM_CH0_SYNTH12_VREFMUL3 0x00780000 | ||
| 671 | #define AR_PHY_65NM_CH0_SYNTH12_VREFMUL3_S 19 | ||
| 672 | #define AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK 0x00000004 | ||
| 673 | #define AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK_S 2 | ||
| 674 | #define AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK 0x00000008 | ||
| 675 | #define AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK_S 3 | ||
| 676 | |||
| 666 | #define AR_CH0_TOP (AR_SREV_9300(ah) ? 0x16288 : \ | 677 | #define AR_CH0_TOP (AR_SREV_9300(ah) ? 0x16288 : \ |
| 667 | (((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0x1628c : 0x16280))) | 678 | (((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0x1628c : 0x16280))) |
| 668 | #define AR_CH0_TOP_XPABIASLVL (AR_SREV_9550(ah) ? 0x3c0 : 0x300) | 679 | #define AR_CH0_TOP_XPABIASLVL (AR_SREV_9550(ah) ? 0x3c0 : 0x300) |
