1 /* ************************************************************
4 * This file is for RTL8822B 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 (RTL8822B_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_8822b_1ant glcoex_dm_8822b_1ant;
25 static struct coex_dm_8822b_1ant *coex_dm = &glcoex_dm_8822b_1ant;
26 static struct coex_sta_8822b_1ant glcoex_sta_8822b_1ant;
27 static struct coex_sta_8822b_1ant *coex_sta = &glcoex_sta_8822b_1ant;
28 static struct psdscan_sta_8822b_1ant gl_psd_scan_8822b_1ant;
29 static struct psdscan_sta_8822b_1ant *psd_scan = &gl_psd_scan_8822b_1ant;
30 static struct rfe_type_8822b_1ant gl_rfe_type_8822b_1ant;
31 static struct rfe_type_8822b_1ant *rfe_type = &gl_rfe_type_8822b_1ant;
35 const char *const glbt_info_src_8822b_1ant[] = {
38 "BT Info[bt auto report]",
41 u32 glcoex_ver_date_8822b_1ant = 20161026;
42 u32 glcoex_ver_8822b_1ant = 0x34;
43 u32 glcoex_ver_btdesired_8822b_1ant = 0x28;
46 /* ************************************************************
47 * local function proto type if needed
48 * ************************************************************
49 * ************************************************************
50 * local function start with halbtc8822b1ant_
51 * ************************************************************ */
52 u8 halbtc8822b1ant_bt_rssi_state(u8 level_num, u8 rssi_thresh, u8 rssi_thresh1)
55 u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;
57 bt_rssi = coex_sta->bt_rssi;
60 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
61 (coex_sta->pre_bt_rssi_state ==
62 BTC_RSSI_STATE_STAY_LOW)) {
63 if (bt_rssi >= (rssi_thresh +
64 BTC_RSSI_COEX_THRESH_TOL_8822B_1ANT))
65 bt_rssi_state = BTC_RSSI_STATE_HIGH;
67 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
69 if (bt_rssi < rssi_thresh)
70 bt_rssi_state = BTC_RSSI_STATE_LOW;
72 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
74 } else if (level_num == 3) {
75 if (rssi_thresh > rssi_thresh1) {
76 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
77 "[BTCoex], BT Rssi thresh error!!\n");
79 return coex_sta->pre_bt_rssi_state;
82 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
83 (coex_sta->pre_bt_rssi_state ==
84 BTC_RSSI_STATE_STAY_LOW)) {
85 if (bt_rssi >= (rssi_thresh +
86 BTC_RSSI_COEX_THRESH_TOL_8822B_1ANT))
87 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
89 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
90 } else if ((coex_sta->pre_bt_rssi_state ==
91 BTC_RSSI_STATE_MEDIUM) ||
92 (coex_sta->pre_bt_rssi_state ==
93 BTC_RSSI_STATE_STAY_MEDIUM)) {
94 if (bt_rssi >= (rssi_thresh1 +
95 BTC_RSSI_COEX_THRESH_TOL_8822B_1ANT))
96 bt_rssi_state = BTC_RSSI_STATE_HIGH;
97 else if (bt_rssi < rssi_thresh)
98 bt_rssi_state = BTC_RSSI_STATE_LOW;
100 bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
102 if (bt_rssi < rssi_thresh1)
103 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
105 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
109 coex_sta->pre_bt_rssi_state = bt_rssi_state;
111 return bt_rssi_state;
114 u8 halbtc8822b1ant_wifi_rssi_state(IN struct btc_coexist *btcoexist,
115 IN u8 index, IN u8 level_num, IN u8 rssi_thresh, IN u8 rssi_thresh1)
118 u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
120 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
122 if (level_num == 2) {
123 if ((coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW)
125 (coex_sta->pre_wifi_rssi_state[index] ==
126 BTC_RSSI_STATE_STAY_LOW)) {
127 if (wifi_rssi >= (rssi_thresh +
128 BTC_RSSI_COEX_THRESH_TOL_8822B_1ANT))
129 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
131 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
133 if (wifi_rssi < rssi_thresh)
134 wifi_rssi_state = BTC_RSSI_STATE_LOW;
136 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
138 } else if (level_num == 3) {
139 if (rssi_thresh > rssi_thresh1) {
140 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
141 "[BTCoex], wifi RSSI thresh error!!\n");
142 BTC_TRACE(trace_buf);
143 return coex_sta->pre_wifi_rssi_state[index];
146 if ((coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW)
148 (coex_sta->pre_wifi_rssi_state[index] ==
149 BTC_RSSI_STATE_STAY_LOW)) {
150 if (wifi_rssi >= (rssi_thresh +
151 BTC_RSSI_COEX_THRESH_TOL_8822B_1ANT))
152 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
154 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
155 } else if ((coex_sta->pre_wifi_rssi_state[index] ==
156 BTC_RSSI_STATE_MEDIUM) ||
157 (coex_sta->pre_wifi_rssi_state[index] ==
158 BTC_RSSI_STATE_STAY_MEDIUM)) {
159 if (wifi_rssi >= (rssi_thresh1 +
160 BTC_RSSI_COEX_THRESH_TOL_8822B_1ANT))
161 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
162 else if (wifi_rssi < rssi_thresh)
163 wifi_rssi_state = BTC_RSSI_STATE_LOW;
165 wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
167 if (wifi_rssi < rssi_thresh1)
168 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
170 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
174 coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
176 return wifi_rssi_state;
179 void halbtc8822b1ant_update_ra_mask(IN struct btc_coexist *btcoexist,
180 IN boolean force_exec, IN u32 dis_rate_mask)
182 coex_dm->cur_ra_mask = dis_rate_mask;
184 if (force_exec || (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask))
185 btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK,
186 &coex_dm->cur_ra_mask);
187 coex_dm->pre_ra_mask = coex_dm->cur_ra_mask;
190 void halbtc8822b1ant_auto_rate_fallback_retry(IN struct btc_coexist *btcoexist,
191 IN boolean force_exec, IN u8 type)
193 boolean wifi_under_b_mode = false;
195 coex_dm->cur_arfr_type = type;
197 if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {
198 switch (coex_dm->cur_arfr_type) {
199 case 0: /* normal mode */
200 btcoexist->btc_write_4byte(btcoexist, 0x430,
201 coex_dm->backup_arfr_cnt1);
202 btcoexist->btc_write_4byte(btcoexist, 0x434,
203 coex_dm->backup_arfr_cnt2);
206 btcoexist->btc_get(btcoexist,
207 BTC_GET_BL_WIFI_UNDER_B_MODE,
209 if (wifi_under_b_mode) {
210 btcoexist->btc_write_4byte(btcoexist,
212 btcoexist->btc_write_4byte(btcoexist,
215 btcoexist->btc_write_4byte(btcoexist,
217 btcoexist->btc_write_4byte(btcoexist,
226 coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;
229 void halbtc8822b1ant_retry_limit(IN struct btc_coexist *btcoexist,
230 IN boolean force_exec, IN u8 type)
232 coex_dm->cur_retry_limit_type = type;
235 (coex_dm->pre_retry_limit_type !=
236 coex_dm->cur_retry_limit_type)) {
237 switch (coex_dm->cur_retry_limit_type) {
238 case 0: /* normal mode */
239 btcoexist->btc_write_2byte(btcoexist, 0x42a,
240 coex_dm->backup_retry_limit);
242 case 1: /* retry limit=8 */
243 btcoexist->btc_write_2byte(btcoexist, 0x42a,
251 coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;
254 void halbtc8822b1ant_ampdu_max_time(IN struct btc_coexist *btcoexist,
255 IN boolean force_exec, IN u8 type)
257 coex_dm->cur_ampdu_time_type = type;
260 (coex_dm->pre_ampdu_time_type != coex_dm->cur_ampdu_time_type)) {
261 switch (coex_dm->cur_ampdu_time_type) {
262 case 0: /* normal mode */
263 btcoexist->btc_write_1byte(btcoexist, 0x456,
264 coex_dm->backup_ampdu_max_time);
266 case 1: /* AMPDU timw = 0x38 * 32us */
267 btcoexist->btc_write_1byte(btcoexist, 0x456,
275 coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;
278 void halbtc8822b1ant_limited_tx(IN struct btc_coexist *btcoexist,
279 IN boolean force_exec, IN u8 ra_mask_type, IN u8 arfr_type,
280 IN u8 retry_limit_type, IN u8 ampdu_time_type)
282 switch (ra_mask_type) {
283 case 0: /* normal mode */
284 halbtc8822b1ant_update_ra_mask(btcoexist, force_exec,
287 case 1: /* disable cck 1/2 */
288 halbtc8822b1ant_update_ra_mask(btcoexist, force_exec,
291 case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
292 halbtc8822b1ant_update_ra_mask(btcoexist, force_exec,
299 halbtc8822b1ant_auto_rate_fallback_retry(btcoexist, force_exec,
301 halbtc8822b1ant_retry_limit(btcoexist, force_exec, retry_limit_type);
302 halbtc8822b1ant_ampdu_max_time(btcoexist, force_exec, ampdu_time_type);
306 rx agg size setting :
307 1: true / don't care / don't care
308 max: false / false / don't care
312 void halbtc8822b1ant_limited_rx(IN struct btc_coexist *btcoexist,
313 IN boolean force_exec, IN boolean rej_ap_agg_pkt,
314 IN boolean bt_ctrl_agg_buf_size, IN u8 agg_buf_size)
316 boolean reject_rx_agg = rej_ap_agg_pkt;
317 boolean bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
318 u8 rx_agg_size = agg_buf_size;
320 /* ============================================ */
321 /* Rx Aggregation related setting */
322 /* ============================================ */
323 btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
325 /* decide BT control aggregation buf size or not */
326 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
327 &bt_ctrl_rx_agg_size);
328 /* aggregation buf size, only work when BT control Rx aggregation size. */
329 btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
330 /* real update aggregation setting */
331 btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
336 void halbtc8822b1ant_query_bt_info(IN struct btc_coexist *btcoexist)
338 u8 h2c_parameter[1] = {0};
340 coex_sta->c2h_bt_info_req_sent = true;
342 h2c_parameter[0] |= BIT(0); /* trigger */
344 btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
347 void halbtc8822b1ant_monitor_bt_ctr(IN struct btc_coexist *btcoexist)
349 u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
350 u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
351 static u8 num_of_bt_counter_chk = 0, cnt_slave = 0;
352 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
354 /* to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS */
355 /* if (! (btcoexist->btc_read_1byte(btcoexist, 0x76e) & 0x8) ) */
357 if (coex_sta->under_ips) {
358 /* coex_sta->high_priority_tx = 65535; */
359 /* coex_sta->high_priority_rx = 65535; */
360 /* coex_sta->low_priority_tx = 65535; */
361 /* coex_sta->low_priority_rx = 65535; */
368 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
369 reg_hp_tx = u32tmp & MASKLWORD;
370 reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
372 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
373 reg_lp_tx = u32tmp & MASKLWORD;
374 reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
376 coex_sta->high_priority_tx = reg_hp_tx;
377 coex_sta->high_priority_rx = reg_hp_rx;
378 coex_sta->low_priority_tx = reg_lp_tx;
379 coex_sta->low_priority_rx = reg_lp_rx;
381 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
382 "[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n",
383 reg_hp_rx, reg_hp_tx, reg_lp_rx, reg_lp_tx);
384 BTC_TRACE(trace_buf);
387 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
389 if ((coex_sta->low_priority_tx > 1150) &&
390 (!coex_sta->c2h_bt_inquiry_page))
391 coex_sta->pop_event_cnt++;
393 if ((coex_sta->low_priority_rx >= 1150) &&
394 (coex_sta->low_priority_rx >= coex_sta->low_priority_tx)
395 && (!coex_sta->under_ips) &&
396 (!coex_sta->c2h_bt_inquiry_page) &&
397 (coex_sta->bt_link_exist)) {
398 if (cnt_slave >= 3) {
399 bt_link_info->slave_role = true;
404 if (cnt_slave == 0) {
405 bt_link_info->slave_role = false;
412 if ((coex_sta->high_priority_tx == 0) &&
413 (coex_sta->high_priority_rx == 0) &&
414 (coex_sta->low_priority_tx == 0) &&
415 (coex_sta->low_priority_rx == 0)) {
416 num_of_bt_counter_chk++;
418 if (num_of_bt_counter_chk >= 3) {
419 halbtc8822b1ant_query_bt_info(
421 num_of_bt_counter_chk = 0;
425 /* Add Hi-Pri Tx/Rx counter to avoid false detection */
426 if (((coex_sta->hid_exist) || (coex_sta->sco_exist)) &&
427 (coex_sta->high_priority_tx + coex_sta->high_priority_rx
429 && (!coex_sta->c2h_bt_inquiry_page))
430 coex_sta->bt_hi_pri_link_exist = true;
432 coex_sta->bt_hi_pri_link_exist = false;
434 if ((coex_sta->acl_busy) &&
435 (coex_sta->num_of_profile == 0)) {
436 if (coex_sta->low_priority_tx +
437 coex_sta->low_priority_rx >= 160) {
438 coex_sta->pan_exist = true;
439 coex_sta->num_of_profile++;
440 coex_sta->wrong_profile_notification++;
448 void halbtc8822b1ant_monitor_wifi_ctr(IN struct btc_coexist *btcoexist)
451 boolean wifi_busy = false, wifi_under_b_mode = false;
452 static u8 cck_lock_counter = 0;
455 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
456 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
457 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
460 if (coex_sta->under_ips) {
461 coex_sta->crc_ok_cck = 0;
462 coex_sta->crc_ok_11g = 0;
463 coex_sta->crc_ok_11n = 0;
464 coex_sta->crc_ok_11n_agg = 0;
466 coex_sta->crc_err_cck = 0;
467 coex_sta->crc_err_11g = 0;
468 coex_sta->crc_err_11n = 0;
469 coex_sta->crc_err_11n_agg = 0;
471 coex_sta->crc_ok_cck = btcoexist->btc_read_2byte(
474 coex_sta->crc_ok_11g = btcoexist->btc_read_2byte(
477 coex_sta->crc_ok_11n = btcoexist->btc_read_2byte(
480 coex_sta->crc_ok_11n_agg = btcoexist->btc_read_2byte(
484 coex_sta->crc_err_cck = btcoexist->btc_read_2byte(
485 btcoexist, 0xf00) + btcoexist->btc_read_2byte(
488 coex_sta->crc_err_11g = btcoexist->btc_read_2byte(
491 coex_sta->crc_err_11n = btcoexist->btc_read_2byte(
494 coex_sta->crc_err_11n_agg = btcoexist->btc_read_2byte(
501 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xb58, 0x1, 0x1);
502 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xb58, 0x1, 0x0);
504 if ((wifi_busy) && (wifi_rssi >= 30) && (!wifi_under_b_mode)) {
505 total_cnt = coex_sta->crc_ok_cck + coex_sta->crc_ok_11g
507 coex_sta->crc_ok_11n +
508 coex_sta->crc_ok_11n_agg;
510 if ((coex_dm->bt_status ==
511 BT_8822B_1ANT_BT_STATUS_ACL_BUSY) ||
512 (coex_dm->bt_status ==
513 BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY) ||
514 (coex_dm->bt_status ==
515 BT_8822B_1ANT_BT_STATUS_SCO_BUSY)) {
516 if (coex_sta->crc_ok_cck > (total_cnt -
517 coex_sta->crc_ok_cck)) {
518 if (cck_lock_counter < 3)
521 if (cck_lock_counter > 0)
526 if (cck_lock_counter > 0)
530 if (cck_lock_counter > 0)
534 if (!coex_sta->pre_ccklock) {
536 if (cck_lock_counter >= 3)
537 coex_sta->cck_lock = true;
539 coex_sta->cck_lock = false;
541 if (cck_lock_counter == 0)
542 coex_sta->cck_lock = false;
544 coex_sta->cck_lock = true;
547 if (coex_sta->cck_lock)
548 coex_sta->cck_ever_lock = true;
550 coex_sta->pre_ccklock = coex_sta->cck_lock;
556 boolean halbtc8822b1ant_is_wifi_status_changed(IN struct btc_coexist *btcoexist)
558 static boolean pre_wifi_busy = false, pre_under_4way = false,
559 pre_bt_hs_on = false, pre_bt_off = false;
560 boolean wifi_busy = false, under_4way = false, bt_hs_on = false;
561 boolean wifi_connected = false;
563 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
565 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
566 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
567 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
569 if (coex_sta->bt_disabled != pre_bt_off) {
570 pre_bt_off = coex_sta->bt_disabled;
572 if (coex_sta->bt_disabled)
573 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
574 "[BTCoex], BT is disabled !!\n");
576 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
577 "[BTCoex], BT is enabled !!\n");
579 BTC_TRACE(trace_buf);
581 coex_sta->bt_coex_supported_feature = 0;
582 coex_sta->bt_coex_supported_version = 0;
586 if (wifi_connected) {
587 if (wifi_busy != pre_wifi_busy) {
588 pre_wifi_busy = wifi_busy;
591 if (under_4way != pre_under_4way) {
592 pre_under_4way = under_4way;
595 if (bt_hs_on != pre_bt_hs_on) {
596 pre_bt_hs_on = bt_hs_on;
604 void halbtc8822b1ant_update_bt_link_info(IN struct btc_coexist *btcoexist)
606 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
607 boolean bt_hs_on = false;
609 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
611 bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
612 bt_link_info->sco_exist = coex_sta->sco_exist;
613 bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
614 bt_link_info->pan_exist = coex_sta->pan_exist;
615 bt_link_info->hid_exist = coex_sta->hid_exist;
616 bt_link_info->bt_hi_pri_link_exist = coex_sta->bt_hi_pri_link_exist;
617 bt_link_info->acl_busy = coex_sta->acl_busy;
619 /* work around for HS mode. */
621 bt_link_info->pan_exist = true;
622 bt_link_info->bt_link_exist = true;
625 /* check if Sco only */
626 if (bt_link_info->sco_exist &&
627 !bt_link_info->a2dp_exist &&
628 !bt_link_info->pan_exist &&
629 !bt_link_info->hid_exist)
630 bt_link_info->sco_only = true;
632 bt_link_info->sco_only = false;
634 /* check if A2dp only */
635 if (!bt_link_info->sco_exist &&
636 bt_link_info->a2dp_exist &&
637 !bt_link_info->pan_exist &&
638 !bt_link_info->hid_exist)
639 bt_link_info->a2dp_only = true;
641 bt_link_info->a2dp_only = false;
643 /* check if Pan only */
644 if (!bt_link_info->sco_exist &&
645 !bt_link_info->a2dp_exist &&
646 bt_link_info->pan_exist &&
647 !bt_link_info->hid_exist)
648 bt_link_info->pan_only = true;
650 bt_link_info->pan_only = false;
652 /* check if Hid only */
653 if (!bt_link_info->sco_exist &&
654 !bt_link_info->a2dp_exist &&
655 !bt_link_info->pan_exist &&
656 bt_link_info->hid_exist)
657 bt_link_info->hid_only = true;
659 bt_link_info->hid_only = false;
662 void halbtc8822b1ant_update_wifi_channel_info(IN struct btc_coexist *btcoexist,
665 u8 h2c_parameter[3] = {0};
667 u8 wifi_central_chnl;
669 /* only 2.4G we need to inform bt the chnl mask */
670 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
672 if ((BTC_MEDIA_CONNECT == type) &&
673 (wifi_central_chnl <= 14)) {
676 0x1; /* enable BT AFH skip WL channel for 8822b because BT Rx LO interference */
677 h2c_parameter[1] = wifi_central_chnl;
679 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
681 if (BTC_WIFI_BW_HT40 == wifi_bw)
682 h2c_parameter[2] = 0x30;
684 h2c_parameter[2] = 0x20;
687 coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
688 coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
689 coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
691 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
695 u8 halbtc8822b1ant_action_algorithm(IN struct btc_coexist *btcoexist)
697 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
698 boolean bt_hs_on = false;
699 u8 algorithm = BT_8822B_1ANT_COEX_ALGO_UNDEFINED;
700 u8 num_of_diff_profile = 0;
702 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
704 if (!bt_link_info->bt_link_exist) {
705 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
706 "[BTCoex], No BT link exists!!!\n");
707 BTC_TRACE(trace_buf);
711 if (bt_link_info->sco_exist)
712 num_of_diff_profile++;
713 if (bt_link_info->hid_exist)
714 num_of_diff_profile++;
715 if (bt_link_info->pan_exist)
716 num_of_diff_profile++;
717 if (bt_link_info->a2dp_exist)
718 num_of_diff_profile++;
720 if (num_of_diff_profile == 1) {
721 if (bt_link_info->sco_exist) {
722 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
723 "[BTCoex], BT Profile = SCO only\n");
724 BTC_TRACE(trace_buf);
725 algorithm = BT_8822B_1ANT_COEX_ALGO_SCO;
727 if (bt_link_info->hid_exist) {
728 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
729 "[BTCoex], BT Profile = HID only\n");
730 BTC_TRACE(trace_buf);
731 algorithm = BT_8822B_1ANT_COEX_ALGO_HID;
732 } else if (bt_link_info->a2dp_exist) {
733 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
734 "[BTCoex], BT Profile = A2DP only\n");
735 BTC_TRACE(trace_buf);
736 algorithm = BT_8822B_1ANT_COEX_ALGO_A2DP;
737 } else if (bt_link_info->pan_exist) {
739 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
740 "[BTCoex], BT Profile = PAN(HS) only\n");
741 BTC_TRACE(trace_buf);
743 BT_8822B_1ANT_COEX_ALGO_PANHS;
745 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
746 "[BTCoex], BT Profile = PAN(EDR) only\n");
747 BTC_TRACE(trace_buf);
749 BT_8822B_1ANT_COEX_ALGO_PANEDR;
753 } else if (num_of_diff_profile == 2) {
754 if (bt_link_info->sco_exist) {
755 if (bt_link_info->hid_exist) {
756 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
757 "[BTCoex], BT Profile = SCO + HID\n");
758 BTC_TRACE(trace_buf);
759 algorithm = BT_8822B_1ANT_COEX_ALGO_HID;
760 } else if (bt_link_info->a2dp_exist) {
761 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
762 "[BTCoex], BT Profile = SCO + A2DP ==> SCO\n");
763 BTC_TRACE(trace_buf);
764 algorithm = BT_8822B_1ANT_COEX_ALGO_SCO;
765 } else if (bt_link_info->pan_exist) {
767 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
768 "[BTCoex], BT Profile = SCO + PAN(HS)\n");
769 BTC_TRACE(trace_buf);
770 algorithm = BT_8822B_1ANT_COEX_ALGO_SCO;
772 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
773 "[BTCoex], BT Profile = SCO + PAN(EDR)\n");
774 BTC_TRACE(trace_buf);
776 BT_8822B_1ANT_COEX_ALGO_PANEDR_HID;
780 if (bt_link_info->hid_exist &&
781 bt_link_info->a2dp_exist) {
782 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
783 "[BTCoex], BT Profile = HID + A2DP\n");
784 BTC_TRACE(trace_buf);
785 algorithm = BT_8822B_1ANT_COEX_ALGO_HID_A2DP;
786 } else if (bt_link_info->hid_exist &&
787 bt_link_info->pan_exist) {
789 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
790 "[BTCoex], BT Profile = HID + PAN(HS)\n");
791 BTC_TRACE(trace_buf);
793 BT_8822B_1ANT_COEX_ALGO_HID_A2DP;
795 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
796 "[BTCoex], BT Profile = HID + PAN(EDR)\n");
797 BTC_TRACE(trace_buf);
799 BT_8822B_1ANT_COEX_ALGO_PANEDR_HID;
801 } else if (bt_link_info->pan_exist &&
802 bt_link_info->a2dp_exist) {
804 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
805 "[BTCoex], BT Profile = A2DP + PAN(HS)\n");
806 BTC_TRACE(trace_buf);
808 BT_8822B_1ANT_COEX_ALGO_A2DP_PANHS;
810 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
811 "[BTCoex], BT Profile = A2DP + PAN(EDR)\n");
812 BTC_TRACE(trace_buf);
814 BT_8822B_1ANT_COEX_ALGO_PANEDR_A2DP;
818 } else if (num_of_diff_profile == 3) {
819 if (bt_link_info->sco_exist) {
820 if (bt_link_info->hid_exist &&
821 bt_link_info->a2dp_exist) {
822 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
823 "[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n");
824 BTC_TRACE(trace_buf);
825 algorithm = BT_8822B_1ANT_COEX_ALGO_HID;
826 } else if (bt_link_info->hid_exist &&
827 bt_link_info->pan_exist) {
829 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
830 "[BTCoex], BT Profile = SCO + HID + PAN(HS)\n");
831 BTC_TRACE(trace_buf);
833 BT_8822B_1ANT_COEX_ALGO_HID_A2DP;
835 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
836 "[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n");
837 BTC_TRACE(trace_buf);
839 BT_8822B_1ANT_COEX_ALGO_PANEDR_HID;
841 } else if (bt_link_info->pan_exist &&
842 bt_link_info->a2dp_exist) {
844 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
845 "[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n");
846 BTC_TRACE(trace_buf);
847 algorithm = BT_8822B_1ANT_COEX_ALGO_SCO;
849 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
850 "[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n");
851 BTC_TRACE(trace_buf);
853 BT_8822B_1ANT_COEX_ALGO_PANEDR_HID;
857 if (bt_link_info->hid_exist &&
858 bt_link_info->pan_exist &&
859 bt_link_info->a2dp_exist) {
861 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
862 "[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n");
863 BTC_TRACE(trace_buf);
865 BT_8822B_1ANT_COEX_ALGO_HID_A2DP;
867 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
868 "[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n");
869 BTC_TRACE(trace_buf);
871 BT_8822B_1ANT_COEX_ALGO_HID_A2DP_PANEDR;
875 } else if (num_of_diff_profile >= 3) {
876 if (bt_link_info->sco_exist) {
877 if (bt_link_info->hid_exist &&
878 bt_link_info->pan_exist &&
879 bt_link_info->a2dp_exist) {
881 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
882 "[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n");
883 BTC_TRACE(trace_buf);
886 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
887 "[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");
888 BTC_TRACE(trace_buf);
890 BT_8822B_1ANT_COEX_ALGO_PANEDR_HID;
899 void halbtc8822b1ant_set_bt_auto_report(IN struct btc_coexist *btcoexist,
900 IN boolean enable_auto_report)
902 u8 h2c_parameter[1] = {0};
904 h2c_parameter[0] = 0;
906 if (enable_auto_report)
907 h2c_parameter[0] |= BIT(0);
909 btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
912 void halbtc8822b1ant_bt_auto_report(IN struct btc_coexist *btcoexist,
913 IN boolean force_exec, IN boolean enable_auto_report)
915 coex_dm->cur_bt_auto_report = enable_auto_report;
918 if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
921 halbtc8822b1ant_set_bt_auto_report(btcoexist,
922 coex_dm->cur_bt_auto_report);
924 coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
929 void halbtc8822b1ant_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 halbtc8822b1ant_low_penalty_ra(IN struct btc_coexist *btcoexist,
949 IN boolean force_exec, IN boolean low_penalty_ra)
952 coex_dm->cur_low_penalty_ra = low_penalty_ra;
955 if (coex_dm->pre_low_penalty_ra ==
956 coex_dm->cur_low_penalty_ra)
961 btcoexist->btc_phydm_modify_RA_PCR_threshold(btcoexist, 0, 25);
963 btcoexist->btc_phydm_modify_RA_PCR_threshold(btcoexist, 0, 0);
965 coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
970 void halbtc8822b1ant_write_score_board(
971 IN struct btc_coexist *btcoexist,
977 static u16 originalval = 0x8002;
980 originalval = originalval | bitpos;
982 originalval = originalval & (~bitpos);
984 btcoexist->btc_write_2byte(btcoexist, 0xaa, originalval);
987 void halbtc8822b1ant_read_score_board(
988 IN struct btc_coexist *btcoexist,
989 IN u16 *score_board_val
993 *score_board_val = (btcoexist->btc_read_2byte(btcoexist,
997 void halbtc8822b1ant_post_state_to_bt(
998 IN struct btc_coexist *btcoexist,
1004 halbtc8822b1ant_write_score_board(btcoexist, (u16) type, state);
1009 void halbtc8822b1ant_monitor_bt_enable_disable(IN struct btc_coexist *btcoexist)
1011 static u32 bt_disable_cnt = 0;
1012 boolean bt_active = true, bt_disabled = false,
1013 wifi_under_5g = false;
1016 /* This function check if bt is disabled */
1018 if (coex_sta->high_priority_tx == 0 &&
1019 coex_sta->high_priority_rx == 0 &&
1020 coex_sta->low_priority_tx == 0 &&
1021 coex_sta->low_priority_rx == 0)
1023 if (coex_sta->high_priority_tx == 0xffff &&
1024 coex_sta->high_priority_rx == 0xffff &&
1025 coex_sta->low_priority_tx == 0xffff &&
1026 coex_sta->low_priority_rx == 0xffff)
1032 /* Read BT on/off status from scoreboard[1], enable this only if BT patch support this feature */
1033 halbtc8822b1ant_read_score_board(btcoexist, &u16tmp);
1035 bt_active = u16tmp & BIT(1);
1042 bt_disabled = false;
1043 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
1048 if (bt_disable_cnt >= 2) {
1053 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
1058 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G,
1061 if ((wifi_under_5g) || (bt_disabled))
1062 halbtc8822b1ant_low_penalty_ra(btcoexist,
1063 NORMAL_EXEC, false);
1065 halbtc8822b1ant_low_penalty_ra(btcoexist,
1069 if (coex_sta->bt_disabled != bt_disabled) {
1070 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1071 "[BTCoex], BT is from %s to %s!!\n",
1072 (coex_sta->bt_disabled ? "disabled" :
1074 (bt_disabled ? "disabled" : "enabled"));
1075 BTC_TRACE(trace_buf);
1076 coex_sta->bt_disabled = bt_disabled;
1083 void halbtc8822b1ant_enable_gnt_to_gpio(IN struct btc_coexist *btcoexist,
1086 static u8 bitVal[5] = {0, 0, 0, 0, 0};
1087 static boolean state = false;
1089 if (state == isenable)
1096 /* enable GNT_WL, GNT_BT to GPIO for debug */
1097 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x8, 0x1);
1099 /* store original value */
1100 bitVal[0] = (btcoexist->btc_read_1byte(btcoexist,
1101 0x66) & BIT(4)) >> 4; /*0x66[4] */
1102 bitVal[1] = (btcoexist->btc_read_1byte(btcoexist,
1103 0x67) & BIT(0)); /*0x66[8] */
1104 bitVal[2] = (btcoexist->btc_read_1byte(btcoexist,
1105 0x42) & BIT(3)) >> 3; /*0x40[19] */
1106 bitVal[3] = (btcoexist->btc_read_1byte(btcoexist,
1107 0x65) & BIT(7)) >> 7; /*0x64[15] */
1108 bitVal[4] = (btcoexist->btc_read_1byte(btcoexist,
1109 0x72) & BIT(2)) >> 2; /*0x70[18] */
1111 /* switch GPIO Mux */
1112 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x66, BIT(4),
1113 0x0); /*0x66[4] = 0 */
1114 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, BIT(0),
1115 0x0); /*0x66[8] = 0 */
1116 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x42, BIT(3),
1117 0x0); /*0x40[19] = 0 */
1118 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x65, BIT(7),
1119 0x0); /*0x64[15] = 0 */
1120 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x72, BIT(2),
1121 0x0); /*0x70[18] = 0 */
1125 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x8, 0x0);
1127 /* Restore original value */
1128 /* switch GPIO Mux */
1129 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x66, BIT(4),
1130 bitVal[0]); /*0x66[4] = 0 */
1131 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, BIT(0),
1132 bitVal[1]); /*0x66[8] = 0 */
1133 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x42, BIT(3),
1134 bitVal[2]); /*0x40[19] = 0 */
1135 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x65, BIT(7),
1136 bitVal[3]); /*0x64[15] = 0 */
1137 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x72, BIT(2),
1138 bitVal[4]); /*0x70[18] = 0 */
1144 u32 halbtc8822b1ant_ltecoex_indirect_read_reg(IN struct btc_coexist *btcoexist,
1150 /* wait for ready bit before access 0x1700 */
1151 btcoexist->btc_write_4byte(btcoexist, 0x1700, 0x800F0000 | reg_addr);
1155 } while (((btcoexist->btc_read_1byte(btcoexist,
1156 0x1703) & BIT(5)) == 0) &&
1157 (j < BT_8822B_1ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT));
1160 return btcoexist->btc_read_4byte(btcoexist,
1161 0x1708); /* get read data */
1165 void halbtc8822b1ant_ltecoex_indirect_write_reg(IN struct btc_coexist
1167 IN u16 reg_addr, IN u32 bit_mask, IN u32 reg_value)
1169 u32 val, i = 0, j = 0, bitpos = 0;
1172 if (bit_mask == 0x0)
1174 if (bit_mask == 0xffffffff) {
1175 btcoexist->btc_write_4byte(btcoexist, 0x1704,
1176 reg_value); /* put write data */
1178 /* wait for ready bit before access 0x1700 */
1181 } while (((btcoexist->btc_read_1byte(btcoexist,
1182 0x1703) & BIT(5)) == 0) &&
1183 (j < BT_8822B_1ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT));
1186 btcoexist->btc_write_4byte(btcoexist, 0x1700,
1187 0xc00F0000 | reg_addr);
1189 for (i = 0; i <= 31; i++) {
1190 if (((bit_mask >> i) & 0x1) == 0x1) {
1196 /* read back register value before write */
1197 val = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
1199 val = (val & (~bit_mask)) | (reg_value << bitpos);
1201 /* put write data value */
1202 btcoexist->btc_write_4byte(btcoexist, 0x1704,
1203 val); /* put write data */
1205 /* wait for ready bit before access 0x1700 */
1208 } while (((btcoexist->btc_read_1byte(btcoexist,
1209 0x1703) & BIT(5)) == 0) &&
1210 (j < BT_8822B_1ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT));
1214 btcoexist->btc_write_4byte(btcoexist, 0x1700,
1215 0xc00F0000 | reg_addr);
1221 void halbtc8822b1ant_ltecoex_enable(IN struct btc_coexist *btcoexist,
1226 val = (enable) ? 1 : 0;
1228 halbtc8822b1ant_ltecoex_indirect_write_reg(btcoexist, 0x38, 0x80,
1234 void halbtc8822b1ant_ltecoex_pathcontrol_owner(IN struct btc_coexist *btcoexist,
1235 IN boolean wifi_control)
1239 val = (wifi_control) ? 1 : 0;
1241 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x4,
1242 val); /* 0x70[26] */
1246 void halbtc8822b1ant_ltecoex_set_gnt_bt(IN struct btc_coexist *btcoexist,
1247 IN u8 control_block, IN boolean sw_control, IN u8 state)
1249 u32 val = 0, bit_mask;
1251 state = state & 0x1;
1252 /*LTE indirect 0x38=0xccxx (sw : gnt_wl=1,sw gnt_bt=1)
1253 0x38=0xddxx (sw : gnt_bt=1 , sw gnt_wl=0)
1254 0x38=0x55xx(hw pta :gnt_wl /gnt_bt ) */
1255 val = (sw_control) ? ((state << 1) | 0x1) : 0;
1257 switch (control_block) {
1258 case BT_8822B_1ANT_GNT_BLOCK_RFC_BB:
1261 halbtc8822b1ant_ltecoex_indirect_write_reg(btcoexist,
1262 0x38, bit_mask, val); /* 0x38[15:14] */
1264 halbtc8822b1ant_ltecoex_indirect_write_reg(btcoexist,
1265 0x38, bit_mask, val); /* 0x38[11:10] */
1267 case BT_8822B_1ANT_GNT_BLOCK_RFC:
1269 halbtc8822b1ant_ltecoex_indirect_write_reg(btcoexist,
1270 0x38, bit_mask, val); /* 0x38[15:14] */
1272 case BT_8822B_1ANT_GNT_BLOCK_BB:
1274 halbtc8822b1ant_ltecoex_indirect_write_reg(btcoexist,
1275 0x38, bit_mask, val); /* 0x38[11:10] */
1282 void halbtc8822b1ant_ltecoex_set_gnt_wl(IN struct btc_coexist *btcoexist,
1283 IN u8 control_block, IN boolean sw_control, IN u8 state)
1285 u32 val = 0, bit_mask;
1286 /*LTE indirect 0x38=0xccxx (sw : gnt_wl=1,sw gnt_bt=1)
1287 0x38=0xddxx (sw : gnt_bt=1 , sw gnt_wl=0)
1288 0x38=0x55xx(hw pta :gnt_wl /gnt_bt ) */
1290 state = state & 0x1;
1291 val = (sw_control) ? ((state << 1) | 0x1) : 0;
1293 switch (control_block) {
1294 case BT_8822B_1ANT_GNT_BLOCK_RFC_BB:
1297 halbtc8822b1ant_ltecoex_indirect_write_reg(btcoexist,
1298 0x38, bit_mask, val); /* 0x38[13:12] */
1300 halbtc8822b1ant_ltecoex_indirect_write_reg(btcoexist,
1301 0x38, bit_mask, val); /* 0x38[9:8] */
1303 case BT_8822B_1ANT_GNT_BLOCK_RFC:
1305 halbtc8822b1ant_ltecoex_indirect_write_reg(btcoexist,
1306 0x38, bit_mask, val); /* 0x38[13:12] */
1308 case BT_8822B_1ANT_GNT_BLOCK_BB:
1310 halbtc8822b1ant_ltecoex_indirect_write_reg(btcoexist,
1311 0x38, bit_mask, val); /* 0x38[9:8] */
1318 void halbtc8822b1ant_ltecoex_set_coex_table(IN struct btc_coexist *btcoexist,
1319 IN u8 table_type, IN u16 table_content)
1321 u16 reg_addr = 0x0000;
1323 switch (table_type) {
1324 case BT_8822B_1ANT_CTT_WL_VS_LTE:
1327 case BT_8822B_1ANT_CTT_BT_VS_LTE:
1332 if (reg_addr != 0x0000)
1333 halbtc8822b1ant_ltecoex_indirect_write_reg(btcoexist, reg_addr,
1334 0xffff, table_content); /* 0xa0[15:0] or 0xa4[15:0] */
1340 void halbtc8822b1ant_ltcoex_set_break_table(IN struct btc_coexist *btcoexist,
1341 IN u8 table_type, IN u8 table_content)
1343 u16 reg_addr = 0x0000;
1345 switch (table_type) {
1346 case BT_8822B_1ANT_LBTT_WL_BREAK_LTE:
1349 case BT_8822B_1ANT_LBTT_BT_BREAK_LTE:
1352 case BT_8822B_1ANT_LBTT_LTE_BREAK_WL:
1355 case BT_8822B_1ANT_LBTT_LTE_BREAK_BT:
1360 if (reg_addr != 0x0000)
1361 halbtc8822b1ant_ltecoex_indirect_write_reg(btcoexist, reg_addr,
1362 0xff, table_content); /* 0xa8[15:0] or 0xb4[15:0] */
1367 void halbtc8822b1ant_set_wltoggle_coex_table(IN struct btc_coexist *btcoexist,
1368 IN boolean force_exec, IN u8 interval,
1369 IN u8 val0x6c4_b0, IN u8 val0x6c4_b1, IN u8 val0x6c4_b2,
1372 static u8 pre_h2c_parameter[6] = {0};
1373 u8 cur_h2c_parameter[6] = {0};
1374 u8 i, match_cnt = 0;
1376 cur_h2c_parameter[0] = 0x7; /* op_code, 0x7= wlan toggle slot*/
1378 cur_h2c_parameter[1] = interval;
1379 cur_h2c_parameter[2] = val0x6c4_b0;
1380 cur_h2c_parameter[3] = val0x6c4_b1;
1381 cur_h2c_parameter[4] = val0x6c4_b2;
1382 cur_h2c_parameter[5] = val0x6c4_b3;
1385 for (i = 1; i <= 5; i++) {
1386 if (cur_h2c_parameter[i] != pre_h2c_parameter[i])
1396 for (i = 1; i <= 5; i++)
1397 pre_h2c_parameter[i] = cur_h2c_parameter[i];
1399 btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, cur_h2c_parameter);
1402 void halbtc8822b1ant_set_coex_table(IN struct btc_coexist *btcoexist,
1403 IN u32 val0x6c0, IN u32 val0x6c4, IN u32 val0x6c8, IN u8 val0x6cc)
1405 btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
1407 btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
1409 btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
1411 btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
1414 void halbtc8822b1ant_coex_table(IN struct btc_coexist *btcoexist,
1415 IN boolean force_exec, IN u32 val0x6c0, IN u32 val0x6c4,
1416 IN u32 val0x6c8, IN u8 val0x6cc)
1418 coex_dm->cur_val0x6c0 = val0x6c0;
1419 coex_dm->cur_val0x6c4 = val0x6c4;
1420 coex_dm->cur_val0x6c8 = val0x6c8;
1421 coex_dm->cur_val0x6cc = val0x6cc;
1426 if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
1427 (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
1428 (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
1429 (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
1432 halbtc8822b1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8,
1435 coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
1436 coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
1437 coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
1438 coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
1441 void halbtc8822b1ant_coex_table_with_type(IN struct btc_coexist *btcoexist,
1442 IN boolean force_exec, IN u8 type)
1449 coex_sta->coex_table_type = type;
1451 if (coex_sta->concurrent_rx_mode_on == true) {
1452 break_table = 0xf0ffffff; /* set WL hi-pri can break BT */
1453 select_table = 0x3; /* set Tx response = Hi-Pri (ex: Transmitting ACK,BA,CTS) */
1455 break_table = 0xffffff;
1461 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1462 0x55555555, 0x55555555, break_table,
1466 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1467 0x55555555, 0x5a5a5a5a, break_table,
1471 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1472 0xaa5a5a5a, 0xaa5a5a5a, break_table,
1476 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1477 0x55555555, 0xaa5a5a5a, break_table,
1481 halbtc8822b1ant_coex_table(btcoexist,
1482 force_exec, 0xaa555555, 0xaa5a5a5a,
1483 break_table, select_table);
1486 halbtc8822b1ant_coex_table(btcoexist,
1487 force_exec, 0x5a5a5a5a, 0x5a5a5a5a,
1488 break_table, select_table);
1491 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1492 0x55555555, 0xaaaaaaaa, break_table,
1496 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1497 0xaaaaaaaa, 0xaaaaaaaa, break_table,
1501 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1502 0xffffffff, 0xffffffff, break_table,
1506 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1507 0x5a5a5555, 0xaaaa5a5a, break_table,
1511 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1512 0xaaaa5aaa, 0xaaaa5aaa, break_table,
1516 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1517 0xaaaaa5aa, 0xaaaaaaaa, break_table,
1521 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1522 0xaaaaa5aa, 0xaaaaa5aa, break_table,
1526 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1527 0x55555555, 0xaaaa5a5a, break_table,
1531 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1532 0x5a5a555a, 0xaaaa5a5a, break_table,
1536 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1537 0x55555555, 0xaaaa55aa, break_table,
1541 halbtc8822b1ant_coex_table(btcoexist, force_exec,
1542 0x5a5a555a, 0x5a5a555a, break_table,
1551 void halbtc8822b1ant_set_fw_ignore_wlan_act(IN struct btc_coexist *btcoexist,
1556 u8 h2c_parameter[1] = {0};
1559 h2c_parameter[0] |= BIT(0); /* function enable */
1561 btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
1564 void halbtc8822b1ant_ignore_wlan_act(IN struct btc_coexist *btcoexist,
1565 IN boolean force_exec, IN boolean enable)
1568 coex_dm->cur_ignore_wlan_act = enable;
1571 if (coex_dm->pre_ignore_wlan_act ==
1572 coex_dm->cur_ignore_wlan_act) {
1574 coex_dm->pre_ignore_wlan_act =
1575 coex_dm->cur_ignore_wlan_act;
1580 halbtc8822b1ant_set_fw_ignore_wlan_act(btcoexist, enable);
1582 coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
1585 void halbtc8822b1ant_set_lps_rpwm(IN struct btc_coexist *btcoexist,
1586 IN u8 lps_val, IN u8 rpwm_val)
1591 btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
1592 btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
1595 void halbtc8822b1ant_lps_rpwm(IN struct btc_coexist *btcoexist,
1596 IN boolean force_exec, IN u8 lps_val, IN u8 rpwm_val)
1598 coex_dm->cur_lps = lps_val;
1599 coex_dm->cur_rpwm = rpwm_val;
1602 if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
1603 (coex_dm->pre_rpwm == coex_dm->cur_rpwm))
1606 halbtc8822b1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
1608 coex_dm->pre_lps = coex_dm->cur_lps;
1609 coex_dm->pre_rpwm = coex_dm->cur_rpwm;
1612 void halbtc8822b1ant_ps_tdma_check_for_power_save_state(
1613 IN struct btc_coexist *btcoexist, IN boolean new_ps_state)
1616 u8 h2c_parameter[5] = {0x8, 0, 0, 0, 0};
1618 btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1620 if (lps_mode) { /* already under LPS state */
1622 /* keep state under LPS, do nothing. */
1624 /* will leave LPS state, turn off psTdma first */
1626 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5,
1629 } else { /* NO PS state */
1631 /* will enter LPS state, turn off psTdma first */
1633 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5,
1636 /* keep state under NO PS state, do nothing. */
1642 void halbtc8822b1ant_power_save_state(IN struct btc_coexist *btcoexist,
1643 IN u8 ps_type, IN u8 lps_val, IN u8 rpwm_val)
1645 boolean low_pwr_disable = false;
1648 case BTC_PS_WIFI_NATIVE:
1649 /* recover to original 32k low power setting */
1650 coex_sta->force_lps_on = false;
1651 low_pwr_disable = false;
1652 btcoexist->btc_set(btcoexist,
1653 BTC_SET_ACT_DISABLE_LOW_POWER,
1655 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS,
1657 coex_sta->force_lps_on = false;
1661 coex_sta->force_lps_on = true;
1662 halbtc8822b1ant_ps_tdma_check_for_power_save_state(
1664 halbtc8822b1ant_lps_rpwm(btcoexist, NORMAL_EXEC,
1666 /* when coex force to enter LPS, do not enter 32k low power. */
1667 low_pwr_disable = true;
1668 btcoexist->btc_set(btcoexist,
1669 BTC_SET_ACT_DISABLE_LOW_POWER,
1671 /* power save must executed before psTdma. */
1672 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS,
1674 coex_sta->force_lps_on = true;
1676 case BTC_PS_LPS_OFF:
1678 coex_sta->force_lps_on = false;
1679 halbtc8822b1ant_ps_tdma_check_for_power_save_state(
1681 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS,
1683 coex_sta->force_lps_on = false;
1691 void halbtc8822b1ant_set_fw_pstdma(IN struct btc_coexist *btcoexist,
1692 IN u8 byte1, IN u8 byte2, IN u8 byte3, IN u8 byte4, IN u8 byte5)
1694 u8 h2c_parameter[5] = {0};
1695 u8 real_byte1 = byte1, real_byte5 = byte5;
1696 boolean ap_enable = false;
1698 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1702 if (byte1 & BIT(4) && !(byte1 & BIT(5))) {
1704 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1705 "[BTCoex], FW for 1Ant AP mode\n");
1706 BTC_TRACE(trace_buf);
1708 real_byte1 &= ~BIT(4);
1709 real_byte1 |= BIT(5);
1711 real_byte5 |= BIT(5);
1712 real_byte5 &= ~BIT(6);
1714 halbtc8822b1ant_power_save_state(btcoexist,
1715 BTC_PS_WIFI_NATIVE, 0x0,
1718 } else if (byte1 & BIT(4) && !(byte1 & BIT(5))) {
1720 halbtc8822b1ant_power_save_state(btcoexist,
1721 BTC_PS_LPS_ON, 0x50,
1724 halbtc8822b1ant_power_save_state(btcoexist,
1725 BTC_PS_WIFI_NATIVE, 0x0,
1730 h2c_parameter[0] = real_byte1;
1731 h2c_parameter[1] = byte2;
1732 h2c_parameter[2] = byte3;
1733 h2c_parameter[3] = byte4;
1734 h2c_parameter[4] = real_byte5;
1736 coex_dm->ps_tdma_para[0] = real_byte1;
1737 coex_dm->ps_tdma_para[1] = byte2;
1738 coex_dm->ps_tdma_para[2] = byte3;
1739 coex_dm->ps_tdma_para[3] = byte4;
1740 coex_dm->ps_tdma_para[4] = real_byte5;
1742 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1745 void halbtc8822b1ant_ps_tdma(IN struct btc_coexist *btcoexist,
1746 IN boolean force_exec, IN boolean turn_on, IN u8 type)
1748 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1749 struct btc_board_info *board_info = &btcoexist->board_info;
1750 boolean wifi_busy = false;
1751 static u8 psTdmaByte4Modify = 0x0, pre_psTdmaByte4Modify = 0x0;
1752 static boolean pre_wifi_busy = false;
1754 coex_dm->cur_ps_tdma_on = turn_on;
1755 coex_dm->cur_ps_tdma = type;
1757 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1759 if (wifi_busy != pre_wifi_busy) {
1761 pre_wifi_busy = wifi_busy;
1764 /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
1765 if ((bt_link_info->slave_role) && (bt_link_info->a2dp_exist))
1766 psTdmaByte4Modify = 0x1;
1768 psTdmaByte4Modify = 0x0;
1770 if (pre_psTdmaByte4Modify != psTdmaByte4Modify) {
1773 pre_psTdmaByte4Modify = psTdmaByte4Modify;
1776 if (coex_dm->cur_ps_tdma_on) {
1777 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1778 "[BTCoex], ********TDMA(on, %d) **********\n",
1779 coex_dm->cur_ps_tdma);
1780 BTC_TRACE(trace_buf);
1782 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1783 "[BTCoex], **********TDMA(off, %d) **********\n",
1784 coex_dm->cur_ps_tdma);
1785 BTC_TRACE(trace_buf);
1789 if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1790 (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma)) {
1791 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1792 "[BTCoex], return for no-TDMA case change\n");
1793 BTC_TRACE(trace_buf);
1802 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8,
1803 0x1); /* enable TBTT nterrupt */
1807 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1808 0x51, 0x1a, 0x1a, 0x0, 0x10);
1811 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1812 0x61, 0x3a, 0x03, 0x11, 0x10);
1815 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1816 0x51, 0x3a, 0x03, 0x10, 0x10);
1819 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1820 0x51, 0x21, 0x03, 0x10, 0x10);
1823 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1824 0x61, 0x15, 0x3, 0x11, 0x11);
1827 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1828 0x61, 0x10, 0x03, 0x10, 0x14 |
1832 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1833 0x51, 0x10, 0x03, 0x10, 0x14 |
1837 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1838 0x51, 0x25, 0x03, 0x10, 0x10 |
1842 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1843 0x51, 0x15, 0x03, 0x10, 0x10 |
1847 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1848 0x51, 0x20, 0x03, 0x10, 0x10 |
1852 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1853 0x61, 0x10, 0x03, 0x11, 0x14 |
1858 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1859 0x61, 0x30, 0x03, 0x11, 0x10);
1862 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1863 0x61, 0x25, 0x03, 0x11, 0x10);
1866 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1867 0x61, 0x35, 0x3, 0x11, 0x11);
1870 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1871 0x61, 0x35, 0x03, 0x11, 0x10);
1874 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1875 0x51, 0x45, 0x3, 0x11, 0x11);
1878 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1879 0x51, 0x1e, 0x3, 0x10, 0x14 |
1883 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1884 0x51, 0x45, 0x3, 0x10, 0x14);
1887 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1888 0x51, 0x25, 0x3, 0x10, 0x10);
1891 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1892 0x51, 0x29, 0x3, 0x10, 0x10);
1895 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1896 0x51, 0x1a, 0x3, 0x10, 0x10);
1899 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1900 0x51, 0x32, 0x3, 0x10, 0x10);
1903 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1904 0x51, 0x29, 0x3, 0x10, 0x10);
1907 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1908 0x55, 0x1e, 0x3, 0x10, 0x54);
1916 default: /* Software control, Antenna at BT side */
1917 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1918 0x0, 0x0, 0x0, 0x0, 0x0);
1920 halbtc8822b1ant_set_ant_path(btcoexist,
1921 BTC_ANT_PATH_BT, FORCE_EXEC, false,
1924 case 8: /* PTA Control */
1925 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1926 0x8, 0x0, 0x0, 0x0, 0x0);
1928 halbtc8822b1ant_set_ant_path(btcoexist,
1929 BTC_ANT_PATH_PTA, FORCE_EXEC, false,
1932 case 9: /* Software control, Antenna at WiFi side */
1933 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1934 0x0, 0x0, 0x0, 0x0, 0x0);
1936 halbtc8822b1ant_set_ant_path(btcoexist,
1937 BTC_ANT_PATH_WIFI, FORCE_EXEC,false,false); */
1939 case 10: /* under 5G , 0x778=1*/
1940 halbtc8822b1ant_set_fw_pstdma(btcoexist,
1941 0x0, 0x0, 0x0, 0x0, 0x0);
1944 halbtc8822b1ant_set_ant_path(btcoexist,
1945 BTC_ANT_PATH_WIFI5G, FORCE_EXEC, false,
1953 /* update pre state */
1954 coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1955 coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1959 void halbtc8822b1ant_sw_mechanism(IN struct btc_coexist *btcoexist,
1960 IN boolean low_penalty_ra)
1962 halbtc8822b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
1964 /*rf4 type by efuse , and for ant at main aux inverse use , because is 2x2 ,and control types are the same ,does not need */
1966 void halbtc8822b1ant_set_rfe_type(IN struct btc_coexist *btcoexist)
1968 struct btc_board_info *board_info = &btcoexist->board_info;
1970 /* Ext switch buffer mux */
1971 btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
1972 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991, 0x3, 0x0);
1973 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe, 0x8, 0x0);
1975 /* the following setup should be got from Efuse in the future */
1976 rfe_type->rfe_module_type = board_info->rfe_type;
1978 rfe_type->ext_ant_switch_ctrl_polarity = 0;
1980 switch (rfe_type->rfe_module_type) {
1983 rfe_type->ext_ant_switch_exist = true;
1984 rfe_type->ext_ant_switch_type =
1985 BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SPDT;
1988 rfe_type->ext_ant_switch_exist = true;
1989 rfe_type->ext_ant_switch_type =
1990 BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SPDT;
1993 rfe_type->ext_ant_switch_exist = true;
1994 rfe_type->ext_ant_switch_type =
1995 BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SPDT;
1998 rfe_type->ext_ant_switch_exist = true;
1999 rfe_type->ext_ant_switch_type =
2000 BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SPDT;
2003 rfe_type->ext_ant_switch_exist = true;
2004 rfe_type->ext_ant_switch_type =
2005 BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SP3T; /* SP3T */;
2012 /*anttenna control by bb mac bt antdiv pta to write 0x4c 0xcb4,0xcbd*/
2014 void halbtc8822b1ant_set_ext_ant_switch(IN struct btc_coexist *btcoexist,
2015 IN boolean force_exec, IN u8 ctrl_type, IN u8 pos_type)
2017 struct btc_board_info *board_info = &btcoexist->board_info;
2018 boolean switch_polatiry_inverse = false;
2019 u8 regval_0xcbd = 0, regval_0x64;
2020 u32 u32tmp1 = 0, u32tmp2 = 0, u32tmp3 = 0;
2021 /* Ext switch buffer mux */
2022 btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
2023 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991, 0x3, 0x0);
2024 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe, 0x8, 0x0);
2026 if (!rfe_type->ext_ant_switch_exist)
2029 coex_dm->cur_ext_ant_switch_status = (ctrl_type << 8) + pos_type;
2032 if (coex_dm->pre_ext_ant_switch_status ==
2033 coex_dm->cur_ext_ant_switch_status)
2037 coex_dm->pre_ext_ant_switch_status = coex_dm->cur_ext_ant_switch_status;
2039 /* swap control polarity if use different switch control polarity*/
2040 /* Normal switch polarity for SPDT, 0xcbd[1:0] = 2b'01 => Ant to BTG, 0xcbd[1:0] = 2b'10 => Ant to WLG */
2041 switch_polatiry_inverse = (rfe_type->ext_ant_switch_ctrl_polarity == 1 ?
2042 ~switch_polatiry_inverse : switch_polatiry_inverse);
2047 case BT_8822B_1ANT_EXT_ANT_SWITCH_TO_BT:
2048 case BT_8822B_1ANT_EXT_ANT_SWITCH_TO_NOCARE:
2051 case BT_8822B_1ANT_EXT_ANT_SWITCH_TO_WLG:
2053 case BT_8822B_1ANT_EXT_ANT_SWITCH_TO_WLA:
2058 if (rfe_type->ext_ant_switch_type ==
2059 BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SPDT) {
2060 switch (ctrl_type) {
2062 case BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_BBSW:
2063 btcoexist->btc_write_1byte_bitmask(
2064 btcoexist, 0x4e, 0x80,
2065 0x0); /* 0x4c[23] = 0 */
2066 btcoexist->btc_write_1byte_bitmask(
2067 btcoexist, 0x4f, 0x01,
2068 0x1); /* 0x4c[24] = 1 */
2069 btcoexist->btc_write_1byte_bitmask(
2070 btcoexist, 0xcb4, 0xff,
2071 0x77); /* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as conctrol pin */
2073 regval_0xcbd = (switch_polatiry_inverse
2075 0x2); /* 0xcbd[1:0] = 2b'01 for no switch_polatiry_inverse, ANTSWB =1, ANTSW =0 */
2076 btcoexist->btc_write_1byte_bitmask(
2077 btcoexist, 0xcbd, 0x3,
2081 case BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_PTA:
2082 btcoexist->btc_write_1byte_bitmask(
2083 btcoexist, 0x4e, 0x80,
2084 0x0); /* 0x4c[23] = 0 */
2085 btcoexist->btc_write_1byte_bitmask(
2086 btcoexist, 0x4f, 0x01,
2087 0x1); /* 0x4c[24] = 1 */
2088 btcoexist->btc_write_1byte_bitmask(
2089 btcoexist, 0xcb4, 0xff,
2090 0x66); /* PTA, DPDT use RFE_ctrl8 and RFE_ctrl9 as conctrol pin */
2092 regval_0xcbd = (switch_polatiry_inverse
2094 0x1); /* 0xcbd[1:0] = 2b'10 for no switch_polatiry_inverse, ANTSWB =1, ANTSW =0 @ GNT_BT=1 */
2095 btcoexist->btc_write_1byte_bitmask(
2096 btcoexist, 0xcbd, 0x3,
2100 case BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_ANTDIV
2102 btcoexist->btc_write_1byte_bitmask(
2103 btcoexist, 0x4e, 0x80,
2104 0x0); /* 0x4c[23] = 0 */
2105 btcoexist->btc_write_1byte_bitmask(
2106 btcoexist, 0x4f, 0x01,
2107 0x1); /* 0x4c[24] = 1 */
2108 btcoexist->btc_write_1byte_bitmask(
2109 btcoexist, 0xcb4, 0xff,
2112 /* no regval_0xcbd setup required, because antenna switch control value by antenna diversity */
2115 case BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_MAC:
2116 btcoexist->btc_write_1byte_bitmask(
2117 btcoexist, 0x4e, 0x80,
2118 0x1); /* 0x4c[23] = 1 */
2120 regval_0x64 = (switch_polatiry_inverse
2122 0x1); /* 0x64[0] = 1b'0 for no switch_polatiry_inverse, DPDT_SEL_N =1, DPDT_SEL_P =0 */
2123 btcoexist->btc_write_1byte_bitmask(
2124 btcoexist, 0x64, 0x1,
2127 case BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_BT:
2128 btcoexist->btc_write_1byte_bitmask(
2129 btcoexist, 0x4e, 0x80,
2130 0x0); /* 0x4c[23] = 0 */
2131 btcoexist->btc_write_1byte_bitmask(
2132 btcoexist, 0x4f, 0x01,
2133 0x0); /* 0x4c[24] = 0 */
2135 /* no setup required, because antenna switch control value by BT vendor 0xac[1:0] */
2140 u32tmp1 = btcoexist->btc_read_4byte(btcoexist, 0xcbc);
2141 u32tmp2 = btcoexist->btc_read_4byte(btcoexist, 0x4c);
2142 u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0x64) & 0xff;
2144 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2145 "[BTCoex], ********** (After Ext Ant switch setup) 0xcbc = 0x%08x, 0x4c = 0x%08x, 0x64= 0x%02x**********\n",
2146 u32tmp1, u32tmp2, u32tmp3);
2147 BTC_TRACE(trace_buf);
2152 /*set gnt_wl gnt_bt control by sw high low , or hwpta while in power on,ini,wlan off,wlan only ,wl2g non-currrent ,wl2g current,wl5g*/
2154 void halbtc8822b1ant_set_ant_path(IN struct btc_coexist *btcoexist,
2155 IN u8 ant_pos_type, IN boolean force_exec,
2159 struct btc_board_info *board_info = &btcoexist->board_info;
2161 u32 u32tmp1 = 0, u32tmp2 = 0, u32tmp3 = 0;
2162 /* Ext switch buffer mux */
2163 btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
2164 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991, 0x3, 0x0);
2165 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe, 0x8, 0x0);
2167 coex_dm->cur_ant_pos_type = (ant_pos_type << 8) + phase;
2170 if (coex_dm->cur_ant_pos_type ==
2171 coex_dm->pre_ant_pos_type)
2175 coex_dm->pre_ant_pos_type = coex_dm->cur_ant_pos_type;
2178 u32tmp1 = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
2180 u32tmp2 = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
2182 u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
2184 u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x73);
2186 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2187 "[BTCoex], ********** (Before Ant Setup) 0xcb4 = 0x%x, 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n",
2188 u32tmp3, u8tmp, u32tmp1, u32tmp2);
2189 BTC_TRACE(trace_buf);
2193 case BT_8822B_1ANT_PHASE_COEX_INIT:
2194 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2195 "[BTCoex], ********** (set_ant_path - 1ANT_PHASE_COEX_INIT) **********\n");
2196 BTC_TRACE(trace_buf);
2198 /* Disable LTE Coex Function in WiFi side (this should be on if LTE coex is required) */
2199 halbtc8822b1ant_ltecoex_enable(btcoexist, 0x0);
2201 /* GNT_WL_LTE always = 1 (this should be config if LTE coex is required) */
2202 halbtc8822b1ant_ltecoex_set_coex_table(btcoexist,
2203 BT_8822B_1ANT_CTT_WL_VS_LTE,
2206 /* GNT_BT_LTE always = 1 (this should be config if LTE coex is required) */
2207 halbtc8822b1ant_ltecoex_set_coex_table(btcoexist,
2208 BT_8822B_1ANT_CTT_BT_VS_LTE,
2211 /* set GNT_BT to SW high */
2212 halbtc8822b1ant_ltecoex_set_gnt_bt(btcoexist,
2213 BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2214 BT_8822B_1ANT_GNT_CTRL_BY_SW,
2215 BT_8822B_1ANT_SIG_STA_SET_TO_HIGH);
2217 /* set GNT_WL to SW low */
2218 halbtc8822b1ant_ltecoex_set_gnt_wl(btcoexist,
2219 BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2220 BT_8822B_1ANT_GNT_CTRL_BY_SW,
2221 BT_8822B_1ANT_SIG_STA_SET_TO_LOW);
2223 /* set Path control owner to WL at initial step */
2224 halbtc8822b1ant_ltecoex_pathcontrol_owner(btcoexist,
2225 BT_8822B_1ANT_PCO_WLSIDE);
2227 coex_sta->run_time_state = false;
2229 /* Ext switch buffer mux */
2230 btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
2231 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991,
2233 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe,
2236 if (BTC_ANT_PATH_AUTO == ant_pos_type)
2237 ant_pos_type = BTC_ANT_PATH_BT;
2240 case BT_8822B_1ANT_PHASE_WLANONLY_INIT:
2241 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2242 "[BTCoex], ********** (set_ant_path - 1ANT_PHASE_WLANONLY_INIT) **********\n");
2243 BTC_TRACE(trace_buf);
2245 /* Disable LTE Coex Function in WiFi side (this should be on if LTE coex is required) */
2246 halbtc8822b1ant_ltecoex_enable(btcoexist, 0x0);
2248 /* GNT_WL_LTE always = 1 (this should be config if LTE coex is required) */
2249 halbtc8822b1ant_ltecoex_set_coex_table(btcoexist,
2250 BT_8822B_1ANT_CTT_WL_VS_LTE,
2253 /* GNT_BT_LTE always = 1 (this should be config if LTE coex is required) */
2254 halbtc8822b1ant_ltecoex_set_coex_table(btcoexist,
2255 BT_8822B_1ANT_CTT_BT_VS_LTE,
2258 /* set GNT_BT to SW Low */
2259 halbtc8822b1ant_ltecoex_set_gnt_bt(btcoexist,
2260 BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2261 BT_8822B_1ANT_GNT_CTRL_BY_SW,
2262 BT_8822B_1ANT_SIG_STA_SET_TO_LOW);
2264 /* Set GNT_WL to SW high */
2265 halbtc8822b1ant_ltecoex_set_gnt_wl(btcoexist,
2266 BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2267 BT_8822B_1ANT_GNT_CTRL_BY_SW,
2268 BT_8822B_1ANT_SIG_STA_SET_TO_HIGH);
2270 /* set Path control owner to WL at initial step */
2271 halbtc8822b1ant_ltecoex_pathcontrol_owner(btcoexist,
2272 BT_8822B_1ANT_PCO_WLSIDE);
2274 coex_sta->run_time_state = false;
2276 /* Ext switch buffer mux */
2277 btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
2278 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991,
2280 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe,
2283 if (BTC_ANT_PATH_AUTO == ant_pos_type)
2284 ant_pos_type = BTC_ANT_PATH_WIFI;
2287 case BT_8822B_1ANT_PHASE_WLAN_OFF:
2288 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2289 "[BTCoex], ********** (set_ant_path - 1ANT_PHASE_WLAN_OFF) **********\n");
2290 BTC_TRACE(trace_buf);
2292 /* Disable LTE Coex Function in WiFi side */
2293 halbtc8822b1ant_ltecoex_enable(btcoexist, 0x0);
2295 /* set Path control owner to BT */
2296 halbtc8822b1ant_ltecoex_pathcontrol_owner(btcoexist,
2297 BT_8822B_1ANT_PCO_BTSIDE);
2299 /* Set Ext Ant Switch to BT control at wifi off step */
2300 halbtc8822b1ant_set_ext_ant_switch(btcoexist,
2302 BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_BT,
2303 BT_8822B_1ANT_EXT_ANT_SWITCH_TO_NOCARE);
2305 coex_sta->run_time_state = false;
2308 case BT_8822B_1ANT_PHASE_2G_RUNTIME:
2309 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2310 "[BTCoex], ********** (set_ant_path - 1ANT_PHASE_2G_RUNTIME) **********\n");
2311 BTC_TRACE(trace_buf);
2313 /* set GNT_BT to PTA */
2314 halbtc8822b1ant_ltecoex_set_gnt_bt(btcoexist,
2315 BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2316 BT_8822B_1ANT_GNT_CTRL_BY_PTA,
2317 BT_8822B_1ANT_SIG_STA_SET_BY_HW);
2319 /* Set GNT_WL to PTA */
2320 halbtc8822b1ant_ltecoex_set_gnt_wl(btcoexist,
2321 BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2322 BT_8822B_1ANT_GNT_CTRL_BY_PTA,
2323 BT_8822B_1ANT_SIG_STA_SET_BY_HW);
2325 /* set Path control owner to WL at runtime step */
2326 halbtc8822b1ant_ltecoex_pathcontrol_owner(btcoexist,
2327 BT_8822B_1ANT_PCO_WLSIDE);
2329 coex_sta->run_time_state = true;
2331 if (BTC_ANT_PATH_AUTO == ant_pos_type)
2332 ant_pos_type = BTC_ANT_PATH_PTA;
2335 case BT_8822B_1ANT_PHASE_5G_RUNTIME:
2336 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2337 "[BTCoex], ********** (set_ant_path - 1ANT_PHASE_5G_RUNTIME) **********\n");
2338 BTC_TRACE(trace_buf);
2340 /* set GNT_BT to SW Hi */
2341 halbtc8822b1ant_ltecoex_set_gnt_bt(btcoexist,
2342 BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2343 BT_8822B_1ANT_GNT_CTRL_BY_SW,
2344 BT_8822B_1ANT_SIG_STA_SET_TO_HIGH);
2346 /* Set GNT_WL to SW Hi */
2347 halbtc8822b1ant_ltecoex_set_gnt_wl(btcoexist,
2348 BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2349 BT_8822B_1ANT_GNT_CTRL_BY_SW,
2350 BT_8822B_1ANT_SIG_STA_SET_TO_HIGH);
2352 /* set Path control owner to WL at runtime step */
2353 halbtc8822b1ant_ltecoex_pathcontrol_owner(btcoexist,
2354 BT_8822B_1ANT_PCO_WLSIDE);
2356 coex_sta->run_time_state = true;
2358 if (BTC_ANT_PATH_AUTO == ant_pos_type)
2360 BTC_ANT_PATH_WIFI5G;
2363 case BT_8822B_1ANT_PHASE_BTMPMODE:
2364 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2365 "[BTCoex], ********** (set_ant_path - 1ANT_PHASE_BTMPMODE) **********\n");
2366 BTC_TRACE(trace_buf);
2368 /* Disable LTE Coex Function in WiFi side */
2369 halbtc8822b1ant_ltecoex_enable(btcoexist, 0x0);
2371 /* set GNT_BT to SW Hi */
2372 halbtc8822b1ant_ltecoex_set_gnt_bt(btcoexist,
2373 BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2374 BT_8822B_1ANT_GNT_CTRL_BY_SW,
2375 BT_8822B_1ANT_SIG_STA_SET_TO_HIGH);
2377 /* Set GNT_WL to SW Lo */
2378 halbtc8822b1ant_ltecoex_set_gnt_wl(btcoexist,
2379 BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2380 BT_8822B_1ANT_GNT_CTRL_BY_SW,
2381 BT_8822B_1ANT_SIG_STA_SET_TO_LOW);
2383 /* set Path control owner to WL */
2384 halbtc8822b1ant_ltecoex_pathcontrol_owner(btcoexist,
2385 BT_8822B_1ANT_PCO_WLSIDE);
2387 coex_sta->run_time_state = false;
2389 /* Set Ext Ant Switch to BT side at BT MP mode */
2390 if (BTC_ANT_PATH_AUTO == ant_pos_type)
2391 ant_pos_type = BTC_ANT_PATH_BT;
2397 if (phase != BT_8822B_1ANT_PHASE_WLAN_OFF) {
2398 switch (ant_pos_type) {
2399 case BTC_ANT_PATH_WIFI:
2400 halbtc8822b1ant_set_ext_ant_switch(
2403 BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_BBSW,
2404 BT_8822B_1ANT_EXT_ANT_SWITCH_TO_WLG);
2406 case BTC_ANT_PATH_WIFI5G
2408 halbtc8822b1ant_set_ext_ant_switch(
2411 BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_BBSW,
2412 BT_8822B_1ANT_EXT_ANT_SWITCH_TO_WLA);
2414 case BTC_ANT_PATH_BT:
2415 halbtc8822b1ant_set_ext_ant_switch(
2418 BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_BBSW,
2419 BT_8822B_1ANT_EXT_ANT_SWITCH_TO_BT);
2422 case BTC_ANT_PATH_PTA:
2423 halbtc8822b1ant_set_ext_ant_switch(
2426 BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_PTA,
2427 BT_8822B_1ANT_EXT_ANT_SWITCH_TO_NOCARE);
2433 u32tmp1 = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
2434 u32tmp2 = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x54);
2435 u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
2437 u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x73);
2439 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2440 "[BTCoex], ********** (After Ant Setup) 0xcb4 = 0x%x, 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n",
2441 u32tmp3, u8tmp, u32tmp1, u32tmp2);
2442 BTC_TRACE(trace_buf);
2449 void halbtc8822b1ant_coex_all_off(IN struct btc_coexist *btcoexist)
2452 halbtc8822b1ant_sw_mechanism(btcoexist, false);
2455 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2457 boolean halbtc8822b1ant_is_common_action(IN struct btc_coexist *btcoexist)
2459 boolean common = false, wifi_connected = false, wifi_busy = false;
2461 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2463 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2465 if (!wifi_connected &&
2466 BT_8822B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
2467 coex_dm->bt_status) {
2468 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2469 "[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n");
2470 BTC_TRACE(trace_buf);
2472 /* halbtc8822b1ant_sw_mechanism(btcoexist, false); */
2475 } else if (wifi_connected &&
2476 (BT_8822B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
2477 coex_dm->bt_status)) {
2478 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2479 "[BTCoex], Wifi connected + BT non connected-idle!!\n");
2480 BTC_TRACE(trace_buf);
2482 /* halbtc8822b1ant_sw_mechanism(btcoexist, false); */
2485 } else if (!wifi_connected &&
2486 (BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE ==
2487 coex_dm->bt_status)) {
2488 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2489 "[BTCoex], Wifi non connected-idle + BT connected-idle!!\n");
2490 BTC_TRACE(trace_buf);
2492 /* halbtc8822b1ant_sw_mechanism(btcoexist, false); */
2495 } else if (wifi_connected &&
2496 (BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE ==
2497 coex_dm->bt_status)) {
2498 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2499 "[BTCoex], Wifi connected + BT connected-idle!!\n");
2500 BTC_TRACE(trace_buf);
2502 /* halbtc8822b1ant_sw_mechanism(btcoexist, false); */
2505 } else if (!wifi_connected &&
2506 (BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE !=
2507 coex_dm->bt_status)) {
2508 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2509 "[BTCoex], Wifi non connected-idle + BT Busy!!\n");
2510 BTC_TRACE(trace_buf);
2512 /* halbtc8822b1ant_sw_mechanism(btcoexist, false); */
2517 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2518 "[BTCoex], Wifi Connected-Busy + BT Busy!!\n");
2519 BTC_TRACE(trace_buf);
2521 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2522 "[BTCoex], Wifi Connected-Idle + BT Busy!!\n");
2523 BTC_TRACE(trace_buf);
2532 void halbtc8822b1ant_action_wifi_under5g(IN struct btc_coexist *btcoexist)
2534 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2535 "[BTCoex], under 5g start\n");
2536 BTC_TRACE(trace_buf);
2537 /* for test : s3 bt disappear , fail rate 1/600*/
2539 halbtc8822b1ant_ignore_wlan_act(btcoexist, NORMAL_EXEC, true);
2541 /*set sw gnt wl bt high*/
2542 halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, FORCE_EXEC,
2543 BT_8822B_1ANT_PHASE_5G_RUNTIME);
2545 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2546 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2548 halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2550 halbtc8822b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 5);
2556 void halbtc8822b1ant_action_wifi_only(IN struct btc_coexist *btcoexist)
2558 boolean wifi_under_5g = false;
2560 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2561 if (wifi_under_5g) {
2562 halbtc8822b1ant_action_wifi_under5g(btcoexist);
2564 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2565 "[BTCoex], ********** (wlan only -- under 5g ) **********\n");
2566 BTC_TRACE(trace_buf);
2570 halbtc8822b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
2571 halbtc8822b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2573 halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, FORCE_EXEC,
2574 BT_8822B_1ANT_PHASE_2G_RUNTIME);
2576 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2577 "[BTCoex], ********** (wlan only -- under 2g ) **********\n");
2578 BTC_TRACE(trace_buf);
2582 /* *********************************************
2584 * Software Coex Mechanism start
2586 * ********************************************* */
2588 /* SCO only or SCO+PAN(HS) */
2591 void halbtc8822b1ant_action_sco(IN struct btc_coexist* btcoexist)
2593 halbtc8822b1ant_sw_mechanism(btcoexist, true);
2597 void halbtc8822b1ant_action_hid(IN struct btc_coexist* btcoexist)
2599 halbtc8822b1ant_sw_mechanism(btcoexist, true);
2603 void halbtc8822b1ant_action_a2dp(IN struct btc_coexist* btcoexist)
2605 halbtc8822b1ant_sw_mechanism(btcoexist, false);
2608 void halbtc8822b1ant_action_a2dp_pan_hs(IN struct btc_coexist* btcoexist)
2610 halbtc8822b1ant_sw_mechanism(btcoexist, false);
2613 void halbtc8822b1ant_action_pan_edr(IN struct btc_coexist* btcoexist)
2615 halbtc8822b1ant_sw_mechanism(btcoexist, false);
2619 void halbtc8822b1ant_action_pan_hs(IN struct btc_coexist* btcoexist)
2621 halbtc8822b1ant_sw_mechanism(btcoexist, false);
2625 void halbtc8822b1ant_action_pan_edr_a2dp(IN struct btc_coexist* btcoexist)
2627 halbtc8822b1ant_sw_mechanism(btcoexist, false);
2630 void halbtc8822b1ant_action_pan_edr_hid(IN struct btc_coexist* btcoexist)
2632 halbtc8822b1ant_sw_mechanism(btcoexist, true);
2636 void halbtc8822b1ant_action_hid_a2dp_pan_edr(IN struct btc_coexist* btcoexist)
2638 halbtc8822b1ant_sw_mechanism(btcoexist, true);
2641 void halbtc8822b1ant_action_hid_a2dp(IN struct btc_coexist* btcoexist)
2643 halbtc8822b1ant_sw_mechanism(btcoexist, true);
2648 /* *********************************************
2650 * Non-Software Coex Mechanism start
2652 * ********************************************* */
2653 void halbtc8822b1ant_action_bt_whck_test(IN struct btc_coexist *btcoexist)
2655 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2656 "[BTCoex],action_bt_whck_test\n");
2657 BTC_TRACE(trace_buf);
2659 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2661 halbtc8822b1ant_set_ant_path(btcoexist,
2664 BT_8822B_1ANT_PHASE_2G_RUNTIME);
2666 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2669 void halbtc8822b1ant_action_wifi_multi_port(IN struct btc_coexist *btcoexist)
2671 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2672 "[BTCoex],action_wifi_multi_port\n");
2673 BTC_TRACE(trace_buf);
2675 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2677 halbtc8822b1ant_set_ant_path(btcoexist,
2680 BT_8822B_1ANT_PHASE_2G_RUNTIME);
2682 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
2685 void halbtc8822b1ant_action_hs(IN struct btc_coexist *btcoexist)
2687 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2688 "[BTCoex], action_hs\n");
2689 BTC_TRACE(trace_buf);
2691 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
2693 halbtc8822b1ant_set_ant_path(btcoexist,
2696 BT_8822B_1ANT_PHASE_2G_RUNTIME);
2698 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
2701 /*"""bt inquiry"""" + wifi any + bt any*/
2702 void halbtc8822b1ant_action_bt_inquiry(IN struct btc_coexist *btcoexist)
2705 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2706 boolean wifi_connected = false, ap_enable = false, wifi_busy = false,
2710 boolean wifi_scan = false, link = false, roam = false;
2712 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2713 "[BTCoex], ********** (bt inquiry) **********\n");
2714 BTC_TRACE(trace_buf);
2715 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
2717 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2719 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2720 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
2723 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &wifi_scan);
2724 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2725 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2728 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2729 "[BTCoex], ********** scan = %d, link =%d, roam = %d**********\n",
2730 wifi_scan, link, roam);
2731 BTC_TRACE(trace_buf);
2733 if ((link) || (roam) || (coex_sta->wifi_is_high_pri_task)) {
2735 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2736 "[BTCoex], ********** (bt inquiry wifi connect or scan ) **********\n");
2737 BTC_TRACE(trace_buf);
2739 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1);
2741 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
2743 } else if ((wifi_scan) && (coex_sta->bt_create_connection)) {
2745 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
2746 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
2748 } else if ((!wifi_connected) && (!wifi_scan)) {
2750 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2751 "[BTCoex], ********** (bt inquiry wifi non connect) **********\n");
2752 BTC_TRACE(trace_buf);
2754 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2756 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2758 } else if ((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) {
2760 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
2761 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2762 } else if (bt_link_info->a2dp_exist) {
2764 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
2766 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3);
2767 } else if (wifi_scan) {
2769 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
2771 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2772 } else if (wifi_busy) {
2774 /* for BT inquiry/page fail after S4 resume */
2775 /* halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20); */
2776 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
2778 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
2781 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2782 "[BTCoex], ********** (bt inquiry wifi connect) **********\n");
2783 BTC_TRACE(trace_buf);
2785 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
2787 halbtc8822b1ant_set_ant_path(btcoexist,
2790 BT_8822B_1ANT_PHASE_2G_RUNTIME);
2792 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
2797 if ((wifi_link) || (wifi_roam) || (coex_sta->wifi_is_high_pri_task)) {
2799 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);
2800 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
2802 } else if ((wifi_scan) && (coex_sta->bt_create_connection)) {
2804 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
2805 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
2807 } else if ((!wifi_connected) && (!wifi_scan)) {
2809 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2811 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2812 } else if ((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) {
2814 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
2815 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2817 } else if (bt_link_info->a2dp_exist) {
2819 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
2821 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2822 } else if (wifi_scan) {
2824 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
2826 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2828 } else if (wifi_busy) {
2829 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 21);
2831 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2833 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 19);
2835 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2840 void halbtc8822b1ant_action_bt_sco_hid_only_busy(IN struct btc_coexist
2841 *btcoexist, IN u8 wifi_status)
2844 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2846 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x45e, 0x8, 0x1);
2848 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2849 "[BTCoex], ********** (bt sco hid only busy) **********\n");
2850 BTC_TRACE(trace_buf);
2852 /*SCO + wifi connected idle or busy / 0x778=1@wifi slot*/
2853 if (bt_link_info->sco_exist) {
2855 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x45e, 0x8, 0x1);
2856 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
2857 /*case16 for connect SCO first then connect a2sp fail issue*/
2858 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 16);
2860 } else { /* HID + wifi connected idle or busy / 0x778=1@wifi slot */
2862 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x45e, 0x8, 0x1);
2864 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
2865 /*case16 for connect HID first then connect a2sp fail issue*/
2866 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 16);
2871 /*wifi connected + bt acl busy*/
2872 void halbtc8822b1ant_action_wifi_connected_bt_acl_busy(IN struct btc_coexist
2873 *btcoexist, IN u8 wifi_status)
2877 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2878 boolean wifi_busy = false, wifi_turbo = false;
2881 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW,
2883 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2884 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
2885 &coex_sta->scan_ap_num);
2886 bt_rssi_state = halbtc8822b1ant_bt_rssi_state(2, 28, 0);
2888 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2889 "[BTCoex], ********** (wifi connect acl busy) **********\n");
2890 BTC_TRACE(trace_buf);
2894 if (bt_link_info->hid_only) { /* HID + wifi connected idle or busy / 0x778=1@wifi slot */
2899 btcoexist->btc_write_1byte_bitmask(
2900 btcoexist, 0x45e, 0x8, 0x1);
2904 halbtc8822b1ant_action_bt_sco_hid_only_busy(btcoexist,
2908 bt_link_info->a2dp_only) { /* A2DP + wifi connected idle or busy */
2909 if (BT_8822B_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifi_status) {
2912 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x45e,
2915 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2917 halbtc8822b1ant_coex_table_with_type(btcoexist,
2920 if (coex_sta->scan_ap_num >=
2921 BT_8822B_1ANT_WIFI_NOISY_THRESH) {
2922 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2930 btcoexist->btc_write_1byte_bitmask(
2931 btcoexist, 0x45e, 0x8, 0x1);
2933 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2937 halbtc8822b1ant_coex_table_with_type(btcoexist,
2941 halbtc8822b1ant_coex_table_with_type(btcoexist,
2944 coex_dm->auto_tdma_adjust = true;
2947 /* A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP) */
2948 } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) ||
2949 (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&
2950 bt_link_info->pan_exist)) { /* A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP) */
2952 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x45e, 0x8, 0x1);
2953 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 47);
2954 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
2956 } else if (bt_link_info->hid_exist &&
2957 bt_link_info->a2dp_exist) { /* HID+A2DP */
2959 btcoexist->btc_write_1byte_bitmask(
2960 btcoexist, 0x45e, 0x8, 0x1);
2962 /*a2dp glitch while wl idle , change the 0x6c0=5a5a5a5a->5555or aaaa55aa*/
2963 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2964 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2967 } else if (wifi_bw == 0) { /* 11bg mode */
2968 halbtc8822b1ant_coex_table_with_type(btcoexist,
2970 halbtc8822b1ant_set_wltoggle_coex_table(
2976 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2980 /*if in open space , and ask wl tp , 0x60=6135031111,55555555,aaaa55aa*/
2981 halbtc8822b1ant_coex_table_with_type(btcoexist,
2983 halbtc8822b1ant_set_wltoggle_coex_table(btcoexist, NORMAL_EXEC, 0x2, 0xaa, 0x5a, 0xaa, 0xaa);
2984 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 49);
2987 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
2994 } else if ((bt_link_info->pan_only) || (bt_link_info->hid_exist &&
2995 bt_link_info->pan_exist)) { /* PAN(OPP,FTP), HID+PAN(OPP,FTP)*/
2997 if (BT_8723D_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifi_status)
2998 halbtc8723d1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3003 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x45e, 0x8, 0x1);
3004 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 47);
3005 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3008 /* BT no-profile busy (0x9) */
3010 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x45e, 0x8, 0x1);
3011 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);
3012 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3017 /*wifi not connected + bt action*/
3018 void halbtc8822b1ant_action_wifi_not_connected(IN struct btc_coexist *btcoexist)
3020 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3021 "[BTCoex], ********** (wifi not connect) **********\n");
3022 BTC_TRACE(trace_buf);
3024 /* tdma and coex table */
3025 halbtc8822b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
3027 halbtc8822b1ant_set_ant_path(btcoexist,
3030 BT_8822B_1ANT_PHASE_2G_RUNTIME);
3032 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3035 /*""""wl not connected scan"""" + bt action*/
3036 void halbtc8822b1ant_action_wifi_not_connected_scan(IN struct btc_coexist
3040 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3041 boolean wifi_connected = false, bt_hs_on = false;
3042 u32 wifi_link_status = 0;
3043 u32 num_of_wifi_link = 0;
3044 boolean bt_ctrl_agg_buf_size = false;
3045 u8 agg_buf_size = 5;
3047 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3048 "[BTCoex], ********** (wifi non connect scan) **********\n");
3049 BTC_TRACE(trace_buf);
3051 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3052 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3055 num_of_wifi_link = wifi_link_status >> 16;
3057 if (num_of_wifi_link >= 2) {
3058 halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3059 halbtc8822b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3060 bt_ctrl_agg_buf_size, agg_buf_size);
3062 if (coex_sta->c2h_bt_inquiry_page) {
3063 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3064 "############# [BTCoex], BT Is Inquirying\n");
3065 BTC_TRACE(trace_buf);
3066 halbtc8822b1ant_action_bt_inquiry(btcoexist);
3068 halbtc8822b1ant_action_wifi_multi_port(btcoexist);
3072 if (coex_sta->c2h_bt_inquiry_page) {
3073 halbtc8822b1ant_action_bt_inquiry(btcoexist);
3075 } else if (bt_hs_on) {
3076 halbtc8822b1ant_action_hs(btcoexist);
3080 /* tdma and coex table */
3081 if (BT_8822B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
3082 if (bt_link_info->a2dp_exist) {
3083 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3085 halbtc8822b1ant_coex_table_with_type(btcoexist,
3087 } else if (bt_link_info->a2dp_exist &&
3088 bt_link_info->pan_exist) {
3089 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3091 halbtc8822b1ant_coex_table_with_type(btcoexist,
3094 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3096 halbtc8822b1ant_coex_table_with_type(btcoexist,
3099 } else if ((BT_8822B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
3100 (BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
3101 coex_dm->bt_status)) {
3102 halbtc8822b1ant_action_bt_sco_hid_only_busy(btcoexist,
3103 BT_8822B_1ANT_WIFI_STATUS_CONNECTED_SCAN);
3106 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
3108 halbtc8822b1ant_set_ant_path(btcoexist,
3111 BT_8822B_1ANT_PHASE_2G_RUNTIME);
3113 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3118 /*""""wl not connected asso"""" + bt action*/
3119 void halbtc8822b1ant_action_wifi_not_connected_asso_auth(
3120 IN struct btc_coexist *btcoexist)
3123 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3124 boolean wifi_connected = false, bt_hs_on = false;
3125 u32 wifi_link_status = 0;
3126 u32 num_of_wifi_link = 0;
3127 boolean bt_ctrl_agg_buf_size = false;
3128 u8 agg_buf_size = 5;
3130 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3131 "[BTCoex], ********** (wifi non connect asso_auth) **********\n");
3132 BTC_TRACE(trace_buf);
3134 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3135 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3138 num_of_wifi_link = wifi_link_status >> 16;
3140 if (num_of_wifi_link >= 2) {
3142 halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3143 halbtc8822b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3144 bt_ctrl_agg_buf_size,
3147 if (coex_sta->c2h_bt_inquiry_page) {
3148 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3149 "############# [BTCoex], BT Is Inquirying\n");
3150 BTC_TRACE(trace_buf);
3151 halbtc8822b1ant_action_bt_inquiry(btcoexist);
3153 halbtc8822b1ant_action_wifi_multi_port(
3158 if (coex_sta->c2h_bt_inquiry_page) {
3159 halbtc8822b1ant_action_bt_inquiry(btcoexist);
3161 } else if (bt_hs_on) {
3162 halbtc8822b1ant_action_hs(btcoexist);
3167 /* tdma and coex table */
3168 if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) ||
3169 (bt_link_info->a2dp_exist)) {
3171 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
3172 halbtc8822b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);
3173 } else if (bt_link_info->pan_exist) {
3174 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
3175 halbtc8822b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);
3178 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
3180 halbtc8822b1ant_set_ant_path(btcoexist,
3183 BT_8822B_1ANT_PHASE_2G_RUNTIME);
3185 halbtc8822b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2);
3189 /*""""wl connected scan"""" + bt action*/
3190 void halbtc8822b1ant_action_wifi_connected_scan(IN struct btc_coexist
3194 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3195 boolean wifi_connected = false, bt_hs_on = false;
3196 u32 wifi_link_status = 0;
3197 u32 num_of_wifi_link = 0;
3198 boolean bt_ctrl_agg_buf_size = false;
3199 u8 agg_buf_size = 5;
3201 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3202 "[BTCoex], ********** (wifi connect scan) **********\n");
3203 BTC_TRACE(trace_buf);
3205 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3206 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3209 num_of_wifi_link = wifi_link_status >> 16;
3211 if (num_of_wifi_link >= 2) {
3212 halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3213 halbtc8822b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3214 bt_ctrl_agg_buf_size, agg_buf_size);
3216 if (coex_sta->c2h_bt_inquiry_page) {
3217 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3218 "############# [BTCoex], BT Is Inquirying\n");
3219 BTC_TRACE(trace_buf);
3220 halbtc8822b1ant_action_bt_inquiry(btcoexist);
3222 halbtc8822b1ant_action_wifi_multi_port(btcoexist);
3226 if (coex_sta->c2h_bt_inquiry_page) {
3227 halbtc8822b1ant_action_bt_inquiry(btcoexist);
3229 } else if (bt_hs_on) {
3230 halbtc8822b1ant_action_hs(btcoexist);
3234 /* tdma and coex table */
3235 if (BT_8822B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
3236 if (bt_link_info->a2dp_exist) {
3237 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3239 halbtc8822b1ant_coex_table_with_type(btcoexist,
3241 } else if (bt_link_info->a2dp_exist &&
3242 bt_link_info->pan_exist) {
3243 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3245 halbtc8822b1ant_coex_table_with_type(btcoexist,
3248 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3250 halbtc8822b1ant_coex_table_with_type(btcoexist,
3253 } else if ((BT_8822B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
3254 (BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
3255 coex_dm->bt_status)) {
3256 halbtc8822b1ant_action_bt_sco_hid_only_busy(btcoexist,
3257 BT_8822B_1ANT_WIFI_STATUS_CONNECTED_SCAN);
3260 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
3262 halbtc8822b1ant_set_ant_path(btcoexist,
3265 BT_8822B_1ANT_PHASE_2G_RUNTIME);
3267 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3272 /*""""wl connected specific packet"""" + bt action*/
3273 void halbtc8822b1ant_action_wifi_connected_specific_packet(
3274 IN struct btc_coexist *btcoexist)
3277 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3278 boolean wifi_connected = false, bt_hs_on = false;
3279 u32 wifi_link_status = 0;
3280 u32 num_of_wifi_link = 0;
3281 boolean bt_ctrl_agg_buf_size = false;
3282 u8 agg_buf_size = 5;
3283 boolean wifi_busy = false;
3285 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3286 "[BTCoex], ********** (wifi connect specific packet) **********\n");
3287 BTC_TRACE(trace_buf);
3289 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3290 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3293 num_of_wifi_link = wifi_link_status >> 16;
3295 if (num_of_wifi_link >= 2) {
3296 halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3297 halbtc8822b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3298 bt_ctrl_agg_buf_size, agg_buf_size);
3300 if (coex_sta->c2h_bt_inquiry_page) {
3301 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3302 "############# [BTCoex], BT Is Inquirying\n");
3303 BTC_TRACE(trace_buf);
3304 halbtc8822b1ant_action_bt_inquiry(btcoexist);
3306 halbtc8822b1ant_action_wifi_multi_port(btcoexist);
3310 if (coex_sta->c2h_bt_inquiry_page) {
3311 halbtc8822b1ant_action_bt_inquiry(btcoexist);
3313 } else if (bt_hs_on) {
3314 halbtc8822b1ant_action_hs(btcoexist);
3319 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3321 /* no specific packet process for both WiFi and BT very busy */
3322 if ((wifi_busy) && ((bt_link_info->pan_exist) ||
3323 (coex_sta->num_of_profile >= 2)))
3326 /* tdma and coex table */
3327 if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) {
3328 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
3329 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
3330 } else if (bt_link_info->a2dp_exist) {
3331 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
3332 /*for a2dp glitch,change from 1 to 15*/
3333 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3335 } else if (bt_link_info->pan_exist) {
3336 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
3337 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3341 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
3343 halbtc8822b1ant_set_ant_path(btcoexist,
3346 BT_8822B_1ANT_PHASE_2G_RUNTIME);
3348 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3353 /*wifi connected input point : to set different ps and tdma case (+bt different case)*/
3354 void halbtc8822b1ant_action_wifi_connected(IN struct btc_coexist *btcoexist)
3357 boolean wifi_busy = false;
3358 boolean scan = false, link = false, roam = false;
3359 boolean under_4way = false, ap_enable = false, wifi_under_5g = false;
3363 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3364 "[BTCoex], CoexForWifiConnect()===>\n");
3365 BTC_TRACE(trace_buf);
3367 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3369 if (wifi_under_5g) {
3371 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3372 "[BTCoex], CoexForWifiConnect(), return for wifi is under 5g<===\n");
3373 BTC_TRACE(trace_buf);
3375 halbtc8822b1ant_action_wifi_under5g(btcoexist);
3380 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3381 "[BTCoex], CoexForWifiConnect(), return for wifi is under 2g<===\n");
3382 BTC_TRACE(trace_buf);
3384 halbtc8822b1ant_set_ant_path(btcoexist,
3387 BT_8822B_1ANT_PHASE_2G_RUNTIME);
3390 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
3394 halbtc8822b1ant_action_wifi_connected_specific_packet(
3396 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3397 "[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n");
3398 BTC_TRACE(trace_buf);
3402 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3403 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3404 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3405 if (scan || link || roam) {
3407 halbtc8822b1ant_action_wifi_connected_scan(btcoexist);
3409 halbtc8822b1ant_action_wifi_connected_specific_packet(
3411 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3412 "[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n");
3413 BTC_TRACE(trace_buf);
3417 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
3419 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3421 /* tdma and coex table */
3423 if (BT_8822B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
3424 halbtc8822b1ant_action_wifi_connected_bt_acl_busy(
3426 BT_8822B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
3427 } else if ((BT_8822B_1ANT_BT_STATUS_SCO_BUSY ==
3428 coex_dm->bt_status) ||
3429 (BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
3430 coex_dm->bt_status)) {
3431 halbtc8822b1ant_action_bt_sco_hid_only_busy(btcoexist,
3432 BT_8822B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
3435 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
3438 halbtc8822b1ant_set_ant_path(btcoexist,
3441 BT_8822B_1ANT_PHASE_2G_RUNTIME);
3443 if ((coex_sta->high_priority_tx) +
3444 (coex_sta->high_priority_rx) <= 60)
3445 /*sy modify case16 -> case17*/
3446 halbtc8822b1ant_coex_table_with_type(btcoexist,
3449 halbtc8822b1ant_coex_table_with_type(btcoexist,
3453 if (BT_8822B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
3454 halbtc8822b1ant_action_wifi_connected_bt_acl_busy(
3456 BT_8822B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
3457 } else if ((BT_8822B_1ANT_BT_STATUS_SCO_BUSY ==
3458 coex_dm->bt_status) ||
3459 (BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
3460 coex_dm->bt_status)) {
3461 halbtc8822b1ant_action_bt_sco_hid_only_busy(btcoexist,
3462 BT_8822B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
3467 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
3470 halbtc8822b1ant_set_ant_path(btcoexist,
3473 BT_8822B_1ANT_PHASE_2G_RUNTIME);
3477 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3480 halbtc8822b1ant_set_ant_path(btcoexist,
3481 BTC_ANT_PATH_AUTO, NORMAL_EXEC, BT_8822B_1ANT_PHASE_2G_RUNTIME);
3486 wifi_rssi_state = halbtc8822b1ant_wifi_rssi_state(
3487 btcoexist, 1, 2, 25, 0);
3489 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3490 "[BTCoex], ********** before **********\n");
3491 BTC_TRACE(trace_buf);
3493 if ((BT_8822B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
3494 coex_dm->bt_status) &&
3495 (coex_sta->scan_ap_num <= 3) &&
3496 (wifi_rssi_state == BTC_RSSI_STATE_LOW ||
3497 wifi_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
3499 if (BT_8822B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
3500 coex_dm->bt_status) {
3501 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3502 "[BTCoex], ********** scan ap <3 coex table=0xaaaaaaaa **********\n");
3503 BTC_TRACE(trace_buf);
3505 halbtc8822b1ant_coex_table_with_type(btcoexist,
3509 halbtc8822b1ant_coex_table_with_type(btcoexist,
3515 else if ((coex_sta->high_priority_tx +
3516 coex_sta->high_priority_rx) <= 60)
3517 halbtc8822b1ant_coex_table_with_type(btcoexist,
3520 halbtc8822b1ant_coex_table_with_type(btcoexist,
3527 void halbtc8822b1ant_run_sw_coexist_mechanism(IN struct btc_coexist *btcoexist)
3532 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3533 "[BTCoex], ********** (runswcoexmech) **********\n");
3534 BTC_TRACE(trace_buf);
3535 algorithm = halbtc8822b1ant_action_algorithm(btcoexist);
3536 coex_dm->cur_algorithm = algorithm;
3538 if (halbtc8822b1ant_is_common_action(btcoexist)) {
3541 switch (coex_dm->cur_algorithm) {
3542 case BT_8822B_1ANT_COEX_ALGO_SCO:
3543 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3544 "[BTCoex], Action algorithm = SCO.\n");
3545 BTC_TRACE(trace_buf);
3546 /* halbtc8822b1ant_action_sco(btcoexist); */
3548 case BT_8822B_1ANT_COEX_ALGO_HID:
3549 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3550 "[BTCoex], Action algorithm = HID.\n");
3551 BTC_TRACE(trace_buf);
3552 /* halbtc8822b1ant_action_hid(btcoexist); */
3554 case BT_8822B_1ANT_COEX_ALGO_A2DP:
3555 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3556 "[BTCoex], Action algorithm = A2DP.\n");
3557 BTC_TRACE(trace_buf);
3558 /* halbtc8822b1ant_action_a2dp(btcoexist); */
3560 case BT_8822B_1ANT_COEX_ALGO_A2DP_PANHS:
3561 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3562 "[BTCoex], Action algorithm = A2DP+PAN(HS).\n");
3563 BTC_TRACE(trace_buf);
3564 /* halbtc8822b1ant_action_a2dp_pan_hs(btcoexist); */
3566 case BT_8822B_1ANT_COEX_ALGO_PANEDR:
3567 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3568 "[BTCoex], Action algorithm = PAN(EDR).\n");
3569 BTC_TRACE(trace_buf);
3570 /* halbtc8822b1ant_action_pan_edr(btcoexist); */
3572 case BT_8822B_1ANT_COEX_ALGO_PANHS:
3573 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3574 "[BTCoex], Action algorithm = HS mode.\n");
3575 BTC_TRACE(trace_buf);
3576 /* halbtc8822b1ant_action_pan_hs(btcoexist); */
3578 case BT_8822B_1ANT_COEX_ALGO_PANEDR_A2DP:
3579 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3580 "[BTCoex], Action algorithm = PAN+A2DP.\n");
3581 BTC_TRACE(trace_buf);
3582 /* halbtc8822b1ant_action_pan_edr_a2dp(btcoexist); */
3584 case BT_8822B_1ANT_COEX_ALGO_PANEDR_HID:
3585 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3586 "[BTCoex], Action algorithm = PAN(EDR)+HID.\n");
3587 BTC_TRACE(trace_buf);
3588 /* halbtc8822b1ant_action_pan_edr_hid(btcoexist); */
3590 case BT_8822B_1ANT_COEX_ALGO_HID_A2DP_PANEDR:
3591 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3592 "[BTCoex], Action algorithm = HID+A2DP+PAN.\n");
3593 BTC_TRACE(trace_buf);
3594 /* halbtc8822b1ant_action_hid_a2dp_pan_edr(btcoexist); */
3596 case BT_8822B_1ANT_COEX_ALGO_HID_A2DP:
3597 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3598 "[BTCoex], Action algorithm = HID+A2DP.\n");
3599 BTC_TRACE(trace_buf);
3600 /* halbtc8822b1ant_action_hid_a2dp(btcoexist); */
3603 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3604 "[BTCoex], Action algorithm = coexist All Off!!\n");
3605 BTC_TRACE(trace_buf);
3606 /* halbtc8822b1ant_coex_all_off(btcoexist); */
3609 coex_dm->pre_algorithm = coex_dm->cur_algorithm;
3613 void halbtc8822b1ant_run_coexist_mechanism(IN struct btc_coexist *btcoexist)
3616 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3617 boolean wifi_connected = false, bt_hs_on = false;
3618 boolean increase_scan_dev_num = false;
3619 boolean bt_ctrl_agg_buf_size = false;
3620 boolean miracast_plus_bt = false;
3621 u8 agg_buf_size = 5;
3622 u32 wifi_link_status = 0;
3623 u32 num_of_wifi_link = 0, wifi_bw;
3624 u8 iot_peer = BTC_IOT_PEER_UNKNOWN;
3625 boolean wifi_under_5g = false;
3628 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3629 "[BTCoex], RunCoexistMechanism()===>\n");
3630 BTC_TRACE(trace_buf);
3632 if (btcoexist->manual_control) {
3633 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3634 "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
3635 BTC_TRACE(trace_buf);
3639 if (btcoexist->stop_coex_dm) {
3640 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3641 "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");
3642 BTC_TRACE(trace_buf);
3646 if (coex_sta->under_ips) {
3647 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3648 "[BTCoex], wifi is under IPS !!!\n");
3649 BTC_TRACE(trace_buf);
3653 if (!coex_sta->run_time_state) {
3654 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3655 "[BTCoex], return for run_time_state = false !!!\n");
3656 BTC_TRACE(trace_buf);
3660 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3661 if (wifi_under_5g) {
3662 halbtc8822b1ant_action_wifi_under5g(btcoexist);
3664 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3665 "[BTCoex], WiFi is under 5G!!!\n");
3666 BTC_TRACE(trace_buf);
3670 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3671 "[BTCoex], WiFi is under 2G!!!\n");
3672 BTC_TRACE(trace_buf);
3674 halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3676 BT_8822B_1ANT_PHASE_2G_RUNTIME);
3678 if (coex_sta->bt_whck_test) {
3679 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3680 "[BTCoex], BT is under WHCK TEST!!!\n");
3681 BTC_TRACE(trace_buf);
3682 halbtc8822b1ant_action_bt_whck_test(btcoexist);
3686 if (coex_sta->bt_disabled) {
3687 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3688 "[BTCoex], BT is disabled !!!\n");
3689 halbtc8822b1ant_action_wifi_only(btcoexist);
3693 if ((BT_8822B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
3694 (BT_8822B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
3695 (BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
3696 increase_scan_dev_num = true;
3698 btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM,
3699 &increase_scan_dev_num);
3700 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3703 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3705 num_of_wifi_link = wifi_link_status >> 16;
3707 if ((num_of_wifi_link >= 2) ||
3708 (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {
3709 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3710 "############# [BTCoex], Multi-Port num_of_wifi_link = %d, wifi_link_status = 0x%x\n",
3711 num_of_wifi_link, wifi_link_status);
3712 BTC_TRACE(trace_buf);
3714 if (bt_link_info->bt_link_exist) {
3715 halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1,
3717 miracast_plus_bt = true;
3719 halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0,
3721 miracast_plus_bt = false;
3723 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3725 halbtc8822b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3726 bt_ctrl_agg_buf_size, agg_buf_size);
3728 if ((bt_link_info->a2dp_exist) &&
3729 (coex_sta->c2h_bt_inquiry_page)) {
3730 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3731 "############# [BTCoex], BT Is Inquirying\n");
3732 BTC_TRACE(trace_buf);
3733 halbtc8822b1ant_action_bt_inquiry(btcoexist);
3735 halbtc8822b1ant_action_wifi_multi_port(btcoexist);
3740 miracast_plus_bt = false;
3741 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3744 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3746 if ((bt_link_info->bt_link_exist) && (wifi_connected)) {
3747 halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1, 0, 1);
3749 btcoexist->btc_get(btcoexist, BTC_GET_U1_IOT_PEER, &iot_peer);
3751 if (BTC_IOT_PEER_CISCO != iot_peer) {
3752 if (bt_link_info->sco_exist) /* if (bt_link_info->bt_hi_pri_link_exist) */
3753 halbtc8822b1ant_limited_rx(btcoexist,
3754 NORMAL_EXEC, true, false, 0x5);
3756 halbtc8822b1ant_limited_rx(btcoexist,
3757 NORMAL_EXEC, false, false, 0x5);
3759 if (bt_link_info->sco_exist)
3760 halbtc8822b1ant_limited_rx(btcoexist,
3761 NORMAL_EXEC, true, false, 0x5);
3763 if (BTC_WIFI_BW_HT40 == wifi_bw)
3764 halbtc8822b1ant_limited_rx(btcoexist,
3765 NORMAL_EXEC, false, true, 0x10);
3767 halbtc8822b1ant_limited_rx(btcoexist,
3768 NORMAL_EXEC, false, true, 0x8);
3772 halbtc8822b1ant_sw_mechanism(btcoexist, true);
3773 halbtc8822b1ant_run_sw_coexist_mechanism(
3774 btcoexist); /* just print debug message */
3776 halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3778 halbtc8822b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
3781 halbtc8822b1ant_sw_mechanism(btcoexist, false);
3782 halbtc8822b1ant_run_sw_coexist_mechanism(
3783 btcoexist); /* just print debug message */
3786 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3787 if (coex_sta->c2h_bt_inquiry_page) {
3788 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3789 "############# [BTCoex], BT Is Inquirying\n");
3790 BTC_TRACE(trace_buf);
3791 halbtc8822b1ant_action_bt_inquiry(btcoexist);
3793 } else if (bt_hs_on) {
3794 halbtc8822b1ant_action_hs(btcoexist);
3799 if (!wifi_connected) {
3800 boolean scan = false, link = false, roam = false;
3802 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3803 "[BTCoex], wifi is non connected-idle !!!\n");
3804 BTC_TRACE(trace_buf);
3806 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3807 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3808 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3810 if (scan || link || roam) {
3812 halbtc8822b1ant_action_wifi_not_connected_scan(
3815 halbtc8822b1ant_action_wifi_not_connected_asso_auth(
3818 halbtc8822b1ant_action_wifi_not_connected(btcoexist);
3819 } else /* wifi LPS/Busy */
3820 halbtc8822b1ant_action_wifi_connected(btcoexist);
3823 u32 halbtc8822b1ant_psd_log2base(IN struct btc_coexist *btcoexist, IN u32 val)
3826 u32 tmp, tmp2, val_integerd_b = 0, tindex, shiftcount = 0;
3827 u32 result, val_fractiond_b = 0, table_fraction[21] = {0, 432, 332, 274, 232, 200,
3828 174, 151, 132, 115, 100, 86, 74, 62, 51, 42,
3846 val_integerd_b = shiftcount + 1;
3849 for (j = 1; j <= val_integerd_b; j++)
3852 tmp = (val * 100) / tmp2;
3858 val_fractiond_b = table_fraction[tindex];
3860 result = val_integerd_b * 100 - val_fractiond_b;
3867 void halbtc8822b1ant_init_coex_dm(IN struct btc_coexist *btcoexist)
3869 /* force to reset coex mechanism */
3871 halbtc8822b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, false);
3874 halbtc8822b1ant_sw_mechanism(btcoexist, false);
3876 /* halbtc8822b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8); */
3877 /* halbtc8822b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0); */
3879 coex_sta->pop_event_cnt = 0;
3882 void halbtc8822b1ant_init_hw_config(IN struct btc_coexist *btcoexist,
3883 IN boolean back_up, IN boolean wifi_only)
3887 boolean wifi_under_5g = false;
3888 u32 u32tmp1 = 0, u32tmp2 = 0, u32tmp3 = 0;
3891 u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
3892 u32tmp1 = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
3893 u32tmp2 = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x54);
3895 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3896 "[BTCoex], ********** (Before Init HW config) 0xcb4 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n",
3897 u32tmp3, u32tmp1, u32tmp2);
3898 BTC_TRACE(trace_buf);
3900 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3901 "[BTCoex], 1Ant Init HW Config!!\n");
3902 BTC_TRACE(trace_buf);
3904 coex_sta->bt_coex_supported_feature = 0;
3905 coex_sta->bt_coex_supported_version = 0;
3907 /* Setup RF front end type */
3908 halbtc8822b1ant_set_rfe_type(btcoexist);
3910 /* 0xf0[15:12] --> Chip Cut information */
3911 coex_sta->cut_version = (btcoexist->btc_read_1byte(btcoexist,
3914 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8,
3915 0x1); /* enable TBTT nterrupt */
3917 /* BT report packet sample rate */
3918 /* 0x790[5:0]=0x5 */
3919 u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
3922 btcoexist->btc_write_1byte(btcoexist, 0x790, u8tmp);
3924 /* Enable BT counter statistics */
3925 btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1);
3927 /* Enable PTA (3-wire function form BT side) */
3928 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
3929 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x41, 0x02, 0x1);
3931 /* Enable PTA (tx/rx signal form WiFi side) */
3932 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4c6, 0x10, 0x1);
3933 /*GNT_BT=1 while select both */
3934 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x763, 0x10, 0x1);
3936 /* enable GNT_WL/GNT_BT debug signal to GPIO14/15 */
3937 /*btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x8, 0x1);*/
3940 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e, 0x40, 0x0);
3941 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x1, 0x0);
3943 if (btcoexist->btc_read_1byte(btcoexist, 0x80) == 0xc6)
3944 halbtc8822b1ant_post_state_to_bt(btcoexist,
3945 BT_8822B_1ANT_SCOREBOARD_ONOFF, true);
3947 /* Antenna config */
3950 coex_sta->concurrent_rx_mode_on = false;
3951 halbtc8822b1ant_set_ant_path(btcoexist,
3954 BT_8822B_1ANT_PHASE_WLANONLY_INIT);
3957 coex_sta->concurrent_rx_mode_on = true;
3959 halbtc8822b1ant_set_ant_path(btcoexist,
3962 BT_8822B_1ANT_PHASE_COEX_INIT);
3967 halbtc8822b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
3969 halbtc8822b1ant_enable_gnt_to_gpio(btcoexist, true);
3974 void halbtc8822b1ant_init_hw_config_without_bt(IN struct btc_coexist *btcoexist,
3975 IN boolean back_up, IN boolean wifi_only)
3979 boolean wifi_under_5g = false;
3980 u32 u32tmp1 = 0, u32tmp2 = 0, u32tmp3 = 0;
3983 /* 0xf0[15:12] --> Chip Cut information */
3984 coex_sta->cut_version = (btcoexist->btc_read_1byte(btcoexist,
3987 /* enable TBTT interrupt */
3988 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8,
3992 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e, 0x40, 0x0);
3993 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x1, 0x0);
3995 /* Antenna config */
3996 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e, 0x80,
3997 0x0); /* 0x4c[23] = 0 */
3998 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f, 0x01,
3999 0x1); /* 0x4c[24] = 1 */
4000 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb4, 0xff,
4001 0x77); /* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as conctrol pin */
4004 /* Ext switch buffer mux */
4005 btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
4006 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991, 0x3, 0x0);
4007 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe, 0x8, 0x0);
4009 /*enable sw control gnt_wl=1 / gnt_bt=1 */
4010 btcoexist->btc_write_1byte(btcoexist, 0x73, 0x0e);
4012 btcoexist->btc_write_4byte(btcoexist, 0x1704, 0x0000ff00);
4014 btcoexist->btc_write_4byte(btcoexist, 0x1700, 0xc00f0038);
4017 /* ant switch WL2G or WL5G*/
4018 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G,
4022 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
4027 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
4032 void halbtc8822b1ant_psd_showdata(IN struct btc_coexist *btcoexist)
4034 u8 *cli_buf = btcoexist->cli_buf;
4035 u32 delta_freq_per_point;
4036 u32 freq, freq1, freq2, n = 0, i = 0, j = 0, m = 0, psd_rep1, psd_rep2;
4038 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4039 "\r\n\n============[PSD info] (%d)============\n",
4040 psd_scan->psd_gen_count);
4043 if (psd_scan->psd_gen_count == 0) {
4044 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n No data !!\n");
4049 if (psd_scan->psd_point == 0)
4050 delta_freq_per_point = 0;
4052 delta_freq_per_point = psd_scan->psd_band_width /
4053 psd_scan->psd_point;
4055 /* if (psd_scan->is_psd_show_max_only) */
4057 psd_rep1 = psd_scan->psd_max_value / 100;
4058 psd_rep2 = psd_scan->psd_max_value - psd_rep1 * 100;
4060 freq = ((psd_scan->real_cent_freq - 20) * 1000000 +
4061 psd_scan->psd_max_value_point * delta_freq_per_point);
4062 freq1 = freq / 1000000;
4063 freq2 = freq / 1000 - freq1 * 1000;
4066 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4067 "\r\n Freq = %d.0%d MHz",
4070 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4071 "\r\n Freq = %d.%d MHz",
4075 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4076 ", Value = %d.0%d dB, (%d)\n",
4077 psd_rep1, psd_rep2, psd_scan->psd_max_value);
4079 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4080 ", Value = %d.%d dB, (%d)\n",
4081 psd_rep1, psd_rep2, psd_scan->psd_max_value);
4085 m = psd_scan->psd_start_point;
4086 n = psd_scan->psd_start_point;
4092 freq = ((psd_scan->real_cent_freq - 20) *
4094 delta_freq_per_point);
4095 freq1 = freq / 1000000;
4096 freq2 = freq / 1000 - freq1 * 1000;
4104 else if (freq2 < 100)
4107 "\r\n Freq%6d.0%2d",
4116 } else if ((i % 8 == 0) ||
4117 (m == psd_scan->psd_stop_point)) {
4121 "%6d.000\n", freq1);
4122 else if (freq2 < 100)
4125 "%6d.0%2d\n", freq1,
4137 else if (freq2 < 100)
4153 } while ((i <= 8) && (m <= psd_scan->psd_stop_point));
4157 psd_rep1 = psd_scan->psd_report_max_hold[n] /
4159 psd_rep2 = psd_scan->psd_report_max_hold[n] -
4176 } else if ((j % 8 == 0) ||
4177 (n == psd_scan->psd_stop_point)) {
4181 "%7d.0%d\n", psd_rep1,
4186 "%7d.%d\n", psd_rep1,
4192 "%7d.0%d", psd_rep1,
4205 } while ((j <= 8) && (n <= psd_scan->psd_stop_point));
4207 if ((m > psd_scan->psd_stop_point) ||
4208 (n > psd_scan->psd_stop_point))
4220 void halbtc8822b1ant_psd_max_holddata(IN struct btc_coexist *btcoexist,
4223 u32 i = 0, i_max = 0, val_max = 0;
4225 if (gen_count == 1) {
4226 memcpy(psd_scan->psd_report_max_hold,
4227 psd_scan->psd_report,
4228 BT_8822B_1ANT_ANTDET_PSD_POINTS * sizeof(u32));
4230 for (i = psd_scan->psd_start_point;
4231 i <= psd_scan->psd_stop_point; i++) {
4235 psd_scan->psd_max_value_point = 0;
4236 psd_scan->psd_max_value = 0;
4239 for (i = psd_scan->psd_start_point;
4240 i <= psd_scan->psd_stop_point; i++) {
4241 if (psd_scan->psd_report[i] >
4242 psd_scan->psd_report_max_hold[i])
4243 psd_scan->psd_report_max_hold[i] =
4244 psd_scan->psd_report[i];
4246 /* search Max Value */
4247 if (i == psd_scan->psd_start_point) {
4249 val_max = psd_scan->psd_report_max_hold[i];
4251 if (psd_scan->psd_report_max_hold[i] >
4254 val_max = psd_scan->psd_report_max_hold[i];
4262 psd_scan->psd_max_value_point = i_max;
4263 psd_scan->psd_max_value = val_max;
4270 u32 halbtc8822b1ant_psd_getdata(IN struct btc_coexist *btcoexist, IN u32 point)
4272 /* reg 0x808[9:0]: FFT data x */
4273 /* reg 0x808[22]: 0-->1 to get 1 FFT data y */
4274 /* reg 0x8b4[15:0]: FFT data y report */
4276 u32 val = 0, psd_report = 0;
4278 val = btcoexist->btc_read_4byte(btcoexist, 0x808);
4283 btcoexist->btc_write_4byte(btcoexist, 0x808, val);
4286 btcoexist->btc_write_4byte(btcoexist, 0x808, val);
4289 val = btcoexist->btc_read_4byte(btcoexist, 0x8b4);
4291 psd_report = val & 0x0000ffff;
4297 void halbtc8822b1ant_psd_sweep_point(IN struct btc_coexist *btcoexist,
4298 IN u32 cent_freq, IN s32 offset, IN u32 span, IN u32 points,
4301 u32 i, val, n, k = 0;
4302 u32 points1 = 0, psd_report = 0;
4303 u32 start_p = 0, stop_p = 0, delta_freq_per_point = 156250;
4304 u32 psd_center_freq = 20 * 10 ^ 6, freq, freq1, freq2;
4305 boolean outloop = false;
4307 u32 tmp, psd_rep1, psd_rep2;
4308 u32 wifi_original_channel = 1;
4310 psd_scan->is_psd_running = true;
4314 case 0: /* Get PSD parameters */
4317 psd_scan->psd_band_width = 40 * 1000000;
4318 psd_scan->psd_point = points;
4319 psd_scan->psd_start_base = points / 2;
4320 psd_scan->psd_avg_num = avgnum;
4321 psd_scan->real_cent_freq = cent_freq;
4322 psd_scan->real_offset = offset;
4323 psd_scan->real_span = span;
4326 points1 = psd_scan->psd_point;
4327 delta_freq_per_point = psd_scan->psd_band_width /
4328 psd_scan->psd_point;
4330 /* PSD point setup */
4331 val = btcoexist->btc_read_4byte(btcoexist, 0x808);
4334 switch (psd_scan->psd_point) {
4350 switch (psd_scan->psd_avg_num) {
4365 btcoexist->btc_write_4byte(btcoexist, 0x808, val);
4369 case 1: /* calculate the PSD point index from freq/offset/span */
4370 psd_center_freq = psd_scan->psd_band_width / 2 +
4373 start_p = psd_scan->psd_start_base + (psd_center_freq -
4374 span * (1000000) / 2) / delta_freq_per_point;
4375 psd_scan->psd_start_point = start_p -
4376 psd_scan->psd_start_base;
4378 stop_p = psd_scan->psd_start_base + (psd_center_freq +
4379 span * (1000000) / 2) / delta_freq_per_point;
4380 psd_scan->psd_stop_point = stop_p -
4381 psd_scan->psd_start_base - 1;
4385 case 2: /* set RF channel/BW/Mode */
4387 /* set 3-wire off */
4388 val = btcoexist->btc_read_4byte(btcoexist, 0x88c);
4390 btcoexist->btc_write_4byte(btcoexist, 0x88c, val);
4393 val = btcoexist->btc_read_4byte(btcoexist, 0x800);
4395 btcoexist->btc_write_4byte(btcoexist, 0x800, val);
4397 /* store WiFi original channel */
4398 wifi_original_channel = btcoexist->btc_get_rf_reg(
4399 btcoexist, BTC_RF_A, 0x18, 0x3ff);
4401 /* Set RF channel */
4402 if (cent_freq == 2484)
4403 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A,
4406 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A,
4407 0x18, 0x3ff, (cent_freq - 2412) / 5 +
4408 1); /* WiFi TRx Mask on */
4410 /* Set RF mode = Rx, RF Gain = 0x8a0 */
4411 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x0,
4414 /* Set RF Rx filter corner */
4415 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
4418 /* Set TRx mask off */
4419 /* un-lock TRx Mask setup */
4420 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdd,
4422 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdf,
4425 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
4431 memset(psd_scan->psd_report, 0,
4432 psd_scan->psd_point * sizeof(u32));
4433 start_p = psd_scan->psd_start_point +
4434 psd_scan->psd_start_base;
4435 stop_p = psd_scan->psd_stop_point +
4436 psd_scan->psd_start_base + 1;
4440 while (i < stop_p) {
4443 halbtc8822b1ant_psd_getdata(
4444 btcoexist, i - points1);
4447 halbtc8822b1ant_psd_getdata(
4450 if (psd_report == 0)
4453 /* tmp = 20*log10((double)psd_report); */
4454 /* 20*log2(x)/log2(10), log2Base return theresult of the psd_report*100 */
4455 tmp = 6 * halbtc8822b1ant_psd_log2base(
4456 btcoexist, psd_report);
4458 n = i - psd_scan->psd_start_base;
4459 psd_scan->psd_report[n] = tmp;
4460 psd_rep1 = psd_scan->psd_report[n] / 100;
4461 psd_rep2 = psd_scan->psd_report[n] - psd_rep1 *
4464 freq = ((cent_freq - 20) * 1000000 + n *
4465 delta_freq_per_point);
4466 freq1 = freq / 1000000;
4467 freq2 = freq / 1000 - freq1 * 1000;
4473 /* Add Delay between PSD point */
4483 case 99: /* error */
4487 case 100: /* recovery */
4490 val = btcoexist->btc_read_4byte(btcoexist, 0x88c);
4492 btcoexist->btc_write_4byte(btcoexist, 0x88c, val);
4495 val = btcoexist->btc_read_4byte(btcoexist, 0x800);
4497 btcoexist->btc_write_4byte(btcoexist, 0x800, val);
4500 val = btcoexist->btc_read_4byte(btcoexist, 0x808);
4502 btcoexist->btc_write_4byte(btcoexist, 0x808, val);
4505 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
4508 /* lock TRx Mask setup */
4509 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdd,
4511 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdf,
4514 /* Set RF Rx filter corner */
4515 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
4518 /* restore WiFi original channel */
4519 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x18,
4520 0x3ff, wifi_original_channel);
4531 psd_scan->is_psd_running = false;
4536 #if (BTC_COEX_OFFLOAD == 1)
4537 void halbtc8822b1ant_wifi_info_notify(IN struct btc_coexist *btcoexist)
4539 u8 h2c_para[4] = {0};
4543 boolean wifi_busy = false;
4545 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
4546 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
4547 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
4549 h2c_para[0] = ap_num; /* AP number */
4550 h2c_para[1] = (u8)wifi_busy; /* Busy */
4551 h2c_para[2] = (u8)wifi_rssi; /* RSSI */
4553 btcoexist->btc_coex_h2c_process(btcoexist, COL_OP_WIFI_INFO_NOTIFY,
4554 opcode_ver, &h2c_para[0], 3);
4557 void halbtc8822b1ant_setManual(IN struct btc_coexist *btcoexist,
4560 u8 h2c_para[4] = {0};
4569 h2c_para[0] = set_type; /* set_type */
4571 btcoexist->btc_coex_h2c_process(btcoexist, COL_OP_SET_CONTROL,
4576 /* ************************************************************
4577 * work around function start with wa_halbtc8822b1ant_
4578 * ************************************************************
4579 * ************************************************************
4580 * extern function start with ex_halbtc8822b1ant_
4581 * ************************************************************ */
4583 void ex_halbtc8822b1ant_power_on_setting(IN struct btc_coexist *btcoexist)
4585 void ex_halbtc8822b1ant_pre_load_firmware(IN struct btc_coexist *btcoexist)
4587 void ex_halbtc8822b1ant_init_hw_config(IN struct btc_coexist *btcoexist,
4588 IN boolean wifi_only)
4590 void ex_halbtc8822b1ant_init_coex_dm(IN struct btc_coexist *btcoexist)
4592 void ex_halbtc8822b1ant_ips_notify(IN struct btc_coexist *btcoexist, IN u8 type)
4594 u8 h2c_para[4] = {0};
4598 if (BTC_IPS_ENTER == type) {
4599 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4600 "[BTCoex], IPS ENTER notify\n");
4601 BTC_TRACE(trace_buf);
4603 } else if (BTC_IPS_LEAVE == type) {
4604 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4605 "[BTCoex], IPS LEAVE notify\n");
4606 BTC_TRACE(trace_buf);
4609 h2c_para[0] = ips_notify; /* IPS notify */
4610 h2c_para[1] = 0xff; /* LPS notify */
4611 h2c_para[2] = 0xff; /* RF state notify */
4612 h2c_para[3] = 0xff; /* pnp notify */
4614 btcoexist->btc_coex_h2c_process(btcoexist,
4615 COL_OP_WIFI_POWER_STATE_NOTIFY,
4616 opcode_ver, &h2c_para[0], 4);
4618 void ex_halbtc8822b1ant_lps_notify(IN struct btc_coexist *btcoexist, IN u8 type)
4620 u8 h2c_para[4] = {0};
4624 if (BTC_LPS_ENABLE == type) {
4625 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4626 "[BTCoex], LPS ENABLE notify\n");
4627 BTC_TRACE(trace_buf);
4629 } else if (BTC_LPS_DISABLE == type) {
4630 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4631 "[BTCoex], LPS DISABLE notify\n");
4632 BTC_TRACE(trace_buf);
4635 h2c_para[0] = 0xff; /* IPS notify */
4636 h2c_para[1] = lps_notify; /* LPS notify */
4637 h2c_para[2] = 0xff; /* RF state notify */
4638 h2c_para[3] = 0xff; /* pnp notify */
4640 btcoexist->btc_coex_h2c_process(btcoexist,
4641 COL_OP_WIFI_POWER_STATE_NOTIFY,
4642 opcode_ver, &h2c_para[0], 4);
4645 void ex_halbtc8822b1ant_scan_notify(IN struct btc_coexist *btcoexist,
4648 u8 h2c_para[4] = {0};
4651 boolean under_4way = false;
4653 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
4655 if (BTC_SCAN_START == type) {
4656 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4657 "[BTCoex], SCAN START notify\n");
4658 BTC_TRACE(trace_buf);
4661 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4662 "[BTCoex], SCAN FINISH notify\n");
4663 BTC_TRACE(trace_buf);
4666 h2c_para[0] = scan_start; /* scan notify */
4667 h2c_para[1] = 0xff; /* connect notify */
4668 h2c_para[2] = 0xff; /* specific packet notify */
4670 h2c_para[3] = 1; /* under 4way progress */
4674 btcoexist->btc_coex_h2c_process(btcoexist, COL_OP_WIFI_PROGRESS_NOTIFY,
4675 opcode_ver, &h2c_para[0], 4);
4678 void ex_halbtc8822b1ant_connect_notify(IN struct btc_coexist *btcoexist,
4681 u8 h2c_para[4] = {0};
4683 u8 connect_start = 0;
4684 boolean under_4way = false;
4686 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
4688 if (BTC_ASSOCIATE_START == type) {
4689 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4690 "[BTCoex], CONNECT START notify\n");
4691 BTC_TRACE(trace_buf);
4694 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4695 "[BTCoex], CONNECT FINISH notify\n");
4696 BTC_TRACE(trace_buf);
4699 h2c_para[0] = 0xff; /* scan notify */
4700 h2c_para[1] = connect_start; /* connect notify */
4701 h2c_para[2] = 0xff; /* specific packet notify */
4703 h2c_para[3] = 1; /* under 4way progress */
4707 btcoexist->btc_coex_h2c_process(btcoexist, COL_OP_WIFI_PROGRESS_NOTIFY,
4708 opcode_ver, &h2c_para[0], 4);
4711 void ex_halbtc8822b1ant_media_status_notify(IN struct btc_coexist *btcoexist,
4715 u8 wifi_central_chnl;
4716 u8 h2c_para[5] = {0};
4718 u8 port = 0, connected = 0, freq = 0, bandwidth = 0, iot_peer = 0;
4719 boolean wifi_under_5g = false;
4721 if (BTC_MEDIA_CONNECT == type)
4724 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
4725 bandwidth = (u8)wifi_bw;
4726 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
4731 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
4732 &wifi_central_chnl);
4733 btcoexist->btc_get(btcoexist, BTC_GET_U1_IOT_PEER, &iot_peer);
4735 h2c_para[0] = (connected << 4) |
4736 port; /* port need to be implemented in the future (p2p port, ...) */
4737 h2c_para[1] = (freq << 4) | bandwidth;
4738 h2c_para[2] = wifi_central_chnl;
4739 h2c_para[3] = iot_peer;
4740 btcoexist->btc_coex_h2c_process(btcoexist, COL_OP_WIFI_STATUS_NOTIFY,
4741 opcode_ver, &h2c_para[0], 4);
4744 void ex_halbtc8822b1ant_specific_packet_notify(IN struct btc_coexist *btcoexist,
4747 u8 h2c_para[4] = {0};
4749 u8 connect_start = 0;
4750 boolean under_4way = false;
4752 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
4755 h2c_para[0] = 0xff; /* scan notify */
4756 h2c_para[1] = 0xff; /* connect notify */
4757 h2c_para[2] = type; /* specific packet notify */
4759 h2c_para[3] = 1; /* under 4way progress */
4763 btcoexist->btc_coex_h2c_process(btcoexist, COL_OP_WIFI_PROGRESS_NOTIFY,
4764 opcode_ver, &h2c_para[0], 4);
4767 void ex_halbtc8822b1ant_bt_info_notify(IN struct btc_coexist *btcoexist,
4768 IN u8 *tmp_buf, IN u8 length)
4770 void ex_halbtc8822b1ant_rf_status_notify(IN struct btc_coexist *btcoexist,
4773 u8 h2c_para[4] = {0};
4775 u8 rfstate_notify = 0;
4777 if (BTC_RF_ON == type) {
4778 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4779 "[BTCoex], RF is turned ON!!\n");
4780 BTC_TRACE(trace_buf);
4782 } else if (BTC_RF_OFF == type) {
4783 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4784 "[BTCoex], RF is turned OFF!!\n");
4785 BTC_TRACE(trace_buf);
4788 h2c_para[0] = 0xff; /* IPS notify */
4789 h2c_para[1] = 0xff; /* LPS notify */
4790 h2c_para[2] = rfstate_notify; /* RF state notify */
4791 h2c_para[3] = 0xff; /* pnp notify */
4793 btcoexist->btc_coex_h2c_process(btcoexist,
4794 COL_OP_WIFI_POWER_STATE_NOTIFY,
4795 opcode_ver, &h2c_para[0], 4);
4798 void ex_halbtc8822b1ant_halt_notify(IN struct btc_coexist *btcoexist)
4800 void ex_halbtc8822b1ant_pnp_notify(IN struct btc_coexist *btcoexist,
4803 u8 h2c_para[4] = {0};
4807 if (BTC_WIFI_PNP_SLEEP == pnp_state) {
4808 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4809 "[BTCoex], Pnp notify to SLEEP\n");
4810 BTC_TRACE(trace_buf);
4812 } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
4813 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4814 "[BTCoex], Pnp notify to WAKE UP\n");
4815 BTC_TRACE(trace_buf);
4818 h2c_para[0] = 0xff; /* IPS notify */
4819 h2c_para[1] = 0xff; /* LPS notify */
4820 h2c_para[2] = 0xff; /* RF state notify */
4821 h2c_para[3] = pnp_notify; /* pnp notify */
4823 btcoexist->btc_coex_h2c_process(btcoexist,
4824 COL_OP_WIFI_POWER_STATE_NOTIFY,
4825 opcode_ver, &h2c_para[0], 4);
4828 void ex_halbtc8822b1ant_coex_dm_reset(IN struct btc_coexist *btcoexist)
4830 void ex_halbtc8822b1ant_periodical(IN struct btc_coexist *btcoexist)
4833 halbtc8822b1ant_wifi_info_notify(btcoexist);
4836 void ex_halbtc8822b1ant_display_coex_info(IN struct btc_coexist *btcoexist)
4838 struct btc_board_info *board_info = &btcoexist->board_info;
4839 struct btc_stack_info *stack_info = &btcoexist->stack_info;
4840 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
4841 u8 *cli_buf = btcoexist->cli_buf;
4842 u8 u8tmp[4], i, bt_info_ext, ps_tdma_case = 0;
4845 u32 fa_ofdm, fa_cck, cca_ofdm, cca_cck;
4846 u32 fw_ver = 0, bt_patch_ver = 0, bt_coex_ver = 0;
4847 static u8 pop_report_in_10s = 0;
4849 boolean lte_coex_on = false;
4851 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4852 "\r\n ============[BT Coexist info]============");
4855 if (btcoexist->manual_control) {
4856 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4857 "\r\n ============[Under Manual Control]============");
4859 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4860 "\r\n ==========================================");
4863 if (btcoexist->stop_coex_dm) {
4864 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4865 "\r\n ============[Coex is STOPPED]============");
4867 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4868 "\r\n ==========================================");
4872 if (psd_scan->ant_det_try_count == 0) {
4873 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4874 "\r\n %-35s = %d/ %d/ %s / %d",
4875 "Ant PG Num/ Mech/ Pos/ RFE",
4876 board_info->pg_ant_num, board_info->btdm_ant_num,
4877 (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT
4879 rfe_type->rfe_module_type);
4882 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4883 "\r\n %-35s = %d/ %d/ %s/ %d (%d/%d/%d)",
4884 "Ant PG Num/ Mech(Ant_Det)/ Pos/ RFE",
4885 board_info->pg_ant_num,
4886 board_info->btdm_ant_num_by_ant_det,
4887 (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT
4889 rfe_type->rfe_module_type,
4890 psd_scan->ant_det_try_count,
4891 psd_scan->ant_det_fail_count,
4892 psd_scan->ant_det_result);
4895 if (board_info->btdm_ant_det_finish) {
4896 if (psd_scan->ant_det_result != 12)
4897 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s",
4898 "Ant Det PSD Value",
4899 psd_scan->ant_det_peak_val);
4901 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4903 "Ant Det PSD Value",
4904 psd_scan->ant_det_psd_scan_peak_val / 100);
4910 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
4911 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
4912 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4913 "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
4914 "CoexVer/ FwVer/ PatchVer",
4915 glcoex_ver_date_8822b_1ant, glcoex_ver_8822b_1ant, fw_ver,
4916 bt_patch_ver, bt_patch_ver);
4919 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ",
4920 "Wifi channel informed to BT",
4921 coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1],
4922 coex_dm->wifi_chnl_info[2]);
4924 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s",
4925 "WifibHiPri/ Ccklock/ CckEverLock",
4926 (coex_sta->wifi_is_high_pri_task ? "Yes" : "No"),
4927 (coex_sta->cck_lock ? "Yes" : "No"),
4928 (coex_sta->cck_ever_lock ? "Yes" : "No"));
4932 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4933 "============[Wifi Status]============");
4935 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_WIFI_STATUS);
4937 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4938 "============[BT Status]============");
4941 pop_report_in_10s++;
4942 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d/ %d] ",
4943 "BT [status/ rssi/ retryCnt/ popCnt]",
4944 ((coex_sta->bt_disabled) ? ("disabled") : ((
4945 coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan")
4946 : ((BT_8822B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
4947 coex_dm->bt_status) ? "non-connected idle" :
4948 ((BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)
4949 ? "connected-idle" : "busy")))),
4950 coex_sta->bt_rssi - 100, coex_sta->bt_retry_cnt,
4951 coex_sta->pop_event_cnt);
4954 if (pop_report_in_10s >= 5) {
4955 coex_sta->pop_event_cnt = 0;
4956 pop_report_in_10s = 0;
4959 if (coex_sta->num_of_profile != 0)
4960 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4961 "\r\n %-35s = %s%s%s%s%s",
4963 ((bt_link_info->a2dp_exist) ? "A2DP," : ""),
4964 ((bt_link_info->sco_exist) ? "SCO," : ""),
4965 ((bt_link_info->hid_exist) ?
4966 ((coex_sta->hid_busy_num >= 2) ? "HID(4/18)," : "HID(2/18),") : ""),
4967 ((bt_link_info->pan_exist) ? "PAN," : ""),
4968 ((coex_sta->voice_over_HOGP) ? "Voice" : ""));
4970 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4971 "\r\n %-35s = None", "Profiles");
4975 if (bt_link_info->a2dp_exist) {
4976 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %d/ %s",
4977 "A2DP Rate/Bitpool/Auto_Slot",
4978 ((coex_sta->is_A2DP_3M) ? "3M" : "No_3M"),
4979 coex_sta->a2dp_bit_pool,
4980 ((coex_sta->is_autoslot) ? "On" : "Off"));
4984 if (bt_link_info->hid_exist) {
4985 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
4986 "HID PairNum/Forbid_Slot",
4987 coex_sta->hid_pair_cnt,
4988 coex_sta->forbidden_slot
4993 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ 0x%x/ 0x%x",
4994 "Role/IgnWlanAct/Feature/BLEScan",
4995 ((bt_link_info->slave_role) ? "Slave" : "Master"),
4996 ((coex_dm->cur_ignore_wlan_act) ? "Yes":"No"),
4997 coex_sta->bt_coex_supported_feature,
4998 coex_sta->bt_ble_scan_type);
5001 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d",
5002 "ReInit/ReLink/IgnWlact/Page/NameReq",
5003 coex_sta->cnt_ReInit,
5004 coex_sta->cnt_setupLink,
5005 coex_sta->cnt_IgnWlanAct,
5007 coex_sta->cnt_RemoteNameReq
5011 halbtc8822b1ant_read_score_board(btcoexist, &u16tmp[0]);
5013 if ((coex_sta->bt_reg_vendor_ae == 0xffff) ||
5014 (coex_sta->bt_reg_vendor_ac == 0xffff))
5015 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = x/ x/ %04x",
5016 "0xae[4]/0xac[1:0]/Scoreboard", u16tmp[0]);
5018 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5019 "\r\n %-35s = 0x%x/ 0x%x/ %04x",
5020 "0xae[4]/0xac[1:0]/Scoreboard",
5021 ((coex_sta->bt_reg_vendor_ae & BIT(4))>>4),
5022 coex_sta->bt_reg_vendor_ac & 0x3, u16tmp[0]);
5025 for (i = 0; i < BT_INFO_SRC_8822B_1ANT_MAX; i++) {
5026 if (coex_sta->bt_info_c2h_cnt[i]) {
5027 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5028 "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)",
5029 glbt_info_src_8822b_1ant[i],
5030 coex_sta->bt_info_c2h[i][0],
5031 coex_sta->bt_info_c2h[i][1],
5032 coex_sta->bt_info_c2h[i][2],
5033 coex_sta->bt_info_c2h[i][3],
5034 coex_sta->bt_info_c2h[i][4],
5035 coex_sta->bt_info_c2h[i][5],
5036 coex_sta->bt_info_c2h[i][6],
5037 coex_sta->bt_info_c2h_cnt[i]);
5043 if (btcoexist->manual_control)
5044 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
5045 "============[mechanisms] (before Manual)============");
5047 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
5048 "============[mechanisms]============");
5051 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d",
5053 coex_dm->cur_low_penalty_ra);
5056 ps_tdma_case = coex_dm->cur_ps_tdma;
5057 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5058 "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (%s,%s)",
5060 coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1],
5061 coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3],
5062 coex_dm->ps_tdma_para[4], ps_tdma_case,
5063 (coex_dm->cur_ps_tdma_on ? "On" : "Off"),
5064 (coex_dm->auto_tdma_adjust ? "Adj" : "Fix"));
5068 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d",
5069 "WL/BT Coex Table Type",
5070 coex_sta->coex_table_type);
5073 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
5074 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
5075 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
5076 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5077 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
5078 "0x6c0/0x6c4/0x6c8(coexTable)",
5079 u32tmp[0], u32tmp[1], u32tmp[2]);
5082 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
5083 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6cc);
5084 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5085 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
5086 "0x778/0x6cc/IgnWlanAct",
5087 u8tmp[0], u32tmp[0], coex_dm->cur_ignore_wlan_act);
5090 u32tmp[0] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
5092 u32tmp[1] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
5095 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
5096 "LTE Coex Table W_L/B_L",
5097 u32tmp[0] & 0xffff, u32tmp[1] & 0xffff);
5100 u32tmp[0] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
5102 u32tmp[1] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
5104 u32tmp[2] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
5106 u32tmp[3] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
5109 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5110 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
5111 "LTE Break Table W_L/B_L/L_W/L_B",
5112 u32tmp[0] & 0xffff, u32tmp[1] & 0xffff,
5113 u32tmp[2] & 0xffff, u32tmp[3] & 0xffff);
5117 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
5118 "============[Hw setting]============");
5121 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
5122 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
5123 u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
5124 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
5125 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
5126 "0x430/0x434/0x42a/0x456",
5127 u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]);
5131 u32tmp[0] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
5132 u32tmp[1] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x54);
5133 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x73);
5135 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %s",
5136 "LTE CoexOn/Path Ctrl Owner",
5137 (int)((u32tmp[0]&BIT(7)) >> 7),
5138 ((u8tmp[0]&BIT(2)) ? "WL" : "BT"));
5141 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
5142 "LTE 3Wire/OPMode/UART/UARTMode",
5143 (int)((u32tmp[0]&BIT(6)) >> 6),
5144 (int)((u32tmp[0] & (BIT(5) | BIT(4))) >> 4),
5145 (int)((u32tmp[0]&BIT(3)) >> 3),
5146 (int)(u32tmp[0] & (BIT(2) | BIT(1) | BIT(0))));
5149 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %s",
5150 "GNT_WL_SWCtrl/GNT_BT_SWCtrl/Dbg",
5151 (int)((u32tmp[0]&BIT(12)) >> 12),
5152 (int)((u32tmp[0]&BIT(14)) >> 14),
5153 ((u8tmp[0]&BIT(3)) ? "On" : "Off"));
5156 u32tmp[0] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x54);
5158 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
5159 "GNT_WL/GNT_BT/LTE_Busy/UART_Busy",
5160 (int)((u32tmp[0]&BIT(2)) >> 2),
5161 (int)((u32tmp[0]&BIT(3)) >> 3),
5162 (int)((u32tmp[0]&BIT(1)) >> 1), (int)(u32tmp[0]&BIT(0)));
5166 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x4c6);
5167 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
5169 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
5170 "0x4c6[4]/0x40[5] (WL/BT PTA)",
5171 (int)((u8tmp[0] & BIT(4)) >> 4),
5172 (int)((u8tmp[1] & BIT(5)) >> 5));
5175 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
5176 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
5177 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x953);
5178 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ %s",
5179 "0x550(bcn ctrl)/0x522/4-RxAGC",
5180 u32tmp[0], u8tmp[0], (u8tmp[1] & 0x2) ? "On" : "Off");
5183 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xda0);
5184 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xda4);
5185 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0xda8);
5186 u32tmp[3] = btcoexist->btc_read_4byte(btcoexist, 0xcf0);
5188 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);
5189 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
5191 fa_ofdm = ((u32tmp[0] & 0xffff0000) >> 16) + ((u32tmp[1] & 0xffff0000)
5192 >> 16) + (u32tmp[1] & 0xffff) + (u32tmp[2] & 0xffff) +
5193 ((u32tmp[3] & 0xffff0000) >> 16) + (u32tmp[3] &
5195 fa_cck = (u8tmp[0] << 8) + u8tmp[1];
5197 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
5199 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5200 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
5201 "0xc50/OFDM-CCA/OFDM-FA/CCK-FA",
5202 u32tmp[1] & 0xff, u32tmp[0] & 0xffff, fa_ofdm, fa_cck);
5206 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
5207 "CRC_OK CCK/11g/11n/11n-Agg",
5208 coex_sta->crc_ok_cck, coex_sta->crc_ok_11g,
5209 coex_sta->crc_ok_11n, coex_sta->crc_ok_11n_agg);
5212 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
5213 "CRC_Err CCK/11g/11n/11n-Agg",
5214 coex_sta->crc_err_cck, coex_sta->crc_err_11g,
5215 coex_sta->crc_err_11n, coex_sta->crc_err_11n_agg);
5218 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
5219 "0x770(high-pri rx/tx)",
5220 coex_sta->high_priority_rx, coex_sta->high_priority_tx);
5222 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
5223 "0x774(low-pri rx/tx)",
5224 coex_sta->low_priority_rx, coex_sta->low_priority_tx);
5226 #if (BT_AUTO_REPORT_ONLY_8822B_1ANT == 1)
5227 /* halbtc8822b1ant_monitor_bt_ctr(btcoexist); */
5229 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS);
5231 void ex_halbtc8822b1ant_antenna_detection(IN struct btc_coexist *btcoexist,
5232 IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds)
5234 void ex_halbtc8822b1ant_display_ant_detection(IN struct btc_coexist *btcoexist)
5236 void ex_halbtc8822b1ant_dbg_control(IN struct btc_coexist *btcoexist,
5237 IN u8 op_code, IN u8 op_len, IN u8 *pdata)
5240 case BTC_DBG_SET_COEX_MANUAL_CTRL: {
5241 boolean manual = (boolean) *pdata;
5243 halbtc8822b1ant_setManual(btcoexist, manual);
5252 void ex_halbtc8822b1ant_power_on_setting(IN struct btc_coexist *btcoexist)
5254 struct btc_board_info *board_info = &btcoexist->board_info;
5258 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5259 "xxxxxxxxxxxxxxxx Execute 8822b 1-Ant PowerOn Setting!! xxxxxxxxxxxxxxxx\n");
5260 BTC_TRACE(trace_buf);
5262 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5263 "Ant Det Finish = %s, Ant Det Number = %d\n",
5264 board_info->btdm_ant_det_finish ? "Yes" : "No",
5265 board_info->btdm_ant_num_by_ant_det);
5266 BTC_TRACE(trace_buf);
5268 btcoexist->stop_coex_dm = true;
5270 /* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. */
5271 u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2);
5272 btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT(0) | BIT(1));
5274 /* set Path control owner to WiFi */
5275 halbtc8822b1ant_ltecoex_pathcontrol_owner(btcoexist,
5276 BT_8822B_1ANT_PCO_WLSIDE);
5278 /* set GNT_BT to high */
5279 halbtc8822b1ant_ltecoex_set_gnt_bt(btcoexist,
5280 BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
5281 BT_8822B_1ANT_GNT_CTRL_BY_SW,
5282 BT_8822B_1ANT_SIG_STA_SET_TO_HIGH);
5283 /* Set GNT_WL to low */
5284 halbtc8822b1ant_ltecoex_set_gnt_wl(btcoexist,
5285 BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
5286 BT_8822B_1ANT_GNT_CTRL_BY_SW,
5287 BT_8822B_1ANT_SIG_STA_SET_TO_LOW);
5289 /* set WLAN_ACT = 0 */
5290 /* btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4); */
5292 /* SD1 Chunchu red x issue */
5293 btcoexist->btc_write_1byte(btcoexist, 0xff1a, 0x0);
5295 halbtc8822b1ant_enable_gnt_to_gpio(btcoexist, true);
5298 /* S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info) */
5299 /* Local setting bit define */
5300 /* BIT0: "0" for no antenna inverse; "1" for antenna inverse */
5301 /* BIT1: "0" for internal switch; "1" for external switch */
5302 /* BIT2: "0" for one antenna; "1" for two antenna */
5303 /* NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0 */
5306 board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
5308 if (btcoexist->chip_interface == BTC_INTF_USB)
5309 btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
5310 else if (btcoexist->chip_interface == BTC_INTF_SDIO)
5311 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60, u8tmp);
5313 BTC_TRACE(trace_buf);
5318 void ex_halbtc8822b1ant_power_on_setting_without_bt(IN struct btc_coexist
5321 struct btc_board_info *board_info = &btcoexist->board_info;
5325 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5326 " 8822b 1-Ant PowerOn Setting without bt\n");
5327 BTC_TRACE(trace_buf);
5329 btcoexist->stop_coex_dm = true;
5331 /* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. */
5332 u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2);
5333 btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT(0) | BIT(1));
5336 /* SD1 Chunchu red x issue */
5337 btcoexist->btc_write_1byte(btcoexist, 0xff1a, 0x0);
5340 board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
5342 if (btcoexist->chip_interface == BTC_INTF_USB)
5343 btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
5344 else if (btcoexist->chip_interface == BTC_INTF_SDIO)
5345 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60, u8tmp);
5352 void ex_halbtc8822b1ant_pre_load_firmware(IN struct btc_coexist *btcoexist)
5356 void ex_halbtc8822b1ant_init_hw_config(IN struct btc_coexist *btcoexist,
5357 IN boolean wifi_only)
5359 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5360 "[BTCoex], ********** (ini hw config) **********\n");
5362 halbtc8822b1ant_init_hw_config(btcoexist, true, wifi_only);
5363 btcoexist->stop_coex_dm = false;
5366 void ex_halbtc8822b1ant_init_hw_config_without_bt(IN struct btc_coexist
5368 IN boolean wifi_only)
5370 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5371 "[BTCoex], ********** (ini hw config) **********\n");
5373 halbtc8822b1ant_init_hw_config_without_bt(btcoexist, true, wifi_only);
5374 btcoexist->stop_coex_dm = true;
5377 void ex_halbtc8822b1ant_antenna_switch_without_bt(IN struct btc_coexist
5381 boolean wifi_under_5g = false;
5384 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
5388 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
5392 btcoexist->btc_write_1byte_bitmask(btcoexist,
5398 void ex_halbtc8822b1ant_init_coex_dm(IN struct btc_coexist *btcoexist)
5400 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5401 "[BTCoex], Coex Mechanism Init!!\n");
5402 BTC_TRACE(trace_buf);
5404 btcoexist->stop_coex_dm = false;
5406 halbtc8822b1ant_init_coex_dm(btcoexist);
5408 halbtc8822b1ant_query_bt_info(btcoexist);
5411 void ex_halbtc8822b1ant_display_coex_info(IN struct btc_coexist *btcoexist)
5414 struct btc_board_info *board_info = &btcoexist->board_info;
5415 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
5416 u8 *cli_buf = btcoexist->cli_buf;
5417 u8 u8tmp[4], i, bt_info_ext, ps_tdma_case = 0;
5419 u32 fa_ofdm, fa_cck, cca_ofdm, cca_cck;
5422 u32 fw_ver = 0, bt_patch_ver = 0;
5423 static u8 pop_report_in_10s = 0;
5425 /*u32 pnp_wake_cnt=0;*/
5427 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5428 "[BTCoex], ********** (display coexinfo) **********\n");
5429 BTC_TRACE(trace_buf);
5430 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5431 "[BTCoex], ********** displaycoexinfostart, 0xcb4/0xcbd = 0x%x/0x%x\n",
5432 btcoexist->btc_read_1byte(btcoexist, 0xcb4),
5433 btcoexist->btc_read_1byte(btcoexist, 0xcbd));
5434 BTC_TRACE(trace_buf);
5436 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5437 "\r\n ============[BT Coexist info]============");
5440 if (btcoexist->manual_control) {
5441 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5442 "\r\n ============[Under Manual Control]============");
5444 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5445 "\r\n ==========================================");
5449 if (btcoexist->stop_coex_dm) {
5450 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5451 "\r\n ============[Coex is STOPPED]============");
5453 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5454 "\r\n ==========================================");
5458 if (psd_scan->ant_det_try_count == 0) {
5459 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5460 "\r\n %-35s = %d/ %d/ %d/ %d",
5461 "Ant PG Num/ Mech/ Pos/ RFE",
5462 board_info->pg_ant_num, board_info->btdm_ant_num,
5463 board_info->btdm_ant_pos,
5464 rfe_type->rfe_module_type);
5467 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5468 "\r\n %-35s = %d/ %d/ %d/ %d (%d/%d/%d)",
5469 "Ant PG Num/ Mech(Ant_Det)/ Pos/ RFE",
5470 board_info->pg_ant_num,
5471 board_info->btdm_ant_num_by_ant_det,
5472 board_info->btdm_ant_pos,
5473 rfe_type->rfe_module_type,
5474 psd_scan->ant_det_try_count,
5475 psd_scan->ant_det_fail_count,
5476 psd_scan->ant_det_result);
5479 if (board_info->btdm_ant_det_finish) {
5480 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s",
5481 "Ant Det PSD Value",
5482 psd_scan->ant_det_peak_val);
5486 /*btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);*/
5487 bt_patch_ver = btcoexist->bt_info.bt_get_fw_ver;
5488 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
5489 phyver = btcoexist->btc_get_bt_phydm_version(btcoexist);
5490 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5491 "\r\n %-35s = %d_%02x/ 0x%02x/ 0x%02x (%s)",
5492 "CoexVer WL/ BT_Desired/ BT_Report",
5493 glcoex_ver_date_8822b_1ant, glcoex_ver_8822b_1ant,
5494 glcoex_ver_btdesired_8822b_1ant,
5495 ((coex_sta->bt_coex_supported_version & 0xff00) >>
5497 (((coex_sta->bt_coex_supported_version & 0xff00) >>
5499 glcoex_ver_btdesired_8822b_1ant ? "Match" :
5503 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5504 "\r\n %-35s = 0x%x/ 0x%x/ v%d/ %c",
5505 "W_FW/ B_FW/ Phy/ Kt",
5506 fw_ver, bt_patch_ver, phyver,
5507 coex_sta->cut_version + 65);
5513 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ",
5514 "Wifi channel informed to BT",
5515 coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1],
5516 coex_dm->wifi_chnl_info[2]);
5518 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s",
5519 "WifibHiPri/ Ccklock/ CckEverLock",
5520 (coex_sta->wifi_is_high_pri_task ? "Yes" : "No"),
5521 (coex_sta->cck_lock ? "Yes" : "No"),
5522 (coex_sta->cck_ever_lock ? "Yes" : "No"));
5526 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
5527 "============[Wifi Status]============");
5529 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_WIFI_STATUS);
5531 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
5532 "============[BT Status]============");
5535 pop_report_in_10s++;
5536 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d/ %d] ",
5537 "BT [status/ rssi/ retryCnt/ popCnt]",
5538 ((coex_sta->bt_disabled) ? ("disabled") : ((
5539 coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan")
5540 : ((BT_8822B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
5541 coex_dm->bt_status) ? "non-connected idle" :
5542 ((BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)
5543 ? "connected-idle" : "busy")))),
5544 coex_sta->bt_rssi - 100, coex_sta->bt_retry_cnt,
5545 coex_sta->pop_event_cnt);
5548 /*bt pop_even_cnt : bt retry*/
5550 if (pop_report_in_10s >= 5) {
5551 coex_sta->pop_event_cnt = 0;
5552 pop_report_in_10s = 0;
5555 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5556 "\r\n %-35s = %d / %d / %d / %d / %d",
5557 "SCO/HID/PAN/A2DP/Hi-Pri",
5558 bt_link_info->sco_exist, bt_link_info->hid_exist,
5559 bt_link_info->pan_exist, bt_link_info->a2dp_exist,
5560 bt_link_info->bt_hi_pri_link_exist);
5564 bt_info_ext = coex_sta->bt_info_ext;
5566 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5567 "\r\n %-35s = %s / %s / %d/ %x/ %02x",
5568 "Role/A2DP Rate/Bitpool/Feature/Ver",
5569 ((bt_link_info->slave_role) ? "Slave" : "Master"),
5570 (bt_info_ext & BIT(0)) ? "BR" : "EDR",
5571 coex_sta->a2dp_bit_pool,
5572 coex_sta->bt_coex_supported_feature,
5573 ((coex_sta->bt_coex_supported_version & 0xff00) >> 8));
5578 for (i = 0; i < BT_INFO_SRC_8822B_1ANT_MAX; i++) {
5579 if (coex_sta->bt_info_c2h_cnt[i]) {
5580 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5581 "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)",
5582 glbt_info_src_8822b_1ant[i],
5583 coex_sta->bt_info_c2h[i][0],
5584 coex_sta->bt_info_c2h[i][1],
5585 coex_sta->bt_info_c2h[i][2],
5586 coex_sta->bt_info_c2h[i][3],
5587 coex_sta->bt_info_c2h[i][4],
5588 coex_sta->bt_info_c2h[i][5],
5589 coex_sta->bt_info_c2h[i][6],
5590 coex_sta->bt_info_c2h_cnt[i]);
5596 if (btcoexist->manual_control)
5597 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
5598 "============[mechanisms] (before Manual)============");
5600 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
5601 "============[mechanisms]============");
5604 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d",
5606 coex_dm->cur_low_penalty_ra);
5610 ps_tdma_case = coex_dm->cur_ps_tdma;
5611 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5612 "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (%s,%s)",
5614 coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1],
5615 coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3],
5616 coex_dm->ps_tdma_para[4], ps_tdma_case,
5617 (coex_dm->cur_ps_tdma_on ? "On" : "Off"),
5618 (coex_dm->auto_tdma_adjust ? "Adj" : "Fix"));
5623 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d",
5624 "WL/BT Coex Table Type",
5625 coex_sta->coex_table_type);
5628 /*coex table :0x6c0 0x6c4 , break table: 0x6c8*/
5629 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
5630 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
5631 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
5632 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5633 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
5634 "0x6c0/0x6c4/0x6c8(coexTable)",
5635 u32tmp[0], u32tmp[1], u32tmp[2]);
5638 /*PTA : 0x778=1/3/d , WL BA,RTS,CTS :0x6cc H/L pri */
5639 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
5640 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6cc);
5641 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5642 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
5643 "0x778/0x6cc/IgnWlanAct",
5644 u8tmp[0], u32tmp[0], coex_dm->cur_ignore_wlan_act);
5648 /*LTE : WL/LTE coex table : 0xa0 */
5650 u32tmp[0] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
5653 /*LTE : BT/LTE coex table : 0xa4 */
5654 u32tmp[1] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
5657 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
5658 "LTE Coex Table W_L/B_L",
5659 u32tmp[0] & 0xffff, u32tmp[1] & 0xffff);
5662 /*LTE : WL/LTE break table : 0xa8 */
5663 u32tmp[0] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
5665 /*LTE : WL/LTE break table : 0xac */
5666 u32tmp[1] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
5668 /*LTE : LTE/WL break table : 0xb0 */
5669 u32tmp[2] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
5671 /*LTE : LTE/BT break table : 0xb4 */
5672 u32tmp[3] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
5675 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5676 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
5677 "LTE Break Table W_L/B_L/L_W/L_B",
5678 u32tmp[0] & 0xffff, u32tmp[1] & 0xffff,
5679 u32tmp[2] & 0xffff, u32tmp[3] & 0xffff);
5683 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
5684 "============[Hw setting]============");
5688 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
5689 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
5690 u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
5691 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
5692 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
5693 "0x430/0x434/0x42a/0x456",
5694 u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]);
5698 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xcb4);
5699 u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0xcbd);
5700 u8tmp[3] = btcoexist->btc_read_1byte(btcoexist, 0x1991);
5702 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
5703 "0xcb4/0xcbd/0x1991",
5704 u8tmp[1], u8tmp[2], u8tmp[3]);
5707 /*LTE on/off , Path ctrl owner*/
5709 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
5710 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x73);
5711 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x64);
5712 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
5713 "0x73/ 0x4c/ 0x64[0]", u8tmp[0],
5714 (u32tmp[0] & (BIT(24) | BIT(23))) >> 23,
5719 u32tmp[0] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
5720 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %s",
5721 "LTE CoexOn/Path Ctrl Owner",
5722 (int)((u32tmp[0]&BIT(7)) >> 7),
5723 ((u8tmp[0]&BIT(2)) ? "WL" : "BT"));
5727 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
5728 "LTE 3Wire/OPMode/UART/UARTMode",
5729 (int)((u32tmp[0]&BIT(6)) >> 6),
5730 (int)((u32tmp[0] & (BIT(5) | BIT(4))) >> 4),
5731 (int)((u32tmp[0]&BIT(3)) >> 3),
5732 (int)(u32tmp[0] & (BIT(2) | BIT(1) | BIT(0))));
5735 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %s",
5736 "GNT_WL_SWCtrl/GNT_BT_SWCtrl/Dbg",
5737 (int)((u32tmp[0]&BIT(12)) >> 12),
5738 (int)((u32tmp[0]&BIT(14)) >> 14),
5739 ((u8tmp[0]&BIT(3)) ? "On" : "Off"));
5742 u32tmp[0] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x54);
5744 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
5745 "GNT_WL/GNT_BT/LTE_Busy/UART_Busy",
5746 (int)((u32tmp[0]&BIT(2)) >> 2),
5747 (int)((u32tmp[0]&BIT(3)) >> 3),
5748 (int)((u32tmp[0]&BIT(1)) >> 1), (int)(u32tmp[0]&BIT(0)));
5752 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x4c6);
5753 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
5755 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
5756 "0x4c6[4]/0x40[5] (WL/BT PTA)",
5757 (int)((u8tmp[0] & BIT(4)) >> 4),
5758 (int)((u8tmp[1] & BIT(5)) >> 5));
5761 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
5762 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
5763 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x953);
5764 u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0xc50);
5765 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5766 "\r\n %-35s = 0x%x/ 0x%x/ %s/ 0x%x",
5767 "0x550/0x522/4-RxAGC/0xc50",
5768 u32tmp[0], u8tmp[0], (u8tmp[1] & 0x2) ? "On" : "Off", u8tmp[2]);
5771 fa_ofdm = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
5772 PHYDM_INFO_FA_OFDM);
5773 fa_cck = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
5775 cca_ofdm = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
5776 PHYDM_INFO_CCA_OFDM);
5777 cca_cck = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
5778 PHYDM_INFO_CCA_CCK);
5780 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
5781 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
5782 "CCK-CCA/CCK-FA/OFDM-CCA/OFDM-FA",
5783 cca_cck, fa_cck, cca_ofdm, fa_ofdm);
5788 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
5789 "CRC_OK CCK/11g/11n/11ac",
5790 coex_sta->crc_ok_cck, coex_sta->crc_ok_11g,
5791 coex_sta->crc_ok_11n, coex_sta->crc_ok_11n_vht);
5794 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
5795 "CRC_Err CCK/11g/11n/11ac",
5796 coex_sta->crc_err_cck, coex_sta->crc_err_11g,
5797 coex_sta->crc_err_11n, coex_sta->crc_err_11n_vht);
5801 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s",
5802 "Wifi-HiPri/ Ccklock/ CckEverLock",
5803 (coex_sta->wifi_is_high_pri_task ? "Yes" : "No"),
5804 (coex_sta->cck_lock ? "Yes" : "No"),
5805 (coex_sta->cck_ever_lock ? "Yes" : "No"));
5808 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
5809 "0x770(high-pri rx/tx)",
5810 coex_sta->high_priority_rx, coex_sta->high_priority_tx);
5812 /*0x774:bt low pri trx*/
5813 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
5814 "0x774(low-pri rx/tx)",
5815 coex_sta->low_priority_rx, coex_sta->low_priority_tx);
5818 halbtc8822b1ant_read_score_board(btcoexist, &u16tmp[0]);
5820 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %04x",
5821 "ScoreBoard[14:0] (from BT)", u16tmp[0]);
5823 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS);
5824 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5825 "[BTCoex], ********** displaycoexinfo end, 0xcb4/0xcbd = 0x%x/0x%x\n",
5826 btcoexist->btc_read_1byte(btcoexist, 0xcb4),
5827 btcoexist->btc_read_1byte(btcoexist, 0xcbd));
5828 BTC_TRACE(trace_buf);
5830 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5831 "[BTCoex], ********** pnp_wake_cnt = %d\n", pnp_wake_cnt);
5832 BTC_TRACE(trace_buf);
5837 void ex_halbtc8822b1ant_ips_notify(IN struct btc_coexist *btcoexist, IN u8 type)
5840 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
5844 if (BTC_IPS_ENTER == type) {
5846 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5847 "[BTCoex], IPS ENTER notify\n");
5848 BTC_TRACE(trace_buf);
5849 coex_sta->under_ips = true;
5851 /* Write WL "Active" in Score-board for LPS off */
5852 halbtc8822b1ant_post_state_to_bt(btcoexist,
5853 BT_8822B_1ANT_SCOREBOARD_ACTIVE, false);
5855 halbtc8822b1ant_post_state_to_bt(btcoexist,
5856 BT_8822B_1ANT_SCOREBOARD_ONOFF, false);
5858 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
5860 halbtc8822b1ant_set_ant_path(btcoexist,
5863 BT_8822B_1ANT_PHASE_WLAN_OFF);
5865 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
5866 } else if (BTC_IPS_LEAVE == type) {
5868 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5869 "[BTCoex], IPS LEAVE notify\n");
5870 BTC_TRACE(trace_buf);
5871 halbtc8822b1ant_post_state_to_bt(btcoexist,
5872 BT_8822B_1ANT_SCOREBOARD_ACTIVE, true);
5874 halbtc8822b1ant_post_state_to_bt(btcoexist,
5875 BT_8822B_1ANT_SCOREBOARD_ONOFF, true);
5877 /*leave IPS : run ini hw config (exclude wifi only)*/
5878 halbtc8822b1ant_init_hw_config(btcoexist, false, false);
5880 halbtc8822b1ant_init_coex_dm(btcoexist);
5881 /*leave IPS : Query bt info*/
5882 halbtc8822b1ant_query_bt_info(btcoexist);
5884 coex_sta->under_ips = false;
5888 void ex_halbtc8822b1ant_lps_notify(IN struct btc_coexist *btcoexist, IN u8 type)
5890 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
5893 if (BTC_LPS_ENABLE == type) {
5894 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5895 "[BTCoex], LPS ENABLE notify\n");
5896 BTC_TRACE(trace_buf);
5897 coex_sta->under_lps = true;
5899 if (coex_sta->force_lps_on == true) { /* LPS No-32K */
5900 /* Write WL "Active" in Score-board for PS-TDMA */
5901 halbtc8822b1ant_post_state_to_bt(btcoexist,
5902 BT_8822B_1ANT_SCOREBOARD_ACTIVE, true);
5904 } else { /* LPS-32K, need check if this h2c 0x71 can work?? (2015/08/28) */
5905 /* Write WL "Non-Active" in Score-board for Native-PS */
5906 halbtc8822b1ant_post_state_to_bt(btcoexist,
5907 BT_8822B_1ANT_SCOREBOARD_ACTIVE, false);
5910 } else if (BTC_LPS_DISABLE == type) {
5911 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5912 "[BTCoex], LPS DISABLE notify\n");
5913 BTC_TRACE(trace_buf);
5914 coex_sta->under_lps = false;
5916 /* Write WL "Active" in Score-board for LPS off */
5917 halbtc8822b1ant_post_state_to_bt(btcoexist,
5918 BT_8822B_1ANT_SCOREBOARD_ACTIVE, true);
5924 void ex_halbtc8822b1ant_scan_notify(IN struct btc_coexist *btcoexist,
5927 boolean wifi_connected = false;
5928 boolean wifi_under_5g = false;
5930 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5931 "[BTCoex], SCAN notify()\n");
5932 BTC_TRACE(trace_buf);
5934 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
5939 if (btcoexist->manual_control ||
5940 btcoexist->stop_coex_dm)
5943 if (BTC_SCAN_START == type) {
5944 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
5946 if (wifi_under_5g) {
5947 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5948 "[BTCoex], ********** (scan_notify_5g_scan_start) **********\n");
5949 BTC_TRACE(trace_buf);
5950 halbtc8822b1ant_action_wifi_under5g(btcoexist);
5955 coex_sta->wifi_is_high_pri_task = true;
5957 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5958 "[BTCoex], ********** (scan_notify_2g_scan_start) **********\n");
5959 BTC_TRACE(trace_buf);
5961 if (!wifi_connected) { /* non-connected scan */
5962 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5963 "[BTCoex], ********** wifi is not connected scan **********\n");
5964 BTC_TRACE(trace_buf);
5965 halbtc8822b1ant_action_wifi_not_connected_scan(
5967 } else { /* wifi is connected */
5968 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5969 "[BTCoex], ********** wifi is connected scan **********\n");
5970 BTC_TRACE(trace_buf);
5971 halbtc8822b1ant_action_wifi_connected_scan(
5978 if (BTC_SCAN_START_2G == type) {
5979 coex_sta->wifi_is_high_pri_task = true;
5981 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5982 "[BTCoex], ********** (scan_notify_2g_sacn_start_for_switch_band_used) **********\n");
5983 BTC_TRACE(trace_buf);
5985 if (!wifi_connected) { /* non-connected scan */
5986 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5987 "[BTCoex], ********** wifi is not connected **********\n");
5988 BTC_TRACE(trace_buf);
5990 halbtc8822b1ant_action_wifi_not_connected_scan(
5992 } else { /* wifi is connected */
5993 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5994 "[BTCoex], ********** wifi is connected **********\n");
5995 BTC_TRACE(trace_buf);
5996 halbtc8822b1ant_action_wifi_connected_scan(btcoexist);
5999 coex_sta->wifi_is_high_pri_task = false;
6001 /*WL scan finish , then get and update sacn ap numbers */
6002 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
6003 &coex_sta->scan_ap_num);
6005 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6006 "[BTCoex], ********** (scan_finish_notify) **********\n");
6007 BTC_TRACE(trace_buf);
6009 if (!wifi_connected) /* non-connected scan */
6010 halbtc8822b1ant_action_wifi_not_connected(btcoexist);
6012 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6013 "[BTCoex], ********** scan_finish_notify wifi is connected **********\n");
6014 BTC_TRACE(trace_buf);
6015 halbtc8822b1ant_action_wifi_connected(btcoexist);
6022 void ex_halbtc8822b1ant_scan_notify_without_bt(IN struct btc_coexist *btcoexist,
6026 boolean wifi_under_5g = false;
6028 if (BTC_SCAN_START == type) {
6029 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
6031 if (wifi_under_5g) {
6032 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
6038 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
6042 if (BTC_SCAN_START_2G == type)
6043 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd, 0x3, 2);
6046 void ex_halbtc8822b1ant_switchband_notify(IN struct btc_coexist *btcoexist,
6050 boolean wifi_connected = false;
6053 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6054 "[BTCoex], ********** (switchband_notify) **********\n");
6055 BTC_TRACE(trace_buf);
6057 if (btcoexist->manual_control ||
6058 btcoexist->stop_coex_dm)
6062 if (type == BTC_SWITCH_TO_5G) {
6063 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6064 "[BTCoex], ********** (switchband_notify BTC_SWITCH_TO_5G) **********\n");
6065 BTC_TRACE(trace_buf);
6067 halbtc8822b1ant_action_wifi_under5g(btcoexist);
6069 } else if (type == BTC_SWITCH_TO_24G_NOFORSCAN) {
6070 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6071 "[BTCoex], ********** (switchband_notify BTC_SWITCH_TO_2G (no for scan)) **********\n");
6072 BTC_TRACE(trace_buf);
6074 halbtc8822b1ant_run_coexist_mechanism(btcoexist);
6077 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6078 "[BTCoex], ********** (switchband_notify BTC_SWITCH_TO_2G) **********\n");
6079 BTC_TRACE(trace_buf);
6081 ex_halbtc8822b1ant_scan_notify(btcoexist,
6088 void ex_halbtc8822b1ant_switchband_notify_without_bt(IN struct btc_coexist
6092 boolean wifi_under_5g = false;
6094 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
6096 if (type == BTC_SWITCH_TO_5G) {
6098 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
6101 } else if (type == BTC_SWITCH_TO_24G_NOFORSCAN) {
6105 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
6109 btcoexist->btc_write_1byte_bitmask(btcoexist,
6113 ex_halbtc8822b1ant_scan_notify_without_bt(btcoexist,
6119 void ex_halbtc8822b1ant_connect_notify(IN struct btc_coexist *btcoexist,
6122 boolean wifi_connected = false;
6124 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6125 "[BTCoex], ********** (connect notify) **********\n");
6126 BTC_TRACE(trace_buf);
6128 halbtc8822b1ant_post_state_to_bt(btcoexist,
6129 BT_8822B_1ANT_SCOREBOARD_SCAN, true);
6131 if (btcoexist->manual_control ||
6132 btcoexist->stop_coex_dm)
6136 if ((BTC_ASSOCIATE_5G_START == type) ||
6137 (BTC_ASSOCIATE_5G_FINISH == type)) {
6139 if (BTC_ASSOCIATE_5G_START == type) {
6141 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6142 "[BTCoex], ********** (5G associate start notify) **********\n");
6143 BTC_TRACE(trace_buf);
6145 halbtc8822b1ant_action_wifi_under5g(btcoexist);
6147 } else if (BTC_ASSOCIATE_5G_FINISH == type) {
6149 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6150 "[BTCoex], ********** (5G associate finish notify) **********\n");
6151 BTC_TRACE(trace_buf);
6160 if (BTC_ASSOCIATE_START == type) {
6162 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6163 "[BTCoex], 2G CONNECT START notify\n");
6164 BTC_TRACE(trace_buf);
6166 coex_sta->wifi_is_high_pri_task = true;
6168 halbtc8822b1ant_set_ant_path(btcoexist,
6171 BT_8822B_1ANT_PHASE_2G_RUNTIME);
6173 coex_dm->arp_cnt = 0;
6175 halbtc8822b1ant_action_wifi_not_connected_asso_auth(btcoexist);
6179 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6180 "[BTCoex], 2G CONNECT Finish notify\n");
6181 BTC_TRACE(trace_buf);
6182 coex_sta->wifi_is_high_pri_task = false;
6184 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
6187 if (!wifi_connected) /* non-connected scan */
6188 halbtc8822b1ant_action_wifi_not_connected(btcoexist);
6190 halbtc8822b1ant_action_wifi_connected(btcoexist);
6195 void ex_halbtc8822b1ant_media_status_notify(IN struct btc_coexist *btcoexist,
6198 boolean wifi_under_b_mode = false;
6199 boolean wifi_under_5g = false;
6200 u32 cnt_bt_cal_chk = 0;
6201 boolean is_in_mp_mode = false;
6203 u32 u32tmp1 = 0, u32tmp2 = 0;
6206 if (btcoexist->manual_control ||
6207 btcoexist->stop_coex_dm)
6211 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
6216 if (BTC_MEDIA_CONNECT == type) {
6218 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6219 "[BTCoex], 2g media connect notify");
6220 BTC_TRACE(trace_buf);
6222 halbtc8822b1ant_post_state_to_bt(btcoexist,
6223 BT_8822B_1ANT_SCOREBOARD_ACTIVE, true);
6225 if (wifi_under_5g) {
6226 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6227 "[BTCoex], 5g media notify\n");
6228 BTC_TRACE(trace_buf);
6230 halbtc8822b1ant_action_wifi_under5g(btcoexist);
6233 /* Force antenna setup for no scan result issue */
6234 halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
6236 BT_8822B_1ANT_PHASE_2G_RUNTIME);
6238 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
6239 &wifi_under_b_mode);
6241 /* Set CCK Tx/Rx high Pri except 11b mode */
6242 if (wifi_under_b_mode) {
6244 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6245 "[BTCoex], ********** (media status notity under b mode) **********\n");
6246 BTC_TRACE(trace_buf);
6247 btcoexist->btc_write_1byte(btcoexist, 0x6cd,
6249 btcoexist->btc_write_1byte(btcoexist, 0x6cf,
6252 /* btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x10); */ /*CCK Tx */
6253 /* btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x10); */ /*CCK Rx */
6254 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6255 "[BTCoex], ********** (media status notity not under b mode) **********\n");
6256 BTC_TRACE(trace_buf);
6257 btcoexist->btc_write_1byte(btcoexist, 0x6cd,
6259 btcoexist->btc_write_1byte(btcoexist, 0x6cf,
6263 coex_dm->backup_arfr_cnt1 = btcoexist->btc_read_4byte(btcoexist,
6265 coex_dm->backup_arfr_cnt2 = btcoexist->btc_read_4byte(btcoexist,
6267 coex_dm->backup_retry_limit = btcoexist->btc_read_2byte(
6269 coex_dm->backup_ampdu_max_time = btcoexist->btc_read_1byte(
6272 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6273 "[BTCoex], 2g media disconnect notify\n");
6274 BTC_TRACE(trace_buf);
6275 coex_dm->arp_cnt = 0;
6277 halbtc8822b1ant_post_state_to_bt(btcoexist,
6278 BT_8822B_1ANT_SCOREBOARD_ACTIVE, false);
6280 btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x0); /* CCK Tx */
6281 btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x0); /* CCK Rx */
6283 coex_sta->cck_ever_lock = false;
6286 halbtc8822b1ant_update_wifi_channel_info(btcoexist, type);
6290 void ex_halbtc8822b1ant_specific_packet_notify(IN struct btc_coexist *btcoexist,
6293 boolean under_4way = false, wifi_under_5g = false;
6295 if (btcoexist->manual_control ||
6296 btcoexist->stop_coex_dm)
6299 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
6300 if (wifi_under_5g) {
6301 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6302 "[BTCoex], 5g special packet notify\n");
6303 BTC_TRACE(trace_buf);
6305 halbtc8822b1ant_action_wifi_under5g(btcoexist);
6309 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
6314 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6315 "[BTCoex], specific Packet ---- under_4way!!\n");
6316 BTC_TRACE(trace_buf);
6318 coex_sta->wifi_is_high_pri_task = true;
6319 coex_sta->specific_pkt_period_cnt = 2;
6320 } else if (BTC_PACKET_ARP == type) {
6324 if (coex_sta->wifi_is_high_pri_task) {
6325 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6326 "[BTCoex], specific Packet ARP notify -cnt = %d\n",
6328 BTC_TRACE(trace_buf);
6333 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6334 "[BTCoex], specific Packet DHCP or EAPOL notify [Type = %d]\n",
6336 BTC_TRACE(trace_buf);
6338 coex_sta->wifi_is_high_pri_task = true;
6339 coex_sta->specific_pkt_period_cnt = 2;
6342 if (coex_sta->wifi_is_high_pri_task)
6343 halbtc8822b1ant_action_wifi_connected_specific_packet(
6348 void ex_halbtc8822b1ant_bt_info_notify(IN struct btc_coexist *btcoexist,
6349 IN u8 *tmp_buf, IN u8 length)
6352 u8 i, rsp_source = 0;
6353 boolean bt_busy = false;
6354 boolean wifi_connected = false;
6355 boolean wifi_under_5g = false;
6358 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
6360 coex_sta->c2h_bt_info_req_sent = false;
6361 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6362 "[BTCoex], ********** (BtInfo Notify) **********\n");
6363 BTC_TRACE(trace_buf);
6365 rsp_source = tmp_buf[0] & 0xf;
6366 if (rsp_source >= BT_INFO_SRC_8822B_1ANT_MAX)
6367 rsp_source = BT_INFO_SRC_8822B_1ANT_WIFI_FW;
6368 coex_sta->bt_info_c2h_cnt[rsp_source]++;
6370 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6371 "[BTCoex], Bt info[%d], length=%d, hex data=[", rsp_source,
6373 BTC_TRACE(trace_buf);
6375 for (i = 0; i < length; i++) {
6376 coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
6378 bt_info = tmp_buf[i];
6379 if (i == length - 1) {
6380 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x]\n",
6382 BTC_TRACE(trace_buf);
6384 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x, ",
6386 BTC_TRACE(trace_buf);
6391 if (BT_INFO_SRC_8822B_1ANT_WIFI_FW != rsp_source) {
6393 /* if 0xff, it means BT is under WHCK test */
6394 if (bt_info == 0xff)
6395 coex_sta->bt_whck_test = true;
6397 coex_sta->bt_whck_test = false;
6399 coex_sta->bt_retry_cnt = /* [3:0] */
6400 coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
6402 if (coex_sta->bt_retry_cnt >= 1)
6403 coex_sta->pop_event_cnt++;
6405 if (coex_sta->bt_info_c2h[rsp_source][2] & 0x20)
6406 coex_sta->c2h_bt_page = true;
6408 coex_sta->c2h_bt_page = false;
6410 if (coex_sta->bt_info_c2h[rsp_source][2] & 0x80)
6411 coex_sta->bt_create_connection = true;
6413 coex_sta->bt_create_connection = false;
6415 /* unit: %, value-100 to translate to unit: dBm */
6416 coex_sta->bt_rssi = coex_sta->bt_info_c2h[rsp_source][3] * 2 +
6419 /* coex_sta->bt_info_c2h[rsp_source][3] * 2 - 90; */
6421 if ((coex_sta->bt_info_c2h[rsp_source][1] & 0x49) == 0x49) {
6422 coex_sta->a2dp_bit_pool =
6423 coex_sta->bt_info_c2h[rsp_source][6];
6425 coex_sta->a2dp_bit_pool = 0;
6427 if (coex_sta->bt_info_c2h[rsp_source][1] & 0x9)
6428 coex_sta->acl_busy = true;
6430 coex_sta->acl_busy = false;
6432 coex_sta->bt_info_ext =
6433 coex_sta->bt_info_c2h[rsp_source][4];
6435 /* Here we need to resend some wifi info to BT */
6436 /* because bt is reset and loss of the info. */
6438 if ((!btcoexist->manual_control) &&
6439 (!btcoexist->stop_coex_dm)) {
6442 if (coex_sta->bt_info_ext & BIT(1)) {
6443 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6444 "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
6445 BTC_TRACE(trace_buf);
6446 btcoexist->btc_get(btcoexist,
6447 BTC_GET_BL_WIFI_CONNECTED,
6450 halbtc8822b1ant_update_wifi_channel_info(
6454 halbtc8822b1ant_update_wifi_channel_info(
6456 BTC_MEDIA_DISCONNECT);
6459 /* If Ignore_WLanAct && not SetUp_Link */
6460 if ((coex_sta->bt_info_ext & BIT(3)) &&
6461 (!(coex_sta->bt_info_ext & BIT(2)))) {
6463 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6464 "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
6465 BTC_TRACE(trace_buf);
6466 halbtc8822b1ant_ignore_wlan_act(btcoexist,
6471 /* check BIT2 first ==> check if bt is under inquiry or page scan */
6472 if (bt_info & BT_INFO_8822B_1ANT_B_INQ_PAGE)
6473 coex_sta->c2h_bt_inquiry_page = true;
6475 coex_sta->c2h_bt_inquiry_page = false;
6478 coex_sta->num_of_profile = 0;
6480 /* set link exist status */
6481 if (!(bt_info & BT_INFO_8822B_1ANT_B_CONNECTION)) {
6482 coex_sta->bt_link_exist = false;
6483 coex_sta->pan_exist = false;
6484 coex_sta->a2dp_exist = false;
6485 coex_sta->hid_exist = false;
6486 coex_sta->sco_exist = false;
6488 coex_sta->bt_hi_pri_link_exist = false;
6489 } else { /* connection exists */
6490 coex_sta->bt_link_exist = true;
6491 if (bt_info & BT_INFO_8822B_1ANT_B_FTP) {
6492 coex_sta->pan_exist = true;
6493 coex_sta->num_of_profile++;
6495 coex_sta->pan_exist = false;
6496 if (bt_info & BT_INFO_8822B_1ANT_B_A2DP) {
6497 coex_sta->a2dp_exist = true;
6498 coex_sta->num_of_profile++;
6500 coex_sta->a2dp_exist = false;
6501 if (bt_info & BT_INFO_8822B_1ANT_B_HID) {
6502 coex_sta->hid_exist = true;
6503 coex_sta->num_of_profile++;
6505 coex_sta->hid_exist = false;
6506 if (bt_info & BT_INFO_8822B_1ANT_B_SCO_ESCO) {
6507 coex_sta->sco_exist = true;
6508 coex_sta->num_of_profile++;
6510 coex_sta->sco_exist = false;
6514 halbtc8822b1ant_update_bt_link_info(btcoexist);
6517 0x1f; /* mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41) */
6519 if (!(bt_info & BT_INFO_8822B_1ANT_B_CONNECTION)) {
6520 coex_dm->bt_status = BT_8822B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
6521 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6522 "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
6523 BTC_TRACE(trace_buf);
6524 } else if (bt_info ==
6525 BT_INFO_8822B_1ANT_B_CONNECTION) { /* connection exists but no busy */
6526 coex_dm->bt_status = BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE;
6527 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6528 "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
6529 BTC_TRACE(trace_buf);
6530 } else if ((bt_info & BT_INFO_8822B_1ANT_B_SCO_ESCO) ||
6531 (bt_info & BT_INFO_8822B_1ANT_B_SCO_BUSY)) {
6532 coex_dm->bt_status = BT_8822B_1ANT_BT_STATUS_SCO_BUSY;
6533 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6534 "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
6535 BTC_TRACE(trace_buf);
6536 } else if (bt_info & BT_INFO_8822B_1ANT_B_ACL_BUSY) {
6537 if (BT_8822B_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)
6538 coex_dm->bt_status = BT_8822B_1ANT_BT_STATUS_ACL_BUSY;
6539 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6540 "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
6541 BTC_TRACE(trace_buf);
6543 coex_dm->bt_status = BT_8822B_1ANT_BT_STATUS_MAX;
6544 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6545 "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
6546 BTC_TRACE(trace_buf);
6549 if ((BT_8822B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
6550 (BT_8822B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
6551 (BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
6556 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
6558 halbtc8822b1ant_run_coexist_mechanism(btcoexist);
6561 void ex_halbtc8822b1ant_rf_status_notify(IN struct btc_coexist *btcoexist,
6564 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], RF Status notify\n");
6565 BTC_TRACE(trace_buf);
6567 if (BTC_RF_ON == type) {
6568 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6569 "[BTCoex], RF is turned ON!!\n");
6570 BTC_TRACE(trace_buf);
6571 btcoexist->stop_coex_dm = false;
6573 halbtc8822b1ant_post_state_to_bt(btcoexist,
6574 BT_8822B_1ANT_SCOREBOARD_ACTIVE, true);
6575 halbtc8822b1ant_post_state_to_bt(btcoexist,
6576 BT_8822B_1ANT_SCOREBOARD_ONOFF, true);
6578 } else if (BTC_RF_OFF == type) {
6579 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6580 "[BTCoex], RF is turned OFF!!\n");
6581 BTC_TRACE(trace_buf);
6583 halbtc8822b1ant_post_state_to_bt(btcoexist,
6584 BT_8822B_1ANT_SCOREBOARD_ACTIVE, false);
6585 halbtc8822b1ant_post_state_to_bt(btcoexist,
6586 BT_8822B_1ANT_SCOREBOARD_ONOFF, false);
6587 halbtc8822b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
6589 halbtc8822b1ant_set_ant_path(btcoexist,
6592 BT_8822B_1ANT_PHASE_WLAN_OFF);
6593 /* for test : s3 bt disppear , fail rate 1/600*/
6595 halbtc8822b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
6597 btcoexist->stop_coex_dm = true;
6601 void ex_halbtc8822b1ant_halt_notify(IN struct btc_coexist *btcoexist)
6604 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Halt notify\n");
6605 BTC_TRACE(trace_buf);
6607 halbtc8822b1ant_post_state_to_bt(btcoexist,
6608 BT_8822B_1ANT_SCOREBOARD_ACTIVE, false);
6609 halbtc8822b1ant_post_state_to_bt(btcoexist,
6610 BT_8822B_1ANT_SCOREBOARD_ONOFF, false);
6612 halbtc8822b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
6614 halbtc8822b1ant_set_ant_path(btcoexist,
6617 BT_8822B_1ANT_PHASE_WLAN_OFF);
6618 /* for test : s3 bt disppear , fail rate 1/600*/
6620 halbtc8822b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
6622 ex_halbtc8822b1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
6624 halbtc8822b1ant_enable_gnt_to_gpio(btcoexist, false);
6626 btcoexist->stop_coex_dm = true;
6630 void ex_halbtc8822b1ant_pnp_notify(IN struct btc_coexist *btcoexist,
6633 boolean wifi_under_5g = false;
6635 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Pnp notify\n");
6636 BTC_TRACE(trace_buf);
6638 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
6639 if (BTC_WIFI_PNP_SLEEP == pnp_state) {
6640 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6641 "[BTCoex], Pnp notify to SLEEP\n");
6642 BTC_TRACE(trace_buf);
6644 halbtc8822b1ant_post_state_to_bt(btcoexist,
6645 BT_8822B_1ANT_SCOREBOARD_ACTIVE, false);
6646 halbtc8822b1ant_post_state_to_bt(btcoexist,
6647 BT_8822B_1ANT_SCOREBOARD_ONOFF, false);
6649 halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
6651 halbtc8822b1ant_set_ant_path(btcoexist,
6654 BT_8822B_1ANT_PHASE_WLAN_OFF);
6656 halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
6659 halbtc8822b1ant_enable_gnt_to_gpio(btcoexist, false);
6661 btcoexist->stop_coex_dm = true;
6662 } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
6664 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6665 "[BTCoex], Pnp notify to WAKE UP\n");
6666 BTC_TRACE(trace_buf);
6668 halbtc8822b1ant_post_state_to_bt(btcoexist,
6669 BT_8822B_1ANT_SCOREBOARD_ACTIVE, true);
6670 halbtc8822b1ant_post_state_to_bt(btcoexist,
6671 BT_8822B_1ANT_SCOREBOARD_ONOFF, true);
6673 btcoexist->stop_coex_dm = false;
6677 void ex_halbtc8822b1ant_coex_dm_reset(IN struct btc_coexist *btcoexist)
6679 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6680 "[BTCoex], *****************Coex DM Reset*****************\n");
6681 BTC_TRACE(trace_buf);
6683 halbtc8822b1ant_init_hw_config(btcoexist, false, false);
6684 halbtc8822b1ant_init_coex_dm(btcoexist);
6687 void ex_halbtc8822b1ant_periodical(IN struct btc_coexist *btcoexist)
6690 struct btc_board_info *board_info = &btcoexist->board_info;
6691 boolean wifi_busy = false;
6692 u16 bt_scoreboard_val = 0;
6695 boolean bt_relink_finish = false;
6697 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6698 "[BTCoex], ==========================Periodical===========================\n");
6699 BTC_TRACE(trace_buf);
6701 #if (BT_AUTO_REPORT_ONLY_8822B_1ANT == 0)
6702 halbtc8822b1ant_query_bt_info(btcoexist);
6705 halbtc8822b1ant_monitor_bt_ctr(btcoexist);
6706 halbtc8822b1ant_monitor_wifi_ctr(btcoexist);
6708 halbtc8822b1ant_monitor_bt_enable_disable(btcoexist);
6710 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
6711 halbtc8822b1ant_read_score_board(btcoexist, &bt_scoreboard_val);
6714 halbtc8822b1ant_post_state_to_bt(btcoexist,
6715 BT_8822B_1ANT_SCOREBOARD_WLBUSY, true);
6716 if (bt_scoreboard_val & BIT(6))
6717 halbtc8822b1ant_query_bt_info(btcoexist);
6719 halbtc8822b1ant_post_state_to_bt(btcoexist,
6720 BT_8822B_1ANT_SCOREBOARD_WLBUSY, false);
6723 /* for 4-way, DHCP, EAPOL packet */
6724 if (coex_sta->specific_pkt_period_cnt > 0) {
6726 coex_sta->specific_pkt_period_cnt--;
6728 if ((coex_sta->specific_pkt_period_cnt == 0) &&
6729 (coex_sta->wifi_is_high_pri_task))
6730 coex_sta->wifi_is_high_pri_task = false;
6732 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
6733 "[BTCoex], ***************** Hi-Pri Task = %s*****************\n",
6734 (coex_sta->wifi_is_high_pri_task ? "Yes" :
6736 BTC_TRACE(trace_buf);
6739 if (!coex_sta->bt_disabled) {
6740 if (coex_sta->bt_coex_supported_feature == 0)
6741 btcoexist->btc_get(btcoexist, BTC_GET_U4_SUPPORTED_FEATURE, &coex_sta->bt_coex_supported_feature);
6743 if ((coex_sta->bt_coex_supported_version == 0) ||
6744 (coex_sta->bt_coex_supported_version == 0xffff))
6745 btcoexist->btc_get(btcoexist, BTC_GET_U4_SUPPORTED_VERSION, &coex_sta->bt_coex_supported_version);
6747 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
6748 btcoexist->bt_info.bt_get_fw_ver = bt_patch_ver;
6750 if (halbtc8822b1ant_is_wifi_status_changed(btcoexist))
6751 halbtc8822b1ant_run_coexist_mechanism(btcoexist);
6756 void ex_halbtc8822b1ant_antenna_detection(IN struct btc_coexist *btcoexist,
6757 IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds)
6761 void ex_halbtc8822b1ant_antenna_isolation(IN struct btc_coexist *btcoexist,
6762 IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds)
6768 void ex_halbtc8822b1ant_psd_scan(IN struct btc_coexist *btcoexist,
6769 IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds)
6775 void ex_halbtc8822b1ant_display_ant_detection(IN struct btc_coexist *btcoexist)
6780 void ex_halbtc8822b1ant_dbg_control(IN struct btc_coexist *btcoexist,
6781 IN u8 op_code, IN u8 op_len, IN u8 *pdata)
6783 #endif /* #if(BTC_COEX_OFFLOAD == 1) */
6789 void ex_halbtc8822b1ant_switch_band_without_bt(IN struct btc_coexist *btcoexist,
6790 IN boolean wifi_only_5g)
6792 /* ant switch WL2G or WL5G*/
6795 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd, 0x3, 1);
6799 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd, 0x3, 2);
6803 void ex_halbtc8822b1ant_init_hw_config_without_bt(IN struct btc_coexist
6808 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x1,
6811 /* Antenna config */
6812 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
6813 0x80, 0x0); /* 0x4c[23] = 0 */
6814 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
6815 0x01, 0x1); /* 0x4c[24] = 1 */
6816 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb4,
6817 0xff, 0x77); /* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as conctrol pin */
6820 /* Ext switch buffer mux */
6821 btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
6822 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991,
6824 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe,
6827 /*enable sw control gnt_wl=1 / gnt_bt=1 */
6828 btcoexist->btc_write_1byte(btcoexist, 0x73, 0x0e);
6830 btcoexist->btc_write_4byte(btcoexist, 0x1704,
6833 btcoexist->btc_write_4byte(btcoexist, 0x1700,
6837 #endif /* #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) */