diff options
author | Sujith Manoharan <c_manoha@qca.qualcomm.com> | 2012-02-22 02:12:10 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-02-27 14:06:39 -0500 |
commit | 4f851df78a96947807c14a7c616d1d096314e460 (patch) | |
tree | 783fdb1201ca81d4f07c1eaaa2c45f0ac62dd255 | |
parent | 70982b720f6910d094861916973ad51f2afa0e18 (diff) |
ath9k_hw: Cleanup MCI reset routine
* Use a separate function to enable/disable
OneStepLookAhead.
* Remove unnecessary hardware SREV checks.
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_mci.c | 91 |
1 files changed, 47 insertions, 44 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mci.c b/drivers/net/wireless/ath/ath9k/ar9003_mci.c index 4079676fe692..8d3659cc11f0 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_mci.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.c | |||
@@ -902,20 +902,46 @@ static void ar9003_mci_mute_bt(struct ath_hw *ah) | |||
902 | ar9003_mci_send_sys_sleeping(ah, true); | 902 | ar9003_mci_send_sys_sleeping(ah, true); |
903 | } | 903 | } |
904 | 904 | ||
905 | static void ar9003_mci_osla_setup(struct ath_hw *ah, bool enable) | ||
906 | { | ||
907 | struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; | ||
908 | u32 thresh; | ||
909 | |||
910 | if (enable) { | ||
911 | REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, | ||
912 | AR_MCI_SCHD_TABLE_2_HW_BASED, 1); | ||
913 | REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, | ||
914 | AR_MCI_SCHD_TABLE_2_MEM_BASED, 1); | ||
915 | |||
916 | if (!(mci->config & ATH_MCI_CONFIG_DISABLE_AGGR_THRESH)) { | ||
917 | thresh = MS(mci->config, ATH_MCI_CONFIG_AGGR_THRESH); | ||
918 | REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, | ||
919 | AR_BTCOEX_CTRL_AGGR_THRESH, thresh); | ||
920 | REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, | ||
921 | AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN, 1); | ||
922 | } else { | ||
923 | REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, | ||
924 | AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN, 0); | ||
925 | } | ||
926 | |||
927 | REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, | ||
928 | AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN, 1); | ||
929 | } else { | ||
930 | REG_CLR_BIT(ah, AR_BTCOEX_CTRL, | ||
931 | AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN); | ||
932 | } | ||
933 | } | ||
934 | |||
905 | void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g, | 935 | void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g, |
906 | bool is_full_sleep) | 936 | bool is_full_sleep) |
907 | { | 937 | { |
908 | struct ath_common *common = ath9k_hw_common(ah); | 938 | struct ath_common *common = ath9k_hw_common(ah); |
909 | struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; | 939 | struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; |
910 | u32 regval, thresh; | 940 | u32 regval; |
911 | 941 | ||
912 | ath_dbg(common, MCI, "MCI full_sleep = %d, is_2g = %d\n", | 942 | ath_dbg(common, MCI, "MCI Reset (full_sleep = %d, is_2g = %d)\n", |
913 | is_full_sleep, is_2g); | 943 | is_full_sleep, is_2g); |
914 | 944 | ||
915 | /* | ||
916 | * GPM buffer and scheduling message buffer are not allocated | ||
917 | */ | ||
918 | |||
919 | if (!mci->gpm_addr && !mci->sched_addr) { | 945 | if (!mci->gpm_addr && !mci->sched_addr) { |
920 | ath_dbg(common, MCI, | 946 | ath_dbg(common, MCI, |
921 | "MCI GPM and schedule buffers are not allocated\n"); | 947 | "MCI GPM and schedule buffers are not allocated\n"); |
@@ -923,7 +949,7 @@ void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g, | |||
923 | } | 949 | } |
924 | 950 | ||
925 | if (REG_READ(ah, AR_BTCOEX_CTRL) == 0xdeadbeef) { | 951 | if (REG_READ(ah, AR_BTCOEX_CTRL) == 0xdeadbeef) { |
926 | ath_dbg(common, MCI, "MCI it's deadbeef, quit mci_reset\n"); | 952 | ath_dbg(common, MCI, "BTCOEX control register is dead\n"); |
927 | return; | 953 | return; |
928 | } | 954 | } |
929 | 955 | ||
@@ -947,46 +973,23 @@ void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g, | |||
947 | SM(0, AR_BTCOEX_CTRL_1_CHAIN_BCN) | | 973 | SM(0, AR_BTCOEX_CTRL_1_CHAIN_BCN) | |
948 | SM(0, AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN); | 974 | SM(0, AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN); |
949 | 975 | ||
950 | if (is_2g && (AR_SREV_9462_20(ah)) && | ||
951 | !(mci->config & ATH_MCI_CONFIG_DISABLE_OSLA)) { | ||
952 | |||
953 | regval |= SM(1, AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN); | ||
954 | ath_dbg(common, MCI, "MCI sched one step look ahead\n"); | ||
955 | |||
956 | if (!(mci->config & | ||
957 | ATH_MCI_CONFIG_DISABLE_AGGR_THRESH)) { | ||
958 | |||
959 | thresh = MS(mci->config, | ||
960 | ATH_MCI_CONFIG_AGGR_THRESH); | ||
961 | thresh &= 7; | ||
962 | regval |= SM(1, | ||
963 | AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN); | ||
964 | regval |= SM(thresh, AR_BTCOEX_CTRL_AGGR_THRESH); | ||
965 | |||
966 | REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, | ||
967 | AR_MCI_SCHD_TABLE_2_HW_BASED, 1); | ||
968 | REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, | ||
969 | AR_MCI_SCHD_TABLE_2_MEM_BASED, 1); | ||
970 | |||
971 | } else | ||
972 | ath_dbg(common, MCI, "MCI sched aggr thresh: off\n"); | ||
973 | } else | ||
974 | ath_dbg(common, MCI, "MCI SCHED one step look ahead off\n"); | ||
975 | |||
976 | REG_WRITE(ah, AR_BTCOEX_CTRL, regval); | 976 | REG_WRITE(ah, AR_BTCOEX_CTRL, regval); |
977 | 977 | ||
978 | if (AR_SREV_9462_20(ah)) { | 978 | if (is_2g && !(mci->config & ATH_MCI_CONFIG_DISABLE_OSLA)) |
979 | REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, | 979 | ar9003_mci_osla_setup(ah, true); |
980 | AR_BTCOEX_CTRL_SPDT_ENABLE); | 980 | else |
981 | REG_RMW_FIELD(ah, AR_BTCOEX_CTRL3, | 981 | ar9003_mci_osla_setup(ah, false); |
982 | AR_BTCOEX_CTRL3_CONT_INFO_TIMEOUT, 20); | 982 | |
983 | } | 983 | REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, |
984 | AR_BTCOEX_CTRL_SPDT_ENABLE); | ||
985 | REG_RMW_FIELD(ah, AR_BTCOEX_CTRL3, | ||
986 | AR_BTCOEX_CTRL3_CONT_INFO_TIMEOUT, 20); | ||
984 | 987 | ||
985 | REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, AR_BTCOEX_CTRL2_RX_DEWEIGHT, 1); | 988 | REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, AR_BTCOEX_CTRL2_RX_DEWEIGHT, 1); |
986 | REG_RMW_FIELD(ah, AR_PCU_MISC, AR_PCU_BT_ANT_PREVENT_RX, 0); | 989 | REG_RMW_FIELD(ah, AR_PCU_MISC, AR_PCU_BT_ANT_PREVENT_RX, 0); |
987 | 990 | ||
988 | thresh = MS(mci->config, ATH_MCI_CONFIG_CLK_DIV); | 991 | regval = MS(mci->config, ATH_MCI_CONFIG_CLK_DIV); |
989 | REG_RMW_FIELD(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_CLK_DIV, thresh); | 992 | REG_RMW_FIELD(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_CLK_DIV, regval); |
990 | REG_SET_BIT(ah, AR_BTCOEX_CTRL, AR_BTCOEX_CTRL_MCI_MODE_EN); | 993 | REG_SET_BIT(ah, AR_BTCOEX_CTRL, AR_BTCOEX_CTRL_MCI_MODE_EN); |
991 | 994 | ||
992 | /* Resetting the Rx and Tx paths of MCI */ | 995 | /* Resetting the Rx and Tx paths of MCI */ |
@@ -1011,15 +1014,15 @@ void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g, | |||
1011 | REG_WRITE(ah, AR_MCI_COMMAND2, regval); | 1014 | REG_WRITE(ah, AR_MCI_COMMAND2, regval); |
1012 | 1015 | ||
1013 | ar9003_mci_state(ah, MCI_STATE_INIT_GPM_OFFSET, NULL); | 1016 | ar9003_mci_state(ah, MCI_STATE_INIT_GPM_OFFSET, NULL); |
1017 | |||
1014 | REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE, | 1018 | REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE, |
1015 | (SM(0xe801, AR_MCI_MSG_ATTRIBUTES_TABLE_INVALID_HDR) | | 1019 | (SM(0xe801, AR_MCI_MSG_ATTRIBUTES_TABLE_INVALID_HDR) | |
1016 | SM(0x0000, AR_MCI_MSG_ATTRIBUTES_TABLE_CHECKSUM))); | 1020 | SM(0x0000, AR_MCI_MSG_ATTRIBUTES_TABLE_CHECKSUM))); |
1017 | 1021 | ||
1018 | REG_CLR_BIT(ah, AR_MCI_TX_CTRL, | 1022 | REG_CLR_BIT(ah, AR_MCI_TX_CTRL, |
1019 | AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE); | 1023 | AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE); |
1020 | 1024 | ||
1021 | if (AR_SREV_9462_20_OR_LATER(ah)) | 1025 | ar9003_mci_observation_set_up(ah); |
1022 | ar9003_mci_observation_set_up(ah); | ||
1023 | 1026 | ||
1024 | mci->ready = true; | 1027 | mci->ready = true; |
1025 | ar9003_mci_prep_interface(ah); | 1028 | ar9003_mci_prep_interface(ah); |