ar9300_mci.c (250007) | ar9300_mci.c (250008) |
---|---|
1/* 2 * Copyright (c) 2013 Qualcomm Atheros, Inc. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 13 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14 * PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 18#include "opt_ah.h" 19 | 1/* 2 * Copyright (c) 2013 Qualcomm Atheros, Inc. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 13 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14 * PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 18#include "opt_ah.h" 19 |
20#ifdef AH_SUPPORT_AR9300 21 | |
22#include "ah.h" 23#include "ah_internal.h" 24 25#include "ar9300/ar9300.h" 26#include "ar9300/ar9300reg.h" 27#include "ar9300/ar9300phy.h" 28 29#if ATH_SUPPORT_MCI 30 31#define AH_MCI_REMOTE_RESET_INTERVAL_US 500 32#define AH_MCI_DEBUG_PRINT_SCHED 0 33 34static void ar9300_mci_print_msg(struct ath_hal *ah, HAL_BOOL send,u_int8_t hdr, 35 int len, u_int32_t *pl) 36{ | 20#include "ah.h" 21#include "ah_internal.h" 22 23#include "ar9300/ar9300.h" 24#include "ar9300/ar9300reg.h" 25#include "ar9300/ar9300phy.h" 26 27#if ATH_SUPPORT_MCI 28 29#define AH_MCI_REMOTE_RESET_INTERVAL_US 500 30#define AH_MCI_DEBUG_PRINT_SCHED 0 31 32static void ar9300_mci_print_msg(struct ath_hal *ah, HAL_BOOL send,u_int8_t hdr, 33 int len, u_int32_t *pl) 34{ |
37#if DBG | 35#if 0 |
38 char s[128]; 39 char *p = s; 40 int i; 41 u_int8_t *p_data = (u_int8_t *) pl; 42 43 if (send) { 44 p += snprintf(s, 60, 45 "(MCI) >>>>> Hdr: %02X, Len: %d, Payload:", hdr, len); --- 14 unchanged lines hidden (view full) --- 60 } 61*/ 62#endif 63} 64 65static 66void ar9300_mci_osla_setup(struct ath_hal *ah, HAL_BOOL enable) 67{ | 36 char s[128]; 37 char *p = s; 38 int i; 39 u_int8_t *p_data = (u_int8_t *) pl; 40 41 if (send) { 42 p += snprintf(s, 60, 43 "(MCI) >>>>> Hdr: %02X, Len: %d, Payload:", hdr, len); --- 14 unchanged lines hidden (view full) --- 58 } 59*/ 60#endif 61} 62 63static 64void ar9300_mci_osla_setup(struct ath_hal *ah, HAL_BOOL enable) 65{ |
68 struct ath_hal_9300 *ahp = AH9300(ah); | 66// struct ath_hal_9300 *ahp = AH9300(ah); |
69 u_int32_t thresh; 70 71 if (enable) { 72 OS_REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, AR_MCI_SCHD_TABLE_2_HW_BASED, 1); 73 OS_REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, AR_MCI_SCHD_TABLE_2_MEM_BASED, 1); 74 | 67 u_int32_t thresh; 68 69 if (enable) { 70 OS_REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, AR_MCI_SCHD_TABLE_2_HW_BASED, 1); 71 OS_REG_RMW_FIELD(ah, AR_MCI_SCHD_TABLE_2, AR_MCI_SCHD_TABLE_2_MEM_BASED, 1); 72 |
75 if (!(AH_PRIVATE(ah)->ah_config.ath_hal_mci_config & | 73 if (!(ah->ah_config.ath_hal_mci_config & |
76 ATH_MCI_CONFIG_DISABLE_AGGR_THRESH)) 77 { | 74 ATH_MCI_CONFIG_DISABLE_AGGR_THRESH)) 75 { |
78 thresh = MS(AH_PRIVATE(ah)->ah_config.ath_hal_mci_config, | 76 thresh = MS(ah->ah_config.ath_hal_mci_config, |
79 ATH_MCI_CONFIG_AGGR_THRESH); 80 OS_REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, 81 AR_BTCOEX_CTRL_AGGR_THRESH, thresh); 82 OS_REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, 83 AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN, 1); 84 HALDEBUG(ah, HAL_DEBUG_BT_COEX, 85 "(MCI) SCHED aggr thresh: on, thresh=%d (%d.%d%%)\n", 86 thresh, (thresh + 1)*125/10, (thresh + 1)*125%10); --- 27 unchanged lines hidden (view full) --- 114 } 115} 116 117static int32_t ar9300_mci_wait_for_interrupt(struct ath_hal *ah, 118 u_int32_t address, 119 u_int32_t bit_position, 120 int32_t time_out) 121{ | 77 ATH_MCI_CONFIG_AGGR_THRESH); 78 OS_REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, 79 AR_BTCOEX_CTRL_AGGR_THRESH, thresh); 80 OS_REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, 81 AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN, 1); 82 HALDEBUG(ah, HAL_DEBUG_BT_COEX, 83 "(MCI) SCHED aggr thresh: on, thresh=%d (%d.%d%%)\n", 84 thresh, (thresh + 1)*125/10, (thresh + 1)*125%10); --- 27 unchanged lines hidden (view full) --- 112 } 113} 114 115static int32_t ar9300_mci_wait_for_interrupt(struct ath_hal *ah, 116 u_int32_t address, 117 u_int32_t bit_position, 118 int32_t time_out) 119{ |
122 int data, loop; | 120 int data; //, loop; |
123 124 while (time_out) { 125 data = OS_REG_READ(ah, address); 126 127 if (data & bit_position) { 128 OS_REG_WRITE(ah, address, bit_position); 129 if (address == AR_MCI_INTERRUPT_RX_MSG_RAW) { 130 if (bit_position & AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE) { --- 180 unchanged lines hidden (view full) --- 311 MCI_GPM_COEX_BT_GPM_UNHALT; 312 } 313 ar9300_mci_send_message(ah, MCI_GPM, 0, payload, 16, wait_done, AH_TRUE); 314} 315 316static HAL_BOOL ar9300_mci_send_coex_bt_flags(struct ath_hal *ah, HAL_BOOL wait_done, 317 u_int8_t opcode, u_int32_t bt_flags) 318{ | 121 122 while (time_out) { 123 data = OS_REG_READ(ah, address); 124 125 if (data & bit_position) { 126 OS_REG_WRITE(ah, address, bit_position); 127 if (address == AR_MCI_INTERRUPT_RX_MSG_RAW) { 128 if (bit_position & AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE) { --- 180 unchanged lines hidden (view full) --- 309 MCI_GPM_COEX_BT_GPM_UNHALT; 310 } 311 ar9300_mci_send_message(ah, MCI_GPM, 0, payload, 16, wait_done, AH_TRUE); 312} 313 314static HAL_BOOL ar9300_mci_send_coex_bt_flags(struct ath_hal *ah, HAL_BOOL wait_done, 315 u_int8_t opcode, u_int32_t bt_flags) 316{ |
319 struct ath_hal_9300 *ahp = AH9300(ah); | 317// struct ath_hal_9300 *ahp = AH9300(ah); |
320 u_int32_t pld[4] = {0, 0, 0, 0}; 321 322 MCI_GPM_SET_TYPE_OPCODE(pld, 323 MCI_GPM_COEX_AGENT, MCI_GPM_COEX_BT_UPDATE_FLAGS); 324 325 *(((u_int8_t *)pld) + MCI_GPM_COEX_B_BT_FLAGS_OP) = opcode; 326 *(((u_int8_t *)pld) + MCI_GPM_COEX_W_BT_FLAGS + 0) = bt_flags & 0xFF; 327 *(((u_int8_t *)pld) + MCI_GPM_COEX_W_BT_FLAGS + 1) = --- 77 unchanged lines hidden (view full) --- 405 ar9300_mci_send_lna_transfer(ah, AH_TRUE); 406 OS_DELAY(5); 407 408 OS_REG_CLR_BIT(ah, AR_MCI_TX_CTRL, 409 AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE); 410 if (AR_SREV_JUPITER_20(ah) || AR_SREV_APHRODITE(ah)) { 411 OS_REG_CLR_BIT(ah, AR_GLB_CONTROL, 412 AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL); | 318 u_int32_t pld[4] = {0, 0, 0, 0}; 319 320 MCI_GPM_SET_TYPE_OPCODE(pld, 321 MCI_GPM_COEX_AGENT, MCI_GPM_COEX_BT_UPDATE_FLAGS); 322 323 *(((u_int8_t *)pld) + MCI_GPM_COEX_B_BT_FLAGS_OP) = opcode; 324 *(((u_int8_t *)pld) + MCI_GPM_COEX_W_BT_FLAGS + 0) = bt_flags & 0xFF; 325 *(((u_int8_t *)pld) + MCI_GPM_COEX_W_BT_FLAGS + 1) = --- 77 unchanged lines hidden (view full) --- 403 ar9300_mci_send_lna_transfer(ah, AH_TRUE); 404 OS_DELAY(5); 405 406 OS_REG_CLR_BIT(ah, AR_MCI_TX_CTRL, 407 AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE); 408 if (AR_SREV_JUPITER_20(ah) || AR_SREV_APHRODITE(ah)) { 409 OS_REG_CLR_BIT(ah, AR_GLB_CONTROL, 410 AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL); |
413 if (!(AH_PRIVATE(ah)->ah_config.ath_hal_mci_config & | 411 if (!(ah->ah_config.ath_hal_mci_config & |
414 ATH_MCI_CONFIG_DISABLE_OSLA)) 415 { 416 ar9300_mci_osla_setup(ah, AH_TRUE); 417 } 418 } 419 } else { 420 HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(MCI) Send LNA take\n"); 421 ar9300_mci_send_lna_take(ah, AH_TRUE); --- 64 unchanged lines hidden (view full) --- 486 OS_REG_WRITE(ah, AR_GPIO_OUTPUT_MUX1, 0x000bdab4); // 4068 487 OS_REG_WRITE(ah, AR_OBS, 0x0000004b); // 4088 488 OS_REG_WRITE(ah, AR_DIAG_SW, 0x080c0000); 489 OS_REG_WRITE(ah, AR_MACMISC, 0x0001a000); 490 OS_REG_WRITE(ah, AR_PHY_TEST, 0x00080000); // a360 491 OS_REG_WRITE(ah, AR_PHY_TEST_CTL_STATUS, 0xe0000000); // a364 492 */ 493 | 412 ATH_MCI_CONFIG_DISABLE_OSLA)) 413 { 414 ar9300_mci_osla_setup(ah, AH_TRUE); 415 } 416 } 417 } else { 418 HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(MCI) Send LNA take\n"); 419 ar9300_mci_send_lna_take(ah, AH_TRUE); --- 64 unchanged lines hidden (view full) --- 484 OS_REG_WRITE(ah, AR_GPIO_OUTPUT_MUX1, 0x000bdab4); // 4068 485 OS_REG_WRITE(ah, AR_OBS, 0x0000004b); // 4088 486 OS_REG_WRITE(ah, AR_DIAG_SW, 0x080c0000); 487 OS_REG_WRITE(ah, AR_MACMISC, 0x0001a000); 488 OS_REG_WRITE(ah, AR_PHY_TEST, 0x00080000); // a360 489 OS_REG_WRITE(ah, AR_PHY_TEST_CTL_STATUS, 0xe0000000); // a364 490 */ 491 |
494 if (AH_PRIVATE(ah)->ah_config.ath_hal_mci_config & | 492 if (ah->ah_config.ath_hal_mci_config & |
495 ATH_MCI_CONFIG_MCI_OBS_MCI) 496 { 497 ar9300_gpio_cfg_output(ah, 3, HAL_GPIO_OUTPUT_MUX_AS_MCI_WLAN_DATA); 498 ar9300_gpio_cfg_output(ah, 2, HAL_GPIO_OUTPUT_MUX_AS_MCI_WLAN_CLK); 499 ar9300_gpio_cfg_output(ah, 1, HAL_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA); 500 ar9300_gpio_cfg_output(ah, 0, HAL_GPIO_OUTPUT_MUX_AS_MCI_BT_CLK); 501 } | 493 ATH_MCI_CONFIG_MCI_OBS_MCI) 494 { 495 ar9300_gpio_cfg_output(ah, 3, HAL_GPIO_OUTPUT_MUX_AS_MCI_WLAN_DATA); 496 ar9300_gpio_cfg_output(ah, 2, HAL_GPIO_OUTPUT_MUX_AS_MCI_WLAN_CLK); 497 ar9300_gpio_cfg_output(ah, 1, HAL_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA); 498 ar9300_gpio_cfg_output(ah, 0, HAL_GPIO_OUTPUT_MUX_AS_MCI_BT_CLK); 499 } |
502 else if (AH_PRIVATE(ah)->ah_config.ath_hal_mci_config & | 500 else if (ah->ah_config.ath_hal_mci_config & |
503 ATH_MCI_CONFIG_MCI_OBS_TXRX) 504 { 505 ar9300_gpio_cfg_output(ah, 3, HAL_GPIO_OUTPUT_MUX_AS_WL_IN_TX); 506 ar9300_gpio_cfg_output(ah, 2, HAL_GPIO_OUTPUT_MUX_AS_WL_IN_RX); 507 ar9300_gpio_cfg_output(ah, 1, HAL_GPIO_OUTPUT_MUX_AS_BT_IN_TX); 508 ar9300_gpio_cfg_output(ah, 0, HAL_GPIO_OUTPUT_MUX_AS_BT_IN_RX); 509 ar9300_gpio_cfg_output(ah, 5, HAL_GPIO_OUTPUT_MUX_AS_OUTPUT); 510 } | 501 ATH_MCI_CONFIG_MCI_OBS_TXRX) 502 { 503 ar9300_gpio_cfg_output(ah, 3, HAL_GPIO_OUTPUT_MUX_AS_WL_IN_TX); 504 ar9300_gpio_cfg_output(ah, 2, HAL_GPIO_OUTPUT_MUX_AS_WL_IN_RX); 505 ar9300_gpio_cfg_output(ah, 1, HAL_GPIO_OUTPUT_MUX_AS_BT_IN_TX); 506 ar9300_gpio_cfg_output(ah, 0, HAL_GPIO_OUTPUT_MUX_AS_BT_IN_RX); 507 ar9300_gpio_cfg_output(ah, 5, HAL_GPIO_OUTPUT_MUX_AS_OUTPUT); 508 } |
511 else if (AH_PRIVATE(ah)->ah_config.ath_hal_mci_config & | 509 else if (ah->ah_config.ath_hal_mci_config & |
512 ATH_MCI_CONFIG_MCI_OBS_BT) 513 { 514 ar9300_gpio_cfg_output(ah, 3, HAL_GPIO_OUTPUT_MUX_AS_BT_IN_TX); 515 ar9300_gpio_cfg_output(ah, 2, HAL_GPIO_OUTPUT_MUX_AS_BT_IN_RX); 516 ar9300_gpio_cfg_output(ah, 1, HAL_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA); 517 ar9300_gpio_cfg_output(ah, 0, HAL_GPIO_OUTPUT_MUX_AS_MCI_BT_CLK); 518 } 519 else { --- 394 unchanged lines hidden (view full) --- 914 OS_REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, 915 AR_MCI_INTERRUPT_RX_MSG_DEFAULT); 916} 917 918void ar9300_mci_reset(struct ath_hal *ah, HAL_BOOL en_int, HAL_BOOL is_2g, 919 HAL_BOOL is_full_sleep) 920{ 921 struct ath_hal_9300 *ahp = AH9300(ah); | 510 ATH_MCI_CONFIG_MCI_OBS_BT) 511 { 512 ar9300_gpio_cfg_output(ah, 3, HAL_GPIO_OUTPUT_MUX_AS_BT_IN_TX); 513 ar9300_gpio_cfg_output(ah, 2, HAL_GPIO_OUTPUT_MUX_AS_BT_IN_RX); 514 ar9300_gpio_cfg_output(ah, 1, HAL_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA); 515 ar9300_gpio_cfg_output(ah, 0, HAL_GPIO_OUTPUT_MUX_AS_MCI_BT_CLK); 516 } 517 else { --- 394 unchanged lines hidden (view full) --- 912 OS_REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, 913 AR_MCI_INTERRUPT_RX_MSG_DEFAULT); 914} 915 916void ar9300_mci_reset(struct ath_hal *ah, HAL_BOOL en_int, HAL_BOOL is_2g, 917 HAL_BOOL is_full_sleep) 918{ 919 struct ath_hal_9300 *ahp = AH9300(ah); |
922 struct ath_hal_private *ahpriv = AH_PRIVATE(ah); | 920// struct ath_hal_private *ahpriv = AH_PRIVATE(ah); |
923 u_int32_t regval; 924 925 HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(MCI) %s: full_sleep = %d, is_2g = %d\n", 926 __func__, is_full_sleep, is_2g); 927 928 if (!ahp->ah_mci_gpm_addr && !ahp->ah_mci_sched_addr) { 929 /* GPM buffer and scheduling message buffer are not allocated */ 930 HALDEBUG(ah, HAL_DEBUG_BT_COEX, --- 28 unchanged lines hidden (view full) --- 959 960 if (AR_SREV_JUPITER_10(ah)) { 961 regval |= SM(1, AR_BTCOEX_CTRL_SPDT_ENABLE_10); 962 } 963 964 OS_REG_WRITE(ah, AR_BTCOEX_CTRL, regval); 965 966 if (is_2g && (AR_SREV_JUPITER_20(ah) || AR_SREV_APHRODITE(ah)) && | 921 u_int32_t regval; 922 923 HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(MCI) %s: full_sleep = %d, is_2g = %d\n", 924 __func__, is_full_sleep, is_2g); 925 926 if (!ahp->ah_mci_gpm_addr && !ahp->ah_mci_sched_addr) { 927 /* GPM buffer and scheduling message buffer are not allocated */ 928 HALDEBUG(ah, HAL_DEBUG_BT_COEX, --- 28 unchanged lines hidden (view full) --- 957 958 if (AR_SREV_JUPITER_10(ah)) { 959 regval |= SM(1, AR_BTCOEX_CTRL_SPDT_ENABLE_10); 960 } 961 962 OS_REG_WRITE(ah, AR_BTCOEX_CTRL, regval); 963 964 if (is_2g && (AR_SREV_JUPITER_20(ah) || AR_SREV_APHRODITE(ah)) && |
967 !(AH_PRIVATE(ah)->ah_config.ath_hal_mci_config & | 965 !(ah->ah_config.ath_hal_mci_config & |
968 ATH_MCI_CONFIG_DISABLE_OSLA)) 969 { 970 ar9300_mci_osla_setup(ah, AH_TRUE); 971 } 972 else { 973 ar9300_mci_osla_setup(ah, AH_FALSE); 974 } 975 976 if (AR_SREV_JUPITER_20(ah) || AR_SREV_APHRODITE(ah)) { 977 OS_REG_SET_BIT(ah, AR_GLB_CONTROL, AR_BTCOEX_CTRL_SPDT_ENABLE); 978 979 OS_REG_RMW_FIELD(ah, AR_BTCOEX_CTRL3, 980 AR_BTCOEX_CTRL3_CONT_INFO_TIMEOUT, 20); 981 } 982 983 OS_REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, AR_BTCOEX_CTRL2_RX_DEWEIGHT, 0); 984 985 OS_REG_RMW_FIELD(ah, AR_PCU_MISC, AR_PCU_BT_ANT_PREVENT_RX, 0); 986 | 966 ATH_MCI_CONFIG_DISABLE_OSLA)) 967 { 968 ar9300_mci_osla_setup(ah, AH_TRUE); 969 } 970 else { 971 ar9300_mci_osla_setup(ah, AH_FALSE); 972 } 973 974 if (AR_SREV_JUPITER_20(ah) || AR_SREV_APHRODITE(ah)) { 975 OS_REG_SET_BIT(ah, AR_GLB_CONTROL, AR_BTCOEX_CTRL_SPDT_ENABLE); 976 977 OS_REG_RMW_FIELD(ah, AR_BTCOEX_CTRL3, 978 AR_BTCOEX_CTRL3_CONT_INFO_TIMEOUT, 20); 979 } 980 981 OS_REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, AR_BTCOEX_CTRL2_RX_DEWEIGHT, 0); 982 983 OS_REG_RMW_FIELD(ah, AR_PCU_MISC, AR_PCU_BT_ANT_PREVENT_RX, 0); 984 |
987 if (ahpriv->ah_config.ath_hal_mci_config & ATH_MCI_CONFIG_CONCUR_TX) { | 985 if (ah->ah_config.ath_hal_mci_config & ATH_MCI_CONFIG_CONCUR_TX) { |
988 u_int8_t i; 989 u_int32_t const *pmax_tx_pwr; 990 | 986 u_int8_t i; 987 u_int32_t const *pmax_tx_pwr; 988 |
991 if ((ahpriv->ah_config.ath_hal_mci_config & | 989 if ((ah->ah_config.ath_hal_mci_config & |
992 ATH_MCI_CONFIG_CONCUR_TX) == ATH_MCI_CONCUR_TX_SHARED_CHN) 993 { 994 ahp->ah_mci_concur_tx_en = (ahp->ah_bt_coex_flag & 995 HAL_BT_COEX_FLAG_MCI_MAX_TX_PWR) ? AH_TRUE : AH_FALSE; 996 997 HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(MCI) concur_tx_en = %d\n", 998 ahp->ah_mci_concur_tx_en); 999 /* --- 25 unchanged lines hidden (view full) --- 1025 chan_flags, 1026 (MS(pmax_tx_pwr[2], 1027 ATH_MCI_CONCUR_TX_LOWEST_PWR_MASK) >> 1)); 1028 } 1029#else 1030 pmax_tx_pwr = &mci_concur_tx_max_pwr[0][0]; 1031#endif 1032 } | 990 ATH_MCI_CONFIG_CONCUR_TX) == ATH_MCI_CONCUR_TX_SHARED_CHN) 991 { 992 ahp->ah_mci_concur_tx_en = (ahp->ah_bt_coex_flag & 993 HAL_BT_COEX_FLAG_MCI_MAX_TX_PWR) ? AH_TRUE : AH_FALSE; 994 995 HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(MCI) concur_tx_en = %d\n", 996 ahp->ah_mci_concur_tx_en); 997 /* --- 25 unchanged lines hidden (view full) --- 1023 chan_flags, 1024 (MS(pmax_tx_pwr[2], 1025 ATH_MCI_CONCUR_TX_LOWEST_PWR_MASK) >> 1)); 1026 } 1027#else 1028 pmax_tx_pwr = &mci_concur_tx_max_pwr[0][0]; 1029#endif 1030 } |
1033 else if ((ahpriv->ah_config.ath_hal_mci_config & | 1031 else if ((ah->ah_config.ath_hal_mci_config & |
1034 ATH_MCI_CONFIG_CONCUR_TX) == ATH_MCI_CONCUR_TX_UNSHARED_CHN) 1035 { 1036 pmax_tx_pwr = &mci_concur_tx_max_pwr[0][0]; 1037 ahp->ah_mci_concur_tx_en = AH_TRUE; 1038 } 1039 else { 1040 pmax_tx_pwr = &mci_concur_tx_max_pwr[0][0]; 1041 ahp->ah_mci_concur_tx_en = AH_TRUE; --- 6 unchanged lines hidden (view full) --- 1048 AR_BTCOEX_CTRL2_TXPWR_THRESH, 0x7f); 1049 OS_REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, 1050 AR_BTCOEX_CTRL_REDUCE_TXPWR, 0); 1051 for (i = 0; i < 8; i++) { 1052 OS_REG_WRITE(ah, AR_BTCOEX_MAX_TXPWR(i), pmax_tx_pwr[i]); 1053 } 1054 } 1055 | 1032 ATH_MCI_CONFIG_CONCUR_TX) == ATH_MCI_CONCUR_TX_UNSHARED_CHN) 1033 { 1034 pmax_tx_pwr = &mci_concur_tx_max_pwr[0][0]; 1035 ahp->ah_mci_concur_tx_en = AH_TRUE; 1036 } 1037 else { 1038 pmax_tx_pwr = &mci_concur_tx_max_pwr[0][0]; 1039 ahp->ah_mci_concur_tx_en = AH_TRUE; --- 6 unchanged lines hidden (view full) --- 1046 AR_BTCOEX_CTRL2_TXPWR_THRESH, 0x7f); 1047 OS_REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, 1048 AR_BTCOEX_CTRL_REDUCE_TXPWR, 0); 1049 for (i = 0; i < 8; i++) { 1050 OS_REG_WRITE(ah, AR_BTCOEX_MAX_TXPWR(i), pmax_tx_pwr[i]); 1051 } 1052 } 1053 |
1056 regval = MS(AH_PRIVATE(ah)->ah_config.ath_hal_mci_config, | 1054 regval = MS(ah->ah_config.ath_hal_mci_config, |
1057 ATH_MCI_CONFIG_CLK_DIV); 1058 OS_REG_RMW_FIELD(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_CLK_DIV, regval); 1059 1060 OS_REG_SET_BIT(ah, AR_BTCOEX_CTRL, AR_BTCOEX_CTRL_MCI_MODE_EN); 1061 1062 /* Resetting the Rx and Tx paths of MCI */ 1063 regval = OS_REG_READ(ah, AR_MCI_COMMAND2); 1064 regval |= SM(1, AR_MCI_COMMAND2_RESET_TX); --- 271 unchanged lines hidden (view full) --- 1336u_int32_t 1337ar9300_mci_state(struct ath_hal *ah, u_int32_t state_type, u_int32_t *p_data) 1338{ 1339 u_int32_t value = 0, more_gpm = 0, gpm_ptr; 1340 struct ath_hal_9300 *ahp = AH9300(ah); 1341 1342 switch (state_type) { 1343 case HAL_MCI_STATE_ENABLE: | 1055 ATH_MCI_CONFIG_CLK_DIV); 1056 OS_REG_RMW_FIELD(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_CLK_DIV, regval); 1057 1058 OS_REG_SET_BIT(ah, AR_BTCOEX_CTRL, AR_BTCOEX_CTRL_MCI_MODE_EN); 1059 1060 /* Resetting the Rx and Tx paths of MCI */ 1061 regval = OS_REG_READ(ah, AR_MCI_COMMAND2); 1062 regval |= SM(1, AR_MCI_COMMAND2_RESET_TX); --- 271 unchanged lines hidden (view full) --- 1334u_int32_t 1335ar9300_mci_state(struct ath_hal *ah, u_int32_t state_type, u_int32_t *p_data) 1336{ 1337 u_int32_t value = 0, more_gpm = 0, gpm_ptr; 1338 struct ath_hal_9300 *ahp = AH9300(ah); 1339 1340 switch (state_type) { 1341 case HAL_MCI_STATE_ENABLE: |
1344 if (AH_PRIVATE(ah)->ah_caps.hal_mci_support && ahp->ah_mci_ready) { | 1342 if (AH_PRIVATE(ah)->ah_caps.halMciSupport && ahp->ah_mci_ready) { |
1345 value = OS_REG_READ(ah, AR_BTCOEX_CTRL); 1346 if ((value == 0xdeadbeef) || (value == 0xffffffff)) { 1347 // HALDEBUG(ah, HAL_DEBUG_BT_COEX, 1348 // "(MCI) BTCOEX_CTRL = 0xdeadbeef\n"); 1349 value = 0; 1350 } 1351 } 1352 value &= AR_BTCOEX_CTRL_MCI_MODE_EN; --- 190 unchanged lines hidden (view full) --- 1543 ahp->ah_mci_bt_state = MCI_BT_CAL; 1544 break; 1545 1546 case HAL_MCI_STATE_RESET_REQ_WAKE: 1547 ar9300_mci_reset_req_wakeup(ah); 1548 ahp->ah_mci_coex_2g5g_update = AH_TRUE; 1549 1550 if ((AR_SREV_JUPITER_20_OR_LATER(ah) || AR_SREV_APHRODITE(ah)) && | 1343 value = OS_REG_READ(ah, AR_BTCOEX_CTRL); 1344 if ((value == 0xdeadbeef) || (value == 0xffffffff)) { 1345 // HALDEBUG(ah, HAL_DEBUG_BT_COEX, 1346 // "(MCI) BTCOEX_CTRL = 0xdeadbeef\n"); 1347 value = 0; 1348 } 1349 } 1350 value &= AR_BTCOEX_CTRL_MCI_MODE_EN; --- 190 unchanged lines hidden (view full) --- 1541 ahp->ah_mci_bt_state = MCI_BT_CAL; 1542 break; 1543 1544 case HAL_MCI_STATE_RESET_REQ_WAKE: 1545 ar9300_mci_reset_req_wakeup(ah); 1546 ahp->ah_mci_coex_2g5g_update = AH_TRUE; 1547 1548 if ((AR_SREV_JUPITER_20_OR_LATER(ah) || AR_SREV_APHRODITE(ah)) && |
1551 (AH_PRIVATE(ah)->ah_config.ath_hal_mci_config & | 1549 (ah->ah_config.ath_hal_mci_config & |
1552 ATH_MCI_CONFIG_MCI_OBS_MASK)) 1553 { 1554 /* Check if we still have control of the GPIOs */ 1555 if ((OS_REG_READ(ah, AR_GLB_GPIO_CONTROL) & 1556 ATH_MCI_CONFIG_MCI_OBS_GPIO) != 1557 ATH_MCI_CONFIG_MCI_OBS_GPIO) 1558 { 1559 HALDEBUG(ah, HAL_DEBUG_BT_COEX, --- 71 unchanged lines hidden (view full) --- 1631 (ahp->ah_mci_need_flush_btinfo == AH_TRUE)) 1632 { 1633 value = 1; 1634 } 1635 else { 1636 value = 0; 1637 } 1638 if (p_data != NULL) { | 1550 ATH_MCI_CONFIG_MCI_OBS_MASK)) 1551 { 1552 /* Check if we still have control of the GPIOs */ 1553 if ((OS_REG_READ(ah, AR_GLB_GPIO_CONTROL) & 1554 ATH_MCI_CONFIG_MCI_OBS_GPIO) != 1555 ATH_MCI_CONFIG_MCI_OBS_GPIO) 1556 { 1557 HALDEBUG(ah, HAL_DEBUG_BT_COEX, --- 71 unchanged lines hidden (view full) --- 1629 (ahp->ah_mci_need_flush_btinfo == AH_TRUE)) 1630 { 1631 value = 1; 1632 } 1633 else { 1634 value = 0; 1635 } 1636 if (p_data != NULL) { |
1639 ahp->ah_mci_need_flush_btinfo = (*p_data != 0)?true:false; | 1637 ahp->ah_mci_need_flush_btinfo = (*p_data != 0)? AH_TRUE : AH_FALSE; |
1640 } 1641 break; 1642 1643 case HAL_MCI_STATE_SET_CONCUR_TX_PRI: 1644 if (p_data) { 1645 ahp->ah_mci_stomp_none_tx_pri = *p_data & 0xff; 1646 ahp->ah_mci_stomp_low_tx_pri = (*p_data >> 8) & 0xff; 1647 ahp->ah_mci_stomp_all_tx_pri = (*p_data >> 16) & 0xff; --- 20 unchanged lines hidden (view full) --- 1668 ar9300_mci_send_coex_bt_flags(ah, AH_TRUE, 1669 MCI_GPM_COEX_BT_FLAGS_READ, 0); 1670 } 1671 } 1672 } 1673 break; 1674 1675 case HAL_MCI_STATE_NEED_FTP_STOMP: | 1638 } 1639 break; 1640 1641 case HAL_MCI_STATE_SET_CONCUR_TX_PRI: 1642 if (p_data) { 1643 ahp->ah_mci_stomp_none_tx_pri = *p_data & 0xff; 1644 ahp->ah_mci_stomp_low_tx_pri = (*p_data >> 8) & 0xff; 1645 ahp->ah_mci_stomp_all_tx_pri = (*p_data >> 16) & 0xff; --- 20 unchanged lines hidden (view full) --- 1666 ar9300_mci_send_coex_bt_flags(ah, AH_TRUE, 1667 MCI_GPM_COEX_BT_FLAGS_READ, 0); 1668 } 1669 } 1670 } 1671 break; 1672 1673 case HAL_MCI_STATE_NEED_FTP_STOMP: |
1676 value = (AH_PRIVATE(ah)->ah_config.ath_hal_mci_config & | 1674 value = (ah->ah_config.ath_hal_mci_config & |
1677 ATH_MCI_CONFIG_DISABLE_FTP_STOMP) ? 0 : 1; 1678 break; 1679 1680 case HAL_MCI_STATE_NEED_TUNING: | 1675 ATH_MCI_CONFIG_DISABLE_FTP_STOMP) ? 0 : 1; 1676 break; 1677 1678 case HAL_MCI_STATE_NEED_TUNING: |
1681 value = (AH_PRIVATE(ah)->ah_config.ath_hal_mci_config & | 1679 value = (ah->ah_config.ath_hal_mci_config & |
1682 ATH_MCI_CONFIG_DISABLE_TUNING) ? 0 : 1; 1683 break; 1684 1685 case HAL_MCI_STATE_SHARED_CHAIN_CONCUR_TX: | 1680 ATH_MCI_CONFIG_DISABLE_TUNING) ? 0 : 1; 1681 break; 1682 1683 case HAL_MCI_STATE_SHARED_CHAIN_CONCUR_TX: |
1686 value = ((AH_PRIVATE(ah)->ah_config.ath_hal_mci_config & | 1684 value = ((ah->ah_config.ath_hal_mci_config & |
1687 ATH_MCI_CONFIG_CONCUR_TX) == 1688 ATH_MCI_CONCUR_TX_SHARED_CHN)? 1 : 0; 1689 break; 1690 1691 default: 1692 break; 1693 } 1694 return value; --- 44 unchanged lines hidden (view full) --- 1739 ah_bt_coex_wlan_weight[1] = 0x7d000000 1740 ah_bt_coex_wlan_weight[2] = 0x00000000 1741 ah_bt_coex_wlan_weight[3] = 0x00000000 1742*/ 1743 1744void ar9300_mci_bt_coex_set_weights(struct ath_hal *ah, u_int32_t stomp_type) 1745{ 1746 struct ath_hal_9300 *ahp = AH9300(ah); | 1685 ATH_MCI_CONFIG_CONCUR_TX) == 1686 ATH_MCI_CONCUR_TX_SHARED_CHN)? 1 : 0; 1687 break; 1688 1689 default: 1690 break; 1691 } 1692 return value; --- 44 unchanged lines hidden (view full) --- 1737 ah_bt_coex_wlan_weight[1] = 0x7d000000 1738 ah_bt_coex_wlan_weight[2] = 0x00000000 1739 ah_bt_coex_wlan_weight[3] = 0x00000000 1740*/ 1741 1742void ar9300_mci_bt_coex_set_weights(struct ath_hal *ah, u_int32_t stomp_type) 1743{ 1744 struct ath_hal_9300 *ahp = AH9300(ah); |
1747 struct ath_hal_private *ahpriv = AH_PRIVATE(ah); | 1745// struct ath_hal_private *ahpriv = AH_PRIVATE(ah); |
1748 u_int32_t tx_priority = 0; 1749 1750 switch (stomp_type) { 1751 case HAL_BT_COEX_STOMP_ALL: 1752 ahp->ah_bt_coex_wlan_weight[0] = JUPITER_STOMP_ALL_WLAN_WGHT0; 1753 ahp->ah_bt_coex_wlan_weight[1] = JUPITER_STOMP_ALL_WLAN_WGHT1; 1754 ahp->ah_bt_coex_wlan_weight[2] = JUPITER_STOMP_ALL_WLAN_WGHT2; 1755 ahp->ah_bt_coex_wlan_weight[3] = JUPITER_STOMP_ALL_WLAN_WGHT3; --- 12 unchanged lines hidden (view full) --- 1768 ahp->ah_bt_coex_wlan_weight[0] = JUPITER_STOMP_LOW_WLAN_WGHT0; 1769 ahp->ah_bt_coex_wlan_weight[1] = JUPITER_STOMP_LOW_WLAN_WGHT1; 1770 ahp->ah_bt_coex_wlan_weight[2] = JUPITER_STOMP_LOW_WLAN_WGHT2; 1771 ahp->ah_bt_coex_wlan_weight[3] = JUPITER_STOMP_LOW_WLAN_WGHT3; 1772 } 1773 if (ahp->ah_mci_concur_tx_en && ahp->ah_mci_stomp_low_tx_pri) { 1774 tx_priority = ahp->ah_mci_stomp_low_tx_pri; 1775 } | 1746 u_int32_t tx_priority = 0; 1747 1748 switch (stomp_type) { 1749 case HAL_BT_COEX_STOMP_ALL: 1750 ahp->ah_bt_coex_wlan_weight[0] = JUPITER_STOMP_ALL_WLAN_WGHT0; 1751 ahp->ah_bt_coex_wlan_weight[1] = JUPITER_STOMP_ALL_WLAN_WGHT1; 1752 ahp->ah_bt_coex_wlan_weight[2] = JUPITER_STOMP_ALL_WLAN_WGHT2; 1753 ahp->ah_bt_coex_wlan_weight[3] = JUPITER_STOMP_ALL_WLAN_WGHT3; --- 12 unchanged lines hidden (view full) --- 1766 ahp->ah_bt_coex_wlan_weight[0] = JUPITER_STOMP_LOW_WLAN_WGHT0; 1767 ahp->ah_bt_coex_wlan_weight[1] = JUPITER_STOMP_LOW_WLAN_WGHT1; 1768 ahp->ah_bt_coex_wlan_weight[2] = JUPITER_STOMP_LOW_WLAN_WGHT2; 1769 ahp->ah_bt_coex_wlan_weight[3] = JUPITER_STOMP_LOW_WLAN_WGHT3; 1770 } 1771 if (ahp->ah_mci_concur_tx_en && ahp->ah_mci_stomp_low_tx_pri) { 1772 tx_priority = ahp->ah_mci_stomp_low_tx_pri; 1773 } |
1776 if (AH_PRIVATE(ah)->ah_config.ath_hal_mci_config & | 1774 if (ah->ah_config.ath_hal_mci_config & |
1777 ATH_MCI_CONFIG_MCI_OBS_TXRX) 1778 { 1779 ar9300_gpio_set(ah, 5, 1); 1780 } 1781 break; 1782 case HAL_BT_COEX_STOMP_ALL_FORCE: 1783 ahp->ah_bt_coex_wlan_weight[0] = JUPITER_STOMP_ALL_FORCE_WLAN_WGHT0; 1784 ahp->ah_bt_coex_wlan_weight[1] = JUPITER_STOMP_ALL_FORCE_WLAN_WGHT1; --- 13 unchanged lines hidden (view full) --- 1798 case HAL_BT_COEX_NO_STOMP: 1799 ahp->ah_bt_coex_wlan_weight[0] = JUPITER_STOMP_NONE_WLAN_WGHT0; 1800 ahp->ah_bt_coex_wlan_weight[1] = JUPITER_STOMP_NONE_WLAN_WGHT1; 1801 ahp->ah_bt_coex_wlan_weight[2] = JUPITER_STOMP_NONE_WLAN_WGHT2; 1802 ahp->ah_bt_coex_wlan_weight[3] = JUPITER_STOMP_NONE_WLAN_WGHT3; 1803 if (ahp->ah_mci_concur_tx_en && ahp->ah_mci_stomp_none_tx_pri) { 1804 tx_priority = ahp->ah_mci_stomp_none_tx_pri; 1805 } | 1775 ATH_MCI_CONFIG_MCI_OBS_TXRX) 1776 { 1777 ar9300_gpio_set(ah, 5, 1); 1778 } 1779 break; 1780 case HAL_BT_COEX_STOMP_ALL_FORCE: 1781 ahp->ah_bt_coex_wlan_weight[0] = JUPITER_STOMP_ALL_FORCE_WLAN_WGHT0; 1782 ahp->ah_bt_coex_wlan_weight[1] = JUPITER_STOMP_ALL_FORCE_WLAN_WGHT1; --- 13 unchanged lines hidden (view full) --- 1796 case HAL_BT_COEX_NO_STOMP: 1797 ahp->ah_bt_coex_wlan_weight[0] = JUPITER_STOMP_NONE_WLAN_WGHT0; 1798 ahp->ah_bt_coex_wlan_weight[1] = JUPITER_STOMP_NONE_WLAN_WGHT1; 1799 ahp->ah_bt_coex_wlan_weight[2] = JUPITER_STOMP_NONE_WLAN_WGHT2; 1800 ahp->ah_bt_coex_wlan_weight[3] = JUPITER_STOMP_NONE_WLAN_WGHT3; 1801 if (ahp->ah_mci_concur_tx_en && ahp->ah_mci_stomp_none_tx_pri) { 1802 tx_priority = ahp->ah_mci_stomp_none_tx_pri; 1803 } |
1806 if (AH_PRIVATE(ah)->ah_config.ath_hal_mci_config & | 1804 if (ah->ah_config.ath_hal_mci_config & |
1807 ATH_MCI_CONFIG_MCI_OBS_TXRX) 1808 { 1809 ar9300_gpio_set(ah, 5, 0); 1810 } 1811 break; 1812 default: 1813 /* There is a forceWeight from registry */ 1814 ahp->ah_bt_coex_wlan_weight[0] = stomp_type; --- 10 unchanged lines hidden (view full) --- 1825 SM(tx_priority, MCI_CONCUR_TX_WLAN_WGHT2_MASK); 1826 ahp->ah_bt_coex_wlan_weight[3] &= ~MCI_CONCUR_TX_WLAN_WGHT3_MASK; 1827 ahp->ah_bt_coex_wlan_weight[3] |= 1828 SM(tx_priority, MCI_CONCUR_TX_WLAN_WGHT3_MASK); 1829 ahp->ah_bt_coex_wlan_weight[3] &= ~MCI_CONCUR_TX_WLAN_WGHT3_MASK2; 1830 ahp->ah_bt_coex_wlan_weight[3] |= 1831 SM(tx_priority, MCI_CONCUR_TX_WLAN_WGHT3_MASK2); 1832 } | 1805 ATH_MCI_CONFIG_MCI_OBS_TXRX) 1806 { 1807 ar9300_gpio_set(ah, 5, 0); 1808 } 1809 break; 1810 default: 1811 /* There is a forceWeight from registry */ 1812 ahp->ah_bt_coex_wlan_weight[0] = stomp_type; --- 10 unchanged lines hidden (view full) --- 1823 SM(tx_priority, MCI_CONCUR_TX_WLAN_WGHT2_MASK); 1824 ahp->ah_bt_coex_wlan_weight[3] &= ~MCI_CONCUR_TX_WLAN_WGHT3_MASK; 1825 ahp->ah_bt_coex_wlan_weight[3] |= 1826 SM(tx_priority, MCI_CONCUR_TX_WLAN_WGHT3_MASK); 1827 ahp->ah_bt_coex_wlan_weight[3] &= ~MCI_CONCUR_TX_WLAN_WGHT3_MASK2; 1828 ahp->ah_bt_coex_wlan_weight[3] |= 1829 SM(tx_priority, MCI_CONCUR_TX_WLAN_WGHT3_MASK2); 1830 } |
1833 if (AH_PRIVATE(ah)->ah_config.ath_hal_mci_config & | 1831 if (ah->ah_config.ath_hal_mci_config & |
1834 ATH_MCI_CONFIG_MCI_WEIGHT_DBG) 1835 { 1836 HALDEBUG(ah, HAL_DEBUG_BT_COEX, 1837 "(MCI) Set weights: 0x%08x 0x%08x 0x%08x 0x%08x\n", 1838 ahp->ah_bt_coex_wlan_weight[0], 1839 ahp->ah_bt_coex_wlan_weight[1], 1840 ahp->ah_bt_coex_wlan_weight[2], 1841 ahp->ah_bt_coex_wlan_weight[3]); --- 42 unchanged lines hidden (view full) --- 1884 } 1885 1886 ahp->ah_bt_coex_enabled = AH_TRUE; 1887 1888 return 0; 1889} 1890 1891#endif /* ATH_SUPPORT_MCI */ | 1832 ATH_MCI_CONFIG_MCI_WEIGHT_DBG) 1833 { 1834 HALDEBUG(ah, HAL_DEBUG_BT_COEX, 1835 "(MCI) Set weights: 0x%08x 0x%08x 0x%08x 0x%08x\n", 1836 ahp->ah_bt_coex_wlan_weight[0], 1837 ahp->ah_bt_coex_wlan_weight[1], 1838 ahp->ah_bt_coex_wlan_weight[2], 1839 ahp->ah_bt_coex_wlan_weight[3]); --- 42 unchanged lines hidden (view full) --- 1882 } 1883 1884 ahp->ah_bt_coex_enabled = AH_TRUE; 1885 1886 return 0; 1887} 1888 1889#endif /* ATH_SUPPORT_MCI */ |
1892#endif /* AH_SUPPORT_AR9300 */ | |