1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (c) 2009-2011 Atheros Communications Inc. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission to use, copy, modify, and/or distribute this software for any 5*4882a593Smuzhiyun * purpose with or without fee is hereby granted, provided that the above 6*4882a593Smuzhiyun * copyright notice and this permission notice appear in all copies. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9*4882a593Smuzhiyun * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10*4882a593Smuzhiyun * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11*4882a593Smuzhiyun * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12*4882a593Smuzhiyun * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13*4882a593Smuzhiyun * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14*4882a593Smuzhiyun * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #ifndef BTCOEX_H 18*4882a593Smuzhiyun #define BTCOEX_H 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #include "hw.h" 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define ATH_WLANACTIVE_GPIO_9280 5 23*4882a593Smuzhiyun #define ATH_BTACTIVE_GPIO_9280 6 24*4882a593Smuzhiyun #define ATH_BTPRIORITY_GPIO_9285 7 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define ATH_WLANACTIVE_GPIO_9300 5 27*4882a593Smuzhiyun #define ATH_BTACTIVE_GPIO_9300 4 28*4882a593Smuzhiyun #define ATH_BTPRIORITY_GPIO_9300 8 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #define ATH_BTCOEX_DEF_BT_PERIOD 45 31*4882a593Smuzhiyun #define ATH_BTCOEX_DEF_DUTY_CYCLE 55 32*4882a593Smuzhiyun #define ATH_BTCOEX_BTSCAN_DUTY_CYCLE 90 33*4882a593Smuzhiyun #define ATH_BTCOEX_BMISS_THRESH 50 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define ATH_BT_PRIORITY_TIME_THRESHOLD 1000 /* ms */ 36*4882a593Smuzhiyun #define ATH_BT_CNT_THRESHOLD 3 37*4882a593Smuzhiyun #define ATH_BT_CNT_SCAN_THRESHOLD 15 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define ATH_BTCOEX_RX_WAIT_TIME 100 40*4882a593Smuzhiyun #define ATH_BTCOEX_STOMP_FTP_THRESH 5 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define ATH_BTCOEX_HT20_MAX_TXPOWER 0x14 43*4882a593Smuzhiyun #define ATH_BTCOEX_HT40_MAX_TXPOWER 0x10 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define AR9300_NUM_BT_WEIGHTS 4 46*4882a593Smuzhiyun #define AR9300_NUM_WLAN_WEIGHTS 4 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define ATH_AIC_MAX_BT_CHANNEL 79 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* Defines the BT AR_BT_COEX_WGHT used */ 51*4882a593Smuzhiyun enum ath_stomp_type { 52*4882a593Smuzhiyun ATH_BTCOEX_STOMP_ALL, 53*4882a593Smuzhiyun ATH_BTCOEX_STOMP_LOW, 54*4882a593Smuzhiyun ATH_BTCOEX_STOMP_NONE, 55*4882a593Smuzhiyun ATH_BTCOEX_STOMP_LOW_FTP, 56*4882a593Smuzhiyun ATH_BTCOEX_STOMP_AUDIO, 57*4882a593Smuzhiyun ATH_BTCOEX_STOMP_MAX 58*4882a593Smuzhiyun }; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun enum ath_btcoex_scheme { 61*4882a593Smuzhiyun ATH_BTCOEX_CFG_NONE, 62*4882a593Smuzhiyun ATH_BTCOEX_CFG_2WIRE, 63*4882a593Smuzhiyun ATH_BTCOEX_CFG_3WIRE, 64*4882a593Smuzhiyun ATH_BTCOEX_CFG_MCI, 65*4882a593Smuzhiyun }; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun struct ath9k_hw_mci { 68*4882a593Smuzhiyun u32 raw_intr; 69*4882a593Smuzhiyun u32 rx_msg_intr; 70*4882a593Smuzhiyun u32 cont_status; 71*4882a593Smuzhiyun u32 gpm_addr; 72*4882a593Smuzhiyun u32 gpm_len; 73*4882a593Smuzhiyun u32 gpm_idx; 74*4882a593Smuzhiyun u32 sched_addr; 75*4882a593Smuzhiyun u32 wlan_channels[4]; 76*4882a593Smuzhiyun u32 wlan_cal_seq; 77*4882a593Smuzhiyun u32 wlan_cal_done; 78*4882a593Smuzhiyun u32 config; 79*4882a593Smuzhiyun u8 *gpm_buf; 80*4882a593Smuzhiyun bool ready; 81*4882a593Smuzhiyun bool update_2g5g; 82*4882a593Smuzhiyun bool is_2g; 83*4882a593Smuzhiyun bool query_bt; 84*4882a593Smuzhiyun bool unhalt_bt_gpm; /* need send UNHALT */ 85*4882a593Smuzhiyun bool halted_bt_gpm; /* HALT sent */ 86*4882a593Smuzhiyun bool need_flush_btinfo; 87*4882a593Smuzhiyun bool bt_version_known; 88*4882a593Smuzhiyun bool wlan_channels_update; 89*4882a593Smuzhiyun u8 wlan_ver_major; 90*4882a593Smuzhiyun u8 wlan_ver_minor; 91*4882a593Smuzhiyun u8 bt_ver_major; 92*4882a593Smuzhiyun u8 bt_ver_minor; 93*4882a593Smuzhiyun u8 bt_state; 94*4882a593Smuzhiyun u8 stomp_ftp; 95*4882a593Smuzhiyun bool concur_tx; 96*4882a593Smuzhiyun u32 last_recovery; 97*4882a593Smuzhiyun }; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun struct ath9k_hw_aic { 100*4882a593Smuzhiyun bool aic_enabled; 101*4882a593Smuzhiyun u8 aic_cal_state; 102*4882a593Smuzhiyun u8 aic_caled_chan; 103*4882a593Smuzhiyun u32 aic_sram[ATH_AIC_MAX_BT_CHANNEL]; 104*4882a593Smuzhiyun u32 aic_cal_start_time; 105*4882a593Smuzhiyun }; 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun struct ath_btcoex_hw { 108*4882a593Smuzhiyun enum ath_btcoex_scheme scheme; 109*4882a593Smuzhiyun struct ath9k_hw_mci mci; 110*4882a593Smuzhiyun struct ath9k_hw_aic aic; 111*4882a593Smuzhiyun bool enabled; 112*4882a593Smuzhiyun u8 wlanactive_gpio; 113*4882a593Smuzhiyun u8 btactive_gpio; 114*4882a593Smuzhiyun u8 btpriority_gpio; 115*4882a593Smuzhiyun u32 bt_coex_mode; /* Register setting for AR_BT_COEX_MODE */ 116*4882a593Smuzhiyun u32 bt_coex_weights; /* Register setting for AR_BT_COEX_WEIGHT */ 117*4882a593Smuzhiyun u32 bt_coex_mode2; /* Register setting for AR_BT_COEX_MODE2 */ 118*4882a593Smuzhiyun u32 bt_coex_mode3; /* Register setting for AR_BT_COEX_MODE3 */ 119*4882a593Smuzhiyun u32 bt_weight[AR9300_NUM_BT_WEIGHTS]; 120*4882a593Smuzhiyun u32 wlan_weight[AR9300_NUM_WLAN_WEIGHTS]; 121*4882a593Smuzhiyun u8 tx_prio[ATH_BTCOEX_STOMP_MAX]; 122*4882a593Smuzhiyun }; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun void ath9k_hw_btcoex_init_scheme(struct ath_hw *ah); 125*4882a593Smuzhiyun void ath9k_hw_btcoex_init_2wire(struct ath_hw *ah); 126*4882a593Smuzhiyun void ath9k_hw_btcoex_init_3wire(struct ath_hw *ah); 127*4882a593Smuzhiyun void ath9k_hw_btcoex_deinit(struct ath_hw *ah); 128*4882a593Smuzhiyun void ath9k_hw_btcoex_init_mci(struct ath_hw *ah); 129*4882a593Smuzhiyun void ath9k_hw_init_btcoex_hw(struct ath_hw *ah, int qnum); 130*4882a593Smuzhiyun void ath9k_hw_btcoex_set_weight(struct ath_hw *ah, 131*4882a593Smuzhiyun u32 bt_weight, 132*4882a593Smuzhiyun u32 wlan_weight, 133*4882a593Smuzhiyun enum ath_stomp_type stomp_type); 134*4882a593Smuzhiyun void ath9k_hw_btcoex_disable(struct ath_hw *ah); 135*4882a593Smuzhiyun void ath9k_hw_btcoex_bt_stomp(struct ath_hw *ah, 136*4882a593Smuzhiyun enum ath_stomp_type stomp_type); 137*4882a593Smuzhiyun void ath9k_hw_btcoex_set_concur_txprio(struct ath_hw *ah, u8 *stomp_txprio); 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun #endif 140