aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_mci.c91
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 4079676fe69..8d3659cc11f 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
905static 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
905void ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g, 935void 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);