1 /* ************************************************************
4 * This file is for RTL8192E Co-exist mechanism
7 * 2012/11/15 Cosa first check in.
9 * ************************************************************ */
11 /* ************************************************************
13 * ************************************************************ */
14 #include "mp_precomp.h"
17 #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
19 #if (RTL8192E_SUPPORT == 1)
20 /* ************************************************************
21 * Global variables, these are static variables
22 * ************************************************************ */
23 static u8 *trace_buf = &gl_btc_trace_buf[0];
24 static struct coex_dm_8192e_2ant glcoex_dm_8192e_2ant;
25 static struct coex_dm_8192e_2ant *coex_dm = &glcoex_dm_8192e_2ant;
26 static struct coex_sta_8192e_2ant glcoex_sta_8192e_2ant;
27 static struct coex_sta_8192e_2ant *coex_sta = &glcoex_sta_8192e_2ant;
29 const char *const glbt_info_src_8192e_2ant[] = {
32 "BT Info[bt auto report]",
34 /* ************************************************************
35 * BtCoex Version Format:
36 * 1. date : glcoex_ver_date_XXXXX_1ant
37 * 2. WifiCoexVersion : glcoex_ver_XXXX_1ant
38 * 3. BtCoexVersion : glcoex_ver_btdesired_XXXXX_1ant
39 * 4. others : glcoex_ver_XXXXXX_XXXXX_1ant
41 * Variable should be indicated IC and Antenna numbers !!!
42 * Please strictly follow this order and naming style !!!
44 * ************************************************************ */
45 u32 glcoex_ver_date_8192e_2ant = 20161024;
46 u32 glcoex_ver_8192e_2ant = 0x45;
47 u32 glcoex_ver_btdesired_8192e_2ant = 0x03;
48 /*1.BT FW update BLE channel map with high priority*/
49 /* ************************************************************
50 * local function proto type if needed
51 * ************************************************************
52 * ************************************************************
53 * local function start with halbtc8192e2ant_
54 * ************************************************************ */
55 u8 halbtc8192e2ant_bt_rssi_state(u8 level_num, u8 rssi_thresh, u8 rssi_thresh1)
58 u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;
60 bt_rssi = coex_sta->bt_rssi;
63 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
64 (coex_sta->pre_bt_rssi_state ==
65 BTC_RSSI_STATE_STAY_LOW)) {
66 if (bt_rssi >= (rssi_thresh +
67 BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))
68 bt_rssi_state = BTC_RSSI_STATE_HIGH;
70 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
72 if (bt_rssi < rssi_thresh)
73 bt_rssi_state = BTC_RSSI_STATE_LOW;
75 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
77 } else if (level_num == 3) {
78 if (rssi_thresh > rssi_thresh1) {
79 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
80 "[BTCoex], BT Rssi thresh error!!\n");
82 return coex_sta->pre_bt_rssi_state;
85 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
86 (coex_sta->pre_bt_rssi_state ==
87 BTC_RSSI_STATE_STAY_LOW)) {
88 if (bt_rssi >= (rssi_thresh +
89 BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))
90 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
92 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
93 } else if ((coex_sta->pre_bt_rssi_state ==
94 BTC_RSSI_STATE_MEDIUM) ||
95 (coex_sta->pre_bt_rssi_state ==
96 BTC_RSSI_STATE_STAY_MEDIUM)) {
97 if (bt_rssi >= (rssi_thresh1 +
98 BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))
99 bt_rssi_state = BTC_RSSI_STATE_HIGH;
100 else if (bt_rssi < rssi_thresh)
101 bt_rssi_state = BTC_RSSI_STATE_LOW;
103 bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
105 if (bt_rssi < rssi_thresh1)
106 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
108 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
112 coex_sta->pre_bt_rssi_state = bt_rssi_state;
114 return bt_rssi_state;
117 u8 halbtc8192e2ant_wifi_rssi_state(IN struct btc_coexist *btcoexist,
118 IN u8 index, IN u8 level_num, IN u8 rssi_thresh, IN u8 rssi_thresh1)
121 u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
123 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
125 if (level_num == 2) {
126 if ((coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW)
128 (coex_sta->pre_wifi_rssi_state[index] ==
129 BTC_RSSI_STATE_STAY_LOW)) {
130 if (wifi_rssi >= (rssi_thresh +
131 BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))
132 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
134 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
136 if (wifi_rssi < rssi_thresh)
137 wifi_rssi_state = BTC_RSSI_STATE_LOW;
139 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
141 } else if (level_num == 3) {
142 if (rssi_thresh > rssi_thresh1) {
143 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
144 "[BTCoex], wifi RSSI thresh error!!\n");
145 BTC_TRACE(trace_buf);
146 return coex_sta->pre_wifi_rssi_state[index];
149 if ((coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW)
151 (coex_sta->pre_wifi_rssi_state[index] ==
152 BTC_RSSI_STATE_STAY_LOW)) {
153 if (wifi_rssi >= (rssi_thresh +
154 BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))
155 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
157 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
158 } else if ((coex_sta->pre_wifi_rssi_state[index] ==
159 BTC_RSSI_STATE_MEDIUM) ||
160 (coex_sta->pre_wifi_rssi_state[index] ==
161 BTC_RSSI_STATE_STAY_MEDIUM)) {
162 if (wifi_rssi >= (rssi_thresh1 +
163 BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))
164 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
165 else if (wifi_rssi < rssi_thresh)
166 wifi_rssi_state = BTC_RSSI_STATE_LOW;
168 wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
170 if (wifi_rssi < rssi_thresh1)
171 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
173 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
177 coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
179 return wifi_rssi_state;
182 void halbtc8192e2ant_monitor_bt_enable_disable(IN struct btc_coexist *btcoexist)
184 static u32 bt_disable_cnt = 0;
185 boolean bt_active = true, bt_disabled = false;
187 /* This function check if bt is disabled */
189 if (coex_sta->high_priority_tx == 0 &&
190 coex_sta->high_priority_rx == 0 &&
191 coex_sta->low_priority_tx == 0 &&
192 coex_sta->low_priority_rx == 0)
194 if (coex_sta->high_priority_tx == 0xffff &&
195 coex_sta->high_priority_rx == 0xffff &&
196 coex_sta->low_priority_tx == 0xffff &&
197 coex_sta->low_priority_rx == 0xffff)
202 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
204 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
205 "[BTCoex], BT is enabled !!\n");
206 BTC_TRACE(trace_buf);
209 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
210 "[BTCoex], bt all counters=0, %d times!!\n",
212 BTC_TRACE(trace_buf);
213 if (bt_disable_cnt >= 2) {
215 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
217 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
218 "[BTCoex], BT is disabled !!\n");
219 BTC_TRACE(trace_buf);
222 if (coex_sta->bt_disabled != bt_disabled) {
223 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
224 "[BTCoex], BT is from %s to %s!!\n",
225 (coex_sta->bt_disabled ? "disabled" : "enabled"),
226 (bt_disabled ? "disabled" : "enabled"));
227 BTC_TRACE(trace_buf);
228 coex_sta->bt_disabled = bt_disabled;
229 /* if (!bt_disabled) {
235 u32 halbtc8192e2ant_decide_ra_mask(IN struct btc_coexist *btcoexist,
236 IN u8 ss_type, IN u32 ra_mask_type)
238 u32 dis_ra_mask = 0x0;
240 switch (ra_mask_type) {
241 case 0: /* normal mode */
243 dis_ra_mask = 0x0; /* enable 2ss */
245 dis_ra_mask = 0xfff00000; /* disable 2ss */
247 case 1: /* disable cck 1/2 */
249 dis_ra_mask = 0x00000003; /* enable 2ss */
251 dis_ra_mask = 0xfff00003; /* disable 2ss */
253 case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
255 dis_ra_mask = 0x0001f1f7; /* enable 2ss */
257 dis_ra_mask = 0xfff1f1f7; /* disable 2ss */
266 void halbtc8192e2ant_update_ra_mask(IN struct btc_coexist *btcoexist,
267 IN boolean force_exec, IN u32 dis_rate_mask)
269 coex_dm->cur_ra_mask = dis_rate_mask;
271 if (force_exec || (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask))
272 btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK,
273 &coex_dm->cur_ra_mask);
274 coex_dm->pre_ra_mask = coex_dm->cur_ra_mask;
277 void halbtc8192e2ant_auto_rate_fallback_retry(IN struct btc_coexist *btcoexist,
278 IN boolean force_exec, IN u8 type)
280 boolean wifi_under_b_mode = false;
282 coex_dm->cur_arfr_type = type;
284 if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {
285 switch (coex_dm->cur_arfr_type) {
286 case 0: /* normal mode */
287 btcoexist->btc_write_4byte(btcoexist, 0x430,
288 coex_dm->backup_arfr_cnt1);
289 btcoexist->btc_write_4byte(btcoexist, 0x434,
290 coex_dm->backup_arfr_cnt2);
293 btcoexist->btc_get(btcoexist,
294 BTC_GET_BL_WIFI_UNDER_B_MODE,
296 if (wifi_under_b_mode) {
297 btcoexist->btc_write_4byte(btcoexist,
299 btcoexist->btc_write_4byte(btcoexist,
302 btcoexist->btc_write_4byte(btcoexist,
304 btcoexist->btc_write_4byte(btcoexist,
313 coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;
316 void halbtc8192e2ant_retry_limit(IN struct btc_coexist *btcoexist,
317 IN boolean force_exec, IN u8 type)
319 coex_dm->cur_retry_limit_type = type;
322 (coex_dm->pre_retry_limit_type !=
323 coex_dm->cur_retry_limit_type)) {
324 switch (coex_dm->cur_retry_limit_type) {
325 case 0: /* normal mode */
326 btcoexist->btc_write_2byte(btcoexist, 0x42a,
327 coex_dm->backup_retry_limit);
329 case 1: /* retry limit=8 */
330 btcoexist->btc_write_2byte(btcoexist, 0x42a,
338 coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;
341 void halbtc8192e2ant_ampdu_max_time(IN struct btc_coexist *btcoexist,
342 IN boolean force_exec, IN u8 type)
344 coex_dm->cur_ampdu_time_type = type;
347 (coex_dm->pre_ampdu_time_type != coex_dm->cur_ampdu_time_type)) {
348 switch (coex_dm->cur_ampdu_time_type) {
349 case 0: /* normal mode */
350 btcoexist->btc_write_1byte(btcoexist, 0x456,
351 coex_dm->backup_ampdu_max_time);
353 case 1: /* AMPDU timw = 0x38 * 32us */
354 btcoexist->btc_write_1byte(btcoexist, 0x456,
362 coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;
365 void halbtc8192e2ant_limited_tx(IN struct btc_coexist *btcoexist,
366 IN boolean force_exec, IN u8 ra_mask_type, IN u8 arfr_type,
367 IN u8 retry_limit_type, IN u8 ampdu_time_type)
369 u32 dis_ra_mask = 0x0;
371 coex_dm->cur_ra_mask_type = ra_mask_type;
372 dis_ra_mask = halbtc8192e2ant_decide_ra_mask(btcoexist,
373 coex_dm->cur_ss_type, ra_mask_type);
374 halbtc8192e2ant_update_ra_mask(btcoexist, force_exec, dis_ra_mask);
376 halbtc8192e2ant_auto_rate_fallback_retry(btcoexist, force_exec,
378 halbtc8192e2ant_retry_limit(btcoexist, force_exec, retry_limit_type);
379 halbtc8192e2ant_ampdu_max_time(btcoexist, force_exec, ampdu_time_type);
382 void halbtc8192e2ant_limited_rx(IN struct btc_coexist *btcoexist,
383 IN boolean force_exec, IN boolean rej_ap_agg_pkt,
384 IN boolean bt_ctrl_agg_buf_size, IN u8 agg_buf_size)
386 boolean reject_rx_agg = rej_ap_agg_pkt;
387 boolean bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
388 u8 rx_agg_size = agg_buf_size;
390 /* ============================================ */
391 /* Rx Aggregation related setting */
392 /* ============================================ */
393 btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
395 /* decide BT control aggregation buf size or not */
396 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
397 &bt_ctrl_rx_agg_size);
398 /* aggregation buf size, only work when BT control Rx aggregation size. */
399 btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
400 /* real update aggregation setting */
401 btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
406 void halbtc8192e2ant_monitor_bt_ctr(IN struct btc_coexist *btcoexist)
408 u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
409 u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
414 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
415 reg_hp_tx = u32tmp & MASKLWORD;
416 reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
418 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
419 reg_lp_tx = u32tmp & MASKLWORD;
420 reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
422 coex_sta->high_priority_tx = reg_hp_tx;
423 coex_sta->high_priority_rx = reg_hp_rx;
424 coex_sta->low_priority_tx = reg_lp_tx;
425 coex_sta->low_priority_rx = reg_lp_rx;
427 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
428 "[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
429 reg_hp_txrx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);
430 BTC_TRACE(trace_buf);
431 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
432 "[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
433 reg_lp_txrx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx);
434 BTC_TRACE(trace_buf);
437 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
441 void halbtc8192e2ant_monitor_wifi_ctr(IN struct btc_coexist *btcoexist)
445 coex_sta->crc_ok_cck =
446 btcoexist->btc_phydm_query_PHY_counter(
448 PHYDM_INFO_CRC32_OK_CCK);
449 coex_sta->crc_ok_11g =
450 btcoexist->btc_phydm_query_PHY_counter(
452 PHYDM_INFO_CRC32_OK_LEGACY);
453 coex_sta->crc_ok_11n =
454 btcoexist->btc_phydm_query_PHY_counter(
456 PHYDM_INFO_CRC32_OK_HT);
457 coex_sta->crc_ok_11n_vht =
458 btcoexist->btc_phydm_query_PHY_counter(
460 PHYDM_INFO_CRC32_OK_VHT);
462 coex_sta->crc_err_cck =
463 btcoexist->btc_phydm_query_PHY_counter(
465 PHYDM_INFO_CRC32_ERROR_CCK);
466 coex_sta->crc_err_11g =
467 btcoexist->btc_phydm_query_PHY_counter(
469 PHYDM_INFO_CRC32_ERROR_LEGACY);
470 coex_sta->crc_err_11n =
471 btcoexist->btc_phydm_query_PHY_counter(
473 PHYDM_INFO_CRC32_ERROR_HT);
474 coex_sta->crc_err_11n_vht =
475 btcoexist->btc_phydm_query_PHY_counter(
477 PHYDM_INFO_CRC32_ERROR_VHT);
483 void halbtc8192e2ant_query_bt_info(IN struct btc_coexist *btcoexist)
485 u8 h2c_parameter[1] = {0};
487 coex_sta->c2h_bt_info_req_sent = true;
489 h2c_parameter[0] |= BIT(0); /* trigger */
491 btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
493 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
494 "[BTCoex],Query BT info!!!! H2C 0x61 = 0x1\n");
495 BTC_TRACE(trace_buf);
498 boolean halbtc8192e2ant_is_wifi_status_changed(IN struct btc_coexist *btcoexist)
500 static boolean pre_wifi_busy = false, pre_under_4way = false,
501 pre_bt_hs_on = false;
502 boolean wifi_busy = false, under_4way = false, bt_hs_on = false;
503 boolean wifi_connected = false;
504 u8 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
507 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
509 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
510 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
511 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
514 if (wifi_connected) {
515 if (wifi_busy != pre_wifi_busy) {
516 pre_wifi_busy = wifi_busy;
519 if (under_4way != pre_under_4way) {
520 pre_under_4way = under_4way;
523 if (bt_hs_on != pre_bt_hs_on) {
524 pre_bt_hs_on = bt_hs_on;
528 wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0,
531 if ((BTC_RSSI_STATE_HIGH == wifi_rssi_state) ||
532 (BTC_RSSI_STATE_LOW == wifi_rssi_state))
539 void halbtc8192e2ant_update_bt_link_info(IN struct btc_coexist *btcoexist)
541 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
542 boolean bt_hs_on = false;
544 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
546 bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
547 bt_link_info->sco_exist = coex_sta->sco_exist;
548 bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
549 bt_link_info->pan_exist = coex_sta->pan_exist;
550 bt_link_info->hid_exist = coex_sta->hid_exist;
552 /* work around for HS mode. */
554 bt_link_info->pan_exist = true;
555 bt_link_info->bt_link_exist = true;
558 /* check if Sco only */
559 if (bt_link_info->sco_exist &&
560 !bt_link_info->a2dp_exist &&
561 !bt_link_info->pan_exist &&
562 !bt_link_info->hid_exist)
563 bt_link_info->sco_only = true;
565 bt_link_info->sco_only = false;
567 /* check if A2dp only */
568 if (!bt_link_info->sco_exist &&
569 bt_link_info->a2dp_exist &&
570 !bt_link_info->pan_exist &&
571 !bt_link_info->hid_exist)
572 bt_link_info->a2dp_only = true;
574 bt_link_info->a2dp_only = false;
576 /* check if Pan only */
577 if (!bt_link_info->sco_exist &&
578 !bt_link_info->a2dp_exist &&
579 bt_link_info->pan_exist &&
580 !bt_link_info->hid_exist)
581 bt_link_info->pan_only = true;
583 bt_link_info->pan_only = false;
585 /* check if Hid only */
586 if (!bt_link_info->sco_exist &&
587 !bt_link_info->a2dp_exist &&
588 !bt_link_info->pan_exist &&
589 bt_link_info->hid_exist)
590 bt_link_info->hid_only = true;
592 bt_link_info->hid_only = false;
595 u8 halbtc8192e2ant_action_algorithm(IN struct btc_coexist *btcoexist)
597 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
598 struct btc_stack_info *stack_info = &btcoexist->stack_info;
599 boolean bt_hs_on = false;
600 u8 algorithm = BT_8192E_2ANT_COEX_ALGO_UNDEFINED;
601 u8 num_of_diff_profile = 0;
603 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
605 if (!bt_link_info->bt_link_exist) {
606 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
607 "[BTCoex], No BT link exists!!!\n");
608 BTC_TRACE(trace_buf);
612 if (bt_link_info->sco_exist)
613 num_of_diff_profile++;
614 if (bt_link_info->hid_exist)
615 num_of_diff_profile++;
616 if (bt_link_info->pan_exist)
617 num_of_diff_profile++;
618 if (bt_link_info->a2dp_exist)
619 num_of_diff_profile++;
621 if (num_of_diff_profile == 1) {
622 if (bt_link_info->sco_exist) {
623 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
624 "[BTCoex], SCO only\n");
625 BTC_TRACE(trace_buf);
626 algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
628 if (bt_link_info->hid_exist) {
629 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
630 "[BTCoex], HID only\n");
631 BTC_TRACE(trace_buf);
632 algorithm = BT_8192E_2ANT_COEX_ALGO_HID;
633 } else if (bt_link_info->a2dp_exist) {
634 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
635 "[BTCoex], A2DP only\n");
636 BTC_TRACE(trace_buf);
637 algorithm = BT_8192E_2ANT_COEX_ALGO_A2DP;
638 } else if (bt_link_info->pan_exist) {
640 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
641 "[BTCoex], PAN(HS) only\n");
642 BTC_TRACE(trace_buf);
644 BT_8192E_2ANT_COEX_ALGO_PANHS;
646 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
647 "[BTCoex], PAN(EDR) only\n");
648 BTC_TRACE(trace_buf);
650 BT_8192E_2ANT_COEX_ALGO_PANEDR;
654 } else if (num_of_diff_profile == 2) {
655 if (bt_link_info->sco_exist) {
656 if (bt_link_info->hid_exist) {
657 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
658 "[BTCoex], SCO + HID\n");
659 BTC_TRACE(trace_buf);
660 algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
661 } else if (bt_link_info->a2dp_exist) {
662 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
663 "[BTCoex], SCO + A2DP ==> SCO\n");
664 BTC_TRACE(trace_buf);
665 algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
666 } else if (bt_link_info->pan_exist) {
668 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
669 "[BTCoex], SCO + PAN(HS)\n");
670 BTC_TRACE(trace_buf);
671 algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
673 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
674 "[BTCoex], SCO + PAN(EDR)\n");
675 BTC_TRACE(trace_buf);
677 BT_8192E_2ANT_COEX_ALGO_SCO_PAN;
681 if (bt_link_info->hid_exist &&
682 bt_link_info->a2dp_exist) {
683 if (stack_info->num_of_hid >= 2) {
684 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
685 "[BTCoex], HID*2 + A2DP\n");
686 BTC_TRACE(trace_buf);
688 BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
690 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
691 "[BTCoex], HID + A2DP\n");
692 BTC_TRACE(trace_buf);
694 BT_8192E_2ANT_COEX_ALGO_HID_A2DP;
696 } else if (bt_link_info->hid_exist &&
697 bt_link_info->pan_exist) {
699 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
700 "[BTCoex], HID + PAN(HS)\n");
701 BTC_TRACE(trace_buf);
702 algorithm = BT_8192E_2ANT_COEX_ALGO_HID;
704 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
705 "[BTCoex], HID + PAN(EDR)\n");
706 BTC_TRACE(trace_buf);
708 BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
710 } else if (bt_link_info->pan_exist &&
711 bt_link_info->a2dp_exist) {
713 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
714 "[BTCoex], A2DP + PAN(HS)\n");
715 BTC_TRACE(trace_buf);
717 BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS;
719 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
720 "[BTCoex], A2DP + PAN(EDR)\n");
721 BTC_TRACE(trace_buf);
723 BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP;
727 } else if (num_of_diff_profile == 3) {
728 if (bt_link_info->sco_exist) {
729 if (bt_link_info->hid_exist &&
730 bt_link_info->a2dp_exist) {
731 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
732 "[BTCoex], SCO + HID + A2DP ==> HID\n");
733 BTC_TRACE(trace_buf);
734 algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
735 } else if (bt_link_info->hid_exist &&
736 bt_link_info->pan_exist) {
738 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
739 "[BTCoex], SCO + HID + PAN(HS)\n");
740 BTC_TRACE(trace_buf);
741 algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
743 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
744 "[BTCoex], SCO + HID + PAN(EDR)\n");
745 BTC_TRACE(trace_buf);
747 BT_8192E_2ANT_COEX_ALGO_SCO_PAN;
749 } else if (bt_link_info->pan_exist &&
750 bt_link_info->a2dp_exist) {
752 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
753 "[BTCoex], SCO + A2DP + PAN(HS)\n");
754 BTC_TRACE(trace_buf);
755 algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
757 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
758 "[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n");
759 BTC_TRACE(trace_buf);
761 BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
765 if (bt_link_info->hid_exist &&
766 bt_link_info->pan_exist &&
767 bt_link_info->a2dp_exist) {
769 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
770 "[BTCoex], HID + A2DP + PAN(HS)\n");
771 BTC_TRACE(trace_buf);
773 BT_8192E_2ANT_COEX_ALGO_HID_A2DP;
775 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
776 "[BTCoex], HID + A2DP + PAN(EDR)\n");
777 BTC_TRACE(trace_buf);
779 BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
783 } else if (num_of_diff_profile >= 3) {
784 if (bt_link_info->sco_exist) {
785 if (bt_link_info->hid_exist &&
786 bt_link_info->pan_exist &&
787 bt_link_info->a2dp_exist) {
789 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
790 "[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n");
791 BTC_TRACE(trace_buf);
793 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
794 "[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");
795 BTC_TRACE(trace_buf);
797 BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
806 void halbtc8192e2ant_set_fw_dac_swing_level(IN struct btc_coexist *btcoexist,
809 u8 h2c_parameter[1] = {0};
811 /* There are several type of dacswing */
812 /* 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 */
813 h2c_parameter[0] = dac_swing_lvl;
815 btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);
818 void halbtc8192e2ant_set_fw_dec_bt_pwr(IN struct btc_coexist *btcoexist,
819 IN u8 dec_bt_pwr_lvl)
821 u8 h2c_parameter[1] = {0};
823 h2c_parameter[0] = dec_bt_pwr_lvl;
825 btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter);
828 void halbtc8192e2ant_dec_bt_pwr(IN struct btc_coexist *btcoexist,
829 IN boolean force_exec, IN u8 dec_bt_pwr_lvl)
831 coex_dm->cur_bt_dec_pwr_lvl = dec_bt_pwr_lvl;
834 #if 0 /* work around, avoid h2c command fail. */
835 if (coex_dm->pre_bt_dec_pwr_lvl == coex_dm->cur_bt_dec_pwr_lvl)
839 halbtc8192e2ant_set_fw_dec_bt_pwr(btcoexist,
840 coex_dm->cur_bt_dec_pwr_lvl);
842 coex_dm->pre_bt_dec_pwr_lvl = coex_dm->cur_bt_dec_pwr_lvl;
845 void halbtc8192e2ant_set_bt_auto_report(IN struct btc_coexist *btcoexist,
846 IN boolean enable_auto_report)
848 u8 h2c_parameter[1] = {0};
850 h2c_parameter[0] = 0;
852 if (enable_auto_report)
853 h2c_parameter[0] |= BIT(0);
855 btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
858 void halbtc8192e2ant_bt_auto_report(IN struct btc_coexist *btcoexist,
859 IN boolean force_exec, IN boolean enable_auto_report)
861 coex_dm->cur_bt_auto_report = enable_auto_report;
864 if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
867 halbtc8192e2ant_set_bt_auto_report(btcoexist,
868 coex_dm->cur_bt_auto_report);
870 coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
873 void halbtc8192e2ant_fw_dac_swing_lvl(IN struct btc_coexist *btcoexist,
874 IN boolean force_exec, IN u8 fw_dac_swing_lvl)
876 coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl;
879 if (coex_dm->pre_fw_dac_swing_lvl ==
880 coex_dm->cur_fw_dac_swing_lvl)
884 halbtc8192e2ant_set_fw_dac_swing_level(btcoexist,
885 coex_dm->cur_fw_dac_swing_lvl);
887 coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;
890 void halbtc8192e2ant_set_sw_rf_rx_lpf_corner(IN struct btc_coexist *btcoexist,
891 IN boolean rx_rf_shrink_on)
893 if (rx_rf_shrink_on) {
894 /* Shrink RF Rx LPF corner */
895 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
896 "[BTCoex], Shrink RF Rx LPF corner!!\n");
897 BTC_TRACE(trace_buf);
898 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e, 0xfffff,
901 /* Resume RF Rx LPF corner */
902 /* After initialized, we can use coex_dm->bt_rf_0x1e_backup */
903 if (btcoexist->initilized) {
904 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
905 "[BTCoex], Resume RF Rx LPF corner!!\n");
906 BTC_TRACE(trace_buf);
907 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
908 0xfffff, coex_dm->bt_rf_0x1e_backup);
913 void halbtc8192e2ant_rf_shrink(IN struct btc_coexist *btcoexist,
914 IN boolean force_exec, IN boolean rx_rf_shrink_on)
916 coex_dm->cur_rf_rx_lpf_shrink = rx_rf_shrink_on;
919 if (coex_dm->pre_rf_rx_lpf_shrink ==
920 coex_dm->cur_rf_rx_lpf_shrink)
923 halbtc8192e2ant_set_sw_rf_rx_lpf_corner(btcoexist,
924 coex_dm->cur_rf_rx_lpf_shrink);
926 coex_dm->pre_rf_rx_lpf_shrink = coex_dm->cur_rf_rx_lpf_shrink;
929 void halbtc8192e2ant_set_sw_penalty_tx_rate_adaptive(IN struct btc_coexist
930 *btcoexist, IN boolean low_penalty_ra)
932 u8 h2c_parameter[6] = {0};
934 h2c_parameter[0] = 0x6; /* op_code, 0x6= Retry_Penalty */
936 if (low_penalty_ra) {
937 h2c_parameter[1] |= BIT(0);
939 0x00; /* normal rate except MCS7/6/5, OFDM54/48/36 */
940 h2c_parameter[3] = 0xf7; /* MCS7 or OFDM54 */
941 h2c_parameter[4] = 0xf8; /* MCS6 or OFDM48 */
942 h2c_parameter[5] = 0xf9; /* MCS5 or OFDM36 */
945 btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
948 void halbtc8192e2ant_low_penalty_ra(IN struct btc_coexist *btcoexist,
949 IN boolean force_exec, IN boolean low_penalty_ra)
951 coex_dm->cur_low_penalty_ra = low_penalty_ra;
954 if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
957 halbtc8192e2ant_set_sw_penalty_tx_rate_adaptive(btcoexist,
958 coex_dm->cur_low_penalty_ra);
960 coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
963 void halbtc8192e2ant_set_dac_swing_reg(IN struct btc_coexist *btcoexist,
968 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
969 "[BTCoex], Write SwDacSwing = 0x%x\n", level);
970 BTC_TRACE(trace_buf);
971 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x883, 0x3e, val);
974 void halbtc8192e2ant_set_sw_full_time_dac_swing(IN struct btc_coexist
975 *btcoexist, IN boolean sw_dac_swing_on, IN u32 sw_dac_swing_lvl)
978 halbtc8192e2ant_set_dac_swing_reg(btcoexist, sw_dac_swing_lvl);
980 halbtc8192e2ant_set_dac_swing_reg(btcoexist, 0x18);
984 void halbtc8192e2ant_dac_swing(IN struct btc_coexist *btcoexist,
985 IN boolean force_exec, IN boolean dac_swing_on, IN u32 dac_swing_lvl)
987 coex_dm->cur_dac_swing_on = dac_swing_on;
988 coex_dm->cur_dac_swing_lvl = dac_swing_lvl;
991 if ((coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) &&
992 (coex_dm->pre_dac_swing_lvl ==
993 coex_dm->cur_dac_swing_lvl))
997 halbtc8192e2ant_set_sw_full_time_dac_swing(btcoexist, dac_swing_on,
1000 coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on;
1001 coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl;
1004 void halbtc8192e2ant_set_adc_back_off(IN struct btc_coexist *btcoexist,
1005 IN boolean adc_back_off)
1008 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1009 "[BTCoex], BB BackOff Level On!\n");
1010 BTC_TRACE(trace_buf);
1011 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xc05, 0x30, 0x3);
1013 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1014 "[BTCoex], BB BackOff Level Off!\n");
1015 BTC_TRACE(trace_buf);
1016 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xc05, 0x30, 0x1);
1020 void halbtc8192e2ant_adc_back_off(IN struct btc_coexist *btcoexist,
1021 IN boolean force_exec, IN boolean adc_back_off)
1023 coex_dm->cur_adc_back_off = adc_back_off;
1026 if (coex_dm->pre_adc_back_off == coex_dm->cur_adc_back_off)
1029 halbtc8192e2ant_set_adc_back_off(btcoexist, coex_dm->cur_adc_back_off);
1031 coex_dm->pre_adc_back_off = coex_dm->cur_adc_back_off;
1034 void halbtc8192e2ant_set_agc_table(IN struct btc_coexist *btcoexist,
1035 IN boolean agc_table_en)
1037 /* =================BB AGC Gain Table */
1039 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1040 "[BTCoex], BB Agc Table On!\n");
1041 BTC_TRACE(trace_buf);
1042 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x0a1A0001);
1043 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x091B0001);
1044 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x081C0001);
1045 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x071D0001);
1046 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x061E0001);
1047 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x051F0001);
1049 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1050 "[BTCoex], BB Agc Table Off!\n");
1051 BTC_TRACE(trace_buf);
1052 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xaa1A0001);
1053 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa91B0001);
1054 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa81C0001);
1055 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa71D0001);
1056 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa61E0001);
1057 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa51F0001);
1061 void halbtc8192e2ant_agc_table(IN struct btc_coexist *btcoexist,
1062 IN boolean force_exec, IN boolean agc_table_en)
1064 coex_dm->cur_agc_table_en = agc_table_en;
1067 if (coex_dm->pre_agc_table_en == coex_dm->cur_agc_table_en)
1070 halbtc8192e2ant_set_agc_table(btcoexist, agc_table_en);
1072 coex_dm->pre_agc_table_en = coex_dm->cur_agc_table_en;
1075 void halbtc8192e2ant_set_coex_table(IN struct btc_coexist *btcoexist,
1076 IN u32 val0x6c0, IN u32 val0x6c4, IN u32 val0x6c8, IN u8 val0x6cc)
1078 btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
1080 btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
1082 btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
1084 btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
1087 void halbtc8192e2ant_coex_table(IN struct btc_coexist *btcoexist,
1088 IN boolean force_exec, IN u32 val0x6c0, IN u32 val0x6c4,
1089 IN u32 val0x6c8, IN u8 val0x6cc)
1091 coex_dm->cur_val0x6c0 = val0x6c0;
1092 coex_dm->cur_val0x6c4 = val0x6c4;
1093 coex_dm->cur_val0x6c8 = val0x6c8;
1094 coex_dm->cur_val0x6cc = val0x6cc;
1097 if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
1098 (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
1099 (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
1100 (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
1103 halbtc8192e2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8,
1106 coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
1107 coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
1108 coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
1109 coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
1112 void halbtc8192e2ant_coex_table_with_type(IN struct btc_coexist *btcoexist,
1113 IN boolean force_exec, IN u8 type)
1117 halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x55555555,
1118 0x5a5a5a5a, 0xffffff, 0x3);
1121 halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
1122 0x5a5a5a5a, 0xffffff, 0x3);
1125 halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
1126 0x5ada5ada, 0xffffff, 0x3);
1129 halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x5fdf5fdf,
1130 0x5fdb5fdb, 0xffffff, 0x3);
1133 halbtc8192e2ant_coex_table(btcoexist, force_exec, 0xdfffdfff,
1134 0x5ffb5ffb, 0xffffff, 0x3);
1137 halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x5ddd5ddd,
1138 0x5fdb5fdb, 0xffffff, 0x3);
1141 halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
1142 0x5a5a5a5a, 0xffffff, 0x3);
1145 if (coex_sta->scan_ap_num <= NOISY_AP_NUM_THRESH_8192E)
1146 halbtc8192e2ant_coex_table(btcoexist, force_exec, 0xffffffff, 0xfafafafa, 0xffffff, 0x3);
1148 halbtc8192e2ant_coex_table(btcoexist, force_exec, 0xffffffff, 0x5a5a5a5a, 0xffffff, 0x3);
1151 halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x5f5f5f5f, 0x5a5a5a5a, 0xffffff, 0x3);
1154 halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x55555555, 0xfafafafa, 0xffffff, 0x3);
1157 halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);
1160 halbtc8192e2ant_coex_table(btcoexist, force_exec, 0x55555555, 0xfafafafa, 0xffffff, 0x3);
1167 void halbtc8192e2ant_set_fw_ignore_wlan_act(IN struct btc_coexist *btcoexist,
1170 u8 h2c_parameter[1] = {0};
1173 h2c_parameter[0] |= BIT(0); /* function enable */
1175 btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
1178 void halbtc8192e2ant_ignore_wlan_act(IN struct btc_coexist *btcoexist,
1179 IN boolean force_exec, IN boolean enable)
1181 coex_dm->cur_ignore_wlan_act = enable;
1184 if (coex_dm->pre_ignore_wlan_act ==
1185 coex_dm->cur_ignore_wlan_act)
1188 halbtc8192e2ant_set_fw_ignore_wlan_act(btcoexist, enable);
1190 coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
1193 void halbtc8192e2ant_set_lps_rpwm(IN struct btc_coexist *btcoexist,
1194 IN u8 lps_val, IN u8 rpwm_val)
1199 btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
1200 btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
1203 void halbtc8192e2ant_lps_rpwm(IN struct btc_coexist *btcoexist,
1204 IN boolean force_exec, IN u8 lps_val, IN u8 rpwm_val)
1206 coex_dm->cur_lps = lps_val;
1207 coex_dm->cur_rpwm = rpwm_val;
1210 if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
1211 (coex_dm->pre_rpwm == coex_dm->cur_rpwm))
1214 halbtc8192e2ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
1216 coex_dm->pre_lps = coex_dm->cur_lps;
1217 coex_dm->pre_rpwm = coex_dm->cur_rpwm;
1220 void halbtc8192e2ant_ps_tdma_check_for_power_save_state(
1221 IN struct btc_coexist *btcoexist, IN boolean new_ps_state)
1224 u8 h2c_parameter[5] = {0x8, 0, 0, 0, 0};
1226 btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1228 if (lps_mode) { /* already under LPS state */
1230 /* keep state under LPS, do nothing. */
1232 /* will leave LPS state, turn off psTdma first */
1233 /*halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);*/
1234 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1237 } else { /* NO PS state */
1239 /* will enter LPS state, turn off psTdma first */
1240 /*halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);*/
1241 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1243 /* keep state under NO PS state, do nothing. */
1249 void halbtc8192e2ant_power_save_state(IN struct btc_coexist *btcoexist,
1250 IN u8 ps_type, IN u8 lps_val, IN u8 rpwm_val)
1252 boolean low_pwr_disable = false;
1253 boolean bApEnable = false;
1255 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);
1257 ps_type = BTC_PS_WIFI_NATIVE;
1261 /*for 8192e, NO 32k*/
1262 low_pwr_disable = true;
1264 case BTC_PS_WIFI_NATIVE:
1265 coex_sta->force_lps_on = false;
1266 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &low_pwr_disable);
1267 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
1270 coex_sta->force_lps_on = true;
1271 halbtc8192e2ant_ps_tdma_check_for_power_save_state(btcoexist, true);
1272 halbtc8192e2ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val, rpwm_val);
1273 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &low_pwr_disable);
1274 /* power save must executed before psTdma. */
1275 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
1277 case BTC_PS_LPS_OFF:
1278 coex_sta->force_lps_on = false;
1279 halbtc8192e2ant_ps_tdma_check_for_power_save_state(btcoexist, false);
1280 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
1287 void halbtc8192e2ant_set_fw_pstdma(IN struct btc_coexist *btcoexist,
1288 IN u8 byte1, IN u8 byte2, IN u8 byte3, IN u8 byte4, IN u8 byte5)
1290 u8 h2c_parameter[5] = {0};
1291 u8 real_byte1 = byte1, real_byte5 = byte5;
1292 boolean ap_enable = false;
1294 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1298 if (byte1 & BIT(4) && !(byte1 & BIT(5))) {
1299 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1300 "[BTCoex], FW for 1Ant AP mode\n");
1301 real_byte1 &= ~BIT(4);
1302 real_byte1 |= BIT(5);
1304 real_byte5 |= BIT(5);
1305 real_byte5 &= ~BIT(6);
1307 } else if ((byte1 & BIT(4)) && (!(byte1 & BIT(5))))
1308 halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50, 0x4);
1310 halbtc8192e2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1313 h2c_parameter[0] = byte1;
1314 h2c_parameter[1] = byte2;
1315 h2c_parameter[2] = byte3;
1316 h2c_parameter[3] = byte4;
1317 h2c_parameter[4] = byte5;
1319 coex_dm->ps_tdma_para[0] = byte1;
1320 coex_dm->ps_tdma_para[1] = byte2;
1321 coex_dm->ps_tdma_para[2] = byte3;
1322 coex_dm->ps_tdma_para[3] = byte4;
1323 coex_dm->ps_tdma_para[4] = byte5;
1325 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1328 void halbtc8192e2ant_sw_mechanism1(IN struct btc_coexist *btcoexist,
1329 IN boolean shrink_rx_lpf, IN boolean low_penalty_ra,
1330 IN boolean limited_dig, IN boolean bt_lna_constrain)
1335 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
1337 if(BTC_WIFI_BW_HT40 != wifi_bw)
1340 shrink_rx_lpf = false;
1344 halbtc8192e2ant_rf_shrink(btcoexist, NORMAL_EXEC, shrink_rx_lpf);
1345 /* halbtc8192e2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra); */
1348 void halbtc8192e2ant_sw_mechanism2(IN struct btc_coexist *btcoexist,
1349 IN boolean agc_table_shift, IN boolean adc_back_off,
1350 IN boolean sw_dac_swing, IN u32 dac_swing_lvl)
1352 halbtc8192e2ant_agc_table(btcoexist, NORMAL_EXEC, agc_table_shift);
1353 /* halbtc8192e2ant_adc_back_off(btcoexist, NORMAL_EXEC, adc_back_off); */
1354 halbtc8192e2ant_dac_swing(btcoexist, NORMAL_EXEC, sw_dac_swing,
1358 void halbtc8192e2ant_set_ant_path(IN struct btc_coexist *btcoexist,
1359 IN u8 ant_pos_type, IN boolean init_hwcfg, IN boolean wifi_off)
1364 btcoexist->btc_write_1byte(btcoexist, 0x944, 0x24);
1365 btcoexist->btc_write_4byte(btcoexist, 0x930, 0x700700);
1366 if (btcoexist->chip_interface == BTC_INTF_USB)
1367 btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30430004);
1369 btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30030004);
1371 /* 0x4c[27][24]='00', Set Antenna to BB */
1372 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
1375 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
1376 } else if (wifi_off) {
1377 if (btcoexist->chip_interface == BTC_INTF_USB)
1378 btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30430004);
1380 btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30030004);
1382 /* 0x4c[27][24]='11', Set Antenna to BT, 0x64[8:7]=0, 0x64[2]=1 */
1383 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
1386 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
1389 /* ext switch setting */
1390 switch (ant_pos_type) {
1391 case BTC_ANT_PATH_WIFI:
1392 btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x4);
1394 case BTC_ANT_PATH_BT:
1395 btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x20);
1398 case BTC_ANT_PATH_PTA:
1399 btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x4);
1404 void halbtc8192e2ant_set_switch_ss_type(IN struct btc_coexist *btcoexist,
1407 u8 mimo_ps = BTC_MIMO_PS_DYNAMIC;
1408 u32 dis_ra_mask = 0x0;
1410 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1411 "[BTCoex], REAL set SS Type = %d\n", ss_type);
1412 BTC_TRACE(trace_buf);
1414 dis_ra_mask = halbtc8192e2ant_decide_ra_mask(btcoexist, ss_type,
1415 coex_dm->cur_ra_mask_type);
1416 halbtc8192e2ant_update_ra_mask(btcoexist, FORCE_EXEC, dis_ra_mask);
1419 /*halbtc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1);*/
1420 /* switch ofdm path */
1421 btcoexist->btc_write_1byte(btcoexist, 0xc04, 0x11);
1422 btcoexist->btc_write_1byte(btcoexist, 0xd04, 0x1);
1423 btcoexist->btc_write_4byte(btcoexist, 0x90c, 0x81111111);
1424 /* switch cck patch */
1425 /* btcoexist->btc_write_1byte_bitmask(btcoexist, 0xe77, 0x4, 0x1); */
1426 /* btcoexist->btc_write_1byte(btcoexist, 0xa07, 0x81); */
1427 mimo_ps = BTC_MIMO_PS_STATIC;
1428 } else if (ss_type == 2) {
1429 /*halbtc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);*/
1430 btcoexist->btc_write_1byte(btcoexist, 0xc04, 0x33);
1431 btcoexist->btc_write_1byte(btcoexist, 0xd04, 0x3);
1432 btcoexist->btc_write_4byte(btcoexist, 0x90c, 0x81121313);
1433 /* remove, if 0xe77[2]=0x0 then CCK will fail, advised by Jenyu */
1434 /* btcoexist->btc_write_1byte_bitmask(btcoexist, 0xe77, 0x4, 0x0); */
1435 /* btcoexist->btc_write_1byte(btcoexist, 0xa07, 0x41); */
1436 mimo_ps = BTC_MIMO_PS_DYNAMIC;
1439 btcoexist->btc_set(btcoexist, BTC_SET_ACT_SEND_MIMO_PS,
1440 &mimo_ps); /* set rx 1ss or 2ss */
1443 void halbtc8192e2ant_switch_ss_type(IN struct btc_coexist *btcoexist,
1444 IN boolean force_exec, IN u8 new_ss_type)
1446 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1447 "[BTCoex], %s Switch SS Type = %d\n",
1448 (force_exec ? "force to" : ""), new_ss_type);
1449 BTC_TRACE(trace_buf);
1450 coex_dm->cur_ss_type = new_ss_type;
1453 if (coex_dm->pre_ss_type == coex_dm->cur_ss_type)
1456 halbtc8192e2ant_set_switch_ss_type(btcoexist, coex_dm->cur_ss_type);
1458 coex_dm->pre_ss_type = coex_dm->cur_ss_type;
1461 void halbtc8192e2ant_ps_tdma(IN struct btc_coexist *btcoexist,
1462 IN boolean force_exec, IN boolean turn_on, IN u8 type)
1464 s8 wifi_duration_adjust = 0x0;
1466 coex_dm->cur_ps_tdma_on = turn_on;
1467 coex_dm->cur_ps_tdma = type;
1470 if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1471 (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1475 if (coex_sta->scan_ap_num >= 40)
1476 wifi_duration_adjust = -15;
1477 else if (coex_sta->scan_ap_num >= 20)
1478 wifi_duration_adjust = -10;
1485 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x3c, 0x03, 0x11, 0x10);
1488 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x32, 0x03, 0x11, 0x10);
1491 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x28, 0x03, 0x11, 0x10);
1494 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x1e, 0x03, 0x11, 0x10);
1496 case 5: /*d1,pb,TXpause*/
1497 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x63, 0x3c, 0x03, 0x90, 0x10);
1500 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x63, 0x32, 0x03, 0x90, 0x10);
1503 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x63, 0x28, 0x03, 0x90, 0x10);
1506 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x63, 0x1e, 0x03, 0x90, 0x10);
1509 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x3c, 0x03, 0x31, 0x10);
1512 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x32, 0x03, 0x31, 0x10);
1515 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x28, 0x03, 0x31, 0x10);
1518 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x1e, 0x03, 0x31, 0x10);
1520 case 13: /*d1,bb,TXpause*/
1521 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x3c, 0x03, 0x30, 0x10);
1524 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x32, 0x03, 0x30, 0x10);
1527 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x28, 0x03, 0x30, 0x10);
1530 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x1e, 0x03, 0x30, 0x10);
1533 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x61, 0x20, 0x03, 0x10, 0x10);
1536 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);
1539 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x25, 0x25, 0xe1, 0x90);
1542 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x25, 0x25, 0x60, 0x90);
1545 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x61, 0x15, 0x03, 0x11, 0x11);
1547 case 22: /* d1,wb */
1548 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x14, 0x03, 0x11, 0x14);
1550 case 23: /* d1,pb,TXpause */
1551 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x63, 0x14, 0x03, 0x90, 0x14);
1553 case 24: /* d1,bb */
1554 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x14, 0x03, 0x31, 0x14);
1556 case 25: /* d1,bb,TXpause */
1557 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x14, 0x03, 0x30, 0x14);
1559 case 26: /*d1,wp,noTXpause*/
1560 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe1, 0x3c, 0x03, 0x11, 0x10);
1562 case 27: /*11,pp,noTXpause*/
1563 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x61, 0x3c, 0x03, 0x11, 0x11);
1565 case 28: /*11,pp,noTXpause*/
1566 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x61, 0x50, 0x03, 0x11, 0x11);
1569 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x61, 0x15, 0x03, 0x11, 0x11);
1572 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x14, 0x03, 0x10, 0x14);
1574 case 31: /*d3,bb,TXpause*/
1575 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x14, 0x03, 0x30, 0x94);
1578 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x61, 0x35, 0x03, 0x11, 0x11);
1581 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);
1583 /* following cases is for wifi rssi low // bad antenna isolation, started from 81 */
1585 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x3c, 0x3, 0x10, 0x50);
1588 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x3a + wifi_duration_adjust, 0x3, 0x10, 0x50);
1591 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x30 + wifi_duration_adjust, 0x03, 0x10, 0x50);
1594 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x21, 0x03, 0x10, 0x50);
1597 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x15, 0x3, 0x10, 0x50);
1600 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x3a, 0x03, 0x10, 0x50);
1603 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x21, 0x03, 0x10, 0x50);
1606 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x51, 0x14, 0x03, 0x10, 0x54);
1609 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x53, 0x14, 0x03, 0x10, 0x54);
1613 /* disable PS tdma */
1616 case 0: /* ANT2PTA, 0x778=1 */
1617 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x8, 0x0, 0x0, 0x0, 0x0);
1618 halbtc8192e2ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, false, false);
1620 case 1: /* ANT2BT, 0x778=3 */
1621 halbtc8192e2ant_set_fw_pstdma(btcoexist, 0x0, 0x0, 0x0, 0x8, 0x0);
1623 halbtc8192e2ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, false);
1628 /* update pre state */
1629 coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1630 coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1634 void halbtc8192e2ant_coex_all_off(IN struct btc_coexist *btcoexist)
1637 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1638 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1639 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1642 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
1643 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1646 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1649 void halbtc8192e2ant_init_coex_dm(IN struct btc_coexist *btcoexist)
1651 coex_sta->cnt_setup_link = 0;
1653 /* force to reset coex mechanism */
1654 halbtc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
1655 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
1656 halbtc8192e2ant_dec_bt_pwr(btcoexist, FORCE_EXEC, 0);
1658 halbtc8192e2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
1659 halbtc8192e2ant_switch_ss_type(btcoexist, FORCE_EXEC, 2);
1661 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
1662 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1665 void halbtc8192e2ant_action_bt_inquiry(IN struct btc_coexist *btcoexist)
1667 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1669 if (coex_sta->wifi_is_high_pri_task && (!bt_link_info->a2dp_exist)) {
1670 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 11);
1671 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
1673 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1674 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 29);
1677 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1678 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1680 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
1681 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1684 boolean halbtc8192e2ant_is_common_action(IN struct btc_coexist *btcoexist)
1686 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1687 boolean common = false, wifi_connected = false, wifi_busy = false;
1688 boolean bt_hs_on = false, low_pwr_disable = false;
1690 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
1691 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1693 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1695 if (bt_link_info->sco_exist || bt_link_info->hid_exist)
1696 halbtc8192e2ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 0, 0, 0);
1698 halbtc8192e2ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
1700 if (!wifi_connected) {
1702 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1703 "[BTCoex], Wifi non-connected idle!!\n");
1704 BTC_TRACE(trace_buf);
1706 if ((coex_dm->bt_status == BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE) ||
1707 (coex_dm->bt_status == BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE)) {
1708 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1709 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
1711 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1712 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1714 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1715 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1717 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
1718 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1721 if (coex_dm->bt_status == BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE) {
1723 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Wifi busy + BT non connected-idle!!\n");
1724 BTC_TRACE(trace_buf);
1726 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 9);
1727 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 26);
1728 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1729 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1730 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
1731 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1734 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Wifi connected-idle + BT non connected-idle!!\n");
1735 BTC_TRACE(trace_buf);
1736 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1737 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
1738 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1739 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1740 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
1741 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1744 } else if (coex_dm->bt_status == BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE) {
1750 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Wifi busy + BT connected-idle!!\n");
1751 BTC_TRACE(trace_buf);
1752 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 10);
1753 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 27);
1754 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1755 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1756 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
1757 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1760 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Wifi connected-idle + BT connected-idle!!\n");
1761 BTC_TRACE(trace_buf);
1762 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1763 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
1764 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1765 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1766 halbtc8192e2ant_sw_mechanism1(btcoexist, true, false, false, false);
1767 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1773 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1774 "[BTCoex], Wifi Connected-Busy + BT Busy!!\n");
1775 BTC_TRACE(trace_buf);
1778 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1779 "[BTCoex], Wifi Connected-Idle + BT Busy!!\n");
1780 BTC_TRACE(trace_buf);
1781 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1782 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 21);
1783 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1784 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1785 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
1786 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1795 void halbtc8192e2ant_tdma_duration_adjust(IN struct btc_coexist *btcoexist,
1796 IN boolean sco_hid, IN boolean tx_pause, IN u8 max_interval)
1798 static s32 up, dn, m, n, wait_count;
1799 s32 result; /* 0: no change, +1: increase WiFi duration, -1: decrease WiFi duration */
1803 if (!coex_dm->auto_tdma_adjust) {
1804 coex_dm->auto_tdma_adjust = true;
1808 if (max_interval == 1) {
1809 halbtc8192e2ant_ps_tdma(
1810 btcoexist, NORMAL_EXEC,
1812 coex_dm->ps_tdma_du_adj_type =
1814 } else if (max_interval == 2) {
1815 halbtc8192e2ant_ps_tdma(
1816 btcoexist, NORMAL_EXEC,
1818 coex_dm->ps_tdma_du_adj_type =
1820 } else if (max_interval == 3) {
1821 halbtc8192e2ant_ps_tdma(
1822 btcoexist, NORMAL_EXEC,
1824 coex_dm->ps_tdma_du_adj_type =
1827 halbtc8192e2ant_ps_tdma(
1828 btcoexist, NORMAL_EXEC,
1830 coex_dm->ps_tdma_du_adj_type =
1834 if (max_interval == 1) {
1835 halbtc8192e2ant_ps_tdma(
1836 btcoexist, NORMAL_EXEC,
1838 coex_dm->ps_tdma_du_adj_type =
1840 } else if (max_interval == 2) {
1841 halbtc8192e2ant_ps_tdma(
1842 btcoexist, NORMAL_EXEC,
1844 coex_dm->ps_tdma_du_adj_type =
1846 } else if (max_interval == 3) {
1847 halbtc8192e2ant_ps_tdma(
1848 btcoexist, NORMAL_EXEC,
1850 coex_dm->ps_tdma_du_adj_type =
1853 halbtc8192e2ant_ps_tdma(
1854 btcoexist, NORMAL_EXEC,
1856 coex_dm->ps_tdma_du_adj_type =
1862 if (max_interval == 1) {
1863 halbtc8192e2ant_ps_tdma(
1864 btcoexist, NORMAL_EXEC,
1866 coex_dm->ps_tdma_du_adj_type =
1868 } else if (max_interval == 2) {
1869 halbtc8192e2ant_ps_tdma(
1870 btcoexist, NORMAL_EXEC,
1872 coex_dm->ps_tdma_du_adj_type =
1874 } else if (max_interval == 3) {
1875 halbtc8192e2ant_ps_tdma(
1876 btcoexist, NORMAL_EXEC,
1878 coex_dm->ps_tdma_du_adj_type =
1881 halbtc8192e2ant_ps_tdma(
1882 btcoexist, NORMAL_EXEC,
1884 coex_dm->ps_tdma_du_adj_type =
1888 if (max_interval == 1) {
1889 halbtc8192e2ant_ps_tdma(
1890 btcoexist, NORMAL_EXEC,
1892 coex_dm->ps_tdma_du_adj_type =
1894 } else if (max_interval == 2) {
1895 halbtc8192e2ant_ps_tdma(
1896 btcoexist, NORMAL_EXEC,
1898 coex_dm->ps_tdma_du_adj_type =
1900 } else if (max_interval == 3) {
1901 halbtc8192e2ant_ps_tdma(
1902 btcoexist, NORMAL_EXEC,
1904 coex_dm->ps_tdma_du_adj_type =
1907 halbtc8192e2ant_ps_tdma(
1908 btcoexist, NORMAL_EXEC,
1910 coex_dm->ps_tdma_du_adj_type =
1924 /* acquire the BT TRx retry count from BT_Info byte2 */
1925 retry_count = coex_sta->bt_retry_cnt;
1930 0) { /* no retry in the last 2-second duration */
1937 if (up >= n) { /* if retry count during continuous n*2 seconds is 0, enlarge WiFi duration */
1944 } else if (retry_count <=
1945 3) { /* <=3 retry in the last 2-second duration */
1952 if (dn == 2) { /* if continuous 2 retry count(every 2 seconds) >0 and < 3, reduce WiFi duration */
1953 if (wait_count <= 2)
1954 m++; /* to avoid loop between the two levels */
1958 if (m >= 20) /* maximum of m = 20 ' will recheck if need to adjust wifi duration in maximum time interval 120 seconds */
1967 } else { /* retry count > 3, once retry count > 3, to reduce WiFi duration */
1968 if (wait_count == 1)
1969 m++; /* to avoid loop between the two levels */
1973 if (m >= 20) /* maximum of m = 20 ' will recheck if need to adjust wifi duration in maximum time interval 120 seconds */
1983 if (max_interval == 1) {
1985 if (coex_dm->cur_ps_tdma == 1) {
1986 halbtc8192e2ant_ps_tdma(btcoexist,
1987 NORMAL_EXEC, true, 5);
1988 coex_dm->ps_tdma_du_adj_type = 5;
1989 } else if (coex_dm->cur_ps_tdma == 2) {
1990 halbtc8192e2ant_ps_tdma(btcoexist,
1991 NORMAL_EXEC, true, 6);
1992 coex_dm->ps_tdma_du_adj_type = 6;
1993 } else if (coex_dm->cur_ps_tdma == 3) {
1994 halbtc8192e2ant_ps_tdma(btcoexist,
1995 NORMAL_EXEC, true, 7);
1996 coex_dm->ps_tdma_du_adj_type = 7;
1997 } else if (coex_dm->cur_ps_tdma == 4) {
1998 halbtc8192e2ant_ps_tdma(btcoexist,
1999 NORMAL_EXEC, true, 8);
2000 coex_dm->ps_tdma_du_adj_type = 8;
2002 if (coex_dm->cur_ps_tdma == 9) {
2003 halbtc8192e2ant_ps_tdma(btcoexist,
2004 NORMAL_EXEC, true, 13);
2005 coex_dm->ps_tdma_du_adj_type = 13;
2006 } else if (coex_dm->cur_ps_tdma == 10) {
2007 halbtc8192e2ant_ps_tdma(btcoexist,
2008 NORMAL_EXEC, true, 14);
2009 coex_dm->ps_tdma_du_adj_type = 14;
2010 } else if (coex_dm->cur_ps_tdma == 11) {
2011 halbtc8192e2ant_ps_tdma(btcoexist,
2012 NORMAL_EXEC, true, 15);
2013 coex_dm->ps_tdma_du_adj_type = 15;
2014 } else if (coex_dm->cur_ps_tdma == 12) {
2015 halbtc8192e2ant_ps_tdma(btcoexist,
2016 NORMAL_EXEC, true, 16);
2017 coex_dm->ps_tdma_du_adj_type = 16;
2021 if (coex_dm->cur_ps_tdma == 5) {
2022 halbtc8192e2ant_ps_tdma(
2023 btcoexist, NORMAL_EXEC,
2025 coex_dm->ps_tdma_du_adj_type =
2027 } else if (coex_dm->cur_ps_tdma == 6) {
2028 halbtc8192e2ant_ps_tdma(
2029 btcoexist, NORMAL_EXEC,
2031 coex_dm->ps_tdma_du_adj_type =
2033 } else if (coex_dm->cur_ps_tdma == 7) {
2034 halbtc8192e2ant_ps_tdma(
2035 btcoexist, NORMAL_EXEC,
2037 coex_dm->ps_tdma_du_adj_type =
2039 } else if (coex_dm->cur_ps_tdma == 13) {
2040 halbtc8192e2ant_ps_tdma(
2041 btcoexist, NORMAL_EXEC,
2043 coex_dm->ps_tdma_du_adj_type =
2045 } else if (coex_dm->cur_ps_tdma == 14) {
2046 halbtc8192e2ant_ps_tdma(
2047 btcoexist, NORMAL_EXEC,
2049 coex_dm->ps_tdma_du_adj_type =
2051 } else if (coex_dm->cur_ps_tdma == 15) {
2052 halbtc8192e2ant_ps_tdma(
2053 btcoexist, NORMAL_EXEC,
2055 coex_dm->ps_tdma_du_adj_type =
2058 } else if (result == 1) {
2059 if (coex_dm->cur_ps_tdma == 8) {
2060 halbtc8192e2ant_ps_tdma(
2061 btcoexist, NORMAL_EXEC,
2063 coex_dm->ps_tdma_du_adj_type =
2065 } else if (coex_dm->cur_ps_tdma == 7) {
2066 halbtc8192e2ant_ps_tdma(
2067 btcoexist, NORMAL_EXEC,
2069 coex_dm->ps_tdma_du_adj_type =
2071 } else if (coex_dm->cur_ps_tdma == 6) {
2072 halbtc8192e2ant_ps_tdma(
2073 btcoexist, NORMAL_EXEC,
2075 coex_dm->ps_tdma_du_adj_type =
2077 } else if (coex_dm->cur_ps_tdma == 16) {
2078 halbtc8192e2ant_ps_tdma(
2079 btcoexist, NORMAL_EXEC,
2081 coex_dm->ps_tdma_du_adj_type =
2083 } else if (coex_dm->cur_ps_tdma == 15) {
2084 halbtc8192e2ant_ps_tdma(
2085 btcoexist, NORMAL_EXEC,
2087 coex_dm->ps_tdma_du_adj_type =
2089 } else if (coex_dm->cur_ps_tdma == 14) {
2090 halbtc8192e2ant_ps_tdma(
2091 btcoexist, NORMAL_EXEC,
2093 coex_dm->ps_tdma_du_adj_type =
2098 if (coex_dm->cur_ps_tdma == 5) {
2099 halbtc8192e2ant_ps_tdma(btcoexist,
2100 NORMAL_EXEC, true, 1);
2101 coex_dm->ps_tdma_du_adj_type = 1;
2102 } else if (coex_dm->cur_ps_tdma == 6) {
2103 halbtc8192e2ant_ps_tdma(btcoexist,
2104 NORMAL_EXEC, true, 2);
2105 coex_dm->ps_tdma_du_adj_type = 2;
2106 } else if (coex_dm->cur_ps_tdma == 7) {
2107 halbtc8192e2ant_ps_tdma(btcoexist,
2108 NORMAL_EXEC, true, 3);
2109 coex_dm->ps_tdma_du_adj_type = 3;
2110 } else if (coex_dm->cur_ps_tdma == 8) {
2111 halbtc8192e2ant_ps_tdma(btcoexist,
2112 NORMAL_EXEC, true, 4);
2113 coex_dm->ps_tdma_du_adj_type = 4;
2115 if (coex_dm->cur_ps_tdma == 13) {
2116 halbtc8192e2ant_ps_tdma(btcoexist,
2117 NORMAL_EXEC, true, 9);
2118 coex_dm->ps_tdma_du_adj_type = 9;
2119 } else if (coex_dm->cur_ps_tdma == 14) {
2120 halbtc8192e2ant_ps_tdma(btcoexist,
2121 NORMAL_EXEC, true, 10);
2122 coex_dm->ps_tdma_du_adj_type = 10;
2123 } else if (coex_dm->cur_ps_tdma == 15) {
2124 halbtc8192e2ant_ps_tdma(btcoexist,
2125 NORMAL_EXEC, true, 11);
2126 coex_dm->ps_tdma_du_adj_type = 11;
2127 } else if (coex_dm->cur_ps_tdma == 16) {
2128 halbtc8192e2ant_ps_tdma(btcoexist,
2129 NORMAL_EXEC, true, 12);
2130 coex_dm->ps_tdma_du_adj_type = 12;
2134 if (coex_dm->cur_ps_tdma == 1) {
2135 halbtc8192e2ant_ps_tdma(
2136 btcoexist, NORMAL_EXEC,
2138 coex_dm->ps_tdma_du_adj_type =
2140 } else if (coex_dm->cur_ps_tdma == 2) {
2141 halbtc8192e2ant_ps_tdma(
2142 btcoexist, NORMAL_EXEC,
2144 coex_dm->ps_tdma_du_adj_type =
2146 } else if (coex_dm->cur_ps_tdma == 3) {
2147 halbtc8192e2ant_ps_tdma(
2148 btcoexist, NORMAL_EXEC,
2150 coex_dm->ps_tdma_du_adj_type =
2152 } else if (coex_dm->cur_ps_tdma == 9) {
2153 halbtc8192e2ant_ps_tdma(
2154 btcoexist, NORMAL_EXEC,
2156 coex_dm->ps_tdma_du_adj_type =
2158 } else if (coex_dm->cur_ps_tdma == 10) {
2159 halbtc8192e2ant_ps_tdma(
2160 btcoexist, NORMAL_EXEC,
2162 coex_dm->ps_tdma_du_adj_type =
2164 } else if (coex_dm->cur_ps_tdma == 11) {
2165 halbtc8192e2ant_ps_tdma(
2166 btcoexist, NORMAL_EXEC,
2168 coex_dm->ps_tdma_du_adj_type =
2171 } else if (result == 1) {
2172 if (coex_dm->cur_ps_tdma == 4) {
2173 halbtc8192e2ant_ps_tdma(
2174 btcoexist, NORMAL_EXEC,
2176 coex_dm->ps_tdma_du_adj_type =
2178 } else if (coex_dm->cur_ps_tdma == 3) {
2179 halbtc8192e2ant_ps_tdma(
2180 btcoexist, NORMAL_EXEC,
2182 coex_dm->ps_tdma_du_adj_type =
2184 } else if (coex_dm->cur_ps_tdma == 2) {
2185 halbtc8192e2ant_ps_tdma(
2186 btcoexist, NORMAL_EXEC,
2188 coex_dm->ps_tdma_du_adj_type =
2190 } else if (coex_dm->cur_ps_tdma == 1) {
2191 halbtc8192e2ant_ps_tdma(
2192 btcoexist, NORMAL_EXEC,
2194 coex_dm->ps_tdma_du_adj_type =
2196 } else if (coex_dm->cur_ps_tdma == 12) {
2197 halbtc8192e2ant_ps_tdma(
2198 btcoexist, NORMAL_EXEC,
2200 coex_dm->ps_tdma_du_adj_type =
2202 } else if (coex_dm->cur_ps_tdma == 11) {
2203 halbtc8192e2ant_ps_tdma(
2204 btcoexist, NORMAL_EXEC,
2206 coex_dm->ps_tdma_du_adj_type =
2208 } else if (coex_dm->cur_ps_tdma == 10) {
2209 halbtc8192e2ant_ps_tdma(
2210 btcoexist, NORMAL_EXEC,
2212 coex_dm->ps_tdma_du_adj_type =
2217 } else if (max_interval == 2) {
2219 if (coex_dm->cur_ps_tdma == 1) {
2220 halbtc8192e2ant_ps_tdma(btcoexist,
2221 NORMAL_EXEC, true, 6);
2222 coex_dm->ps_tdma_du_adj_type = 6;
2223 } else if (coex_dm->cur_ps_tdma == 2) {
2224 halbtc8192e2ant_ps_tdma(btcoexist,
2225 NORMAL_EXEC, true, 6);
2226 coex_dm->ps_tdma_du_adj_type = 6;
2227 } else if (coex_dm->cur_ps_tdma == 3) {
2228 halbtc8192e2ant_ps_tdma(btcoexist,
2229 NORMAL_EXEC, true, 7);
2230 coex_dm->ps_tdma_du_adj_type = 7;
2231 } else if (coex_dm->cur_ps_tdma == 4) {
2232 halbtc8192e2ant_ps_tdma(btcoexist,
2233 NORMAL_EXEC, true, 8);
2234 coex_dm->ps_tdma_du_adj_type = 8;
2236 if (coex_dm->cur_ps_tdma == 9) {
2237 halbtc8192e2ant_ps_tdma(btcoexist,
2238 NORMAL_EXEC, true, 14);
2239 coex_dm->ps_tdma_du_adj_type = 14;
2240 } else if (coex_dm->cur_ps_tdma == 10) {
2241 halbtc8192e2ant_ps_tdma(btcoexist,
2242 NORMAL_EXEC, true, 14);
2243 coex_dm->ps_tdma_du_adj_type = 14;
2244 } else if (coex_dm->cur_ps_tdma == 11) {
2245 halbtc8192e2ant_ps_tdma(btcoexist,
2246 NORMAL_EXEC, true, 15);
2247 coex_dm->ps_tdma_du_adj_type = 15;
2248 } else if (coex_dm->cur_ps_tdma == 12) {
2249 halbtc8192e2ant_ps_tdma(btcoexist,
2250 NORMAL_EXEC, true, 16);
2251 coex_dm->ps_tdma_du_adj_type = 16;
2254 if (coex_dm->cur_ps_tdma == 5) {
2255 halbtc8192e2ant_ps_tdma(
2256 btcoexist, NORMAL_EXEC,
2258 coex_dm->ps_tdma_du_adj_type =
2260 } else if (coex_dm->cur_ps_tdma == 6) {
2261 halbtc8192e2ant_ps_tdma(
2262 btcoexist, NORMAL_EXEC,
2264 coex_dm->ps_tdma_du_adj_type =
2266 } else if (coex_dm->cur_ps_tdma == 7) {
2267 halbtc8192e2ant_ps_tdma(
2268 btcoexist, NORMAL_EXEC,
2270 coex_dm->ps_tdma_du_adj_type =
2272 } else if (coex_dm->cur_ps_tdma == 13) {
2273 halbtc8192e2ant_ps_tdma(
2274 btcoexist, NORMAL_EXEC,
2276 coex_dm->ps_tdma_du_adj_type =
2278 } else if (coex_dm->cur_ps_tdma == 14) {
2279 halbtc8192e2ant_ps_tdma(
2280 btcoexist, NORMAL_EXEC,
2282 coex_dm->ps_tdma_du_adj_type =
2284 } else if (coex_dm->cur_ps_tdma == 15) {
2285 halbtc8192e2ant_ps_tdma(
2286 btcoexist, NORMAL_EXEC,
2288 coex_dm->ps_tdma_du_adj_type =
2291 } else if (result == 1) {
2292 if (coex_dm->cur_ps_tdma == 8) {
2293 halbtc8192e2ant_ps_tdma(
2294 btcoexist, NORMAL_EXEC,
2296 coex_dm->ps_tdma_du_adj_type =
2298 } else if (coex_dm->cur_ps_tdma == 7) {
2299 halbtc8192e2ant_ps_tdma(
2300 btcoexist, NORMAL_EXEC,
2302 coex_dm->ps_tdma_du_adj_type =
2304 } else if (coex_dm->cur_ps_tdma == 6) {
2305 halbtc8192e2ant_ps_tdma(
2306 btcoexist, NORMAL_EXEC,
2308 coex_dm->ps_tdma_du_adj_type =
2310 } else if (coex_dm->cur_ps_tdma == 16) {
2311 halbtc8192e2ant_ps_tdma(
2312 btcoexist, NORMAL_EXEC,
2314 coex_dm->ps_tdma_du_adj_type =
2316 } else if (coex_dm->cur_ps_tdma == 15) {
2317 halbtc8192e2ant_ps_tdma(
2318 btcoexist, NORMAL_EXEC,
2320 coex_dm->ps_tdma_du_adj_type =
2322 } else if (coex_dm->cur_ps_tdma == 14) {
2323 halbtc8192e2ant_ps_tdma(
2324 btcoexist, NORMAL_EXEC,
2326 coex_dm->ps_tdma_du_adj_type =
2331 if (coex_dm->cur_ps_tdma == 5) {
2332 halbtc8192e2ant_ps_tdma(btcoexist,
2333 NORMAL_EXEC, true, 2);
2334 coex_dm->ps_tdma_du_adj_type = 2;
2335 } else if (coex_dm->cur_ps_tdma == 6) {
2336 halbtc8192e2ant_ps_tdma(btcoexist,
2337 NORMAL_EXEC, true, 2);
2338 coex_dm->ps_tdma_du_adj_type = 2;
2339 } else if (coex_dm->cur_ps_tdma == 7) {
2340 halbtc8192e2ant_ps_tdma(btcoexist,
2341 NORMAL_EXEC, true, 3);
2342 coex_dm->ps_tdma_du_adj_type = 3;
2343 } else if (coex_dm->cur_ps_tdma == 8) {
2344 halbtc8192e2ant_ps_tdma(btcoexist,
2345 NORMAL_EXEC, true, 4);
2346 coex_dm->ps_tdma_du_adj_type = 4;
2348 if (coex_dm->cur_ps_tdma == 13) {
2349 halbtc8192e2ant_ps_tdma(btcoexist,
2350 NORMAL_EXEC, true, 10);
2351 coex_dm->ps_tdma_du_adj_type = 10;
2352 } else if (coex_dm->cur_ps_tdma == 14) {
2353 halbtc8192e2ant_ps_tdma(btcoexist,
2354 NORMAL_EXEC, true, 10);
2355 coex_dm->ps_tdma_du_adj_type = 10;
2356 } else if (coex_dm->cur_ps_tdma == 15) {
2357 halbtc8192e2ant_ps_tdma(btcoexist,
2358 NORMAL_EXEC, true, 11);
2359 coex_dm->ps_tdma_du_adj_type = 11;
2360 } else if (coex_dm->cur_ps_tdma == 16) {
2361 halbtc8192e2ant_ps_tdma(btcoexist,
2362 NORMAL_EXEC, true, 12);
2363 coex_dm->ps_tdma_du_adj_type = 12;
2366 if (coex_dm->cur_ps_tdma == 1) {
2367 halbtc8192e2ant_ps_tdma(
2368 btcoexist, NORMAL_EXEC,
2370 coex_dm->ps_tdma_du_adj_type =
2372 } else if (coex_dm->cur_ps_tdma == 2) {
2373 halbtc8192e2ant_ps_tdma(
2374 btcoexist, NORMAL_EXEC,
2376 coex_dm->ps_tdma_du_adj_type =
2378 } else if (coex_dm->cur_ps_tdma == 3) {
2379 halbtc8192e2ant_ps_tdma(
2380 btcoexist, NORMAL_EXEC,
2382 coex_dm->ps_tdma_du_adj_type =
2384 } else if (coex_dm->cur_ps_tdma == 9) {
2385 halbtc8192e2ant_ps_tdma(
2386 btcoexist, NORMAL_EXEC,
2388 coex_dm->ps_tdma_du_adj_type =
2390 } else if (coex_dm->cur_ps_tdma == 10) {
2391 halbtc8192e2ant_ps_tdma(
2392 btcoexist, NORMAL_EXEC,
2394 coex_dm->ps_tdma_du_adj_type =
2396 } else if (coex_dm->cur_ps_tdma == 11) {
2397 halbtc8192e2ant_ps_tdma(
2398 btcoexist, NORMAL_EXEC,
2400 coex_dm->ps_tdma_du_adj_type =
2403 } else if (result == 1) {
2404 if (coex_dm->cur_ps_tdma == 4) {
2405 halbtc8192e2ant_ps_tdma(
2406 btcoexist, NORMAL_EXEC,
2408 coex_dm->ps_tdma_du_adj_type =
2410 } else if (coex_dm->cur_ps_tdma == 3) {
2411 halbtc8192e2ant_ps_tdma(
2412 btcoexist, NORMAL_EXEC,
2414 coex_dm->ps_tdma_du_adj_type =
2416 } else if (coex_dm->cur_ps_tdma == 2) {
2417 halbtc8192e2ant_ps_tdma(
2418 btcoexist, NORMAL_EXEC,
2420 coex_dm->ps_tdma_du_adj_type =
2422 } else if (coex_dm->cur_ps_tdma == 12) {
2423 halbtc8192e2ant_ps_tdma(
2424 btcoexist, NORMAL_EXEC,
2426 coex_dm->ps_tdma_du_adj_type =
2428 } else if (coex_dm->cur_ps_tdma == 11) {
2429 halbtc8192e2ant_ps_tdma(
2430 btcoexist, NORMAL_EXEC,
2432 coex_dm->ps_tdma_du_adj_type =
2434 } else if (coex_dm->cur_ps_tdma == 10) {
2435 halbtc8192e2ant_ps_tdma(
2436 btcoexist, NORMAL_EXEC,
2438 coex_dm->ps_tdma_du_adj_type =
2443 } else if (max_interval == 3) {
2445 if (coex_dm->cur_ps_tdma == 1) {
2446 halbtc8192e2ant_ps_tdma(btcoexist,
2447 NORMAL_EXEC, true, 7);
2448 coex_dm->ps_tdma_du_adj_type = 7;
2449 } else if (coex_dm->cur_ps_tdma == 2) {
2450 halbtc8192e2ant_ps_tdma(btcoexist,
2451 NORMAL_EXEC, true, 7);
2452 coex_dm->ps_tdma_du_adj_type = 7;
2453 } else if (coex_dm->cur_ps_tdma == 3) {
2454 halbtc8192e2ant_ps_tdma(btcoexist,
2455 NORMAL_EXEC, true, 7);
2456 coex_dm->ps_tdma_du_adj_type = 7;
2457 } else if (coex_dm->cur_ps_tdma == 4) {
2458 halbtc8192e2ant_ps_tdma(btcoexist,
2459 NORMAL_EXEC, true, 8);
2460 coex_dm->ps_tdma_du_adj_type = 8;
2462 if (coex_dm->cur_ps_tdma == 9) {
2463 halbtc8192e2ant_ps_tdma(btcoexist,
2464 NORMAL_EXEC, true, 15);
2465 coex_dm->ps_tdma_du_adj_type = 15;
2466 } else if (coex_dm->cur_ps_tdma == 10) {
2467 halbtc8192e2ant_ps_tdma(btcoexist,
2468 NORMAL_EXEC, true, 15);
2469 coex_dm->ps_tdma_du_adj_type = 15;
2470 } else if (coex_dm->cur_ps_tdma == 11) {
2471 halbtc8192e2ant_ps_tdma(btcoexist,
2472 NORMAL_EXEC, true, 15);
2473 coex_dm->ps_tdma_du_adj_type = 15;
2474 } else if (coex_dm->cur_ps_tdma == 12) {
2475 halbtc8192e2ant_ps_tdma(btcoexist,
2476 NORMAL_EXEC, true, 16);
2477 coex_dm->ps_tdma_du_adj_type = 16;
2480 if (coex_dm->cur_ps_tdma == 5) {
2481 halbtc8192e2ant_ps_tdma(
2482 btcoexist, NORMAL_EXEC,
2484 coex_dm->ps_tdma_du_adj_type =
2486 } else if (coex_dm->cur_ps_tdma == 6) {
2487 halbtc8192e2ant_ps_tdma(
2488 btcoexist, NORMAL_EXEC,
2490 coex_dm->ps_tdma_du_adj_type =
2492 } else if (coex_dm->cur_ps_tdma == 7) {
2493 halbtc8192e2ant_ps_tdma(
2494 btcoexist, NORMAL_EXEC,
2496 coex_dm->ps_tdma_du_adj_type =
2498 } else if (coex_dm->cur_ps_tdma == 13) {
2499 halbtc8192e2ant_ps_tdma(
2500 btcoexist, NORMAL_EXEC,
2502 coex_dm->ps_tdma_du_adj_type =
2504 } else if (coex_dm->cur_ps_tdma == 14) {
2505 halbtc8192e2ant_ps_tdma(
2506 btcoexist, NORMAL_EXEC,
2508 coex_dm->ps_tdma_du_adj_type =
2510 } else if (coex_dm->cur_ps_tdma == 15) {
2511 halbtc8192e2ant_ps_tdma(
2512 btcoexist, NORMAL_EXEC,
2514 coex_dm->ps_tdma_du_adj_type =
2517 } else if (result == 1) {
2518 if (coex_dm->cur_ps_tdma == 8) {
2519 halbtc8192e2ant_ps_tdma(
2520 btcoexist, NORMAL_EXEC,
2522 coex_dm->ps_tdma_du_adj_type =
2524 } else if (coex_dm->cur_ps_tdma == 7) {
2525 halbtc8192e2ant_ps_tdma(
2526 btcoexist, NORMAL_EXEC,
2528 coex_dm->ps_tdma_du_adj_type =
2530 } else if (coex_dm->cur_ps_tdma == 6) {
2531 halbtc8192e2ant_ps_tdma(
2532 btcoexist, NORMAL_EXEC,
2534 coex_dm->ps_tdma_du_adj_type =
2536 } else if (coex_dm->cur_ps_tdma == 16) {
2537 halbtc8192e2ant_ps_tdma(
2538 btcoexist, NORMAL_EXEC,
2540 coex_dm->ps_tdma_du_adj_type =
2542 } else if (coex_dm->cur_ps_tdma == 15) {
2543 halbtc8192e2ant_ps_tdma(
2544 btcoexist, NORMAL_EXEC,
2546 coex_dm->ps_tdma_du_adj_type =
2548 } else if (coex_dm->cur_ps_tdma == 14) {
2549 halbtc8192e2ant_ps_tdma(
2550 btcoexist, NORMAL_EXEC,
2552 coex_dm->ps_tdma_du_adj_type =
2557 if (coex_dm->cur_ps_tdma == 5) {
2558 halbtc8192e2ant_ps_tdma(btcoexist,
2559 NORMAL_EXEC, true, 3);
2560 coex_dm->ps_tdma_du_adj_type = 3;
2561 } else if (coex_dm->cur_ps_tdma == 6) {
2562 halbtc8192e2ant_ps_tdma(btcoexist,
2563 NORMAL_EXEC, true, 3);
2564 coex_dm->ps_tdma_du_adj_type = 3;
2565 } else if (coex_dm->cur_ps_tdma == 7) {
2566 halbtc8192e2ant_ps_tdma(btcoexist,
2567 NORMAL_EXEC, true, 3);
2568 coex_dm->ps_tdma_du_adj_type = 3;
2569 } else if (coex_dm->cur_ps_tdma == 8) {
2570 halbtc8192e2ant_ps_tdma(btcoexist,
2571 NORMAL_EXEC, true, 4);
2572 coex_dm->ps_tdma_du_adj_type = 4;
2574 if (coex_dm->cur_ps_tdma == 13) {
2575 halbtc8192e2ant_ps_tdma(btcoexist,
2576 NORMAL_EXEC, true, 11);
2577 coex_dm->ps_tdma_du_adj_type = 11;
2578 } else if (coex_dm->cur_ps_tdma == 14) {
2579 halbtc8192e2ant_ps_tdma(btcoexist,
2580 NORMAL_EXEC, true, 11);
2581 coex_dm->ps_tdma_du_adj_type = 11;
2582 } else if (coex_dm->cur_ps_tdma == 15) {
2583 halbtc8192e2ant_ps_tdma(btcoexist,
2584 NORMAL_EXEC, true, 11);
2585 coex_dm->ps_tdma_du_adj_type = 11;
2586 } else if (coex_dm->cur_ps_tdma == 16) {
2587 halbtc8192e2ant_ps_tdma(btcoexist,
2588 NORMAL_EXEC, true, 12);
2589 coex_dm->ps_tdma_du_adj_type = 12;
2592 if (coex_dm->cur_ps_tdma == 1) {
2593 halbtc8192e2ant_ps_tdma(
2594 btcoexist, NORMAL_EXEC,
2596 coex_dm->ps_tdma_du_adj_type =
2598 } else if (coex_dm->cur_ps_tdma == 2) {
2599 halbtc8192e2ant_ps_tdma(
2600 btcoexist, NORMAL_EXEC,
2602 coex_dm->ps_tdma_du_adj_type =
2604 } else if (coex_dm->cur_ps_tdma == 3) {
2605 halbtc8192e2ant_ps_tdma(
2606 btcoexist, NORMAL_EXEC,
2608 coex_dm->ps_tdma_du_adj_type =
2610 } else if (coex_dm->cur_ps_tdma == 9) {
2611 halbtc8192e2ant_ps_tdma(
2612 btcoexist, NORMAL_EXEC,
2614 coex_dm->ps_tdma_du_adj_type =
2616 } else if (coex_dm->cur_ps_tdma == 10) {
2617 halbtc8192e2ant_ps_tdma(
2618 btcoexist, NORMAL_EXEC,
2620 coex_dm->ps_tdma_du_adj_type =
2622 } else if (coex_dm->cur_ps_tdma == 11) {
2623 halbtc8192e2ant_ps_tdma(
2624 btcoexist, NORMAL_EXEC,
2626 coex_dm->ps_tdma_du_adj_type =
2629 } else if (result == 1) {
2630 if (coex_dm->cur_ps_tdma == 4) {
2631 halbtc8192e2ant_ps_tdma(
2632 btcoexist, NORMAL_EXEC,
2634 coex_dm->ps_tdma_du_adj_type =
2636 } else if (coex_dm->cur_ps_tdma == 3) {
2637 halbtc8192e2ant_ps_tdma(
2638 btcoexist, NORMAL_EXEC,
2640 coex_dm->ps_tdma_du_adj_type =
2642 } else if (coex_dm->cur_ps_tdma == 2) {
2643 halbtc8192e2ant_ps_tdma(
2644 btcoexist, NORMAL_EXEC,
2646 coex_dm->ps_tdma_du_adj_type =
2648 } else if (coex_dm->cur_ps_tdma == 12) {
2649 halbtc8192e2ant_ps_tdma(
2650 btcoexist, NORMAL_EXEC,
2652 coex_dm->ps_tdma_du_adj_type =
2654 } else if (coex_dm->cur_ps_tdma == 11) {
2655 halbtc8192e2ant_ps_tdma(
2656 btcoexist, NORMAL_EXEC,
2658 coex_dm->ps_tdma_du_adj_type =
2660 } else if (coex_dm->cur_ps_tdma == 10) {
2661 halbtc8192e2ant_ps_tdma(
2662 btcoexist, NORMAL_EXEC,
2664 coex_dm->ps_tdma_du_adj_type =
2672 /* if current PsTdma not match with the recorded one (when scan, dhcp...), */
2673 /* then we have to adjust it back to the previous record one. */
2674 if (coex_dm->cur_ps_tdma != coex_dm->ps_tdma_du_adj_type) {
2675 boolean scan = false, link = false, roam = false;
2677 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2678 "[BTCoex], PsTdma type dismatch!!!, cur_ps_tdma=%d, recordPsTdma=%d\n",
2679 coex_dm->cur_ps_tdma, coex_dm->ps_tdma_du_adj_type);
2680 BTC_TRACE(trace_buf);
2682 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2683 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2684 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2686 if (!scan && !link && !roam)
2687 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2688 coex_dm->ps_tdma_du_adj_type);
2690 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2691 "[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n");
2692 BTC_TRACE(trace_buf);
2697 /* ******************
2698 * pstdma for wifi rssi low
2699 * ****************** */
2700 void halbtc8192e2ant_tdma_duration_adjust_for_wifi_rssi_low(
2701 IN struct btc_coexist *btcoexist/* , */ /* IN u8 wifi_status */)
2703 static s32 up, dn, m, n, wait_count;
2704 s32 result; /* 0: no change, +1: increase WiFi duration, -1: decrease WiFi duration */
2705 u8 retry_count = 0, bt_info_ext;
2707 coex_dm->auto_tdma_adjust = false;
2709 retry_count = coex_sta->bt_retry_cnt;
2710 bt_info_ext = coex_sta->bt_info_ext;
2712 if (!coex_dm->auto_tdma_adjust_low_rssi) {
2713 coex_dm->auto_tdma_adjust_low_rssi = true;
2714 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 81);
2715 coex_dm->ps_tdma_du_adj_type = 81;
2724 /* acquire the BT TRx retry count from BT_Info byte2
2725 * retry_count = coex_sta->bt_retry_cnt;
2726 * bt_info_ext = coex_sta->bt_info_ext; */
2730 if ((coex_sta->low_priority_tx) > 1050 ||
2731 (coex_sta->low_priority_rx) > 1250)
2735 0) { /* no retry in the last 2-second duration */
2742 if (up >= n) { /* if retry count during continuous n*2 seconds is 0, enlarge WiFi duration */
2749 } else if (retry_count <=
2750 3) { /* <=3 retry in the last 2-second duration */
2757 if (dn == 2) { /* if continuous 2 retry count(every 2 seconds) >0 and < 3, reduce WiFi duration */
2758 if (wait_count <= 2)
2759 m++; /* to avoid loop between the two levels */
2763 if (m >= 20) /* maximum of m = 20 ' will recheck if need to adjust wifi duration in maximum time interval 120 seconds */
2772 } else { /* retry count > 3, once retry count > 3, to reduce WiFi duration */
2773 if (wait_count == 1)
2774 m++; /* to avoid loop between the two levels */
2778 if (m >= 20) /* maximum of m = 20 ' will recheck if need to adjust wifi duration in maximum time interval 120 seconds */
2789 if (coex_dm->cur_ps_tdma == 80) {
2790 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2792 coex_dm->ps_tdma_du_adj_type = 81;
2793 } else if (coex_dm->cur_ps_tdma == 81) {
2794 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2796 coex_dm->ps_tdma_du_adj_type = 82;
2797 } else if (coex_dm->cur_ps_tdma == 82) {
2798 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2800 coex_dm->ps_tdma_du_adj_type = 83;
2801 } else if (coex_dm->cur_ps_tdma == 83) {
2802 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2804 coex_dm->ps_tdma_du_adj_type = 84;
2806 } else if (result == 1) {
2807 if (coex_dm->cur_ps_tdma == 84) {
2808 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2810 coex_dm->ps_tdma_du_adj_type = 83;
2811 } else if (coex_dm->cur_ps_tdma == 83) {
2812 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2814 coex_dm->ps_tdma_du_adj_type = 82;
2815 } else if (coex_dm->cur_ps_tdma == 82) {
2816 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2818 coex_dm->ps_tdma_du_adj_type = 81;
2819 } else if ((coex_dm->cur_ps_tdma == 81) &&
2820 (coex_sta->scan_ap_num <= 5)) {
2821 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2823 coex_dm->ps_tdma_du_adj_type = 81;
2827 if (coex_dm->cur_ps_tdma != 80 &&
2828 coex_dm->cur_ps_tdma != 81 &&
2829 coex_dm->cur_ps_tdma != 82 &&
2830 coex_dm->cur_ps_tdma != 83 &&
2831 coex_dm->cur_ps_tdma != 84) {
2832 /* recover to previous adjust type */
2833 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2834 coex_dm->ps_tdma_du_adj_type);
2840 void halbtc8192e2ant_get_bt_rssi_threshold(IN struct btc_coexist *btcoexist,
2841 IN u8 *pThres0, IN u8 *pThres1)
2845 struct btc_board_info *board_info = &btcoexist->board_info;
2847 ant_type = board_info->ant_type;
2850 case BTC_ANT_TYPE_0:
2854 case BTC_ANT_TYPE_1:
2858 case BTC_ANT_TYPE_2:
2862 case BTC_ANT_TYPE_3:
2866 case BTC_ANT_TYPE_4:
2875 void halbtc8192e2ant_action_bt_relink(IN struct btc_coexist *btcoexist)
2877 if (coex_sta->wifi_is_high_pri_task) {
2878 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2879 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
2881 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2882 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2884 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2885 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2886 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
2887 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
2891 /* SCO only or SCO+PAN(HS) */
2892 void halbtc8192e2ant_action_sco(IN struct btc_coexist *btcoexist)
2894 u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
2896 u8 bt_thresh0 = 0, bt_thresh1 = 0;
2898 halbtc8192e2ant_get_bt_rssi_threshold(btcoexist, &bt_thresh0,
2900 bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, bt_thresh0,
2903 wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34,
2906 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))
2907 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2909 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2912 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))
2913 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2915 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2918 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2919 halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2920 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2922 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
2923 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
2926 void halbtc8192e2ant_action_sco_pan(IN struct btc_coexist *btcoexist)
2928 u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
2930 u8 bt_thresh0 = 0, bt_thresh1 = 0;
2933 halbtc8192e2ant_get_bt_rssi_threshold(btcoexist, &bt_thresh0,
2935 bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, bt_thresh0,
2938 wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34,
2941 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))
2942 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2944 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2948 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))
2949 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10);
2951 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 86);
2953 halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2954 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2956 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
2957 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)) &&
2958 (coex_sta->scan_ap_num < NOISY_AP_NUM_THRESH_8192E))
2959 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false,
2961 else if (BTC_RSSI_HIGH(wifi_rssi_state) &&
2962 (!BTC_RSSI_LOW(bt_rssi_state)) &&
2963 (coex_sta->scan_ap_num > NOISY_AP_NUM_THRESH_8192E))
2964 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false,
2967 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false,
2972 void halbtc8192e2ant_action_hid(IN struct btc_coexist *btcoexist)
2974 u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
2978 btcoexist->btc_get(btcoexist, BTC_GET_U1_ANT_TYPE, &anttype);
2980 wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0);
2981 bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, 34, 42);
2984 /*ANTTYPE = 0 2ant with SPDT*/
2985 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 28);
2986 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2987 } else if (anttype == 1) {
2988 /*2ant with coupler and bad ant. isolation, 3ant with bad ant. isolation*/
2989 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 28);
2990 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2991 } else if (anttype == 2) {
2992 /*ANTTYPE = 2, 2ant with coupler and normal/good ant. isolation, 3ant with normal ant. isolation*/
2993 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) {
2994 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
2995 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3);
2997 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
2998 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3);
3000 } else if (anttype == 3) {
3001 /*ANTTYPE = 3, 3ant with good ant. isolation*/
3002 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) {
3003 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3004 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3006 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3007 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3011 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3013 halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3014 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3016 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
3017 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
3020 /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
3021 void halbtc8192e2ant_action_a2dp(IN struct btc_coexist *btcoexist)
3023 u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
3025 boolean long_dist = false;
3028 btcoexist->btc_get(btcoexist, BTC_GET_U1_ANT_TYPE, &anttype);
3030 wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0);
3031 bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, 34, 42);
3034 /*ANTTYPE = 0 2ant with SPDT*/
3035 if ((coex_sta->scan_ap_num > 40) && (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))) {
3036 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 30);
3037 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3039 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 88);
3040 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3042 } else if (anttype == 1) {
3043 /*2ant with coupler and bad ant. isolation, 3ant with bad ant. isolation*/
3044 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) {
3045 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 25);
3046 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3048 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 88);
3049 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3051 } else if (anttype == 2) {
3052 /*ANTTYPE = 2, 2ant with coupler and normal/good ant. isolation, 3ant with normal ant. isolation*/
3053 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) {
3054 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
3055 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
3057 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 88);
3058 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3060 } else if (anttype == 3) {
3061 /*ANTTYPE = 3, 3ant with good ant. isolation*/
3062 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3063 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3065 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3066 halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3067 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3068 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
3069 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
3072 void halbtc8192e2ant_action_a2dp_pan_hs(IN struct btc_coexist *btcoexist)
3074 u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
3077 wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15,
3079 bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, 34, 42);
3081 halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3083 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3084 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
3086 if ((bt_rssi_state == BTC_RSSI_STATE_LOW) ||
3087 (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
3088 halbtc8192e2ant_tdma_duration_adjust(btcoexist, false, true, 2);
3089 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3090 } else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
3091 (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
3092 halbtc8192e2ant_tdma_duration_adjust(btcoexist, false, false,
3094 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3095 } else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3096 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3097 halbtc8192e2ant_tdma_duration_adjust(btcoexist, false, false,
3099 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4);
3103 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3104 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3105 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3106 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3107 halbtc8192e2ant_sw_mechanism1(btcoexist, true, false,
3109 halbtc8192e2ant_sw_mechanism2(btcoexist, true, false,
3112 halbtc8192e2ant_sw_mechanism1(btcoexist, true, false,
3114 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false,
3118 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3119 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3120 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false,
3122 halbtc8192e2ant_sw_mechanism2(btcoexist, true, false,
3125 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false,
3127 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false,
3133 void halbtc8192e2ant_action_pan_edr(IN struct btc_coexist *btcoexist)
3135 u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
3137 u8 bt_thresh0 = 0, bt_thresh1 = 0;
3139 halbtc8192e2ant_get_bt_rssi_threshold(btcoexist, &bt_thresh0,
3141 bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, bt_thresh0,
3143 /* wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0); */
3144 wifi_rssi_state = BTC_RSSI_STATE_LOW;
3146 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))
3147 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
3149 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3151 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))
3152 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1);
3154 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 85);
3156 halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3157 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3159 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
3160 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
3164 void halbtc8192e2ant_action_pan_hs(IN struct btc_coexist *btcoexist)
3166 u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
3169 wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15,
3171 bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, 34, 42);
3173 halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3175 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3177 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
3179 if ((bt_rssi_state == BTC_RSSI_STATE_LOW) ||
3180 (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW))
3181 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3182 else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
3183 (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM))
3184 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3185 else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3186 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
3187 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4);
3188 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3190 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3191 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3192 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3193 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3194 halbtc8192e2ant_sw_mechanism1(btcoexist, true, false,
3196 halbtc8192e2ant_sw_mechanism2(btcoexist, true, false,
3199 halbtc8192e2ant_sw_mechanism1(btcoexist, true, false,
3201 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false,
3205 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3206 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3207 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false,
3209 halbtc8192e2ant_sw_mechanism2(btcoexist, true, false,
3212 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false,
3214 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false,
3221 void halbtc8192e2ant_action_pan_edr_a2dp(IN struct btc_coexist *btcoexist)
3223 u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
3225 u8 bt_thresh0 = 0, bt_thresh1 = 0;
3227 halbtc8192e2ant_get_bt_rssi_threshold(btcoexist, &bt_thresh0,
3229 bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, bt_thresh0,
3231 /* wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0); */
3232 wifi_rssi_state = BTC_RSSI_STATE_LOW;
3234 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))
3235 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
3237 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3239 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))
3240 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 4);
3242 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 86);
3244 halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3245 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3247 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
3248 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
3252 void halbtc8192e2ant_action_pan_edr_hid(IN struct btc_coexist *btcoexist)
3254 u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
3256 u8 bt_thresh0 = 0, bt_thresh1 = 0;
3258 halbtc8192e2ant_get_bt_rssi_threshold(btcoexist, &bt_thresh0,
3260 bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, bt_thresh0,
3263 wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34,
3266 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))
3267 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3);
3269 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3271 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))
3272 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10);
3274 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 86);
3276 halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3277 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3279 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
3280 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
3283 /* HID+A2DP+PAN(EDR) */
3284 void halbtc8192e2ant_action_hid_a2dp_pan_edr(IN struct btc_coexist *btcoexist)
3286 u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
3288 u8 bt_thresh0 = 0, bt_thresh1 = 0;
3290 halbtc8192e2ant_get_bt_rssi_threshold(btcoexist, &bt_thresh0,
3292 bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, bt_thresh0,
3294 wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34,
3297 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))
3298 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3);
3300 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3302 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))
3303 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 4);
3305 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 86);
3307 halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3308 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3310 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
3311 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
3314 void halbtc8192e2ant_action_hid_a2dp(IN struct btc_coexist *btcoexist)
3316 u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
3318 u8 bt_thresh0 = 0, bt_thresh1 = 0, anttype = 0;
3320 btcoexist->btc_get(btcoexist, BTC_GET_U1_ANT_TYPE, &anttype);
3322 wifi_rssi_state = halbtc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 34, 0);
3323 bt_rssi_state = halbtc8192e2ant_bt_rssi_state(3, 34, 42);
3327 if ((coex_sta->scan_ap_num > 40) && (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state)))) {
3328 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 31);
3329 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 11);
3331 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 88);
3332 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
3334 } else if (anttype == 1) {
3335 /*2ant with coupler and bad ant. isolation, 3ant with bad ant. isolation*/
3336 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) {
3337 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 25);
3338 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
3340 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 87);
3341 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
3343 } else if (anttype == 2) {
3344 /*ANTTYPE = 2, 2ant with coupler and normal/good ant. isolation, 3ant with normal ant. isolation*/
3345 if (BTC_RSSI_HIGH(wifi_rssi_state) && (!BTC_RSSI_LOW(bt_rssi_state))) {
3346 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 25);
3347 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
3349 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 87);
3350 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
3352 } else if (anttype == 3) {
3353 /*ANTTYPE = 3, 3ant with good ant. isolation*/
3354 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3355 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3358 halbtc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3359 halbtc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3361 halbtc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
3362 halbtc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
3365 void halbtc8192e2ant_run_coexist_mechanism(IN struct btc_coexist *btcoexist)
3369 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3370 "[BTCoex], RunCoexistMechanism()===>\n");
3371 BTC_TRACE(trace_buf);
3373 if (btcoexist->manual_control) {
3374 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3375 "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
3376 BTC_TRACE(trace_buf);
3380 if (coex_sta->under_ips) {
3381 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3382 "[BTCoex], wifi is under IPS !!!\n");
3383 BTC_TRACE(trace_buf);
3387 algorithm = halbtc8192e2ant_action_algorithm(btcoexist);
3388 if (coex_sta->c2h_bt_inquiry_page &&
3389 (BT_8192E_2ANT_COEX_ALGO_PANHS != algorithm)) {
3390 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3391 "[BTCoex], BT is under inquiry/page scan !!\n");
3392 BTC_TRACE(trace_buf);
3393 halbtc8192e2ant_action_bt_inquiry(btcoexist);
3397 if (coex_sta->is_setup_link) {
3398 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3399 "[BTCoex], BT is re-link !!!\n");
3400 halbtc8192e2ant_action_bt_relink(btcoexist);
3405 coex_dm->cur_algorithm = algorithm;
3406 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Algorithm = %d\n",
3407 coex_dm->cur_algorithm);
3408 BTC_TRACE(trace_buf);
3410 if (halbtc8192e2ant_is_common_action(btcoexist)) {
3411 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3412 "[BTCoex], Action 2-Ant common.\n");
3413 BTC_TRACE(trace_buf);
3414 coex_dm->auto_tdma_adjust = false;
3415 coex_dm->auto_tdma_adjust_low_rssi = false;
3418 if (coex_dm->cur_algorithm != coex_dm->pre_algorithm) {
3419 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3420 "[BTCoex], pre_algorithm=%d, cur_algorithm=%d\n",
3421 coex_dm->pre_algorithm, coex_dm->cur_algorithm);
3422 BTC_TRACE(trace_buf);
3423 coex_dm->auto_tdma_adjust = false;
3424 coex_dm->auto_tdma_adjust_low_rssi = false;
3427 switch (coex_dm->cur_algorithm) {
3428 case BT_8192E_2ANT_COEX_ALGO_SCO:
3429 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3430 "[BTCoex], Action 2-Ant, algorithm = SCO.\n");
3431 BTC_TRACE(trace_buf);
3432 halbtc8192e2ant_action_sco(btcoexist);
3434 case BT_8192E_2ANT_COEX_ALGO_SCO_PAN:
3435 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3436 "[BTCoex], Action 2-Ant, algorithm = SCO+PAN(EDR).\n");
3437 BTC_TRACE(trace_buf);
3438 halbtc8192e2ant_action_sco_pan(btcoexist);
3440 case BT_8192E_2ANT_COEX_ALGO_HID:
3441 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3442 "[BTCoex], Action 2-Ant, algorithm = HID.\n");
3443 BTC_TRACE(trace_buf);
3444 halbtc8192e2ant_action_hid(btcoexist);
3446 case BT_8192E_2ANT_COEX_ALGO_A2DP:
3447 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3448 "[BTCoex], Action 2-Ant, algorithm = A2DP.\n");
3449 BTC_TRACE(trace_buf);
3450 halbtc8192e2ant_action_a2dp(btcoexist);
3452 case BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS:
3453 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3454 "[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n");
3455 BTC_TRACE(trace_buf);
3456 halbtc8192e2ant_action_a2dp_pan_hs(btcoexist);
3458 case BT_8192E_2ANT_COEX_ALGO_PANEDR:
3459 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3460 "[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n");
3461 BTC_TRACE(trace_buf);
3462 halbtc8192e2ant_action_pan_edr(btcoexist);
3464 case BT_8192E_2ANT_COEX_ALGO_PANHS:
3465 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3466 "[BTCoex], Action 2-Ant, algorithm = HS mode.\n");
3467 BTC_TRACE(trace_buf);
3468 halbtc8192e2ant_action_pan_hs(btcoexist);
3470 case BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP:
3471 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3472 "[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n");
3473 BTC_TRACE(trace_buf);
3474 halbtc8192e2ant_action_pan_edr_a2dp(btcoexist);
3476 case BT_8192E_2ANT_COEX_ALGO_PANEDR_HID:
3477 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3478 "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n");
3479 BTC_TRACE(trace_buf);
3480 halbtc8192e2ant_action_pan_edr_hid(btcoexist);
3482 case BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
3483 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3484 "[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n");
3485 BTC_TRACE(trace_buf);
3486 halbtc8192e2ant_action_hid_a2dp_pan_edr(
3489 case BT_8192E_2ANT_COEX_ALGO_HID_A2DP:
3490 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3491 "[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n");
3492 BTC_TRACE(trace_buf);
3493 halbtc8192e2ant_action_hid_a2dp(btcoexist);
3496 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3497 "[BTCoex], Action 2-Ant, algorithm = unknown!!\n");
3498 BTC_TRACE(trace_buf);
3499 halbtc8192e2ant_coex_all_off(btcoexist);
3502 coex_dm->pre_algorithm = coex_dm->cur_algorithm;
3506 void halbtc8192e2ant_init_hw_config(IN struct btc_coexist *btcoexist,
3512 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3513 "[BTCoex], 2Ant Init HW Config!!\n");
3514 BTC_TRACE(trace_buf);
3517 /* backup rf 0x1e value */
3518 coex_dm->bt_rf_0x1e_backup =
3519 btcoexist->btc_get_rf_reg(btcoexist, BTC_RF_A, 0x1e,
3522 coex_dm->backup_arfr_cnt1 = btcoexist->btc_read_4byte(btcoexist,
3524 coex_dm->backup_arfr_cnt2 = btcoexist->btc_read_4byte(btcoexist,
3526 coex_dm->backup_retry_limit = btcoexist->btc_read_2byte(
3528 coex_dm->backup_ampdu_max_time = btcoexist->btc_read_1byte(
3532 /* antenna sw ctrl to bt */
3533 halbtc8192e2ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, true, false);
3535 halbtc8192e2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
3537 /* antenna switch control parameter */
3538 /* btcoexist->btc_write_4byte(btcoexist, 0x858, 0x55555555); */
3540 /* coex parameters */
3541 btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
3542 /* 0x790[5:0]=0x5 */
3543 u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
3546 btcoexist->btc_write_1byte(btcoexist, 0x790, u8tmp);
3548 /* enable counter statistics */
3549 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
3552 btcoexist->btc_write_1byte(btcoexist, 0x40, 0x20);
3553 /* enable mailbox interface */
3554 u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x40);
3556 btcoexist->btc_write_2byte(btcoexist, 0x40, u16tmp);
3558 /* enable PTA I2C mailbox */
3559 u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x101);
3561 btcoexist->btc_write_1byte(btcoexist, 0x101, u8tmp);
3563 /* enable bt clock when wifi is disabled. */
3564 u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x93);
3566 btcoexist->btc_write_1byte(btcoexist, 0x93, u8tmp);
3567 /* enable bt clock when suspend. */
3568 u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x7);
3570 btcoexist->btc_write_1byte(btcoexist, 0x7, u8tmp);
3572 /* Give bt_coex_supported_version the default value */
3573 coex_sta->bt_coex_supported_version = 0;
3576 /* ************************************************************
3577 * work around function start with wa_halbtc8192e2ant_
3578 * ************************************************************
3579 * ************************************************************
3580 * extern function start with ex_halbtc8192e2ant_
3581 * ************************************************************ */
3582 void ex_halbtc8192e2ant_power_on_setting(IN struct btc_coexist *btcoexist)
3586 void ex_halbtc8192e2ant_init_hw_config(IN struct btc_coexist *btcoexist,
3587 IN boolean wifi_only)
3589 halbtc8192e2ant_init_hw_config(btcoexist, true);
3592 void ex_halbtc8192e2ant_init_coex_dm(IN struct btc_coexist *btcoexist)
3594 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3595 "[BTCoex], Coex Mechanism Init!!\n");
3596 BTC_TRACE(trace_buf);
3598 halbtc8192e2ant_init_coex_dm(btcoexist);
3601 void ex_halbtc8192e2ant_display_coex_info(IN struct btc_coexist *btcoexist)
3603 struct btc_board_info *board_info = &btcoexist->board_info;
3604 struct btc_stack_info *stack_info = &btcoexist->stack_info;
3605 u8 *cli_buf = btcoexist->cli_buf;
3606 u8 u8tmp[4], i, bt_info_ext, ps_tdma_case = 0;
3609 u32 fa_ofdm, fa_cck, cca_ofdm, cca_cck;
3610 u32 fw_ver = 0, bt_patch_ver = 0, bt_coex_ver = 0;
3613 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3614 "\r\n ============[BT Coexist info]============");
3617 if (btcoexist->manual_control) {
3618 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3619 "\r\n ============[Under Manual Control]============");
3621 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3622 "\r\n ==========================================");
3626 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ",
3627 "Ant PG number/ Ant mechanism:",
3628 board_info->pg_ant_num, board_info->btdm_ant_num);
3631 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "Antenna type:",
3632 board_info->ant_type);
3635 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
3636 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3637 phyver = btcoexist->btc_get_bt_phydm_version(btcoexist);
3638 bt_coex_ver = ((coex_sta->bt_coex_supported_version & 0xff00) >> 8);
3640 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3641 "\r\n %-35s = %d_%02x/ 0x%02x/ 0x%02x (%s)",
3642 "CoexVer WL/ BT_Desired/ BT_Report",
3643 glcoex_ver_date_8192e_2ant, glcoex_ver_8192e_2ant,
3644 glcoex_ver_btdesired_8192e_2ant, bt_coex_ver,
3645 (bt_coex_ver == 0xff ? "Unknown" : (bt_coex_ver >=
3646 glcoex_ver_btdesired_8192e_2ant ? "Match" :
3651 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3652 "\r\n %-35s = 0x%x/ 0x%x/ v%d",
3653 "W_FW/ B_FW/ Phy", fw_ver, bt_patch_ver, phyver);
3656 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ",
3657 "Wifi channel informed to BT",
3658 coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1],
3659 coex_dm->wifi_chnl_info[2]);
3662 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/", "WifibHiPri",
3663 (coex_sta->wifi_is_high_pri_task ? "Yes" : "No"));
3667 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/", "test patch version",
3673 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
3674 "============[Wifi Status]============");
3676 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_WIFI_STATUS);
3678 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
3679 "============[BT Status]============");
3682 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ",
3683 "BT [status/ rssi/ retryCnt]",
3684 ((coex_sta->bt_disabled) ? ("disabled") : ((
3685 coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan")
3686 : ((BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
3687 coex_dm->bt_status) ? "non-connected idle" :
3688 ((BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)
3689 ? "connected-idle" : "busy")))),
3690 coex_sta->bt_rssi, coex_sta->bt_retry_cnt);
3693 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d",
3695 stack_info->sco_exist, stack_info->hid_exist,
3696 stack_info->pan_exist, stack_info->a2dp_exist);
3698 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO);
3700 bt_info_ext = coex_sta->bt_info_ext;
3701 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s",
3702 "BT Info A2DP rate",
3703 (bt_info_ext & BIT(0)) ? "Basic rate" : "EDR rate");
3706 for (i = 0; i < BT_INFO_SRC_8192E_2ANT_MAX; i++) {
3707 if (coex_sta->bt_info_c2h_cnt[i]) {
3708 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3709 "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)",
3710 glbt_info_src_8192e_2ant[i],
3711 coex_sta->bt_info_c2h[i][0],
3712 coex_sta->bt_info_c2h[i][1],
3713 coex_sta->bt_info_c2h[i][2],
3714 coex_sta->bt_info_c2h[i][3],
3715 coex_sta->bt_info_c2h[i][4],
3716 coex_sta->bt_info_c2h[i][5],
3717 coex_sta->bt_info_c2h[i][6],
3718 coex_sta->bt_info_c2h_cnt[i]);
3723 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "SS Type",
3724 coex_dm->cur_ss_type);
3728 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
3729 "============[Sw mechanism]============");
3731 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ",
3732 "SM1[ShRf/ LpRA/ LimDig]",
3733 coex_dm->cur_rf_rx_lpf_shrink, coex_dm->cur_low_penalty_ra,
3734 coex_dm->limited_dig);
3736 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d(0x%x) ",
3737 "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]",
3738 coex_dm->cur_agc_table_en, coex_dm->cur_adc_back_off,
3739 coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl);
3743 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
3744 "============[Fw mechanism]============");
3747 ps_tdma_case = coex_dm->cur_ps_tdma;
3748 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3749 "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)",
3751 coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1],
3752 coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3],
3753 coex_dm->ps_tdma_para[4], ps_tdma_case,
3754 coex_dm->auto_tdma_adjust);
3757 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ",
3758 "DecBtPwr/ IgnWlanAct",
3759 coex_dm->cur_bt_dec_pwr_lvl, coex_dm->cur_ignore_wlan_act);
3763 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
3764 "============[Hw setting]============");
3767 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x",
3768 "RF-A, 0x1e initVal",
3769 coex_dm->bt_rf_0x1e_backup);
3772 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
3773 "backup ARFR1/ARFR2/RL/AMaxTime",
3774 coex_dm->backup_arfr_cnt1, coex_dm->backup_arfr_cnt2,
3775 coex_dm->backup_retry_limit,
3776 coex_dm->backup_ampdu_max_time);
3779 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
3780 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
3781 u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
3782 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
3783 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
3784 "0x430/0x434/0x42a/0x456",
3785 u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]);
3788 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc04);
3789 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xd04);
3790 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x90c);
3791 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
3792 "0xc04/ 0xd04/ 0x90c",
3793 u32tmp[0], u32tmp[1], u32tmp[2]);
3796 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
3797 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x880);
3798 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x778/0x880[29:25]",
3799 u8tmp[0], (u32tmp[0] & 0x3e000000) >> 25);
3802 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x92c);
3803 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x930);
3804 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
3806 (u8tmp[0]), u32tmp[0]);
3809 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40);
3810 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x4f);
3811 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
3813 u8tmp[0], u8tmp[1]);
3816 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
3817 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
3818 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
3819 "0x550(bcn ctrl)/0x522",
3820 u32tmp[0], u8tmp[0]);
3823 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
3824 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0xc50(dig)",
3828 fa_ofdm = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
3829 PHYDM_INFO_FA_OFDM);
3830 fa_cck = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
3832 cca_ofdm = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
3833 PHYDM_INFO_CCA_OFDM);
3834 cca_cck = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
3835 PHYDM_INFO_CCA_CCK);
3837 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3838 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
3839 "CCK-CCA/CCK-FA/OFDM-CCA/OFDM-FA",
3840 cca_cck, fa_cck, cca_ofdm, fa_ofdm);
3843 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
3844 "CRC_OK CCK/11g/11n/11n-agg",
3845 coex_sta->crc_ok_cck, coex_sta->crc_ok_11g,
3846 coex_sta->crc_ok_11n, coex_sta->crc_ok_11n_vht);
3849 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
3850 "CRC_Err CCK/11g/11n/11n-agg",
3851 coex_sta->crc_err_cck, coex_sta->crc_err_11g,
3852 coex_sta->crc_err_11n, coex_sta->crc_err_11n_vht);
3855 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
3856 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
3857 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
3858 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
3859 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3860 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
3861 "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)",
3862 u32tmp[0], u32tmp[1], u32tmp[2], u8tmp[0]);
3865 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
3866 "0x770(hp rx[31:16]/tx[15:0])",
3867 coex_sta->high_priority_rx, coex_sta->high_priority_tx);
3869 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
3870 "0x774(lp rx[31:16]/tx[15:0])",
3871 coex_sta->low_priority_rx, coex_sta->low_priority_tx);
3873 #if (BT_AUTO_REPORT_ONLY_8192E_2ANT == 1)
3874 halbtc8192e2ant_monitor_bt_ctr(btcoexist);
3876 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS);
3880 void ex_halbtc8192e2ant_ips_notify(IN struct btc_coexist *btcoexist, IN u8 type)
3882 if (BTC_IPS_ENTER == type) {
3883 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3884 "[BTCoex], IPS ENTER notify\n");
3885 BTC_TRACE(trace_buf);
3886 coex_sta->under_ips = true;
3887 halbtc8192e2ant_coex_all_off(btcoexist);
3888 halbtc8192e2ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, true);
3889 halbtc8192e2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
3890 } else if (BTC_IPS_LEAVE == type) {
3891 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3892 "[BTCoex], IPS LEAVE notify\n");
3893 BTC_TRACE(trace_buf);
3894 coex_sta->under_ips = false;
3895 halbtc8192e2ant_init_hw_config(btcoexist, false);
3896 halbtc8192e2ant_init_coex_dm(btcoexist);
3900 void ex_halbtc8192e2ant_lps_notify(IN struct btc_coexist *btcoexist, IN u8 type)
3902 if (BTC_LPS_ENABLE == type) {
3903 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3904 "[BTCoex], LPS ENABLE notify\n");
3905 BTC_TRACE(trace_buf);
3906 coex_sta->under_lps = true;
3908 } else if (BTC_LPS_DISABLE == type) {
3909 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3910 "[BTCoex], LPS DISABLE notify\n");
3911 BTC_TRACE(trace_buf);
3912 coex_sta->under_lps = false;
3916 void ex_halbtc8192e2ant_scan_notify(IN struct btc_coexist *btcoexist,
3919 if (BTC_SCAN_START == type) {
3920 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3921 "[BTCoex], SCAN START notify\n");
3922 BTC_TRACE(trace_buf);
3923 } else if (BTC_SCAN_FINISH == type) {
3924 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3925 "[BTCoex], SCAN FINISH notify\n");
3926 BTC_TRACE(trace_buf);
3927 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
3928 &coex_sta->scan_ap_num);
3933 void ex_halbtc8192e2ant_connect_notify(IN struct btc_coexist *btcoexist,
3936 if (BTC_ASSOCIATE_START == type) {
3937 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3938 "[BTCoex], CONNECT START notify\n");
3939 BTC_TRACE(trace_buf);
3940 coex_sta->wifi_is_high_pri_task = true;
3941 coex_sta->cnt_wifi_high_pri = 2;
3942 halbtc8192e2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, false);
3943 halbtc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
3944 halbtc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 11);
3945 halbtc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3946 } else if (BTC_ASSOCIATE_FINISH == type) {
3947 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3948 "[BTCoex], CONNECT FINISH notify\n");
3949 BTC_TRACE(trace_buf);
3950 coex_sta->wifi_is_high_pri_task = false;
3951 halbtc8192e2ant_run_coexist_mechanism(btcoexist);
3955 void ex_halbtc8192e2ant_media_status_notify(IN struct btc_coexist *btcoexist,
3958 u8 h2c_parameter[3] = {0};
3960 u8 wifi_central_chnl;
3962 if (btcoexist->manual_control ||
3963 btcoexist->stop_coex_dm ||
3964 coex_sta->bt_disabled)
3967 if (BTC_MEDIA_CONNECT == type) {
3968 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3969 "[BTCoex], MEDIA connect notify\n");
3970 BTC_TRACE(trace_buf);
3972 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3973 "[BTCoex], MEDIA disconnect notify\n");
3974 BTC_TRACE(trace_buf);
3977 /* only 2.4G we need to inform bt the chnl mask */
3978 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
3979 &wifi_central_chnl);
3980 if ((BTC_MEDIA_CONNECT == type) &&
3981 (wifi_central_chnl <= 14)) {
3982 h2c_parameter[0] = 0x1;
3983 h2c_parameter[1] = wifi_central_chnl;
3984 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3985 if (BTC_WIFI_BW_HT40 == wifi_bw)
3986 h2c_parameter[2] = 0x30;
3988 h2c_parameter[2] = 0x20;
3991 coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
3992 coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
3993 coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
3995 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
3998 void ex_halbtc8192e2ant_specific_packet_notify(IN struct btc_coexist *btcoexist,
4001 if (type == BTC_PACKET_DHCP) {
4002 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4003 "[BTCoex], DHCP Packet notify\n");
4004 BTC_TRACE(trace_buf);
4008 void ex_halbtc8192e2ant_bt_info_notify(IN struct btc_coexist *btcoexist,
4009 IN u8 *tmp_buf, IN u8 length)
4012 u8 i, rsp_source = 0;
4013 boolean bt_busy = false, limited_dig = false;
4014 boolean wifi_connected = false;
4015 static u8 bt_info_for_wifi_fw_count = 0;
4017 coex_sta->c2h_bt_info_req_sent = false;
4019 rsp_source = tmp_buf[0] & 0xf;
4020 if (rsp_source >= BT_INFO_SRC_8192E_2ANT_MAX)
4021 rsp_source = BT_INFO_SRC_8192E_2ANT_WIFI_FW;
4022 coex_sta->bt_info_c2h_cnt[rsp_source]++;
4024 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4025 "[BTCoex], Bt info[%d], length=%d, hex data=[", rsp_source,
4027 BTC_TRACE(trace_buf);
4029 /*avoid mailbox issue*/
4030 if (rsp_source == BT_INFO_SRC_8192E_2ANT_WIFI_FW) {
4031 bt_info_for_wifi_fw_count++;
4032 if (bt_info_for_wifi_fw_count < 5)
4035 bt_info_for_wifi_fw_count = 0;
4037 for (i = 0; i < length; i++) {
4038 coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
4040 bt_info = tmp_buf[i];
4041 if (i == length - 1) {
4042 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x]\n",
4044 BTC_TRACE(trace_buf);
4046 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x, ",
4048 BTC_TRACE(trace_buf);
4052 if (BT_INFO_SRC_8192E_2ANT_WIFI_FW != rsp_source) {
4053 coex_sta->bt_retry_cnt = /* [3:0] */
4054 coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
4057 coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;
4059 coex_sta->bt_info_ext =
4060 coex_sta->bt_info_c2h[rsp_source][4];
4062 /* Here we need to resend some wifi info to BT */
4063 /* because bt is reset and loss of the info. */
4064 if ((coex_sta->bt_info_ext & BIT(1))) {
4065 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4066 "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
4067 BTC_TRACE(trace_buf);
4068 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
4071 ex_halbtc8192e2ant_media_status_notify(
4072 btcoexist, BTC_MEDIA_CONNECT);
4074 ex_halbtc8192e2ant_media_status_notify(
4075 btcoexist, BTC_MEDIA_DISCONNECT);
4078 if (coex_sta->bt_info_ext & BIT(2)) {
4079 coex_sta->cnt_setup_link++;
4080 coex_sta->is_setup_link = true;
4082 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4083 "[BTCoex], Re-Link start in BT info!!\n");
4084 BTC_TRACE(trace_buf);
4086 coex_sta->is_setup_link = false;
4088 if ((coex_sta->bt_info_ext & BIT(3))) {
4089 if (!btcoexist->manual_control &&
4090 !btcoexist->stop_coex_dm) {
4091 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4092 "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
4093 BTC_TRACE(trace_buf);
4094 halbtc8192e2ant_ignore_wlan_act(btcoexist,
4098 /* BT already NOT ignore Wlan active, do nothing here. */
4101 #if (BT_AUTO_REPORT_ONLY_8192E_2ANT == 0)
4102 if ((coex_sta->bt_info_ext & BIT(4))) {
4103 /* BT auto report already enabled, do nothing */
4105 halbtc8192e2ant_bt_auto_report(btcoexist, FORCE_EXEC,
4110 /* check BIT2 first ==> check if bt is under inquiry or page scan */
4111 if (bt_info & BT_INFO_8192E_2ANT_B_INQ_PAGE)
4112 coex_sta->c2h_bt_inquiry_page = true;
4114 coex_sta->c2h_bt_inquiry_page = false;
4116 /* set link exist status */
4117 if (!(bt_info & BT_INFO_8192E_2ANT_B_CONNECTION)) {
4118 coex_sta->bt_link_exist = false;
4119 coex_sta->pan_exist = false;
4120 coex_sta->a2dp_exist = false;
4121 coex_sta->hid_exist = false;
4122 coex_sta->sco_exist = false;
4123 } else { /* connection exists */
4124 coex_sta->bt_link_exist = true;
4125 if (bt_info & BT_INFO_8192E_2ANT_B_FTP)
4126 coex_sta->pan_exist = true;
4128 coex_sta->pan_exist = false;
4129 if (bt_info & BT_INFO_8192E_2ANT_B_A2DP)
4130 coex_sta->a2dp_exist = true;
4132 coex_sta->a2dp_exist = false;
4133 if (bt_info & BT_INFO_8192E_2ANT_B_HID)
4134 coex_sta->hid_exist = true;
4136 coex_sta->hid_exist = false;
4137 if (bt_info & BT_INFO_8192E_2ANT_B_SCO_ESCO)
4138 coex_sta->sco_exist = true;
4140 coex_sta->sco_exist = false;
4143 halbtc8192e2ant_update_bt_link_info(btcoexist);
4145 if (!(bt_info & BT_INFO_8192E_2ANT_B_CONNECTION)) {
4146 coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE;
4147 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4148 "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
4149 BTC_TRACE(trace_buf);
4150 } else if (bt_info ==
4151 BT_INFO_8192E_2ANT_B_CONNECTION) { /* connection exists but no busy */
4152 coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE;
4153 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4154 "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
4155 BTC_TRACE(trace_buf);
4156 } else if ((bt_info & BT_INFO_8192E_2ANT_B_SCO_ESCO) ||
4157 (bt_info & BT_INFO_8192E_2ANT_B_SCO_BUSY)) {
4158 coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_SCO_BUSY;
4159 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4160 "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
4161 BTC_TRACE(trace_buf);
4162 } else if (bt_info & BT_INFO_8192E_2ANT_B_ACL_BUSY) {
4163 coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_ACL_BUSY;
4164 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4165 "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
4166 BTC_TRACE(trace_buf);
4168 coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_MAX;
4169 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4170 "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
4171 BTC_TRACE(trace_buf);
4174 if ((BT_8192E_2ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
4175 (BT_8192E_2ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
4176 (BT_8192E_2ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) {
4181 limited_dig = false;
4184 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
4186 coex_dm->limited_dig = limited_dig;
4187 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig);
4189 halbtc8192e2ant_run_coexist_mechanism(btcoexist);
4192 void ex_halbtc8192e2ant_halt_notify(IN struct btc_coexist *btcoexist)
4194 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Halt notify\n");
4195 BTC_TRACE(trace_buf);
4197 halbtc8192e2ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, true);
4198 halbtc8192e2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
4199 ex_halbtc8192e2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
4202 void ex_halbtc8192e2ant_periodical(IN struct btc_coexist *btcoexist)
4204 boolean wifi_connected = false;
4205 static u8 count = 0;
4206 static boolean pre_wifi_connected = false;
4208 if ((coex_sta->bt_coex_supported_version == 0) ||
4209 (coex_sta->bt_coex_supported_version == 0xffff))
4210 coex_sta->bt_coex_supported_version =
4211 btcoexist->btc_get_bt_coex_supported_version(btcoexist);
4214 /*If wifi is connecting, the update of wifi channel mask may fail caused by wifi FW*/
4215 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
4217 if (pre_wifi_connected != wifi_connected)
4225 ex_halbtc8192e2ant_media_status_notify(btcoexist, BTC_MEDIA_CONNECT);
4227 ex_halbtc8192e2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
4230 pre_wifi_connected = wifi_connected;
4231 /*If wifi is connecting, the update of wifi channel mask may fail caused by wifi FW*/
4234 #if (BT_AUTO_REPORT_ONLY_8192E_2ANT == 0)
4235 halbtc8192e2ant_query_bt_info(btcoexist);
4236 halbtc8192e2ant_monitor_bt_ctr(btcoexist);
4237 halbtc8192e2ant_monitor_wifi_ctr(btcoexist);
4238 halbtc8192e2ant_monitor_bt_enable_disable(btcoexist);
4240 halbtc8192e2ant_monitor_wifi_ctr(btcoexist);
4242 if (halbtc8192e2ant_is_wifi_status_changed(btcoexist) ||
4243 coex_dm->auto_tdma_adjust)
4244 halbtc8192e2ant_run_coexist_mechanism(btcoexist);
4250 #endif /* #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) */