18c086312SLarry Finger // SPDX-License-Identifier: GPL-2.0 28c086312SLarry Finger /* Copyright(c) 2012 Realtek Corporation.*/ 3f1d2b4d3SLarry Finger 4f1d2b4d3SLarry Finger /************************************************************** 5f1d2b4d3SLarry Finger * include files 6f1d2b4d3SLarry Finger **************************************************************/ 7f1d2b4d3SLarry Finger #include "halbt_precomp.h" 8f1d2b4d3SLarry Finger /************************************************************** 9f1d2b4d3SLarry Finger * Global variables, these are static variables 10f1d2b4d3SLarry Finger **************************************************************/ 11f1d2b4d3SLarry Finger static struct coex_dm_8192e_2ant glcoex_dm_8192e_2ant; 12f1d2b4d3SLarry Finger static struct coex_dm_8192e_2ant *coex_dm = &glcoex_dm_8192e_2ant; 13f1d2b4d3SLarry Finger static struct coex_sta_8192e_2ant glcoex_sta_8192e_2ant; 14f1d2b4d3SLarry Finger static struct coex_sta_8192e_2ant *coex_sta = &glcoex_sta_8192e_2ant; 15f1d2b4d3SLarry Finger 16c6821613SYan-Hsuan Chuang static const char *const glbt_info_src_8192e_2ant[] = { 17f1d2b4d3SLarry Finger "BT Info[wifi fw]", 18f1d2b4d3SLarry Finger "BT Info[bt rsp]", 19f1d2b4d3SLarry Finger "BT Info[bt auto report]", 20f1d2b4d3SLarry Finger }; 21f1d2b4d3SLarry Finger 22f1d2b4d3SLarry Finger static u32 glcoex_ver_date_8192e_2ant = 20130902; 23f1d2b4d3SLarry Finger static u32 glcoex_ver_8192e_2ant = 0x34; 24f1d2b4d3SLarry Finger 25f1d2b4d3SLarry Finger /************************************************************** 26f1d2b4d3SLarry Finger * local function proto type if needed 27f1d2b4d3SLarry Finger **************************************************************/ 28f1d2b4d3SLarry Finger /************************************************************** 29c6821613SYan-Hsuan Chuang * local function start with btc8192e2ant_ 30f1d2b4d3SLarry Finger **************************************************************/ 31c6821613SYan-Hsuan Chuang static u8 btc8192e2ant_bt_rssi_state(struct btc_coexist *btcoexist, 32d46fa3e4SLarry Finger u8 level_num, u8 rssi_thresh, 33f1d2b4d3SLarry Finger u8 rssi_thresh1) 34f1d2b4d3SLarry Finger { 35d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 36c6821613SYan-Hsuan Chuang int bt_rssi = 0; 37c6821613SYan-Hsuan Chuang u8 bt_rssi_state = coex_sta->pre_bt_rssi_state; 38f1d2b4d3SLarry Finger 39c6821613SYan-Hsuan Chuang bt_rssi = coex_sta->bt_rssi; 40f1d2b4d3SLarry Finger 41f1d2b4d3SLarry Finger if (level_num == 2) { 42f1d2b4d3SLarry Finger if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) || 43f1d2b4d3SLarry Finger (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { 44c6821613SYan-Hsuan Chuang if (bt_rssi >= 45d46fa3e4SLarry Finger (rssi_thresh + BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) 46c6821613SYan-Hsuan Chuang bt_rssi_state = BTC_RSSI_STATE_HIGH; 47d46fa3e4SLarry Finger else 48c6821613SYan-Hsuan Chuang bt_rssi_state = BTC_RSSI_STATE_STAY_LOW; 49f1d2b4d3SLarry Finger } else { 50c6821613SYan-Hsuan Chuang if (bt_rssi < rssi_thresh) 51c6821613SYan-Hsuan Chuang bt_rssi_state = BTC_RSSI_STATE_LOW; 52d46fa3e4SLarry Finger else 53c6821613SYan-Hsuan Chuang bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH; 54f1d2b4d3SLarry Finger } 55f1d2b4d3SLarry Finger } else if (level_num == 3) { 56f1d2b4d3SLarry Finger if (rssi_thresh > rssi_thresh1) { 57d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 58d46fa3e4SLarry Finger "[BTCoex], BT Rssi thresh error!!\n"); 59f1d2b4d3SLarry Finger return coex_sta->pre_bt_rssi_state; 60f1d2b4d3SLarry Finger } 61c6821613SYan-Hsuan Chuang 62f1d2b4d3SLarry Finger if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) || 63f1d2b4d3SLarry Finger (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { 64c6821613SYan-Hsuan Chuang if (bt_rssi >= 65d46fa3e4SLarry Finger (rssi_thresh + BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) 66c6821613SYan-Hsuan Chuang bt_rssi_state = BTC_RSSI_STATE_MEDIUM; 67d46fa3e4SLarry Finger else 68c6821613SYan-Hsuan Chuang bt_rssi_state = BTC_RSSI_STATE_STAY_LOW; 69f1d2b4d3SLarry Finger } else if ((coex_sta->pre_bt_rssi_state == 70f1d2b4d3SLarry Finger BTC_RSSI_STATE_MEDIUM) || 71f1d2b4d3SLarry Finger (coex_sta->pre_bt_rssi_state == 72f1d2b4d3SLarry Finger BTC_RSSI_STATE_STAY_MEDIUM)) { 73c6821613SYan-Hsuan Chuang if (bt_rssi >= (rssi_thresh1 + 74d46fa3e4SLarry Finger BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) 75c6821613SYan-Hsuan Chuang bt_rssi_state = BTC_RSSI_STATE_HIGH; 76c6821613SYan-Hsuan Chuang else if (bt_rssi < rssi_thresh) 77c6821613SYan-Hsuan Chuang bt_rssi_state = BTC_RSSI_STATE_LOW; 78d46fa3e4SLarry Finger else 79c6821613SYan-Hsuan Chuang bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM; 80f1d2b4d3SLarry Finger } else { 81c6821613SYan-Hsuan Chuang if (bt_rssi < rssi_thresh1) 82c6821613SYan-Hsuan Chuang bt_rssi_state = BTC_RSSI_STATE_MEDIUM; 83d46fa3e4SLarry Finger else 84c6821613SYan-Hsuan Chuang bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH; 85f1d2b4d3SLarry Finger } 86f1d2b4d3SLarry Finger } 87f1d2b4d3SLarry Finger 88c6821613SYan-Hsuan Chuang coex_sta->pre_bt_rssi_state = bt_rssi_state; 89f1d2b4d3SLarry Finger 90c6821613SYan-Hsuan Chuang return bt_rssi_state; 91f1d2b4d3SLarry Finger } 92f1d2b4d3SLarry Finger 93c6821613SYan-Hsuan Chuang static u8 btc8192e2ant_wifi_rssi_state(struct btc_coexist *btcoexist, 94f1d2b4d3SLarry Finger u8 index, u8 level_num, u8 rssi_thresh, 95f1d2b4d3SLarry Finger u8 rssi_thresh1) 96f1d2b4d3SLarry Finger { 97d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 98c6821613SYan-Hsuan Chuang int wifi_rssi = 0; 99c6821613SYan-Hsuan Chuang u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index]; 100f1d2b4d3SLarry Finger 101c6821613SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi); 102f1d2b4d3SLarry Finger 103f1d2b4d3SLarry Finger if (level_num == 2) { 104f1d2b4d3SLarry Finger if ((coex_sta->pre_wifi_rssi_state[index] == 105f1d2b4d3SLarry Finger BTC_RSSI_STATE_LOW) || 106f1d2b4d3SLarry Finger (coex_sta->pre_wifi_rssi_state[index] == 107f1d2b4d3SLarry Finger BTC_RSSI_STATE_STAY_LOW)) { 108c6821613SYan-Hsuan Chuang if (wifi_rssi >= 109c6821613SYan-Hsuan Chuang (rssi_thresh + BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) 110c6821613SYan-Hsuan Chuang wifi_rssi_state = BTC_RSSI_STATE_HIGH; 111d46fa3e4SLarry Finger else 112c6821613SYan-Hsuan Chuang wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW; 113f1d2b4d3SLarry Finger } else { 114c6821613SYan-Hsuan Chuang if (wifi_rssi < rssi_thresh) 115c6821613SYan-Hsuan Chuang wifi_rssi_state = BTC_RSSI_STATE_LOW; 116d46fa3e4SLarry Finger else 117c6821613SYan-Hsuan Chuang wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH; 118f1d2b4d3SLarry Finger } 119f1d2b4d3SLarry Finger } else if (level_num == 3) { 120f1d2b4d3SLarry Finger if (rssi_thresh > rssi_thresh1) { 121d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 122d46fa3e4SLarry Finger "[BTCoex], wifi RSSI thresh error!!\n"); 123f1d2b4d3SLarry Finger return coex_sta->pre_wifi_rssi_state[index]; 124f1d2b4d3SLarry Finger } 125f1d2b4d3SLarry Finger 126f1d2b4d3SLarry Finger if ((coex_sta->pre_wifi_rssi_state[index] == 127f1d2b4d3SLarry Finger BTC_RSSI_STATE_LOW) || 128f1d2b4d3SLarry Finger (coex_sta->pre_wifi_rssi_state[index] == 129f1d2b4d3SLarry Finger BTC_RSSI_STATE_STAY_LOW)) { 130c6821613SYan-Hsuan Chuang if (wifi_rssi >= 131c6821613SYan-Hsuan Chuang (rssi_thresh + BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) 132c6821613SYan-Hsuan Chuang wifi_rssi_state = BTC_RSSI_STATE_MEDIUM; 133d46fa3e4SLarry Finger else 134c6821613SYan-Hsuan Chuang wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW; 135f1d2b4d3SLarry Finger } else if ((coex_sta->pre_wifi_rssi_state[index] == 136f1d2b4d3SLarry Finger BTC_RSSI_STATE_MEDIUM) || 137f1d2b4d3SLarry Finger (coex_sta->pre_wifi_rssi_state[index] == 138f1d2b4d3SLarry Finger BTC_RSSI_STATE_STAY_MEDIUM)) { 139c6821613SYan-Hsuan Chuang if (wifi_rssi >= (rssi_thresh1 + 140d46fa3e4SLarry Finger BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT)) 141c6821613SYan-Hsuan Chuang wifi_rssi_state = BTC_RSSI_STATE_HIGH; 142c6821613SYan-Hsuan Chuang else if (wifi_rssi < rssi_thresh) 143c6821613SYan-Hsuan Chuang wifi_rssi_state = BTC_RSSI_STATE_LOW; 144d46fa3e4SLarry Finger else 145c6821613SYan-Hsuan Chuang wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM; 146f1d2b4d3SLarry Finger } else { 147c6821613SYan-Hsuan Chuang if (wifi_rssi < rssi_thresh1) 148c6821613SYan-Hsuan Chuang wifi_rssi_state = BTC_RSSI_STATE_MEDIUM; 149d46fa3e4SLarry Finger else 150c6821613SYan-Hsuan Chuang wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH; 151f1d2b4d3SLarry Finger } 152f1d2b4d3SLarry Finger } 153f1d2b4d3SLarry Finger 154c6821613SYan-Hsuan Chuang coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state; 155f1d2b4d3SLarry Finger 156c6821613SYan-Hsuan Chuang return wifi_rssi_state; 157f1d2b4d3SLarry Finger } 158f1d2b4d3SLarry Finger 159c6821613SYan-Hsuan Chuang static void btc8192e2ant_monitor_bt_enable_disable(struct btc_coexist 160c6821613SYan-Hsuan Chuang *btcoexist) 161f1d2b4d3SLarry Finger { 162d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 163f1d2b4d3SLarry Finger static bool pre_bt_disabled; 164f1d2b4d3SLarry Finger static u32 bt_disable_cnt; 165f1d2b4d3SLarry Finger bool bt_active = true, bt_disabled = false; 166f1d2b4d3SLarry Finger 167f1d2b4d3SLarry Finger /* This function check if bt is disabled */ 168f1d2b4d3SLarry Finger 169f1d2b4d3SLarry Finger if (coex_sta->high_priority_tx == 0 && 170f1d2b4d3SLarry Finger coex_sta->high_priority_rx == 0 && 171f1d2b4d3SLarry Finger coex_sta->low_priority_tx == 0 && 172f1d2b4d3SLarry Finger coex_sta->low_priority_rx == 0) 173f1d2b4d3SLarry Finger bt_active = false; 174f1d2b4d3SLarry Finger 175f1d2b4d3SLarry Finger if (coex_sta->high_priority_tx == 0xffff && 176f1d2b4d3SLarry Finger coex_sta->high_priority_rx == 0xffff && 177f1d2b4d3SLarry Finger coex_sta->low_priority_tx == 0xffff && 178f1d2b4d3SLarry Finger coex_sta->low_priority_rx == 0xffff) 179f1d2b4d3SLarry Finger bt_active = false; 180f1d2b4d3SLarry Finger 181f1d2b4d3SLarry Finger if (bt_active) { 182f1d2b4d3SLarry Finger bt_disable_cnt = 0; 183f1d2b4d3SLarry Finger bt_disabled = false; 184f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE, 185f1d2b4d3SLarry Finger &bt_disabled); 186d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 187f1d2b4d3SLarry Finger "[BTCoex], BT is enabled !!\n"); 188f1d2b4d3SLarry Finger } else { 189f1d2b4d3SLarry Finger bt_disable_cnt++; 190d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 191f1d2b4d3SLarry Finger "[BTCoex], bt all counters = 0, %d times!!\n", 192f1d2b4d3SLarry Finger bt_disable_cnt); 193f1d2b4d3SLarry Finger if (bt_disable_cnt >= 2) { 194f1d2b4d3SLarry Finger bt_disabled = true; 195f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE, 196f1d2b4d3SLarry Finger &bt_disabled); 197d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 198f1d2b4d3SLarry Finger "[BTCoex], BT is disabled !!\n"); 199f1d2b4d3SLarry Finger } 200f1d2b4d3SLarry Finger } 201f1d2b4d3SLarry Finger if (pre_bt_disabled != bt_disabled) { 202d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 203f1d2b4d3SLarry Finger "[BTCoex], BT is from %s to %s!!\n", 204f1d2b4d3SLarry Finger (pre_bt_disabled ? "disabled" : "enabled"), 205f1d2b4d3SLarry Finger (bt_disabled ? "disabled" : "enabled")); 206f1d2b4d3SLarry Finger pre_bt_disabled = bt_disabled; 207f1d2b4d3SLarry Finger } 208f1d2b4d3SLarry Finger } 209f1d2b4d3SLarry Finger 210c6821613SYan-Hsuan Chuang static u32 btc8192e2ant_decide_ra_mask(struct btc_coexist *btcoexist, 211c6821613SYan-Hsuan Chuang u8 ss_type, u32 ra_mask_type) 212f1d2b4d3SLarry Finger { 213c6821613SYan-Hsuan Chuang u32 dis_ra_mask = 0x0; 214f1d2b4d3SLarry Finger 215c6821613SYan-Hsuan Chuang switch (ra_mask_type) { 216f1d2b4d3SLarry Finger case 0: /* normal mode */ 217c6821613SYan-Hsuan Chuang if (ss_type == 2) 218c6821613SYan-Hsuan Chuang dis_ra_mask = 0x0; /* enable 2ss */ 219f1d2b4d3SLarry Finger else 220c6821613SYan-Hsuan Chuang dis_ra_mask = 0xfff00000; /* disable 2ss */ 221f1d2b4d3SLarry Finger break; 222f1d2b4d3SLarry Finger case 1: /* disable cck 1/2 */ 223c6821613SYan-Hsuan Chuang if (ss_type == 2) 224c6821613SYan-Hsuan Chuang dis_ra_mask = 0x00000003; /* enable 2ss */ 225f1d2b4d3SLarry Finger else 226c6821613SYan-Hsuan Chuang dis_ra_mask = 0xfff00003; /* disable 2ss */ 227f1d2b4d3SLarry Finger break; 228f1d2b4d3SLarry Finger case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */ 229c6821613SYan-Hsuan Chuang if (ss_type == 2) 230c6821613SYan-Hsuan Chuang dis_ra_mask = 0x0001f1f7; /* enable 2ss */ 231f1d2b4d3SLarry Finger else 232c6821613SYan-Hsuan Chuang dis_ra_mask = 0xfff1f1f7; /* disable 2ss */ 233f1d2b4d3SLarry Finger break; 234f1d2b4d3SLarry Finger default: 235f1d2b4d3SLarry Finger break; 236f1d2b4d3SLarry Finger } 237f1d2b4d3SLarry Finger 238c6821613SYan-Hsuan Chuang return dis_ra_mask; 239f1d2b4d3SLarry Finger } 240f1d2b4d3SLarry Finger 241c6821613SYan-Hsuan Chuang static void btc8192e2ant_update_ra_mask(struct btc_coexist *btcoexist, 242c6821613SYan-Hsuan Chuang bool force_exec, u32 dis_rate_mask) 243f1d2b4d3SLarry Finger { 244c6821613SYan-Hsuan Chuang coex_dm->cur_ra_mask = dis_rate_mask; 245f1d2b4d3SLarry Finger 246c6821613SYan-Hsuan Chuang if (force_exec || (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask)) 247c6821613SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK, 248c6821613SYan-Hsuan Chuang &coex_dm->cur_ra_mask); 249c6821613SYan-Hsuan Chuang coex_dm->pre_ra_mask = coex_dm->cur_ra_mask; 250f1d2b4d3SLarry Finger } 251f1d2b4d3SLarry Finger 252c6821613SYan-Hsuan Chuang static void btc8192e2ant_auto_rate_fallback_retry(struct btc_coexist *btcoexist, 253f1d2b4d3SLarry Finger bool force_exec, u8 type) 254f1d2b4d3SLarry Finger { 255c6821613SYan-Hsuan Chuang bool wifi_under_b_mode = false; 256f1d2b4d3SLarry Finger 257c6821613SYan-Hsuan Chuang coex_dm->cur_arfr_type = type; 258f1d2b4d3SLarry Finger 259c6821613SYan-Hsuan Chuang if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) { 260c6821613SYan-Hsuan Chuang switch (coex_dm->cur_arfr_type) { 261f1d2b4d3SLarry Finger case 0: /* normal mode */ 262f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x430, 263f1d2b4d3SLarry Finger coex_dm->backup_arfr_cnt1); 264f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x434, 265f1d2b4d3SLarry Finger coex_dm->backup_arfr_cnt2); 266f1d2b4d3SLarry Finger break; 267f1d2b4d3SLarry Finger case 1: 268f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, 269f1d2b4d3SLarry Finger BTC_GET_BL_WIFI_UNDER_B_MODE, 270c6821613SYan-Hsuan Chuang &wifi_under_b_mode); 271c6821613SYan-Hsuan Chuang if (wifi_under_b_mode) { 272f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x430, 273f1d2b4d3SLarry Finger 0x0); 274f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x434, 275f1d2b4d3SLarry Finger 0x01010101); 276f1d2b4d3SLarry Finger } else { 277f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x430, 278f1d2b4d3SLarry Finger 0x0); 279f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x434, 280f1d2b4d3SLarry Finger 0x04030201); 281f1d2b4d3SLarry Finger } 282f1d2b4d3SLarry Finger break; 283f1d2b4d3SLarry Finger default: 284f1d2b4d3SLarry Finger break; 285f1d2b4d3SLarry Finger } 286f1d2b4d3SLarry Finger } 287f1d2b4d3SLarry Finger 288c6821613SYan-Hsuan Chuang coex_dm->pre_arfr_type = coex_dm->cur_arfr_type; 289f1d2b4d3SLarry Finger } 290f1d2b4d3SLarry Finger 291c6821613SYan-Hsuan Chuang static void btc8192e2ant_retry_limit(struct btc_coexist *btcoexist, 292f1d2b4d3SLarry Finger bool force_exec, u8 type) 293f1d2b4d3SLarry Finger { 294c6821613SYan-Hsuan Chuang coex_dm->cur_retry_limit_type = type; 295f1d2b4d3SLarry Finger 296c6821613SYan-Hsuan Chuang if (force_exec || (coex_dm->pre_retry_limit_type != 297c6821613SYan-Hsuan Chuang coex_dm->cur_retry_limit_type)) { 298c6821613SYan-Hsuan Chuang switch (coex_dm->cur_retry_limit_type) { 299f1d2b4d3SLarry Finger case 0: /* normal mode */ 300f1d2b4d3SLarry Finger btcoexist->btc_write_2byte(btcoexist, 0x42a, 301c6821613SYan-Hsuan Chuang coex_dm->backup_retry_limit); 302f1d2b4d3SLarry Finger break; 303f1d2b4d3SLarry Finger case 1: /* retry limit = 8 */ 304c6821613SYan-Hsuan Chuang btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808); 305f1d2b4d3SLarry Finger break; 306f1d2b4d3SLarry Finger default: 307f1d2b4d3SLarry Finger break; 308f1d2b4d3SLarry Finger } 309f1d2b4d3SLarry Finger } 310f1d2b4d3SLarry Finger 311c6821613SYan-Hsuan Chuang coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type; 312f1d2b4d3SLarry Finger } 313f1d2b4d3SLarry Finger 314c6821613SYan-Hsuan Chuang static void btc8192e2ant_ampdu_maxtime(struct btc_coexist *btcoexist, 315f1d2b4d3SLarry Finger bool force_exec, u8 type) 316f1d2b4d3SLarry Finger { 317c6821613SYan-Hsuan Chuang coex_dm->cur_ampdu_time_type = type; 318f1d2b4d3SLarry Finger 319c6821613SYan-Hsuan Chuang if (force_exec || (coex_dm->pre_ampdu_time_type != 320c6821613SYan-Hsuan Chuang coex_dm->cur_ampdu_time_type)) { 321c6821613SYan-Hsuan Chuang switch (coex_dm->cur_ampdu_time_type) { 322f1d2b4d3SLarry Finger case 0: /* normal mode */ 323f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x456, 324f1d2b4d3SLarry Finger coex_dm->backup_ampdu_maxtime); 325f1d2b4d3SLarry Finger break; 326c6821613SYan-Hsuan Chuang case 1: /* AMPDU time = 0x38 * 32us */ 327f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38); 328f1d2b4d3SLarry Finger break; 329f1d2b4d3SLarry Finger default: 330f1d2b4d3SLarry Finger break; 331f1d2b4d3SLarry Finger } 332f1d2b4d3SLarry Finger } 333f1d2b4d3SLarry Finger 334c6821613SYan-Hsuan Chuang coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type; 335f1d2b4d3SLarry Finger } 336f1d2b4d3SLarry Finger 337c6821613SYan-Hsuan Chuang static void btc8192e2ant_limited_tx(struct btc_coexist *btcoexist, 338c6821613SYan-Hsuan Chuang bool force_exec, u8 ra_mask_type, 339c6821613SYan-Hsuan Chuang u8 arfr_type, u8 retry_limit_type, 340c6821613SYan-Hsuan Chuang u8 ampdu_time_type) 341f1d2b4d3SLarry Finger { 342c6821613SYan-Hsuan Chuang u32 dis_ra_mask = 0x0; 343f1d2b4d3SLarry Finger 344c6821613SYan-Hsuan Chuang coex_dm->cur_ra_mask_type = ra_mask_type; 345c6821613SYan-Hsuan Chuang dis_ra_mask = 346c6821613SYan-Hsuan Chuang btc8192e2ant_decide_ra_mask(btcoexist, coex_dm->cur_ss_type, 347c6821613SYan-Hsuan Chuang ra_mask_type); 348c6821613SYan-Hsuan Chuang btc8192e2ant_update_ra_mask(btcoexist, force_exec, dis_ra_mask); 349c6821613SYan-Hsuan Chuang btc8192e2ant_auto_rate_fallback_retry(btcoexist, force_exec, arfr_type); 350c6821613SYan-Hsuan Chuang btc8192e2ant_retry_limit(btcoexist, force_exec, retry_limit_type); 351c6821613SYan-Hsuan Chuang btc8192e2ant_ampdu_maxtime(btcoexist, force_exec, ampdu_time_type); 352f1d2b4d3SLarry Finger } 353f1d2b4d3SLarry Finger 354c6821613SYan-Hsuan Chuang static void btc8192e2ant_limited_rx(struct btc_coexist *btcoexist, 355f1d2b4d3SLarry Finger bool force_exec, bool rej_ap_agg_pkt, 356f1d2b4d3SLarry Finger bool bt_ctrl_agg_buf_size, 357f1d2b4d3SLarry Finger u8 agg_buf_size) 358f1d2b4d3SLarry Finger { 359f1d2b4d3SLarry Finger bool reject_rx_agg = rej_ap_agg_pkt; 360f1d2b4d3SLarry Finger bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size; 361f1d2b4d3SLarry Finger u8 rx_agg_size = agg_buf_size; 362f1d2b4d3SLarry Finger 363f1d2b4d3SLarry Finger /********************************************* 364f1d2b4d3SLarry Finger * Rx Aggregation related setting 365f1d2b4d3SLarry Finger *********************************************/ 366f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, 367f1d2b4d3SLarry Finger &reject_rx_agg); 368f1d2b4d3SLarry Finger /* decide BT control aggregation buf size or not */ 369f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, 370f1d2b4d3SLarry Finger &bt_ctrl_rx_agg_size); 371f1d2b4d3SLarry Finger /* aggregation buf size, only work 372f1d2b4d3SLarry Finger * when BT control Rx aggregation size. 373f1d2b4d3SLarry Finger */ 374f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size); 375f1d2b4d3SLarry Finger /* real update aggregation setting */ 376f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL); 377f1d2b4d3SLarry Finger } 378f1d2b4d3SLarry Finger 379c6821613SYan-Hsuan Chuang static void btc8192e2ant_monitor_bt_ctr(struct btc_coexist *btcoexist) 380f1d2b4d3SLarry Finger { 381d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 382f1d2b4d3SLarry Finger u32 reg_hp_txrx, reg_lp_txrx, u32tmp; 383f1d2b4d3SLarry Finger u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0; 384f1d2b4d3SLarry Finger 385f1d2b4d3SLarry Finger reg_hp_txrx = 0x770; 386f1d2b4d3SLarry Finger reg_lp_txrx = 0x774; 387f1d2b4d3SLarry Finger 388f1d2b4d3SLarry Finger u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx); 389f1d2b4d3SLarry Finger reg_hp_tx = u32tmp & MASKLWORD; 390f1d2b4d3SLarry Finger reg_hp_rx = (u32tmp & MASKHWORD) >> 16; 391f1d2b4d3SLarry Finger 392f1d2b4d3SLarry Finger u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx); 393f1d2b4d3SLarry Finger reg_lp_tx = u32tmp & MASKLWORD; 394f1d2b4d3SLarry Finger reg_lp_rx = (u32tmp & MASKHWORD) >> 16; 395f1d2b4d3SLarry Finger 396f1d2b4d3SLarry Finger coex_sta->high_priority_tx = reg_hp_tx; 397f1d2b4d3SLarry Finger coex_sta->high_priority_rx = reg_hp_rx; 398f1d2b4d3SLarry Finger coex_sta->low_priority_tx = reg_lp_tx; 399f1d2b4d3SLarry Finger coex_sta->low_priority_rx = reg_lp_rx; 400f1d2b4d3SLarry Finger 401d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 402f1d2b4d3SLarry Finger "[BTCoex] High Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n", 403f1d2b4d3SLarry Finger reg_hp_txrx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx); 404d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 405f1d2b4d3SLarry Finger "[BTCoex] Low Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n", 406f1d2b4d3SLarry Finger reg_lp_txrx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx); 407f1d2b4d3SLarry Finger 408f1d2b4d3SLarry Finger /* reset counter */ 409f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc); 410f1d2b4d3SLarry Finger } 411f1d2b4d3SLarry Finger 412c6821613SYan-Hsuan Chuang static void btc8192e2ant_query_bt_info(struct btc_coexist *btcoexist) 413f1d2b4d3SLarry Finger { 414d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 415f1d2b4d3SLarry Finger u8 h2c_parameter[1] = {0}; 416f1d2b4d3SLarry Finger 417f1d2b4d3SLarry Finger coex_sta->c2h_bt_info_req_sent = true; 418f1d2b4d3SLarry Finger 419f1d2b4d3SLarry Finger h2c_parameter[0] |= BIT0; /* trigger */ 420f1d2b4d3SLarry Finger 421d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 422f1d2b4d3SLarry Finger "[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n", 423f1d2b4d3SLarry Finger h2c_parameter[0]); 424f1d2b4d3SLarry Finger 425f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter); 426f1d2b4d3SLarry Finger } 427f1d2b4d3SLarry Finger 428436e9c1bSLarry Finger static 429436e9c1bSLarry Finger bool btc8192e2ant_is_wifi_status_changed(struct btc_coexist *btcoexist) 430436e9c1bSLarry Finger { 431436e9c1bSLarry Finger static bool pre_wifi_busy = false, pre_under_4way = false, 432436e9c1bSLarry Finger pre_bt_hs_on = false; 433436e9c1bSLarry Finger bool wifi_busy = false, under_4way = false, bt_hs_on = false; 434436e9c1bSLarry Finger bool wifi_connected = false; 435436e9c1bSLarry Finger 436436e9c1bSLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, 437436e9c1bSLarry Finger &wifi_connected); 438436e9c1bSLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); 439436e9c1bSLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); 440436e9c1bSLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, 441436e9c1bSLarry Finger &under_4way); 442436e9c1bSLarry Finger 443436e9c1bSLarry Finger if (wifi_connected) { 444436e9c1bSLarry Finger if (wifi_busy != pre_wifi_busy) { 445436e9c1bSLarry Finger pre_wifi_busy = wifi_busy; 446436e9c1bSLarry Finger return true; 447436e9c1bSLarry Finger } 448436e9c1bSLarry Finger if (under_4way != pre_under_4way) { 449436e9c1bSLarry Finger pre_under_4way = under_4way; 450436e9c1bSLarry Finger return true; 451436e9c1bSLarry Finger } 452436e9c1bSLarry Finger if (bt_hs_on != pre_bt_hs_on) { 453436e9c1bSLarry Finger pre_bt_hs_on = bt_hs_on; 454436e9c1bSLarry Finger return true; 455436e9c1bSLarry Finger } 456436e9c1bSLarry Finger } 457436e9c1bSLarry Finger 458436e9c1bSLarry Finger return false; 459436e9c1bSLarry Finger } 460436e9c1bSLarry Finger 461c6821613SYan-Hsuan Chuang static void btc8192e2ant_update_bt_link_info(struct btc_coexist *btcoexist) 462f1d2b4d3SLarry Finger { 463f1d2b4d3SLarry Finger struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; 464c6821613SYan-Hsuan Chuang bool bt_hs_on = false; 465f1d2b4d3SLarry Finger 466c6821613SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); 467f1d2b4d3SLarry Finger 468f1d2b4d3SLarry Finger bt_link_info->bt_link_exist = coex_sta->bt_link_exist; 469f1d2b4d3SLarry Finger bt_link_info->sco_exist = coex_sta->sco_exist; 470f1d2b4d3SLarry Finger bt_link_info->a2dp_exist = coex_sta->a2dp_exist; 471f1d2b4d3SLarry Finger bt_link_info->pan_exist = coex_sta->pan_exist; 472f1d2b4d3SLarry Finger bt_link_info->hid_exist = coex_sta->hid_exist; 473f1d2b4d3SLarry Finger 474f1d2b4d3SLarry Finger /* work around for HS mode. */ 475c6821613SYan-Hsuan Chuang if (bt_hs_on) { 476f1d2b4d3SLarry Finger bt_link_info->pan_exist = true; 477f1d2b4d3SLarry Finger bt_link_info->bt_link_exist = true; 478f1d2b4d3SLarry Finger } 479f1d2b4d3SLarry Finger 480f1d2b4d3SLarry Finger /* check if Sco only */ 481f1d2b4d3SLarry Finger if (bt_link_info->sco_exist && 482f1d2b4d3SLarry Finger !bt_link_info->a2dp_exist && 483f1d2b4d3SLarry Finger !bt_link_info->pan_exist && 484f1d2b4d3SLarry Finger !bt_link_info->hid_exist) 485f1d2b4d3SLarry Finger bt_link_info->sco_only = true; 486f1d2b4d3SLarry Finger else 487f1d2b4d3SLarry Finger bt_link_info->sco_only = false; 488f1d2b4d3SLarry Finger 489f1d2b4d3SLarry Finger /* check if A2dp only */ 490f1d2b4d3SLarry Finger if (!bt_link_info->sco_exist && 491f1d2b4d3SLarry Finger bt_link_info->a2dp_exist && 492f1d2b4d3SLarry Finger !bt_link_info->pan_exist && 493f1d2b4d3SLarry Finger !bt_link_info->hid_exist) 494f1d2b4d3SLarry Finger bt_link_info->a2dp_only = true; 495f1d2b4d3SLarry Finger else 496f1d2b4d3SLarry Finger bt_link_info->a2dp_only = false; 497f1d2b4d3SLarry Finger 498f1d2b4d3SLarry Finger /* check if Pan only */ 499f1d2b4d3SLarry Finger if (!bt_link_info->sco_exist && 500f1d2b4d3SLarry Finger !bt_link_info->a2dp_exist && 501f1d2b4d3SLarry Finger bt_link_info->pan_exist && 502f1d2b4d3SLarry Finger !bt_link_info->hid_exist) 503f1d2b4d3SLarry Finger bt_link_info->pan_only = true; 504f1d2b4d3SLarry Finger else 505f1d2b4d3SLarry Finger bt_link_info->pan_only = false; 506f1d2b4d3SLarry Finger 507f1d2b4d3SLarry Finger /* check if Hid only */ 508f1d2b4d3SLarry Finger if (!bt_link_info->sco_exist && 509f1d2b4d3SLarry Finger !bt_link_info->a2dp_exist && 510f1d2b4d3SLarry Finger !bt_link_info->pan_exist && 511f1d2b4d3SLarry Finger bt_link_info->hid_exist) 512f1d2b4d3SLarry Finger bt_link_info->hid_only = true; 513f1d2b4d3SLarry Finger else 514f1d2b4d3SLarry Finger bt_link_info->hid_only = false; 515f1d2b4d3SLarry Finger } 516f1d2b4d3SLarry Finger 517c6821613SYan-Hsuan Chuang static u8 btc8192e2ant_action_algorithm(struct btc_coexist *btcoexist) 518f1d2b4d3SLarry Finger { 519d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 520f1d2b4d3SLarry Finger struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; 521f1d2b4d3SLarry Finger struct btc_stack_info *stack_info = &btcoexist->stack_info; 522c6821613SYan-Hsuan Chuang bool bt_hs_on = false; 523f1d2b4d3SLarry Finger u8 algorithm = BT_8192E_2ANT_COEX_ALGO_UNDEFINED; 524c6821613SYan-Hsuan Chuang u8 num_of_diff_profile = 0; 525f1d2b4d3SLarry Finger 526c6821613SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); 527f1d2b4d3SLarry Finger 528f1d2b4d3SLarry Finger if (!bt_link_info->bt_link_exist) { 529d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 530f1d2b4d3SLarry Finger "No BT link exists!!!\n"); 531f1d2b4d3SLarry Finger return algorithm; 532f1d2b4d3SLarry Finger } 533f1d2b4d3SLarry Finger 534f1d2b4d3SLarry Finger if (bt_link_info->sco_exist) 535c6821613SYan-Hsuan Chuang num_of_diff_profile++; 536f1d2b4d3SLarry Finger if (bt_link_info->hid_exist) 537c6821613SYan-Hsuan Chuang num_of_diff_profile++; 538f1d2b4d3SLarry Finger if (bt_link_info->pan_exist) 539c6821613SYan-Hsuan Chuang num_of_diff_profile++; 540f1d2b4d3SLarry Finger if (bt_link_info->a2dp_exist) 541c6821613SYan-Hsuan Chuang num_of_diff_profile++; 542f1d2b4d3SLarry Finger 543c6821613SYan-Hsuan Chuang if (num_of_diff_profile == 1) { 544f1d2b4d3SLarry Finger if (bt_link_info->sco_exist) { 545d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 546f1d2b4d3SLarry Finger "SCO only\n"); 547f1d2b4d3SLarry Finger algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; 548f1d2b4d3SLarry Finger } else { 549f1d2b4d3SLarry Finger if (bt_link_info->hid_exist) { 550d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 551f1d2b4d3SLarry Finger "HID only\n"); 552f1d2b4d3SLarry Finger algorithm = BT_8192E_2ANT_COEX_ALGO_HID; 553f1d2b4d3SLarry Finger } else if (bt_link_info->a2dp_exist) { 554d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 555f1d2b4d3SLarry Finger "A2DP only\n"); 556f1d2b4d3SLarry Finger algorithm = BT_8192E_2ANT_COEX_ALGO_A2DP; 557f1d2b4d3SLarry Finger } else if (bt_link_info->pan_exist) { 558c6821613SYan-Hsuan Chuang if (bt_hs_on) { 559d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 560d46fa3e4SLarry Finger DBG_LOUD, 561f1d2b4d3SLarry Finger "PAN(HS) only\n"); 562f1d2b4d3SLarry Finger algorithm = 563f1d2b4d3SLarry Finger BT_8192E_2ANT_COEX_ALGO_PANHS; 564f1d2b4d3SLarry Finger } else { 565d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 566d46fa3e4SLarry Finger DBG_LOUD, 567f1d2b4d3SLarry Finger "PAN(EDR) only\n"); 568f1d2b4d3SLarry Finger algorithm = 569f1d2b4d3SLarry Finger BT_8192E_2ANT_COEX_ALGO_PANEDR; 570f1d2b4d3SLarry Finger } 571f1d2b4d3SLarry Finger } 572f1d2b4d3SLarry Finger } 573c6821613SYan-Hsuan Chuang } else if (num_of_diff_profile == 2) { 574f1d2b4d3SLarry Finger if (bt_link_info->sco_exist) { 575f1d2b4d3SLarry Finger if (bt_link_info->hid_exist) { 576d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 577f1d2b4d3SLarry Finger "SCO + HID\n"); 578f1d2b4d3SLarry Finger algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; 579f1d2b4d3SLarry Finger } else if (bt_link_info->a2dp_exist) { 580d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 581f1d2b4d3SLarry Finger "SCO + A2DP ==> SCO\n"); 582f1d2b4d3SLarry Finger algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; 583f1d2b4d3SLarry Finger } else if (bt_link_info->pan_exist) { 584c6821613SYan-Hsuan Chuang if (bt_hs_on) { 585d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 586d46fa3e4SLarry Finger DBG_LOUD, 587f1d2b4d3SLarry Finger "SCO + PAN(HS)\n"); 588f1d2b4d3SLarry Finger algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; 589f1d2b4d3SLarry Finger } else { 590d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 591d46fa3e4SLarry Finger DBG_LOUD, 592f1d2b4d3SLarry Finger "SCO + PAN(EDR)\n"); 593f1d2b4d3SLarry Finger algorithm = 594f1d2b4d3SLarry Finger BT_8192E_2ANT_COEX_ALGO_SCO_PAN; 595f1d2b4d3SLarry Finger } 596f1d2b4d3SLarry Finger } 597f1d2b4d3SLarry Finger } else { 598f1d2b4d3SLarry Finger if (bt_link_info->hid_exist && 599f1d2b4d3SLarry Finger bt_link_info->a2dp_exist) { 600f1d2b4d3SLarry Finger if (stack_info->num_of_hid >= 2) { 601d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 602d46fa3e4SLarry Finger DBG_LOUD, 603f1d2b4d3SLarry Finger "HID*2 + A2DP\n"); 604f1d2b4d3SLarry Finger algorithm = 605f1d2b4d3SLarry Finger BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR; 606f1d2b4d3SLarry Finger } else { 607d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 608d46fa3e4SLarry Finger DBG_LOUD, 609f1d2b4d3SLarry Finger "HID + A2DP\n"); 610f1d2b4d3SLarry Finger algorithm = 611f1d2b4d3SLarry Finger BT_8192E_2ANT_COEX_ALGO_HID_A2DP; 612f1d2b4d3SLarry Finger } 613f1d2b4d3SLarry Finger } else if (bt_link_info->hid_exist && 614f1d2b4d3SLarry Finger bt_link_info->pan_exist) { 615c6821613SYan-Hsuan Chuang if (bt_hs_on) { 616d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 617d46fa3e4SLarry Finger DBG_LOUD, 618f1d2b4d3SLarry Finger "HID + PAN(HS)\n"); 619f1d2b4d3SLarry Finger algorithm = BT_8192E_2ANT_COEX_ALGO_HID; 620f1d2b4d3SLarry Finger } else { 621d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 622d46fa3e4SLarry Finger DBG_LOUD, 623f1d2b4d3SLarry Finger "HID + PAN(EDR)\n"); 624f1d2b4d3SLarry Finger algorithm = 625f1d2b4d3SLarry Finger BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; 626f1d2b4d3SLarry Finger } 627f1d2b4d3SLarry Finger } else if (bt_link_info->pan_exist && 628f1d2b4d3SLarry Finger bt_link_info->a2dp_exist) { 629c6821613SYan-Hsuan Chuang if (bt_hs_on) { 630d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 631d46fa3e4SLarry Finger DBG_LOUD, 632f1d2b4d3SLarry Finger "A2DP + PAN(HS)\n"); 633f1d2b4d3SLarry Finger algorithm = 634f1d2b4d3SLarry Finger BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS; 635f1d2b4d3SLarry Finger } else { 636d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 637d46fa3e4SLarry Finger DBG_LOUD, 638f1d2b4d3SLarry Finger "A2DP + PAN(EDR)\n"); 639f1d2b4d3SLarry Finger algorithm = 640f1d2b4d3SLarry Finger BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP; 641f1d2b4d3SLarry Finger } 642f1d2b4d3SLarry Finger } 643f1d2b4d3SLarry Finger } 644c6821613SYan-Hsuan Chuang } else if (num_of_diff_profile == 3) { 645f1d2b4d3SLarry Finger if (bt_link_info->sco_exist) { 646f1d2b4d3SLarry Finger if (bt_link_info->hid_exist && 647f1d2b4d3SLarry Finger bt_link_info->a2dp_exist) { 648d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 649f1d2b4d3SLarry Finger "SCO + HID + A2DP ==> HID\n"); 650f1d2b4d3SLarry Finger algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; 651f1d2b4d3SLarry Finger } else if (bt_link_info->hid_exist && 652f1d2b4d3SLarry Finger bt_link_info->pan_exist) { 653c6821613SYan-Hsuan Chuang if (bt_hs_on) { 654d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 655d46fa3e4SLarry Finger DBG_LOUD, 656f1d2b4d3SLarry Finger "SCO + HID + PAN(HS)\n"); 657f1d2b4d3SLarry Finger algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; 658f1d2b4d3SLarry Finger } else { 659d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 660d46fa3e4SLarry Finger DBG_LOUD, 661f1d2b4d3SLarry Finger "SCO + HID + PAN(EDR)\n"); 662f1d2b4d3SLarry Finger algorithm = 663f1d2b4d3SLarry Finger BT_8192E_2ANT_COEX_ALGO_SCO_PAN; 664f1d2b4d3SLarry Finger } 665f1d2b4d3SLarry Finger } else if (bt_link_info->pan_exist && 666f1d2b4d3SLarry Finger bt_link_info->a2dp_exist) { 667c6821613SYan-Hsuan Chuang if (bt_hs_on) { 668d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 669d46fa3e4SLarry Finger DBG_LOUD, 670f1d2b4d3SLarry Finger "SCO + A2DP + PAN(HS)\n"); 671f1d2b4d3SLarry Finger algorithm = BT_8192E_2ANT_COEX_ALGO_SCO; 672f1d2b4d3SLarry Finger } else { 673d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 674d46fa3e4SLarry Finger DBG_LOUD, 675f1d2b4d3SLarry Finger "SCO + A2DP + PAN(EDR)\n"); 676f1d2b4d3SLarry Finger algorithm = 677f1d2b4d3SLarry Finger BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; 678f1d2b4d3SLarry Finger } 679f1d2b4d3SLarry Finger } 680f1d2b4d3SLarry Finger } else { 681f1d2b4d3SLarry Finger if (bt_link_info->hid_exist && 682f1d2b4d3SLarry Finger bt_link_info->pan_exist && 683f1d2b4d3SLarry Finger bt_link_info->a2dp_exist) { 684c6821613SYan-Hsuan Chuang if (bt_hs_on) { 685d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 686d46fa3e4SLarry Finger DBG_LOUD, 687f1d2b4d3SLarry Finger "HID + A2DP + PAN(HS)\n"); 688f1d2b4d3SLarry Finger algorithm = 689f1d2b4d3SLarry Finger BT_8192E_2ANT_COEX_ALGO_HID_A2DP; 690f1d2b4d3SLarry Finger } else { 691d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 692d46fa3e4SLarry Finger DBG_LOUD, 693f1d2b4d3SLarry Finger "HID + A2DP + PAN(EDR)\n"); 694f1d2b4d3SLarry Finger algorithm = 695f1d2b4d3SLarry Finger BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR; 696f1d2b4d3SLarry Finger } 697f1d2b4d3SLarry Finger } 698f1d2b4d3SLarry Finger } 699c6821613SYan-Hsuan Chuang } else if (num_of_diff_profile >= 3) { 700f1d2b4d3SLarry Finger if (bt_link_info->sco_exist) { 701f1d2b4d3SLarry Finger if (bt_link_info->hid_exist && 702f1d2b4d3SLarry Finger bt_link_info->pan_exist && 703f1d2b4d3SLarry Finger bt_link_info->a2dp_exist) { 704c6821613SYan-Hsuan Chuang if (bt_hs_on) { 705d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 706d46fa3e4SLarry Finger DBG_LOUD, 707f1d2b4d3SLarry Finger "ErrorSCO+HID+A2DP+PAN(HS)\n"); 708f1d2b4d3SLarry Finger 709f1d2b4d3SLarry Finger } else { 710d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, 711d46fa3e4SLarry Finger DBG_LOUD, 712f1d2b4d3SLarry Finger "SCO+HID+A2DP+PAN(EDR)\n"); 713f1d2b4d3SLarry Finger algorithm = 714f1d2b4d3SLarry Finger BT_8192E_2ANT_COEX_ALGO_PANEDR_HID; 715f1d2b4d3SLarry Finger } 716f1d2b4d3SLarry Finger } 717f1d2b4d3SLarry Finger } 718f1d2b4d3SLarry Finger } 719f1d2b4d3SLarry Finger 720f1d2b4d3SLarry Finger return algorithm; 721f1d2b4d3SLarry Finger } 722f1d2b4d3SLarry Finger 723c6821613SYan-Hsuan Chuang static void btc8192e2ant_set_fw_dac_swing_level(struct btc_coexist *btcoexist, 724c6821613SYan-Hsuan Chuang u8 dac_swing_lvl) 725f1d2b4d3SLarry Finger { 726d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 727f1d2b4d3SLarry Finger u8 h2c_parameter[1] = {0}; 728f1d2b4d3SLarry Finger 729f1d2b4d3SLarry Finger /* There are several type of dacswing 730f1d2b4d3SLarry Finger * 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 731f1d2b4d3SLarry Finger */ 732c6821613SYan-Hsuan Chuang h2c_parameter[0] = dac_swing_lvl; 733f1d2b4d3SLarry Finger 734d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 735c6821613SYan-Hsuan Chuang "[BTCoex], Set Dac Swing Level = 0x%x\n", dac_swing_lvl); 736d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 737f1d2b4d3SLarry Finger "[BTCoex], FW write 0x64 = 0x%x\n", h2c_parameter[0]); 738f1d2b4d3SLarry Finger 739f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter); 740f1d2b4d3SLarry Finger } 741f1d2b4d3SLarry Finger 742c6821613SYan-Hsuan Chuang static void btc8192e2ant_set_fw_dec_bt_pwr(struct btc_coexist *btcoexist, 743c6821613SYan-Hsuan Chuang u8 dec_bt_pwr_lvl) 744f1d2b4d3SLarry Finger { 745d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 746f1d2b4d3SLarry Finger u8 h2c_parameter[1] = {0}; 747f1d2b4d3SLarry Finger 748c6821613SYan-Hsuan Chuang h2c_parameter[0] = dec_bt_pwr_lvl; 749f1d2b4d3SLarry Finger 750d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 751f1d2b4d3SLarry Finger "[BTCoex] decrease Bt Power level = %d, FW write 0x62 = 0x%x\n", 752c6821613SYan-Hsuan Chuang dec_bt_pwr_lvl, h2c_parameter[0]); 753f1d2b4d3SLarry Finger 754f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter); 755f1d2b4d3SLarry Finger } 756f1d2b4d3SLarry Finger 757c6821613SYan-Hsuan Chuang static void btc8192e2ant_dec_bt_pwr(struct btc_coexist *btcoexist, 758c6821613SYan-Hsuan Chuang bool force_exec, u8 dec_bt_pwr_lvl) 759f1d2b4d3SLarry Finger { 760d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 761d46fa3e4SLarry Finger 762d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 763f1d2b4d3SLarry Finger "[BTCoex], %s Dec BT power level = %d\n", 764c6821613SYan-Hsuan Chuang force_exec ? "force to" : "", dec_bt_pwr_lvl); 765c6821613SYan-Hsuan Chuang coex_dm->cur_dec_bt_pwr = dec_bt_pwr_lvl; 766f1d2b4d3SLarry Finger 767f1d2b4d3SLarry Finger if (!force_exec) { 768d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 769f1d2b4d3SLarry Finger "[BTCoex], preBtDecPwrLvl=%d, curBtDecPwrLvl=%d\n", 770f1d2b4d3SLarry Finger coex_dm->pre_dec_bt_pwr, coex_dm->cur_dec_bt_pwr); 771f1d2b4d3SLarry Finger } 772c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_dec_bt_pwr(btcoexist, coex_dm->cur_dec_bt_pwr); 773f1d2b4d3SLarry Finger 774f1d2b4d3SLarry Finger coex_dm->pre_dec_bt_pwr = coex_dm->cur_dec_bt_pwr; 775f1d2b4d3SLarry Finger } 776f1d2b4d3SLarry Finger 777c6821613SYan-Hsuan Chuang static void btc8192e2ant_set_bt_auto_report(struct btc_coexist *btcoexist, 778c6821613SYan-Hsuan Chuang bool enable_auto_report) 779f1d2b4d3SLarry Finger { 780d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 781f1d2b4d3SLarry Finger u8 h2c_parameter[1] = {0}; 782f1d2b4d3SLarry Finger 783f1d2b4d3SLarry Finger h2c_parameter[0] = 0; 784f1d2b4d3SLarry Finger 785c6821613SYan-Hsuan Chuang if (enable_auto_report) 786f1d2b4d3SLarry Finger h2c_parameter[0] |= BIT0; 787f1d2b4d3SLarry Finger 788d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 789f1d2b4d3SLarry Finger "[BTCoex], BT FW auto report : %s, FW write 0x68 = 0x%x\n", 790c6821613SYan-Hsuan Chuang (enable_auto_report ? "Enabled!!" : "Disabled!!"), 791f1d2b4d3SLarry Finger h2c_parameter[0]); 792f1d2b4d3SLarry Finger 793f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter); 794f1d2b4d3SLarry Finger } 795f1d2b4d3SLarry Finger 796c6821613SYan-Hsuan Chuang static void btc8192e2ant_bt_auto_report(struct btc_coexist *btcoexist, 797f1d2b4d3SLarry Finger bool force_exec, 798c6821613SYan-Hsuan Chuang bool enable_auto_report) 799f1d2b4d3SLarry Finger { 800d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 801d46fa3e4SLarry Finger 802d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 803f1d2b4d3SLarry Finger "[BTCoex], %s BT Auto report = %s\n", 804f1d2b4d3SLarry Finger (force_exec ? "force to" : ""), 805c6821613SYan-Hsuan Chuang ((enable_auto_report) ? "Enabled" : "Disabled")); 806c6821613SYan-Hsuan Chuang coex_dm->cur_bt_auto_report = enable_auto_report; 807f1d2b4d3SLarry Finger 808f1d2b4d3SLarry Finger if (!force_exec) { 809d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 810f1d2b4d3SLarry Finger "[BTCoex] bPreBtAutoReport=%d, bCurBtAutoReport=%d\n", 811f1d2b4d3SLarry Finger coex_dm->pre_bt_auto_report, 812f1d2b4d3SLarry Finger coex_dm->cur_bt_auto_report); 813f1d2b4d3SLarry Finger 814f1d2b4d3SLarry Finger if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report) 815f1d2b4d3SLarry Finger return; 816f1d2b4d3SLarry Finger } 817c6821613SYan-Hsuan Chuang btc8192e2ant_set_bt_auto_report(btcoexist, 818f1d2b4d3SLarry Finger coex_dm->cur_bt_auto_report); 819f1d2b4d3SLarry Finger 820f1d2b4d3SLarry Finger coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report; 821f1d2b4d3SLarry Finger } 822f1d2b4d3SLarry Finger 823c6821613SYan-Hsuan Chuang static void btc8192e2ant_fw_dac_swing_lvl(struct btc_coexist *btcoexist, 824c6821613SYan-Hsuan Chuang bool force_exec, u8 fw_dac_swing_lvl) 825f1d2b4d3SLarry Finger { 826d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 827d46fa3e4SLarry Finger 828d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 829f1d2b4d3SLarry Finger "[BTCoex], %s set FW Dac Swing level = %d\n", 830c6821613SYan-Hsuan Chuang (force_exec ? "force to" : ""), fw_dac_swing_lvl); 831c6821613SYan-Hsuan Chuang coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl; 832f1d2b4d3SLarry Finger 833f1d2b4d3SLarry Finger if (!force_exec) { 834d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 835f1d2b4d3SLarry Finger "[BTCoex] preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n", 836f1d2b4d3SLarry Finger coex_dm->pre_fw_dac_swing_lvl, 837f1d2b4d3SLarry Finger coex_dm->cur_fw_dac_swing_lvl); 838f1d2b4d3SLarry Finger 839f1d2b4d3SLarry Finger if (coex_dm->pre_fw_dac_swing_lvl == 840f1d2b4d3SLarry Finger coex_dm->cur_fw_dac_swing_lvl) 841f1d2b4d3SLarry Finger return; 842f1d2b4d3SLarry Finger } 843f1d2b4d3SLarry Finger 844c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_dac_swing_level(btcoexist, 845f1d2b4d3SLarry Finger coex_dm->cur_fw_dac_swing_lvl); 846f1d2b4d3SLarry Finger 847f1d2b4d3SLarry Finger coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl; 848f1d2b4d3SLarry Finger } 849f1d2b4d3SLarry Finger 850f1d2b4d3SLarry Finger static void btc8192e2ant_set_sw_rf_rx_lpf_corner(struct btc_coexist *btcoexist, 851f1d2b4d3SLarry Finger bool rx_rf_shrink_on) 852f1d2b4d3SLarry Finger { 853d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 854d46fa3e4SLarry Finger 855f1d2b4d3SLarry Finger if (rx_rf_shrink_on) { 856f1d2b4d3SLarry Finger /* Shrink RF Rx LPF corner */ 857d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 858f1d2b4d3SLarry Finger "[BTCoex], Shrink RF Rx LPF corner!!\n"); 859f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e, 860f1d2b4d3SLarry Finger 0xfffff, 0xffffc); 861f1d2b4d3SLarry Finger } else { 862f1d2b4d3SLarry Finger /* Resume RF Rx LPF corner 863f1d2b4d3SLarry Finger * After initialized, we can use coex_dm->btRf0x1eBackup 864f1d2b4d3SLarry Finger */ 865f76c3408SColin Ian King if (btcoexist->initialized) { 866d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 867f1d2b4d3SLarry Finger "[BTCoex], Resume RF Rx LPF corner!!\n"); 868f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e, 869f1d2b4d3SLarry Finger 0xfffff, 870f1d2b4d3SLarry Finger coex_dm->bt_rf0x1e_backup); 871f1d2b4d3SLarry Finger } 872f1d2b4d3SLarry Finger } 873f1d2b4d3SLarry Finger } 874f1d2b4d3SLarry Finger 875c6821613SYan-Hsuan Chuang static void btc8192e2ant_rf_shrink(struct btc_coexist *btcoexist, 876f1d2b4d3SLarry Finger bool force_exec, bool rx_rf_shrink_on) 877f1d2b4d3SLarry Finger { 878d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 879d46fa3e4SLarry Finger 880d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 881f1d2b4d3SLarry Finger "[BTCoex], %s turn Rx RF Shrink = %s\n", 882f1d2b4d3SLarry Finger (force_exec ? "force to" : ""), 883f1d2b4d3SLarry Finger ((rx_rf_shrink_on) ? "ON" : "OFF")); 884f1d2b4d3SLarry Finger coex_dm->cur_rf_rx_lpf_shrink = rx_rf_shrink_on; 885f1d2b4d3SLarry Finger 886f1d2b4d3SLarry Finger if (!force_exec) { 887d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 888f1d2b4d3SLarry Finger "[BTCoex]bPreRfRxLpfShrink=%d,bCurRfRxLpfShrink=%d\n", 889f1d2b4d3SLarry Finger coex_dm->pre_rf_rx_lpf_shrink, 890f1d2b4d3SLarry Finger coex_dm->cur_rf_rx_lpf_shrink); 891f1d2b4d3SLarry Finger 892f1d2b4d3SLarry Finger if (coex_dm->pre_rf_rx_lpf_shrink == 893f1d2b4d3SLarry Finger coex_dm->cur_rf_rx_lpf_shrink) 894f1d2b4d3SLarry Finger return; 895f1d2b4d3SLarry Finger } 896f1d2b4d3SLarry Finger btc8192e2ant_set_sw_rf_rx_lpf_corner(btcoexist, 897f1d2b4d3SLarry Finger coex_dm->cur_rf_rx_lpf_shrink); 898f1d2b4d3SLarry Finger 899f1d2b4d3SLarry Finger coex_dm->pre_rf_rx_lpf_shrink = coex_dm->cur_rf_rx_lpf_shrink; 900f1d2b4d3SLarry Finger } 901f1d2b4d3SLarry Finger 902c6821613SYan-Hsuan Chuang static void btc8192e2ant_set_dac_swing_reg(struct btc_coexist *btcoexist, 903f1d2b4d3SLarry Finger u32 level) 904f1d2b4d3SLarry Finger { 905d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 906f1d2b4d3SLarry Finger u8 val = (u8)level; 907f1d2b4d3SLarry Finger 908d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 909f1d2b4d3SLarry Finger "[BTCoex], Write SwDacSwing = 0x%x\n", level); 910f1d2b4d3SLarry Finger btcoexist->btc_write_1byte_bitmask(btcoexist, 0x883, 0x3e, val); 911f1d2b4d3SLarry Finger } 912f1d2b4d3SLarry Finger 913c6821613SYan-Hsuan Chuang static void btc8192e2ant_set_sw_full_swing(struct btc_coexist *btcoexist, 914c6821613SYan-Hsuan Chuang bool sw_dac_swing_on, 915c6821613SYan-Hsuan Chuang u32 sw_dac_swing_lvl) 916f1d2b4d3SLarry Finger { 917c6821613SYan-Hsuan Chuang if (sw_dac_swing_on) 918c6821613SYan-Hsuan Chuang btc8192e2ant_set_dac_swing_reg(btcoexist, sw_dac_swing_lvl); 919f1d2b4d3SLarry Finger else 920c6821613SYan-Hsuan Chuang btc8192e2ant_set_dac_swing_reg(btcoexist, 0x18); 921f1d2b4d3SLarry Finger } 922f1d2b4d3SLarry Finger 923c6821613SYan-Hsuan Chuang static void btc8192e2ant_dac_swing(struct btc_coexist *btcoexist, 924c6821613SYan-Hsuan Chuang bool force_exec, bool dac_swing_on, 925c6821613SYan-Hsuan Chuang u32 dac_swing_lvl) 926f1d2b4d3SLarry Finger { 927d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 928d46fa3e4SLarry Finger 929d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 930c6821613SYan-Hsuan Chuang "[BTCoex], %s turn DacSwing=%s, dac_swing_lvl = 0x%x\n", 931f1d2b4d3SLarry Finger (force_exec ? "force to" : ""), 932c6821613SYan-Hsuan Chuang ((dac_swing_on) ? "ON" : "OFF"), dac_swing_lvl); 933c6821613SYan-Hsuan Chuang coex_dm->cur_dac_swing_on = dac_swing_on; 934c6821613SYan-Hsuan Chuang coex_dm->cur_dac_swing_lvl = dac_swing_lvl; 935f1d2b4d3SLarry Finger 936f1d2b4d3SLarry Finger if (!force_exec) { 937d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 938f1d2b4d3SLarry Finger "[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl = 0x%x, ", 939f1d2b4d3SLarry Finger coex_dm->pre_dac_swing_on, 940f1d2b4d3SLarry Finger coex_dm->pre_dac_swing_lvl); 941d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 942f1d2b4d3SLarry Finger "bCurDacSwingOn=%d, curDacSwingLvl = 0x%x\n", 943f1d2b4d3SLarry Finger coex_dm->cur_dac_swing_on, 944f1d2b4d3SLarry Finger coex_dm->cur_dac_swing_lvl); 945f1d2b4d3SLarry Finger 946f1d2b4d3SLarry Finger if ((coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) && 947f1d2b4d3SLarry Finger (coex_dm->pre_dac_swing_lvl == coex_dm->cur_dac_swing_lvl)) 948f1d2b4d3SLarry Finger return; 949f1d2b4d3SLarry Finger } 950f1d2b4d3SLarry Finger mdelay(30); 951c6821613SYan-Hsuan Chuang btc8192e2ant_set_sw_full_swing(btcoexist, dac_swing_on, dac_swing_lvl); 952f1d2b4d3SLarry Finger 953f1d2b4d3SLarry Finger coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on; 954f1d2b4d3SLarry Finger coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl; 955f1d2b4d3SLarry Finger } 956f1d2b4d3SLarry Finger 957c6821613SYan-Hsuan Chuang static void btc8192e2ant_set_agc_table(struct btc_coexist *btcoexist, 958f1d2b4d3SLarry Finger bool agc_table_en) 959f1d2b4d3SLarry Finger { 960d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 961d46fa3e4SLarry Finger 962f1d2b4d3SLarry Finger /* BB AGC Gain Table */ 963f1d2b4d3SLarry Finger if (agc_table_en) { 964d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 965f1d2b4d3SLarry Finger "[BTCoex], BB Agc Table On!\n"); 966f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x0a1A0001); 967f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x091B0001); 968f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x081C0001); 969f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x071D0001); 970f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x061E0001); 971f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x051F0001); 972f1d2b4d3SLarry Finger } else { 973d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 974f1d2b4d3SLarry Finger "[BTCoex], BB Agc Table Off!\n"); 975f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xaa1A0001); 976f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa91B0001); 977f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa81C0001); 978f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa71D0001); 979f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa61E0001); 980f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa51F0001); 981f1d2b4d3SLarry Finger } 982f1d2b4d3SLarry Finger } 983f1d2b4d3SLarry Finger 984c6821613SYan-Hsuan Chuang static void btc8192e2ant_agc_table(struct btc_coexist *btcoexist, 985f1d2b4d3SLarry Finger bool force_exec, bool agc_table_en) 986f1d2b4d3SLarry Finger { 987d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 988d46fa3e4SLarry Finger 989d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 990f1d2b4d3SLarry Finger "[BTCoex], %s %s Agc Table\n", 991f1d2b4d3SLarry Finger (force_exec ? "force to" : ""), 992f1d2b4d3SLarry Finger ((agc_table_en) ? "Enable" : "Disable")); 993f1d2b4d3SLarry Finger coex_dm->cur_agc_table_en = agc_table_en; 994f1d2b4d3SLarry Finger 995f1d2b4d3SLarry Finger if (!force_exec) { 996d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 997f1d2b4d3SLarry Finger "[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n", 998466414a0SJoe Perches coex_dm->pre_agc_table_en, 999466414a0SJoe Perches coex_dm->cur_agc_table_en); 1000f1d2b4d3SLarry Finger 1001f1d2b4d3SLarry Finger if (coex_dm->pre_agc_table_en == coex_dm->cur_agc_table_en) 1002f1d2b4d3SLarry Finger return; 1003f1d2b4d3SLarry Finger } 1004c6821613SYan-Hsuan Chuang btc8192e2ant_set_agc_table(btcoexist, agc_table_en); 1005f1d2b4d3SLarry Finger 1006f1d2b4d3SLarry Finger coex_dm->pre_agc_table_en = coex_dm->cur_agc_table_en; 1007f1d2b4d3SLarry Finger } 1008f1d2b4d3SLarry Finger 1009c6821613SYan-Hsuan Chuang static void btc8192e2ant_set_coex_table(struct btc_coexist *btcoexist, 1010f1d2b4d3SLarry Finger u32 val0x6c0, u32 val0x6c4, 1011f1d2b4d3SLarry Finger u32 val0x6c8, u8 val0x6cc) 1012f1d2b4d3SLarry Finger { 1013d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 1014d46fa3e4SLarry Finger 1015d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1016f1d2b4d3SLarry Finger "[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0); 1017f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0); 1018f1d2b4d3SLarry Finger 1019d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1020f1d2b4d3SLarry Finger "[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4); 1021f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4); 1022f1d2b4d3SLarry Finger 1023d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1024f1d2b4d3SLarry Finger "[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8); 1025f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8); 1026f1d2b4d3SLarry Finger 1027d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1028f1d2b4d3SLarry Finger "[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc); 1029f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc); 1030f1d2b4d3SLarry Finger } 1031f1d2b4d3SLarry Finger 1032c6821613SYan-Hsuan Chuang static void btc8192e2ant_coex_table(struct btc_coexist *btcoexist, 1033c6821613SYan-Hsuan Chuang bool force_exec, u32 val0x6c0, u32 val0x6c4, 1034f1d2b4d3SLarry Finger u32 val0x6c8, u8 val0x6cc) 1035f1d2b4d3SLarry Finger { 1036d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 1037d46fa3e4SLarry Finger 1038d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1039f1d2b4d3SLarry Finger "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, ", 1040f1d2b4d3SLarry Finger (force_exec ? "force to" : ""), val0x6c0); 1041d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1042f1d2b4d3SLarry Finger "0x6c4 = 0x%x, 0x6c8 = 0x%x, 0x6cc = 0x%x\n", 1043f1d2b4d3SLarry Finger val0x6c4, val0x6c8, val0x6cc); 1044f1d2b4d3SLarry Finger coex_dm->cur_val0x6c0 = val0x6c0; 1045f1d2b4d3SLarry Finger coex_dm->cur_val0x6c4 = val0x6c4; 1046f1d2b4d3SLarry Finger coex_dm->cur_val0x6c8 = val0x6c8; 1047f1d2b4d3SLarry Finger coex_dm->cur_val0x6cc = val0x6cc; 1048f1d2b4d3SLarry Finger 1049f1d2b4d3SLarry Finger if (!force_exec) { 1050d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1051f1d2b4d3SLarry Finger "[BTCoex], preVal0x6c0 = 0x%x, preVal0x6c4 = 0x%x, ", 1052f1d2b4d3SLarry Finger coex_dm->pre_val0x6c0, coex_dm->pre_val0x6c4); 1053d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1054f1d2b4d3SLarry Finger "preVal0x6c8 = 0x%x, preVal0x6cc = 0x%x !!\n", 1055f1d2b4d3SLarry Finger coex_dm->pre_val0x6c8, coex_dm->pre_val0x6cc); 1056d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1057466414a0SJoe Perches "[BTCoex], curVal0x6c0 = 0x%x, curVal0x6c4 = 0x%x\n", 1058f1d2b4d3SLarry Finger coex_dm->cur_val0x6c0, coex_dm->cur_val0x6c4); 1059d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1060f1d2b4d3SLarry Finger "curVal0x6c8 = 0x%x, curVal0x6cc = 0x%x !!\n", 1061f1d2b4d3SLarry Finger coex_dm->cur_val0x6c8, coex_dm->cur_val0x6cc); 1062f1d2b4d3SLarry Finger 1063f1d2b4d3SLarry Finger if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) && 1064f1d2b4d3SLarry Finger (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) && 1065f1d2b4d3SLarry Finger (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) && 1066f1d2b4d3SLarry Finger (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc)) 1067f1d2b4d3SLarry Finger return; 1068f1d2b4d3SLarry Finger } 1069c6821613SYan-Hsuan Chuang btc8192e2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8, 1070c6821613SYan-Hsuan Chuang val0x6cc); 1071f1d2b4d3SLarry Finger 1072f1d2b4d3SLarry Finger coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0; 1073f1d2b4d3SLarry Finger coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4; 1074f1d2b4d3SLarry Finger coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8; 1075f1d2b4d3SLarry Finger coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc; 1076f1d2b4d3SLarry Finger } 1077f1d2b4d3SLarry Finger 1078c6821613SYan-Hsuan Chuang static void btc8192e2ant_coex_table_with_type(struct btc_coexist *btcoexist, 1079f1d2b4d3SLarry Finger bool force_exec, u8 type) 1080f1d2b4d3SLarry Finger { 1081f1d2b4d3SLarry Finger switch (type) { 1082f1d2b4d3SLarry Finger case 0: 1083c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table(btcoexist, force_exec, 0x55555555, 1084f1d2b4d3SLarry Finger 0x5a5a5a5a, 0xffffff, 0x3); 1085f1d2b4d3SLarry Finger break; 1086f1d2b4d3SLarry Finger case 1: 1087c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a, 1088f1d2b4d3SLarry Finger 0x5a5a5a5a, 0xffffff, 0x3); 1089f1d2b4d3SLarry Finger break; 1090f1d2b4d3SLarry Finger case 2: 1091c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table(btcoexist, force_exec, 0x55555555, 1092f1d2b4d3SLarry Finger 0x5ffb5ffb, 0xffffff, 0x3); 1093f1d2b4d3SLarry Finger break; 1094f1d2b4d3SLarry Finger case 3: 1095c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table(btcoexist, force_exec, 0xdfffdfff, 1096f1d2b4d3SLarry Finger 0x5fdb5fdb, 0xffffff, 0x3); 1097f1d2b4d3SLarry Finger break; 1098f1d2b4d3SLarry Finger case 4: 1099c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table(btcoexist, force_exec, 0xdfffdfff, 1100f1d2b4d3SLarry Finger 0x5ffb5ffb, 0xffffff, 0x3); 1101f1d2b4d3SLarry Finger break; 1102f1d2b4d3SLarry Finger default: 1103f1d2b4d3SLarry Finger break; 1104f1d2b4d3SLarry Finger } 1105f1d2b4d3SLarry Finger } 1106f1d2b4d3SLarry Finger 1107c6821613SYan-Hsuan Chuang static void btc8192e2ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist, 1108f1d2b4d3SLarry Finger bool enable) 1109f1d2b4d3SLarry Finger { 1110d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 1111f1d2b4d3SLarry Finger u8 h2c_parameter[1] = {0}; 1112f1d2b4d3SLarry Finger 1113f1d2b4d3SLarry Finger if (enable) 1114f1d2b4d3SLarry Finger h2c_parameter[0] |= BIT0; /* function enable */ 1115f1d2b4d3SLarry Finger 1116d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1117f1d2b4d3SLarry Finger "[BTCoex]set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n", 1118f1d2b4d3SLarry Finger h2c_parameter[0]); 1119f1d2b4d3SLarry Finger 1120f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter); 1121f1d2b4d3SLarry Finger } 1122f1d2b4d3SLarry Finger 1123c6821613SYan-Hsuan Chuang static void btc8192e2ant_ignore_wlan_act(struct btc_coexist *btcoexist, 1124f1d2b4d3SLarry Finger bool force_exec, bool enable) 1125f1d2b4d3SLarry Finger { 1126d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 1127d46fa3e4SLarry Finger 1128d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1129f1d2b4d3SLarry Finger "[BTCoex], %s turn Ignore WlanAct %s\n", 1130f1d2b4d3SLarry Finger (force_exec ? "force to" : ""), (enable ? "ON" : "OFF")); 1131f1d2b4d3SLarry Finger coex_dm->cur_ignore_wlan_act = enable; 1132f1d2b4d3SLarry Finger 1133f1d2b4d3SLarry Finger if (!force_exec) { 1134d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1135f1d2b4d3SLarry Finger "[BTCoex], bPreIgnoreWlanAct = %d ", 1136f1d2b4d3SLarry Finger coex_dm->pre_ignore_wlan_act); 1137d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1138f1d2b4d3SLarry Finger "bCurIgnoreWlanAct = %d!!\n", 1139f1d2b4d3SLarry Finger coex_dm->cur_ignore_wlan_act); 1140f1d2b4d3SLarry Finger 1141f1d2b4d3SLarry Finger if (coex_dm->pre_ignore_wlan_act == 1142f1d2b4d3SLarry Finger coex_dm->cur_ignore_wlan_act) 1143f1d2b4d3SLarry Finger return; 1144f1d2b4d3SLarry Finger } 1145c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ignore_wlan_act(btcoexist, enable); 1146f1d2b4d3SLarry Finger 1147f1d2b4d3SLarry Finger coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act; 1148f1d2b4d3SLarry Finger } 1149f1d2b4d3SLarry Finger 1150c6821613SYan-Hsuan Chuang static void btc8192e2ant_set_fw_ps_tdma(struct btc_coexist *btcoexist, u8 byte1, 1151f1d2b4d3SLarry Finger u8 byte2, u8 byte3, u8 byte4, u8 byte5) 1152f1d2b4d3SLarry Finger { 1153d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 1154d46fa3e4SLarry Finger 1155f1d2b4d3SLarry Finger u8 h2c_parameter[5] = {0}; 1156f1d2b4d3SLarry Finger 1157f1d2b4d3SLarry Finger h2c_parameter[0] = byte1; 1158f1d2b4d3SLarry Finger h2c_parameter[1] = byte2; 1159f1d2b4d3SLarry Finger h2c_parameter[2] = byte3; 1160f1d2b4d3SLarry Finger h2c_parameter[3] = byte4; 1161f1d2b4d3SLarry Finger h2c_parameter[4] = byte5; 1162f1d2b4d3SLarry Finger 1163f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[0] = byte1; 1164f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[1] = byte2; 1165f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[2] = byte3; 1166f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[3] = byte4; 1167f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[4] = byte5; 1168f1d2b4d3SLarry Finger 1169d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1170f1d2b4d3SLarry Finger "[BTCoex], FW write 0x60(5bytes) = 0x%x%08x\n", 1171f1d2b4d3SLarry Finger h2c_parameter[0], 1172f1d2b4d3SLarry Finger h2c_parameter[1] << 24 | h2c_parameter[2] << 16 | 1173f1d2b4d3SLarry Finger h2c_parameter[3] << 8 | h2c_parameter[4]); 1174f1d2b4d3SLarry Finger 1175f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter); 1176f1d2b4d3SLarry Finger } 1177f1d2b4d3SLarry Finger 1178c6821613SYan-Hsuan Chuang static void btc8192e2ant_sw_mechanism1(struct btc_coexist *btcoexist, 1179f1d2b4d3SLarry Finger bool shrink_rx_lpf, bool low_penalty_ra, 1180f1d2b4d3SLarry Finger bool limited_dig, bool btlan_constrain) 1181f1d2b4d3SLarry Finger { 1182c6821613SYan-Hsuan Chuang btc8192e2ant_rf_shrink(btcoexist, NORMAL_EXEC, shrink_rx_lpf); 1183f1d2b4d3SLarry Finger } 1184f1d2b4d3SLarry Finger 1185c6821613SYan-Hsuan Chuang static void btc8192e2ant_sw_mechanism2(struct btc_coexist *btcoexist, 1186f1d2b4d3SLarry Finger bool agc_table_shift, bool adc_backoff, 1187c6821613SYan-Hsuan Chuang bool sw_dac_swing, u32 dac_swing_lvl) 1188f1d2b4d3SLarry Finger { 1189c6821613SYan-Hsuan Chuang btc8192e2ant_agc_table(btcoexist, NORMAL_EXEC, agc_table_shift); 1190c6821613SYan-Hsuan Chuang btc8192e2ant_dac_swing(btcoexist, NORMAL_EXEC, sw_dac_swing, 1191c6821613SYan-Hsuan Chuang dac_swing_lvl); 1192f1d2b4d3SLarry Finger } 1193f1d2b4d3SLarry Finger 1194c6821613SYan-Hsuan Chuang static void btc8192e2ant_ps_tdma(struct btc_coexist *btcoexist, 1195f1d2b4d3SLarry Finger bool force_exec, bool turn_on, u8 type) 1196f1d2b4d3SLarry Finger { 1197d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 1198d46fa3e4SLarry Finger 1199d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1200f1d2b4d3SLarry Finger "[BTCoex], %s turn %s PS TDMA, type=%d\n", 1201f1d2b4d3SLarry Finger (force_exec ? "force to" : ""), 1202f1d2b4d3SLarry Finger (turn_on ? "ON" : "OFF"), type); 1203f1d2b4d3SLarry Finger coex_dm->cur_ps_tdma_on = turn_on; 1204f1d2b4d3SLarry Finger coex_dm->cur_ps_tdma = type; 1205f1d2b4d3SLarry Finger 1206f1d2b4d3SLarry Finger if (!force_exec) { 1207d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1208f1d2b4d3SLarry Finger "[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n", 1209f1d2b4d3SLarry Finger coex_dm->pre_ps_tdma_on, coex_dm->cur_ps_tdma_on); 1210d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1211f1d2b4d3SLarry Finger "[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n", 1212f1d2b4d3SLarry Finger coex_dm->pre_ps_tdma, coex_dm->cur_ps_tdma); 1213f1d2b4d3SLarry Finger 1214f1d2b4d3SLarry Finger if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) && 1215f1d2b4d3SLarry Finger (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma)) 1216f1d2b4d3SLarry Finger return; 1217f1d2b4d3SLarry Finger } 1218f1d2b4d3SLarry Finger if (turn_on) { 1219f1d2b4d3SLarry Finger switch (type) { 1220f1d2b4d3SLarry Finger case 1: 1221f1d2b4d3SLarry Finger default: 1222c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a, 1223f1d2b4d3SLarry Finger 0x1a, 0xe1, 0x90); 1224f1d2b4d3SLarry Finger break; 1225f1d2b4d3SLarry Finger case 2: 1226c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12, 1227f1d2b4d3SLarry Finger 0x12, 0xe1, 0x90); 1228f1d2b4d3SLarry Finger break; 1229f1d2b4d3SLarry Finger case 3: 1230c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c, 1231f1d2b4d3SLarry Finger 0x3, 0xf1, 0x90); 1232f1d2b4d3SLarry Finger break; 1233f1d2b4d3SLarry Finger case 4: 1234c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10, 1235f1d2b4d3SLarry Finger 0x3, 0xf1, 0x90); 1236f1d2b4d3SLarry Finger break; 1237f1d2b4d3SLarry Finger case 5: 1238c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a, 1239f1d2b4d3SLarry Finger 0x1a, 0x60, 0x90); 1240f1d2b4d3SLarry Finger break; 1241f1d2b4d3SLarry Finger case 6: 1242c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12, 1243f1d2b4d3SLarry Finger 0x12, 0x60, 0x90); 1244f1d2b4d3SLarry Finger break; 1245f1d2b4d3SLarry Finger case 7: 1246c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c, 1247f1d2b4d3SLarry Finger 0x3, 0x70, 0x90); 1248f1d2b4d3SLarry Finger break; 1249f1d2b4d3SLarry Finger case 8: 1250c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x10, 1251f1d2b4d3SLarry Finger 0x3, 0x70, 0x90); 1252f1d2b4d3SLarry Finger break; 1253f1d2b4d3SLarry Finger case 9: 1254c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a, 1255f1d2b4d3SLarry Finger 0x1a, 0xe1, 0x10); 1256f1d2b4d3SLarry Finger break; 1257f1d2b4d3SLarry Finger case 10: 1258c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12, 1259f1d2b4d3SLarry Finger 0x12, 0xe1, 0x10); 1260f1d2b4d3SLarry Finger break; 1261f1d2b4d3SLarry Finger case 11: 1262c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c, 1263f1d2b4d3SLarry Finger 0x3, 0xf1, 0x10); 1264f1d2b4d3SLarry Finger break; 1265f1d2b4d3SLarry Finger case 12: 1266c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10, 1267f1d2b4d3SLarry Finger 0x3, 0xf1, 0x10); 1268f1d2b4d3SLarry Finger break; 1269f1d2b4d3SLarry Finger case 13: 1270c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a, 1271f1d2b4d3SLarry Finger 0x1a, 0xe0, 0x10); 1272f1d2b4d3SLarry Finger break; 1273f1d2b4d3SLarry Finger case 14: 1274c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12, 1275f1d2b4d3SLarry Finger 0x12, 0xe0, 0x10); 1276f1d2b4d3SLarry Finger break; 1277f1d2b4d3SLarry Finger case 15: 1278c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c, 1279f1d2b4d3SLarry Finger 0x3, 0xf0, 0x10); 1280f1d2b4d3SLarry Finger break; 1281f1d2b4d3SLarry Finger case 16: 1282c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12, 1283f1d2b4d3SLarry Finger 0x3, 0xf0, 0x10); 1284f1d2b4d3SLarry Finger break; 1285f1d2b4d3SLarry Finger case 17: 1286c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0x61, 0x20, 1287f1d2b4d3SLarry Finger 0x03, 0x10, 0x10); 1288f1d2b4d3SLarry Finger break; 1289f1d2b4d3SLarry Finger case 18: 1290c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5, 1291f1d2b4d3SLarry Finger 0x5, 0xe1, 0x90); 1292f1d2b4d3SLarry Finger break; 1293f1d2b4d3SLarry Finger case 19: 1294c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25, 1295f1d2b4d3SLarry Finger 0x25, 0xe1, 0x90); 1296f1d2b4d3SLarry Finger break; 1297f1d2b4d3SLarry Finger case 20: 1298c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25, 1299f1d2b4d3SLarry Finger 0x25, 0x60, 0x90); 1300f1d2b4d3SLarry Finger break; 1301f1d2b4d3SLarry Finger case 21: 1302c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15, 1303f1d2b4d3SLarry Finger 0x03, 0x70, 0x90); 1304f1d2b4d3SLarry Finger break; 1305f1d2b4d3SLarry Finger case 71: 1306c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a, 1307f1d2b4d3SLarry Finger 0x1a, 0xe1, 0x90); 1308f1d2b4d3SLarry Finger break; 1309f1d2b4d3SLarry Finger } 1310f1d2b4d3SLarry Finger } else { 1311f1d2b4d3SLarry Finger /* disable PS tdma */ 1312f1d2b4d3SLarry Finger switch (type) { 1313f1d2b4d3SLarry Finger default: 1314f1d2b4d3SLarry Finger case 0: 1315c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0x8, 0x0, 0x0, 1316f1d2b4d3SLarry Finger 0x0, 0x0); 1317f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x4); 1318f1d2b4d3SLarry Finger break; 1319f1d2b4d3SLarry Finger case 1: 1320c6821613SYan-Hsuan Chuang btc8192e2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0, 1321f1d2b4d3SLarry Finger 0x8, 0x0); 1322f1d2b4d3SLarry Finger mdelay(5); 1323f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x20); 1324f1d2b4d3SLarry Finger break; 1325f1d2b4d3SLarry Finger } 1326f1d2b4d3SLarry Finger } 1327f1d2b4d3SLarry Finger 1328f1d2b4d3SLarry Finger /* update pre state */ 1329f1d2b4d3SLarry Finger coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on; 1330f1d2b4d3SLarry Finger coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma; 1331f1d2b4d3SLarry Finger } 1332f1d2b4d3SLarry Finger 1333c6821613SYan-Hsuan Chuang static void btc8192e2ant_set_switch_ss_type(struct btc_coexist *btcoexist, 1334c6821613SYan-Hsuan Chuang u8 ss_type) 1335f1d2b4d3SLarry Finger { 1336d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 1337f1d2b4d3SLarry Finger u8 mimops = BTC_MIMO_PS_DYNAMIC; 1338c6821613SYan-Hsuan Chuang u32 dis_ra_mask = 0x0; 1339f1d2b4d3SLarry Finger 1340d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1341c6821613SYan-Hsuan Chuang "[BTCoex], REAL set SS Type = %d\n", ss_type); 1342f1d2b4d3SLarry Finger 1343c6821613SYan-Hsuan Chuang dis_ra_mask = btc8192e2ant_decide_ra_mask(btcoexist, ss_type, 1344c6821613SYan-Hsuan Chuang coex_dm->cur_ra_mask_type); 1345c6821613SYan-Hsuan Chuang btc8192e2ant_update_ra_mask(btcoexist, FORCE_EXEC, dis_ra_mask); 1346f1d2b4d3SLarry Finger 1347c6821613SYan-Hsuan Chuang if (ss_type == 1) { 1348c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1); 1349f1d2b4d3SLarry Finger /* switch ofdm path */ 1350f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0xc04, 0x11); 1351f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0xd04, 0x1); 1352f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x90c, 0x81111111); 1353f1d2b4d3SLarry Finger /* switch cck patch */ 1354f1d2b4d3SLarry Finger btcoexist->btc_write_1byte_bitmask(btcoexist, 0xe77, 0x4, 0x1); 1355f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0xa07, 0x81); 1356f1d2b4d3SLarry Finger mimops = BTC_MIMO_PS_STATIC; 1357c6821613SYan-Hsuan Chuang } else if (ss_type == 2) { 1358c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0); 1359f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0xc04, 0x33); 1360f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0xd04, 0x3); 1361f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x90c, 0x81121313); 1362f1d2b4d3SLarry Finger btcoexist->btc_write_1byte_bitmask(btcoexist, 0xe77, 0x4, 0x0); 1363f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0xa07, 0x41); 1364f1d2b4d3SLarry Finger mimops = BTC_MIMO_PS_DYNAMIC; 1365f1d2b4d3SLarry Finger } 1366f1d2b4d3SLarry Finger /* set rx 1ss or 2ss */ 1367f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_ACT_SEND_MIMO_PS, &mimops); 1368f1d2b4d3SLarry Finger } 1369f1d2b4d3SLarry Finger 1370c6821613SYan-Hsuan Chuang static void btc8192e2ant_switch_ss_type(struct btc_coexist *btcoexist, 1371c6821613SYan-Hsuan Chuang bool force_exec, u8 new_ss_type) 1372f1d2b4d3SLarry Finger { 1373d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 1374d46fa3e4SLarry Finger 1375d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1376f1d2b4d3SLarry Finger "[BTCoex], %s Switch SS Type = %d\n", 1377c6821613SYan-Hsuan Chuang (force_exec ? "force to" : ""), new_ss_type); 1378c6821613SYan-Hsuan Chuang coex_dm->cur_ss_type = new_ss_type; 1379f1d2b4d3SLarry Finger 1380f1d2b4d3SLarry Finger if (!force_exec) { 1381c6821613SYan-Hsuan Chuang if (coex_dm->pre_ss_type == coex_dm->cur_ss_type) 1382f1d2b4d3SLarry Finger return; 1383f1d2b4d3SLarry Finger } 1384c6821613SYan-Hsuan Chuang btc8192e2ant_set_switch_ss_type(btcoexist, coex_dm->cur_ss_type); 1385f1d2b4d3SLarry Finger 1386c6821613SYan-Hsuan Chuang coex_dm->pre_ss_type = coex_dm->cur_ss_type; 1387f1d2b4d3SLarry Finger } 1388f1d2b4d3SLarry Finger 1389c6821613SYan-Hsuan Chuang static void btc8192e2ant_coex_all_off(struct btc_coexist *btcoexist) 1390f1d2b4d3SLarry Finger { 1391f1d2b4d3SLarry Finger /* fw all off */ 1392c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1); 1393c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); 1394c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 1395f1d2b4d3SLarry Finger 1396f1d2b4d3SLarry Finger /* sw all off */ 1397c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); 1398c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); 1399f1d2b4d3SLarry Finger 1400f1d2b4d3SLarry Finger /* hw all off */ 1401c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); 1402f1d2b4d3SLarry Finger } 1403f1d2b4d3SLarry Finger 1404c6821613SYan-Hsuan Chuang static void btc8192e2ant_init_coex_dm(struct btc_coexist *btcoexist) 1405f1d2b4d3SLarry Finger { 1406f1d2b4d3SLarry Finger /* force to reset coex mechanism */ 1407f1d2b4d3SLarry Finger 1408c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1); 1409c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6); 1410c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, FORCE_EXEC, 0); 1411f1d2b4d3SLarry Finger 1412c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0); 1413c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, FORCE_EXEC, 2); 1414f1d2b4d3SLarry Finger 1415c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); 1416c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); 1417f1d2b4d3SLarry Finger } 1418f1d2b4d3SLarry Finger 1419c6821613SYan-Hsuan Chuang static void btc8192e2ant_action_bt_inquiry(struct btc_coexist *btcoexist) 1420f1d2b4d3SLarry Finger { 1421f1d2b4d3SLarry Finger bool low_pwr_disable = true; 1422f1d2b4d3SLarry Finger 1423f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER, 1424f1d2b4d3SLarry Finger &low_pwr_disable); 1425f1d2b4d3SLarry Finger 1426c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1); 1427f1d2b4d3SLarry Finger 1428c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); 1429c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3); 1430c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); 1431c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 1432f1d2b4d3SLarry Finger 1433c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false); 1434c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18); 1435f1d2b4d3SLarry Finger } 1436f1d2b4d3SLarry Finger 1437c6821613SYan-Hsuan Chuang static bool btc8192e2ant_is_common_action(struct btc_coexist *btcoexist) 1438f1d2b4d3SLarry Finger { 1439d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 1440f1d2b4d3SLarry Finger struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; 1441f1d2b4d3SLarry Finger bool common = false, wifi_connected = false, wifi_busy = false; 1442c6821613SYan-Hsuan Chuang bool bt_hs_on = false, low_pwr_disable = false; 1443f1d2b4d3SLarry Finger 1444c6821613SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); 1445f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, 1446f1d2b4d3SLarry Finger &wifi_connected); 1447f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); 1448f1d2b4d3SLarry Finger 1449f1d2b4d3SLarry Finger if (bt_link_info->sco_exist || bt_link_info->hid_exist) 1450c6821613SYan-Hsuan Chuang btc8192e2ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 0, 0, 0); 1451f1d2b4d3SLarry Finger else 1452c6821613SYan-Hsuan Chuang btc8192e2ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0); 1453f1d2b4d3SLarry Finger 1454f1d2b4d3SLarry Finger if (!wifi_connected) { 1455f1d2b4d3SLarry Finger low_pwr_disable = false; 1456f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER, 1457f1d2b4d3SLarry Finger &low_pwr_disable); 1458f1d2b4d3SLarry Finger 1459d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1460f1d2b4d3SLarry Finger "[BTCoex], Wifi non-connected idle!!\n"); 1461f1d2b4d3SLarry Finger 1462f1d2b4d3SLarry Finger if ((BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE == 1463f1d2b4d3SLarry Finger coex_dm->bt_status) || 1464f1d2b4d3SLarry Finger (BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE == 1465f1d2b4d3SLarry Finger coex_dm->bt_status)) { 1466c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 2); 1467c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, 1468f1d2b4d3SLarry Finger NORMAL_EXEC, 1); 1469c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0); 1470f1d2b4d3SLarry Finger } else { 1471c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1); 1472c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, 1473f1d2b4d3SLarry Finger NORMAL_EXEC, 0); 1474c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1); 1475f1d2b4d3SLarry Finger } 1476f1d2b4d3SLarry Finger 1477c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); 1478c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 1479f1d2b4d3SLarry Finger 1480c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, false, 1481c6821613SYan-Hsuan Chuang false); 1482c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 1483c6821613SYan-Hsuan Chuang 0x18); 1484f1d2b4d3SLarry Finger 1485f1d2b4d3SLarry Finger common = true; 1486f1d2b4d3SLarry Finger } else { 1487f1d2b4d3SLarry Finger if (BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE == 1488f1d2b4d3SLarry Finger coex_dm->bt_status) { 1489f1d2b4d3SLarry Finger low_pwr_disable = false; 1490f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, 1491f1d2b4d3SLarry Finger BTC_SET_ACT_DISABLE_LOW_POWER, 1492f1d2b4d3SLarry Finger &low_pwr_disable); 1493f1d2b4d3SLarry Finger 1494d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1495f1d2b4d3SLarry Finger "Wifi connected + BT non connected-idle!!\n"); 1496f1d2b4d3SLarry Finger 1497c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 2); 1498c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, 1499f1d2b4d3SLarry Finger NORMAL_EXEC, 1); 1500c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0); 1501c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, 1502f1d2b4d3SLarry Finger NORMAL_EXEC, 6); 1503c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 1504f1d2b4d3SLarry Finger 1505c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, 1506f1d2b4d3SLarry Finger false, false); 1507c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 1508f1d2b4d3SLarry Finger false, 0x18); 1509f1d2b4d3SLarry Finger 1510f1d2b4d3SLarry Finger common = true; 1511f1d2b4d3SLarry Finger } else if (BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE == 1512f1d2b4d3SLarry Finger coex_dm->bt_status) { 1513f1d2b4d3SLarry Finger low_pwr_disable = true; 1514f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, 1515f1d2b4d3SLarry Finger BTC_SET_ACT_DISABLE_LOW_POWER, 1516f1d2b4d3SLarry Finger &low_pwr_disable); 1517f1d2b4d3SLarry Finger 1518c6821613SYan-Hsuan Chuang if (bt_hs_on) 1519f1d2b4d3SLarry Finger return false; 1520d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1521f1d2b4d3SLarry Finger "Wifi connected + BT connected-idle!!\n"); 1522f1d2b4d3SLarry Finger 1523c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, 1524f1d2b4d3SLarry Finger NORMAL_EXEC, 2); 1525c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, 1526f1d2b4d3SLarry Finger NORMAL_EXEC, 1); 1527c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, 1528f1d2b4d3SLarry Finger false, 0); 1529c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, 1530f1d2b4d3SLarry Finger NORMAL_EXEC, 6); 1531c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 1532f1d2b4d3SLarry Finger 1533c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, false, 1534f1d2b4d3SLarry Finger false, false); 1535c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 1536f1d2b4d3SLarry Finger false, 0x18); 1537f1d2b4d3SLarry Finger 1538f1d2b4d3SLarry Finger common = true; 1539f1d2b4d3SLarry Finger } else { 1540f1d2b4d3SLarry Finger low_pwr_disable = true; 1541f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, 1542f1d2b4d3SLarry Finger BTC_SET_ACT_DISABLE_LOW_POWER, 1543f1d2b4d3SLarry Finger &low_pwr_disable); 1544f1d2b4d3SLarry Finger 1545f1d2b4d3SLarry Finger if (wifi_busy) { 1546d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1547f1d2b4d3SLarry Finger "Wifi Connected-Busy + BT Busy!!\n"); 1548f1d2b4d3SLarry Finger common = false; 1549f1d2b4d3SLarry Finger } else { 1550d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1551f1d2b4d3SLarry Finger "Wifi Connected-Idle + BT Busy!!\n"); 1552f1d2b4d3SLarry Finger 1553c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, 1554f1d2b4d3SLarry Finger NORMAL_EXEC, 1); 1555c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, 1556c6821613SYan-Hsuan Chuang NORMAL_EXEC, 1557c6821613SYan-Hsuan Chuang 2); 1558c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, 1559f1d2b4d3SLarry Finger true, 21); 1560c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, 1561f1d2b4d3SLarry Finger NORMAL_EXEC, 6); 1562c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, 1563f1d2b4d3SLarry Finger NORMAL_EXEC, 0); 1564c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, 1565f1d2b4d3SLarry Finger false, false, false); 1566c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, 1567f1d2b4d3SLarry Finger false, false, 0x18); 1568f1d2b4d3SLarry Finger common = true; 1569f1d2b4d3SLarry Finger } 1570f1d2b4d3SLarry Finger } 1571f1d2b4d3SLarry Finger } 1572f1d2b4d3SLarry Finger return common; 1573f1d2b4d3SLarry Finger } 1574f1d2b4d3SLarry Finger 1575c6821613SYan-Hsuan Chuang static void btc8192e2ant_tdma_duration_adjust(struct btc_coexist *btcoexist, 1576f1d2b4d3SLarry Finger bool sco_hid, bool tx_pause, 1577f1d2b4d3SLarry Finger u8 max_interval) 1578f1d2b4d3SLarry Finger { 1579d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 1580f1d2b4d3SLarry Finger static int up, dn, m, n, wait_cnt; 1581f1d2b4d3SLarry Finger u8 retry_cnt = 0; 1582f1d2b4d3SLarry Finger 1583d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1584f1d2b4d3SLarry Finger "[BTCoex], TdmaDurationAdjust()\n"); 1585f1d2b4d3SLarry Finger 1586f1d2b4d3SLarry Finger if (!coex_dm->auto_tdma_adjust) { 1587f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust = true; 1588d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1589f1d2b4d3SLarry Finger "[BTCoex], first run TdmaDurationAdjust()!!\n"); 1590f1d2b4d3SLarry Finger if (sco_hid) { 1591f1d2b4d3SLarry Finger if (tx_pause) { 1592f1d2b4d3SLarry Finger if (max_interval == 1) { 1593c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, 1594f1d2b4d3SLarry Finger NORMAL_EXEC, 1595f1d2b4d3SLarry Finger true, 13); 1596f1d2b4d3SLarry Finger coex_dm->tdma_adj_type = 13; 1597f1d2b4d3SLarry Finger } else if (max_interval == 2) { 1598c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, 1599f1d2b4d3SLarry Finger NORMAL_EXEC, 1600f1d2b4d3SLarry Finger true, 14); 1601f1d2b4d3SLarry Finger coex_dm->tdma_adj_type = 14; 1602f1d2b4d3SLarry Finger } else { 1603c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, 1604f1d2b4d3SLarry Finger NORMAL_EXEC, 1605f1d2b4d3SLarry Finger true, 15); 1606f1d2b4d3SLarry Finger coex_dm->tdma_adj_type = 15; 1607f1d2b4d3SLarry Finger } 1608f1d2b4d3SLarry Finger } else { 1609f1d2b4d3SLarry Finger if (max_interval == 1) { 1610c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, 1611f1d2b4d3SLarry Finger NORMAL_EXEC, 1612f1d2b4d3SLarry Finger true, 9); 1613f1d2b4d3SLarry Finger coex_dm->tdma_adj_type = 9; 1614f1d2b4d3SLarry Finger } else if (max_interval == 2) { 1615c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, 1616f1d2b4d3SLarry Finger NORMAL_EXEC, 1617f1d2b4d3SLarry Finger true, 10); 1618f1d2b4d3SLarry Finger coex_dm->tdma_adj_type = 10; 1619f1d2b4d3SLarry Finger } else { 1620c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, 1621f1d2b4d3SLarry Finger NORMAL_EXEC, 1622f1d2b4d3SLarry Finger true, 11); 1623f1d2b4d3SLarry Finger coex_dm->tdma_adj_type = 11; 1624f1d2b4d3SLarry Finger } 1625f1d2b4d3SLarry Finger } 1626f1d2b4d3SLarry Finger } else { 1627f1d2b4d3SLarry Finger if (tx_pause) { 1628f1d2b4d3SLarry Finger if (max_interval == 1) { 1629c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, 1630f1d2b4d3SLarry Finger NORMAL_EXEC, 1631f1d2b4d3SLarry Finger true, 5); 1632f1d2b4d3SLarry Finger coex_dm->tdma_adj_type = 5; 1633f1d2b4d3SLarry Finger } else if (max_interval == 2) { 1634c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, 1635f1d2b4d3SLarry Finger NORMAL_EXEC, 1636f1d2b4d3SLarry Finger true, 6); 1637f1d2b4d3SLarry Finger coex_dm->tdma_adj_type = 6; 1638f1d2b4d3SLarry Finger } else { 1639c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, 1640f1d2b4d3SLarry Finger NORMAL_EXEC, 1641f1d2b4d3SLarry Finger true, 7); 1642f1d2b4d3SLarry Finger coex_dm->tdma_adj_type = 7; 1643f1d2b4d3SLarry Finger } 1644f1d2b4d3SLarry Finger } else { 1645f1d2b4d3SLarry Finger if (max_interval == 1) { 1646c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, 1647f1d2b4d3SLarry Finger NORMAL_EXEC, 1648f1d2b4d3SLarry Finger true, 1); 1649f1d2b4d3SLarry Finger coex_dm->tdma_adj_type = 1; 1650f1d2b4d3SLarry Finger } else if (max_interval == 2) { 1651c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, 1652f1d2b4d3SLarry Finger NORMAL_EXEC, 1653f1d2b4d3SLarry Finger true, 2); 1654f1d2b4d3SLarry Finger coex_dm->tdma_adj_type = 2; 1655f1d2b4d3SLarry Finger } else { 1656c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, 1657f1d2b4d3SLarry Finger NORMAL_EXEC, 1658f1d2b4d3SLarry Finger true, 3); 1659f1d2b4d3SLarry Finger coex_dm->tdma_adj_type = 3; 1660f1d2b4d3SLarry Finger } 1661f1d2b4d3SLarry Finger } 1662f1d2b4d3SLarry Finger } 1663f1d2b4d3SLarry Finger 1664f1d2b4d3SLarry Finger up = 0; 1665f1d2b4d3SLarry Finger dn = 0; 1666f1d2b4d3SLarry Finger m = 1; 1667f1d2b4d3SLarry Finger n = 3; 1668f1d2b4d3SLarry Finger wait_cnt = 0; 1669f1d2b4d3SLarry Finger } else { 1670f1d2b4d3SLarry Finger /* accquire the BT TRx retry count from BT_Info byte2 */ 1671f1d2b4d3SLarry Finger retry_cnt = coex_sta->bt_retry_cnt; 1672d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1673f1d2b4d3SLarry Finger "[BTCoex], retry_cnt = %d\n", retry_cnt); 1674d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1675f1d2b4d3SLarry Finger "[BTCoex], up=%d, dn=%d, m=%d, n=%d, wait_cnt=%d\n", 1676f1d2b4d3SLarry Finger up, dn, m, n, wait_cnt); 1677f1d2b4d3SLarry Finger wait_cnt++; 1678f1d2b4d3SLarry Finger /* no retry in the last 2-second duration */ 1679f1d2b4d3SLarry Finger if (retry_cnt == 0) { 1680f1d2b4d3SLarry Finger up++; 1681f1d2b4d3SLarry Finger dn--; 1682f1d2b4d3SLarry Finger 1683f1d2b4d3SLarry Finger if (dn <= 0) 1684f1d2b4d3SLarry Finger dn = 0; 1685f1d2b4d3SLarry Finger 1686f1d2b4d3SLarry Finger if (up >= n) { 1687f1d2b4d3SLarry Finger wait_cnt = 0; 1688f1d2b4d3SLarry Finger n = 3; 1689f1d2b4d3SLarry Finger up = 0; 1690f1d2b4d3SLarry Finger dn = 0; 1691d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1692f1d2b4d3SLarry Finger "[BTCoex]Increase wifi duration!!\n"); 1693f1d2b4d3SLarry Finger } 1694f1d2b4d3SLarry Finger } else if (retry_cnt <= 3) { 1695f1d2b4d3SLarry Finger up--; 1696f1d2b4d3SLarry Finger dn++; 1697f1d2b4d3SLarry Finger 1698f1d2b4d3SLarry Finger if (up <= 0) 1699f1d2b4d3SLarry Finger up = 0; 1700f1d2b4d3SLarry Finger 1701f1d2b4d3SLarry Finger if (dn == 2) { 1702f1d2b4d3SLarry Finger if (wait_cnt <= 2) 1703f1d2b4d3SLarry Finger m++; 1704f1d2b4d3SLarry Finger else 1705f1d2b4d3SLarry Finger m = 1; 1706f1d2b4d3SLarry Finger 1707f1d2b4d3SLarry Finger if (m >= 20) 1708f1d2b4d3SLarry Finger m = 20; 1709f1d2b4d3SLarry Finger 1710f1d2b4d3SLarry Finger n = 3 * m; 1711f1d2b4d3SLarry Finger up = 0; 1712f1d2b4d3SLarry Finger dn = 0; 1713f1d2b4d3SLarry Finger wait_cnt = 0; 1714d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1715f1d2b4d3SLarry Finger "Reduce wifi duration for retry<3\n"); 1716f1d2b4d3SLarry Finger } 1717f1d2b4d3SLarry Finger } else { 1718f1d2b4d3SLarry Finger if (wait_cnt == 1) 1719f1d2b4d3SLarry Finger m++; 1720f1d2b4d3SLarry Finger else 1721f1d2b4d3SLarry Finger m = 1; 1722f1d2b4d3SLarry Finger 1723f1d2b4d3SLarry Finger if (m >= 20) 1724f1d2b4d3SLarry Finger m = 20; 1725f1d2b4d3SLarry Finger 1726f1d2b4d3SLarry Finger n = 3*m; 1727f1d2b4d3SLarry Finger up = 0; 1728f1d2b4d3SLarry Finger dn = 0; 1729f1d2b4d3SLarry Finger wait_cnt = 0; 1730d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1731f1d2b4d3SLarry Finger "Decrease wifi duration for retryCounter>3!!\n"); 1732f1d2b4d3SLarry Finger } 1733f1d2b4d3SLarry Finger 1734d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1735f1d2b4d3SLarry Finger "[BTCoex], max Interval = %d\n", max_interval); 1736f1d2b4d3SLarry Finger } 1737f1d2b4d3SLarry Finger 1738f1d2b4d3SLarry Finger /* if current PsTdma not match with 1739f1d2b4d3SLarry Finger * the recorded one (when scan, dhcp...), 1740f1d2b4d3SLarry Finger * then we have to adjust it back to the previous record one. 1741f1d2b4d3SLarry Finger */ 1742f1d2b4d3SLarry Finger if (coex_dm->cur_ps_tdma != coex_dm->tdma_adj_type) { 1743f1d2b4d3SLarry Finger bool scan = false, link = false, roam = false; 1744f1d2b4d3SLarry Finger 1745d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1746070fc356SColin Ian King "[BTCoex], PsTdma type mismatch!!!, "); 1747d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1748f1d2b4d3SLarry Finger "curPsTdma=%d, recordPsTdma=%d\n", 1749f1d2b4d3SLarry Finger coex_dm->cur_ps_tdma, coex_dm->tdma_adj_type); 1750f1d2b4d3SLarry Finger 1751f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan); 1752f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link); 1753f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam); 1754f1d2b4d3SLarry Finger 1755f1d2b4d3SLarry Finger if (!scan && !link && !roam) 1756c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, 1757c6821613SYan-Hsuan Chuang true, coex_dm->tdma_adj_type); 1758f1d2b4d3SLarry Finger else 1759d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1760f1d2b4d3SLarry Finger "[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n"); 1761f1d2b4d3SLarry Finger } 1762f1d2b4d3SLarry Finger } 1763f1d2b4d3SLarry Finger 1764f1d2b4d3SLarry Finger /* SCO only or SCO+PAN(HS) */ 1765c6821613SYan-Hsuan Chuang static void btc8192e2ant_action_sco(struct btc_coexist *btcoexist) 1766f1d2b4d3SLarry Finger { 1767c6821613SYan-Hsuan Chuang u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_STAY_LOW; 1768f1d2b4d3SLarry Finger u32 wifi_bw; 1769f1d2b4d3SLarry Finger 1770c6821613SYan-Hsuan Chuang wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0); 1771f1d2b4d3SLarry Finger 1772c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1); 1773c6821613SYan-Hsuan Chuang btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); 1774f1d2b4d3SLarry Finger 1775c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); 1776f1d2b4d3SLarry Finger 1777c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); 1778f1d2b4d3SLarry Finger 1779c6821613SYan-Hsuan Chuang bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42); 1780f1d2b4d3SLarry Finger 1781c6821613SYan-Hsuan Chuang if ((bt_rssi_state == BTC_RSSI_STATE_LOW) || 1782c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { 1783c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 1784c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13); 1785c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) || 1786c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) { 1787c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2); 1788c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9); 1789c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) || 1790c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 1791c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4); 1792c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9); 1793f1d2b4d3SLarry Finger } 1794f1d2b4d3SLarry Finger 1795f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); 1796f1d2b4d3SLarry Finger 1797f1d2b4d3SLarry Finger /* sw mechanism */ 1798f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) { 1799c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 1800c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 1801c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, true, 1802f1d2b4d3SLarry Finger false, false); 1803c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 1804f1d2b4d3SLarry Finger false, 0x6); 1805f1d2b4d3SLarry Finger } else { 1806c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, true, 1807f1d2b4d3SLarry Finger false, false); 1808c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 1809f1d2b4d3SLarry Finger false, 0x6); 1810f1d2b4d3SLarry Finger } 1811f1d2b4d3SLarry Finger } else { 1812c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 1813c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 1814c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, true, 1815f1d2b4d3SLarry Finger false, false); 1816c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 1817f1d2b4d3SLarry Finger false, 0x6); 1818f1d2b4d3SLarry Finger } else { 1819c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, true, 1820f1d2b4d3SLarry Finger false, false); 1821c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 1822f1d2b4d3SLarry Finger false, 0x6); 1823f1d2b4d3SLarry Finger } 1824f1d2b4d3SLarry Finger } 1825f1d2b4d3SLarry Finger } 1826f1d2b4d3SLarry Finger 1827c6821613SYan-Hsuan Chuang static void btc8192e2ant_action_sco_pan(struct btc_coexist *btcoexist) 1828f1d2b4d3SLarry Finger { 1829c6821613SYan-Hsuan Chuang u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_STAY_LOW; 1830f1d2b4d3SLarry Finger u32 wifi_bw; 1831f1d2b4d3SLarry Finger 1832c6821613SYan-Hsuan Chuang wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0); 1833f1d2b4d3SLarry Finger 1834c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1); 1835c6821613SYan-Hsuan Chuang btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); 1836f1d2b4d3SLarry Finger 1837c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); 1838f1d2b4d3SLarry Finger 1839c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4); 1840f1d2b4d3SLarry Finger 1841c6821613SYan-Hsuan Chuang bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42); 1842f1d2b4d3SLarry Finger 1843c6821613SYan-Hsuan Chuang if ((bt_rssi_state == BTC_RSSI_STATE_LOW) || 1844c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { 1845c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 1846c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14); 1847c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) || 1848c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) { 1849c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2); 1850c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10); 1851c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) || 1852c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 1853c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4); 1854c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10); 1855f1d2b4d3SLarry Finger } 1856f1d2b4d3SLarry Finger 1857f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); 1858f1d2b4d3SLarry Finger 1859f1d2b4d3SLarry Finger /* sw mechanism */ 1860f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) { 1861c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 1862c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 1863c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, true, 1864f1d2b4d3SLarry Finger false, false); 1865c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 1866f1d2b4d3SLarry Finger false, 0x6); 1867f1d2b4d3SLarry Finger } else { 1868c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, true, 1869f1d2b4d3SLarry Finger false, false); 1870c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 1871f1d2b4d3SLarry Finger false, 0x6); 1872f1d2b4d3SLarry Finger } 1873f1d2b4d3SLarry Finger } else { 1874c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 1875c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 1876c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, true, 1877f1d2b4d3SLarry Finger false, false); 1878c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 1879f1d2b4d3SLarry Finger false, 0x6); 1880f1d2b4d3SLarry Finger } else { 1881c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, true, 1882f1d2b4d3SLarry Finger false, false); 1883c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 1884f1d2b4d3SLarry Finger false, 0x6); 1885f1d2b4d3SLarry Finger } 1886f1d2b4d3SLarry Finger } 1887f1d2b4d3SLarry Finger } 1888f1d2b4d3SLarry Finger 1889c6821613SYan-Hsuan Chuang static void btc8192e2ant_action_hid(struct btc_coexist *btcoexist) 1890f1d2b4d3SLarry Finger { 1891c6821613SYan-Hsuan Chuang u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; 1892f1d2b4d3SLarry Finger u32 wifi_bw; 1893f1d2b4d3SLarry Finger 1894c6821613SYan-Hsuan Chuang wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0); 1895c6821613SYan-Hsuan Chuang bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42); 1896f1d2b4d3SLarry Finger 1897c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1); 1898c6821613SYan-Hsuan Chuang btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); 1899f1d2b4d3SLarry Finger 1900c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); 1901f1d2b4d3SLarry Finger 1902f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); 1903f1d2b4d3SLarry Finger 1904c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3); 1905f1d2b4d3SLarry Finger 1906c6821613SYan-Hsuan Chuang if ((bt_rssi_state == BTC_RSSI_STATE_LOW) || 1907c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { 1908c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 1909c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13); 1910c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) || 1911c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) { 1912c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2); 1913c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9); 1914c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) || 1915c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 1916c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4); 1917c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9); 1918f1d2b4d3SLarry Finger } 1919f1d2b4d3SLarry Finger 1920f1d2b4d3SLarry Finger /* sw mechanism */ 1921f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) { 1922c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 1923c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 1924c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, true, 1925f1d2b4d3SLarry Finger false, false); 1926c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 1927f1d2b4d3SLarry Finger false, 0x18); 1928f1d2b4d3SLarry Finger } else { 1929c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, true, 1930f1d2b4d3SLarry Finger false, false); 1931c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 1932f1d2b4d3SLarry Finger false, 0x18); 1933f1d2b4d3SLarry Finger } 1934f1d2b4d3SLarry Finger } else { 1935c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 1936c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 1937c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, true, 1938f1d2b4d3SLarry Finger false, false); 1939c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 1940f1d2b4d3SLarry Finger false, 0x18); 1941f1d2b4d3SLarry Finger } else { 1942c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, true, 1943f1d2b4d3SLarry Finger false, false); 1944c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 1945f1d2b4d3SLarry Finger false, 0x18); 1946f1d2b4d3SLarry Finger } 1947f1d2b4d3SLarry Finger } 1948f1d2b4d3SLarry Finger } 1949f1d2b4d3SLarry Finger 1950f1d2b4d3SLarry Finger /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */ 1951c6821613SYan-Hsuan Chuang static void btc8192e2ant_action_a2dp(struct btc_coexist *btcoexist) 1952f1d2b4d3SLarry Finger { 1953d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 1954c6821613SYan-Hsuan Chuang u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; 1955f1d2b4d3SLarry Finger u32 wifi_bw; 1956f1d2b4d3SLarry Finger bool long_dist = false; 1957f1d2b4d3SLarry Finger 1958c6821613SYan-Hsuan Chuang wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0); 1959c6821613SYan-Hsuan Chuang bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42); 1960f1d2b4d3SLarry Finger 1961c6821613SYan-Hsuan Chuang if ((bt_rssi_state == BTC_RSSI_STATE_LOW || 1962c6821613SYan-Hsuan Chuang bt_rssi_state == BTC_RSSI_STATE_STAY_LOW) && 1963c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_LOW || 1964c6821613SYan-Hsuan Chuang wifi_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { 1965d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1966f1d2b4d3SLarry Finger "[BTCoex], A2dp, wifi/bt rssi both LOW!!\n"); 1967f1d2b4d3SLarry Finger long_dist = true; 1968f1d2b4d3SLarry Finger } 1969f1d2b4d3SLarry Finger if (long_dist) { 1970c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 2); 1971c6821613SYan-Hsuan Chuang btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, true, 1972f1d2b4d3SLarry Finger 0x4); 1973f1d2b4d3SLarry Finger } else { 1974c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1); 1975c6821613SYan-Hsuan Chuang btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 1976f1d2b4d3SLarry Finger 0x8); 1977f1d2b4d3SLarry Finger } 1978f1d2b4d3SLarry Finger 1979c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); 1980f1d2b4d3SLarry Finger 1981f1d2b4d3SLarry Finger if (long_dist) 1982c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0); 1983f1d2b4d3SLarry Finger else 1984c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); 1985f1d2b4d3SLarry Finger 1986f1d2b4d3SLarry Finger if (long_dist) { 1987c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 17); 1988f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust = false; 1989c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 1990f1d2b4d3SLarry Finger } else { 1991c6821613SYan-Hsuan Chuang if ((bt_rssi_state == BTC_RSSI_STATE_LOW) || 1992c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { 1993c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, false, 1994f1d2b4d3SLarry Finger true, 1); 1995c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 1996c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) || 1997c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) { 1998c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, false, 1999f1d2b4d3SLarry Finger false, 1); 2000c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2); 2001c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) || 2002c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2003c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, false, 2004f1d2b4d3SLarry Finger false, 1); 2005c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4); 2006f1d2b4d3SLarry Finger } 2007f1d2b4d3SLarry Finger } 2008f1d2b4d3SLarry Finger 2009f1d2b4d3SLarry Finger /* sw mechanism */ 2010f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); 2011f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) { 2012c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2013c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2014c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, false, 2015f1d2b4d3SLarry Finger false, false); 2016c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2017f1d2b4d3SLarry Finger false, 0x18); 2018f1d2b4d3SLarry Finger } else { 2019c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, false, 2020f1d2b4d3SLarry Finger false, false); 2021c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2022f1d2b4d3SLarry Finger false, 0x18); 2023f1d2b4d3SLarry Finger } 2024f1d2b4d3SLarry Finger } else { 2025c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2026c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2027c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, 2028f1d2b4d3SLarry Finger false, false); 2029c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2030f1d2b4d3SLarry Finger false, 0x18); 2031f1d2b4d3SLarry Finger } else { 2032c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, 2033f1d2b4d3SLarry Finger false, false); 2034c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2035f1d2b4d3SLarry Finger false, 0x18); 2036f1d2b4d3SLarry Finger } 2037f1d2b4d3SLarry Finger } 2038f1d2b4d3SLarry Finger } 2039f1d2b4d3SLarry Finger 2040c6821613SYan-Hsuan Chuang static void btc8192e2ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist) 2041f1d2b4d3SLarry Finger { 2042c6821613SYan-Hsuan Chuang u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; 2043f1d2b4d3SLarry Finger u32 wifi_bw; 2044f1d2b4d3SLarry Finger 2045c6821613SYan-Hsuan Chuang wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0); 2046c6821613SYan-Hsuan Chuang bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42); 2047f1d2b4d3SLarry Finger 2048c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1); 2049c6821613SYan-Hsuan Chuang btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); 2050f1d2b4d3SLarry Finger 2051c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); 2052c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); 2053f1d2b4d3SLarry Finger 2054c6821613SYan-Hsuan Chuang if ((bt_rssi_state == BTC_RSSI_STATE_LOW) || 2055c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { 2056c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, false, true, 2); 2057c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 2058c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) || 2059c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) { 2060c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, false, false, 2); 2061c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2); 2062c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) || 2063c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2064c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, false, false, 2); 2065c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4); 2066f1d2b4d3SLarry Finger } 2067f1d2b4d3SLarry Finger 2068f1d2b4d3SLarry Finger /* sw mechanism */ 2069f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); 2070f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) { 2071c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2072c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2073c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, false, 2074f1d2b4d3SLarry Finger false, false); 2075c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2076f1d2b4d3SLarry Finger true, 0x6); 2077f1d2b4d3SLarry Finger } else { 2078c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, false, 2079f1d2b4d3SLarry Finger false, false); 2080c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2081f1d2b4d3SLarry Finger true, 0x6); 2082f1d2b4d3SLarry Finger } 2083f1d2b4d3SLarry Finger } else { 2084c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2085c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2086c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, 2087f1d2b4d3SLarry Finger false, false); 2088c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2089f1d2b4d3SLarry Finger true, 0x6); 2090f1d2b4d3SLarry Finger } else { 2091c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, 2092f1d2b4d3SLarry Finger false, false); 2093c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2094f1d2b4d3SLarry Finger true, 0x6); 2095f1d2b4d3SLarry Finger } 2096f1d2b4d3SLarry Finger } 2097f1d2b4d3SLarry Finger } 2098f1d2b4d3SLarry Finger 2099c6821613SYan-Hsuan Chuang static void btc8192e2ant_action_pan_edr(struct btc_coexist *btcoexist) 2100f1d2b4d3SLarry Finger { 2101c6821613SYan-Hsuan Chuang u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; 2102f1d2b4d3SLarry Finger u32 wifi_bw; 2103f1d2b4d3SLarry Finger 2104c6821613SYan-Hsuan Chuang wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0); 2105c6821613SYan-Hsuan Chuang bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42); 2106f1d2b4d3SLarry Finger 2107c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1); 2108c6821613SYan-Hsuan Chuang btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); 2109f1d2b4d3SLarry Finger 2110c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); 2111f1d2b4d3SLarry Finger 2112c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); 2113f1d2b4d3SLarry Finger 2114c6821613SYan-Hsuan Chuang if ((bt_rssi_state == BTC_RSSI_STATE_LOW) || 2115c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { 2116c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 2117c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5); 2118c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) || 2119c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) { 2120c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2); 2121c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1); 2122c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) || 2123c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2124c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4); 2125c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1); 2126f1d2b4d3SLarry Finger } 2127f1d2b4d3SLarry Finger 2128f1d2b4d3SLarry Finger /* sw mechanism */ 2129f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); 2130f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) { 2131c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2132c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2133c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, false, 2134f1d2b4d3SLarry Finger false, false); 2135c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2136f1d2b4d3SLarry Finger false, 0x18); 2137f1d2b4d3SLarry Finger } else { 2138c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, false, 2139f1d2b4d3SLarry Finger false, false); 2140c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2141f1d2b4d3SLarry Finger false, 0x18); 2142f1d2b4d3SLarry Finger } 2143f1d2b4d3SLarry Finger } else { 2144c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2145c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2146c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, 2147f1d2b4d3SLarry Finger false, false); 2148c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2149f1d2b4d3SLarry Finger false, 0x18); 2150f1d2b4d3SLarry Finger } else { 2151c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, 2152f1d2b4d3SLarry Finger false, false); 2153c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2154f1d2b4d3SLarry Finger false, 0x18); 2155f1d2b4d3SLarry Finger } 2156f1d2b4d3SLarry Finger } 2157f1d2b4d3SLarry Finger } 2158f1d2b4d3SLarry Finger 2159f1d2b4d3SLarry Finger /* PAN(HS) only */ 2160c6821613SYan-Hsuan Chuang static void btc8192e2ant_action_pan_hs(struct btc_coexist *btcoexist) 2161f1d2b4d3SLarry Finger { 2162c6821613SYan-Hsuan Chuang u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; 2163f1d2b4d3SLarry Finger u32 wifi_bw; 2164f1d2b4d3SLarry Finger 2165c6821613SYan-Hsuan Chuang wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0); 2166c6821613SYan-Hsuan Chuang bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42); 2167f1d2b4d3SLarry Finger 2168c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1); 2169c6821613SYan-Hsuan Chuang btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); 2170f1d2b4d3SLarry Finger 2171c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); 2172f1d2b4d3SLarry Finger 2173c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); 2174f1d2b4d3SLarry Finger 2175c6821613SYan-Hsuan Chuang if ((bt_rssi_state == BTC_RSSI_STATE_LOW) || 2176c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { 2177c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 2178c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) || 2179c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) { 2180c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2); 2181c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) || 2182c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2183c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4); 2184f1d2b4d3SLarry Finger } 2185c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1); 2186f1d2b4d3SLarry Finger 2187f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); 2188f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) { 2189c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2190c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2191c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, false, 2192f1d2b4d3SLarry Finger false, false); 2193c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2194f1d2b4d3SLarry Finger false, 0x18); 2195f1d2b4d3SLarry Finger } else { 2196c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, false, 2197f1d2b4d3SLarry Finger false, false); 2198c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2199f1d2b4d3SLarry Finger false, 0x18); 2200f1d2b4d3SLarry Finger } 2201f1d2b4d3SLarry Finger } else { 2202c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2203c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2204c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, 2205f1d2b4d3SLarry Finger false, false); 2206c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2207f1d2b4d3SLarry Finger false, 0x18); 2208f1d2b4d3SLarry Finger } else { 2209c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, 2210f1d2b4d3SLarry Finger false, false); 2211c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2212f1d2b4d3SLarry Finger false, 0x18); 2213f1d2b4d3SLarry Finger } 2214f1d2b4d3SLarry Finger } 2215f1d2b4d3SLarry Finger } 2216f1d2b4d3SLarry Finger 2217f1d2b4d3SLarry Finger /* PAN(EDR)+A2DP */ 2218c6821613SYan-Hsuan Chuang static void btc8192e2ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist) 2219f1d2b4d3SLarry Finger { 2220c6821613SYan-Hsuan Chuang u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; 2221f1d2b4d3SLarry Finger u32 wifi_bw; 2222f1d2b4d3SLarry Finger 2223c6821613SYan-Hsuan Chuang wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0); 2224c6821613SYan-Hsuan Chuang bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42); 2225f1d2b4d3SLarry Finger 2226c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1); 2227c6821613SYan-Hsuan Chuang btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); 2228f1d2b4d3SLarry Finger 2229c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); 2230f1d2b4d3SLarry Finger 2231c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2); 2232f1d2b4d3SLarry Finger 2233f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); 2234f1d2b4d3SLarry Finger 2235c6821613SYan-Hsuan Chuang if ((bt_rssi_state == BTC_RSSI_STATE_LOW) || 2236c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { 2237c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 2238c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, false, true, 3); 2239c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) || 2240c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) { 2241c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2); 2242c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, false, false, 3); 2243c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) || 2244c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2245c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4); 2246c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, false, false, 3); 2247f1d2b4d3SLarry Finger } 2248f1d2b4d3SLarry Finger 2249f1d2b4d3SLarry Finger /* sw mechanism */ 2250f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) { 2251c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2252c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2253c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, false, 2254f1d2b4d3SLarry Finger false, false); 2255c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2256f1d2b4d3SLarry Finger false, 0x18); 2257f1d2b4d3SLarry Finger } else { 2258c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, false, 2259f1d2b4d3SLarry Finger false, false); 2260c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2261f1d2b4d3SLarry Finger false, 0x18); 2262f1d2b4d3SLarry Finger } 2263f1d2b4d3SLarry Finger } else { 2264c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2265c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2266c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, 2267f1d2b4d3SLarry Finger false, false); 2268c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2269f1d2b4d3SLarry Finger false, 0x18); 2270f1d2b4d3SLarry Finger } else { 2271c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, false, 2272f1d2b4d3SLarry Finger false, false); 2273c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2274f1d2b4d3SLarry Finger false, 0x18); 2275f1d2b4d3SLarry Finger } 2276f1d2b4d3SLarry Finger } 2277f1d2b4d3SLarry Finger } 2278f1d2b4d3SLarry Finger 2279c6821613SYan-Hsuan Chuang static void btc8192e2ant_action_pan_edr_hid(struct btc_coexist *btcoexist) 2280f1d2b4d3SLarry Finger { 2281c6821613SYan-Hsuan Chuang u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; 2282f1d2b4d3SLarry Finger u32 wifi_bw; 2283f1d2b4d3SLarry Finger 2284c6821613SYan-Hsuan Chuang wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0); 2285c6821613SYan-Hsuan Chuang bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42); 2286f1d2b4d3SLarry Finger 2287f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); 2288f1d2b4d3SLarry Finger 2289c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1); 2290c6821613SYan-Hsuan Chuang btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); 2291f1d2b4d3SLarry Finger 2292c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); 2293f1d2b4d3SLarry Finger 2294c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3); 2295f1d2b4d3SLarry Finger 2296c6821613SYan-Hsuan Chuang if ((bt_rssi_state == BTC_RSSI_STATE_LOW) || 2297c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { 2298c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 2299c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14); 2300c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) || 2301c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) { 2302c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2); 2303c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10); 2304c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) || 2305c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2306c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4); 2307c6821613SYan-Hsuan Chuang btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, 2308f1d2b4d3SLarry Finger true, 10); 2309f1d2b4d3SLarry Finger } 2310f1d2b4d3SLarry Finger 2311f1d2b4d3SLarry Finger /* sw mechanism */ 2312f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) { 2313c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2314c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2315c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, true, 2316f1d2b4d3SLarry Finger false, false); 2317c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2318f1d2b4d3SLarry Finger false, 0x18); 2319f1d2b4d3SLarry Finger } else { 2320c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, true, 2321f1d2b4d3SLarry Finger false, false); 2322c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2323f1d2b4d3SLarry Finger false, 0x18); 2324f1d2b4d3SLarry Finger } 2325f1d2b4d3SLarry Finger } else { 2326c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2327c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2328c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, true, 2329f1d2b4d3SLarry Finger false, false); 2330c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2331f1d2b4d3SLarry Finger false, 0x18); 2332f1d2b4d3SLarry Finger } else { 2333c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, true, 2334f1d2b4d3SLarry Finger false, false); 2335c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2336f1d2b4d3SLarry Finger false, 0x18); 2337f1d2b4d3SLarry Finger } 2338f1d2b4d3SLarry Finger } 2339f1d2b4d3SLarry Finger } 2340f1d2b4d3SLarry Finger 2341f1d2b4d3SLarry Finger /* HID+A2DP+PAN(EDR) */ 2342f1d2b4d3SLarry Finger static void btc8192e2ant_action_hid_a2dp_pan_edr(struct btc_coexist *btcoexist) 2343f1d2b4d3SLarry Finger { 2344c6821613SYan-Hsuan Chuang u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; 2345f1d2b4d3SLarry Finger u32 wifi_bw; 2346f1d2b4d3SLarry Finger 2347c6821613SYan-Hsuan Chuang wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0); 2348c6821613SYan-Hsuan Chuang bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42); 2349f1d2b4d3SLarry Finger 2350c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1); 2351c6821613SYan-Hsuan Chuang btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); 2352f1d2b4d3SLarry Finger 2353c6821613SYan-Hsuan Chuang btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); 2354f1d2b4d3SLarry Finger 2355f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); 2356f1d2b4d3SLarry Finger 2357c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3); 2358f1d2b4d3SLarry Finger 2359c6821613SYan-Hsuan Chuang if ((bt_rssi_state == BTC_RSSI_STATE_LOW) || 2360c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { 2361c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 2362c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, true, true, 3); 2363c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) || 2364c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) { 2365c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2); 2366c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, true, false, 3); 2367c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) || 2368c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2369c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4); 2370c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, true, false, 3); 2371f1d2b4d3SLarry Finger } 2372f1d2b4d3SLarry Finger 2373f1d2b4d3SLarry Finger /* sw mechanism */ 2374f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) { 2375c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2376c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2377c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, true, 2378f1d2b4d3SLarry Finger false, false); 2379c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2380f1d2b4d3SLarry Finger false, 0x18); 2381f1d2b4d3SLarry Finger } else { 2382c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, true, 2383f1d2b4d3SLarry Finger false, false); 2384c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2385f1d2b4d3SLarry Finger false, 0x18); 2386f1d2b4d3SLarry Finger } 2387f1d2b4d3SLarry Finger } else { 2388c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2389c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2390c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, true, 2391f1d2b4d3SLarry Finger false, false); 2392c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2393f1d2b4d3SLarry Finger false, 0x18); 2394f1d2b4d3SLarry Finger } else { 2395c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, true, 2396f1d2b4d3SLarry Finger false, false); 2397c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2398f1d2b4d3SLarry Finger false, 0x18); 2399f1d2b4d3SLarry Finger } 2400f1d2b4d3SLarry Finger } 2401f1d2b4d3SLarry Finger } 2402f1d2b4d3SLarry Finger 2403c6821613SYan-Hsuan Chuang static void btc8192e2ant_action_hid_a2dp(struct btc_coexist *btcoexist) 2404f1d2b4d3SLarry Finger { 2405c6821613SYan-Hsuan Chuang u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH; 2406f1d2b4d3SLarry Finger u32 wifi_bw; 2407f1d2b4d3SLarry Finger 2408c6821613SYan-Hsuan Chuang wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0); 2409c6821613SYan-Hsuan Chuang bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42); 2410f1d2b4d3SLarry Finger 2411c6821613SYan-Hsuan Chuang btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1); 2412c6821613SYan-Hsuan Chuang btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8); 2413f1d2b4d3SLarry Finger 2414f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); 2415f1d2b4d3SLarry Finger 2416c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3); 2417f1d2b4d3SLarry Finger 2418c6821613SYan-Hsuan Chuang if ((bt_rssi_state == BTC_RSSI_STATE_LOW) || 2419c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) { 2420c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0); 2421c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, true, true, 2); 2422c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) || 2423c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) { 2424c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2); 2425c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, true, false, 2); 2426c6821613SYan-Hsuan Chuang } else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) || 2427c6821613SYan-Hsuan Chuang (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2428c6821613SYan-Hsuan Chuang btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4); 2429c6821613SYan-Hsuan Chuang btc8192e2ant_tdma_duration_adjust(btcoexist, true, false, 2); 2430f1d2b4d3SLarry Finger } 2431f1d2b4d3SLarry Finger 2432f1d2b4d3SLarry Finger /* sw mechanism */ 2433f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) { 2434c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2435c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2436c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, true, 2437f1d2b4d3SLarry Finger false, false); 2438c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2439f1d2b4d3SLarry Finger false, 0x18); 2440f1d2b4d3SLarry Finger } else { 2441c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, true, true, 2442f1d2b4d3SLarry Finger false, false); 2443c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2444f1d2b4d3SLarry Finger false, 0x18); 2445f1d2b4d3SLarry Finger } 2446f1d2b4d3SLarry Finger } else { 2447c6821613SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) || 2448c6821613SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) { 2449c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, true, 2450f1d2b4d3SLarry Finger false, false); 2451c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, true, false, 2452f1d2b4d3SLarry Finger false, 0x18); 2453f1d2b4d3SLarry Finger } else { 2454c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism1(btcoexist, false, true, 2455f1d2b4d3SLarry Finger false, false); 2456c6821613SYan-Hsuan Chuang btc8192e2ant_sw_mechanism2(btcoexist, false, false, 2457f1d2b4d3SLarry Finger false, 0x18); 2458f1d2b4d3SLarry Finger } 2459f1d2b4d3SLarry Finger } 2460f1d2b4d3SLarry Finger } 2461f1d2b4d3SLarry Finger 2462c6821613SYan-Hsuan Chuang static void btc8192e2ant_run_coexist_mechanism(struct btc_coexist *btcoexist) 2463f1d2b4d3SLarry Finger { 2464d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 2465f1d2b4d3SLarry Finger u8 algorithm = 0; 2466f1d2b4d3SLarry Finger 2467d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2468f1d2b4d3SLarry Finger "[BTCoex], RunCoexistMechanism()===>\n"); 2469f1d2b4d3SLarry Finger 2470f1d2b4d3SLarry Finger if (btcoexist->manual_control) { 2471d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2472f1d2b4d3SLarry Finger "[BTCoex], return for Manual CTRL <===\n"); 2473f1d2b4d3SLarry Finger return; 2474f1d2b4d3SLarry Finger } 2475f1d2b4d3SLarry Finger 2476f1d2b4d3SLarry Finger if (coex_sta->under_ips) { 2477d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2478f1d2b4d3SLarry Finger "[BTCoex], wifi is under IPS !!!\n"); 2479f1d2b4d3SLarry Finger return; 2480f1d2b4d3SLarry Finger } 2481f1d2b4d3SLarry Finger 2482c6821613SYan-Hsuan Chuang algorithm = btc8192e2ant_action_algorithm(btcoexist); 2483f1d2b4d3SLarry Finger if (coex_sta->c2h_bt_inquiry_page && 2484f1d2b4d3SLarry Finger (BT_8192E_2ANT_COEX_ALGO_PANHS != algorithm)) { 2485d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2486f1d2b4d3SLarry Finger "[BTCoex], BT is under inquiry/page scan !!\n"); 2487c6821613SYan-Hsuan Chuang btc8192e2ant_action_bt_inquiry(btcoexist); 2488f1d2b4d3SLarry Finger return; 2489f1d2b4d3SLarry Finger } 2490f1d2b4d3SLarry Finger 2491f1d2b4d3SLarry Finger coex_dm->cur_algorithm = algorithm; 2492d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2493f1d2b4d3SLarry Finger "[BTCoex], Algorithm = %d\n", coex_dm->cur_algorithm); 2494f1d2b4d3SLarry Finger 2495c6821613SYan-Hsuan Chuang if (btc8192e2ant_is_common_action(btcoexist)) { 2496d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2497466414a0SJoe Perches "[BTCoex], Action 2-Ant common\n"); 2498f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust = false; 2499f1d2b4d3SLarry Finger } else { 2500f1d2b4d3SLarry Finger if (coex_dm->cur_algorithm != coex_dm->pre_algorithm) { 2501d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2502f1d2b4d3SLarry Finger "[BTCoex] preAlgorithm=%d, curAlgorithm=%d\n", 2503f1d2b4d3SLarry Finger coex_dm->pre_algorithm, 2504f1d2b4d3SLarry Finger coex_dm->cur_algorithm); 2505f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust = false; 2506f1d2b4d3SLarry Finger } 2507f1d2b4d3SLarry Finger switch (coex_dm->cur_algorithm) { 2508f1d2b4d3SLarry Finger case BT_8192E_2ANT_COEX_ALGO_SCO: 2509d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2510466414a0SJoe Perches "Action 2-Ant, algorithm = SCO\n"); 2511c6821613SYan-Hsuan Chuang btc8192e2ant_action_sco(btcoexist); 2512f1d2b4d3SLarry Finger break; 2513f1d2b4d3SLarry Finger case BT_8192E_2ANT_COEX_ALGO_SCO_PAN: 2514d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2515466414a0SJoe Perches "Action 2-Ant, algorithm = SCO+PAN(EDR)\n"); 2516c6821613SYan-Hsuan Chuang btc8192e2ant_action_sco_pan(btcoexist); 2517f1d2b4d3SLarry Finger break; 2518f1d2b4d3SLarry Finger case BT_8192E_2ANT_COEX_ALGO_HID: 2519d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2520466414a0SJoe Perches "Action 2-Ant, algorithm = HID\n"); 2521c6821613SYan-Hsuan Chuang btc8192e2ant_action_hid(btcoexist); 2522f1d2b4d3SLarry Finger break; 2523f1d2b4d3SLarry Finger case BT_8192E_2ANT_COEX_ALGO_A2DP: 2524d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2525466414a0SJoe Perches "Action 2-Ant, algorithm = A2DP\n"); 2526c6821613SYan-Hsuan Chuang btc8192e2ant_action_a2dp(btcoexist); 2527f1d2b4d3SLarry Finger break; 2528f1d2b4d3SLarry Finger case BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS: 2529d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2530466414a0SJoe Perches "Action 2-Ant, algorithm = A2DP+PAN(HS)\n"); 2531c6821613SYan-Hsuan Chuang btc8192e2ant_action_a2dp_pan_hs(btcoexist); 2532f1d2b4d3SLarry Finger break; 2533f1d2b4d3SLarry Finger case BT_8192E_2ANT_COEX_ALGO_PANEDR: 2534d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2535466414a0SJoe Perches "Action 2-Ant, algorithm = PAN(EDR)\n"); 2536c6821613SYan-Hsuan Chuang btc8192e2ant_action_pan_edr(btcoexist); 2537f1d2b4d3SLarry Finger break; 2538f1d2b4d3SLarry Finger case BT_8192E_2ANT_COEX_ALGO_PANHS: 2539d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2540466414a0SJoe Perches "Action 2-Ant, algorithm = HS mode\n"); 2541c6821613SYan-Hsuan Chuang btc8192e2ant_action_pan_hs(btcoexist); 2542f1d2b4d3SLarry Finger break; 2543f1d2b4d3SLarry Finger case BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP: 2544d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2545466414a0SJoe Perches "Action 2-Ant, algorithm = PAN+A2DP\n"); 2546c6821613SYan-Hsuan Chuang btc8192e2ant_action_pan_edr_a2dp(btcoexist); 2547f1d2b4d3SLarry Finger break; 2548f1d2b4d3SLarry Finger case BT_8192E_2ANT_COEX_ALGO_PANEDR_HID: 2549d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2550466414a0SJoe Perches "Action 2-Ant, algorithm = PAN(EDR)+HID\n"); 2551c6821613SYan-Hsuan Chuang btc8192e2ant_action_pan_edr_hid(btcoexist); 2552f1d2b4d3SLarry Finger break; 2553f1d2b4d3SLarry Finger case BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR: 2554d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2555466414a0SJoe Perches "Action 2-Ant, algorithm = HID+A2DP+PAN\n"); 2556f1d2b4d3SLarry Finger btc8192e2ant_action_hid_a2dp_pan_edr(btcoexist); 2557f1d2b4d3SLarry Finger break; 2558f1d2b4d3SLarry Finger case BT_8192E_2ANT_COEX_ALGO_HID_A2DP: 2559d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2560466414a0SJoe Perches "Action 2-Ant, algorithm = HID+A2DP\n"); 2561c6821613SYan-Hsuan Chuang btc8192e2ant_action_hid_a2dp(btcoexist); 2562f1d2b4d3SLarry Finger break; 2563f1d2b4d3SLarry Finger default: 2564d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2565f1d2b4d3SLarry Finger "Action 2-Ant, algorithm = unknown!!\n"); 2566c6821613SYan-Hsuan Chuang /* btc8192e2ant_coex_all_off(btcoexist); */ 2567f1d2b4d3SLarry Finger break; 2568f1d2b4d3SLarry Finger } 2569f1d2b4d3SLarry Finger coex_dm->pre_algorithm = coex_dm->cur_algorithm; 2570f1d2b4d3SLarry Finger } 2571f1d2b4d3SLarry Finger } 2572f1d2b4d3SLarry Finger 2573c6821613SYan-Hsuan Chuang static void btc8192e2ant_init_hwconfig(struct btc_coexist *btcoexist, 2574f1d2b4d3SLarry Finger bool backup) 2575f1d2b4d3SLarry Finger { 2576258b93ccSLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 2577f1d2b4d3SLarry Finger u16 u16tmp = 0; 2578f1d2b4d3SLarry Finger u8 u8tmp = 0; 2579f1d2b4d3SLarry Finger 2580258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2581f1d2b4d3SLarry Finger "[BTCoex], 2Ant Init HW Config!!\n"); 2582f1d2b4d3SLarry Finger 2583f1d2b4d3SLarry Finger if (backup) { 2584f1d2b4d3SLarry Finger /* backup rf 0x1e value */ 2585f1d2b4d3SLarry Finger coex_dm->bt_rf0x1e_backup = 2586f1d2b4d3SLarry Finger btcoexist->btc_get_rf_reg(btcoexist, BTC_RF_A, 2587f1d2b4d3SLarry Finger 0x1e, 0xfffff); 2588f1d2b4d3SLarry Finger 2589f1d2b4d3SLarry Finger coex_dm->backup_arfr_cnt1 = btcoexist->btc_read_4byte(btcoexist, 2590f1d2b4d3SLarry Finger 0x430); 2591f1d2b4d3SLarry Finger coex_dm->backup_arfr_cnt2 = btcoexist->btc_read_4byte(btcoexist, 2592f1d2b4d3SLarry Finger 0x434); 2593c6821613SYan-Hsuan Chuang coex_dm->backup_retry_limit = btcoexist->btc_read_2byte( 2594f1d2b4d3SLarry Finger btcoexist, 2595f1d2b4d3SLarry Finger 0x42a); 2596f1d2b4d3SLarry Finger coex_dm->backup_ampdu_maxtime = btcoexist->btc_read_1byte( 2597f1d2b4d3SLarry Finger btcoexist, 2598f1d2b4d3SLarry Finger 0x456); 2599f1d2b4d3SLarry Finger } 2600f1d2b4d3SLarry Finger 2601f1d2b4d3SLarry Finger /* antenna sw ctrl to bt */ 2602f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x4f, 0x6); 2603f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x944, 0x24); 2604f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x930, 0x700700); 2605f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x20); 2606f1d2b4d3SLarry Finger if (btcoexist->chip_interface == BTC_INTF_USB) 2607f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30430004); 2608f1d2b4d3SLarry Finger else 2609f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30030004); 2610f1d2b4d3SLarry Finger 2611c6821613SYan-Hsuan Chuang btc8192e2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0); 2612f1d2b4d3SLarry Finger 2613f1d2b4d3SLarry Finger /* antenna switch control parameter */ 2614f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x858, 0x55555555); 2615f1d2b4d3SLarry Finger 2616f1d2b4d3SLarry Finger /* coex parameters */ 2617f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3); 2618f1d2b4d3SLarry Finger /* 0x790[5:0] = 0x5 */ 2619f1d2b4d3SLarry Finger u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x790); 2620f1d2b4d3SLarry Finger u8tmp &= 0xc0; 2621f1d2b4d3SLarry Finger u8tmp |= 0x5; 2622f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x790, u8tmp); 2623f1d2b4d3SLarry Finger 2624f1d2b4d3SLarry Finger /* enable counter statistics */ 2625f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4); 2626f1d2b4d3SLarry Finger 2627f1d2b4d3SLarry Finger /* enable PTA */ 2628f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x40, 0x20); 2629f1d2b4d3SLarry Finger /* enable mailbox interface */ 2630f1d2b4d3SLarry Finger u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x40); 2631f1d2b4d3SLarry Finger u16tmp |= BIT9; 2632f1d2b4d3SLarry Finger btcoexist->btc_write_2byte(btcoexist, 0x40, u16tmp); 2633f1d2b4d3SLarry Finger 2634f1d2b4d3SLarry Finger /* enable PTA I2C mailbox */ 2635f1d2b4d3SLarry Finger u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x101); 2636f1d2b4d3SLarry Finger u8tmp |= BIT4; 2637f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x101, u8tmp); 2638f1d2b4d3SLarry Finger 2639f1d2b4d3SLarry Finger /* enable bt clock when wifi is disabled. */ 2640f1d2b4d3SLarry Finger u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x93); 2641f1d2b4d3SLarry Finger u8tmp |= BIT0; 2642f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x93, u8tmp); 2643f1d2b4d3SLarry Finger /* enable bt clock when suspend. */ 2644f1d2b4d3SLarry Finger u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x7); 2645f1d2b4d3SLarry Finger u8tmp |= BIT0; 2646f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x7, u8tmp); 2647f1d2b4d3SLarry Finger } 2648f1d2b4d3SLarry Finger 2649f1d2b4d3SLarry Finger /************************************************************ 2650c6821613SYan-Hsuan Chuang * extern function start with ex_btc8192e2ant_ 2651f1d2b4d3SLarry Finger ************************************************************/ 2652f1d2b4d3SLarry Finger 2653c6821613SYan-Hsuan Chuang void ex_btc8192e2ant_init_hwconfig(struct btc_coexist *btcoexist) 2654f1d2b4d3SLarry Finger { 2655c6821613SYan-Hsuan Chuang btc8192e2ant_init_hwconfig(btcoexist, true); 2656f1d2b4d3SLarry Finger } 2657f1d2b4d3SLarry Finger 2658c6821613SYan-Hsuan Chuang void ex_btc8192e2ant_init_coex_dm(struct btc_coexist *btcoexist) 2659f1d2b4d3SLarry Finger { 2660258b93ccSLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 2661258b93ccSLarry Finger 2662258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2663f1d2b4d3SLarry Finger "[BTCoex], Coex Mechanism Init!!\n"); 2664c6821613SYan-Hsuan Chuang btc8192e2ant_init_coex_dm(btcoexist); 2665f1d2b4d3SLarry Finger } 2666f1d2b4d3SLarry Finger 266708431b62SPing-Ke Shih void ex_btc8192e2ant_display_coex_info(struct btc_coexist *btcoexist, 266808431b62SPing-Ke Shih struct seq_file *m) 2669f1d2b4d3SLarry Finger { 2670f1d2b4d3SLarry Finger struct btc_board_info *board_info = &btcoexist->board_info; 2671f1d2b4d3SLarry Finger struct btc_stack_info *stack_info = &btcoexist->stack_info; 2672f1d2b4d3SLarry Finger u8 u8tmp[4], i, bt_info_ext, ps_tdma_case = 0; 2673f1d2b4d3SLarry Finger u16 u16tmp[4]; 2674f1d2b4d3SLarry Finger u32 u32tmp[4]; 2675f1d2b4d3SLarry Finger bool roam = false, scan = false, link = false, wifi_under_5g = false; 2676c6821613SYan-Hsuan Chuang bool bt_hs_on = false, wifi_busy = false; 2677c6821613SYan-Hsuan Chuang int wifi_rssi = 0, bt_hs_rssi = 0; 2678f1d2b4d3SLarry Finger u32 wifi_bw, wifi_traffic_dir; 2679f1d2b4d3SLarry Finger u8 wifi_dot11_chnl, wifi_hs_chnl; 2680f1d2b4d3SLarry Finger u32 fw_ver = 0, bt_patch_ver = 0; 2681f1d2b4d3SLarry Finger 268208431b62SPing-Ke Shih seq_puts(m, "\n ============[BT Coexist info]============"); 2683f1d2b4d3SLarry Finger 2684f1d2b4d3SLarry Finger if (btcoexist->manual_control) { 268508431b62SPing-Ke Shih seq_puts(m, "\n ===========[Under Manual Control]==========="); 268608431b62SPing-Ke Shih seq_puts(m, "\n =========================================="); 2687f1d2b4d3SLarry Finger } 2688f1d2b4d3SLarry Finger 268908431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", 2690f1d2b4d3SLarry Finger board_info->pg_ant_num, board_info->btdm_ant_num); 2691f1d2b4d3SLarry Finger 269208431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %s / %d", "BT stack/ hci ext ver", 2693f1d2b4d3SLarry Finger ((stack_info->profile_notified) ? "Yes" : "No"), 2694f1d2b4d3SLarry Finger stack_info->hci_version); 2695f1d2b4d3SLarry Finger 2696f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver); 2697f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver); 269808431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)", 2699f1d2b4d3SLarry Finger "CoexVer/ FwVer/ PatchVer", 2700f1d2b4d3SLarry Finger glcoex_ver_date_8192e_2ant, glcoex_ver_8192e_2ant, 2701f1d2b4d3SLarry Finger fw_ver, bt_patch_ver, bt_patch_ver); 2702f1d2b4d3SLarry Finger 2703c6821613SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); 2704f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL, 2705f1d2b4d3SLarry Finger &wifi_dot11_chnl); 2706f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl); 270708431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d / %d(%d)", 2708f1d2b4d3SLarry Finger "Dot11 channel / HsMode(HsChnl)", 2709c6821613SYan-Hsuan Chuang wifi_dot11_chnl, bt_hs_on, wifi_hs_chnl); 2710f1d2b4d3SLarry Finger 271108431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %3ph ", 271268ec5810SAndy Shevchenko "H2C Wifi inform bt chnl Info", coex_dm->wifi_chnl_info); 2713f1d2b4d3SLarry Finger 2714c6821613SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi); 2715f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi); 271608431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d", 2717c6821613SYan-Hsuan Chuang "Wifi rssi/ HS rssi", wifi_rssi, bt_hs_rssi); 2718f1d2b4d3SLarry Finger 2719f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan); 2720f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link); 2721f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam); 272208431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d/ %d ", 2723f1d2b4d3SLarry Finger "Wifi link/ roam/ scan", link, roam, scan); 2724f1d2b4d3SLarry Finger 2725f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g); 2726f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); 2727f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); 2728f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, 2729f1d2b4d3SLarry Finger &wifi_traffic_dir); 273008431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %s / %s/ %s ", 2731f1d2b4d3SLarry Finger "Wifi status", (wifi_under_5g ? "5G" : "2.4G"), 2732f1d2b4d3SLarry Finger ((BTC_WIFI_BW_LEGACY == wifi_bw) ? "Legacy" : 2733f1d2b4d3SLarry Finger (((BTC_WIFI_BW_HT40 == wifi_bw) ? "HT40" : "HT20"))), 2734f1d2b4d3SLarry Finger ((!wifi_busy) ? "idle" : 2735f1d2b4d3SLarry Finger ((BTC_WIFI_TRAFFIC_TX == wifi_traffic_dir) ? 2736f1d2b4d3SLarry Finger "uplink" : "downlink"))); 2737f1d2b4d3SLarry Finger 273808431b62SPing-Ke Shih seq_printf(m, "\n %-35s = [%s/ %d/ %d] ", 2739f1d2b4d3SLarry Finger "BT [status/ rssi/ retryCnt]", 2740f1d2b4d3SLarry Finger ((btcoexist->bt_info.bt_disabled) ? ("disabled") : 2741f1d2b4d3SLarry Finger ((coex_sta->c2h_bt_inquiry_page) ? 2742f1d2b4d3SLarry Finger ("inquiry/page scan") : 2743f1d2b4d3SLarry Finger ((BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE == 2744f1d2b4d3SLarry Finger coex_dm->bt_status) ? "non-connected idle" : 2745f1d2b4d3SLarry Finger ((BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE == 2746f1d2b4d3SLarry Finger coex_dm->bt_status) ? "connected-idle" : "busy")))), 2747f1d2b4d3SLarry Finger coex_sta->bt_rssi, coex_sta->bt_retry_cnt); 2748f1d2b4d3SLarry Finger 274908431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d / %d / %d / %d", 2750f1d2b4d3SLarry Finger "SCO/HID/PAN/A2DP", stack_info->sco_exist, 2751f1d2b4d3SLarry Finger stack_info->hid_exist, stack_info->pan_exist, 2752f1d2b4d3SLarry Finger stack_info->a2dp_exist); 275308431b62SPing-Ke Shih btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO, m); 2754f1d2b4d3SLarry Finger 2755f1d2b4d3SLarry Finger bt_info_ext = coex_sta->bt_info_ext; 275608431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %s", 2757f1d2b4d3SLarry Finger "BT Info A2DP rate", 2758f1d2b4d3SLarry Finger (bt_info_ext&BIT0) ? "Basic rate" : "EDR rate"); 2759f1d2b4d3SLarry Finger 2760f1d2b4d3SLarry Finger for (i = 0; i < BT_INFO_SRC_8192E_2ANT_MAX; i++) { 2761f1d2b4d3SLarry Finger if (coex_sta->bt_info_c2h_cnt[i]) { 276208431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %7ph(%d)", 2763c6821613SYan-Hsuan Chuang glbt_info_src_8192e_2ant[i], 276468ec5810SAndy Shevchenko coex_sta->bt_info_c2h[i], 2765f1d2b4d3SLarry Finger coex_sta->bt_info_c2h_cnt[i]); 2766f1d2b4d3SLarry Finger } 2767f1d2b4d3SLarry Finger } 2768f1d2b4d3SLarry Finger 276908431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %s/%s", 2770f1d2b4d3SLarry Finger "PS state, IPS/LPS", 2771f1d2b4d3SLarry Finger ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")), 2772f1d2b4d3SLarry Finger ((coex_sta->under_lps ? "LPS ON" : "LPS OFF"))); 277308431b62SPing-Ke Shih btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m); 2774f1d2b4d3SLarry Finger 277508431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x ", "SS Type", 2776c6821613SYan-Hsuan Chuang coex_dm->cur_ss_type); 2777f1d2b4d3SLarry Finger 2778f1d2b4d3SLarry Finger /* Sw mechanism */ 277908431b62SPing-Ke Shih seq_printf(m, "\n %-35s", 2780f1d2b4d3SLarry Finger "============[Sw mechanism]============"); 278108431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d/ %d ", 2782f1d2b4d3SLarry Finger "SM1[ShRf/ LpRA/ LimDig]", coex_dm->cur_rf_rx_lpf_shrink, 2783f1d2b4d3SLarry Finger coex_dm->cur_low_penalty_ra, coex_dm->limited_dig); 278408431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d/ %d(0x%x) ", 2785f1d2b4d3SLarry Finger "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]", 2786f1d2b4d3SLarry Finger coex_dm->cur_agc_table_en, coex_dm->cur_adc_back_off, 2787f1d2b4d3SLarry Finger coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl); 2788f1d2b4d3SLarry Finger 278908431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x ", "Rate Mask", 2790f1d2b4d3SLarry Finger btcoexist->bt_info.ra_mask); 2791f1d2b4d3SLarry Finger 2792f1d2b4d3SLarry Finger /* Fw mechanism */ 279308431b62SPing-Ke Shih seq_printf(m, "\n %-35s", 2794f1d2b4d3SLarry Finger "============[Fw mechanism]============"); 2795f1d2b4d3SLarry Finger 2796f1d2b4d3SLarry Finger ps_tdma_case = coex_dm->cur_ps_tdma; 279708431b62SPing-Ke Shih seq_printf(m, 279808431b62SPing-Ke Shih "\n %-35s = %5ph case-%d (auto:%d)", 279968ec5810SAndy Shevchenko "PS TDMA", coex_dm->ps_tdma_para, 2800f1d2b4d3SLarry Finger ps_tdma_case, coex_dm->auto_tdma_adjust); 2801f1d2b4d3SLarry Finger 280208431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d ", 2803f1d2b4d3SLarry Finger "DecBtPwr/ IgnWlanAct", 2804f1d2b4d3SLarry Finger coex_dm->cur_dec_bt_pwr, coex_dm->cur_ignore_wlan_act); 2805f1d2b4d3SLarry Finger 2806f1d2b4d3SLarry Finger /* Hw setting */ 280708431b62SPing-Ke Shih seq_printf(m, "\n %-35s", 2808f1d2b4d3SLarry Finger "============[Hw setting]============"); 2809f1d2b4d3SLarry Finger 281008431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x", 2811f1d2b4d3SLarry Finger "RF-A, 0x1e initVal", coex_dm->bt_rf0x1e_backup); 2812f1d2b4d3SLarry Finger 281308431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x", 2814f1d2b4d3SLarry Finger "backup ARFR1/ARFR2/RL/AMaxTime", coex_dm->backup_arfr_cnt1, 2815c6821613SYan-Hsuan Chuang coex_dm->backup_arfr_cnt2, coex_dm->backup_retry_limit, 2816f1d2b4d3SLarry Finger coex_dm->backup_ampdu_maxtime); 2817f1d2b4d3SLarry Finger 2818f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430); 2819f1d2b4d3SLarry Finger u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434); 2820f1d2b4d3SLarry Finger u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a); 2821f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456); 282208431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x", 2823f1d2b4d3SLarry Finger "0x430/0x434/0x42a/0x456", 2824f1d2b4d3SLarry Finger u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]); 2825f1d2b4d3SLarry Finger 2826f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc04); 2827f1d2b4d3SLarry Finger u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xd04); 2828f1d2b4d3SLarry Finger u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x90c); 282908431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x", 2830f1d2b4d3SLarry Finger "0xc04/ 0xd04/ 0x90c", u32tmp[0], u32tmp[1], u32tmp[2]); 2831f1d2b4d3SLarry Finger 2832f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778); 283308431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x", "0x778", u8tmp[0]); 2834f1d2b4d3SLarry Finger 2835f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x92c); 2836f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x930); 283708431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x", 2838f1d2b4d3SLarry Finger "0x92c/ 0x930", (u8tmp[0]), u32tmp[0]); 2839f1d2b4d3SLarry Finger 2840f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40); 2841f1d2b4d3SLarry Finger u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x4f); 284208431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x", 2843f1d2b4d3SLarry Finger "0x40/ 0x4f", u8tmp[0], u8tmp[1]); 2844f1d2b4d3SLarry Finger 2845f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550); 2846f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522); 284708431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x", 2848f1d2b4d3SLarry Finger "0x550(bcn ctrl)/0x522", u32tmp[0], u8tmp[0]); 2849f1d2b4d3SLarry Finger 2850f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50); 285108431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x", "0xc50(dig)", 2852f1d2b4d3SLarry Finger u32tmp[0]); 2853f1d2b4d3SLarry Finger 2854f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0); 2855f1d2b4d3SLarry Finger u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4); 2856f1d2b4d3SLarry Finger u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8); 2857f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc); 285808431b62SPing-Ke Shih seq_printf(m, 285908431b62SPing-Ke Shih "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", 2860f1d2b4d3SLarry Finger "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)", 2861f1d2b4d3SLarry Finger u32tmp[0], u32tmp[1], u32tmp[2], u8tmp[0]); 2862f1d2b4d3SLarry Finger 286308431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d", 2864f1d2b4d3SLarry Finger "0x770(hp rx[31:16]/tx[15:0])", 2865f1d2b4d3SLarry Finger coex_sta->high_priority_rx, coex_sta->high_priority_tx); 286608431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d", 2867f1d2b4d3SLarry Finger "0x774(lp rx[31:16]/tx[15:0])", 2868f1d2b4d3SLarry Finger coex_sta->low_priority_rx, coex_sta->low_priority_tx); 2869436e9c1bSLarry Finger if (btcoexist->auto_report_2ant) 2870c6821613SYan-Hsuan Chuang btc8192e2ant_monitor_bt_ctr(btcoexist); 287108431b62SPing-Ke Shih btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m); 2872f1d2b4d3SLarry Finger } 2873f1d2b4d3SLarry Finger 2874c6821613SYan-Hsuan Chuang void ex_btc8192e2ant_ips_notify(struct btc_coexist *btcoexist, u8 type) 2875f1d2b4d3SLarry Finger { 2876258b93ccSLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 2877258b93ccSLarry Finger 2878f1d2b4d3SLarry Finger if (BTC_IPS_ENTER == type) { 2879258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2880f1d2b4d3SLarry Finger "[BTCoex], IPS ENTER notify\n"); 2881f1d2b4d3SLarry Finger coex_sta->under_ips = true; 2882c6821613SYan-Hsuan Chuang btc8192e2ant_coex_all_off(btcoexist); 2883f1d2b4d3SLarry Finger } else if (BTC_IPS_LEAVE == type) { 2884258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2885f1d2b4d3SLarry Finger "[BTCoex], IPS LEAVE notify\n"); 2886f1d2b4d3SLarry Finger coex_sta->under_ips = false; 2887f1d2b4d3SLarry Finger } 2888f1d2b4d3SLarry Finger } 2889f1d2b4d3SLarry Finger 2890c6821613SYan-Hsuan Chuang void ex_btc8192e2ant_lps_notify(struct btc_coexist *btcoexist, u8 type) 2891f1d2b4d3SLarry Finger { 2892258b93ccSLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 2893258b93ccSLarry Finger 2894f1d2b4d3SLarry Finger if (BTC_LPS_ENABLE == type) { 2895258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2896f1d2b4d3SLarry Finger "[BTCoex], LPS ENABLE notify\n"); 2897f1d2b4d3SLarry Finger coex_sta->under_lps = true; 2898f1d2b4d3SLarry Finger } else if (BTC_LPS_DISABLE == type) { 2899258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2900f1d2b4d3SLarry Finger "[BTCoex], LPS DISABLE notify\n"); 2901f1d2b4d3SLarry Finger coex_sta->under_lps = false; 2902f1d2b4d3SLarry Finger } 2903f1d2b4d3SLarry Finger } 2904f1d2b4d3SLarry Finger 2905c6821613SYan-Hsuan Chuang void ex_btc8192e2ant_scan_notify(struct btc_coexist *btcoexist, u8 type) 2906f1d2b4d3SLarry Finger { 2907258b93ccSLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 2908258b93ccSLarry Finger 2909f1d2b4d3SLarry Finger if (BTC_SCAN_START == type) 2910258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2911f1d2b4d3SLarry Finger "[BTCoex], SCAN START notify\n"); 2912f1d2b4d3SLarry Finger else if (BTC_SCAN_FINISH == type) 2913258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2914f1d2b4d3SLarry Finger "[BTCoex], SCAN FINISH notify\n"); 2915f1d2b4d3SLarry Finger } 2916f1d2b4d3SLarry Finger 2917c6821613SYan-Hsuan Chuang void ex_btc8192e2ant_connect_notify(struct btc_coexist *btcoexist, u8 type) 2918f1d2b4d3SLarry Finger { 2919258b93ccSLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 2920258b93ccSLarry Finger 2921f1d2b4d3SLarry Finger if (BTC_ASSOCIATE_START == type) 2922258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2923f1d2b4d3SLarry Finger "[BTCoex], CONNECT START notify\n"); 2924f1d2b4d3SLarry Finger else if (BTC_ASSOCIATE_FINISH == type) 2925258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2926f1d2b4d3SLarry Finger "[BTCoex], CONNECT FINISH notify\n"); 2927f1d2b4d3SLarry Finger } 2928f1d2b4d3SLarry Finger 2929c6821613SYan-Hsuan Chuang void ex_btc8192e2ant_media_status_notify(struct btc_coexist *btcoexist, 2930f1d2b4d3SLarry Finger u8 type) 2931f1d2b4d3SLarry Finger { 2932d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 2933f1d2b4d3SLarry Finger u8 h2c_parameter[3] = {0}; 2934f1d2b4d3SLarry Finger u32 wifi_bw; 2935f1d2b4d3SLarry Finger u8 wifi_center_chnl; 2936f1d2b4d3SLarry Finger 2937f1d2b4d3SLarry Finger if (btcoexist->manual_control || 2938f1d2b4d3SLarry Finger btcoexist->stop_coex_dm || 2939f1d2b4d3SLarry Finger btcoexist->bt_info.bt_disabled) 2940f1d2b4d3SLarry Finger return; 2941f1d2b4d3SLarry Finger 2942f1d2b4d3SLarry Finger if (BTC_MEDIA_CONNECT == type) 2943258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2944f1d2b4d3SLarry Finger "[BTCoex], MEDIA connect notify\n"); 2945f1d2b4d3SLarry Finger else 2946258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2947f1d2b4d3SLarry Finger "[BTCoex], MEDIA disconnect notify\n"); 2948f1d2b4d3SLarry Finger 2949f1d2b4d3SLarry Finger /* only 2.4G we need to inform bt the chnl mask */ 2950f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, 2951f1d2b4d3SLarry Finger &wifi_center_chnl); 2952f1d2b4d3SLarry Finger if ((BTC_MEDIA_CONNECT == type) && 2953f1d2b4d3SLarry Finger (wifi_center_chnl <= 14)) { 2954f1d2b4d3SLarry Finger h2c_parameter[0] = 0x1; 2955f1d2b4d3SLarry Finger h2c_parameter[1] = wifi_center_chnl; 2956f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); 2957f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) 2958f1d2b4d3SLarry Finger h2c_parameter[2] = 0x30; 2959f1d2b4d3SLarry Finger else 2960f1d2b4d3SLarry Finger h2c_parameter[2] = 0x20; 2961f1d2b4d3SLarry Finger } 2962f1d2b4d3SLarry Finger 2963f1d2b4d3SLarry Finger coex_dm->wifi_chnl_info[0] = h2c_parameter[0]; 2964f1d2b4d3SLarry Finger coex_dm->wifi_chnl_info[1] = h2c_parameter[1]; 2965f1d2b4d3SLarry Finger coex_dm->wifi_chnl_info[2] = h2c_parameter[2]; 2966f1d2b4d3SLarry Finger 2967d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2968f1d2b4d3SLarry Finger "[BTCoex], FW write 0x66 = 0x%x\n", 2969f1d2b4d3SLarry Finger h2c_parameter[0] << 16 | h2c_parameter[1] << 8 | 2970f1d2b4d3SLarry Finger h2c_parameter[2]); 2971f1d2b4d3SLarry Finger 2972f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter); 2973f1d2b4d3SLarry Finger } 2974f1d2b4d3SLarry Finger 2975c6821613SYan-Hsuan Chuang void ex_btc8192e2ant_special_packet_notify(struct btc_coexist *btcoexist, 2976f1d2b4d3SLarry Finger u8 type) 2977f1d2b4d3SLarry Finger { 2978258b93ccSLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 2979258b93ccSLarry Finger 2980f1d2b4d3SLarry Finger if (type == BTC_PACKET_DHCP) 2981258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 2982f1d2b4d3SLarry Finger "[BTCoex], DHCP Packet notify\n"); 2983f1d2b4d3SLarry Finger } 2984f1d2b4d3SLarry Finger 2985c6821613SYan-Hsuan Chuang void ex_btc8192e2ant_bt_info_notify(struct btc_coexist *btcoexist, 2986f1d2b4d3SLarry Finger u8 *tmp_buf, u8 length) 2987f1d2b4d3SLarry Finger { 2988d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 2989f1d2b4d3SLarry Finger u8 bt_info = 0; 2990f1d2b4d3SLarry Finger u8 i, rsp_source = 0; 2991f1d2b4d3SLarry Finger bool bt_busy = false, limited_dig = false; 2992f1d2b4d3SLarry Finger bool wifi_connected = false; 2993f1d2b4d3SLarry Finger 2994f1d2b4d3SLarry Finger coex_sta->c2h_bt_info_req_sent = false; 2995f1d2b4d3SLarry Finger 2996f1d2b4d3SLarry Finger rsp_source = tmp_buf[0] & 0xf; 2997f1d2b4d3SLarry Finger if (rsp_source >= BT_INFO_SRC_8192E_2ANT_MAX) 2998f1d2b4d3SLarry Finger rsp_source = BT_INFO_SRC_8192E_2ANT_WIFI_FW; 2999f1d2b4d3SLarry Finger coex_sta->bt_info_c2h_cnt[rsp_source]++; 3000f1d2b4d3SLarry Finger 3001258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3002f1d2b4d3SLarry Finger "[BTCoex], Bt info[%d], length=%d, hex data = [", 3003f1d2b4d3SLarry Finger rsp_source, length); 3004f1d2b4d3SLarry Finger for (i = 0; i < length; i++) { 3005f1d2b4d3SLarry Finger coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i]; 3006f1d2b4d3SLarry Finger if (i == 1) 3007f1d2b4d3SLarry Finger bt_info = tmp_buf[i]; 3008f1d2b4d3SLarry Finger if (i == length-1) 3009258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3010f1d2b4d3SLarry Finger "0x%02x]\n", tmp_buf[i]); 3011f1d2b4d3SLarry Finger else 3012258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3013f1d2b4d3SLarry Finger "0x%02x, ", tmp_buf[i]); 3014f1d2b4d3SLarry Finger } 3015f1d2b4d3SLarry Finger 3016f1d2b4d3SLarry Finger if (BT_INFO_SRC_8192E_2ANT_WIFI_FW != rsp_source) { 3017c6821613SYan-Hsuan Chuang /* [3:0] */ 3018c6821613SYan-Hsuan Chuang coex_sta->bt_retry_cnt = 3019f1d2b4d3SLarry Finger coex_sta->bt_info_c2h[rsp_source][2] & 0xf; 3020f1d2b4d3SLarry Finger 3021f1d2b4d3SLarry Finger coex_sta->bt_rssi = 3022f1d2b4d3SLarry Finger coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10; 3023f1d2b4d3SLarry Finger 3024f1d2b4d3SLarry Finger coex_sta->bt_info_ext = 3025f1d2b4d3SLarry Finger coex_sta->bt_info_c2h[rsp_source][4]; 3026f1d2b4d3SLarry Finger 3027f1d2b4d3SLarry Finger /* Here we need to resend some wifi info to BT 3028f1d2b4d3SLarry Finger * because bt is reset and loss of the info. 3029f1d2b4d3SLarry Finger */ 3030f1d2b4d3SLarry Finger if ((coex_sta->bt_info_ext & BIT1)) { 3031d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3032f1d2b4d3SLarry Finger "bit1, send wifi BW&Chnl to BT!!\n"); 3033f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, 3034f1d2b4d3SLarry Finger &wifi_connected); 3035f1d2b4d3SLarry Finger if (wifi_connected) 3036c6821613SYan-Hsuan Chuang ex_btc8192e2ant_media_status_notify( 3037f1d2b4d3SLarry Finger btcoexist, 3038f1d2b4d3SLarry Finger BTC_MEDIA_CONNECT); 3039f1d2b4d3SLarry Finger else 3040c6821613SYan-Hsuan Chuang ex_btc8192e2ant_media_status_notify( 3041f1d2b4d3SLarry Finger btcoexist, 3042f1d2b4d3SLarry Finger BTC_MEDIA_DISCONNECT); 3043f1d2b4d3SLarry Finger } 3044f1d2b4d3SLarry Finger 3045f1d2b4d3SLarry Finger if ((coex_sta->bt_info_ext & BIT3)) { 3046f1d2b4d3SLarry Finger if (!btcoexist->manual_control && 3047f1d2b4d3SLarry Finger !btcoexist->stop_coex_dm) { 3048d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3049f1d2b4d3SLarry Finger "bit3, BT NOT ignore Wlan active!\n"); 3050c6821613SYan-Hsuan Chuang btc8192e2ant_ignore_wlan_act(btcoexist, 3051f1d2b4d3SLarry Finger FORCE_EXEC, 3052f1d2b4d3SLarry Finger false); 3053f1d2b4d3SLarry Finger } 3054f1d2b4d3SLarry Finger } else { 3055f1d2b4d3SLarry Finger /* BT already NOT ignore Wlan active, 3056f1d2b4d3SLarry Finger * do nothing here. 3057f1d2b4d3SLarry Finger */ 3058f1d2b4d3SLarry Finger } 3059f1d2b4d3SLarry Finger 3060436e9c1bSLarry Finger if (!btcoexist->auto_report_2ant) { 3061436e9c1bSLarry Finger if (!(coex_sta->bt_info_ext & BIT4)) 3062436e9c1bSLarry Finger btc8192e2ant_bt_auto_report(btcoexist, 3063436e9c1bSLarry Finger FORCE_EXEC, 3064f1d2b4d3SLarry Finger true); 3065f1d2b4d3SLarry Finger } 3066f1d2b4d3SLarry Finger } 3067f1d2b4d3SLarry Finger 3068f1d2b4d3SLarry Finger /* check BIT2 first ==> check if bt is under inquiry or page scan */ 3069f1d2b4d3SLarry Finger if (bt_info & BT_INFO_8192E_2ANT_B_INQ_PAGE) 3070f1d2b4d3SLarry Finger coex_sta->c2h_bt_inquiry_page = true; 3071f1d2b4d3SLarry Finger else 3072f1d2b4d3SLarry Finger coex_sta->c2h_bt_inquiry_page = false; 3073f1d2b4d3SLarry Finger 3074f1d2b4d3SLarry Finger /* set link exist status */ 3075f1d2b4d3SLarry Finger if (!(bt_info&BT_INFO_8192E_2ANT_B_CONNECTION)) { 3076f1d2b4d3SLarry Finger coex_sta->bt_link_exist = false; 3077f1d2b4d3SLarry Finger coex_sta->pan_exist = false; 3078f1d2b4d3SLarry Finger coex_sta->a2dp_exist = false; 3079f1d2b4d3SLarry Finger coex_sta->hid_exist = false; 3080f1d2b4d3SLarry Finger coex_sta->sco_exist = false; 3081f1d2b4d3SLarry Finger } else {/* connection exists */ 3082f1d2b4d3SLarry Finger coex_sta->bt_link_exist = true; 3083f1d2b4d3SLarry Finger if (bt_info & BT_INFO_8192E_2ANT_B_FTP) 3084f1d2b4d3SLarry Finger coex_sta->pan_exist = true; 3085f1d2b4d3SLarry Finger else 3086f1d2b4d3SLarry Finger coex_sta->pan_exist = false; 3087f1d2b4d3SLarry Finger if (bt_info & BT_INFO_8192E_2ANT_B_A2DP) 3088f1d2b4d3SLarry Finger coex_sta->a2dp_exist = true; 3089f1d2b4d3SLarry Finger else 3090f1d2b4d3SLarry Finger coex_sta->a2dp_exist = false; 3091f1d2b4d3SLarry Finger if (bt_info & BT_INFO_8192E_2ANT_B_HID) 3092f1d2b4d3SLarry Finger coex_sta->hid_exist = true; 3093f1d2b4d3SLarry Finger else 3094f1d2b4d3SLarry Finger coex_sta->hid_exist = false; 3095f1d2b4d3SLarry Finger if (bt_info & BT_INFO_8192E_2ANT_B_SCO_ESCO) 3096f1d2b4d3SLarry Finger coex_sta->sco_exist = true; 3097f1d2b4d3SLarry Finger else 3098f1d2b4d3SLarry Finger coex_sta->sco_exist = false; 3099f1d2b4d3SLarry Finger } 3100f1d2b4d3SLarry Finger 3101c6821613SYan-Hsuan Chuang btc8192e2ant_update_bt_link_info(btcoexist); 3102f1d2b4d3SLarry Finger 3103f1d2b4d3SLarry Finger if (!(bt_info & BT_INFO_8192E_2ANT_B_CONNECTION)) { 3104f1d2b4d3SLarry Finger coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE; 3105d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3106f1d2b4d3SLarry Finger "[BTCoex], BT Non-Connected idle!!!\n"); 3107f1d2b4d3SLarry Finger } else if (bt_info == BT_INFO_8192E_2ANT_B_CONNECTION) { 3108f1d2b4d3SLarry Finger coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE; 3109d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3110f1d2b4d3SLarry Finger "[BTCoex], bt_infoNotify(), BT Connected-idle!!!\n"); 3111f1d2b4d3SLarry Finger } else if ((bt_info & BT_INFO_8192E_2ANT_B_SCO_ESCO) || 3112f1d2b4d3SLarry Finger (bt_info & BT_INFO_8192E_2ANT_B_SCO_BUSY)) { 3113f1d2b4d3SLarry Finger coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_SCO_BUSY; 3114d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3115f1d2b4d3SLarry Finger "[BTCoex], bt_infoNotify(), BT SCO busy!!!\n"); 3116f1d2b4d3SLarry Finger } else if (bt_info & BT_INFO_8192E_2ANT_B_ACL_BUSY) { 3117f1d2b4d3SLarry Finger coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_ACL_BUSY; 3118d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3119f1d2b4d3SLarry Finger "[BTCoex], bt_infoNotify(), BT ACL busy!!!\n"); 3120f1d2b4d3SLarry Finger } else { 3121f1d2b4d3SLarry Finger coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_MAX; 3122d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3123f1d2b4d3SLarry Finger "[BTCoex]bt_infoNotify(), BT Non-Defined state!!!\n"); 3124f1d2b4d3SLarry Finger } 3125f1d2b4d3SLarry Finger 3126f1d2b4d3SLarry Finger if ((BT_8192E_2ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) || 3127f1d2b4d3SLarry Finger (BT_8192E_2ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) || 3128f1d2b4d3SLarry Finger (BT_8192E_2ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) { 3129f1d2b4d3SLarry Finger bt_busy = true; 3130f1d2b4d3SLarry Finger limited_dig = true; 3131f1d2b4d3SLarry Finger } else { 3132f1d2b4d3SLarry Finger bt_busy = false; 3133f1d2b4d3SLarry Finger limited_dig = false; 3134f1d2b4d3SLarry Finger } 3135f1d2b4d3SLarry Finger 3136f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy); 3137f1d2b4d3SLarry Finger 3138f1d2b4d3SLarry Finger coex_dm->limited_dig = limited_dig; 3139f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig); 3140f1d2b4d3SLarry Finger 3141c6821613SYan-Hsuan Chuang btc8192e2ant_run_coexist_mechanism(btcoexist); 3142f1d2b4d3SLarry Finger } 3143f1d2b4d3SLarry Finger 31447937f02dSYan-Hsuan Chuang void ex_btc8192e2ant_halt_notify(struct btc_coexist *btcoexist) 3145f1d2b4d3SLarry Finger { 3146258b93ccSLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 3147258b93ccSLarry Finger 3148258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Halt notify\n"); 3149f1d2b4d3SLarry Finger 3150c6821613SYan-Hsuan Chuang btc8192e2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true); 3151c6821613SYan-Hsuan Chuang ex_btc8192e2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT); 3152f1d2b4d3SLarry Finger } 3153f1d2b4d3SLarry Finger 3154c6821613SYan-Hsuan Chuang void ex_btc8192e2ant_periodical(struct btc_coexist *btcoexist) 3155f1d2b4d3SLarry Finger { 3156d46fa3e4SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter; 3157f1d2b4d3SLarry Finger static u8 dis_ver_info_cnt; 3158f1d2b4d3SLarry Finger u32 fw_ver = 0, bt_patch_ver = 0; 3159f1d2b4d3SLarry Finger struct btc_board_info *board_info = &btcoexist->board_info; 3160f1d2b4d3SLarry Finger struct btc_stack_info *stack_info = &btcoexist->stack_info; 3161f1d2b4d3SLarry Finger 3162d46fa3e4SLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3163f1d2b4d3SLarry Finger "=======================Periodical=======================\n"); 3164f1d2b4d3SLarry Finger if (dis_ver_info_cnt <= 5) { 3165f1d2b4d3SLarry Finger dis_ver_info_cnt += 1; 3166258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3167f1d2b4d3SLarry Finger "************************************************\n"); 3168258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3169f1d2b4d3SLarry Finger "Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n", 3170f1d2b4d3SLarry Finger board_info->pg_ant_num, board_info->btdm_ant_num, 3171f1d2b4d3SLarry Finger board_info->btdm_ant_pos); 3172258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3173f1d2b4d3SLarry Finger "BT stack/ hci ext ver = %s / %d\n", 3174f1d2b4d3SLarry Finger ((stack_info->profile_notified) ? "Yes" : "No"), 3175f1d2b4d3SLarry Finger stack_info->hci_version); 3176f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, 3177f1d2b4d3SLarry Finger &bt_patch_ver); 3178f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver); 3179258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3180f1d2b4d3SLarry Finger "CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", 3181f1d2b4d3SLarry Finger glcoex_ver_date_8192e_2ant, glcoex_ver_8192e_2ant, 3182f1d2b4d3SLarry Finger fw_ver, bt_patch_ver, bt_patch_ver); 3183258b93ccSLarry Finger RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 3184f1d2b4d3SLarry Finger "************************************************\n"); 3185f1d2b4d3SLarry Finger } 3186f1d2b4d3SLarry Finger 3187436e9c1bSLarry Finger if (!btcoexist->auto_report_2ant) { 3188c6821613SYan-Hsuan Chuang btc8192e2ant_query_bt_info(btcoexist); 3189c6821613SYan-Hsuan Chuang btc8192e2ant_monitor_bt_ctr(btcoexist); 3190c6821613SYan-Hsuan Chuang btc8192e2ant_monitor_bt_enable_disable(btcoexist); 3191436e9c1bSLarry Finger } else { 3192c6821613SYan-Hsuan Chuang if (btc8192e2ant_is_wifi_status_changed(btcoexist) || 3193f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust) 3194c6821613SYan-Hsuan Chuang btc8192e2ant_run_coexist_mechanism(btcoexist); 3195436e9c1bSLarry Finger } 3196f1d2b4d3SLarry Finger } 3197