diff options
author | Senthil Balasubramanian <senthilkumar@atheros.com> | 2008-12-08 09:13:48 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-12-12 13:48:26 -0500 |
commit | e7594072a5b918510c937c1ab0acad4e8a931bc7 (patch) | |
tree | 50cc34039e87fc3152c54073b9349971249b050f /drivers/net/wireless/ath9k/calib.c | |
parent | e8fbc99edfe0efa0b42f04587a79a6b3371f961a (diff) |
ath9k: Adding support for Atheros AR9285 chipset.
Signed-off-by: Senthil Balasubramanian <senthilkumar@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath9k/calib.c')
-rw-r--r-- | drivers/net/wireless/ath9k/calib.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath9k/calib.c b/drivers/net/wireless/ath9k/calib.c index 51c8a3ce4e60..3c7454fc51bd 100644 --- a/drivers/net/wireless/ath9k/calib.c +++ b/drivers/net/wireless/ath9k/calib.c | |||
@@ -818,6 +818,101 @@ bool ath9k_hw_calibrate(struct ath_hal *ah, struct ath9k_channel *chan, | |||
818 | return true; | 818 | return true; |
819 | } | 819 | } |
820 | 820 | ||
821 | static inline void ath9k_hw_9285_pa_cal(struct ath_hal *ah) | ||
822 | { | ||
823 | |||
824 | u32 regVal; | ||
825 | int i, offset, offs_6_1, offs_0; | ||
826 | u32 ccomp_org, reg_field; | ||
827 | u32 regList[][2] = { | ||
828 | { 0x786c, 0 }, | ||
829 | { 0x7854, 0 }, | ||
830 | { 0x7820, 0 }, | ||
831 | { 0x7824, 0 }, | ||
832 | { 0x7868, 0 }, | ||
833 | { 0x783c, 0 }, | ||
834 | { 0x7838, 0 }, | ||
835 | }; | ||
836 | |||
837 | if (AR_SREV_9285_11(ah)) { | ||
838 | REG_WRITE(ah, AR9285_AN_TOP4, (AR9285_AN_TOP4_DEFAULT | 0x14)); | ||
839 | udelay(10); | ||
840 | } | ||
841 | |||
842 | for (i = 0; i < ARRAY_SIZE(regList); i++) | ||
843 | regList[i][1] = REG_READ(ah, regList[i][0]); | ||
844 | |||
845 | regVal = REG_READ(ah, 0x7834); | ||
846 | regVal &= (~(0x1)); | ||
847 | REG_WRITE(ah, 0x7834, regVal); | ||
848 | regVal = REG_READ(ah, 0x9808); | ||
849 | regVal |= (0x1 << 27); | ||
850 | REG_WRITE(ah, 0x9808, regVal); | ||
851 | |||
852 | REG_RMW_FIELD(ah, AR9285_AN_TOP3, AR9285_AN_TOP3_PWDDAC, 1); | ||
853 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDRXTXBB1, 1); | ||
854 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDV2I, 1); | ||
855 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDDACIF, 1); | ||
856 | REG_RMW_FIELD(ah, AR9285_AN_RF2G2, AR9285_AN_RF2G2_OFFCAL, 0); | ||
857 | REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PWDDB, 0); | ||
858 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_ENPACAL, 0); | ||
859 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1, 1); | ||
860 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV2, 0); | ||
861 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPAOUT, 0); | ||
862 | REG_RMW_FIELD(ah, AR9285_AN_RF2G8, AR9285_AN_RF2G8_PADRVGN2TAB0, 7); | ||
863 | REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PADRVGN2TAB0, 0); | ||
864 | ccomp_org = MS(REG_READ(ah, AR9285_AN_RF2G6), AR9285_AN_RF2G6_CCOMP); | ||
865 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_CCOMP, 7); | ||
866 | |||
867 | REG_WRITE(ah, AR9285_AN_TOP2, 0xca0358a0); | ||
868 | udelay(30); | ||
869 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_OFFS, 0); | ||
870 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, 0); | ||
871 | |||
872 | for (i = 6; i > 0; i--) { | ||
873 | regVal = REG_READ(ah, 0x7834); | ||
874 | regVal |= (1 << (19 + i)); | ||
875 | REG_WRITE(ah, 0x7834, regVal); | ||
876 | udelay(1); | ||
877 | regVal = REG_READ(ah, 0x7834); | ||
878 | regVal &= (~(0x1 << (19 + i))); | ||
879 | reg_field = MS(REG_READ(ah, 0x7840), AR9285_AN_RXTXBB1_SPARE9); | ||
880 | regVal |= (reg_field << (19 + i)); | ||
881 | REG_WRITE(ah, 0x7834, regVal); | ||
882 | } | ||
883 | |||
884 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, 1); | ||
885 | udelay(1); | ||
886 | reg_field = MS(REG_READ(ah, AR9285_AN_RF2G9), AR9285_AN_RXTXBB1_SPARE9); | ||
887 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, reg_field); | ||
888 | offs_6_1 = MS(REG_READ(ah, AR9285_AN_RF2G6), AR9285_AN_RF2G6_OFFS); | ||
889 | offs_0 = MS(REG_READ(ah, AR9285_AN_RF2G3), AR9285_AN_RF2G3_PDVCCOMP); | ||
890 | |||
891 | offset = (offs_6_1<<1) | offs_0; | ||
892 | offset = offset - 0; | ||
893 | offs_6_1 = offset>>1; | ||
894 | offs_0 = offset & 1; | ||
895 | |||
896 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_OFFS, offs_6_1); | ||
897 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, offs_0); | ||
898 | |||
899 | regVal = REG_READ(ah, 0x7834); | ||
900 | regVal |= 0x1; | ||
901 | REG_WRITE(ah, 0x7834, regVal); | ||
902 | regVal = REG_READ(ah, 0x9808); | ||
903 | regVal &= (~(0x1 << 27)); | ||
904 | REG_WRITE(ah, 0x9808, regVal); | ||
905 | |||
906 | for (i = 0; i < ARRAY_SIZE(regList); i++) | ||
907 | REG_WRITE(ah, regList[i][0], regList[i][1]); | ||
908 | |||
909 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_CCOMP, ccomp_org); | ||
910 | |||
911 | if (AR_SREV_9285_11(ah)) | ||
912 | REG_WRITE(ah, AR9285_AN_TOP4, AR9285_AN_TOP4_DEFAULT); | ||
913 | |||
914 | } | ||
915 | |||
821 | bool ath9k_hw_init_cal(struct ath_hal *ah, | 916 | bool ath9k_hw_init_cal(struct ath_hal *ah, |
822 | struct ath9k_channel *chan) | 917 | struct ath9k_channel *chan) |
823 | { | 918 | { |
@@ -835,6 +930,9 @@ bool ath9k_hw_init_cal(struct ath_hal *ah, | |||
835 | return false; | 930 | return false; |
836 | } | 931 | } |
837 | 932 | ||
933 | if (AR_SREV_9285(ah) && AR_SREV_9285_11_OR_LATER(ah)) | ||
934 | ath9k_hw_9285_pa_cal(ah); | ||
935 | |||
838 | REG_WRITE(ah, AR_PHY_AGC_CONTROL, | 936 | REG_WRITE(ah, AR_PHY_AGC_CONTROL, |
839 | REG_READ(ah, AR_PHY_AGC_CONTROL) | | 937 | REG_READ(ah, AR_PHY_AGC_CONTROL) | |
840 | AR_PHY_AGC_CONTROL_NF); | 938 | AR_PHY_AGC_CONTROL_NF); |