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"
16 #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
18 #if (RTL8822B_SUPPORT == 1)
19 /* ************************************************************
20 * Global variables, these are static variables
21 * ************************************************************ */
22 static u8 *trace_buf = &gl_btc_trace_buf[0];
23 static struct coex_dm_8822b_2ant glcoex_dm_8822b_2ant;
24 static struct coex_dm_8822b_2ant *coex_dm = &glcoex_dm_8822b_2ant;
25 static struct coex_sta_8822b_2ant glcoex_sta_8822b_2ant;
26 static struct coex_sta_8822b_2ant *coex_sta = &glcoex_sta_8822b_2ant;
27 static struct psdscan_sta_8822b_2ant gl_psd_scan_8822b_2ant;
28 static struct psdscan_sta_8822b_2ant *psd_scan = &gl_psd_scan_8822b_2ant;
29 static struct rfe_type_8822b_2ant gl_rfe_type_8822b_2ant;
30 static struct rfe_type_8822b_2ant *rfe_type = &gl_rfe_type_8822b_2ant;
32 const char *const glbt_info_src_8822b_2ant[] = {
35 "BT Info[bt auto report]",
38 u32 glcoex_ver_date_8822b_2ant = 20161026;
39 u32 glcoex_ver_8822b_2ant = 0x34;
40 u32 glcoex_ver_btdesired_8822b_2ant = 0x28;
42 /* ************************************************************
43 * local function proto type if needed
44 * ************************************************************
45 * ************************************************************
46 * local function start with halbtc8822b2ant_
47 * ************************************************************ */
48 u8 halbtc8822b2ant_bt_rssi_state(u8 *ppre_bt_rssi_state, u8 level_num,
49 u8 rssi_thresh, u8 rssi_thresh1)
52 u8 bt_rssi_state = *ppre_bt_rssi_state;
54 bt_rssi = coex_sta->bt_rssi;
57 if ((*ppre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
58 (*ppre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
59 if (bt_rssi >= (rssi_thresh +
60 BTC_RSSI_COEX_THRESH_TOL_8822B_2ANT))
61 bt_rssi_state = BTC_RSSI_STATE_HIGH;
63 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
65 if (bt_rssi < rssi_thresh)
66 bt_rssi_state = BTC_RSSI_STATE_LOW;
68 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
70 } else if (level_num == 3) {
71 if (rssi_thresh > rssi_thresh1) {
72 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
73 "[BTCoex], BT Rssi thresh error!!\n");
75 return *ppre_bt_rssi_state;
78 if ((*ppre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
79 (*ppre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
80 if (bt_rssi >= (rssi_thresh +
81 BTC_RSSI_COEX_THRESH_TOL_8822B_2ANT))
82 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
84 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
85 } else if ((*ppre_bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
86 (*ppre_bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
87 if (bt_rssi >= (rssi_thresh1 +
88 BTC_RSSI_COEX_THRESH_TOL_8822B_2ANT))
89 bt_rssi_state = BTC_RSSI_STATE_HIGH;
90 else if (bt_rssi < rssi_thresh)
91 bt_rssi_state = BTC_RSSI_STATE_LOW;
93 bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
95 if (bt_rssi < rssi_thresh1)
96 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
98 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
102 *ppre_bt_rssi_state = bt_rssi_state;
104 return bt_rssi_state;
107 u8 halbtc8822b2ant_wifi_rssi_state(IN struct btc_coexist *btcoexist,
108 IN u8 *pprewifi_rssi_state, IN u8 level_num, IN u8 rssi_thresh,
112 u8 wifi_rssi_state = *pprewifi_rssi_state;
114 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
116 if (level_num == 2) {
117 if ((*pprewifi_rssi_state == BTC_RSSI_STATE_LOW) ||
118 (*pprewifi_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
119 if (wifi_rssi >= (rssi_thresh +
120 BTC_RSSI_COEX_THRESH_TOL_8822B_2ANT))
121 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
123 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
125 if (wifi_rssi < rssi_thresh)
126 wifi_rssi_state = BTC_RSSI_STATE_LOW;
128 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
130 } else if (level_num == 3) {
131 if (rssi_thresh > rssi_thresh1) {
132 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
133 "[BTCoex], wifi RSSI thresh error!!\n");
134 BTC_TRACE(trace_buf);
135 return *pprewifi_rssi_state;
138 if ((*pprewifi_rssi_state == BTC_RSSI_STATE_LOW) ||
139 (*pprewifi_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
140 if (wifi_rssi >= (rssi_thresh +
141 BTC_RSSI_COEX_THRESH_TOL_8822B_2ANT))
142 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
144 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
145 } else if ((*pprewifi_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
146 (*pprewifi_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
147 if (wifi_rssi >= (rssi_thresh1 +
148 BTC_RSSI_COEX_THRESH_TOL_8822B_2ANT))
149 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
150 else if (wifi_rssi < rssi_thresh)
151 wifi_rssi_state = BTC_RSSI_STATE_LOW;
153 wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
155 if (wifi_rssi < rssi_thresh1)
156 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
158 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
162 *pprewifi_rssi_state = wifi_rssi_state;
164 return wifi_rssi_state;
167 void halbtc8822b2ant_coex_switch_threshold(IN struct btc_coexist *btcoexist,
168 IN u8 isolation_measuared)
170 s8 interference_wl_tx = 0, interference_bt_tx = 0;
173 interference_wl_tx = BT_8822B_2ANT_WIFI_MAX_TX_POWER -
175 interference_bt_tx = BT_8822B_2ANT_BT_MAX_TX_POWER -
180 coex_sta->wifi_coex_thres = BT_8822B_2ANT_WIFI_RSSI_COEXSWITCH_THRES1;
181 coex_sta->wifi_coex_thres2 = BT_8822B_2ANT_WIFI_RSSI_COEXSWITCH_THRES2;
183 coex_sta->bt_coex_thres = BT_8822B_2ANT_BT_RSSI_COEXSWITCH_THRES1;
184 coex_sta->bt_coex_thres2 = BT_8822B_2ANT_BT_RSSI_COEXSWITCH_THRES2;
188 coex_sta->wifi_coex_thres = interference_wl_tx + BT_8822B_2ANT_WIFI_SIR_THRES1;
189 coex_sta->wifi_coex_thres2 = interference_wl_tx + BT_8822B_2ANT_WIFI_SIR_THRES2;
191 coex_sta->bt_coex_thres = interference_bt_tx + BT_8822B_2ANT_BT_SIR_THRES1;
192 coex_sta->bt_coex_thres2 = interference_bt_tx + BT_8822B_2ANT_BT_SIR_THRES2;
200 if ( BT_8822B_2ANT_WIFI_RSSI_COEXSWITCH_THRES1 < (isolation_measuared -
201 BT_8822B_2ANT_DEFAULT_ISOLATION) )
202 coex_sta->wifi_coex_thres = BT_8822B_2ANT_WIFI_RSSI_COEXSWITCH_THRES1;
204 coex_sta->wifi_coex_thres = BT_8822B_2ANT_WIFI_RSSI_COEXSWITCH_THRES1 - (isolation_measuared -
205 BT_8822B_2ANT_DEFAULT_ISOLATION);
207 if ( BT_8822B_2ANT_BT_RSSI_COEXSWITCH_THRES1 < (isolation_measuared -
208 BT_8822B_2ANT_DEFAULT_ISOLATION) )
209 coex_sta->bt_coex_thres = BT_8822B_2ANT_BT_RSSI_COEXSWITCH_THRES1;
211 coex_sta->bt_coex_thres = BT_8822B_2ANT_BT_RSSI_COEXSWITCH_THRES1 - (isolation_measuared -
212 BT_8822B_2ANT_DEFAULT_ISOLATION);
218 void halbtc8822b2ant_limited_rx(IN struct btc_coexist *btcoexist,
219 IN boolean force_exec, IN boolean rej_ap_agg_pkt,
220 IN boolean bt_ctrl_agg_buf_size, IN u8 agg_buf_size)
222 boolean reject_rx_agg = rej_ap_agg_pkt;
223 boolean bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
224 u8 rx_agg_size = agg_buf_size;
226 /* ============================================ */
227 /* Rx Aggregation related setting */
228 /* ============================================ */
229 btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
231 /* decide BT control aggregation buf size or not */
232 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
233 &bt_ctrl_rx_agg_size);
234 /* aggregation buf size, only work when BT control Rx aggregation size. */
235 btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
236 /* real update aggregation setting */
237 btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
240 void halbtc8822b2ant_query_bt_info(IN struct btc_coexist *btcoexist)
242 u8 h2c_parameter[1] = {0};
243 boolean RTL97F_8822B = false;
245 if (RTL97F_8822B == true)
248 coex_sta->c2h_bt_info_req_sent = true;
250 h2c_parameter[0] |= BIT(0); /* trigger */
252 btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
255 void halbtc8822b2ant_monitor_bt_ctr(IN struct btc_coexist *btcoexist)
257 u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
258 u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
259 static u8 num_of_bt_counter_chk = 0, cnt_slave = 0;
261 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
266 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
267 reg_hp_tx = u32tmp & MASKLWORD;
268 reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
270 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
271 reg_lp_tx = u32tmp & MASKLWORD;
272 reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
274 coex_sta->high_priority_tx = reg_hp_tx;
275 coex_sta->high_priority_rx = reg_hp_rx;
276 coex_sta->low_priority_tx = reg_lp_tx;
277 coex_sta->low_priority_rx = reg_lp_rx;
281 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
283 if ((coex_sta->low_priority_tx > 1050) &&
284 (!coex_sta->c2h_bt_inquiry_page))
285 coex_sta->pop_event_cnt++;
287 if ((coex_sta->low_priority_rx >= 950) &&
288 (coex_sta->low_priority_rx >= coex_sta->low_priority_tx)
289 && (!coex_sta->under_ips) && (!coex_sta->c2h_bt_inquiry_page) &&
290 (coex_sta->bt_link_exist)) {
291 if (cnt_slave >= 2) {
292 bt_link_info->slave_role = true;
297 if (cnt_slave == 0) {
298 bt_link_info->slave_role = false;
305 if ((coex_sta->high_priority_tx == 0) &&
306 (coex_sta->high_priority_rx == 0) &&
307 (coex_sta->low_priority_tx == 0) &&
308 (coex_sta->low_priority_rx == 0)) {
309 num_of_bt_counter_chk++;
310 if (num_of_bt_counter_chk >= 3) {
311 halbtc8822b2ant_query_bt_info(btcoexist);
312 num_of_bt_counter_chk = 0;
318 void halbtc8822b2ant_monitor_wifi_ctr(IN struct btc_coexist *btcoexist)
322 boolean wifi_busy = false, wifi_under_b_mode = false;
323 static u8 cck_lock_counter = 0;
324 u32 total_cnt, reg_val1, reg_val2;
326 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
327 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
328 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
331 if (coex_sta->under_ips) {
332 coex_sta->crc_ok_cck = 0;
333 coex_sta->crc_ok_11g = 0;
334 coex_sta->crc_ok_11n = 0;
335 coex_sta->crc_ok_11n_agg = 0;
337 coex_sta->crc_err_cck = 0;
338 coex_sta->crc_err_11g = 0;
339 coex_sta->crc_err_11n = 0;
340 coex_sta->crc_err_11n_agg = 0;
343 reg_val1 = btcoexist->btc_read_4byte(btcoexist, 0xf00);
344 reg_val2 = btcoexist->btc_read_4byte(btcoexist, 0xf04);
345 coex_sta->crc_ok_cck = reg_val2 & 0xffff;
346 coex_sta->crc_err_cck = (reg_val1 & 0xffff) + ((reg_val2
347 & 0xffff0000) >> 16);
349 reg_val1 = btcoexist->btc_read_4byte(btcoexist, 0xf0c);
350 coex_sta->crc_ok_11n_agg = reg_val1 & 0xffff;
351 coex_sta->crc_err_11n_agg = (reg_val1 & 0xffff0000) >>
354 reg_val1 = btcoexist->btc_read_4byte(btcoexist, 0xf10);
355 coex_sta->crc_ok_11n = reg_val1 & 0xffff;
356 coex_sta->crc_err_11n = (reg_val1 & 0xffff0000) >> 16;
358 reg_val1 = btcoexist->btc_read_4byte(btcoexist, 0xf14);
359 coex_sta->crc_ok_11g = reg_val1 & 0xffff;
360 coex_sta->crc_err_11n = (reg_val1 & 0xffff0000) >> 16;
365 /*btcoexist->btc_write_1byte_bitmask(btcoexist, 0xb58, 0x1, 0x1);*/
366 /*btcoexist->btc_write_1byte_bitmask(btcoexist, 0xb58, 0x1, 0x0);*/
368 if ((wifi_busy) && (wifi_rssi >= 30) && (!wifi_under_b_mode)) {
369 total_cnt = coex_sta->crc_ok_cck + coex_sta->crc_ok_11g
371 coex_sta->crc_ok_11n +
372 coex_sta->crc_ok_11n_agg;
374 if ((coex_dm->bt_status ==
375 BT_8822B_2ANT_BT_STATUS_ACL_BUSY) ||
376 (coex_dm->bt_status ==
377 BT_8822B_2ANT_BT_STATUS_ACL_SCO_BUSY) ||
378 (coex_dm->bt_status ==
379 BT_8822B_2ANT_BT_STATUS_SCO_BUSY)) {
380 if (coex_sta->crc_ok_cck > (total_cnt -
381 coex_sta->crc_ok_cck)) {
382 if (cck_lock_counter < 3)
385 if (cck_lock_counter > 0)
390 if (cck_lock_counter > 0)
394 if (cck_lock_counter > 0)
398 if (!coex_sta->pre_ccklock) {
400 if (cck_lock_counter >= 3)
401 coex_sta->cck_lock = true;
403 coex_sta->cck_lock = false;
405 if (cck_lock_counter == 0)
406 coex_sta->cck_lock = false;
408 coex_sta->cck_lock = true;
411 if (coex_sta->cck_lock)
412 coex_sta->cck_ever_lock = true;
414 coex_sta->pre_ccklock = coex_sta->cck_lock;
419 boolean halbtc8822b2ant_is_wifibt_status_changed(IN struct btc_coexist
422 static boolean pre_wifi_busy = false, pre_under_4way = false,
423 pre_bt_hs_on = false, pre_bt_off = false;
424 static u8 pre_hid_busy_num = 0;
425 boolean wifi_busy = false, under_4way = false, bt_hs_on = false;
426 boolean wifi_connected = false;
428 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
430 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
431 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
432 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
435 if (coex_sta->bt_disabled != pre_bt_off) {
436 pre_bt_off = coex_sta->bt_disabled;
438 if (coex_sta->bt_disabled)
439 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
440 "[BTCoex], BT is disabled !!\n");
442 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
443 "[BTCoex], BT is enabled !!\n");
445 BTC_TRACE(trace_buf);
447 coex_sta->bt_coex_supported_feature = 0;
448 coex_sta->bt_coex_supported_version = 0;
449 coex_sta->bt_ble_scan_type = 0;
450 coex_sta->bt_ble_scan_para[0] = 0;
451 coex_sta->bt_ble_scan_para[1] = 0;
452 coex_sta->bt_ble_scan_para[2] = 0;
453 coex_sta->bt_reg_vendor_ac = 0xffff;
454 coex_sta->bt_reg_vendor_ae = 0xffff;
459 if (wifi_connected) {
460 if (wifi_busy != pre_wifi_busy) {
461 pre_wifi_busy = wifi_busy;
464 if (under_4way != pre_under_4way) {
465 pre_under_4way = under_4way;
468 if (bt_hs_on != pre_bt_hs_on) {
469 pre_bt_hs_on = bt_hs_on;
473 if (!coex_sta->bt_disabled) {
475 if (coex_sta->hid_busy_num != pre_hid_busy_num) {
476 pre_hid_busy_num = coex_sta->hid_busy_num;
486 void halbtc8822b2ant_update_bt_link_info(IN struct btc_coexist *btcoexist)
489 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
490 boolean bt_hs_on = false;
491 boolean bt_busy = false;
493 coex_sta->num_of_profile = 0;
495 /* set link exist status */
496 if (!(coex_sta->bt_info & BT_INFO_8822B_1ANT_B_CONNECTION)) {
497 coex_sta->bt_link_exist = false;
498 coex_sta->pan_exist = false;
499 coex_sta->a2dp_exist = false;
500 coex_sta->hid_exist = false;
501 coex_sta->sco_exist = false;
502 } else { /* connection exists */
503 coex_sta->bt_link_exist = true;
504 if (coex_sta->bt_info & BT_INFO_8822B_1ANT_B_FTP) {
505 coex_sta->pan_exist = true;
506 coex_sta->num_of_profile++;
508 coex_sta->pan_exist = false;
510 if (coex_sta->bt_info & BT_INFO_8822B_1ANT_B_A2DP) {
511 coex_sta->a2dp_exist = true;
512 coex_sta->num_of_profile++;
514 coex_sta->a2dp_exist = false;
516 if (coex_sta->bt_info & BT_INFO_8822B_1ANT_B_HID) {
517 coex_sta->hid_exist = true;
518 coex_sta->num_of_profile++;
520 coex_sta->hid_exist = false;
522 if (coex_sta->bt_info & BT_INFO_8822B_1ANT_B_SCO_ESCO) {
523 coex_sta->sco_exist = true;
524 coex_sta->num_of_profile++;
526 coex_sta->sco_exist = false;
531 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
533 bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
534 bt_link_info->sco_exist = coex_sta->sco_exist;
535 bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
536 bt_link_info->pan_exist = coex_sta->pan_exist;
537 bt_link_info->hid_exist = coex_sta->hid_exist;
538 bt_link_info->acl_busy = coex_sta->acl_busy;
540 /* work around for HS mode. */
542 bt_link_info->pan_exist = true;
543 bt_link_info->bt_link_exist = true;
546 /* check if Sco only */
547 if (bt_link_info->sco_exist &&
548 !bt_link_info->a2dp_exist &&
549 !bt_link_info->pan_exist &&
550 !bt_link_info->hid_exist)
551 bt_link_info->sco_only = true;
553 bt_link_info->sco_only = false;
555 /* check if A2dp only */
556 if (!bt_link_info->sco_exist &&
557 bt_link_info->a2dp_exist &&
558 !bt_link_info->pan_exist &&
559 !bt_link_info->hid_exist)
560 bt_link_info->a2dp_only = true;
562 bt_link_info->a2dp_only = false;
564 /* check if Pan only */
565 if (!bt_link_info->sco_exist &&
566 !bt_link_info->a2dp_exist &&
567 bt_link_info->pan_exist &&
568 !bt_link_info->hid_exist)
569 bt_link_info->pan_only = true;
571 bt_link_info->pan_only = false;
573 /* check if Hid only */
574 if (!bt_link_info->sco_exist &&
575 !bt_link_info->a2dp_exist &&
576 !bt_link_info->pan_exist &&
577 bt_link_info->hid_exist)
578 bt_link_info->hid_only = true;
580 bt_link_info->hid_only = false;
582 if (!(coex_sta->bt_info & BT_INFO_8822B_2ANT_B_CONNECTION)) {
583 coex_dm->bt_status = BT_8822B_2ANT_BT_STATUS_NON_CONNECTED_IDLE;
584 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
585 "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
586 } else if (coex_sta->bt_info == BT_INFO_8822B_2ANT_B_CONNECTION) {
587 /* connection exists but no busy */
588 coex_dm->bt_status = BT_8822B_2ANT_BT_STATUS_CONNECTED_IDLE;
589 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
590 "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
591 } else if (((coex_sta->bt_info & BT_INFO_8822B_2ANT_B_SCO_ESCO) ||
592 (coex_sta->bt_info & BT_INFO_8822B_2ANT_B_SCO_BUSY)) &&
593 (coex_sta->bt_info & BT_INFO_8822B_2ANT_B_ACL_BUSY)) {
594 coex_dm->bt_status = BT_8822B_2ANT_BT_STATUS_ACL_SCO_BUSY;
595 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
596 "[BTCoex], BtInfoNotify(), BT ACL SCO busy!!!\n");
597 } else if ((coex_sta->bt_info & BT_INFO_8822B_2ANT_B_SCO_ESCO) ||
598 (coex_sta->bt_info & BT_INFO_8822B_2ANT_B_SCO_BUSY)) {
599 coex_dm->bt_status = BT_8822B_2ANT_BT_STATUS_SCO_BUSY;
600 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
601 "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
602 } else if (coex_sta->bt_info & BT_INFO_8822B_2ANT_B_ACL_BUSY) {
603 coex_dm->bt_status = BT_8822B_2ANT_BT_STATUS_ACL_BUSY;
604 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
605 "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
607 coex_dm->bt_status = BT_8822B_2ANT_BT_STATUS_MAX;
608 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
609 "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
612 BTC_TRACE(trace_buf);
614 if ((BT_8822B_2ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
615 (BT_8822B_2ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
616 (BT_8822B_2ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
621 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
624 void halbtc8822b2ant_update_wifi_channel_info(IN struct btc_coexist *btcoexist,
627 u8 h2c_parameter[3] = {0};
629 u8 wifi_central_chnl;
630 u32 RTL97F_8822B = 0;
632 if (RTL97F_8822B == true)
635 /* only 2.4G we need to inform bt the chnl mask */
636 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
638 if ((BTC_MEDIA_CONNECT == type) &&
639 (wifi_central_chnl <= 14)) {
641 0x1; /* enable BT AFH skip WL channel for 8822b because BT Rx LO interference */
642 /* h2c_parameter[0] = 0x0; */
643 h2c_parameter[1] = wifi_central_chnl;
644 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
645 if (BTC_WIFI_BW_HT40 == wifi_bw)
646 h2c_parameter[2] = 0x30;
648 h2c_parameter[2] = 0x20;
651 coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
652 coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
653 coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
655 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
659 void halbtc8822b2ant_set_fw_dac_swing_level(IN struct btc_coexist *btcoexist,
662 u8 h2c_parameter[1] = {0};
663 u32 RTL97F_8822B = 0;
665 if (RTL97F_8822B == true)
668 /* There are several type of dacswing */
669 /* 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 */
670 h2c_parameter[0] = dac_swing_lvl;
672 btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);
675 void halbtc8822b2ant_fw_dac_swing_lvl(IN struct btc_coexist *btcoexist,
676 IN boolean force_exec, IN u8 fw_dac_swing_lvl)
678 u32 RTL97F_8822B = 0;
680 if (RTL97F_8822B == true)
683 coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl;
686 if (coex_dm->pre_fw_dac_swing_lvl ==
687 coex_dm->cur_fw_dac_swing_lvl)
691 halbtc8822b2ant_set_fw_dac_swing_level(btcoexist,
692 coex_dm->cur_fw_dac_swing_lvl);
694 coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;
697 void halbtc8822b2ant_set_fw_dec_bt_pwr(IN struct btc_coexist *btcoexist,
698 IN u8 dec_bt_pwr_lvl)
700 u32 RTL97F_8822B = 0;
701 u8 h2c_parameter[1] = {0};
703 if (RTL97F_8822B == true)
706 h2c_parameter[0] = dec_bt_pwr_lvl;
708 btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter);
711 void halbtc8822b2ant_dec_bt_pwr(IN struct btc_coexist *btcoexist,
712 IN boolean force_exec, IN u8 dec_bt_pwr_lvl)
714 coex_dm->cur_bt_dec_pwr_lvl = dec_bt_pwr_lvl;
717 if (coex_dm->pre_bt_dec_pwr_lvl == coex_dm->cur_bt_dec_pwr_lvl)
720 halbtc8822b2ant_set_fw_dec_bt_pwr(btcoexist,
721 coex_dm->cur_bt_dec_pwr_lvl);
723 coex_dm->pre_bt_dec_pwr_lvl = coex_dm->cur_bt_dec_pwr_lvl;
727 void halbtc8822b2ant_low_penalty_ra(IN struct btc_coexist *btcoexist,
728 IN boolean force_exec, IN boolean low_penalty_ra)
732 coex_dm->cur_low_penalty_ra = low_penalty_ra;
735 if (coex_dm->pre_low_penalty_ra ==
736 coex_dm->cur_low_penalty_ra)
741 btcoexist->btc_phydm_modify_RA_PCR_threshold(btcoexist, 0, 50);
743 btcoexist->btc_phydm_modify_RA_PCR_threshold(btcoexist, 0, 0);
745 coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
752 void halbtc8822b2ant_set_bt_auto_report(IN struct btc_coexist *btcoexist,
753 IN boolean enable_auto_report)
755 u8 h2c_parameter[1] = {0};
756 u32 RTL97F_8822B = 0;
758 if (RTL97F_8822B == true)
761 h2c_parameter[0] = 0;
763 if (enable_auto_report)
764 h2c_parameter[0] |= BIT(0);
766 btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
769 void halbtc8822b2ant_bt_auto_report(IN struct btc_coexist *btcoexist,
770 IN boolean force_exec, IN boolean enable_auto_report)
772 coex_dm->cur_bt_auto_report = enable_auto_report;
775 if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
778 halbtc8822b2ant_set_bt_auto_report(btcoexist,
779 coex_dm->cur_bt_auto_report);
781 coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
784 void halbtc8822b2ant_write_score_board(
785 IN struct btc_coexist *btcoexist,
791 static u16 originalval = 0x8002;
794 originalval = originalval | bitpos;
796 originalval = originalval & (~bitpos);
799 btcoexist->btc_write_2byte(btcoexist, 0xaa, originalval);
803 void halbtc8822b2ant_read_score_board(
804 IN struct btc_coexist *btcoexist,
805 IN u16 *score_board_val
809 *score_board_val = (btcoexist->btc_read_2byte(btcoexist,
813 void halbtc8822b2ant_post_state_to_bt(
814 IN struct btc_coexist *btcoexist,
820 halbtc8822b2ant_write_score_board(btcoexist, (u16) type, state);
826 void halbtc8822b2ant_monitor_bt_enable_disable(IN struct btc_coexist *btcoexist)
828 static u32 bt_disable_cnt = 0;
829 boolean bt_active = true, bt_disabled = false, wifi_under_5g = false;
832 /* This function check if bt is disabled */
834 if (coex_sta->high_priority_tx == 0 &&
835 coex_sta->high_priority_rx == 0 &&
836 coex_sta->low_priority_tx == 0 &&
837 coex_sta->low_priority_rx == 0)
839 if (coex_sta->high_priority_tx == 0xffff &&
840 coex_sta->high_priority_rx == 0xffff &&
841 coex_sta->low_priority_tx == 0xffff &&
842 coex_sta->low_priority_rx == 0xffff)
848 /* Read BT on/off status from scoreboard[1], enable this only if BT patch support this feature */
849 halbtc8822b2ant_read_score_board(btcoexist, &u16tmp);
851 bt_active = u16tmp & BIT(1);
859 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
864 if (bt_disable_cnt >= 10) {
869 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
873 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
875 if ((wifi_under_5g) || (bt_disabled))
876 halbtc8822b2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, false);
878 halbtc8822b2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, true);
881 if (coex_sta->bt_disabled != bt_disabled) {
882 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
883 "[BTCoex], BT is from %s to %s!!\n",
884 (coex_sta->bt_disabled ? "disabled" : "enabled"),
885 (bt_disabled ? "disabled" : "enabled"));
886 BTC_TRACE(trace_buf);
887 coex_sta->bt_disabled = bt_disabled;
892 void halbtc8822b2ant_enable_gnt_to_gpio(IN struct btc_coexist *btcoexist,
895 #if BT_8822B_2ANT_COEX_DBG
896 static u8 bitVal[5] = {0, 0, 0, 0, 0};
897 static boolean state = false;
899 if (state ==isenable)
906 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
907 "[BTCoex], enable_gnt_to_gpio!!\n");
908 BTC_TRACE(trace_buf);
910 /* enable GNT_WL, GNT_BT to GPIO for debug */
911 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x8, 0x1);
913 /* store original value */
914 bitVal[0] = (btcoexist->btc_read_1byte(btcoexist,
915 0x66) & BIT(4)) >> 4; /*0x66[4] */
916 bitVal[1] = (btcoexist->btc_read_1byte(btcoexist,
917 0x67) & BIT(0)); /*0x66[8] */
918 bitVal[2] = (btcoexist->btc_read_1byte(btcoexist,
919 0x42) & BIT(3)) >> 3; /*0x40[19] */
920 bitVal[3] = (btcoexist->btc_read_1byte(btcoexist,
921 0x65) & BIT(7)) >> 7; /*0x64[15] */
922 bitVal[4] = (btcoexist->btc_read_1byte(btcoexist,
923 0x72) & BIT(2)) >> 2; /*0x70[18] */
925 /* switch GPIO Mux */
926 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x66, BIT(4),
927 0x0); /*0x66[4] = 0 */
928 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, BIT(0),
929 0x0); /*0x66[8] = 0 */
930 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x42, BIT(3),
931 0x0); /*0x40[19] = 0 */
932 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x65, BIT(7),
933 0x0); /*0x64[15] = 0 */
934 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x72, BIT(2),
935 0x0); /*0x70[18] = 0 */
939 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
940 "[BTCoex], disable_gnt_to_gpio!!\n");
941 BTC_TRACE(trace_buf);
943 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x8, 0x0);
945 /* Restore original value */
946 /* switch GPIO Mux */
947 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x66, BIT(4),
948 bitVal[0]); /*0x66[4] = 0 */
949 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, BIT(0),
950 bitVal[1]); /*0x66[8] = 0 */
951 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x42, BIT(3),
952 bitVal[2]); /*0x40[19] = 0 */
953 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x65, BIT(7),
954 bitVal[3]); /*0x64[15] = 0 */
955 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x72, BIT(2),
956 bitVal[4]); /*0x70[18] = 0 */
962 u32 halbtc8822b2ant_ltecoex_indirect_read_reg(IN struct btc_coexist *btcoexist,
968 /* wait for ready bit before access 0x1700 */
969 btcoexist->btc_write_4byte(btcoexist, 0x1700, 0x800F0000 | reg_addr);
973 } while (((btcoexist->btc_read_1byte(btcoexist,
974 0x1703)&BIT(5)) == 0) &&
975 (j < BT_8822B_2ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT));
978 return btcoexist->btc_read_4byte(btcoexist,
979 0x1708); /* get read data */
983 void halbtc8822b2ant_ltecoex_indirect_write_reg(IN struct btc_coexist
985 IN u16 reg_addr, IN u32 bit_mask, IN u32 reg_value)
987 u32 val, i = 0, j = 0, bitpos = 0;
992 if (bit_mask == 0xffffffff) {
993 btcoexist->btc_write_4byte(btcoexist, 0x1704,
994 reg_value); /* put write data */
996 /* wait for ready bit before access 0x1700 */
999 } while (((btcoexist->btc_read_1byte(btcoexist,
1000 0x1703)&BIT(5)) == 0) &&
1001 (j < BT_8822B_2ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT));
1004 btcoexist->btc_write_4byte(btcoexist, 0x1700,
1005 0xc00F0000 | reg_addr);
1007 for (i = 0; i <= 31; i++) {
1008 if (((bit_mask >> i) & 0x1) == 0x1) {
1014 /* read back register value before write */
1015 val = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist,
1017 val = (val & (~bit_mask)) | (reg_value << bitpos);
1019 btcoexist->btc_write_4byte(btcoexist, 0x1704,
1020 val); /* put write data */
1022 /* wait for ready bit before access 0x7c0 */
1025 } while (((btcoexist->btc_read_1byte(btcoexist,
1026 0x1703)&BIT(5)) == 0) &&
1027 (j < BT_8822B_2ANT_LTECOEX_INDIRECTREG_ACCESS_TIMEOUT));
1030 btcoexist->btc_write_4byte(btcoexist, 0x1700,
1031 0xc00F0000 | reg_addr);
1037 void halbtc8822b2ant_ltecoex_enable(IN struct btc_coexist *btcoexist,
1042 val = (enable) ? 1 : 0;
1043 halbtc8822b2ant_ltecoex_indirect_write_reg(btcoexist, 0x38, 0x80,
1048 void halbtc8822b2ant_ltecoex_pathcontrol_owner(IN struct btc_coexist *btcoexist,
1049 IN boolean wifi_control)
1053 val = (wifi_control) ? 1 : 0;
1054 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x4,
1055 val); /* 0x70[26] */
1059 void halbtc8822b2ant_ltecoex_set_gnt_bt(IN struct btc_coexist *btcoexist,
1060 IN u8 control_block, IN boolean sw_control, IN u8 state)
1062 u32 val = 0, bit_mask;
1064 state = state & 0x1;
1065 val = (sw_control) ? ((state << 1) | 0x1) : 0;
1067 switch (control_block) {
1068 case BT_8822B_2ANT_GNT_BLOCK_RFC_BB:
1071 halbtc8822b2ant_ltecoex_indirect_write_reg(btcoexist,
1072 0x38, bit_mask, val); /* 0x38[15:14] */
1074 halbtc8822b2ant_ltecoex_indirect_write_reg(btcoexist,
1075 0x38, bit_mask, val); /* 0x38[11:10] */
1077 case BT_8822B_2ANT_GNT_BLOCK_RFC:
1079 halbtc8822b2ant_ltecoex_indirect_write_reg(btcoexist,
1080 0x38, bit_mask, val); /* 0x38[15:14] */
1082 case BT_8822B_2ANT_GNT_BLOCK_BB:
1084 halbtc8822b2ant_ltecoex_indirect_write_reg(btcoexist,
1085 0x38, bit_mask, val); /* 0x38[11:10] */
1092 void halbtc8822b2ant_ltecoex_set_gnt_wl(IN struct btc_coexist *btcoexist,
1093 IN u8 control_block, IN boolean sw_control, IN u8 state)
1095 u32 val = 0, bit_mask;
1097 state = state & 0x1;
1098 val = (sw_control) ? ((state << 1) | 0x1) : 0;
1100 switch (control_block) {
1101 case BT_8822B_2ANT_GNT_BLOCK_RFC_BB:
1104 halbtc8822b2ant_ltecoex_indirect_write_reg(btcoexist,
1105 0x38, bit_mask, val); /* 0x38[13:12] */
1107 halbtc8822b2ant_ltecoex_indirect_write_reg(btcoexist,
1108 0x38, bit_mask, val); /* 0x38[9:8] */
1110 case BT_8822B_2ANT_GNT_BLOCK_RFC:
1112 halbtc8822b2ant_ltecoex_indirect_write_reg(btcoexist,
1113 0x38, bit_mask, val); /* 0x38[13:12] */
1115 case BT_8822B_2ANT_GNT_BLOCK_BB:
1117 halbtc8822b2ant_ltecoex_indirect_write_reg(btcoexist,
1118 0x38, bit_mask, val); /* 0x38[9:8] */
1125 void halbtc8822b2ant_ltecoex_set_coex_table(IN struct btc_coexist *btcoexist,
1126 IN u8 table_type, IN u16 table_content)
1128 u16 reg_addr = 0x0000;
1130 switch (table_type) {
1131 case BT_8822B_2ANT_CTT_WL_VS_LTE:
1134 case BT_8822B_2ANT_CTT_BT_VS_LTE:
1139 if (reg_addr != 0x0000)
1140 halbtc8822b2ant_ltecoex_indirect_write_reg(btcoexist, reg_addr,
1141 0xffff, table_content); /* 0xa0[15:0] or 0xa4[15:0] */
1147 void halbtc8822b2ant_ltecoex_set_break_table(IN struct btc_coexist *btcoexist,
1148 IN u8 table_type, IN u8 table_content)
1150 u16 reg_addr = 0x0000;
1152 switch (table_type) {
1153 case BT_8822B_2ANT_LBTT_WL_BREAK_LTE:
1156 case BT_8822B_2ANT_LBTT_BT_BREAK_LTE:
1159 case BT_8822B_2ANT_LBTT_LTE_BREAK_WL:
1162 case BT_8822B_2ANT_LBTT_LTE_BREAK_BT:
1167 if (reg_addr != 0x0000)
1168 halbtc8822b2ant_ltecoex_indirect_write_reg(btcoexist, reg_addr,
1169 0xff, table_content); /* 0xa8[15:0] or 0xb4[15:0] */
1175 void halbtc8822b2ant_set_coex_table(IN struct btc_coexist *btcoexist,
1176 IN u32 val0x6c0, IN u32 val0x6c4, IN u32 val0x6c8, IN u8 val0x6cc)
1178 btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
1180 btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
1182 btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
1184 btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
1187 void halbtc8822b2ant_coex_table(IN struct btc_coexist *btcoexist,
1188 IN boolean force_exec, IN u32 val0x6c0, IN u32 val0x6c4,
1189 IN u32 val0x6c8, IN u8 val0x6cc)
1191 coex_dm->cur_val0x6c0 = val0x6c0;
1192 coex_dm->cur_val0x6c4 = val0x6c4;
1193 coex_dm->cur_val0x6c8 = val0x6c8;
1194 coex_dm->cur_val0x6cc = val0x6cc;
1197 if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
1198 (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
1199 (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
1200 (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
1203 halbtc8822b2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8,
1206 coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
1207 coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
1208 coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
1209 coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
1212 void halbtc8822b2ant_coex_table_with_type(IN struct btc_coexist *btcoexist,
1213 IN boolean force_exec, IN u8 type)
1218 coex_sta->coex_table_type = type;
1220 if (coex_sta->concurrent_rx_mode_on == true) {
1221 break_table = 0xf0ffffff; /* set WL hi-pri can break BT */
1223 0x3; /* 0xb/0x3,set Tx response = Hi-Pri/LO-Pri (ex: Transmitting ACK,BA,CTS) */
1225 break_table = 0xffffff;
1231 halbtc8822b2ant_coex_table(btcoexist, force_exec,
1232 0x55555555, 0x55555555, break_table, select_table);
1235 halbtc8822b2ant_coex_table(btcoexist, force_exec,
1236 0x55555555, 0x5a5a5a5a, break_table, select_table);
1239 halbtc8822b2ant_coex_table(btcoexist, force_exec,
1240 0x5a5a5a5a, 0x5a5a5a5a, break_table, select_table);
1243 halbtc8822b2ant_coex_table(btcoexist, force_exec,
1244 0x5a5a5a5a, 0x5a5a5a5a, break_table, select_table);
1247 halbtc8822b2ant_coex_table(btcoexist, force_exec,
1248 0x55555555, 0x5a5a5a5a, break_table, select_table);
1251 halbtc8822b2ant_coex_table(btcoexist, force_exec,
1252 0x55555555, 0x5a5a5a5a, break_table, select_table);
1255 halbtc8822b2ant_coex_table(btcoexist, force_exec,
1256 0x55555555, 0xaaaa5aaa, break_table, select_table);
1259 halbtc8822b2ant_coex_table(btcoexist, force_exec,
1260 0xa5555555, 0xaa5a5a5a, break_table, select_table);
1263 halbtc8822b2ant_coex_table(btcoexist, force_exec,
1264 0x55555555, 0x5a5a5a5a, break_table, select_table);
1267 halbtc8822b2ant_coex_table(btcoexist, force_exec,
1268 0x55555555, 0xaaaa555a, break_table, select_table);
1271 halbtc8822b2ant_coex_table(btcoexist, force_exec,
1272 0x55555555, 0xaaaa5aaa, break_table, select_table);
1275 halbtc8822b2ant_coex_table(btcoexist, force_exec,
1276 0x55555555, 0xaaaaa5aa, break_table, select_table);
1283 void halbtc8822b2ant_set_fw_ignore_wlan_act(IN struct btc_coexist *btcoexist,
1286 u8 h2c_parameter[1] = {0};
1287 u32 RTL97F_8822B = 0;
1289 if (RTL97F_8822B == true)
1293 h2c_parameter[0] |= BIT(0); /* function enable */
1295 btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
1298 void halbtc8822b2ant_ignore_wlan_act(IN struct btc_coexist *btcoexist,
1299 IN boolean force_exec, IN boolean enable)
1301 coex_dm->cur_ignore_wlan_act = enable;
1304 if (coex_dm->pre_ignore_wlan_act ==
1305 coex_dm->cur_ignore_wlan_act)
1308 halbtc8822b2ant_set_fw_ignore_wlan_act(btcoexist, enable);
1310 coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
1313 void halbtc8822b2ant_set_lps_rpwm(IN struct btc_coexist *btcoexist,
1314 IN u8 lps_val, IN u8 rpwm_val)
1319 btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
1320 btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
1323 void halbtc8822b2ant_lps_rpwm(IN struct btc_coexist *btcoexist,
1324 IN boolean force_exec, IN u8 lps_val, IN u8 rpwm_val)
1326 coex_dm->cur_lps = lps_val;
1327 coex_dm->cur_rpwm = rpwm_val;
1330 if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
1331 (coex_dm->pre_rpwm == coex_dm->cur_rpwm))
1334 halbtc8822b2ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
1336 coex_dm->pre_lps = coex_dm->cur_lps;
1337 coex_dm->pre_rpwm = coex_dm->cur_rpwm;
1340 void halbtc8822b2ant_ps_tdma_check_for_power_save_state(
1341 IN struct btc_coexist *btcoexist, IN boolean new_ps_state)
1344 u8 h2c_parameter[5] = {0, 0, 0, 0x40, 0};
1345 u32 RTL97F_8822B = 0;
1347 if (RTL97F_8822B == true)
1350 btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1352 if (lps_mode) { /* already under LPS state */
1354 /* keep state under LPS, do nothing. */
1356 /* will leave LPS state, turn off psTdma first */
1357 /*halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
1359 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5,
1362 } else { /* NO PS state */
1364 /* will enter LPS state, turn off psTdma first */
1365 /*halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
1367 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5,
1370 /* keep state under NO PS state, do nothing. */
1375 void halbtc8822b2ant_power_save_state(IN struct btc_coexist *btcoexist,
1376 IN u8 ps_type, IN u8 lps_val, IN u8 rpwm_val)
1378 boolean low_pwr_disable = false;
1381 case BTC_PS_WIFI_NATIVE:
1382 /* recover to original 32k low power setting */
1383 low_pwr_disable = false;
1384 btcoexist->btc_set(btcoexist,
1385 BTC_SET_ACT_DISABLE_LOW_POWER,
1387 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS,
1389 coex_sta->force_lps_on = false;
1392 halbtc8822b2ant_ps_tdma_check_for_power_save_state(
1394 halbtc8822b2ant_lps_rpwm(btcoexist, NORMAL_EXEC,
1396 /* when coex force to enter LPS, do not enter 32k low power. */
1397 low_pwr_disable = true;
1398 btcoexist->btc_set(btcoexist,
1399 BTC_SET_ACT_DISABLE_LOW_POWER,
1401 /* power save must executed before psTdma. */
1402 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS,
1404 coex_sta->force_lps_on = true;
1406 case BTC_PS_LPS_OFF:
1407 halbtc8822b2ant_ps_tdma_check_for_power_save_state(
1409 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS,
1411 coex_sta->force_lps_on = false;
1420 void halbtc8822b2ant_set_fw_pstdma(IN struct btc_coexist *btcoexist,
1421 IN u8 byte1, IN u8 byte2, IN u8 byte3, IN u8 byte4, IN u8 byte5)
1423 u8 h2c_parameter[5] = {0};
1424 u8 real_byte1 = byte1, real_byte5 = byte5;
1425 boolean ap_enable = false;
1427 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1431 if (byte1 & BIT(4) && !(byte1 & BIT(5))) {
1432 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1433 "[BTCoex], FW for AP mode\n");
1434 BTC_TRACE(trace_buf);
1435 real_byte1 &= ~BIT(4);
1436 real_byte1 |= BIT(5);
1438 real_byte5 |= BIT(5);
1439 real_byte5 &= ~BIT(6);
1441 halbtc8822b2ant_power_save_state(btcoexist,
1442 BTC_PS_WIFI_NATIVE, 0x0,
1445 } else if (byte1 & BIT(4) && !(byte1 & BIT(5))) {
1447 halbtc8822b2ant_power_save_state(
1448 btcoexist, BTC_PS_LPS_ON, 0x50,
1451 halbtc8822b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1457 h2c_parameter[0] = real_byte1;
1458 h2c_parameter[1] = byte2;
1459 h2c_parameter[2] = byte3;
1460 h2c_parameter[3] = byte4;
1461 h2c_parameter[4] = real_byte5;
1463 coex_dm->ps_tdma_para[0] = real_byte1;
1464 coex_dm->ps_tdma_para[1] = byte2;
1465 coex_dm->ps_tdma_para[2] = byte3;
1466 coex_dm->ps_tdma_para[3] = byte4;
1467 coex_dm->ps_tdma_para[4] = real_byte5;
1469 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1472 void halbtc8822b2ant_ps_tdma(IN struct btc_coexist *btcoexist,
1473 IN boolean force_exec, IN boolean turn_on, IN u8 type)
1476 static u8 psTdmaByte4Modify = 0x0, pre_psTdmaByte4Modify = 0x0;
1477 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1480 coex_dm->cur_ps_tdma_on = turn_on;
1481 coex_dm->cur_ps_tdma = type;
1483 /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
1484 if ((bt_link_info->slave_role) && (bt_link_info->a2dp_exist))
1485 psTdmaByte4Modify = 0x1;
1487 psTdmaByte4Modify = 0x0;
1489 if (pre_psTdmaByte4Modify != psTdmaByte4Modify) {
1492 pre_psTdmaByte4Modify = psTdmaByte4Modify;
1496 if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1497 (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1501 if (coex_dm->cur_ps_tdma_on) {
1502 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1503 "[BTCoex], ********** TDMA(on, %d) **********\n",
1504 coex_dm->cur_ps_tdma);
1505 BTC_TRACE(trace_buf);
1507 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8,
1508 0x1); /* enable TBTT nterrupt */
1510 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1511 "[BTCoex], ********** TDMA(off, %d) **********\n",
1512 coex_dm->cur_ps_tdma);
1513 BTC_TRACE(trace_buf);
1520 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xe3,
1522 0x54 | psTdmaByte4Modify);
1526 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xe3,
1528 0x11 | psTdmaByte4Modify);
1531 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xe3,
1533 0x10 | psTdmaByte4Modify);
1536 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xe3,
1538 0x10 | psTdmaByte4Modify);
1541 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xe3,
1543 0x10 | psTdmaByte4Modify);
1546 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xe3,
1548 0x10 | psTdmaByte4Modify);
1551 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xe3,
1553 0x10 | psTdmaByte4Modify);
1556 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xe3,
1558 0x10 | psTdmaByte4Modify);
1561 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xe3,
1563 0x11 | psTdmaByte4Modify);
1566 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xe3,
1568 0x10 | psTdmaByte4Modify);
1571 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xe3,
1576 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xe3,
1578 0x10 | psTdmaByte4Modify);
1581 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xd3,
1583 0x54 | psTdmaByte4Modify);
1586 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xe3,
1588 0x11 | psTdmaByte4Modify);
1591 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xd3,
1593 0x50 | psTdmaByte4Modify);
1596 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xd3,
1598 0x50 | psTdmaByte4Modify);
1601 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xd3,
1603 0x50 | psTdmaByte4Modify);
1606 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xd3,
1608 0x50 | psTdmaByte4Modify);
1611 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xd3,
1613 0x50 | psTdmaByte4Modify);
1616 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0xd3,
1618 0x50 | psTdmaByte4Modify);
1622 /* disable PS tdma */
1625 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0x0,
1626 0x0, 0x0, 0x40, 0x0);
1629 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0x0,
1630 0x0, 0x0, 0x48, 0x0);
1633 halbtc8822b2ant_set_fw_pstdma(btcoexist, 0x0,
1634 0x0, 0x0, 0x40, 0x0);
1639 /* update pre state */
1640 coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1641 coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1644 void halbtc8822b2ant_set_ext_band_switch(IN struct btc_coexist *btcoexist,
1645 IN boolean force_exec, IN u8 pos_type)
1649 boolean switch_polatiry_inverse = false;
1651 u32 u32tmp1 = 0, u32tmp2 = 0;
1653 if (!rfe_type->ext_band_switch_exist)
1656 coex_dm->cur_ext_band_switch_status = pos_type;
1659 if (coex_dm->pre_ext_band_switch_status ==
1660 coex_dm->cur_ext_band_switch_status)
1664 coex_dm->pre_ext_band_switch_status =
1665 coex_dm->cur_ext_band_switch_status;
1667 /* swap control polarity if use different switch control polarity*/
1668 switch_polatiry_inverse = (rfe_type->ext_band_switch_ctrl_polarity == 1
1669 ? ~switch_polatiry_inverse : switch_polatiry_inverse);
1671 /*swap control polarity for WL_A, default polarity 0xcb4[21] = 0 && 0xcb4[23] = 1 is for WL_G */
1672 switch_polatiry_inverse = (pos_type ==
1673 BT_8822B_2ANT_EXT_BAND_SWITCH_TO_WLA ? ~switch_polatiry_inverse
1674 : switch_polatiry_inverse);
1676 regval_0xcb6 = btcoexist->btc_read_1byte(btcoexist, 0xcb6);
1678 /* for normal switch polrity, 0xcb4[21] =1 && 0xcb4[23] = 0 for WL_A, vice versa */
1679 regval_0xcb6 = (switch_polatiry_inverse == 1 ? ((regval_0xcb6 & (~(BIT(
1680 7)))) | BIT(5)) : ((regval_0xcb6 & (~(BIT(5)))) | BIT(7)));
1682 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb6, 0xff,
1685 u32tmp1 = btcoexist->btc_read_4byte(btcoexist, 0xcb0);
1686 u32tmp2 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
1688 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1689 "[BTCoex], ********** (After Ext Band switch setup) 0xcb0 = 0x%08x, 0xcb4 = 0x%08x**********\n",
1691 BTC_TRACE(trace_buf);
1696 /*anttenna control by bb mac bt antdiv pta to write 0x4c 0xcb4,0xcbd*/
1697 void halbtc8822b2ant_set_ext_ant_switch(IN struct btc_coexist *btcoexist,
1698 IN boolean force_exec, IN u8 ctrl_type, IN u8 pos_type)
1701 struct btc_board_info *board_info = &btcoexist->board_info;
1702 boolean switch_polatiry_inverse = false;
1703 u8 regval_0xcbc = 0, regval_0x64;
1704 u32 u32tmp1 = 0, u32tmp2 = 0, u32tmp3 = 0;
1706 if (!rfe_type->ext_ant_switch_exist)
1709 coex_dm->cur_ext_ant_switch_status = (ctrl_type << 8) + pos_type;
1712 if (coex_dm->pre_ext_ant_switch_status ==
1713 coex_dm->cur_ext_ant_switch_status)
1716 coex_dm->pre_ext_ant_switch_status = coex_dm->cur_ext_ant_switch_status;
1720 case BT_8822B_2ANT_EXT_ANT_SWITCH_MAIN_TO_BT:
1721 case BT_8822B_2ANT_EXT_ANT_SWITCH_MAIN_TO_NOCARE:
1723 case BT_8822B_2ANT_EXT_ANT_SWITCH_MAIN_TO_WLG:
1725 case BT_8822B_2ANT_EXT_ANT_SWITCH_MAIN_TO_WLA:
1729 if (board_info->ant_div_cfg)
1730 /*ctrl_type = BT_8822B_2ANT_EXT_ANT_SWITCH_CTRL_BY_ANTDIV;*/
1732 /* Ext switch buffer mux */
1733 btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
1734 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991, 0x3, 0x0);
1735 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe, 0x8, 0x0);
1738 switch (ctrl_type) {
1740 case BT_8822B_2ANT_EXT_ANT_SWITCH_CTRL_BY_BBSW:
1741 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
1742 0x80, 0x0); /* 0x4c[23] = 0 */
1743 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
1744 0x01, 0x1); /* 0x4c[24] = 1 */
1745 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb4,
1746 0xff, 0x77); /* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as conctrol pin */
1748 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
1752 case BT_8822B_2ANT_EXT_ANT_SWITCH_CTRL_BY_PTA:
1753 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
1754 0x80, 0x0); /* 0x4c[23] = 0 */
1755 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
1756 0x01, 0x1); /* 0x4c[24] = 1 */
1757 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb4,
1758 0xff, 0x66); /* PTA, DPDT use RFE_ctrl8 and RFE_ctrl9 as conctrol pin */
1760 regval_0xcbc = (switch_polatiry_inverse == false ?
1761 0x2 : 0x1); /* 0xcb4[29:28] = 2b'10 for no switch_polatiry_inverse, DPDT_SEL_N =1, DPDT_SEL_P =0 @ GNT_BT=1 */
1762 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbc,
1763 0x03, regval_0xcbc);
1766 case BT_8822B_2ANT_EXT_ANT_SWITCH_CTRL_BY_ANTDIV:
1767 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
1768 0x80, 0x0); /* 0x4c[23] = 0 */
1769 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
1770 0x01, 0x1);/* 0x4c[24] = 1 */
1771 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb4, 0xff, 0x88);
1773 case BT_8822B_2ANT_EXT_ANT_SWITCH_CTRL_BY_MAC:
1774 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
1775 0x80, 0x1); /* 0x4c[23] = 1 */
1777 regval_0x64 = (switch_polatiry_inverse == false ? 0x0 :
1778 0x1); /* 0x64[0] = 1b'0 for no switch_polatiry_inverse, DPDT_SEL_N =1, DPDT_SEL_P =0 */
1779 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x64, 0x1,
1782 case BT_8822B_2ANT_EXT_ANT_SWITCH_CTRL_BY_BT:
1783 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
1784 0x80, 0x0); /* 0x4c[23] = 0 */
1785 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
1786 0x01, 0x0); /* 0x4c[24] = 0 */
1788 /* no setup required, because antenna switch control value by BT vendor 0x1c[1:0] */
1792 /* PAPE, LNA_ON control by BT while WLAN off for current leakage issue */
1793 if (ctrl_type == BT_8822B_2ANT_EXT_ANT_SWITCH_CTRL_BY_BT) {
1794 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20,
1795 0x0); /* PAPE 0x64[29] = 0 */
1796 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x10,
1797 0x0); /* LNA_ON 0x64[28] = 0 */
1799 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20,
1800 0x1); /* PAPE 0x64[29] = 1 */
1801 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x10,
1802 0x1); /* LNA_ON 0x64[28] = 1 */
1805 #if BT_8822B_2ANT_COEX_DBG
1807 u32tmp1 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
1808 u32tmp2 = btcoexist->btc_read_4byte(btcoexist, 0x4c);
1809 u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0x64) & 0xff;
1811 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1812 "[BTCoex], (After Ext Ant switch setup) 0xcb4 = 0x%08x, 0x4c = 0x%08x, 0x64= 0x%02x\n",
1813 u32tmp1, u32tmp2, u32tmp3);
1814 BTC_TRACE(trace_buf);
1820 /*rf4 type by efuse , and for ant at main aux inverse use , because is 2x2 ,and control types are the same ,does not need */
1821 void halbtc8822b2ant_set_rfe_type(IN struct btc_coexist *btcoexist)
1824 struct btc_board_info *board_info = &btcoexist->board_info;
1827 rfe_type->ext_band_switch_exist = false;
1828 rfe_type->ext_band_switch_type =
1829 BT_8822B_2ANT_EXT_BAND_SWITCH_USE_SPDT; /* SPDT; */
1830 rfe_type->ext_band_switch_ctrl_polarity = 0;
1831 /* Ext switch buffer mux */
1832 btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
1833 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991, 0x3, 0x0);
1834 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe, 0x8, 0x0);
1836 if (rfe_type->ext_band_switch_exist) {
1838 /* band switch use RFE_ctrl1 (pin name: PAPE_A) and RFE_ctrl3 (pin name: LNAON_A) */
1840 /* set RFE_ctrl1 as software control */
1841 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb0, 0xf0, 0x7);
1843 /* set RFE_ctrl3 as software control */
1844 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb1, 0xf0, 0x7);
1849 /* the following setup should be got from Efuse in the future */
1850 rfe_type->rfe_module_type = board_info->rfe_type;
1852 rfe_type->ext_ant_switch_ctrl_polarity = 0;
1854 switch (rfe_type->rfe_module_type) {
1857 rfe_type->ext_ant_switch_exist = true;
1858 rfe_type->ext_ant_switch_type = BT_8822B_2ANT_EXT_ANT_SWITCH_USE_SPDT;
1861 rfe_type->ext_ant_switch_exist = true;
1862 rfe_type->ext_ant_switch_type = BT_8822B_2ANT_EXT_ANT_SWITCH_USE_SPDT;
1865 rfe_type->ext_ant_switch_exist = true;
1866 rfe_type->ext_ant_switch_type = BT_8822B_2ANT_EXT_ANT_SWITCH_USE_SPDT;
1869 rfe_type->ext_ant_switch_exist = true;
1870 rfe_type->ext_ant_switch_type = BT_8822B_2ANT_EXT_ANT_SWITCH_USE_SPDT;
1873 rfe_type->ext_ant_switch_exist = true;
1874 rfe_type->ext_ant_switch_type =
1875 BT_8822B_2ANT_EXT_ANT_SWITCH_USE_SPDT;
1878 rfe_type->ext_ant_switch_exist = true;
1879 rfe_type->ext_ant_switch_type = BT_8822B_2ANT_EXT_ANT_SWITCH_USE_SPDT;
1882 rfe_type->ext_ant_switch_exist = true;
1883 rfe_type->ext_ant_switch_type = BT_8822B_2ANT_EXT_ANT_SWITCH_USE_SPDT;
1886 rfe_type->ext_ant_switch_exist = true;
1887 rfe_type->ext_ant_switch_type = BT_8822B_2ANT_EXT_ANT_SWITCH_USE_SPDT;
1893 if (rfe_type->wlg_Locate_at_btg)
1894 halbtc8822b2ant_set_int_block(btcoexist, FORCE_EXEC,
1895 BT_8822B_2ANT_INT_BLOCK_SWITCH_TO_WLG_OF_BTG);
1897 halbtc8822b2ant_set_int_block(btcoexist, FORCE_EXEC,
1898 BT_8822B_2ANT_INT_BLOCK_SWITCH_TO_WLG_OF_WLAG);
1903 /*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*/
1904 void halbtc8822b2ant_set_ant_path(IN struct btc_coexist *btcoexist,
1905 IN u8 ant_pos_type, IN boolean force_exec,
1908 struct btc_board_info *board_info = &btcoexist->board_info;
1909 u32 cnt_bt_cal_chk = 0;
1910 boolean is_in_mp_mode = false;
1912 u32 u32tmp1 = 0, u32tmp2 = 0, u32tmp3 = 0;
1914 /* Ext switch buffer mux */
1915 btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
1916 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991, 0x3, 0x0);
1917 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe, 0x8, 0x0);
1918 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
1919 0x80, 0x0); /* 0x4c[23] = 0 */
1920 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
1921 0x01, 0x1); /* 0x4c[24] = 1 */
1923 coex_dm->cur_ant_pos_type = (ant_pos_type << 8) + phase;
1926 if (coex_dm->cur_ant_pos_type == coex_dm->pre_ant_pos_type)
1930 coex_dm->pre_ant_pos_type = coex_dm->cur_ant_pos_type;
1932 #if BT_8822B_2ANT_COEX_DBG
1933 u32tmp1 = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist,
1935 u32tmp2 = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist,
1937 u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x73);
1939 u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
1941 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1942 "[BTCoex], (Before Ant Setup) 0xcb4 = 0x%x, 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x\n",
1943 u32tmp3, u8tmp, u32tmp1, u32tmp2);
1944 BTC_TRACE(trace_buf);
1948 case BT_8822B_2ANT_PHASE_COEX_POWERON:
1950 /* set Path control owner to WL at initial step */
1951 halbtc8822b2ant_ltecoex_pathcontrol_owner(btcoexist,
1952 BT_8822B_2ANT_PCO_BTSIDE);
1954 /* set GNT_BT to SW high */
1955 halbtc8822b2ant_ltecoex_set_gnt_bt(btcoexist,
1956 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
1957 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_SW,
1958 BT_8822B_2ANT_SIG_STA_SET_TO_HIGH);
1959 /* Set GNT_WL to SW high */
1960 halbtc8822b2ant_ltecoex_set_gnt_wl(btcoexist,
1961 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
1962 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_SW,
1963 BT_8822B_2ANT_SIG_STA_SET_TO_HIGH);
1965 coex_sta->run_time_state = false;
1968 case BT_8822B_2ANT_PHASE_COEX_INIT:
1969 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
1970 0x80, 0x0); /* 0x4c[23] = 0 */
1971 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
1972 0x01, 0x1); /* 0x4c[24] = 1 */
1973 /* Disable LTE Coex Function in WiFi side (this should be on if LTE coex is required) */
1974 halbtc8822b2ant_ltecoex_enable(btcoexist, 0x0);
1976 /* GNT_WL_LTE always = 1 (this should be config if LTE coex is required) */
1977 halbtc8822b2ant_ltecoex_set_coex_table(
1979 BT_8822B_2ANT_CTT_WL_VS_LTE,
1982 /* GNT_BT_LTE always = 1 (this should be config if LTE coex is required) */
1983 halbtc8822b2ant_ltecoex_set_coex_table(
1985 BT_8822B_2ANT_CTT_BT_VS_LTE,
1988 /* set Path control owner to WL at initial step */
1989 halbtc8822b2ant_ltecoex_pathcontrol_owner(
1991 BT_8822B_2ANT_PCO_WLSIDE);
1993 /* set GNT_BT to SW high */
1994 halbtc8822b2ant_ltecoex_set_gnt_bt(btcoexist,
1995 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
1996 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_SW,
1997 BT_8822B_2ANT_SIG_STA_SET_TO_HIGH);
1998 /* Set GNT_WL to SW high */
1999 halbtc8822b2ant_ltecoex_set_gnt_wl(btcoexist,
2000 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
2001 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_SW,
2002 BT_8822B_2ANT_SIG_STA_SET_TO_HIGH);
2004 coex_sta->run_time_state = false;
2007 case BT_8822B_2ANT_PHASE_WLANONLY_INIT:
2008 /* Disable LTE Coex Function in WiFi side (this should be on if LTE coex is required) */
2009 halbtc8822b2ant_ltecoex_enable(btcoexist, 0x0);
2011 /* GNT_WL_LTE always = 1 (this should be config if LTE coex is required) */
2012 halbtc8822b2ant_ltecoex_set_coex_table(
2014 BT_8822B_2ANT_CTT_WL_VS_LTE,
2017 /* GNT_BT_LTE always = 1 (this should be config if LTE coex is required) */
2018 halbtc8822b2ant_ltecoex_set_coex_table(
2020 BT_8822B_2ANT_CTT_BT_VS_LTE,
2023 /* set Path control owner to WL at initial step */
2024 halbtc8822b2ant_ltecoex_pathcontrol_owner(
2026 BT_8822B_2ANT_PCO_WLSIDE);
2028 /* set GNT_BT to SW Low */
2029 halbtc8822b2ant_ltecoex_set_gnt_bt(btcoexist,
2030 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
2031 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_SW,
2032 BT_8822B_2ANT_SIG_STA_SET_TO_LOW);
2033 /* Set GNT_WL to SW high */
2034 halbtc8822b2ant_ltecoex_set_gnt_wl(btcoexist,
2035 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
2036 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_SW,
2037 BT_8822B_2ANT_SIG_STA_SET_TO_HIGH);
2039 coex_sta->run_time_state = false;
2043 case BT_8822B_2ANT_PHASE_WLAN_OFF:
2044 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
2045 0x80, 0x0); /* 0x4c[23] = 0 */
2046 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
2047 0x01, 0x0); /* 0x4c[24] = 0 */
2048 /* Disable LTE Coex Function in WiFi side */
2049 halbtc8822b2ant_ltecoex_enable(btcoexist, 0x0);
2051 /* set Path control owner to BT */
2052 halbtc8822b2ant_ltecoex_pathcontrol_owner(
2054 BT_8822B_2ANT_PCO_BTSIDE);
2056 /* Set Ext Ant Switch to BT control at wifi off step */
2057 halbtc8822b2ant_set_ext_ant_switch(btcoexist,
2059 BT_8822B_2ANT_EXT_ANT_SWITCH_CTRL_BY_BT,
2060 BT_8822B_2ANT_EXT_ANT_SWITCH_MAIN_TO_NOCARE);
2061 coex_sta->run_time_state = false;
2063 case BT_8822B_2ANT_PHASE_2G_RUNTIME:
2064 case BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT:
2066 /* set Path control owner to WL at runtime step */
2067 halbtc8822b2ant_ltecoex_pathcontrol_owner(
2069 BT_8822B_2ANT_PCO_WLSIDE);
2072 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT) {
2073 /* set GNT_BT to PTA */
2074 halbtc8822b2ant_ltecoex_set_gnt_bt(
2076 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
2077 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_PTA,
2078 BT_8822B_2ANT_SIG_STA_SET_BY_HW);
2080 /* Set GNT_WL to SW High */
2081 halbtc8822b2ant_ltecoex_set_gnt_wl(
2083 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
2084 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_SW,
2085 BT_8822B_2ANT_SIG_STA_SET_TO_HIGH);
2087 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2088 "[BTCoex], ************* under2g 0xcbd setting =2 *************\n");
2089 BTC_TRACE(trace_buf);
2091 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
2094 /* set GNT_BT to PTA */
2095 halbtc8822b2ant_ltecoex_set_gnt_bt(
2097 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
2098 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_PTA,
2099 BT_8822B_2ANT_SIG_STA_SET_BY_HW);
2101 /* Set GNT_WL to PTA */
2102 halbtc8822b2ant_ltecoex_set_gnt_wl(
2104 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
2105 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_PTA,
2106 BT_8822B_2ANT_SIG_STA_SET_BY_HW);
2108 coex_sta->run_time_state = true;
2110 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2111 "[BTCoex], ************* under2g 0xcbd setting =2 *************\n");
2112 BTC_TRACE(trace_buf);
2114 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd, 0x03, 02);
2116 case BT_8822B_2ANT_PHASE_5G_RUNTIME:
2118 /* set Path control owner to WL at runtime step */
2119 halbtc8822b2ant_ltecoex_pathcontrol_owner(
2121 BT_8822B_2ANT_PCO_WLSIDE);
2123 /* set GNT_BT to SW Hi */
2124 halbtc8822b2ant_ltecoex_set_gnt_bt(btcoexist,
2125 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
2126 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_SW,
2127 BT_8822B_2ANT_SIG_STA_SET_TO_HIGH);
2128 /* Set GNT_WL to SW Hi */
2129 halbtc8822b2ant_ltecoex_set_gnt_wl(btcoexist,
2130 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
2131 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_SW,
2132 BT_8822B_2ANT_SIG_STA_SET_TO_HIGH);
2133 coex_sta->run_time_state = true;
2135 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2136 "[BTCoex], ************* under5g 0xcbd setting =1 *************\n");
2137 BTC_TRACE(trace_buf);
2139 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
2143 case BT_8822B_2ANT_PHASE_BTMPMODE:
2144 /* Disable LTE Coex Function in WiFi side */
2145 halbtc8822b2ant_ltecoex_enable(btcoexist, 0x0);
2147 /* set Path control owner to WL */
2148 halbtc8822b2ant_ltecoex_pathcontrol_owner(
2150 BT_8822B_2ANT_PCO_WLSIDE);
2152 /* set GNT_BT to SW Hi */
2153 halbtc8822b2ant_ltecoex_set_gnt_bt(btcoexist,
2154 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
2155 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_SW,
2156 BT_8822B_2ANT_SIG_STA_SET_TO_HIGH);
2158 /* Set GNT_WL to SW Lo */
2159 halbtc8822b2ant_ltecoex_set_gnt_wl(btcoexist,
2160 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
2161 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_SW,
2162 BT_8822B_2ANT_SIG_STA_SET_TO_LOW);
2164 coex_sta->run_time_state = false;
2167 #if BT_8822B_2ANT_COEX_DBG
2168 u32tmp1 = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
2169 u32tmp2 = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist, 0x54);
2170 u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
2171 u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x73);
2173 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2174 "[BTCoex], (After Ant-Setup phase---%d) 0xcb4 = 0x%x, 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x\n",
2175 phase, u32tmp3, u8tmp, u32tmp1, u32tmp2);
2177 BTC_TRACE(trace_buf);
2183 u8 halbtc8822b2ant_action_algorithm(IN struct btc_coexist *btcoexist)
2185 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2186 boolean bt_hs_on = false;
2187 u8 algorithm = BT_8822B_2ANT_COEX_ALGO_UNDEFINED;
2188 u8 num_of_diff_profile = 0;
2190 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2192 if (!bt_link_info->bt_link_exist) {
2193 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2194 "[BTCoex], No BT link exists!!!\n");
2195 BTC_TRACE(trace_buf);
2199 if (bt_link_info->sco_exist)
2200 num_of_diff_profile++;
2201 if (bt_link_info->hid_exist)
2202 num_of_diff_profile++;
2203 if (bt_link_info->pan_exist)
2204 num_of_diff_profile++;
2205 if (bt_link_info->a2dp_exist)
2206 num_of_diff_profile++;
2208 if (num_of_diff_profile == 0) {
2210 if (bt_link_info->acl_busy) {
2211 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2212 "[BTCoex], No-Profile busy\n");
2213 BTC_TRACE(trace_buf);
2214 algorithm = BT_8822B_2ANT_COEX_ALGO_NOPROFILEBUSY;
2216 } else if (num_of_diff_profile == 1) {
2217 if (bt_link_info->sco_exist) {
2218 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2219 "[BTCoex], SCO only\n");
2220 BTC_TRACE(trace_buf);
2221 algorithm = BT_8822B_2ANT_COEX_ALGO_SCO;
2223 if (bt_link_info->hid_exist) {
2224 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2225 "[BTCoex], HID only\n");
2226 BTC_TRACE(trace_buf);
2227 algorithm = BT_8822B_2ANT_COEX_ALGO_HID;
2228 } else if (bt_link_info->a2dp_exist) {
2229 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2230 "[BTCoex], A2DP only\n");
2231 BTC_TRACE(trace_buf);
2232 algorithm = BT_8822B_2ANT_COEX_ALGO_A2DP;
2233 } else if (bt_link_info->pan_exist) {
2235 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2236 "[BTCoex], PAN(HS) only\n");
2237 BTC_TRACE(trace_buf);
2239 BT_8822B_2ANT_COEX_ALGO_PANHS;
2241 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2242 "[BTCoex], PAN(EDR) only\n");
2243 BTC_TRACE(trace_buf);
2245 BT_8822B_2ANT_COEX_ALGO_PANEDR;
2249 } else if (num_of_diff_profile == 2) {
2250 if (bt_link_info->sco_exist) {
2251 if (bt_link_info->hid_exist) {
2252 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2253 "[BTCoex], SCO + HID\n");
2254 BTC_TRACE(trace_buf);
2255 algorithm = BT_8822B_2ANT_COEX_ALGO_SCO;
2256 } else if (bt_link_info->a2dp_exist) {
2257 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2258 "[BTCoex], SCO + A2DP ==> A2DP\n");
2259 BTC_TRACE(trace_buf);
2260 algorithm = BT_8822B_2ANT_COEX_ALGO_A2DP;
2261 } else if (bt_link_info->pan_exist) {
2263 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2264 "[BTCoex], SCO + PAN(HS)\n");
2265 BTC_TRACE(trace_buf);
2266 algorithm = BT_8822B_2ANT_COEX_ALGO_SCO;
2268 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2269 "[BTCoex], SCO + PAN(EDR)\n");
2270 BTC_TRACE(trace_buf);
2272 BT_8822B_2ANT_COEX_ALGO_PANEDR;
2276 if (bt_link_info->hid_exist &&
2277 bt_link_info->a2dp_exist) {
2279 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2280 "[BTCoex], HID + A2DP\n");
2281 BTC_TRACE(trace_buf);
2283 BT_8822B_2ANT_COEX_ALGO_HID_A2DP;
2285 } else if (bt_link_info->hid_exist &&
2286 bt_link_info->pan_exist) {
2288 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2289 "[BTCoex], HID + PAN(HS)\n");
2290 BTC_TRACE(trace_buf);
2291 algorithm = BT_8822B_2ANT_COEX_ALGO_HID;
2293 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2294 "[BTCoex], HID + PAN(EDR)\n");
2295 BTC_TRACE(trace_buf);
2297 BT_8822B_2ANT_COEX_ALGO_PANEDR_HID;
2299 } else if (bt_link_info->pan_exist &&
2300 bt_link_info->a2dp_exist) {
2302 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2303 "[BTCoex], A2DP + PAN(HS)\n");
2304 BTC_TRACE(trace_buf);
2306 BT_8822B_2ANT_COEX_ALGO_A2DP_PANHS;
2308 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2309 "[BTCoex], A2DP + PAN(EDR)\n");
2310 BTC_TRACE(trace_buf);
2312 BT_8822B_2ANT_COEX_ALGO_PANEDR_A2DP;
2316 } else if (num_of_diff_profile == 3) {
2317 if (bt_link_info->sco_exist) {
2318 if (bt_link_info->hid_exist &&
2319 bt_link_info->a2dp_exist) {
2320 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2321 "[BTCoex], SCO + HID + A2DP ==> HID + A2DP\n");
2322 BTC_TRACE(trace_buf);
2323 algorithm = BT_8822B_2ANT_COEX_ALGO_HID_A2DP;
2324 } else if (bt_link_info->hid_exist &&
2325 bt_link_info->pan_exist) {
2327 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2328 "[BTCoex], SCO + HID + PAN(HS)\n");
2329 BTC_TRACE(trace_buf);
2331 BT_8822B_2ANT_COEX_ALGO_PANEDR_HID;
2333 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2334 "[BTCoex], SCO + HID + PAN(EDR)\n");
2335 BTC_TRACE(trace_buf);
2337 BT_8822B_2ANT_COEX_ALGO_PANEDR_HID;
2339 } else if (bt_link_info->pan_exist &&
2340 bt_link_info->a2dp_exist) {
2342 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2343 "[BTCoex], SCO + A2DP + PAN(HS)\n");
2344 BTC_TRACE(trace_buf);
2346 BT_8822B_2ANT_COEX_ALGO_PANEDR_A2DP;
2348 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2349 "[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n");
2350 BTC_TRACE(trace_buf);
2352 BT_8822B_2ANT_COEX_ALGO_PANEDR_A2DP;
2356 if (bt_link_info->hid_exist &&
2357 bt_link_info->pan_exist &&
2358 bt_link_info->a2dp_exist) {
2360 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2361 "[BTCoex], HID + A2DP + PAN(HS)\n");
2362 BTC_TRACE(trace_buf);
2364 BT_8822B_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
2366 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2367 "[BTCoex], HID + A2DP + PAN(EDR)\n");
2368 BTC_TRACE(trace_buf);
2370 BT_8822B_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
2374 } else if (num_of_diff_profile >= 3) {
2375 if (bt_link_info->sco_exist) {
2376 if (bt_link_info->hid_exist &&
2377 bt_link_info->pan_exist &&
2378 bt_link_info->a2dp_exist) {
2380 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2381 "[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n");
2382 BTC_TRACE(trace_buf);
2384 BT_8822B_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
2386 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2387 "[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");
2388 BTC_TRACE(trace_buf);
2390 BT_8822B_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
2401 void halbtc8822b2ant_action_coex_all_off(IN struct btc_coexist *btcoexist)
2404 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2406 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
2407 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2410 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2412 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
2413 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2417 void halbtc8822b2ant_action_wifi_under5g(IN struct btc_coexist *btcoexist)
2421 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2422 "[BTCoex], ************* under5g *************\n");
2423 BTC_TRACE(trace_buf);
2424 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2425 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2427 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
2428 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2430 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, FORCE_EXEC,
2431 BT_8822B_2ANT_PHASE_5G_RUNTIME);
2435 void halbtc8822b2ant_action_bt_inquiry(IN struct btc_coexist *btcoexist)
2438 boolean wifi_connected = false;
2439 boolean scan = false, link = false, roam = false;
2440 boolean wifi_busy = false;
2441 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2444 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2446 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2449 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2450 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2451 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2453 if (link || roam || coex_sta->wifi_is_high_pri_task) {
2455 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2456 "[BTCoex], Wifi link/roam/hi-pri-task process + BT Inq/Page!!\n");
2457 BTC_TRACE(trace_buf);
2459 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
2461 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
2465 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2466 "[BTCoex], Wifi scan process + BT Inq/Page!!\n");
2467 BTC_TRACE(trace_buf);
2469 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
2472 if (coex_sta->bt_create_connection)
2473 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2476 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2479 } else if (wifi_connected) {
2481 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2482 "[BTCoex], Wifi connected + BT Inq/Page!!\n");
2483 BTC_TRACE(trace_buf);
2485 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
2490 if ((bt_link_info->a2dp_exist) &&
2491 (bt_link_info->acl_busy))
2492 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2495 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2499 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2504 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2505 "[BTCoex], Wifi no-link + BT Inq/Page!!\n");
2506 BTC_TRACE(trace_buf);
2508 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2509 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
2511 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2513 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2516 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 0xd8);
2517 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2520 void halbtc8822b2ant_action_wifi_link_process(IN struct btc_coexist *btcoexist)
2522 u32 u32tmp, u32tmpb;
2524 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2526 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 0xd8);
2527 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2529 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2531 if ((bt_link_info->a2dp_exist) && (bt_link_info->acl_busy))
2532 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
2534 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
2539 void halbtc8822b2ant_action_wifi_nonconnected(IN struct btc_coexist *btcoexist)
2541 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2542 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
2543 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2546 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2548 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
2549 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2552 void halbtc8822b2ant_action_bt_idle(IN struct btc_coexist *btcoexist)
2554 static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
2555 static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
2556 u8 wifi_rssi_state, bt_rssi_state;
2558 static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
2559 static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
2560 u8 wifi_rssi_state2, bt_rssi_state2;
2562 boolean wifi_connected = false;
2563 boolean scan = false, link = false, roam = false;
2564 boolean wifi_busy = false;
2566 wifi_rssi_state = halbtc8822b2ant_wifi_rssi_state(btcoexist,
2567 &prewifi_rssi_state, 2,
2568 coex_sta->wifi_coex_thres , 0);
2570 wifi_rssi_state2 = halbtc8822b2ant_wifi_rssi_state(btcoexist,
2571 &prewifi_rssi_state2, 2,
2572 coex_sta->wifi_coex_thres2 , 0);
2574 bt_rssi_state = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state, 2,
2575 coex_sta->bt_coex_thres , 0);
2577 bt_rssi_state2 = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state2, 2,
2578 coex_sta->bt_coex_thres2 , 0);
2581 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2583 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2586 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2587 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2588 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2590 if (scan || link || roam) {
2591 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2592 "[BTCoex], Wifi link process + BT Idle!!\n");
2593 BTC_TRACE(trace_buf);
2595 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
2598 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
2599 } else if (wifi_connected) {
2600 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2601 "[BTCoex], Wifi connected + BT Idle!!\n");
2602 BTC_TRACE(trace_buf);
2605 halbtc8822b2ant_coex_table_with_type(btcoexist,
2607 halbtc8822b2ant_set_ant_path(btcoexist,
2608 BTC_ANT_PATH_AUTO, NORMAL_EXEC,
2609 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2611 if (!BTC_RSSI_HIGH(bt_rssi_state2))
2612 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2614 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2615 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
2616 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2621 halbtc8822b2ant_coex_table_with_type(btcoexist,
2623 halbtc8822b2ant_set_ant_path(btcoexist,
2624 BTC_ANT_PATH_AUTO, NORMAL_EXEC,
2625 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2628 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2631 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2632 "[BTCoex], Wifi no-link + BT Idle!!\n");
2633 BTC_TRACE(trace_buf);
2635 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2636 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
2638 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2640 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2643 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 0xd8);
2644 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2649 /* SCO only or SCO+PAN(HS) */
2650 void halbtc8822b2ant_action_sco(IN struct btc_coexist *btcoexist)
2652 static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
2653 static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
2654 u8 wifi_rssi_state, bt_rssi_state;
2656 static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
2657 static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
2658 u8 wifi_rssi_state2, bt_rssi_state2;
2659 boolean wifi_busy = false;
2662 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2664 wifi_rssi_state = halbtc8822b2ant_wifi_rssi_state(btcoexist,
2665 &prewifi_rssi_state, 2,
2666 coex_sta->wifi_coex_thres , 0);
2668 wifi_rssi_state2 = halbtc8822b2ant_wifi_rssi_state(btcoexist,
2669 &prewifi_rssi_state2, 2,
2670 coex_sta->wifi_coex_thres2 , 0);
2672 bt_rssi_state = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state, 2,
2673 coex_sta->bt_coex_thres , 0);
2675 bt_rssi_state2 = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state2, 2,
2676 coex_sta->bt_coex_thres2 , 0);
2679 if (BTC_RSSI_HIGH(wifi_rssi_state) &&
2680 BTC_RSSI_HIGH(bt_rssi_state)) {
2682 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
2683 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2685 coex_dm->is_switch_to_1dot5_ant = false;
2687 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2688 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
2690 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2692 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2695 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
2696 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2698 coex_dm->is_switch_to_1dot5_ant = false;
2700 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3);
2702 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2708 void halbtc8822b2ant_action_hid(IN struct btc_coexist *btcoexist)
2710 static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
2711 static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
2712 u8 wifi_rssi_state, bt_rssi_state;
2714 static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
2715 static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
2716 u8 wifi_rssi_state2, bt_rssi_state2;
2717 boolean wifi_busy = false;
2720 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2722 wifi_rssi_state = halbtc8822b2ant_wifi_rssi_state(btcoexist,
2723 &prewifi_rssi_state, 2,
2724 coex_sta->wifi_coex_thres , 0);
2726 wifi_rssi_state2 = halbtc8822b2ant_wifi_rssi_state(btcoexist,
2727 &prewifi_rssi_state2, 2,
2728 coex_sta->wifi_coex_thres2 , 0);
2730 bt_rssi_state = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state, 2,
2731 coex_sta->bt_coex_thres , 0);
2733 bt_rssi_state2 = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state2, 2,
2734 coex_sta->bt_coex_thres2 , 0);
2737 if (BTC_RSSI_HIGH(wifi_rssi_state) &&
2738 BTC_RSSI_HIGH(bt_rssi_state)) {
2740 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
2741 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2743 coex_dm->is_switch_to_1dot5_ant = false;
2745 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2746 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
2748 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2750 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2753 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
2754 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2756 coex_dm->is_switch_to_1dot5_ant = false;
2758 halbtc8822b2ant_coex_table_with_type(btcoexist,
2760 halbtc8822b2ant_set_ant_path(btcoexist,
2761 BTC_ANT_PATH_AUTO, NORMAL_EXEC,
2762 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2764 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3);
2767 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 10);
2769 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2774 /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
2775 void halbtc8822b2ant_action_a2dp(IN struct btc_coexist *btcoexist)
2777 static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
2778 static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
2779 u8 wifi_rssi_state, bt_rssi_state;
2781 static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
2782 static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
2783 u8 wifi_rssi_state2, bt_rssi_state2;
2784 boolean wifi_busy = false, wifi_turbo = false;
2787 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2788 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
2789 &coex_sta->scan_ap_num);
2790 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2791 "############# [BTCoex], scan_ap_num = %d\n",
2792 coex_sta->scan_ap_num);
2793 BTC_TRACE(trace_buf);
2796 if ((wifi_busy) && (coex_sta->scan_ap_num <= 4))
2800 wifi_rssi_state = halbtc8822b2ant_wifi_rssi_state(btcoexist,
2801 &prewifi_rssi_state, 2,
2802 coex_sta->wifi_coex_thres , 0);
2804 wifi_rssi_state2 = halbtc8822b2ant_wifi_rssi_state(btcoexist,
2805 &prewifi_rssi_state2, 2,
2806 coex_sta->wifi_coex_thres2 , 0);
2808 bt_rssi_state = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state, 2,
2809 coex_sta->bt_coex_thres , 0);
2811 bt_rssi_state2 = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state2, 2,
2812 coex_sta->bt_coex_thres2 , 0);
2815 if (BTC_RSSI_HIGH(wifi_rssi_state) &&
2816 BTC_RSSI_HIGH(bt_rssi_state)) {
2818 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
2819 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2821 coex_dm->is_switch_to_1dot5_ant = false;
2823 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2824 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
2826 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2828 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2829 } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
2830 BTC_RSSI_HIGH(bt_rssi_state2)) {
2832 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
2833 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2835 coex_dm->is_switch_to_1dot5_ant = false;
2839 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2842 if (coex_sta->is_setupLink)
2843 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2846 halbtc8822b2ant_coex_table_with_type(btcoexist,
2848 halbtc8822b2ant_set_ant_path(btcoexist,
2849 BTC_ANT_PATH_AUTO, NORMAL_EXEC,
2850 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2851 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2856 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2860 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
2861 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2863 coex_dm->is_switch_to_1dot5_ant = true;
2866 halbtc8822b2ant_coex_table_with_type(btcoexist,
2869 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
2873 if (coex_sta->is_setupLink)
2874 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2877 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2880 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2887 void halbtc8822b2ant_action_pan_edr(IN struct btc_coexist *btcoexist)
2889 static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
2890 static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
2891 u8 wifi_rssi_state, bt_rssi_state;
2893 static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
2894 static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
2895 u8 wifi_rssi_state2, bt_rssi_state2;
2896 boolean wifi_busy = false, wifi_turbo = false;
2899 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2900 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
2901 &coex_sta->scan_ap_num);
2902 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2903 "############# [BTCoex], scan_ap_num = %d\n",
2904 coex_sta->scan_ap_num);
2905 BTC_TRACE(trace_buf);
2908 if ((wifi_busy) && (coex_sta->scan_ap_num <= 4))
2912 wifi_rssi_state = halbtc8822b2ant_wifi_rssi_state(btcoexist,
2913 &prewifi_rssi_state, 2,
2914 coex_sta->wifi_coex_thres , 0);
2916 wifi_rssi_state2 = halbtc8822b2ant_wifi_rssi_state(btcoexist,
2917 &prewifi_rssi_state2, 2,
2918 coex_sta->wifi_coex_thres2 , 0);
2920 bt_rssi_state = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state, 2,
2921 coex_sta->bt_coex_thres , 0);
2923 bt_rssi_state2 = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state2, 2,
2924 coex_sta->bt_coex_thres2 , 0);
2927 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
2928 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2930 coex_dm->is_switch_to_1dot5_ant = false;
2932 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2933 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, FORCE_EXEC,
2934 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2936 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2941 if (BTC_RSSI_HIGH(wifi_rssi_state) &&
2942 BTC_RSSI_HIGH(bt_rssi_state)) {
2944 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
2945 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2947 coex_dm->is_switch_to_1dot5_ant = false;
2949 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2950 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
2952 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2954 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2955 } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
2956 BTC_RSSI_HIGH(bt_rssi_state2)) {
2958 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
2959 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2961 coex_dm->is_switch_to_1dot5_ant = false;
2963 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2966 halbtc8822b2ant_coex_table_with_type(btcoexist,
2968 halbtc8822b2ant_set_ant_path(btcoexist,
2969 BTC_ANT_PATH_AUTO, NORMAL_EXEC,
2970 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
2972 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2975 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2979 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
2980 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2982 coex_dm->is_switch_to_1dot5_ant = true;
2985 halbtc8822b2ant_coex_table_with_type(btcoexist,
2988 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
2992 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2995 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3006 void halbtc8822b2ant_action_pan_hs(IN struct btc_coexist *btcoexist)
3008 static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
3009 static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
3010 u8 wifi_rssi_state, bt_rssi_state;
3012 static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
3013 static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
3014 u8 wifi_rssi_state2, bt_rssi_state2;
3015 boolean wifi_busy = false, wifi_turbo = false;
3018 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3019 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
3020 &coex_sta->scan_ap_num);
3021 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3022 "############# [BTCoex], scan_ap_num = %d\n",
3023 coex_sta->scan_ap_num);
3024 BTC_TRACE(trace_buf);
3027 if ((wifi_busy) && (coex_sta->scan_ap_num <= 4))
3032 wifi_rssi_state = halbtc8822b2ant_wifi_rssi_state(btcoexist,
3033 &prewifi_rssi_state, 2,
3034 coex_sta->wifi_coex_thres , 0);
3036 wifi_rssi_state2 = halbtc8822b2ant_wifi_rssi_state(btcoexist,
3037 &prewifi_rssi_state2, 2,
3038 coex_sta->wifi_coex_thres2 , 0);
3040 bt_rssi_state = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state, 2,
3041 coex_sta->bt_coex_thres , 0);
3043 bt_rssi_state2 = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state2, 2,
3044 coex_sta->bt_coex_thres2 , 0);
3046 if (BTC_RSSI_HIGH(wifi_rssi_state) &&
3047 BTC_RSSI_HIGH(bt_rssi_state)) {
3049 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3050 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3052 coex_dm->is_switch_to_1dot5_ant = false;
3054 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3055 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3057 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
3059 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3060 } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
3061 BTC_RSSI_HIGH(bt_rssi_state2)) {
3063 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
3064 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3066 coex_dm->is_switch_to_1dot5_ant = false;
3068 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3069 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3071 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
3073 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3078 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3079 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3081 coex_dm->is_switch_to_1dot5_ant = true;
3083 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3084 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3086 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
3088 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3094 void halbtc8822b2ant_action_hid_a2dp(IN struct btc_coexist *btcoexist)
3096 static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
3097 static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
3098 u8 wifi_rssi_state, bt_rssi_state;
3100 static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
3101 static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
3102 u8 wifi_rssi_state2, bt_rssi_state2;
3103 boolean wifi_busy = false;
3106 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3108 wifi_rssi_state = halbtc8822b2ant_wifi_rssi_state(btcoexist,
3109 &prewifi_rssi_state, 2,
3110 coex_sta->wifi_coex_thres , 0);
3112 wifi_rssi_state2 = halbtc8822b2ant_wifi_rssi_state(btcoexist,
3113 &prewifi_rssi_state2, 2,
3114 coex_sta->wifi_coex_thres2 , 0);
3116 bt_rssi_state = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state, 2,
3117 coex_sta->bt_coex_thres , 0);
3119 bt_rssi_state2 = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state2, 2,
3120 coex_sta->bt_coex_thres2 , 0);
3123 if (BTC_RSSI_HIGH(wifi_rssi_state) &&
3124 BTC_RSSI_HIGH(bt_rssi_state)) {
3126 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3127 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3129 coex_dm->is_switch_to_1dot5_ant = false;
3131 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3132 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3134 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
3136 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3137 } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
3138 BTC_RSSI_HIGH(bt_rssi_state2)) {
3140 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
3141 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3143 coex_dm->is_switch_to_1dot5_ant = false;
3145 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
3151 if (coex_sta->is_setupLink)
3152 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3155 halbtc8822b2ant_coex_table_with_type(btcoexist,
3157 halbtc8822b2ant_set_ant_path(btcoexist,
3158 BTC_ANT_PATH_AUTO, NORMAL_EXEC,
3159 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
3161 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1);
3164 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3170 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3171 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3173 coex_dm->is_switch_to_1dot5_ant = true;
3175 if ((wifi_busy) && (coex_sta->hid_busy_num >= 2))
3176 halbtc8822b2ant_coex_table_with_type(btcoexist,
3180 halbtc8822b2ant_coex_table_with_type(btcoexist,
3183 halbtc8822b2ant_coex_table_with_type(btcoexist,
3187 if (coex_sta->is_setupLink)
3188 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3191 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3194 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3202 void halbtc8822b2ant_action_a2dp_pan_hs(IN struct btc_coexist *btcoexist)
3204 static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
3205 static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
3206 u8 wifi_rssi_state, bt_rssi_state;
3208 static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
3209 static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
3210 u8 wifi_rssi_state2, bt_rssi_state2;
3211 boolean wifi_busy = false, wifi_turbo = false;
3214 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3215 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
3216 &coex_sta->scan_ap_num);
3217 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3218 "############# [BTCoex], scan_ap_num = %d\n",
3219 coex_sta->scan_ap_num);
3220 BTC_TRACE(trace_buf);
3223 if ((wifi_busy) && (coex_sta->scan_ap_num <= 4))
3228 wifi_rssi_state = halbtc8822b2ant_wifi_rssi_state(btcoexist,
3229 &prewifi_rssi_state, 2,
3230 coex_sta->wifi_coex_thres , 0);
3232 wifi_rssi_state2 = halbtc8822b2ant_wifi_rssi_state(btcoexist,
3233 &prewifi_rssi_state2, 2,
3234 coex_sta->wifi_coex_thres2 , 0);
3236 bt_rssi_state = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state, 2,
3237 coex_sta->bt_coex_thres , 0);
3239 bt_rssi_state2 = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state2, 2,
3240 coex_sta->bt_coex_thres2 , 0);
3243 if (BTC_RSSI_HIGH(wifi_rssi_state) &&
3244 BTC_RSSI_HIGH(bt_rssi_state)) {
3246 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3247 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3249 coex_dm->is_switch_to_1dot5_ant = false;
3251 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3252 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3254 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
3256 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3257 } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
3258 BTC_RSSI_HIGH(bt_rssi_state2)) {
3260 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
3261 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3263 coex_dm->is_switch_to_1dot5_ant = false;
3265 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
3269 if ((coex_sta->a2dp_bit_pool > 40) &&
3270 (coex_sta->a2dp_bit_pool < 255))
3271 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3274 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3277 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3282 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3283 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3285 coex_dm->is_switch_to_1dot5_ant = true;
3288 halbtc8822b2ant_coex_table_with_type(btcoexist,
3291 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3296 if ((coex_sta->a2dp_bit_pool > 40) &&
3297 (coex_sta->a2dp_bit_pool < 255))
3298 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3301 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3304 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3314 void halbtc8822b2ant_action_pan_edr_a2dp(IN struct btc_coexist *btcoexist)
3316 static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
3317 static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
3318 u8 wifi_rssi_state, bt_rssi_state;
3320 static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
3321 static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
3322 u8 wifi_rssi_state2, bt_rssi_state2;
3323 boolean wifi_busy = false, wifi_turbo = false;
3326 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3327 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
3328 &coex_sta->scan_ap_num);
3329 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3330 "############# [BTCoex], scan_ap_num = %d\n",
3331 coex_sta->scan_ap_num);
3332 BTC_TRACE(trace_buf);
3335 if ((wifi_busy) && (coex_sta->scan_ap_num <= 4))
3340 wifi_rssi_state = halbtc8822b2ant_wifi_rssi_state(btcoexist,
3341 &prewifi_rssi_state, 2,
3342 coex_sta->wifi_coex_thres , 0);
3344 wifi_rssi_state2 = halbtc8822b2ant_wifi_rssi_state(btcoexist,
3345 &prewifi_rssi_state2, 2,
3346 coex_sta->wifi_coex_thres2 , 0);
3348 bt_rssi_state = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state, 2,
3349 coex_sta->bt_coex_thres , 0);
3351 bt_rssi_state2 = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state2, 2,
3352 coex_sta->bt_coex_thres2 , 0);
3354 if (BTC_RSSI_HIGH(wifi_rssi_state) &&
3355 BTC_RSSI_HIGH(bt_rssi_state)) {
3357 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3358 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3360 coex_dm->is_switch_to_1dot5_ant = false;
3362 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3363 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3365 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
3367 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3368 } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
3369 BTC_RSSI_HIGH(bt_rssi_state2)) {
3371 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
3372 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3374 coex_dm->is_switch_to_1dot5_ant = false;
3376 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
3380 if (((coex_sta->a2dp_bit_pool > 40) &&
3381 (coex_sta->a2dp_bit_pool < 255)) ||
3382 (!coex_sta->is_A2DP_3M))
3383 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3386 halbtc8822b2ant_coex_table_with_type(btcoexist,
3388 halbtc8822b2ant_set_ant_path(btcoexist,
3389 BTC_ANT_PATH_AUTO, NORMAL_EXEC,
3390 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
3391 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3394 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3398 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3399 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3401 coex_dm->is_switch_to_1dot5_ant = true;
3404 halbtc8822b2ant_coex_table_with_type(btcoexist,
3407 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3412 if ((coex_sta->a2dp_bit_pool > 40) &&
3413 (coex_sta->a2dp_bit_pool < 255))
3414 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3417 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3420 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3427 void halbtc8822b2ant_action_pan_edr_hid(IN struct btc_coexist *btcoexist)
3429 static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
3430 static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
3431 u8 wifi_rssi_state, bt_rssi_state;
3433 static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
3434 static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
3435 u8 wifi_rssi_state2, bt_rssi_state2;
3436 boolean wifi_busy = false;
3439 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3441 wifi_rssi_state = halbtc8822b2ant_wifi_rssi_state(btcoexist,
3442 &prewifi_rssi_state, 2,
3443 coex_sta->wifi_coex_thres , 0);
3445 wifi_rssi_state2 = halbtc8822b2ant_wifi_rssi_state(btcoexist,
3446 &prewifi_rssi_state2, 2,
3447 coex_sta->wifi_coex_thres2 , 0);
3449 bt_rssi_state = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state, 2,
3450 coex_sta->bt_coex_thres , 0);
3452 bt_rssi_state2 = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state2, 2,
3453 coex_sta->bt_coex_thres2 , 0);
3456 if (BTC_RSSI_HIGH(wifi_rssi_state) &&
3457 BTC_RSSI_HIGH(bt_rssi_state)) {
3459 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3460 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3462 coex_dm->is_switch_to_1dot5_ant = false;
3464 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3465 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3467 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
3469 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3470 } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
3471 BTC_RSSI_HIGH(bt_rssi_state2)) {
3473 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
3474 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3476 coex_dm->is_switch_to_1dot5_ant = false;
3478 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
3482 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3486 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3492 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3493 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3495 coex_dm->is_switch_to_1dot5_ant = true;
3497 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
3501 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3505 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3512 /* HID+A2DP+PAN(EDR) */
3513 void halbtc8822b2ant_action_hid_a2dp_pan_edr(IN struct btc_coexist *btcoexist)
3515 static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
3516 static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
3517 u8 wifi_rssi_state, bt_rssi_state;
3519 static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
3520 static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
3521 u8 wifi_rssi_state2, bt_rssi_state2;
3522 boolean wifi_busy = false;
3525 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3527 wifi_rssi_state = halbtc8822b2ant_wifi_rssi_state(btcoexist,
3528 &prewifi_rssi_state, 2,
3529 coex_sta->wifi_coex_thres , 0);
3531 wifi_rssi_state2 = halbtc8822b2ant_wifi_rssi_state(btcoexist,
3532 &prewifi_rssi_state2, 2,
3533 coex_sta->wifi_coex_thres2 , 0);
3535 bt_rssi_state = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state, 2,
3536 coex_sta->bt_coex_thres , 0);
3538 bt_rssi_state2 = halbtc8822b2ant_bt_rssi_state(&pre_bt_rssi_state2, 2,
3539 coex_sta->bt_coex_thres2 , 0);
3542 if (BTC_RSSI_HIGH(wifi_rssi_state) &&
3543 BTC_RSSI_HIGH(bt_rssi_state)) {
3545 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3546 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3548 coex_dm->is_switch_to_1dot5_ant = false;
3550 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3551 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3553 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
3555 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3556 } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
3557 BTC_RSSI_HIGH(bt_rssi_state2)) {
3559 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
3560 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3562 coex_dm->is_switch_to_1dot5_ant = false;
3564 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
3568 if (((coex_sta->a2dp_bit_pool > 40) &&
3569 (coex_sta->a2dp_bit_pool < 255)) ||
3570 (!coex_sta->is_A2DP_3M))
3571 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3574 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3577 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3581 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3582 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3584 coex_dm->is_switch_to_1dot5_ant = true;
3586 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
3590 if ((coex_sta->a2dp_bit_pool > 40) &&
3591 (coex_sta->a2dp_bit_pool < 255))
3592 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3595 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3598 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3606 void halbtc8822b2ant_action_bt_whck_test(IN struct btc_coexist *btcoexist)
3608 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3609 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3611 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3612 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
3613 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
3615 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3618 void halbtc8822b2ant_action_wifi_multi_port(IN struct btc_coexist *btcoexist)
3620 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3621 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3624 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3625 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
3626 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
3628 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3631 void halbtc8822b2ant_run_coexist_mechanism(IN struct btc_coexist *btcoexist)
3634 u32 num_of_wifi_link = 0;
3635 u32 wifi_link_status = 0;
3636 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3637 boolean miracast_plus_bt = false;
3638 boolean scan = false, link = false, roam = false,
3639 wifi_connected = false, wifi_under_5g = false;
3643 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3644 "[BTCoex], RunCoexistMechanism()===>\n");
3645 BTC_TRACE(trace_buf);
3647 if (btcoexist->manual_control) {
3648 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3649 "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
3650 BTC_TRACE(trace_buf);
3654 if (btcoexist->stop_coex_dm) {
3655 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3656 "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");
3657 BTC_TRACE(trace_buf);
3661 if (coex_sta->under_ips) {
3662 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3663 "[BTCoex], wifi is under IPS !!!\n");
3664 BTC_TRACE(trace_buf);
3668 if (!coex_sta->run_time_state) {
3669 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3670 "[BTCoex], return for run_time_state = false !!!\n");
3671 BTC_TRACE(trace_buf);
3675 if (coex_sta->freeze_coexrun_by_btinfo) {
3676 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3677 "[BTCoex], BtInfoNotify(), return for freeze_coexrun_by_btinfo\n");
3678 BTC_TRACE(trace_buf);
3683 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3685 if (wifi_under_5g) {
3687 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3688 "[BTCoex], WiFi is under 5G!!!\n");
3689 BTC_TRACE(trace_buf);
3691 halbtc8822b2ant_action_wifi_under5g(btcoexist);
3695 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3696 "[BTCoex], WiFi is under 2G!!!\n");
3697 BTC_TRACE(trace_buf);
3699 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3701 BT_8822B_2ANT_PHASE_2G_RUNTIME);
3704 if (coex_sta->bt_whck_test) {
3705 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3706 "[BTCoex], BT is under WHCK TEST!!!\n");
3707 BTC_TRACE(trace_buf);
3708 halbtc8822b2ant_action_bt_whck_test(btcoexist);
3712 if (coex_sta->bt_disabled) {
3713 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3714 "[BTCoex], BT is disabled!!!\n");
3715 BTC_TRACE(trace_buf);
3716 halbtc8822b2ant_action_coex_all_off(btcoexist);
3720 if (coex_sta->c2h_bt_inquiry_page) {
3721 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3722 "[BTCoex], BT is under inquiry/page scan !!\n");
3723 BTC_TRACE(trace_buf);
3724 halbtc8822b2ant_action_bt_inquiry(btcoexist);
3728 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3729 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3730 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3732 if (scan || link || roam) {
3733 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3734 "[BTCoex], WiFi is under Link Process !!\n");
3735 BTC_TRACE(trace_buf);
3736 halbtc8822b2ant_action_wifi_link_process(btcoexist);
3741 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3743 num_of_wifi_link = wifi_link_status >> 16;
3745 if ((num_of_wifi_link >= 2) ||
3746 (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {
3747 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3748 "############# [BTCoex], Multi-Port num_of_wifi_link = %d, wifi_link_status = 0x%x\n",
3749 num_of_wifi_link, wifi_link_status);
3750 BTC_TRACE(trace_buf);
3752 if (bt_link_info->bt_link_exist)
3753 miracast_plus_bt = true;
3755 miracast_plus_bt = false;
3757 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3759 halbtc8822b2ant_action_wifi_multi_port(btcoexist);
3764 miracast_plus_bt = false;
3765 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3769 algorithm = halbtc8822b2ant_action_algorithm(btcoexist);
3770 coex_dm->cur_algorithm = algorithm;
3771 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Algorithm = %d\n",
3772 coex_dm->cur_algorithm);
3773 BTC_TRACE(trace_buf);
3776 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3779 if (!wifi_connected) {
3781 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3782 "[BTCoex], Action 2-Ant, wifi non-connected!!.\n");
3783 BTC_TRACE(trace_buf);
3784 halbtc8822b2ant_action_wifi_nonconnected(btcoexist);
3786 } else if ((BT_8822B_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
3787 coex_dm->bt_status) ||
3788 (BT_8822B_2ANT_BT_STATUS_CONNECTED_IDLE ==
3789 coex_dm->bt_status)) {
3791 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3792 "[BTCoex], Action 2-Ant, bt idle!!.\n");
3793 BTC_TRACE(trace_buf);
3795 halbtc8822b2ant_action_bt_idle(btcoexist);
3799 if (coex_dm->cur_algorithm != coex_dm->pre_algorithm) {
3800 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3801 "[BTCoex], pre_algorithm=%d, cur_algorithm=%d\n",
3802 coex_dm->pre_algorithm, coex_dm->cur_algorithm);
3803 BTC_TRACE(trace_buf);
3806 switch (coex_dm->cur_algorithm) {
3808 case BT_8822B_2ANT_COEX_ALGO_SCO:
3809 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3810 "[BTCoex], Action 2-Ant, algorithm = SCO.\n");
3811 BTC_TRACE(trace_buf);
3812 halbtc8822b2ant_action_sco(btcoexist);
3814 case BT_8822B_2ANT_COEX_ALGO_HID:
3815 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3816 "[BTCoex], Action 2-Ant, algorithm = HID.\n");
3817 BTC_TRACE(trace_buf);
3818 halbtc8822b2ant_action_hid(btcoexist);
3820 case BT_8822B_2ANT_COEX_ALGO_A2DP:
3821 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3822 "[BTCoex], Action 2-Ant, algorithm = A2DP.\n");
3823 BTC_TRACE(trace_buf);
3824 halbtc8822b2ant_action_a2dp(btcoexist);
3826 case BT_8822B_2ANT_COEX_ALGO_A2DP_PANHS:
3827 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3828 "[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n");
3829 BTC_TRACE(trace_buf);
3830 halbtc8822b2ant_action_a2dp_pan_hs(btcoexist);
3832 case BT_8822B_2ANT_COEX_ALGO_PANEDR:
3833 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3834 "[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n");
3835 BTC_TRACE(trace_buf);
3836 halbtc8822b2ant_action_pan_edr(btcoexist);
3838 case BT_8822B_2ANT_COEX_ALGO_PANHS:
3839 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3840 "[BTCoex], Action 2-Ant, algorithm = HS mode.\n");
3841 BTC_TRACE(trace_buf);
3842 halbtc8822b2ant_action_pan_hs(btcoexist);
3844 case BT_8822B_2ANT_COEX_ALGO_PANEDR_A2DP:
3845 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3846 "[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n");
3847 BTC_TRACE(trace_buf);
3848 halbtc8822b2ant_action_pan_edr_a2dp(btcoexist);
3850 case BT_8822B_2ANT_COEX_ALGO_PANEDR_HID:
3851 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3852 "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n");
3853 BTC_TRACE(trace_buf);
3854 halbtc8822b2ant_action_pan_edr_hid(btcoexist);
3856 case BT_8822B_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
3857 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3858 "[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n");
3859 BTC_TRACE(trace_buf);
3860 halbtc8822b2ant_action_hid_a2dp_pan_edr(
3863 case BT_8822B_2ANT_COEX_ALGO_HID_A2DP:
3864 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3865 "[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n");
3866 BTC_TRACE(trace_buf);
3867 halbtc8822b2ant_action_hid_a2dp(btcoexist);
3869 case BT_8822B_2ANT_COEX_ALGO_NOPROFILEBUSY:
3870 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3871 "[BTCoex], Action 2-Ant, algorithm = No-Profile busy.\n");
3872 BTC_TRACE(trace_buf);
3873 halbtc8822b2ant_action_bt_idle(btcoexist);
3876 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3877 "[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n");
3878 BTC_TRACE(trace_buf);
3879 halbtc8822b2ant_action_coex_all_off(btcoexist);
3882 coex_dm->pre_algorithm = coex_dm->cur_algorithm;
3886 void halbtc8822b2ant_init_coex_dm(IN struct btc_coexist *btcoexist)
3888 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3889 "[BTCoex], Coex Mechanism Init!!\n");
3890 BTC_TRACE(trace_buf);
3892 halbtc8822b2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, false);
3894 halbtc8822b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3895 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
3896 BT_8822B_2ANT_PHASE_2G_RUNTIME_CONCURRENT);
3899 halbtc8822b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3901 halbtc8822b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
3902 halbtc8822b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3904 coex_sta->pop_event_cnt = 0;
3905 coex_sta->cnt_RemoteNameReq = 0;
3906 coex_sta->cnt_ReInit = 0;
3907 coex_sta->cnt_setupLink = 0;
3908 coex_sta->cnt_IgnWlanAct = 0;
3909 coex_sta->cnt_Page = 0;
3911 halbtc8822b2ant_query_bt_info(btcoexist);
3915 void halbtc8822b2ant_init_hw_config(IN struct btc_coexist *btcoexist,
3916 IN boolean wifi_only)
3920 u32 u32tmp0 = 0, u32tmp1 = 0, u32tmp2 = 0, u32tmp3 = 0;
3921 u32 RTL97F_8822B = 0;
3924 u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
3925 u32tmp1 = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
3926 u32tmp2 = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist, 0x54);
3928 if (RTL97F_8822B == true) {
3929 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x66, 0x04, 0x0);
3930 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x41, 0x02, 0x0);
3932 /* set GNT_BT to SW high */
3933 halbtc8822b2ant_ltecoex_set_gnt_bt(btcoexist,
3934 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
3935 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_SW,
3936 BT_8822B_2ANT_SIG_STA_SET_TO_HIGH);
3937 /* Set GNT_WL to SW high */
3938 halbtc8822b2ant_ltecoex_set_gnt_wl(btcoexist,
3939 BT_8822B_2ANT_GNT_BLOCK_RFC_BB,
3940 BT_8822B_2ANT_GNT_TYPE_CTRL_BY_SW,
3941 BT_8822B_2ANT_SIG_STA_SET_TO_HIGH);
3945 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3946 "[BTCoex], (Before Init HW config) 0xcb4 = 0x%x, 0x38= 0x%x, 0x54= 0x%x\n",
3947 u32tmp3, u32tmp1, u32tmp2);
3948 BTC_TRACE(trace_buf);
3950 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3951 "[BTCoex], 2Ant Init HW Config!!\n");
3952 BTC_TRACE(trace_buf);
3954 coex_sta->bt_coex_supported_feature = 0;
3955 coex_sta->bt_coex_supported_version = 0;
3956 coex_sta->bt_ble_scan_type = 0;
3957 coex_sta->bt_ble_scan_para[0] = 0;
3958 coex_sta->bt_ble_scan_para[1] = 0;
3959 coex_sta->bt_ble_scan_para[2] = 0;
3960 coex_sta->bt_reg_vendor_ac = 0xffff;
3961 coex_sta->bt_reg_vendor_ae = 0xffff;
3962 coex_sta->isolation_btween_wb = BT_8822B_2ANT_DEFAULT_ISOLATION;
3964 /* 0xf0[15:12] --> Chip Cut information */
3965 coex_sta->cut_version = (btcoexist->btc_read_1byte(btcoexist,
3968 coex_sta->dis_ver_info_cnt = 0;
3970 halbtc8822b2ant_coex_switch_threshold(btcoexist,
3971 coex_sta->isolation_btween_wb);
3973 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8,
3974 0x1); /* enable TBTT nterrupt */
3976 /* BT report packet sample rate */
3977 btcoexist->btc_write_1byte(btcoexist, 0x790, 0x5);
3979 /* Init 0x778 = 0x1 for 2-Ant */
3980 btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1);
3982 /* Enable PTA (3-wire function form BT side) */
3983 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
3984 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x41, 0x02, 0x1);
3986 /* Enable PTA (tx/rx signal form WiFi side) */
3987 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4c6, 0x10, 0x1);
3989 halbtc8822b2ant_enable_gnt_to_gpio(btcoexist, true);
3991 /*GNT_BT=1 while select both */
3992 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x763, 0x10, 0x1);
3995 /* check if WL firmware download ok */
3996 /*if (btcoexist->btc_read_1byte(btcoexist, 0x80) == 0xc6)*/
3997 halbtc8822b2ant_post_state_to_bt(btcoexist,
3998 BT_8822B_2ANT_SCOREBOARD_ONOFF, true);
4000 /* Enable counter statistics */
4001 btcoexist->btc_write_1byte(btcoexist, 0x76e,
4002 0x4); /* 0x76e[3] =1, WLAN_Act control by PTA */
4004 /* WLAN_Tx by GNT_WL 0x950[29] = 0 */
4005 /* btcoexist->btc_write_1byte_bitmask(btcoexist, 0x953, 0x20, 0x0); */
4007 halbtc8822b2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
4009 halbtc8822b2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
4011 psd_scan->ant_det_is_ant_det_available = true;
4014 coex_sta->concurrent_rx_mode_on = false;
4016 /* Set Antenna Path */
4017 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
4019 BT_8822B_2ANT_PHASE_WLANONLY_INIT);
4021 btcoexist->stop_coex_dm = true;
4023 /*Set BT polluted packet on for Tx rate adaptive not including Tx retry break by PTA, 0x45c[19] =1 */
4024 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x45e, 0x8, 0x1);
4026 coex_sta->concurrent_rx_mode_on = true;
4027 /* btcoexist->btc_write_1byte_bitmask(btcoexist, 0x953, 0x2, 0x1); */
4029 /* RF 0x1[1] = 0->Set GNT_WL_RF_Rx always = 1 for con-current Rx, mask Tx only */
4030 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0x2, 0x0);
4032 /* Set Antenna Path */
4033 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
4035 BT_8822B_2ANT_PHASE_COEX_INIT);
4037 btcoexist->stop_coex_dm = false;
4043 /* ************************************************************
4044 * work around function start with wa_halbtc8822b2ant_
4045 * ************************************************************
4046 * ************************************************************
4047 * extern function start with ex_halbtc8822b2ant_
4048 * ************************************************************ */
4049 void ex_halbtc8822b2ant_power_on_setting(IN struct btc_coexist *btcoexist)
4051 struct btc_board_info *board_info = &btcoexist->board_info;
4056 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4057 "xxxxxxxxxxxxxxxx Execute 8822b 2-Ant PowerOn Setting xxxxxxxxxxxxxxxx!!\n");
4058 BTC_TRACE(trace_buf);
4060 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4061 "Ant Det Finish = %s, Ant Det Number = %d\n",
4062 (board_info->btdm_ant_det_finish ? "Yes" : "No"),
4063 board_info->btdm_ant_num_by_ant_det);
4064 BTC_TRACE(trace_buf);
4067 btcoexist->stop_coex_dm = true;
4068 psd_scan->ant_det_is_ant_det_available = false;
4070 /* enable BB, REG_SYS_FUNC_EN such that we can write BB Register correctly. */
4071 u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2);
4072 btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT(0) | BIT(1));
4075 /* Local setting bit define */
4076 /* BIT0: "0" for no antenna inverse; "1" for antenna inverse */
4077 /* BIT1: "0" for internal switch; "1" for external switch */
4078 /* BIT2: "0" for one antenna; "1" for two antenna */
4079 /* NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0 */
4081 /* Check efuse 0xc3[6] for Single Antenna Path */
4082 if (board_info->single_ant_path == 0) {
4083 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4084 "[BTCoex], ********** Single Antenna, Antenna at Aux Port\n");
4085 BTC_TRACE(trace_buf);
4087 board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
4090 } else if (board_info->single_ant_path == 1) {
4091 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4092 "[BTCoex], ********** Single Antenna, Antenna at Main Port\n");
4093 BTC_TRACE(trace_buf);
4095 board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
4100 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4101 "[BTCoex], ********** (Power On) single_ant_path = %d, btdm_ant_pos = %d\n",
4102 board_info->single_ant_path , board_info->btdm_ant_pos);
4103 BTC_TRACE(trace_buf);
4105 /* Setup RF front end type */
4106 halbtc8822b2ant_set_rfe_type(btcoexist);
4108 /* Set Antenna Path to BT side */
4109 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, FORCE_EXEC,
4110 BT_8822B_2ANT_PHASE_COEX_POWERON);
4112 /* Save"single antenna position" info in Local register setting for FW reading, because FW may not ready at power on */
4113 if (btcoexist->chip_interface == BTC_INTF_PCI)
4114 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x3e0, u8tmp);
4115 else if (btcoexist->chip_interface == BTC_INTF_USB)
4116 btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
4117 else if (btcoexist->chip_interface == BTC_INTF_SDIO)
4118 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60, u8tmp);
4120 /* enable GNT_WL/GNT_BT debug signal to GPIO14/15 */
4121 halbtc8822b2ant_enable_gnt_to_gpio(btcoexist, true);
4123 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4124 "[BTCoex], ********** LTE coex Reg 0x38 (Power-On) = 0x%x**********\n",
4125 halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist, 0x38));
4126 BTC_TRACE(trace_buf);
4128 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4129 "[BTCoex], ********** MAC Reg 0x70/ BB Reg 0xcb4 (Power-On) = 0x%x / 0x%x\n",
4130 btcoexist->btc_read_4byte(btcoexist, 0x70),
4131 btcoexist->btc_read_4byte(btcoexist, 0xcb4));
4132 BTC_TRACE(trace_buf);
4136 void ex_halbtc8822b2ant_pre_load_firmware(IN struct btc_coexist *btcoexist)
4138 struct btc_board_info *board_info = &btcoexist->board_info;
4139 u8 u8tmp = 0x4; /* Set BIT2 by default since it's 2ant case */
4142 /* S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info) */
4143 /* Local setting bit define */
4144 /* BIT0: "0" for no antenna inverse; "1" for antenna inverse */
4145 /* BIT1: "0" for internal switch; "1" for external switch */
4146 /* BIT2: "0" for one antenna; "1" for two antenna */
4147 /* NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0 */
4148 if (btcoexist->chip_interface == BTC_INTF_USB) {
4149 /* fixed at S0 for USB interface */
4150 u8tmp |= 0x1; /* antenna inverse */
4151 btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
4153 /* for PCIE and SDIO interface, we check efuse 0xc3[6] */
4154 if (board_info->single_ant_path == 0) {
4155 } else if (board_info->single_ant_path == 1) {
4157 u8tmp |= 0x1; /* antenna inverse */
4160 if (btcoexist->chip_interface == BTC_INTF_PCI)
4161 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x3e0,
4163 else if (btcoexist->chip_interface == BTC_INTF_SDIO)
4164 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60,
4170 void ex_halbtc8822b2ant_init_hw_config(IN struct btc_coexist *btcoexist,
4171 IN boolean wifi_only)
4173 halbtc8822b2ant_init_hw_config(btcoexist, wifi_only);
4176 void ex_halbtc8822b2ant_init_coex_dm(IN struct btc_coexist *btcoexist)
4179 halbtc8822b2ant_init_coex_dm(btcoexist);
4182 void ex_halbtc8822b2ant_display_coex_info(IN struct btc_coexist *btcoexist)
4184 struct btc_board_info *board_info = &btcoexist->board_info;
4185 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
4187 u8 *cli_buf = btcoexist->cli_buf;
4188 u8 u8tmp[4], i, ps_tdma_case = 0;
4191 u32 fa_ofdm, fa_cck, cca_ofdm, cca_cck;
4192 u32 fw_ver = 0, bt_patch_ver = 0, bt_coex_ver = 0;
4193 static u8 pop_report_in_10s = 0;
4195 boolean lte_coex_on = false;
4197 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4198 "\r\n ============[BT Coexist info]============");
4201 if (btcoexist->manual_control) {
4202 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4203 "\r\n ============[Under Manual Control]============");
4205 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4206 "\r\n ==========================================");
4210 if (psd_scan->ant_det_try_count == 0) {
4211 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4212 "\r\n %-35s = %d/ %d/ %s / %d",
4213 "Ant PG Num/ Mech/ Pos/ RFE",
4214 board_info->pg_ant_num, board_info->btdm_ant_num,
4215 (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT
4217 rfe_type->rfe_module_type);
4220 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4221 "\r\n %-35s = %d/ %d/ %s/ %d (%d/%d/%d)",
4222 "Ant PG Num/ Mech(Ant_Det)/ Pos/ RFE",
4223 board_info->pg_ant_num,
4224 board_info->btdm_ant_num_by_ant_det,
4225 (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT
4227 rfe_type->rfe_module_type,
4228 psd_scan->ant_det_try_count,
4229 psd_scan->ant_det_fail_count,
4230 psd_scan->ant_det_result);
4234 if (board_info->btdm_ant_det_finish) {
4236 if (psd_scan->ant_det_result != 12)
4237 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s",
4238 "Ant Det PSD Value",
4239 psd_scan->ant_det_peak_val);
4241 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4243 "Ant Det PSD Value",
4244 psd_scan->ant_det_psd_scan_peak_val
4251 /*bt_patch_ver = btcoexist->bt_info.bt_get_fw_ver;*/
4252 bt_patch_ver = btcoexist->bt_info.bt_get_fw_ver;
4253 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
4254 phyver = btcoexist->btc_get_bt_phydm_version(btcoexist);
4256 bt_coex_ver = (coex_sta->bt_coex_supported_version & 0xff);
4258 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4259 "\r\n %-35s = %d_%02x/ 0x%02x/ 0x%02x (%s)",
4260 "CoexVer WL/ BT_Desired/ BT_Report",
4261 glcoex_ver_date_8822b_2ant, glcoex_ver_8822b_2ant,
4262 glcoex_ver_btdesired_8822b_2ant,
4264 (bt_coex_ver == 0xff ? "Unknown" :
4265 (bt_coex_ver >= glcoex_ver_btdesired_8822b_2ant ?
4266 "Match" : "Mis-Match")));
4269 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4270 "\r\n %-35s = 0x%x/ 0x%x/ v%d/ %c",
4271 "W_FW/ B_FW/ Phy/ Kt",
4272 fw_ver, bt_patch_ver, phyver,
4273 coex_sta->cut_version + 65);
4276 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ",
4278 coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1],
4279 coex_dm->wifi_chnl_info[2]);
4282 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d ",
4283 "Isolation/WL_Thres/BT_Thres",
4284 coex_sta->isolation_btween_wb,
4285 coex_sta->wifi_coex_thres,
4286 coex_sta->bt_coex_thres);
4290 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4291 "============[Wifi Status]============");
4293 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_WIFI_STATUS);
4295 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4296 "============[BT Status]============");
4299 pop_report_in_10s++;
4300 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4301 "\r\n %-35s = [%s/ %d dBm/ %d/ %d] ",
4302 "BT [status/ rssi/ retryCnt/ popCnt]",
4303 ((coex_sta->bt_disabled) ? ("disabled") : ((
4304 coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page")
4305 : ((BT_8822B_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
4306 coex_dm->bt_status) ? "non-connected idle" :
4307 ((BT_8822B_2ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)
4308 ? "connected-idle" : "busy")))),
4309 coex_sta->bt_rssi - 100, coex_sta->bt_retry_cnt,
4310 coex_sta->pop_event_cnt);
4313 if (pop_report_in_10s >= 5) {
4314 coex_sta->pop_event_cnt = 0;
4315 pop_report_in_10s = 0;
4319 if (coex_sta->num_of_profile != 0)
4320 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4321 "\r\n %-35s = %s%s%s%s%s",
4323 ((bt_link_info->a2dp_exist) ? "A2DP," : ""),
4324 ((bt_link_info->sco_exist) ? "SCO," : ""),
4325 ((bt_link_info->hid_exist) ?
4326 ((coex_sta->hid_busy_num >= 2) ? "HID(4/18)," :
4327 "HID(2/18),") : ""),
4328 ((bt_link_info->pan_exist) ? "PAN," : ""),
4329 ((coex_sta->voice_over_HOGP) ? "Voice" : ""));
4331 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4332 "\r\n %-35s = None", "Profiles");
4337 if (bt_link_info->a2dp_exist) {
4338 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %d/ %s",
4339 "A2DP Rate/Bitpool/Auto_Slot",
4340 ((coex_sta->is_A2DP_3M) ? "3M" : "No_3M"),
4341 coex_sta->a2dp_bit_pool,
4342 ((coex_sta->is_autoslot) ? "On" : "Off")
4347 if (bt_link_info->hid_exist) {
4348 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
4349 "HID PairNum/Forbid_Slot",
4350 coex_sta->hid_pair_cnt,
4351 coex_sta->forbidden_slot
4356 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ 0x%x",
4357 "Role/IgnWlanAct/Feature",
4358 ((bt_link_info->slave_role) ? "Slave" : "Master"),
4359 ((coex_dm->cur_ignore_wlan_act) ? "Yes" : "No"),
4360 coex_sta->bt_coex_supported_feature);
4363 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d",
4364 "ReInit/ReLink/IgnWlact/Page/NameReq",
4365 coex_sta->cnt_ReInit,
4366 coex_sta->cnt_setupLink,
4367 coex_sta->cnt_IgnWlanAct,
4369 coex_sta->cnt_RemoteNameReq
4373 halbtc8822b2ant_read_score_board(btcoexist, &u16tmp[0]);
4375 if ((coex_sta->bt_reg_vendor_ae == 0xffff) ||
4376 (coex_sta->bt_reg_vendor_ac == 0xffff))
4377 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = x/ x/ %04x",
4378 "0xae[4]/0xac[1:0]/Scoreboard", u16tmp[0]);
4380 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4381 "\r\n %-35s = 0x%x/ 0x%x/ %04x",
4382 "0xae[4]/0xac[1:0]/Scoreboard",
4383 ((coex_sta->bt_reg_vendor_ae & BIT(4)) >> 4),
4384 coex_sta->bt_reg_vendor_ac & 0x3, u16tmp[0]);
4387 for (i = 0; i < BT_INFO_SRC_8822B_2ANT_MAX; i++) {
4388 if (coex_sta->bt_info_c2h_cnt[i]) {
4389 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4390 "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)",
4391 glbt_info_src_8822b_2ant[i],
4392 coex_sta->bt_info_c2h[i][0],
4393 coex_sta->bt_info_c2h[i][1],
4394 coex_sta->bt_info_c2h[i][2],
4395 coex_sta->bt_info_c2h[i][3],
4396 coex_sta->bt_info_c2h[i][4],
4397 coex_sta->bt_info_c2h[i][5],
4398 coex_sta->bt_info_c2h[i][6],
4399 coex_sta->bt_info_c2h_cnt[i]);
4405 if (btcoexist->manual_control)
4406 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4407 "============[mechanism] (before Manual)============");
4409 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4410 "============[Mechanism]============");
4415 ps_tdma_case = coex_dm->cur_ps_tdma;
4417 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4418 "\r\n %-35s = %02x %02x %02x %02x %02x (case-%d, %s, %s)",
4420 coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1],
4421 coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3],
4422 coex_dm->ps_tdma_para[4], ps_tdma_case,
4423 (coex_dm->cur_ps_tdma_on ? "TDMA On" : "TDMA Off"),
4424 (coex_dm->is_switch_to_1dot5_ant ? "1.5Ant" : "2Ant"));
4427 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
4428 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
4429 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
4430 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4431 "\r\n %-35s = %d/ 0x%x/ 0x%x/ 0x%x",
4432 "Table/0x6c0/0x6c4/0x6c8",
4433 coex_sta->coex_table_type, u32tmp[0], u32tmp[1], u32tmp[2]);
4436 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
4437 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6cc);
4438 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4439 "\r\n %-35s = 0x%x/ 0x%x",
4441 u8tmp[0], u32tmp[0]);
4444 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s",
4445 "AntDiv/ForceLPS/LPRA",
4446 ((board_info->ant_div_cfg) ? "On" : "Off"),
4447 ((coex_sta->force_lps_on) ? "On" : "Off"),
4448 ((coex_dm->cur_low_penalty_ra) ? "On" : "Off"));
4451 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
4452 "WL_DACSwing/ BT_Dec_Pwr", coex_dm->cur_fw_dac_swing_lvl,
4453 coex_dm->cur_bt_dec_pwr_lvl);
4456 u32tmp[0] = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
4457 lte_coex_on = ((u32tmp[0] & BIT(7)) >> 7) ? true : false;
4461 u32tmp[0] = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist,
4463 u32tmp[1] = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist,
4465 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
4466 "LTE Coex Table W_L/B_L",
4467 u32tmp[0] & 0xffff, u32tmp[1] & 0xffff);
4471 u32tmp[0] = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist,
4473 u32tmp[1] = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist,
4475 u32tmp[2] = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist,
4477 u32tmp[3] = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist,
4479 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4480 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
4481 "LTE Break Table W_L/B_L/L_W/L_B",
4482 u32tmp[0] & 0xffff, u32tmp[1] & 0xffff,
4483 u32tmp[2] & 0xffff, u32tmp[3] & 0xffff);
4489 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4490 "============[Hw setting]============");
4493 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
4494 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
4495 u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
4496 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
4497 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
4498 "0x430/0x434/0x42a/0x456",
4499 u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]);
4502 u32tmp[0] = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
4503 u32tmp[1] = halbtc8822b2ant_ltecoex_indirect_read_reg(btcoexist, 0x54);
4504 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x73);
4506 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s",
4507 "LTE Coex/Path Owner",
4508 ((lte_coex_on) ? "On" : "Off") ,
4509 ((u8tmp[0] & BIT(2)) ? "WL" : "BT"));
4513 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
4514 "LTE 3Wire/OPMode/UART/UARTMode",
4515 (int)((u32tmp[0] & BIT(6)) >> 6),
4516 (int)((u32tmp[0] & (BIT(5) | BIT(4))) >> 4),
4517 (int)((u32tmp[0] & BIT(3)) >> 3),
4518 (int)(u32tmp[0] & (BIT(2) | BIT(1) | BIT(0))));
4521 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
4522 "LTE_Busy/UART_Busy",
4523 (int)((u32tmp[1] & BIT(1)) >> 1), (int)(u32tmp[1] & BIT(0)));
4526 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4527 "\r\n %-35s = %s (BB:%s)/ %s (BB:%s)/ %s",
4528 "GNT_WL_Ctrl/GNT_BT_Ctrl/Dbg",
4529 ((u32tmp[0] & BIT(12)) ? "SW" : "HW"),
4530 ((u32tmp[0] & BIT(8)) ? "SW" : "HW"),
4531 ((u32tmp[0] & BIT(14)) ? "SW" : "HW"),
4532 ((u32tmp[0] & BIT(10)) ? "SW" : "HW"),
4533 ((u8tmp[0] & BIT(3)) ? "On" : "Off"));
4536 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
4538 (int)((u32tmp[1] & BIT(2)) >> 2),
4539 (int)((u32tmp[1] & BIT(3)) >> 3));
4542 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xcb0);
4543 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
4544 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xcbd);
4546 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4547 "\r\n %-35s = 0x%04x/ 0x%04x/ 0x%x",
4548 "0xcb0/0xcb4/0xcbd",
4549 u32tmp[0], u32tmp[1], u8tmp[0]);
4552 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
4553 u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64);
4554 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x4c6);
4555 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
4556 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4557 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
4558 "0x4c[24:23]/0x64[0]/x4c6[4]/0x40[5]",
4559 (u32tmp[0] & (BIT(24) | BIT(23))) >> 23 , u8tmp[2] & 0x1 ,
4560 (int)((u8tmp[0] & BIT(4)) >> 4),
4561 (int)((u8tmp[1] & BIT(5)) >> 5));
4564 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
4565 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
4566 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x953);
4567 u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0xc50);
4569 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4570 "\r\n %-35s = 0x%x/ 0x%x/ %s/ 0x%x",
4571 "0x550/0x522/4-RxAGC/0xc50",
4572 u32tmp[0], u8tmp[0], (u8tmp[1] & 0x2) ? "On" : "Off", u8tmp[2]);
4575 fa_ofdm = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
4576 PHYDM_INFO_FA_OFDM);
4577 fa_cck = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
4579 cca_ofdm = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
4580 PHYDM_INFO_CCA_OFDM);
4581 cca_cck = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
4582 PHYDM_INFO_CCA_CCK);
4584 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4585 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
4586 "CCK-CCA/CCK-FA/OFDM-CCA/OFDM-FA",
4587 cca_cck, fa_cck, cca_ofdm, fa_ofdm);
4591 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
4592 "CRC_OK CCK/11g/11n/11ac",
4593 coex_sta->crc_ok_cck, coex_sta->crc_ok_11g,
4594 coex_sta->crc_ok_11n, coex_sta->crc_ok_11n_vht);
4597 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
4598 "CRC_Err CCK/11g/11n/11ac",
4599 coex_sta->crc_err_cck, coex_sta->crc_err_11g,
4600 coex_sta->crc_err_11n, coex_sta->crc_err_11n_vht);
4603 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
4604 "0x770(Hi-pri rx/tx)",
4605 coex_sta->high_priority_rx, coex_sta->high_priority_tx);
4607 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
4608 "0x774(Lo-pri rx/tx)",
4609 coex_sta->low_priority_rx, coex_sta->low_priority_tx);
4612 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS);
4616 void ex_halbtc8822b2ant_ips_notify(IN struct btc_coexist *btcoexist, IN u8 type)
4618 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
4621 if (BTC_IPS_ENTER == type) {
4622 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4623 "[BTCoex], IPS ENTER notify\n");
4624 BTC_TRACE(trace_buf);
4625 coex_sta->under_ips = true;
4626 coex_sta->under_lps = false;
4628 halbtc8822b2ant_post_state_to_bt(btcoexist,
4629 BT_8822B_2ANT_SCOREBOARD_ACTIVE, false);
4631 halbtc8822b2ant_post_state_to_bt(btcoexist,
4632 BT_8822B_2ANT_SCOREBOARD_ONOFF, false);
4634 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
4636 BT_8822B_2ANT_PHASE_WLAN_OFF);
4638 halbtc8822b2ant_action_coex_all_off(btcoexist);
4639 } else if (BTC_IPS_LEAVE == type) {
4640 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4641 "[BTCoex], IPS LEAVE notify\n");
4642 BTC_TRACE(trace_buf);
4643 coex_sta->under_ips = false;
4645 halbtc8822b2ant_post_state_to_bt(btcoexist,
4646 BT_8822B_2ANT_SCOREBOARD_ACTIVE, true);
4647 halbtc8822b2ant_post_state_to_bt(btcoexist,
4648 BT_8822B_2ANT_SCOREBOARD_ONOFF, true);
4649 halbtc8822b2ant_init_hw_config(btcoexist, false);
4650 halbtc8822b2ant_init_coex_dm(btcoexist);
4651 halbtc8822b2ant_query_bt_info(btcoexist);
4655 void ex_halbtc8822b2ant_lps_notify(IN struct btc_coexist *btcoexist, IN u8 type)
4657 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
4660 if (BTC_LPS_ENABLE == type) {
4661 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4662 "[BTCoex], LPS ENABLE notify\n");
4663 BTC_TRACE(trace_buf);
4664 coex_sta->under_lps = true;
4665 coex_sta->under_ips = false;
4667 if (coex_sta->force_lps_on == true) { /* LPS No-32K */
4668 /* Write WL "Active" in Score-board for PS-TDMA */
4669 halbtc8822b2ant_post_state_to_bt(btcoexist,
4670 BT_8822B_2ANT_SCOREBOARD_ACTIVE, true);
4672 } else { /* LPS-32K, need check if this h2c 0x71 can work?? (2015/08/28) */
4673 /* Write WL "Non-Active" in Score-board for Native-PS */
4674 halbtc8822b2ant_post_state_to_bt(btcoexist,
4675 BT_8822B_2ANT_SCOREBOARD_ACTIVE, false);
4679 } else if (BTC_LPS_DISABLE == type) {
4680 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4681 "[BTCoex], LPS DISABLE notify\n");
4682 BTC_TRACE(trace_buf);
4683 coex_sta->under_lps = false;
4685 halbtc8822b2ant_post_state_to_bt(btcoexist,
4686 BT_8822B_2ANT_SCOREBOARD_ACTIVE, true);
4690 void ex_halbtc8822b2ant_scan_notify(IN struct btc_coexist *btcoexist,
4693 boolean wifi_connected = false;
4694 boolean wifi_under_5g = false;
4697 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4698 "[BTCoex], SCAN notify()\n");
4699 BTC_TRACE(trace_buf);
4701 halbtc8822b2ant_post_state_to_bt(btcoexist,
4702 BT_8822B_2ANT_SCOREBOARD_ACTIVE, true);
4704 if (btcoexist->manual_control ||
4705 btcoexist->stop_coex_dm)
4708 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
4711 /* this can't be removed for RF off_on event, or BT would dis-connect */
4712 halbtc8822b2ant_query_bt_info(btcoexist);
4714 if (BTC_SCAN_START == type) {
4716 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G,
4719 if (wifi_under_5g) {
4720 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4721 "[BTCoex], ********** SCAN START notify (5g)\n");
4722 BTC_TRACE(trace_buf);
4724 halbtc8822b2ant_action_wifi_under5g(btcoexist);
4728 coex_sta->wifi_is_high_pri_task = true;
4730 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4731 "[BTCoex], ********** SCAN START notify (2g)\n");
4732 BTC_TRACE(trace_buf);
4734 halbtc8822b2ant_run_coexist_mechanism(
4741 if (BTC_SCAN_START_2G == type) {
4743 if (!wifi_connected)
4744 coex_sta->wifi_is_high_pri_task = true;
4746 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4747 "[BTCoex], SCAN START notify (2G)\n");
4748 BTC_TRACE(trace_buf);
4750 halbtc8822b2ant_post_state_to_bt(btcoexist,
4751 BT_8822B_2ANT_SCOREBOARD_SCAN, true);
4752 halbtc8822b2ant_post_state_to_bt(btcoexist,
4753 BT_8822B_2ANT_SCOREBOARD_ACTIVE, true);
4755 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
4757 BT_8822B_2ANT_PHASE_2G_RUNTIME);
4759 halbtc8822b2ant_run_coexist_mechanism(btcoexist);
4761 } else if (BTC_SCAN_FINISH == type) {
4763 coex_sta->wifi_is_high_pri_task = false;
4765 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
4766 &coex_sta->scan_ap_num);
4768 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4769 "[BTCoex], SCAN FINISH notify (Scan-AP = %d)\n",
4770 coex_sta->scan_ap_num);
4771 BTC_TRACE(trace_buf);
4773 halbtc8822b2ant_post_state_to_bt(btcoexist,
4774 BT_8822B_2ANT_SCOREBOARD_SCAN, false);
4776 halbtc8822b2ant_run_coexist_mechanism(btcoexist);
4781 void ex_halbtc8822b2ant_switchband_notify(IN struct btc_coexist *btcoexist,
4785 boolean wifi_connected = false, bt_hs_on = false;
4786 u32 wifi_link_status = 0;
4787 u32 num_of_wifi_link = 0;
4788 boolean bt_ctrl_agg_buf_size = false;
4789 u8 agg_buf_size = 5;
4792 if (btcoexist->manual_control ||
4793 btcoexist->stop_coex_dm)
4796 if (type == BTC_SWITCH_TO_5G) {
4798 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4799 "[BTCoex], switchband_notify --- switch to 5G\n");
4800 BTC_TRACE(trace_buf);
4802 halbtc8822b2ant_action_wifi_under5g(btcoexist);
4804 } else if (type == BTC_SWITCH_TO_24G_NOFORSCAN) {
4805 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4806 "[BTCoex], ********** switchband_notify BTC_SWITCH_TO_2G (no for scan)\n");
4807 BTC_TRACE(trace_buf);
4809 halbtc8822b2ant_run_coexist_mechanism(btcoexist);
4813 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4814 "[BTCoex], switchband_notify --- switch to 2G\n");
4815 BTC_TRACE(trace_buf);
4817 ex_halbtc8822b2ant_scan_notify(btcoexist,
4823 void ex_halbtc8822b2ant_connect_notify(IN struct btc_coexist *btcoexist,
4827 halbtc8822b2ant_post_state_to_bt(btcoexist,
4828 BT_8822B_2ANT_SCOREBOARD_ACTIVE, true);
4829 if (btcoexist->manual_control ||
4830 btcoexist->stop_coex_dm)
4833 if ((BTC_ASSOCIATE_5G_START == type) ||
4834 (BTC_ASSOCIATE_5G_FINISH == type)) {
4836 if (BTC_ASSOCIATE_5G_START == type)
4837 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4838 "[BTCoex], connect_notify --- 5G start\n");
4840 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4841 "[BTCoex], connect_notify --- 5G finish\n");
4843 BTC_TRACE(trace_buf);
4845 halbtc8822b2ant_action_wifi_under5g(btcoexist);
4850 if (BTC_ASSOCIATE_START == type) {
4852 coex_sta->wifi_is_high_pri_task = true;
4854 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4855 "[BTCoex], CONNECT START notify (2G)\n");
4856 BTC_TRACE(trace_buf);
4858 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
4860 BT_8822B_2ANT_PHASE_2G_RUNTIME);
4862 halbtc8822b2ant_action_wifi_link_process(btcoexist);
4864 /* To keep TDMA case during connect process,
4865 to avoid changed by Btinfo and runcoexmechanism */
4866 coex_sta->freeze_coexrun_by_btinfo = true;
4868 coex_dm->arp_cnt = 0;
4870 } else if (BTC_ASSOCIATE_FINISH == type) {
4872 coex_sta->wifi_is_high_pri_task = false;
4873 coex_sta->freeze_coexrun_by_btinfo = false;
4875 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4876 "[BTCoex], CONNECT FINISH notify (2G)\n");
4877 BTC_TRACE(trace_buf);
4879 halbtc8822b2ant_run_coexist_mechanism(btcoexist);
4883 void ex_halbtc8822b2ant_media_status_notify(IN struct btc_coexist *btcoexist,
4886 u8 h2c_parameter[3] = {0};
4888 u8 wifi_central_chnl;
4890 boolean wifi_under_b_mode = false, wifi_under_5g = false;
4893 if (btcoexist->manual_control ||
4894 btcoexist->stop_coex_dm)
4897 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
4899 if (BTC_MEDIA_CONNECT == type) {
4901 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4902 "[BTCoex], MEDIA connect notify\n");
4903 BTC_TRACE(trace_buf);
4905 halbtc8822b2ant_post_state_to_bt(btcoexist,
4906 BT_8822B_2ANT_SCOREBOARD_ACTIVE, true);
4908 if (wifi_under_5g) {
4910 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4911 "[BTCoex], WiFi is under 5G!!!\n");
4912 BTC_TRACE(trace_buf);
4914 halbtc8822b2ant_action_wifi_under5g(btcoexist);
4918 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
4920 BT_8822B_2ANT_PHASE_2G_RUNTIME);
4922 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
4923 &wifi_under_b_mode);
4925 /* Set CCK Tx/Rx high Pri except 11b mode */
4926 if (wifi_under_b_mode) {
4927 btcoexist->btc_write_1byte(btcoexist, 0x6cd,
4929 btcoexist->btc_write_1byte(btcoexist, 0x6cf,
4933 btcoexist->btc_write_1byte(btcoexist, 0x6cd,
4935 btcoexist->btc_write_1byte(btcoexist, 0x6cf,
4940 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4941 "[BTCoex], MEDIA disconnect notify\n");
4942 BTC_TRACE(trace_buf);
4944 btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x0); /* CCK Tx */
4945 btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x0); /* CCK Rx */
4947 halbtc8822b2ant_post_state_to_bt(btcoexist,
4948 BT_8822B_2ANT_SCOREBOARD_ACTIVE, false);
4952 halbtc8822b2ant_update_wifi_channel_info(btcoexist, type);
4955 void ex_halbtc8822b2ant_specific_packet_notify(IN struct btc_coexist *btcoexist,
4958 boolean under_4way = false, wifi_under_5g = false;
4960 if (btcoexist->manual_control ||
4961 btcoexist->stop_coex_dm)
4964 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
4966 if (wifi_under_5g) {
4968 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4969 "[BTCoex], WiFi is under 5G!!!\n");
4970 BTC_TRACE(trace_buf);
4972 halbtc8822b2ant_action_wifi_under5g(btcoexist);
4976 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
4981 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4982 "[BTCoex], specific Packet ---- under_4way!!\n");
4983 BTC_TRACE(trace_buf);
4985 coex_sta->wifi_is_high_pri_task = true;
4986 coex_sta->specific_pkt_period_cnt = 2;
4988 } else if (BTC_PACKET_ARP == type) {
4991 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4992 "[BTCoex], specific Packet ARP notify -cnt = %d\n",
4994 BTC_TRACE(trace_buf);
4998 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4999 "[BTCoex], specific Packet DHCP or EAPOL notify [Type = %d]\n",
5001 BTC_TRACE(trace_buf);
5003 coex_sta->wifi_is_high_pri_task = true;
5004 coex_sta->specific_pkt_period_cnt = 2;
5007 if (coex_sta->wifi_is_high_pri_task)
5008 halbtc8822b2ant_run_coexist_mechanism(btcoexist);
5012 void ex_halbtc8822b2ant_bt_info_notify(IN struct btc_coexist *btcoexist,
5013 IN u8 *tmp_buf, IN u8 length)
5015 u8 i, rsp_source = 0;
5016 boolean wifi_connected = false;
5018 if (psd_scan->is_AntDet_running == true) {
5019 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5020 "[BTCoex], bt_info_notify return for AntDet is running\n");
5021 BTC_TRACE(trace_buf);
5025 rsp_source = tmp_buf[0] & 0xf;
5026 if (rsp_source >= BT_INFO_SRC_8822B_2ANT_MAX)
5027 rsp_source = BT_INFO_SRC_8822B_2ANT_WIFI_FW;
5028 coex_sta->bt_info_c2h_cnt[rsp_source]++;
5030 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5031 "[BTCoex], Bt_info[%d], len=%d, data=[", rsp_source,
5033 BTC_TRACE(trace_buf);
5035 for (i = 0; i < length; i++) {
5036 coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
5038 if (i == length - 1) {
5039 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x]\n",
5041 BTC_TRACE(trace_buf);
5043 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x, ",
5045 BTC_TRACE(trace_buf);
5049 coex_sta->bt_info = coex_sta->bt_info_c2h[rsp_source][1];
5050 coex_sta->bt_info_ext = coex_sta->bt_info_c2h[rsp_source][4];
5051 coex_sta->bt_info_ext2 = coex_sta->bt_info_c2h[rsp_source][5];
5053 if (BT_INFO_SRC_8822B_2ANT_WIFI_FW != rsp_source) {
5055 /* if 0xff, it means BT is under WHCK test */
5056 coex_sta->bt_whck_test = ((coex_sta->bt_info == 0xff) ? true :
5059 coex_sta->bt_create_connection = ((
5060 coex_sta->bt_info_c2h[rsp_source][2] & 0x80) ? true :
5063 /* unit: %, value-100 to translate to unit: dBm */
5064 coex_sta->bt_rssi = coex_sta->bt_info_c2h[rsp_source][3] * 2 +
5067 coex_sta->c2h_bt_remote_name_req = ((
5068 coex_sta->bt_info_c2h[rsp_source][2] & 0x20) ? true :
5071 coex_sta->is_A2DP_3M = ((coex_sta->bt_info_c2h[rsp_source][2] &
5072 0x10) ? true : false);
5074 coex_sta->acl_busy = ((coex_sta->bt_info_c2h[rsp_source][1] &
5075 0x9) ? true : false);
5077 coex_sta->voice_over_HOGP = ((coex_sta->bt_info_ext & 0x10) ?
5080 coex_sta->c2h_bt_inquiry_page = ((coex_sta->bt_info &
5081 BT_INFO_8822B_2ANT_B_INQ_PAGE) ? true : false);
5083 coex_sta->a2dp_bit_pool = (((
5084 coex_sta->bt_info_c2h[rsp_source][1] & 0x49) == 0x49) ?
5085 coex_sta->bt_info_c2h[rsp_source][6] : 0);
5087 coex_sta->bt_retry_cnt = coex_sta->bt_info_c2h[rsp_source][2] &
5090 coex_sta->is_autoslot = coex_sta->bt_info_ext2 & 0x8;
5092 coex_sta->forbidden_slot = coex_sta->bt_info_ext2 & 0x7;
5094 coex_sta->hid_busy_num = (coex_sta->bt_info_ext2 & 0x30) >> 4;
5096 coex_sta->hid_pair_cnt = (coex_sta->bt_info_ext2 & 0xc0) >> 6;
5098 if (coex_sta->bt_retry_cnt >= 1)
5099 coex_sta->pop_event_cnt++;
5101 if (coex_sta->c2h_bt_remote_name_req)
5102 coex_sta->cnt_RemoteNameReq++;
5104 if (coex_sta->bt_info_ext & BIT(1))
5105 coex_sta->cnt_ReInit++;
5107 if (coex_sta->bt_info_ext & BIT(2)) {
5108 coex_sta->cnt_setupLink++;
5109 coex_sta->is_setupLink = true;
5111 coex_sta->is_setupLink = false;
5113 if (coex_sta->bt_info_ext & BIT(3))
5114 coex_sta->cnt_IgnWlanAct++;
5116 if (coex_sta->bt_create_connection)
5117 coex_sta->cnt_Page++;
5119 /* Here we need to resend some wifi info to BT */
5120 /* because bt is reset and loss of the info. */
5122 if ((!btcoexist->manual_control) &&
5123 (!btcoexist->stop_coex_dm)) {
5125 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
5129 if ((coex_sta->bt_info_ext & BIT(1))) {
5130 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5131 "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
5132 BTC_TRACE(trace_buf);
5134 halbtc8822b2ant_update_wifi_channel_info(
5135 btcoexist, BTC_MEDIA_CONNECT);
5137 halbtc8822b2ant_update_wifi_channel_info(
5139 BTC_MEDIA_DISCONNECT);
5143 /* If Ignore_WLanAct && not SetUp_Link */
5144 if ((coex_sta->bt_info_ext & BIT(3)) &&
5145 (!(coex_sta->bt_info_ext & BIT(2)))) {
5147 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5148 "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
5149 BTC_TRACE(trace_buf);
5150 halbtc8822b2ant_ignore_wlan_act(btcoexist,
5158 halbtc8822b2ant_update_bt_link_info(btcoexist);
5160 if (btcoexist->manual_control) {
5161 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5162 "[BTCoex], BtInfoNotify(), No run_coexist_mechanism for Manual CTRL\n");
5163 BTC_TRACE(trace_buf);
5167 if (btcoexist->stop_coex_dm) {
5168 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5169 "[BTCoex], BtInfoNotify(), No run_coexist_mechanism for Stop Coex DM\n");
5170 BTC_TRACE(trace_buf);
5174 coex_sta->c2h_bt_info_req_sent = false;
5176 halbtc8822b2ant_run_coexist_mechanism(btcoexist);
5179 void ex_halbtc8822b2ant_rf_status_notify(IN struct btc_coexist *btcoexist,
5182 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], RF Status notify\n");
5183 BTC_TRACE(trace_buf);
5185 if (BTC_RF_ON == type) {
5186 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5187 "[BTCoex], RF is turned ON!!\n");
5188 BTC_TRACE(trace_buf);
5190 coex_sta->wl_rf_off_on_event = true;
5191 btcoexist->stop_coex_dm = false;
5193 halbtc8822b2ant_post_state_to_bt(btcoexist,
5194 BT_8822B_2ANT_SCOREBOARD_ACTIVE, true);
5195 halbtc8822b2ant_post_state_to_bt(btcoexist,
5196 BT_8822B_2ANT_SCOREBOARD_ONOFF, true);
5197 } else if (BTC_RF_OFF == type) {
5198 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5199 "[BTCoex], RF is turned OFF!!\n");
5200 BTC_TRACE(trace_buf);
5202 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
5204 BT_8822B_2ANT_PHASE_WLAN_OFF);
5206 halbtc8822b2ant_action_coex_all_off(btcoexist);
5208 halbtc8822b2ant_post_state_to_bt(btcoexist,
5209 BT_8822B_2ANT_SCOREBOARD_ACTIVE, false);
5210 halbtc8822b2ant_post_state_to_bt(btcoexist,
5211 BT_8822B_2ANT_SCOREBOARD_ONOFF, false);
5212 btcoexist->stop_coex_dm = true;
5213 coex_sta->wl_rf_off_on_event = false;
5218 void ex_halbtc8822b2ant_halt_notify(IN struct btc_coexist *btcoexist)
5220 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Halt notify\n");
5221 BTC_TRACE(trace_buf);
5223 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, FORCE_EXEC,
5224 BT_8822B_2ANT_PHASE_WLAN_OFF);
5226 ex_halbtc8822b2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
5228 halbtc8822b2ant_post_state_to_bt(btcoexist,
5229 BT_8822B_2ANT_SCOREBOARD_ACTIVE, false);
5230 halbtc8822b2ant_post_state_to_bt(btcoexist,
5231 BT_8822B_2ANT_SCOREBOARD_ONOFF, false);
5234 void ex_halbtc8822b2ant_pnp_notify(IN struct btc_coexist *btcoexist,
5237 boolean wifi_under_5g = false;
5239 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Pnp notify\n");
5240 BTC_TRACE(trace_buf);
5242 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
5244 if ((BTC_WIFI_PNP_SLEEP == pnp_state) ||
5245 (BTC_WIFI_PNP_SLEEP_KEEP_ANT == pnp_state)) {
5246 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5247 "[BTCoex], Pnp notify to SLEEP\n");
5248 BTC_TRACE(trace_buf);
5250 /* Sinda 20150819, workaround for driver skip leave IPS/LPS to speed up sleep time. */
5251 /* Driver do not leave IPS/LPS when driver is going to sleep, so BTCoexistence think wifi is still under IPS/LPS */
5252 /* BT should clear UnderIPS/UnderLPS state to avoid mismatch state after wakeup. */
5253 coex_sta->under_ips = false;
5254 coex_sta->under_lps = false;
5256 halbtc8822b2ant_post_state_to_bt(btcoexist,
5257 BT_8822B_2ANT_SCOREBOARD_ACTIVE, false);
5258 halbtc8822b2ant_post_state_to_bt(btcoexist,
5259 BT_8822B_2ANT_SCOREBOARD_ONOFF, false);
5262 if (BTC_WIFI_PNP_SLEEP_KEEP_ANT == pnp_state) {
5265 halbtc8822b2ant_set_ant_path(btcoexist,
5266 BTC_ANT_PATH_AUTO, FORCE_EXEC,
5267 BT_8822B_2ANT_PHASE_5G_RUNTIME);
5269 halbtc8822b2ant_set_ant_path(btcoexist,
5270 BTC_ANT_PATH_AUTO, FORCE_EXEC,
5271 BT_8822B_2ANT_PHASE_2G_RUNTIME);
5274 halbtc8822b2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
5276 BT_8822B_2ANT_PHASE_WLAN_OFF);
5278 } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
5279 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5280 "[BTCoex], Pnp notify to WAKE UP\n");
5281 BTC_TRACE(trace_buf);
5283 halbtc8822b2ant_post_state_to_bt(btcoexist,
5284 BT_8822B_2ANT_SCOREBOARD_ACTIVE, true);
5285 halbtc8822b2ant_post_state_to_bt(btcoexist,
5286 BT_8822B_2ANT_SCOREBOARD_ONOFF, true);
5290 void ex_halbtc8822b2ant_periodical(IN struct btc_coexist *btcoexist)
5292 struct btc_board_info *board_info = &btcoexist->board_info;
5293 boolean wifi_busy = false;
5295 u16 bt_scoreboard_val = 0;
5297 boolean bt_relink_finish = false;
5299 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5300 "[BTCoex], ************* Periodical *************\n");
5301 BTC_TRACE(trace_buf);
5303 #if (BT_AUTO_REPORT_ONLY_8822B_2ANT == 0)
5304 halbtc8822b2ant_query_bt_info(btcoexist);
5307 halbtc8822b2ant_monitor_bt_ctr(btcoexist);
5308 halbtc8822b2ant_monitor_wifi_ctr(btcoexist);
5309 halbtc8822b2ant_monitor_bt_enable_disable(btcoexist);
5312 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
5313 halbtc8822b2ant_read_score_board(btcoexist, &bt_scoreboard_val);
5316 halbtc8822b2ant_post_state_to_bt(btcoexist,
5317 BT_8822B_2ANT_SCOREBOARD_UNDERTEST, true);
5318 /*for bt lps32 clock offset*/
5319 if (bt_scoreboard_val & BIT(6))
5320 halbtc8822b2ant_query_bt_info(btcoexist);
5322 halbtc8822b2ant_post_state_to_bt(btcoexist,
5323 BT_8822B_2ANT_SCOREBOARD_UNDERTEST, false);
5325 halbtc8822b2ant_post_state_to_bt(btcoexist,
5326 BT_8822B_2ANT_SCOREBOARD_WLBUSY,
5331 if (coex_sta->bt_relink_downcount != 0) {
5332 coex_sta->bt_relink_downcount--;
5334 if (coex_sta->bt_relink_downcount == 0)
5335 bt_relink_finish = true;
5338 /* for 4-way, DHCP, EAPOL packet */
5339 if (coex_sta->specific_pkt_period_cnt > 0) {
5341 coex_sta->specific_pkt_period_cnt--;
5343 if ((coex_sta->specific_pkt_period_cnt == 0) &&
5344 (coex_sta->wifi_is_high_pri_task))
5345 coex_sta->wifi_is_high_pri_task = false;
5347 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5348 "[BTCoex], ***************** Hi-Pri Task = %s*****************\n",
5349 (coex_sta->wifi_is_high_pri_task ? "Yes" :
5351 BTC_TRACE(trace_buf);
5355 if (!coex_sta->bt_disabled) {
5356 if (coex_sta->bt_coex_supported_feature == 0)
5357 btcoexist->btc_get(btcoexist, BTC_GET_U4_SUPPORTED_FEATURE, &coex_sta->bt_coex_supported_feature);
5359 if ((coex_sta->bt_coex_supported_version == 0) ||
5360 (coex_sta->bt_coex_supported_version == 0xffff))
5361 btcoexist->btc_get(btcoexist, BTC_GET_U4_SUPPORTED_VERSION, &coex_sta->bt_coex_supported_version);
5363 /*coex_sta->bt_ble_scan_type = btcoexist->btc_get_ble_scan_type_from_bt(btcoexist);*/
5364 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
5365 btcoexist->bt_info.bt_get_fw_ver = bt_patch_ver;
5367 if (coex_sta->bt_reg_vendor_ac == 0xffff)
5368 coex_sta->bt_reg_vendor_ac = (u16)(
5369 btcoexist->btc_get_bt_reg(btcoexist, 3,
5372 if (coex_sta->bt_reg_vendor_ae == 0xffff)
5373 coex_sta->bt_reg_vendor_ae = (u16)(
5374 btcoexist->btc_get_bt_reg(btcoexist, 3,
5377 if (halbtc8822b2ant_is_wifibt_status_changed(btcoexist))
5378 halbtc8822b2ant_run_coexist_mechanism(btcoexist);
5382 /*#pragma optimize( "", off )*/
5383 void ex_halbtc8822b2ant_antenna_detection(IN struct btc_coexist *btcoexist,
5384 IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds)
5387 static u32 ant_det_count = 0, ant_det_fail_count = 0;
5388 struct btc_board_info *board_info = &btcoexist->board_info;
5392 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5393 "xxxxxxxxxxxxxxxx Ext Call AntennaDetect()!!\n");
5394 BTC_TRACE(trace_buf);
5396 #if BT_8822B_2ANT_ANTDET_ENABLE
5398 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5399 "xxxxxxxxxxxxxxxx Call AntennaDetect()!!\n");
5400 BTC_TRACE(trace_buf);
5403 psd_scan->ant_det_try_count = 0;
5404 psd_scan->ant_det_fail_count = 0;
5406 ant_det_fail_count = 0;
5407 board_info->btdm_ant_det_finish = false;
5408 board_info->btdm_ant_num_by_ant_det = 1;
5412 if (!board_info->btdm_ant_det_finish) {
5413 psd_scan->ant_det_inteval_count =
5414 psd_scan->ant_det_inteval_count + 2;
5416 if (psd_scan->ant_det_inteval_count >=
5417 BT_8822B_2ANT_ANTDET_RETRY_INTERVAL) {
5418 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5419 "xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Timer is up, Try Detect!!\n");
5420 BTC_TRACE(trace_buf);
5422 psd_scan->is_AntDet_running = true;
5424 halbtc8822b2ant_read_score_board(btcoexist, &u16tmp);
5427 2)) { /* Antenna detection is already done before last WL power on */
5428 board_info->btdm_ant_det_finish = true;
5429 psd_scan->ant_det_try_count = 1;
5430 psd_scan->ant_det_fail_count = 0;
5431 board_info->btdm_ant_num_by_ant_det = (u16tmp &
5433 psd_scan->ant_det_result = 12;
5435 psd_scan->ant_det_psd_scan_peak_val =
5436 btcoexist->btc_get_ant_det_val_from_bt(
5439 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5440 "xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Result from BT (%d-Ant)\n",
5441 board_info->btdm_ant_num_by_ant_det);
5442 BTC_TRACE(trace_buf);
5444 board_info->btdm_ant_det_finish =
5445 halbtc8822b2ant_psd_antenna_detection_check(
5448 btcoexist->bdontenterLPS = false;
5450 if (board_info->btdm_ant_det_finish) {
5451 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5452 "xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Success!!\n");
5453 BTC_TRACE(trace_buf);
5455 /*for 8822b, btc_set_bt_trx_mask is just used to
5456 notify BT stop le tx and Ant Det Result , not set BT RF TRx Mask */
5457 if (psd_scan->ant_det_result != 12) {
5460 psd_scan->ant_det_psd_scan_peak_val
5464 (board_info->btdm_ant_num_by_ant_det
5465 == 1) ? (AntDetval | 0x80) :
5468 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5469 "xxxxxx AntennaDetect(), Ant Count = %d, PSD Val = %d\n",
5474 BTC_TRACE(trace_buf);
5476 if (btcoexist->btc_set_bt_trx_mask(
5477 btcoexist, AntDetval))
5478 BTC_SPRINTF(trace_buf,
5480 "xxxxxx AntennaDetect(), Notify BT stop le tx by set_bt_trx_mask ok!\n");
5482 BTC_SPRINTF(trace_buf,
5484 "xxxxxx AntennaDetect(), Notify BT stop le tx by set_bt_trx_mask fail!\n");
5486 BTC_TRACE(trace_buf);
5490 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5491 "xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Fail!!\n");
5492 BTC_TRACE(trace_buf);
5495 psd_scan->ant_det_inteval_count = 0;
5496 psd_scan->is_AntDet_running = false;
5498 /* stimulate coex running */
5499 halbtc8822b2ant_run_coexist_mechanism(
5501 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5502 "xxxxxxxxxxxxxxxx AntennaDetect(), Stimulate Coex running\n!!");
5503 BTC_TRACE(trace_buf);
5505 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
5506 "xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Timer is not up! (%d)\n",
5507 psd_scan->ant_det_inteval_count);
5508 BTC_TRACE(trace_buf);
5510 if (psd_scan->ant_det_inteval_count == 8)
5511 btcoexist->bdontenterLPS = true;
5513 btcoexist->bdontenterLPS = false;
5523 void ex_halbtc8822b2ant_display_ant_detection(IN struct btc_coexist *btcoexist)
5526 #if BT_8822B_2ANT_ANTDET_ENABLE
5527 struct btc_board_info *board_info = &btcoexist->board_info;
5529 if (psd_scan->ant_det_try_count != 0) {
5530 halbtc8822b2ant_psd_show_antenna_detect_result(btcoexist);
5532 if (board_info->btdm_ant_det_finish)
5533 halbtc8822b2ant_psd_showdata(btcoexist);
5542 #endif /* #if (RTL8822B_SUPPORT == 1) */