1 /* ************************************************************
4 * This file is for RTL8723B 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 (RTL8723B_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_8723b_1ant glcoex_dm_8723b_1ant;
24 static struct coex_dm_8723b_1ant *coex_dm = &glcoex_dm_8723b_1ant;
25 static struct coex_sta_8723b_1ant glcoex_sta_8723b_1ant;
26 static struct coex_sta_8723b_1ant *coex_sta = &glcoex_sta_8723b_1ant;
27 static struct psdscan_sta_8723b_1ant gl_psd_scan_8723b_1ant;
28 static struct psdscan_sta_8723b_1ant *psd_scan = &gl_psd_scan_8723b_1ant;
31 const char *const glbt_info_src_8723b_1ant[] = {
34 "BT Info[bt auto report]",
37 u32 glcoex_ver_date_8723b_1ant = 20151228;
38 u32 glcoex_ver_8723b_1ant = 0x66;
40 /* ************************************************************
41 * local function proto type if needed
42 * ************************************************************
43 * ************************************************************
44 * local function start with halbtc8723b1ant_
45 * ************************************************************ */
47 void halbtc8723b1ant_update_ra_mask(IN struct btc_coexist *btcoexist,
48 IN boolean force_exec, IN u32 dis_rate_mask)
50 coex_dm->cur_ra_mask = dis_rate_mask;
52 if (force_exec || (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask))
53 btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK,
54 &coex_dm->cur_ra_mask);
55 coex_dm->pre_ra_mask = coex_dm->cur_ra_mask;
58 void halbtc8723b1ant_auto_rate_fallback_retry(IN struct btc_coexist *btcoexist,
59 IN boolean force_exec, IN u8 type)
61 boolean wifi_under_b_mode = false;
63 coex_dm->cur_arfr_type = type;
65 if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {
66 switch (coex_dm->cur_arfr_type) {
67 case 0: /* normal mode */
68 btcoexist->btc_write_4byte(btcoexist, 0x430,
69 coex_dm->backup_arfr_cnt1);
70 btcoexist->btc_write_4byte(btcoexist, 0x434,
71 coex_dm->backup_arfr_cnt2);
74 btcoexist->btc_get(btcoexist,
75 BTC_GET_BL_WIFI_UNDER_B_MODE,
77 if (wifi_under_b_mode) {
78 btcoexist->btc_write_4byte(btcoexist,
80 btcoexist->btc_write_4byte(btcoexist,
83 btcoexist->btc_write_4byte(btcoexist,
85 btcoexist->btc_write_4byte(btcoexist,
94 coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;
97 void halbtc8723b1ant_retry_limit(IN struct btc_coexist *btcoexist,
98 IN boolean force_exec, IN u8 type)
100 coex_dm->cur_retry_limit_type = type;
103 (coex_dm->pre_retry_limit_type !=
104 coex_dm->cur_retry_limit_type)) {
105 switch (coex_dm->cur_retry_limit_type) {
106 case 0: /* normal mode */
107 btcoexist->btc_write_2byte(btcoexist, 0x42a,
108 coex_dm->backup_retry_limit);
110 case 1: /* retry limit=8 */
111 btcoexist->btc_write_2byte(btcoexist, 0x42a,
119 coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;
122 void halbtc8723b1ant_ampdu_max_time(IN struct btc_coexist *btcoexist,
123 IN boolean force_exec, IN u8 type)
125 coex_dm->cur_ampdu_time_type = type;
128 (coex_dm->pre_ampdu_time_type != coex_dm->cur_ampdu_time_type)) {
129 switch (coex_dm->cur_ampdu_time_type) {
130 case 0: /* normal mode */
131 btcoexist->btc_write_1byte(btcoexist, 0x456,
132 coex_dm->backup_ampdu_max_time);
134 case 1: /* AMPDU timw = 0x38 * 32us */
135 btcoexist->btc_write_1byte(btcoexist, 0x456,
143 coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;
146 void halbtc8723b1ant_limited_tx(IN struct btc_coexist *btcoexist,
147 IN boolean force_exec, IN u8 ra_mask_type, IN u8 arfr_type,
148 IN u8 retry_limit_type, IN u8 ampdu_time_type)
150 switch (ra_mask_type) {
151 case 0: /* normal mode */
152 halbtc8723b1ant_update_ra_mask(btcoexist, force_exec,
155 case 1: /* disable cck 1/2 */
156 halbtc8723b1ant_update_ra_mask(btcoexist, force_exec,
159 case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
160 halbtc8723b1ant_update_ra_mask(btcoexist, force_exec,
167 halbtc8723b1ant_auto_rate_fallback_retry(btcoexist, force_exec,
169 halbtc8723b1ant_retry_limit(btcoexist, force_exec, retry_limit_type);
170 halbtc8723b1ant_ampdu_max_time(btcoexist, force_exec, ampdu_time_type);
173 void halbtc8723b1ant_limited_rx(IN struct btc_coexist *btcoexist,
174 IN boolean force_exec, IN boolean rej_ap_agg_pkt,
175 IN boolean bt_ctrl_agg_buf_size, IN u8 agg_buf_size)
177 boolean reject_rx_agg = rej_ap_agg_pkt;
178 boolean bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
179 u8 rx_agg_size = agg_buf_size;
181 /* ============================================ */
182 /* Rx Aggregation related setting */
183 /* ============================================ */
184 btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
186 /* decide BT control aggregation buf size or not */
187 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
188 &bt_ctrl_rx_agg_size);
189 /* aggregation buf size, only work when BT control Rx aggregation size. */
190 btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
191 /* real update aggregation setting */
192 btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
197 void halbtc8723b1ant_query_bt_info(IN struct btc_coexist *btcoexist)
199 u8 h2c_parameter[1] = {0};
201 coex_sta->c2h_bt_info_req_sent = true;
203 h2c_parameter[0] |= BIT(0); /* trigger */
205 btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
208 void halbtc8723b1ant_monitor_bt_ctr(IN struct btc_coexist *btcoexist)
210 u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
211 u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
212 static u32 num_of_bt_counter_chk = 0;
213 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
215 /* to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS */
216 /* if (! (btcoexist->btc_read_1byte(btcoexist, 0x76e) & 0x8) ) */
221 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
222 reg_hp_tx = u32tmp & MASKLWORD;
223 reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
225 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
226 reg_lp_tx = u32tmp & MASKLWORD;
227 reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
229 coex_sta->high_priority_tx = reg_hp_tx;
230 coex_sta->high_priority_rx = reg_hp_rx;
231 coex_sta->low_priority_tx = reg_lp_tx;
232 coex_sta->low_priority_rx = reg_lp_rx;
234 if ((coex_sta->high_priority_tx + coex_sta->high_priority_rx < 50) &&
235 (bt_link_info->hid_exist == true))
236 bt_link_info->hid_exist = false;
238 if ((coex_sta->low_priority_tx > 1050) &&
239 (!coex_sta->c2h_bt_inquiry_page))
240 coex_sta->pop_event_cnt++;
242 if ((coex_sta->low_priority_rx >= 950) && (!coex_sta->under_ips)
243 && (coex_sta->low_priority_rx >=
244 coex_sta->low_priority_tx) &&
245 (!coex_sta->c2h_bt_inquiry_page))
246 bt_link_info->slave_role = true;
248 bt_link_info->slave_role = false;
250 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
251 "[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n",
252 reg_hp_rx, reg_hp_tx, reg_lp_rx, reg_lp_tx);
253 BTC_TRACE(trace_buf);
256 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
258 /* This part is for wifi FW and driver to update BT's status as disabled. */
259 /* The flow is as the following */
261 /* 2. if all BT Tx/Rx counter=0, after 6 sec we query bt info */
262 /* 3. Because BT will not rsp from mailbox, so wifi fw will know BT is disabled */
263 /* 4. FW will rsp c2h for BT that driver will know BT is disabled. */
264 if ((reg_hp_tx == 0) && (reg_hp_rx == 0) && (reg_lp_tx == 0) &&
266 num_of_bt_counter_chk++;
267 if (num_of_bt_counter_chk >= 3) {
268 halbtc8723b1ant_query_bt_info(btcoexist);
269 num_of_bt_counter_chk = 0;
276 void halbtc8723b1ant_monitor_wifi_ctr(IN struct btc_coexist *btcoexist)
279 boolean wifi_busy = false, wifi_under_b_mode = false;
280 static u8 cck_lock_counter = 0;
283 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
284 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
285 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
288 if (coex_sta->under_ips) {
289 coex_sta->crc_ok_cck = 0;
290 coex_sta->crc_ok_11g = 0;
291 coex_sta->crc_ok_11n = 0;
292 coex_sta->crc_ok_11n_agg = 0;
294 coex_sta->crc_err_cck = 0;
295 coex_sta->crc_err_11g = 0;
296 coex_sta->crc_err_11n = 0;
297 coex_sta->crc_err_11n_agg = 0;
299 coex_sta->crc_ok_cck = btcoexist->btc_read_4byte(btcoexist,
301 coex_sta->crc_ok_11g = btcoexist->btc_read_2byte(btcoexist,
303 coex_sta->crc_ok_11n = btcoexist->btc_read_2byte(btcoexist,
305 coex_sta->crc_ok_11n_agg = btcoexist->btc_read_2byte(btcoexist,
308 coex_sta->crc_err_cck = btcoexist->btc_read_4byte(btcoexist,
310 coex_sta->crc_err_11g = btcoexist->btc_read_2byte(btcoexist,
312 coex_sta->crc_err_11n = btcoexist->btc_read_2byte(btcoexist,
314 coex_sta->crc_err_11n_agg = btcoexist->btc_read_2byte(btcoexist,
320 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x1);
321 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x0);
323 if ((wifi_busy) && (wifi_rssi >= 30) && (!wifi_under_b_mode)) {
324 total_cnt = coex_sta->crc_ok_cck + coex_sta->crc_ok_11g +
325 coex_sta->crc_ok_11n +
326 coex_sta->crc_ok_11n_agg;
328 if ((coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) ||
329 (coex_dm->bt_status ==
330 BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) ||
331 (coex_dm->bt_status ==
332 BT_8723B_1ANT_BT_STATUS_SCO_BUSY)) {
333 if (coex_sta->crc_ok_cck > (total_cnt -
334 coex_sta->crc_ok_cck)) {
335 if (cck_lock_counter < 3)
338 if (cck_lock_counter > 0)
343 if (cck_lock_counter > 0)
347 if (cck_lock_counter > 0)
351 if (!coex_sta->pre_ccklock) {
353 if (cck_lock_counter >= 3)
354 coex_sta->cck_lock = true;
356 coex_sta->cck_lock = false;
358 if (cck_lock_counter == 0)
359 coex_sta->cck_lock = false;
361 coex_sta->cck_lock = true;
364 if (coex_sta->cck_lock)
365 coex_sta->cck_ever_lock = true;
367 coex_sta->pre_ccklock = coex_sta->cck_lock;
372 boolean halbtc8723b1ant_is_wifi_status_changed(IN struct btc_coexist *btcoexist)
374 static boolean pre_wifi_busy = false, pre_under_4way = false,
375 pre_bt_hs_on = false;
376 boolean wifi_busy = false, under_4way = false, bt_hs_on = false;
377 boolean wifi_connected = false;
379 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
381 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
382 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
383 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
386 if (wifi_connected) {
387 if (wifi_busy != pre_wifi_busy) {
388 pre_wifi_busy = wifi_busy;
391 if (under_4way != pre_under_4way) {
392 pre_under_4way = under_4way;
395 if (bt_hs_on != pre_bt_hs_on) {
396 pre_bt_hs_on = bt_hs_on;
406 void halbtc8723b1ant_update_bt_link_info(IN struct btc_coexist *btcoexist)
408 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
409 boolean bt_hs_on = false;
411 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
413 bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
414 bt_link_info->sco_exist = coex_sta->sco_exist;
415 bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
416 bt_link_info->pan_exist = coex_sta->pan_exist;
417 bt_link_info->hid_exist = coex_sta->hid_exist;
418 bt_link_info->bt_hi_pri_link_exist = coex_sta->bt_hi_pri_link_exist;
420 /* work around for HS mode. */
422 bt_link_info->pan_exist = true;
423 bt_link_info->bt_link_exist = true;
426 /* check if Sco only */
427 if (bt_link_info->sco_exist &&
428 !bt_link_info->a2dp_exist &&
429 !bt_link_info->pan_exist &&
430 !bt_link_info->hid_exist)
431 bt_link_info->sco_only = true;
433 bt_link_info->sco_only = false;
435 /* check if A2dp only */
436 if (!bt_link_info->sco_exist &&
437 bt_link_info->a2dp_exist &&
438 !bt_link_info->pan_exist &&
439 !bt_link_info->hid_exist)
440 bt_link_info->a2dp_only = true;
442 bt_link_info->a2dp_only = false;
444 /* check if Pan only */
445 if (!bt_link_info->sco_exist &&
446 !bt_link_info->a2dp_exist &&
447 bt_link_info->pan_exist &&
448 !bt_link_info->hid_exist)
449 bt_link_info->pan_only = true;
451 bt_link_info->pan_only = false;
453 /* check if Hid only */
454 if (!bt_link_info->sco_exist &&
455 !bt_link_info->a2dp_exist &&
456 !bt_link_info->pan_exist &&
457 bt_link_info->hid_exist)
458 bt_link_info->hid_only = true;
460 bt_link_info->hid_only = false;
463 void halbtc8723b1ant_set_bt_auto_report(IN struct btc_coexist *btcoexist,
464 IN boolean enable_auto_report)
466 u8 h2c_parameter[1] = {0};
468 h2c_parameter[0] = 0;
470 if (enable_auto_report)
471 h2c_parameter[0] |= BIT(0);
473 btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
476 void halbtc8723b1ant_bt_auto_report(IN struct btc_coexist *btcoexist,
477 IN boolean force_exec, IN boolean enable_auto_report)
479 coex_dm->cur_bt_auto_report = enable_auto_report;
482 if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
485 halbtc8723b1ant_set_bt_auto_report(btcoexist,
486 coex_dm->cur_bt_auto_report);
488 coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
491 void halbtc8723b1ant_set_sw_penalty_tx_rate_adaptive(IN struct btc_coexist
492 *btcoexist, IN boolean low_penalty_ra)
494 u8 h2c_parameter[6] = {0};
496 h2c_parameter[0] = 0x6; /* op_code, 0x6= Retry_Penalty */
498 if (low_penalty_ra) {
499 h2c_parameter[1] |= BIT(0);
501 0x00; /* normal rate except MCS7/6/5, OFDM54/48/36 */
502 h2c_parameter[3] = 0xf7; /* MCS7 or OFDM54 */
503 h2c_parameter[4] = 0xf8; /* MCS6 or OFDM48 */
504 h2c_parameter[5] = 0xf9; /* MCS5 or OFDM36 */
507 btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
510 void halbtc8723b1ant_low_penalty_ra(IN struct btc_coexist *btcoexist,
511 IN boolean force_exec, IN boolean low_penalty_ra)
513 coex_dm->cur_low_penalty_ra = low_penalty_ra;
516 if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
519 halbtc8723b1ant_set_sw_penalty_tx_rate_adaptive(btcoexist,
520 coex_dm->cur_low_penalty_ra);
522 coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
525 void halbtc8723b1ant_set_coex_table(IN struct btc_coexist *btcoexist,
526 IN u32 val0x6c0, IN u32 val0x6c4, IN u32 val0x6c8, IN u8 val0x6cc)
528 btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
530 btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
532 btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
534 btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
537 void halbtc8723b1ant_coex_table(IN struct btc_coexist *btcoexist,
538 IN boolean force_exec, IN u32 val0x6c0, IN u32 val0x6c4,
539 IN u32 val0x6c8, IN u8 val0x6cc)
541 coex_dm->cur_val0x6c0 = val0x6c0;
542 coex_dm->cur_val0x6c4 = val0x6c4;
543 coex_dm->cur_val0x6c8 = val0x6c8;
544 coex_dm->cur_val0x6cc = val0x6cc;
547 if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
548 (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
549 (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
550 (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
553 halbtc8723b1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8,
556 coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
557 coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
558 coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
559 coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
562 void halbtc8723b1ant_coex_table_with_type(IN struct btc_coexist *btcoexist,
563 IN boolean force_exec, IN u8 type)
565 struct btc_board_info *board_info = &btcoexist->board_info;
567 #if BT_8723B_1ANT_ANTDET_ENABLE
568 #if BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE
569 if (board_info->btdm_ant_num_by_ant_det == 2) {
580 coex_sta->coex_table_type = type;
584 halbtc8723b1ant_coex_table(btcoexist, force_exec,
585 0x55555555, 0x55555555, 0xffffff, 0x3);
588 halbtc8723b1ant_coex_table(btcoexist, force_exec,
589 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3);
592 halbtc8723b1ant_coex_table(btcoexist, force_exec,
593 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3);
596 halbtc8723b1ant_coex_table(btcoexist, force_exec,
597 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3);
600 if ((coex_sta->cck_ever_lock) &&
601 (coex_sta->scan_ap_num <= 5))
602 halbtc8723b1ant_coex_table(btcoexist,
603 force_exec, 0x55555555, 0xaaaa5a5a,
606 halbtc8723b1ant_coex_table(btcoexist,
607 force_exec, 0x55555555, 0x5a5a5a5a,
611 if ((coex_sta->cck_ever_lock) &&
612 (coex_sta->scan_ap_num <= 5))
613 halbtc8723b1ant_coex_table(btcoexist,
614 force_exec, 0x5a5a5a5a, 0x5aaa5a5a,
617 halbtc8723b1ant_coex_table(btcoexist,
618 force_exec, 0x5a5a5a5a, 0x5aaa5a5a,
622 halbtc8723b1ant_coex_table(btcoexist, force_exec,
623 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3);
626 halbtc8723b1ant_coex_table(btcoexist, force_exec,
627 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);
630 halbtc8723b1ant_coex_table(btcoexist, force_exec,
631 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);
634 halbtc8723b1ant_coex_table(btcoexist, force_exec,
635 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);
638 halbtc8723b1ant_coex_table(btcoexist, force_exec,
639 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);
642 halbtc8723b1ant_coex_table(btcoexist, force_exec,
643 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);
646 halbtc8723b1ant_coex_table(btcoexist, force_exec,
647 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);
650 halbtc8723b1ant_coex_table(btcoexist, force_exec,
651 0x5fff5fff, 0xaaaaaaaa, 0xffffff, 0x3);
654 halbtc8723b1ant_coex_table(btcoexist, force_exec,
655 0x5fff5fff, 0x5ada5ada, 0xffffff, 0x3);
658 halbtc8723b1ant_coex_table(btcoexist, force_exec,
659 0x55dd55dd, 0xaaaaaaaa, 0xffffff, 0x3);
666 void halbtc8723b1ant_set_fw_ignore_wlan_act(IN struct btc_coexist *btcoexist,
669 u8 h2c_parameter[1] = {0};
672 h2c_parameter[0] |= BIT(0); /* function enable */
675 btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
678 void halbtc8723b1ant_ignore_wlan_act(IN struct btc_coexist *btcoexist,
679 IN boolean force_exec, IN boolean enable)
681 coex_dm->cur_ignore_wlan_act = enable;
684 if (coex_dm->pre_ignore_wlan_act ==
685 coex_dm->cur_ignore_wlan_act)
688 halbtc8723b1ant_set_fw_ignore_wlan_act(btcoexist, enable);
690 coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
693 void halbtc8723b1ant_set_lps_rpwm(IN struct btc_coexist *btcoexist,
694 IN u8 lps_val, IN u8 rpwm_val)
699 btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
700 btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
703 void halbtc8723b1ant_lps_rpwm(IN struct btc_coexist *btcoexist,
704 IN boolean force_exec, IN u8 lps_val, IN u8 rpwm_val)
706 coex_dm->cur_lps = lps_val;
707 coex_dm->cur_rpwm = rpwm_val;
710 if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
711 (coex_dm->pre_rpwm == coex_dm->cur_rpwm))
714 halbtc8723b1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
716 coex_dm->pre_lps = coex_dm->cur_lps;
717 coex_dm->pre_rpwm = coex_dm->cur_rpwm;
720 void halbtc8723b1ant_sw_mechanism(IN struct btc_coexist *btcoexist,
721 IN boolean low_penalty_ra)
723 halbtc8723b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
726 void halbtc8723b1ant_set_ant_path(IN struct btc_coexist *btcoexist,
727 IN u8 ant_pos_type, IN boolean force_exec, IN boolean init_hwcfg,
730 struct btc_board_info *board_info = &btcoexist->board_info;
731 PADAPTER padapter = btcoexist->Adapter;
732 u32 fw_ver = 0, u32tmp = 0, cnt_bt_cal_chk = 0;
733 boolean pg_ext_switch = false;
734 boolean use_ext_switch = false;
735 boolean is_in_mp_mode = false;
736 u8 h2c_parameter[2] = {0}, u8tmp = 0;
739 coex_dm->cur_ant_pos_type = ant_pos_type;
741 btcoexist->btc_get(btcoexist, BTC_GET_BL_EXT_SWITCH, &pg_ext_switch);
742 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER,
743 &fw_ver); /* [31:16]=fw ver, [15:0]=fw sub ver */
745 if ((fw_ver > 0 && fw_ver < 0xc0000) || pg_ext_switch)
746 use_ext_switch = true;
748 #if BT_8723B_1ANT_ANTDET_ENABLE
749 #if BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE
750 if (ant_pos_type == BTC_ANT_PATH_PTA) {
751 if ((board_info->btdm_ant_det_finish) &&
752 (board_info->btdm_ant_num_by_ant_det == 2)) {
753 if (board_info->btdm_ant_pos ==
754 BTC_ANTENNA_AT_MAIN_PORT)
755 ant_pos_type = BTC_ANT_PATH_WIFI;
757 ant_pos_type = BTC_ANT_PATH_BT;
764 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
765 0x780); /* WiFi TRx Mask on */
766 /* remove due to interrupt is disabled that polling c2h will fail and delay 100ms. */
767 /* btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x3c, 0x15); */ /*BT TRx Mask on */
769 if (fw_ver >= 0x180000) {
770 /* Use H2C to set GNT_BT to HIGH */
771 h2c_parameter[0] = 1;
772 btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
777 if (padapter->bFWReady == false) {
778 BTC_SPRINTF(trace_buf , BT_TMP_BUF_SIZE,
779 ("halbtc8723b1ant_set_ant_path(): we don't need to wait for H2C command completion because of Fw download fail!!!\n"));
780 BTC_TRACE(trace_buf);
784 if (btcoexist->btc_read_1byte(btcoexist,
789 if (cnt_bt_cal_chk > 20)
793 /* set grant_bt to high */
794 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
796 /* set wlan_act control by PTA */
797 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
799 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20,
800 0x0); /* BT select s0/s1 is controlled by BT */
802 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x39, 0x8, 0x1);
803 btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
804 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x944, 0x3, 0x3);
805 btcoexist->btc_write_1byte(btcoexist, 0x930, 0x77);
806 } else if (wifi_off) {
807 if (fw_ver >= 0x180000) {
808 /* Use H2C to set GNT_BT to HIGH */
809 h2c_parameter[0] = 1;
810 btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
815 if (padapter->bFWReady == false) {
816 BTC_SPRINTF(trace_buf , BT_TMP_BUF_SIZE,
817 ("halbtc8723b1ant_set_ant_path(): we don't need to wait for H2C command completion because of Fw download fail!!!\n"));
818 BTC_TRACE(trace_buf);
822 if (btcoexist->btc_read_1byte(btcoexist,
827 if (cnt_bt_cal_chk > 20)
831 /* set grant_bt to high */
832 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
834 /* set wlan_act to always low */
835 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
837 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE,
840 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67,
841 0x20, 0x0); /* BT select s0/s1 is controlled by BT */
843 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67,
844 0x20, 0x1); /* BT select s0/s1 is controlled by WiFi */
846 /* 0x4c[24:23]=00, Set Antenna control by BT_RFE_CTRL BT Vendor 0xac=0xf002 */
847 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
850 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
852 /* Use H2C to set GNT_BT to LOW */
853 if (fw_ver >= 0x180000) {
854 if (btcoexist->btc_read_1byte(btcoexist, 0x765) != 0) {
855 h2c_parameter[0] = 0;
856 btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
861 if (padapter->bFWReady == false) {
862 BTC_SPRINTF(trace_buf , BT_TMP_BUF_SIZE,
863 ("halbtc8723b1ant_set_ant_path(): we don't need to wait for H2C command completion because of Fw download fail!!!\n"));
864 BTC_TRACE(trace_buf);
868 if (btcoexist->btc_read_1byte(btcoexist,
873 if (cnt_bt_cal_chk > 20)
878 /* BT calibration check */
879 while (cnt_bt_cal_chk <= 20) {
880 u8tmp = btcoexist->btc_read_1byte(btcoexist,
883 if (u8tmp & BIT(0)) {
884 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
885 "[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n",
887 BTC_TRACE(trace_buf);
890 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
891 "[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n",
893 BTC_TRACE(trace_buf);
898 /* set grant_bt to PTA */
899 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x0);
902 if (btcoexist->btc_read_1byte(btcoexist, 0x76e) != 0xc) {
903 /* set wlan_act control by PTA */
904 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
907 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20,
908 0x1); /* BT select s0/s1 is controlled by WiFi */
911 if (use_ext_switch) {
913 /* 0x4c[23]=0, 0x4c[24]=1 Antenna control by WL/BT */
914 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
917 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
920 u32tmp_1[0] = btcoexist->btc_read_4byte(btcoexist,
922 if ((u32tmp_1[0] == 0x40) || (u32tmp_1[0] == 0x240))
923 btcoexist->btc_write_4byte(btcoexist, 0x948,
926 btcoexist->btc_write_4byte(btcoexist, 0x948,
930 if (board_info->btdm_ant_pos ==
931 BTC_ANTENNA_AT_MAIN_PORT) {
932 /* tell firmware "no antenna inverse" */
933 h2c_parameter[0] = 0;
934 h2c_parameter[1] = 1; /* ext switch type */
935 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
938 /* tell firmware "antenna inverse" */
939 h2c_parameter[0] = 1;
940 h2c_parameter[1] = 1; /* ext switch type */
941 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
947 (coex_dm->cur_ant_pos_type !=
948 coex_dm->pre_ant_pos_type)) {
949 /* ext switch setting */
950 switch (ant_pos_type) {
951 case BTC_ANT_PATH_WIFI:
952 if (board_info->btdm_ant_pos ==
953 BTC_ANTENNA_AT_MAIN_PORT)
954 btcoexist->btc_write_1byte_bitmask(
955 btcoexist, 0x92c, 0x3,
958 btcoexist->btc_write_1byte_bitmask(
959 btcoexist, 0x92c, 0x3,
962 case BTC_ANT_PATH_BT:
963 if (board_info->btdm_ant_pos ==
964 BTC_ANTENNA_AT_MAIN_PORT)
965 btcoexist->btc_write_1byte_bitmask(
966 btcoexist, 0x92c, 0x3,
969 btcoexist->btc_write_1byte_bitmask(
970 btcoexist, 0x92c, 0x3,
974 case BTC_ANT_PATH_PTA:
975 if (board_info->btdm_ant_pos ==
976 BTC_ANTENNA_AT_MAIN_PORT)
977 btcoexist->btc_write_1byte_bitmask(
978 btcoexist, 0x92c, 0x3,
981 btcoexist->btc_write_1byte_bitmask(
982 btcoexist, 0x92c, 0x3,
989 /* 0x4c[23]=1, 0x4c[24]=0 Antenna control by 0x64 */
990 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
993 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
995 /* Fix Ext switch Main->S1, Aux->S0 */
996 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x64, 0x1,
999 if (board_info->btdm_ant_pos ==
1000 BTC_ANTENNA_AT_MAIN_PORT) {
1002 /* tell firmware "no antenna inverse" */
1003 h2c_parameter[0] = 0;
1005 0; /* internal switch type */
1006 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
1010 /* tell firmware "antenna inverse" */
1011 h2c_parameter[0] = 1;
1013 0; /* internal switch type */
1014 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
1020 (coex_dm->cur_ant_pos_type !=
1021 coex_dm->pre_ant_pos_type)) {
1022 /* internal switch setting */
1023 switch (ant_pos_type) {
1024 case BTC_ANT_PATH_WIFI:
1025 if (board_info->btdm_ant_pos ==
1026 BTC_ANTENNA_AT_MAIN_PORT) {
1027 u32tmp_1[0] = btcoexist->btc_read_4byte(
1029 if ((u32tmp_1[0] == 0x40) ||
1030 (u32tmp_1[0] == 0x240))
1031 btcoexist->btc_write_4byte(
1035 btcoexist->btc_write_4byte(
1036 btcoexist, 0x948, 0x0);
1038 u32tmp_1[0] = btcoexist->btc_read_4byte(
1040 if ((u32tmp_1[0] == 0x40) ||
1041 (u32tmp_1[0] == 0x240))
1042 btcoexist->btc_write_4byte(
1046 btcoexist->btc_write_4byte(
1051 case BTC_ANT_PATH_BT:
1052 if (board_info->btdm_ant_pos ==
1053 BTC_ANTENNA_AT_MAIN_PORT) {
1054 u32tmp_1[0] = btcoexist->btc_read_4byte(
1056 if ((u32tmp_1[0] == 0x40) ||
1057 (u32tmp_1[0] == 0x240))
1058 btcoexist->btc_write_4byte(
1062 btcoexist->btc_write_4byte(
1066 u32tmp_1[0] = btcoexist->btc_read_4byte(
1068 if ((u32tmp_1[0] == 0x40) ||
1069 (u32tmp_1[0] == 0x240))
1070 btcoexist->btc_write_4byte(
1074 btcoexist->btc_write_4byte(
1075 btcoexist, 0x948, 0x0);
1079 case BTC_ANT_PATH_PTA:
1080 if (board_info->btdm_ant_pos ==
1081 BTC_ANTENNA_AT_MAIN_PORT)
1082 btcoexist->btc_write_4byte(
1086 btcoexist->btc_write_4byte(
1087 btcoexist, 0x948, 0x80);
1093 coex_dm->pre_ant_pos_type = coex_dm->cur_ant_pos_type;
1096 void halbtc8723b1ant_set_fw_pstdma(IN struct btc_coexist *btcoexist,
1097 IN u8 byte1, IN u8 byte2, IN u8 byte3, IN u8 byte4, IN u8 byte5)
1099 u8 h2c_parameter[5] = {0};
1100 u8 real_byte1 = byte1, real_byte5 = byte5;
1101 boolean ap_enable = false;
1103 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1107 if (byte1 & BIT(4) && !(byte1 & BIT(5))) {
1108 real_byte1 &= ~BIT(4);
1109 real_byte1 |= BIT(5);
1111 real_byte5 |= BIT(5);
1112 real_byte5 &= ~BIT(6);
1116 h2c_parameter[0] = real_byte1;
1117 h2c_parameter[1] = byte2;
1118 h2c_parameter[2] = byte3;
1119 h2c_parameter[3] = byte4;
1120 h2c_parameter[4] = real_byte5;
1122 coex_dm->ps_tdma_para[0] = real_byte1;
1123 coex_dm->ps_tdma_para[1] = byte2;
1124 coex_dm->ps_tdma_para[2] = byte3;
1125 coex_dm->ps_tdma_para[3] = byte4;
1126 coex_dm->ps_tdma_para[4] = real_byte5;
1128 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1132 void halbtc8723b1ant_ps_tdma(IN struct btc_coexist *btcoexist,
1133 IN boolean force_exec, IN boolean turn_on, IN u8 type)
1135 struct btc_board_info *board_info = &btcoexist->board_info;
1136 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1137 boolean wifi_busy = false;
1138 u8 rssi_adjust_val = 0;
1139 u8 ps_tdma_byte4_val = 0x50, ps_tdma_byte0_val = 0x51,
1140 ps_tdma_byte3_val = 0x10;
1141 s8 wifi_duration_adjust = 0x0;
1142 static boolean pre_wifi_busy = false;
1144 coex_dm->cur_ps_tdma_on = turn_on;
1145 coex_dm->cur_ps_tdma = type;
1147 #if BT_8723B_1ANT_ANTDET_ENABLE
1148 #if BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE
1149 if (board_info->btdm_ant_num_by_ant_det == 2) {
1152 100; /* for WiFi RSSI low or BT RSSI low */
1154 type = 1; /* always translate to TDMA(off,1) for TDMA-off case */
1160 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1162 if (wifi_busy != pre_wifi_busy) {
1164 pre_wifi_busy = wifi_busy;
1168 if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1169 (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1173 if (coex_sta->scan_ap_num <= 5) {
1174 wifi_duration_adjust = 5;
1176 if (coex_sta->a2dp_bit_pool >= 35)
1177 wifi_duration_adjust = -10;
1178 else if (coex_sta->a2dp_bit_pool >= 45)
1179 wifi_duration_adjust = -15;
1180 } else if (coex_sta->scan_ap_num >= 40) {
1181 wifi_duration_adjust = -15;
1183 if (coex_sta->a2dp_bit_pool < 35)
1184 wifi_duration_adjust = -5;
1185 else if (coex_sta->a2dp_bit_pool < 45)
1186 wifi_duration_adjust = -10;
1187 } else if (coex_sta->scan_ap_num >= 20) {
1188 wifi_duration_adjust = -10;
1190 if (coex_sta->a2dp_bit_pool >= 45)
1191 wifi_duration_adjust = -15;
1193 wifi_duration_adjust = 0;
1195 if (coex_sta->a2dp_bit_pool >= 35)
1196 wifi_duration_adjust = -10;
1197 else if (coex_sta->a2dp_bit_pool >= 45)
1198 wifi_duration_adjust = -15;
1201 if ((type == 1) || (type == 2) || (type == 9) || (type == 11) ||
1203 || (type == 102) || (type == 109) || (type == 101)) {
1204 if (!coex_sta->force_lps_on) { /* Native power save TDMA, only for A2DP-only case 1/2/9/11 while wifi noisy threshold > 30 */
1205 ps_tdma_byte0_val = 0x61; /* no null-pkt */
1206 ps_tdma_byte3_val = 0x11; /* no tx-pause at BT-slot */
1208 0x10; /* 0x778 = d/1 toggle, no dynamic slot */
1210 ps_tdma_byte0_val = 0x51; /* null-pkt */
1211 ps_tdma_byte3_val = 0x10; /* tx-pause at BT-slot */
1213 0x50; /* 0x778 = d/1 toggle, dynamic slot */
1215 } else if ((type == 3) || (type == 13) || (type == 14) ||
1216 (type == 103) || (type == 113) || (type == 114)) {
1217 ps_tdma_byte0_val = 0x51; /* null-pkt */
1218 ps_tdma_byte3_val = 0x10; /* tx-pause at BT-slot */
1220 0x10; /* 0x778 = d/1 toggle, no dynamic slot */
1223 ps_tdma_byte4_val = ps_tdma_byte4_val |
1224 0x1; /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
1226 } else { /* native power save case */
1227 ps_tdma_byte0_val = 0x61; /* no null-pkt */
1228 ps_tdma_byte3_val = 0x11; /* no tx-pause at BT-slot */
1230 0x11; /* 0x778 = d/1 toggle, no dynamic slot */
1231 /* psTdmaByte4Va is not defne for 0x778 = d/1, 1/1 case */
1234 /* if (bt_link_info->slave_role == true) */
1235 if ((bt_link_info->slave_role == true) && (bt_link_info->a2dp_exist))
1236 ps_tdma_byte4_val = ps_tdma_byte4_val |
1237 0x1; /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
1240 ps_tdma_byte0_val = ps_tdma_byte0_val |
1241 0x82; /* set antenna control by SW */
1242 ps_tdma_byte3_val = ps_tdma_byte3_val |
1243 0x60; /* set antenna no toggle, control by antenna diversity */
1250 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x51,
1251 0x1a, 0x1a, 0x0, ps_tdma_byte4_val);
1254 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1255 ps_tdma_byte0_val, 0x3a +
1256 wifi_duration_adjust, 0x03,
1257 ps_tdma_byte3_val, ps_tdma_byte4_val);
1260 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1261 ps_tdma_byte0_val, 0x2d +
1262 wifi_duration_adjust, 0x03,
1263 ps_tdma_byte3_val, ps_tdma_byte4_val);
1266 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1267 ps_tdma_byte0_val, 0x30, 0x03,
1268 ps_tdma_byte3_val, ps_tdma_byte4_val);
1271 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x93,
1272 0x15, 0x3, 0x14, 0x0);
1275 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1276 ps_tdma_byte0_val, 0x1f, 0x3,
1277 ps_tdma_byte3_val, 0x11);
1280 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1281 ps_tdma_byte0_val, 0x20, 0x3,
1282 ps_tdma_byte3_val, 0x11);
1285 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x13,
1286 0xc, 0x5, 0x0, 0x0);
1289 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x93,
1290 0x25, 0x3, 0x10, 0x0);
1293 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1294 ps_tdma_byte0_val, 0x21, 0x3,
1295 ps_tdma_byte3_val, ps_tdma_byte4_val);
1298 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x13,
1299 0xa, 0xa, 0x0, 0x40);
1302 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1303 ps_tdma_byte0_val, 0x21, 0x03,
1304 ps_tdma_byte3_val, ps_tdma_byte4_val);
1307 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x51,
1308 0x0a, 0x0a, 0x0, 0x50);
1311 if (coex_sta->scan_ap_num <= 3)
1312 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1313 ps_tdma_byte0_val, 0x40, 0x3,
1317 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1318 ps_tdma_byte0_val, 0x21, 0x3,
1323 if (coex_sta->scan_ap_num <= 3)
1324 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1325 0x51, 0x30, 0x3, 0x10, 0x50);
1327 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1328 ps_tdma_byte0_val, 0x21, 0x3,
1333 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x13,
1334 0xa, 0x3, 0x8, 0x0);
1337 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x93,
1338 0x15, 0x3, 0x10, 0x0);
1341 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x93,
1342 0x25, 0x3, 0x10, 0x0);
1345 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1346 ps_tdma_byte0_val, 0x3f, 0x03,
1347 ps_tdma_byte3_val, 0x10);
1350 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x61,
1351 0x25, 0x03, 0x11, 0x11);
1354 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1355 ps_tdma_byte0_val, 0x25, 0x03,
1356 ps_tdma_byte3_val, 0x10);
1359 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xe3,
1360 0x25, 0x3, 0x31, 0x18);
1363 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xe3,
1364 0x15, 0x3, 0x31, 0x18);
1367 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xe3,
1368 0xa, 0x3, 0x31, 0x18);
1371 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xe3,
1372 0xa, 0x3, 0x31, 0x18);
1375 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xe3,
1376 0x25, 0x3, 0x31, 0x98);
1379 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x69,
1380 0x25, 0x3, 0x31, 0x0);
1383 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xab,
1384 0x1a, 0x1a, 0x1, 0x10);
1387 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x51,
1388 0x30, 0x3, 0x10, 0x10);
1391 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xd3,
1392 0x1a, 0x1a, 0, 0x58);
1395 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1396 ps_tdma_byte0_val, 0x35, 0x3,
1397 ps_tdma_byte3_val, ps_tdma_byte4_val);
1400 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1401 ps_tdma_byte0_val, 0x35, 0x3,
1402 ps_tdma_byte3_val, 0x10);
1405 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x53,
1406 0x1a, 0x1a, 0x0, 0x10);
1409 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x63,
1410 0x1a, 0x1a, 0x0, 0x10);
1413 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0xd3,
1414 0x12, 0x3, 0x14, 0x50);
1416 case 40: /* SoftAP only with no sta associated,BT disable ,TDMA mode for power saving */
1417 /* here softap mode screen off will cost 70-80mA for phone */
1418 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x23,
1419 0x18, 0x00, 0x10, 0x24);
1422 /* for 1-Ant translate to 2-Ant */
1424 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1425 ps_tdma_byte0_val, 0x3a +
1426 wifi_duration_adjust, 0x03,
1427 ps_tdma_byte3_val, ps_tdma_byte4_val);
1430 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1431 ps_tdma_byte0_val, 0x2d +
1432 wifi_duration_adjust, 0x03,
1433 ps_tdma_byte3_val, ps_tdma_byte4_val);
1436 /* halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x51, 0x1d, 0x1d, 0x0, ps_tdma_byte4_val); */
1437 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1438 ps_tdma_byte0_val, 0x3a, 0x03,
1439 ps_tdma_byte3_val, ps_tdma_byte4_val);
1442 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1443 ps_tdma_byte0_val, 0x15, 0x3,
1444 ps_tdma_byte3_val, 0x11);
1447 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1448 ps_tdma_byte0_val, 0x20, 0x3,
1449 ps_tdma_byte3_val, 0x11);
1452 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1453 ps_tdma_byte0_val, 0x21, 0x3,
1454 ps_tdma_byte3_val, ps_tdma_byte4_val);
1457 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1458 ps_tdma_byte0_val, 0x21, 0x03,
1459 ps_tdma_byte3_val, ps_tdma_byte4_val);
1462 /* halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x51, 0x12, 0x12, 0x0, ps_tdma_byte4_val); */
1463 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1464 ps_tdma_byte0_val, 0x21, 0x3,
1465 ps_tdma_byte3_val, ps_tdma_byte4_val);
1468 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1469 ps_tdma_byte0_val, 0x21, 0x3,
1470 ps_tdma_byte3_val, ps_tdma_byte4_val);
1473 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1474 ps_tdma_byte0_val, 0x3f, 0x03,
1475 ps_tdma_byte3_val, 0x10);
1478 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1479 ps_tdma_byte0_val, 0x25, 0x03,
1480 ps_tdma_byte3_val, 0x10);
1483 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1484 ps_tdma_byte0_val, 0x25, 0x03,
1485 ps_tdma_byte3_val, ps_tdma_byte4_val);
1488 halbtc8723b1ant_set_fw_pstdma(btcoexist,
1489 ps_tdma_byte0_val, 0x25, 0x03,
1490 ps_tdma_byte3_val, 0x11);
1496 /* disable PS tdma */
1498 case 8: /* PTA Control */
1499 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x8,
1500 0x0, 0x0, 0x0, 0x0);
1503 default: /* Software control, Antenna at BT side */
1504 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x0,
1505 0x0, 0x0, 0x0, 0x0);
1507 case 1: /* 2-Ant, 0x778=3, antenna control by antenna diversity */
1508 halbtc8723b1ant_set_fw_pstdma(btcoexist, 0x0,
1509 0x0, 0x0, 0x48, 0x0);
1513 rssi_adjust_val = 0;
1514 btcoexist->btc_set(btcoexist,
1515 BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssi_adjust_val);
1517 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1518 "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",
1519 btcoexist->btc_read_4byte(btcoexist, 0x948),
1520 btcoexist->btc_read_1byte(btcoexist, 0x765),
1521 btcoexist->btc_read_1byte(btcoexist, 0x67));
1522 BTC_TRACE(trace_buf);
1524 /* update pre state */
1525 coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1526 coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1529 void halbtc8723b1ant_tdma_duration_adjust_for_acl(IN struct btc_coexist
1530 *btcoexist, IN u8 wifi_status)
1532 static s32 up, dn, m, n, wait_count;
1533 s32 result; /* 0: no change, +1: increase WiFi duration, -1: decrease WiFi duration */
1534 u8 retry_count = 0, bt_info_ext;
1535 boolean wifi_busy = false;
1537 if (BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY == wifi_status)
1542 if ((BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN ==
1544 (BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifi_status) ||
1545 (BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SPECIFIC_PKT ==
1547 if (coex_dm->cur_ps_tdma != 1 &&
1548 coex_dm->cur_ps_tdma != 2 &&
1549 coex_dm->cur_ps_tdma != 3 &&
1550 coex_dm->cur_ps_tdma != 9) {
1551 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1553 coex_dm->ps_tdma_du_adj_type = 9;
1565 if (!coex_dm->auto_tdma_adjust) {
1566 coex_dm->auto_tdma_adjust = true;
1568 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2);
1569 coex_dm->ps_tdma_du_adj_type = 2;
1578 /* accquire the BT TRx retry count from BT_Info byte2 */
1579 retry_count = coex_sta->bt_retry_cnt;
1580 bt_info_ext = coex_sta->bt_info_ext;
1582 if ((coex_sta->low_priority_tx) > 1050 ||
1583 (coex_sta->low_priority_rx) > 1250)
1590 0) { /* no retry in the last 2-second duration */
1597 if (up >= n) { /* if retry count during continuous n*2 seconds is 0, enlarge WiFi duration */
1604 } else if (retry_count <=
1605 3) { /* <=3 retry in the last 2-second duration */
1612 if (dn == 2) { /* if continuous 2 retry count(every 2 seconds) >0 and < 3, reduce WiFi duration */
1613 if (wait_count <= 2)
1614 m++; /* to avoid loop between the two levels */
1618 if (m >= 20) /* maximum of m = 20 ' will recheck if need to adjust wifi duration in maximum time interval 120 seconds */
1627 } else { /* retry count > 3, once retry count > 3, to reduce WiFi duration */
1628 if (wait_count == 1)
1629 m++; /* to avoid loop between the two levels */
1633 if (m >= 20) /* maximum of m = 20 ' will recheck if need to adjust wifi duration in maximum time interval 120 seconds */
1644 /* if( (BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(bt_info_ext)) &&
1645 ((coex_dm->cur_ps_tdma == 1) ||(coex_dm->cur_ps_tdma == 2)) )
1647 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
1648 coex_dm->ps_tdma_du_adj_type = 9;
1650 else */ if (coex_dm->cur_ps_tdma == 1) {
1651 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1653 coex_dm->ps_tdma_du_adj_type = 2;
1654 } else if (coex_dm->cur_ps_tdma == 2) {
1655 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1657 coex_dm->ps_tdma_du_adj_type = 9;
1658 } else if (coex_dm->cur_ps_tdma == 9) {
1659 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1661 coex_dm->ps_tdma_du_adj_type = 11;
1663 } else if (result == 1) {
1664 /* if( (BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(bt_info_ext)) &&
1665 ((coex_dm->cur_ps_tdma == 1) ||(coex_dm->cur_ps_tdma == 2)) )
1667 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
1668 coex_dm->ps_tdma_du_adj_type = 9;
1670 else */ if (coex_dm->cur_ps_tdma == 11) {
1671 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1673 coex_dm->ps_tdma_du_adj_type = 9;
1674 } else if (coex_dm->cur_ps_tdma == 9) {
1675 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1677 coex_dm->ps_tdma_du_adj_type = 2;
1678 } else if (coex_dm->cur_ps_tdma == 2) {
1679 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1681 coex_dm->ps_tdma_du_adj_type = 1;
1683 } else { /* no change */
1685 if(wifi_busy != pre_wifi_busy)
1687 pre_wifi_busy = wifi_busy;
1688 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, true, coex_dm->cur_ps_tdma);
1694 if (coex_dm->cur_ps_tdma != 1 &&
1695 coex_dm->cur_ps_tdma != 2 &&
1696 coex_dm->cur_ps_tdma != 9 &&
1697 coex_dm->cur_ps_tdma != 11) {
1698 /* recover to previous adjust type */
1699 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1700 coex_dm->ps_tdma_du_adj_type);
1705 void halbtc8723b1ant_ps_tdma_check_for_power_save_state(
1706 IN struct btc_coexist *btcoexist, IN boolean new_ps_state)
1710 btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1712 if (lps_mode) { /* already under LPS state */
1714 /* keep state under LPS, do nothing. */
1716 /* will leave LPS state, turn off psTdma first */
1717 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
1720 } else { /* NO PS state */
1722 /* will enter LPS state, turn off psTdma first */
1723 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
1726 /* keep state under NO PS state, do nothing. */
1731 void halbtc8723b1ant_power_save_state(IN struct btc_coexist *btcoexist,
1732 IN u8 ps_type, IN u8 lps_val, IN u8 rpwm_val)
1734 boolean low_pwr_disable = false;
1737 case BTC_PS_WIFI_NATIVE:
1738 /* recover to original 32k low power setting */
1739 low_pwr_disable = false;
1740 btcoexist->btc_set(btcoexist,
1741 BTC_SET_ACT_DISABLE_LOW_POWER,
1743 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS,
1745 coex_sta->force_lps_on = false;
1748 halbtc8723b1ant_ps_tdma_check_for_power_save_state(
1750 halbtc8723b1ant_lps_rpwm(btcoexist, NORMAL_EXEC,
1752 /* when coex force to enter LPS, do not enter 32k low power. */
1753 low_pwr_disable = true;
1754 btcoexist->btc_set(btcoexist,
1755 BTC_SET_ACT_DISABLE_LOW_POWER,
1757 /* power save must executed before psTdma. */
1758 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS,
1760 coex_sta->force_lps_on = true;
1762 case BTC_PS_LPS_OFF:
1763 halbtc8723b1ant_ps_tdma_check_for_power_save_state(
1765 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS,
1767 coex_sta->force_lps_on = false;
1774 void halbtc8723b1ant_action_wifi_only(IN struct btc_coexist *btcoexist)
1776 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
1777 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
1778 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, FORCE_EXEC,
1782 void halbtc8723b1ant_monitor_bt_enable_disable(IN struct btc_coexist *btcoexist)
1784 static u32 bt_disable_cnt = 0;
1785 boolean bt_active = true, bt_disabled = false, bt_change = false;
1787 /* This function check if bt is disabled */
1789 if (coex_sta->high_priority_tx == 0 &&
1790 coex_sta->high_priority_rx == 0 &&
1791 coex_sta->low_priority_tx == 0 &&
1792 coex_sta->low_priority_rx == 0)
1794 if (coex_sta->high_priority_tx == 0xffff &&
1795 coex_sta->high_priority_rx == 0xffff &&
1796 coex_sta->low_priority_tx == 0xffff &&
1797 coex_sta->low_priority_rx == 0xffff)
1801 bt_disabled = false;
1804 if (bt_disable_cnt >= 2)
1807 if (coex_sta->bt_disabled != bt_disabled) {
1808 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1809 "[BTCoex], BT is from %s to %s!!\n",
1810 (coex_sta->bt_disabled ? "disabled" : "enabled"),
1811 (bt_disabled ? "disabled" : "enabled"));
1812 BTC_TRACE(trace_buf);
1815 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
1818 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_ENABLE_DISABLE_CHANGE,
1821 coex_sta->bt_disabled = bt_disabled;
1824 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_ENABLE_DISABLE_CHANGE,
1829 /* *********************************************
1831 * Non-Software Coex Mechanism start
1833 * ********************************************* */
1834 void halbtc8723b1ant_action_bt_whck_test(IN struct btc_coexist *btcoexist)
1836 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
1839 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1840 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
1842 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1845 void halbtc8723b1ant_action_wifi_multi_port(IN struct btc_coexist *btcoexist)
1847 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
1850 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1851 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
1853 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1856 void halbtc8723b1ant_action_hs(IN struct btc_coexist *btcoexist)
1858 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1859 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1862 void halbtc8723b1ant_action_bt_inquiry(IN struct btc_coexist *btcoexist)
1864 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1865 boolean wifi_connected = false, ap_enable = false, wifi_busy = false,
1868 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1870 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1872 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1873 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
1875 if (coex_sta->bt_abnormal_scan) {
1876 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1878 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
1879 } else if ((!wifi_connected) && (!coex_sta->wifi_is_high_pri_task)) {
1880 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1882 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1883 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1884 NORMAL_EXEC, false, false);
1885 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1886 } else if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) ||
1887 (bt_link_info->a2dp_exist)) {
1888 /* SCO/HID/A2DP busy */
1889 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1892 if (coex_sta->c2h_bt_remote_name_req)
1893 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1896 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1899 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1900 } else if ((bt_link_info->pan_exist) || (wifi_busy)) {
1901 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1904 if (coex_sta->c2h_bt_remote_name_req)
1905 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1908 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1911 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1913 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1916 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1917 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1918 NORMAL_EXEC, false, false);
1919 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
1924 void halbtc8723b1ant_action_bt_sco_hid_only_busy(IN struct btc_coexist
1925 *btcoexist, IN u8 wifi_status)
1927 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1928 boolean wifi_connected = false;
1930 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1933 /* tdma and coex table */
1935 if (bt_link_info->sco_exist) {
1936 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1937 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
1939 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 6);
1940 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
1944 void halbtc8723b1ant_action_wifi_connected_bt_acl_busy(IN struct btc_coexist
1945 *btcoexist, IN u8 wifi_status)
1947 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1949 if ((coex_sta->low_priority_rx >= 950) && (!coex_sta->under_ips))
1950 bt_link_info->slave_role = true;
1952 bt_link_info->slave_role = false;
1954 if (bt_link_info->hid_only) { /* HID */
1955 halbtc8723b1ant_action_bt_sco_hid_only_busy(btcoexist,
1957 coex_dm->auto_tdma_adjust = false;
1959 } else if (bt_link_info->a2dp_only) { /* A2DP */
1960 if (BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifi_status) {
1961 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1963 halbtc8723b1ant_coex_table_with_type(btcoexist,
1965 coex_dm->auto_tdma_adjust = false;
1967 halbtc8723b1ant_tdma_duration_adjust_for_acl(btcoexist,
1969 halbtc8723b1ant_coex_table_with_type(btcoexist,
1971 coex_dm->auto_tdma_adjust = true;
1973 } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) ||
1974 (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&
1975 bt_link_info->pan_exist)) { /* A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP) */
1976 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
1977 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1978 coex_dm->auto_tdma_adjust = false;
1979 } else if (bt_link_info->hid_exist &&
1980 bt_link_info->a2dp_exist) { /* HID+A2DP */
1981 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1982 coex_dm->auto_tdma_adjust = false;
1984 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1985 } else if ((bt_link_info->pan_only) || (bt_link_info->hid_exist &&
1986 bt_link_info->pan_exist)) { /* PAN(OPP,FTP), HID+PAN(OPP,FTP) */
1988 if (BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE == wifi_status)
1989 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
1991 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
1993 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1994 coex_dm->auto_tdma_adjust = false;
1996 /* BT no-profile busy (0x9) */
1997 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);
1998 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1999 coex_dm->auto_tdma_adjust = false;
2003 void halbtc8723b1ant_action_wifi_not_connected(IN struct btc_coexist *btcoexist)
2005 /* power save state */
2006 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
2009 /* tdma and coex table */
2010 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2011 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
2013 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2016 void halbtc8723b1ant_action_wifi_not_connected_scan(IN struct btc_coexist
2019 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2021 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
2024 /* tdma and coex table */
2025 if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
2026 if (bt_link_info->a2dp_exist) {
2027 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2029 halbtc8723b1ant_coex_table_with_type(btcoexist,
2031 } else if (bt_link_info->a2dp_exist &&
2032 bt_link_info->pan_exist) {
2033 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2035 halbtc8723b1ant_coex_table_with_type(btcoexist,
2038 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2040 halbtc8723b1ant_coex_table_with_type(btcoexist,
2043 } else if ((BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
2044 (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
2045 coex_dm->bt_status)) {
2046 halbtc8723b1ant_action_bt_sco_hid_only_busy(btcoexist,
2047 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);
2050 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2051 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2052 NORMAL_EXEC, false, false);
2053 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2057 void halbtc8723b1ant_action_wifi_not_connected_asso_auth(
2058 IN struct btc_coexist *btcoexist)
2060 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2062 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
2065 /* tdma and coex table */
2066 if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) ||
2067 (bt_link_info->a2dp_exist)) {
2068 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
2069 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);
2070 } else if (bt_link_info->pan_exist) {
2071 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
2072 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);
2074 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2075 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2076 NORMAL_EXEC, false, false);
2077 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2);
2081 void halbtc8723b1ant_action_wifi_connected_scan(IN struct btc_coexist
2084 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2086 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
2089 /* tdma and coex table */
2090 if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
2091 if (bt_link_info->a2dp_exist) {
2092 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2094 halbtc8723b1ant_coex_table_with_type(btcoexist,
2096 } else if (bt_link_info->a2dp_exist &&
2097 bt_link_info->pan_exist) {
2098 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2100 halbtc8723b1ant_coex_table_with_type(btcoexist,
2103 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2105 halbtc8723b1ant_coex_table_with_type(btcoexist,
2108 } else if ((BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
2109 (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
2110 coex_dm->bt_status)) {
2111 halbtc8723b1ant_action_bt_sco_hid_only_busy(btcoexist,
2112 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);
2115 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2116 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2117 NORMAL_EXEC, false, false);
2118 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2122 void halbtc8723b1ant_action_wifi_connected_specific_packet(
2123 IN struct btc_coexist *btcoexist)
2125 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2126 boolean wifi_busy = false;
2128 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2130 /* no specific packet process for both WiFi and BT very busy */
2131 if ((wifi_busy) && ((bt_link_info->pan_exist) ||
2132 (coex_sta->num_of_profile >= 2)))
2135 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
2138 /* tdma and coex table */
2139 if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) {
2140 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
2141 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
2142 } else if (bt_link_info->a2dp_exist) {
2143 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
2144 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2145 } else if (bt_link_info->pan_exist) {
2146 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
2147 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2149 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2150 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2151 NORMAL_EXEC, false, false);
2152 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2156 void halbtc8723b1ant_action_wifi_connected(IN struct btc_coexist *btcoexist)
2158 boolean wifi_busy = false;
2159 boolean scan = false, link = false, roam = false;
2160 boolean under_4way = false, ap_enable = false;
2162 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2163 "[BTCoex], CoexForWifiConnect()===>\n");
2164 BTC_TRACE(trace_buf);
2166 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
2169 halbtc8723b1ant_action_wifi_connected_specific_packet(
2171 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2172 "[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n");
2173 BTC_TRACE(trace_buf);
2177 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2178 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2179 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2180 if (scan || link || roam) {
2182 halbtc8723b1ant_action_wifi_connected_scan(btcoexist);
2184 halbtc8723b1ant_action_wifi_connected_specific_packet(
2186 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2187 "[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n");
2188 BTC_TRACE(trace_buf);
2192 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
2194 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2196 if (coex_sta->bt_disabled) {
2197 //RT_TRACE(COMP_INIT,DBG_LOUD, ("$$$ halbtc8723b1ant_action_wifi_connected(): BT disable\n"));
2198 halbtc8723b1ant_power_save_state(
2199 btcoexist, BTC_PS_WIFI_NATIVE,
2201 } else if /* power save state */
2203 BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status &&
2204 !btcoexist->bt_link_info.hid_only) {
2205 if (btcoexist->bt_link_info.a2dp_only) { /* A2DP */
2207 halbtc8723b1ant_power_save_state(btcoexist,
2208 BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2210 if (coex_sta->scan_ap_num >=
2211 BT_8723B_1ANT_WIFI_NOISY_THRESH) /* no force LPS, no PS-TDMA, use pure TDMA */
2212 halbtc8723b1ant_power_save_state(
2213 btcoexist, BTC_PS_WIFI_NATIVE,
2216 halbtc8723b1ant_power_save_state(
2217 btcoexist, BTC_PS_LPS_ON, 0x50,
2220 } else if ((coex_sta->pan_exist == false) &&
2221 (coex_sta->a2dp_exist == false) &&
2222 (coex_sta->hid_exist == false))
2223 halbtc8723b1ant_power_save_state(btcoexist,
2224 BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2226 halbtc8723b1ant_power_save_state(btcoexist,
2227 BTC_PS_LPS_ON, 0x50, 0x4);
2229 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2232 /* tdma and coex table */
2234 if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
2235 halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
2237 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
2238 } else if ((BT_8723B_1ANT_BT_STATUS_SCO_BUSY ==
2239 coex_dm->bt_status) ||
2240 (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
2241 coex_dm->bt_status)) {
2242 halbtc8723b1ant_action_bt_sco_hid_only_busy(btcoexist,
2243 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
2245 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
2247 halbtc8723b1ant_set_ant_path(btcoexist,
2248 BTC_ANT_PATH_PTA, NORMAL_EXEC, false, false);
2249 /* if ((coex_sta->high_priority_tx) +
2250 (coex_sta->high_priority_rx) <= 60) */
2251 halbtc8723b1ant_coex_table_with_type(btcoexist,
2254 halbtc8723b1ant_coex_table_with_type(btcoexist,
2258 if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
2259 halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
2261 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
2262 } else if ((BT_8723B_1ANT_BT_STATUS_SCO_BUSY ==
2263 coex_dm->bt_status) ||
2264 (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
2265 coex_dm->bt_status)) {
2266 halbtc8723b1ant_action_bt_sco_hid_only_busy(btcoexist,
2267 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
2269 /* halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
2271 halbtc8723b1ant_set_ant_path(btcoexist,
2272 BTC_ANT_PATH_PTA, NORMAL_EXEC, false, false);
2273 if ((coex_sta->high_priority_tx) +
2274 (coex_sta->high_priority_rx) <= 60)
2275 halbtc8723b1ant_coex_table_with_type(btcoexist,
2278 halbtc8723b1ant_coex_table_with_type(btcoexist,
2280 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2282 halbtc8723b1ant_set_ant_path(btcoexist,
2283 BTC_ANT_PATH_PTA, NORMAL_EXEC, false, false);
2284 halbtc8723b1ant_coex_table_with_type(btcoexist,
2291 void halbtc8723b1ant_run_coexist_mechanism(IN struct btc_coexist *btcoexist)
2293 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2294 boolean wifi_connected = false, bt_hs_on = false, wifi_busy = false;
2295 boolean increase_scan_dev_num = false;
2296 boolean bt_ctrl_agg_buf_size = false;
2297 boolean miracast_plus_bt = false;
2298 u8 agg_buf_size = 5;
2299 u32 wifi_link_status = 0;
2300 u32 num_of_wifi_link = 0, wifi_bw;
2301 u8 iot_peer = BTC_IOT_PEER_UNKNOWN;
2303 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2304 "[BTCoex], RunCoexistMechanism()===>\n");
2305 BTC_TRACE(trace_buf);
2307 if (btcoexist->manual_control) {
2308 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2309 "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
2310 BTC_TRACE(trace_buf);
2314 if (btcoexist->stop_coex_dm) {
2315 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2316 "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");
2317 BTC_TRACE(trace_buf);
2321 if (coex_sta->under_ips) {
2322 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2323 "[BTCoex], wifi is under IPS !!!\n");
2324 BTC_TRACE(trace_buf);
2328 if (coex_sta->bt_whck_test) {
2329 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2330 "[BTCoex], BT is under WHCK TEST!!!\n");
2331 BTC_TRACE(trace_buf);
2332 halbtc8723b1ant_action_bt_whck_test(btcoexist);
2336 if ((BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
2337 (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
2338 (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
2339 increase_scan_dev_num = true;
2341 btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM,
2342 &increase_scan_dev_num);
2343 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2345 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2347 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2349 num_of_wifi_link = wifi_link_status >> 16;
2351 if ((num_of_wifi_link >= 2) ||
2352 (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {
2353 if (bt_link_info->bt_link_exist) {
2354 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1,
2356 miracast_plus_bt = true;
2358 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0,
2360 miracast_plus_bt = false;
2362 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
2364 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2365 bt_ctrl_agg_buf_size, agg_buf_size);
2367 if (((bt_link_info->a2dp_exist) || (wifi_busy)) &&
2368 (coex_sta->c2h_bt_inquiry_page))
2369 halbtc8723b1ant_action_bt_inquiry(btcoexist);
2371 halbtc8723b1ant_action_wifi_multi_port(btcoexist);
2375 miracast_plus_bt = false;
2376 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
2380 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2382 if ((bt_link_info->bt_link_exist) && (wifi_connected)) {
2383 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1, 0, 1);
2385 btcoexist->btc_get(btcoexist, BTC_GET_U1_IOT_PEER, &iot_peer);
2387 /* if(BTC_IOT_PEER_CISCO != iot_peer) */
2388 if ((BTC_IOT_PEER_CISCO != iot_peer) &&
2389 (BTC_IOT_PEER_BROADCOM != iot_peer)) {
2390 if (bt_link_info->sco_exist) /* if (bt_link_info->bt_hi_pri_link_exist) */
2391 /* halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, true, false, 0x5); */
2392 halbtc8723b1ant_limited_rx(btcoexist,
2393 NORMAL_EXEC, true, false, 0x5);
2395 halbtc8723b1ant_limited_rx(btcoexist,
2396 NORMAL_EXEC, false, false, 0x5);
2397 /* halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, true, 0x8); */
2399 if (bt_link_info->sco_exist)
2400 halbtc8723b1ant_limited_rx(btcoexist,
2401 NORMAL_EXEC, true, false, 0x5);
2402 else if (bt_link_info->hid_exist)
2403 halbtc8723b1ant_limited_rx(btcoexist,
2404 NORMAL_EXEC, false, true, 0x3);
2406 if (BTC_WIFI_BW_HT40 == wifi_bw)
2407 halbtc8723b1ant_limited_rx(btcoexist,
2408 NORMAL_EXEC, false, true, 0x10);
2410 halbtc8723b1ant_limited_rx(btcoexist,
2411 NORMAL_EXEC, false, true, 0x8);
2415 halbtc8723b1ant_sw_mechanism(btcoexist, true);
2417 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2419 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
2422 halbtc8723b1ant_sw_mechanism(btcoexist, false);
2425 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2426 if (coex_sta->c2h_bt_inquiry_page) {
2427 halbtc8723b1ant_action_bt_inquiry(btcoexist);
2429 } else if (bt_hs_on) {
2430 halbtc8723b1ant_action_hs(btcoexist);
2435 if (!wifi_connected) {
2436 boolean scan = false, link = false, roam = false;
2438 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2439 "[BTCoex], wifi is non connected-idle !!!\n");
2440 BTC_TRACE(trace_buf);
2442 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2443 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2444 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2446 if (scan || link || roam) {
2448 halbtc8723b1ant_action_wifi_not_connected_scan(
2451 halbtc8723b1ant_action_wifi_not_connected_asso_auth(
2454 halbtc8723b1ant_action_wifi_not_connected(btcoexist);
2455 } else /* wifi LPS/Busy */
2456 halbtc8723b1ant_action_wifi_connected(btcoexist);
2459 void halbtc8723b1ant_init_coex_dm(IN struct btc_coexist *btcoexist)
2461 /* force to reset coex mechanism */
2464 halbtc8723b1ant_sw_mechanism(btcoexist, false);
2466 /* halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8); */
2467 /* halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0); */
2469 coex_sta->pop_event_cnt = 0;
2472 void halbtc8723b1ant_init_hw_config(IN struct btc_coexist *btcoexist,
2473 IN boolean back_up, IN boolean wifi_only)
2475 u32 u32tmp = 0; /* , fw_ver; */
2476 u8 u8tmpa = 0, u8tmpb = 0;
2478 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2479 "[BTCoex], 1Ant Init HW Config!!\n");
2480 BTC_TRACE(trace_buf);
2482 psd_scan->ant_det_is_ant_det_available = false;
2484 /* 0xf0[15:12] --> Chip Cut information */
2485 coex_sta->cut_version = (btcoexist->btc_read_1byte(btcoexist,
2488 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8,
2489 0x1); /* enable TBTT nterrupt */
2491 /* 0x790[5:0]=0x5 */
2492 btcoexist->btc_write_1byte(btcoexist, 0x790, 0x5);
2494 /* Enable counter statistics */
2495 /* btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc); */ /*0x76e[3] =1, WLAN_Act control by PTA */
2496 btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1);
2497 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
2500 /* btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x1); */ /*BT select s0/s1 is controlled by WiFi */
2502 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2504 /* Antenna config */
2506 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI,
2507 FORCE_EXEC, true, false);
2509 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
2510 FORCE_EXEC, true, false);
2513 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
2515 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
2516 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
2517 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
2519 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2520 "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",
2521 u32tmp, u8tmpa, u8tmpb);
2522 BTC_TRACE(trace_buf);
2525 void halbtc8723b1ant_mechanism_switch(IN struct btc_coexist *btcoexist,
2526 IN boolean bSwitchTo2Antenna)
2529 if (bSwitchTo2Antenna) { /* 1-Ant -> 2-Ant */
2530 /* un-lock TRx Mask setup for 8723b f-cut */
2531 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdd, 0x80, 0x1);
2532 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdf, 0x1, 0x1);
2533 /* WiFi TRx Mask on */
2534 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
2537 /* BT TRx Mask un-lock 0x2c[0], 0x30[0] = 1 */
2538 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x2c,
2540 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x30,
2543 /* BT TRx Mask on */
2544 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x3c, 0x1);
2546 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
2547 FORCE_EXEC, false, false);
2549 /* WiFi TRx Mask on */
2550 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
2553 /* lock TRx Mask setup for 8723b f-cut */
2554 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdd, 0x80, 0x0);
2555 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdf, 0x1, 0x0);
2557 /* BT TRx Mask on */
2558 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x3c, 0x15);
2560 /* BT TRx Mask ock 0x2c[0], 0x30[0] = 0 */
2561 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x2c,
2563 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x30,
2567 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2568 FORCE_EXEC, false, false);
2573 u32 halbtc8723b1ant_psd_log2base(IN struct btc_coexist *btcoexist, IN u32 val)
2576 u32 tmp, tmp2, val_integerd_b = 0, tindex, shiftcount = 0;
2577 u32 result, val_fractiond_b = 0, table_fraction[21] = {0, 432, 332, 274, 232, 200,
2578 174, 151, 132, 115, 100, 86, 74, 62, 51, 42,
2597 val_integerd_b = shiftcount + 1;
2600 for (j = 1; j <= val_integerd_b; j++)
2603 tmp = (val * 100) / tmp2;
2609 val_fractiond_b = table_fraction[tindex];
2611 result = val_integerd_b * 100 - val_fractiond_b;
2618 void halbtc8723b1ant_psd_show_antenna_detect_result(IN struct btc_coexist
2621 u8 *cli_buf = btcoexist->cli_buf;
2622 struct btc_board_info *board_info = &btcoexist->board_info;
2624 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2625 "\r\n============[Antenna Detection info] ============\n");
2628 if (psd_scan->ant_det_result == 1)
2629 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s (>%d)",
2630 "Ant Det Result", "2-Antenna (Bad-Isolation)",
2631 BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION);
2632 else if (psd_scan->ant_det_result == 2)
2633 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s (%d~%d)",
2634 "Ant Det Result", "2-Antenna (Good-Isolation)",
2635 BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION
2636 + psd_scan->ant_det_thres_offset,
2637 BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION);
2639 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s (%d~%d)",
2640 "Ant Det Result", "1-Antenna",
2641 BT_8723B_1ANT_ANTDET_PSDTHRES_1ANT,
2642 BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION
2643 + psd_scan->ant_det_thres_offset);
2647 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s ",
2648 "Antenna Detection Finish",
2649 (board_info->btdm_ant_det_finish
2653 switch (psd_scan->ant_det_result) {
2655 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2656 "(BT is not available)");
2658 case 1: /* 2-Ant bad-isolation */
2659 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2660 "(BT is available)");
2662 case 2: /* 2-Ant good-isolation */
2663 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2664 "(BT is available)");
2667 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2668 "(BT is available)");
2671 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2672 "(Uncertainty result)");
2675 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "(Pre-Scan fai)");
2678 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2679 "(WiFi is Scanning)");
2682 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2683 "(BT is not idle)");
2686 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2687 "(Abort by WiFi Scanning)");
2690 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2691 "(Antenna Init is not ready)");
2694 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2695 "(BT is Inquiry or page)");
2698 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2699 "(BT is Disabled)");
2705 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d",
2706 "Ant Detect Total Count", psd_scan->ant_det_try_count);
2709 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d",
2710 "Ant Detect Fail Count", psd_scan->ant_det_fail_count);
2713 if ((!board_info->btdm_ant_det_finish) &&
2714 (psd_scan->ant_det_result != 5))
2717 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Response",
2718 (psd_scan->ant_det_result ? "ok" : "fail"));
2721 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d ms", "BT Tx Time",
2722 psd_scan->ant_det_bt_tx_time);
2725 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d", "BT Tx Ch",
2726 psd_scan->ant_det_bt_le_channel);
2729 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d",
2730 "WiFi PSD Cent-Ch/Offset/Span",
2731 psd_scan->real_cent_freq, psd_scan->real_offset,
2732 psd_scan->real_span);
2735 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d dB",
2736 "PSD Pre-Scan Peak Value",
2737 psd_scan->ant_det_pre_psdscan_peak_val / 100);
2740 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s (<= %d)",
2741 "PSD Pre-Scan result",
2742 (psd_scan->ant_det_result != 5 ? "ok" : "fail"),
2743 BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND
2744 + psd_scan->ant_det_thres_offset);
2747 if (psd_scan->ant_det_result == 5)
2750 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s dB",
2751 "PSD Scan Peak Value", psd_scan->ant_det_peak_val);
2754 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s MHz",
2755 "PSD Scan Peak Freq", psd_scan->ant_det_peak_freq);
2759 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "TFBGA Package",
2760 (board_info->tfbga_package) ? "Yes" : "No");
2763 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d",
2764 "PSD Threshold Offset", psd_scan->ant_det_thres_offset);
2769 void halbtc8723b1ant_psd_showdata(IN struct btc_coexist *btcoexist)
2771 u8 *cli_buf = btcoexist->cli_buf;
2772 u32 delta_freq_per_point;
2773 u32 freq, freq1, freq2, n = 0, i = 0, j = 0, m = 0, psd_rep1, psd_rep2;
2775 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2776 "\r\n\n============[PSD info] (%d)============\n",
2777 psd_scan->psd_gen_count);
2780 if (psd_scan->psd_gen_count == 0) {
2781 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n No data !!\n");
2786 if (psd_scan->psd_point == 0)
2787 delta_freq_per_point = 0;
2789 delta_freq_per_point = psd_scan->psd_band_width /
2790 psd_scan->psd_point;
2792 /* if (psd_scan->is_psd_show_max_only) */
2794 psd_rep1 = psd_scan->psd_max_value / 100;
2795 psd_rep2 = psd_scan->psd_max_value - psd_rep1 * 100;
2797 freq = ((psd_scan->real_cent_freq - 20) * 1000000 +
2798 psd_scan->psd_max_value_point * delta_freq_per_point);
2799 freq1 = freq / 1000000;
2800 freq2 = freq / 1000 - freq1 * 1000;
2803 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2804 "\r\n Freq = %d.0%d MHz",
2807 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2808 "\r\n Freq = %d.%d MHz",
2812 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2813 ", Value = %d.0%d dB, (%d)\n",
2814 psd_rep1, psd_rep2, psd_scan->psd_max_value);
2816 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2817 ", Value = %d.%d dB, (%d)\n",
2818 psd_rep1, psd_rep2, psd_scan->psd_max_value);
2822 m = psd_scan->psd_start_point;
2823 n = psd_scan->psd_start_point;
2829 freq = ((psd_scan->real_cent_freq - 20) *
2831 delta_freq_per_point);
2832 freq1 = freq / 1000000;
2833 freq2 = freq / 1000 - freq1 * 1000;
2841 else if (freq2 < 100)
2844 "\r\n Freq%6d.0%2d",
2853 } else if ((i % 8 == 0) ||
2854 (m == psd_scan->psd_stop_point)) {
2858 "%6d.000\n", freq1);
2859 else if (freq2 < 100)
2862 "%6d.0%2d\n", freq1,
2874 else if (freq2 < 100)
2890 } while ((i <= 8) && (m <= psd_scan->psd_stop_point));
2894 psd_rep1 = psd_scan->psd_report_max_hold[n] /
2896 psd_rep2 = psd_scan->psd_report_max_hold[n] -
2913 } else if ((j % 8 == 0) ||
2914 (n == psd_scan->psd_stop_point)) {
2918 "%7d.0%d\n", psd_rep1,
2923 "%7d.%d\n", psd_rep1,
2929 "%7d.0%d", psd_rep1,
2942 } while ((j <= 8) && (n <= psd_scan->psd_stop_point));
2944 if ((m > psd_scan->psd_stop_point) ||
2945 (n > psd_scan->psd_stop_point))
2958 void halbtc8723b1ant_psd_max_holddata(IN struct btc_coexist *btcoexist,
2961 u32 i = 0, i_max = 0, val_max = 0;
2963 if (gen_count == 1) {
2964 memcpy(psd_scan->psd_report_max_hold,
2965 psd_scan->psd_report,
2966 BT_8723B_1ANT_ANTDET_PSD_POINTS * sizeof(u32));
2968 psd_scan->psd_max_value_point = 0;
2969 psd_scan->psd_max_value = 0;
2972 for (i = psd_scan->psd_start_point;
2973 i <= psd_scan->psd_stop_point; i++) {
2974 if (psd_scan->psd_report[i] >
2975 psd_scan->psd_report_max_hold[i])
2976 psd_scan->psd_report_max_hold[i] =
2977 psd_scan->psd_report[i];
2979 /* search Max Value */
2980 if (i == psd_scan->psd_start_point) {
2982 val_max = psd_scan->psd_report_max_hold[i];
2984 if (psd_scan->psd_report_max_hold[i] >
2987 val_max = psd_scan->psd_report_max_hold[i];
2993 psd_scan->psd_max_value_point = i_max;
2994 psd_scan->psd_max_value = val_max;
3001 u32 halbtc8723b1ant_psd_getdata(IN struct btc_coexist *btcoexist, IN u32 point)
3003 /* reg 0x808[9:0]: FFT data x */
3004 /* reg 0x808[22]: 0-->1 to get 1 FFT data y */
3005 /* reg 0x8b4[15:0]: FFT data y report */
3007 u32 val = 0, psd_report = 0;
3010 val = btcoexist->btc_read_4byte(btcoexist, 0x808);
3015 btcoexist->btc_write_4byte(btcoexist, 0x808, val);
3018 btcoexist->btc_write_4byte(btcoexist, 0x808, val);
3021 if (k++ > BT_8723B_1ANT_ANTDET_SWEEPPOINT_DELAY)
3025 val = btcoexist->btc_read_4byte(btcoexist, 0x8b4);
3027 psd_report = val & 0x0000ffff;
3033 boolean halbtc8723b1ant_psd_sweep_point(IN struct btc_coexist *btcoexist,
3034 IN u32 cent_freq, IN s32 offset, IN u32 span, IN u32 points,
3035 IN u32 avgnum, IN u32 loopcnt)
3037 u32 i, val, n, k = 0, j, point_index = 0;
3038 u32 points1 = 0, psd_report = 0;
3039 u32 start_p = 0, stop_p = 0, delta_freq_per_point = 156250;
3040 u32 psd_center_freq = 20 * 10 ^ 6;
3041 boolean outloop = false, scan , roam, is_sweep_ok = true;
3044 u32 wifi_original_channel = 1;
3046 psd_scan->is_psd_running = true;
3047 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3048 "xxxxxxxxxxxxxxxx PSD Sweep Start!!\n");
3049 BTC_TRACE(trace_buf);
3053 case 0: /* Get PSD parameters */
3056 psd_scan->psd_band_width = 40 * 1000000;
3057 psd_scan->psd_point = points;
3058 psd_scan->psd_start_base = points / 2;
3059 psd_scan->psd_avg_num = avgnum;
3060 psd_scan->real_cent_freq = cent_freq;
3061 psd_scan->real_offset = offset;
3062 psd_scan->real_span = span;
3065 points1 = psd_scan->psd_point;
3066 delta_freq_per_point = psd_scan->psd_band_width /
3067 psd_scan->psd_point;
3069 /* PSD point setup */
3070 val = btcoexist->btc_read_4byte(btcoexist, 0x808);
3073 switch (psd_scan->psd_point) {
3089 switch (psd_scan->psd_avg_num) {
3104 btcoexist->btc_write_4byte(btcoexist, 0x808, val);
3108 case 1: /* calculate the PSD point index from freq/offset/span */
3109 psd_center_freq = psd_scan->psd_band_width / 2 +
3112 start_p = psd_scan->psd_start_base + (psd_center_freq -
3113 span * (1000000) / 2) / delta_freq_per_point;
3114 psd_scan->psd_start_point = start_p -
3115 psd_scan->psd_start_base;
3117 stop_p = psd_scan->psd_start_base + (psd_center_freq +
3118 span * (1000000) / 2) / delta_freq_per_point;
3119 psd_scan->psd_stop_point = stop_p -
3120 psd_scan->psd_start_base - 1;
3124 case 2: /* set RF channel/BW/Mode */
3126 /* set 3-wire off */
3127 val = btcoexist->btc_read_4byte(btcoexist, 0x88c);
3129 btcoexist->btc_write_4byte(btcoexist, 0x88c, val);
3132 val = btcoexist->btc_read_4byte(btcoexist, 0x800);
3134 btcoexist->btc_write_4byte(btcoexist, 0x800, val);
3136 /* store WiFi original channel */
3137 wifi_original_channel = btcoexist->btc_get_rf_reg(
3138 btcoexist, BTC_RF_A, 0x18, 0x3ff);
3140 /* Set RF channel */
3141 if (cent_freq == 2484)
3142 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A,
3145 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A,
3146 0x18, 0x3ff, (cent_freq - 2412) / 5 +
3147 1); /* WiFi TRx Mask on */
3150 /* Set RF Rx filter corner */
3151 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
3154 /* Set TRx mask off */
3155 /* un-lock TRx Mask setup */
3156 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdd,
3158 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdf,
3161 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
3164 /* Set RF mode = Rx, RF Gain = 0x8a0 */
3165 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x0,
3169 if (k++ > BT_8723B_1ANT_ANTDET_SWEEPPOINT_DELAY)
3175 psd_scan->psd_gen_count = 0;
3176 for (j = 1; j <= loopcnt; j++) {
3178 btcoexist->btc_get(btcoexist,
3179 BTC_GET_BL_WIFI_SCAN, &scan);
3180 btcoexist->btc_get(btcoexist,
3181 BTC_GET_BL_WIFI_ROAM, &roam);
3184 is_sweep_ok = false;
3187 memset(psd_scan->psd_report, 0,
3188 psd_scan->psd_point * sizeof(u32));
3189 start_p = psd_scan->psd_start_point +
3190 psd_scan->psd_start_base;
3191 stop_p = psd_scan->psd_stop_point +
3192 psd_scan->psd_start_base + 1;
3197 while (i < stop_p) {
3200 halbtc8723b1ant_psd_getdata(
3201 btcoexist, i - points1);
3204 halbtc8723b1ant_psd_getdata(
3207 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3208 "Point=%d, psd_raw_data = 0x%08x\n",
3210 BTC_TRACE(trace_buf);
3211 if (psd_report == 0)
3214 /* tmp = 20*log10((double)psd_report); */
3215 /* 20*log2(x)/log2(10), log2Base return theresult of the psd_report*100 */
3216 tmp = 6 * halbtc8723b1ant_psd_log2base(
3217 btcoexist, psd_report);
3219 n = i - psd_scan->psd_start_base;
3220 psd_scan->psd_report[n] = tmp;
3223 halbtc8723b1ant_psd_max_holddata(
3230 psd_scan->psd_gen_count = j;
3235 case 99: /* error */
3239 case 100: /* recovery */
3242 val = btcoexist->btc_read_4byte(btcoexist, 0x88c);
3244 btcoexist->btc_write_4byte(btcoexist, 0x88c, val);
3247 val = btcoexist->btc_read_4byte(btcoexist, 0x800);
3249 btcoexist->btc_write_4byte(btcoexist, 0x800, val);
3252 val = btcoexist->btc_read_4byte(btcoexist, 0x808);
3254 btcoexist->btc_write_4byte(btcoexist, 0x808, val);
3257 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
3260 /* lock TRx Mask setup */
3261 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdd,
3263 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xdf,
3266 /* Set RF Rx filter corner */
3267 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
3270 /* restore WiFi original channel */
3271 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x18,
3272 0x3ff, wifi_original_channel);
3283 psd_scan->is_psd_running = false;
3285 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3286 "xxxxxxxxxxxxxxxx PSD Sweep Stop!!\n");
3287 BTC_TRACE(trace_buf);
3292 void halbtc8723b1ant_psd_antenna_detection(IN struct btc_coexist *btcoexist,
3293 IN u32 bt_tx_time, IN u32 bt_le_channel)
3296 u32 wlpsd_cent_freq = 2484, wlpsd_span = 2, wlpsd_sweep_count = 50;
3297 s32 wlpsd_offset = -4;
3298 u8 bt_le_ch[13] = {3, 6, 8, 11, 13, 16, 18, 21, 23, 26, 28, 31, 33};
3300 u8 h2c_parameter[3] = {0}, u8tmpa, u8tmpb;
3303 boolean outloop = false, bt_resp = false;
3304 u32 freq, freq1, freq2, psd_rep1, psd_rep2, delta_freq_per_point,
3306 struct btc_board_info *board_info = &btcoexist->board_info;
3308 board_info->btdm_ant_det_finish = false;
3309 memset(psd_scan->ant_det_peak_val, 0, 16 * sizeof(u8));
3310 memset(psd_scan->ant_det_peak_freq, 0, 16 * sizeof(u8));
3312 if (board_info->tfbga_package) /* for TFBGA */
3313 psd_scan->ant_det_thres_offset = 5;
3315 psd_scan->ant_det_thres_offset = 0;
3320 if (bt_le_channel == 39)
3321 wlpsd_cent_freq = 2484;
3323 for (i = 1; i <= 13; i++) {
3324 if (bt_le_ch[i - 1] ==
3326 wlpsd_cent_freq = 2412
3334 BTC_SPRINTF(trace_buf,
3336 "xxxxxxxxxxxxxxxx AntennaDetect(), Abort!!, Invalid LE channel = %d\n ",
3338 BTC_TRACE(trace_buf);
3344 wlpsd_sweep_count = bt_tx_time * 238 /
3345 100; /* bt_tx_time/0.42 */
3346 wlpsd_sweep_count = wlpsd_sweep_count / 5;
3348 if (wlpsd_sweep_count % 5 != 0)
3349 wlpsd_sweep_count = (wlpsd_sweep_count /
3352 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3353 "xxxxxxxxxxxxxxxx AntennaDetect(), BT_LETxTime=%d, BT_LECh = %d\n",
3354 bt_tx_time, bt_le_channel);
3355 BTC_TRACE(trace_buf);
3356 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3357 "xxxxxxxxxxxxxxxx AntennaDetect(), wlpsd_cent_freq=%d, wlpsd_offset = %d, wlpsd_span = %d, wlpsd_sweep_count = %d\n",
3362 BTC_TRACE(trace_buf);
3366 case 1: /* stop coex DM & set antenna path */
3368 btcoexist->stop_coex_dm = true;
3370 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3371 "xxxxxxxxxxxxxxxx AntennaDetect(), Stop Coex DM!!\n");
3372 BTC_TRACE(trace_buf);
3374 /* set native power save */
3375 halbtc8723b1ant_power_save_state(btcoexist,
3376 BTC_PS_WIFI_NATIVE, 0x0, 0x0);
3379 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC,
3382 /* Set coex table */
3383 halbtc8723b1ant_coex_table_with_type(btcoexist,
3386 if (board_info->btdm_ant_pos ==
3387 BTC_ANTENNA_AT_MAIN_PORT) {
3388 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3389 "xxxxxxxxxxxxxxxx AntennaDetect(), Antenna at Main Port\n");
3390 BTC_TRACE(trace_buf);
3392 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3393 "xxxxxxxxxxxxxxxx AntennaDetect(), Antenna at Aux Port\n");
3394 BTC_TRACE(trace_buf);
3397 /* Set Antenna path, switch WiFi to un-certain antenna port */
3398 halbtc8723b1ant_set_ant_path(btcoexist,
3399 BTC_ANT_PATH_BT, FORCE_EXEC, false,
3402 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3403 "xxxxxxxxxxxxxxxx AntennaDetect(), Set Antenna to BT!!\n");
3404 BTC_TRACE(trace_buf);
3406 /* Set AFH mask on at WiFi channel 2472MHz +/- 10MHz */
3407 h2c_parameter[0] = 0x1;
3408 h2c_parameter[1] = 0xd;
3409 h2c_parameter[2] = 0x14;
3411 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3412 "xxxxxxxxxxxxxxxx AntennaDetect(), Set AFH on, Cent-Ch= %d, Mask=%d\n",
3415 BTC_TRACE(trace_buf);
3417 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3,
3420 u32tmp = btcoexist->btc_read_4byte(btcoexist,
3422 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
3423 u8tmpb = btcoexist->btc_read_1byte(btcoexist,
3426 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3427 "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x778=0x%x\n",
3428 u32tmp, u8tmpa, u8tmpb);
3429 BTC_TRACE(trace_buf);
3433 case 2: /* Pre-sweep background psd */
3434 if (!halbtc8723b1ant_psd_sweep_point(btcoexist,
3435 wlpsd_cent_freq, wlpsd_offset, wlpsd_span,
3436 BT_8723B_1ANT_ANTDET_PSD_POINTS,
3437 BT_8723B_1ANT_ANTDET_PSD_AVGNUM, 3)) {
3438 board_info->btdm_ant_det_finish = false;
3439 board_info->btdm_ant_num_by_ant_det = 1;
3440 psd_scan->ant_det_result = 8;
3445 psd_scan->ant_det_pre_psdscan_peak_val =
3446 psd_scan->psd_max_value;
3448 if (psd_scan->psd_max_value >
3449 (BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND
3450 + psd_scan->ant_det_thres_offset) * 100) {
3451 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3452 "xxxxxxxxxxxxxxxx AntennaDetect(), Abort Antenna Detection!! becaus background = %d > thres (%d)\n",
3453 psd_scan->psd_max_value / 100,
3454 BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND
3455 + psd_scan->ant_det_thres_offset);
3456 BTC_TRACE(trace_buf);
3457 board_info->btdm_ant_det_finish = false;
3458 board_info->btdm_ant_num_by_ant_det = 1;
3459 psd_scan->ant_det_result = 5;
3462 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3463 "xxxxxxxxxxxxxxxx AntennaDetect(), Start Antenna Detection!! becaus background = %d <= thres (%d)\n",
3464 psd_scan->psd_max_value / 100,
3465 BT_8723B_1ANT_ANTDET_PSDTHRES_BACKGROUND
3466 + psd_scan->ant_det_thres_offset);
3467 BTC_TRACE(trace_buf);
3472 bt_resp = btcoexist->btc_set_bt_ant_detection(
3473 btcoexist, (u8)(bt_tx_time & 0xff),
3474 (u8)(bt_le_channel & 0xff));
3476 if (!halbtc8723b1ant_psd_sweep_point(btcoexist,
3477 wlpsd_cent_freq, wlpsd_offset,
3479 BT_8723B_1ANT_ANTDET_PSD_POINTS,
3480 BT_8723B_1ANT_ANTDET_PSD_AVGNUM,
3481 wlpsd_sweep_count)) {
3482 board_info->btdm_ant_det_finish
3484 board_info->btdm_ant_num_by_ant_det
3486 psd_scan->ant_det_result = 8;
3491 psd_scan->ant_det_psd_scan_peak_val =
3492 psd_scan->psd_max_value;
3493 psd_scan->ant_det_psd_scan_peak_freq =
3494 psd_scan->psd_max_value_point;
3499 if (psd_scan->psd_point == 0)
3500 delta_freq_per_point = 0;
3502 delta_freq_per_point =
3503 psd_scan->psd_band_width /
3504 psd_scan->psd_point;
3506 psd_rep1 = psd_scan->psd_max_value / 100;
3507 psd_rep2 = psd_scan->psd_max_value - psd_rep1 *
3510 freq = ((psd_scan->real_cent_freq - 20) *
3511 1000000 + psd_scan->psd_max_value_point
3512 * delta_freq_per_point);
3513 freq1 = freq / 1000000;
3514 freq2 = freq / 1000 - freq1 * 1000;
3517 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3518 "xxxxxxxxxxxxxxxx AntennaDetect(), Max Value: Freq = %d.0%d MHz",
3520 BTC_TRACE(trace_buf);
3521 CL_SPRINTF(psd_scan->ant_det_peak_freq,
3522 BT_8723B_1ANT_ANTDET_BUF_LEN,
3523 "%d.0%d", freq1, freq2);
3525 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3526 "xxxxxxxxxxxxxxxx AntennaDetect(), Max Value: Freq = %d.%d MHz",
3528 BTC_TRACE(trace_buf);
3529 CL_SPRINTF(psd_scan->ant_det_peak_freq,
3530 BT_8723B_1ANT_ANTDET_BUF_LEN,
3531 "%d.%d", freq1, freq2);
3534 if (psd_rep2 < 10) {
3535 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3536 ", Value = %d.0%d dB\n",
3537 psd_rep1, psd_rep2);
3538 BTC_TRACE(trace_buf);
3539 CL_SPRINTF(psd_scan->ant_det_peak_val,
3540 BT_8723B_1ANT_ANTDET_BUF_LEN,
3541 "%d.0%d", psd_rep1, psd_rep2);
3543 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3544 ", Value = %d.%d dB\n",
3545 psd_rep1, psd_rep2);
3546 BTC_TRACE(trace_buf);
3547 CL_SPRINTF(psd_scan->ant_det_peak_val,
3548 BT_8723B_1ANT_ANTDET_BUF_LEN,
3549 "%d.%d", psd_rep1, psd_rep2);
3552 psd_scan->ant_det_is_btreply_available = true;
3554 if (bt_resp == false) {
3555 psd_scan->ant_det_is_btreply_available =
3557 psd_scan->ant_det_result = 0;
3558 board_info->btdm_ant_det_finish = false;
3559 board_info->btdm_ant_num_by_ant_det = 1;
3560 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3561 "xxxxxxxxxxxxxxxx AntennaDetect(), BT Response = Fail\n ");
3562 BTC_TRACE(trace_buf);
3563 } else if (psd_scan->psd_max_value >
3564 (BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_BADISOLATION)
3566 psd_scan->ant_det_result = 1;
3567 board_info->btdm_ant_det_finish = true;
3568 board_info->btdm_ant_det_already_init_phydm =
3570 board_info->btdm_ant_num_by_ant_det = 2;
3571 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3572 "xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 2-Ant, Bad-Isolation!!\n");
3573 BTC_TRACE(trace_buf);
3574 } else if (psd_scan->psd_max_value >
3575 (BT_8723B_1ANT_ANTDET_PSDTHRES_2ANT_GOODISOLATION
3576 + psd_scan->ant_det_thres_offset) * 100) {
3577 psd_scan->ant_det_result = 2;
3578 board_info->btdm_ant_det_finish = true;
3579 board_info->btdm_ant_det_already_init_phydm =
3581 board_info->btdm_ant_num_by_ant_det = 2;
3582 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3583 "xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 2-Ant, Good-Isolation!!\n");
3584 BTC_TRACE(trace_buf);
3585 } else if (psd_scan->psd_max_value >
3586 (BT_8723B_1ANT_ANTDET_PSDTHRES_1ANT) *
3588 psd_scan->ant_det_result = 3;
3589 board_info->btdm_ant_det_finish = true;
3590 board_info->btdm_ant_det_already_init_phydm =
3592 board_info->btdm_ant_num_by_ant_det = 1;
3593 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3594 "xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 1-Ant!!\n");
3595 BTC_TRACE(trace_buf);
3597 psd_scan->ant_det_result = 4;
3598 board_info->btdm_ant_det_finish = false;
3599 board_info->btdm_ant_num_by_ant_det = 1;
3600 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3601 "xxxxxxxxxxxxxxxx AntennaDetect(), Detect Result = 1-Ant, un-certainity!!\n");
3602 BTC_TRACE(trace_buf);
3607 case 99: /* restore setup */
3609 /* Set AFH mask off at WiFi channel 2472MHz +/- 10MHz */
3610 h2c_parameter[0] = 0x0;
3611 h2c_parameter[1] = 0x0;
3612 h2c_parameter[2] = 0x0;
3614 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3615 "xxxxxxxxxxxxxxxx AntennaDetect(), Set AFH on, Cent-Ch= %d, Mask=%d\n",
3616 h2c_parameter[1], h2c_parameter[2]);
3617 BTC_TRACE(trace_buf);
3619 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3,
3622 /* Set Antenna Path */
3623 halbtc8723b1ant_set_ant_path(btcoexist,
3624 BTC_ANT_PATH_PTA, FORCE_EXEC, false,
3626 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3627 "xxxxxxxxxxxxxxxx AntennaDetect(), Set Antenna to PTA\n!!");
3628 BTC_TRACE(trace_buf);
3630 /* Resume Coex DM */
3631 btcoexist->stop_coex_dm = false;
3632 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3633 "xxxxxxxxxxxxxxxx AntennaDetect(), Resume Coex DM\n!!");
3634 BTC_TRACE(trace_buf);
3636 /* stimulate coex running */
3637 halbtc8723b1ant_run_coexist_mechanism(
3639 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3640 "xxxxxxxxxxxxxxxx AntennaDetect(), Stimulate Coex running\n!!");
3641 BTC_TRACE(trace_buf);
3653 void halbtc8723b1ant_psd_antenna_detection_check(IN struct btc_coexist
3656 static u32 ant_det_count = 0, ant_det_fail_count = 0;
3657 struct btc_board_info *board_info = &btcoexist->board_info;
3661 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3662 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3665 /* psd_scan->ant_det_bt_tx_time = 20; */
3666 psd_scan->ant_det_bt_tx_time =
3667 BT_8723B_1ANT_ANTDET_BTTXTIME; /* 0.42ms*50 = 20ms (0.42ms = 1 PSD sweep) */
3668 psd_scan->ant_det_bt_le_channel = BT_8723B_1ANT_ANTDET_BTTXCHANNEL;
3672 psd_scan->ant_det_try_count = ant_det_count;
3675 board_info->btdm_ant_det_finish = false;
3676 psd_scan->ant_det_result = 6;
3677 } else if (coex_sta->bt_disabled) {
3678 board_info->btdm_ant_det_finish = false;
3679 psd_scan->ant_det_result = 11;
3680 } else if (coex_sta->num_of_profile >= 1) {
3681 board_info->btdm_ant_det_finish = false;
3682 psd_scan->ant_det_result = 7;
3684 !psd_scan->ant_det_is_ant_det_available) { /* Antenna initial setup is not ready */
3685 board_info->btdm_ant_det_finish = false;
3686 psd_scan->ant_det_result = 9;
3687 } else if (coex_sta->c2h_bt_inquiry_page) {
3688 board_info->btdm_ant_det_finish = false;
3689 psd_scan->ant_det_result = 10;
3691 halbtc8723b1ant_psd_antenna_detection(btcoexist,
3692 psd_scan->ant_det_bt_tx_time,
3693 psd_scan->ant_det_bt_le_channel);
3695 if (!board_info->btdm_ant_det_finish)
3696 ant_det_fail_count++;
3698 psd_scan->ant_det_fail_count = ant_det_fail_count;
3703 /* ************************************************************
3704 * work around function start with wa_halbtc8723b1ant_
3705 * ************************************************************
3706 * ************************************************************
3707 * extern function start with ex_halbtc8723b1ant_
3708 * ************************************************************ */
3709 void ex_halbtc8723b1ant_power_on_setting(IN struct btc_coexist *btcoexist)
3711 struct btc_board_info *board_info = &btcoexist->board_info;
3717 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3718 "xxxxxxxxxxxxxxxx Execute 8723b 1-Ant PowerOn Setting xxxxxxxxxxxxxxxx!!\n");
3719 BTC_TRACE(trace_buf);
3721 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3722 "Ant Det Finish = %s, Ant Det Number = %d\n",
3723 (board_info->btdm_ant_det_finish ? "Yes" : "No"),
3724 board_info->btdm_ant_num_by_ant_det);
3725 BTC_TRACE(trace_buf);
3728 btcoexist->stop_coex_dm = true;
3730 btcoexist->btc_write_1byte(btcoexist, 0x67, 0x20);
3732 /* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. */
3733 u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2);
3734 btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT(0) | BIT(1));
3736 /* set GRAN_BT = 1 */
3737 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
3738 /* set WLAN_ACT = 0 */
3739 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
3742 /* S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info) */
3743 /* Local setting bit define */
3744 /* BIT0: "0" for no antenna inverse; "1" for antenna inverse */
3745 /* BIT1: "0" for internal switch; "1" for external switch */
3746 /* BIT2: "0" for one antenna; "1" for two antenna */
3747 /* NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0 */
3748 if (btcoexist->chip_interface == BTC_INTF_USB) {
3749 /* fixed at S0 for USB interface */
3750 btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
3752 u8tmp |= 0x1; /* antenna inverse */
3753 btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
3755 board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
3757 /* for PCIE and SDIO interface, we check efuse 0xc3[6] */
3758 if (board_info->single_ant_path == 0) {
3760 btcoexist->btc_write_4byte(btcoexist, 0x948, 0x280);
3761 board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
3763 } else if (board_info->single_ant_path == 1) {
3765 btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
3766 u8tmp |= 0x1; /* antenna inverse */
3767 board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
3771 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ANTPOSREGRISTRY_CTRL,
3774 if (btcoexist->chip_interface == BTC_INTF_PCI)
3775 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x384,
3777 else if (btcoexist->chip_interface == BTC_INTF_SDIO)
3778 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60,
3783 void ex_halbtc8723b1ant_pre_load_firmware(IN struct btc_coexist *btcoexist)
3787 void ex_halbtc8723b1ant_init_hw_config(IN struct btc_coexist *btcoexist,
3788 IN boolean wifi_only)
3790 halbtc8723b1ant_init_hw_config(btcoexist, true, wifi_only);
3791 btcoexist->stop_coex_dm = false;
3794 void ex_halbtc8723b1ant_init_coex_dm(IN struct btc_coexist *btcoexist)
3796 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3797 "[BTCoex], Coex Mechanism Init!!\n");
3798 BTC_TRACE(trace_buf);
3800 btcoexist->stop_coex_dm = false;
3802 halbtc8723b1ant_init_coex_dm(btcoexist);
3804 halbtc8723b1ant_query_bt_info(btcoexist);
3807 void ex_halbtc8723b1ant_display_coex_info(IN struct btc_coexist *btcoexist)
3809 struct btc_board_info *board_info = &btcoexist->board_info;
3810 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3811 u8 *cli_buf = btcoexist->cli_buf;
3812 u8 u8tmp[4], i, bt_info_ext, ps_tdma_case = 0;
3815 u32 fa_ofdm, fa_cck;
3816 u32 fw_ver = 0, bt_patch_ver = 0;
3817 static u8 pop_report_in_10s = 0;
3819 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3820 "\r\n ============[BT Coexist info]============");
3823 if (btcoexist->manual_control) {
3824 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3825 "\r\n ============[Under Manual Control]============");
3827 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3828 "\r\n ==========================================");
3831 if (btcoexist->stop_coex_dm) {
3832 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3833 "\r\n ============[Coex is STOPPED]============");
3835 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3836 "\r\n ==========================================");
3840 if (psd_scan->ant_det_try_count == 0) {
3841 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d",
3842 "Ant PG Num/ Mech/ Pos",
3843 board_info->pg_ant_num, board_info->btdm_ant_num,
3844 board_info->btdm_ant_pos);
3847 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3848 "\r\n %-35s = %d/ %d/ %d (%d/%d/%d)",
3849 "Ant PG Num/ Mech(Ant_Det)/ Pos",
3850 board_info->pg_ant_num,
3851 board_info->btdm_ant_num_by_ant_det,
3852 board_info->btdm_ant_pos,
3853 psd_scan->ant_det_try_count,
3854 psd_scan->ant_det_fail_count,
3855 psd_scan->ant_det_result);
3858 if (board_info->btdm_ant_det_finish) {
3859 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s",
3860 "Ant Det PSD Value",
3861 psd_scan->ant_det_peak_val);
3866 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
3867 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3868 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3869 "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)/ %c",
3870 "Version Coex/ Fw/ Patch/ Cut",
3871 glcoex_ver_date_8723b_1ant, glcoex_ver_8723b_1ant, fw_ver,
3872 bt_patch_ver, bt_patch_ver, coex_sta->cut_version + 65);
3875 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ",
3876 "Wifi channel informed to BT",
3877 coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1],
3878 coex_dm->wifi_chnl_info[2]);
3880 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s",
3881 "WifibHiPri/ Ccklock/ CckEverLock",
3882 (coex_sta->wifi_is_high_pri_task ? "Yes" : "No"),
3883 (coex_sta->cck_lock ? "Yes" : "No"),
3884 (coex_sta->cck_ever_lock ? "Yes" : "No"));
3888 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
3889 "============[Wifi Status]============");
3891 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_WIFI_STATUS);
3893 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
3894 "============[BT Status]============");
3897 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s",
3899 (coex_sta->bt_abnormal_scan) ? "Yes" : "No");
3902 pop_report_in_10s++;
3903 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d/ %d] ",
3904 "BT [status/ rssi/ retryCnt/ popCnt]",
3905 ((coex_sta->bt_disabled) ? ("disabled") : ((
3906 coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan")
3907 : ((BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
3908 coex_dm->bt_status) ? "non-connected idle" :
3909 ((BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)
3910 ? "connected-idle" : "busy")))),
3911 coex_sta->bt_rssi, coex_sta->bt_retry_cnt,
3912 coex_sta->pop_event_cnt);
3915 if (pop_report_in_10s >= 5) {
3916 coex_sta->pop_event_cnt = 0;
3917 pop_report_in_10s = 0;
3920 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3921 "\r\n %-35s = %d / %d / %d / %d / %d / %d",
3922 "SCO/HID/PAN/A2DP/NameReq/WHQL",
3923 bt_link_info->sco_exist, bt_link_info->hid_exist,
3924 bt_link_info->pan_exist, bt_link_info->a2dp_exist,
3925 coex_sta->c2h_bt_remote_name_req,
3926 coex_sta->bt_whck_test);
3929 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s",
3931 (bt_link_info->slave_role) ? "Slave" : "Master");
3934 bt_info_ext = coex_sta->bt_info_ext;
3935 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %d",
3936 "A2DP Rate/Bitpool",
3937 (bt_info_ext & BIT(0)) ? "BR" : "EDR", coex_sta->a2dp_bit_pool);
3940 for (i = 0; i < BT_INFO_SRC_8723B_1ANT_MAX; i++) {
3941 if (coex_sta->bt_info_c2h_cnt[i]) {
3942 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3943 "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)",
3944 glbt_info_src_8723b_1ant[i],
3945 coex_sta->bt_info_c2h[i][0],
3946 coex_sta->bt_info_c2h[i][1],
3947 coex_sta->bt_info_c2h[i][2],
3948 coex_sta->bt_info_c2h[i][3],
3949 coex_sta->bt_info_c2h[i][4],
3950 coex_sta->bt_info_c2h[i][5],
3951 coex_sta->bt_info_c2h[i][6],
3952 coex_sta->bt_info_c2h_cnt[i]);
3958 if (btcoexist->manual_control)
3959 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
3960 "============[mechanisms] (before Manual)============");
3962 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
3963 "============[mechanisms]============");
3966 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d",
3968 coex_dm->cur_low_penalty_ra);
3971 ps_tdma_case = coex_dm->cur_ps_tdma;
3972 if (board_info->btdm_ant_num_by_ant_det == 2) {
3973 if (coex_dm->cur_ps_tdma_on)
3974 ps_tdma_case = ps_tdma_case +
3975 100; /* for WiFi RSSI low or BT RSSI low */
3978 1; /* always translate to TDMA(off,1) for TDMA-off case */
3980 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3981 "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (%s,%s)",
3983 coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1],
3984 coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3],
3985 coex_dm->ps_tdma_para[4], ps_tdma_case,
3986 (coex_dm->cur_ps_tdma_on ? "On" : "Off"),
3987 (coex_dm->auto_tdma_adjust ? "Adj" : "Fix"));
3991 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d",
3993 coex_sta->coex_table_type);
3996 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d",
3998 coex_dm->cur_ignore_wlan_act);
4002 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Latest error condition(should be 0)",
4003 coex_dm->error_condition);
4008 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4009 "============[Hw setting]============");
4012 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
4013 "backup ARFR1/ARFR2/RL/AMaxTime",
4014 coex_dm->backup_arfr_cnt1, coex_dm->backup_arfr_cnt2,
4015 coex_dm->backup_retry_limit,
4016 coex_dm->backup_ampdu_max_time);
4019 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
4020 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
4021 u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
4022 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
4023 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
4024 "0x430/0x434/0x42a/0x456",
4025 u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]);
4028 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
4029 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6cc);
4030 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x880);
4031 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
4032 "0x778/0x6cc/0x880[29:25]",
4033 u8tmp[0], u32tmp[0], (u32tmp[1] & 0x3e000000) >> 25);
4036 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x948);
4037 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x67);
4038 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x764);
4039 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x76e);
4040 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4041 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
4042 "0x948/ 0x67[5] / 0x764 / 0x76e",
4043 u32tmp[0], ((u8tmp[0] & 0x20) >> 5), (u32tmp[1] & 0xffff),
4047 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x92c);
4048 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x930);
4049 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x944);
4050 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
4051 "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]",
4052 u32tmp[0] & 0x3, u32tmp[1] & 0xff, u32tmp[2] & 0x3);
4055 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x39);
4056 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
4057 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
4058 u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64);
4059 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4060 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
4061 "0x38[11]/0x40/0x4c[24:23]/0x64[0]",
4062 ((u8tmp[0] & 0x8) >> 3), u8tmp[1],
4063 ((u32tmp[0] & 0x01800000) >> 23), u8tmp[2] & 0x1);
4066 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
4067 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
4068 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
4069 "0x550(bcn ctrl)/0x522",
4070 u32tmp[0], u8tmp[0]);
4073 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
4074 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x49c);
4075 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
4076 "0xc50(dig)/0x49c(null-drop)",
4077 u32tmp[0] & 0xff, u8tmp[0]);
4080 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xda0);
4081 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xda4);
4082 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0xda8);
4083 u32tmp[3] = btcoexist->btc_read_4byte(btcoexist, 0xcf0);
4085 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);
4086 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
4088 fa_ofdm = ((u32tmp[0] & 0xffff0000) >> 16) + ((u32tmp[1] & 0xffff0000)
4089 >> 16) + (u32tmp[1] & 0xffff) + (u32tmp[2] & 0xffff) +
4090 ((u32tmp[3] & 0xffff0000) >> 16) + (u32tmp[3] &
4092 fa_cck = (u8tmp[0] << 8) + u8tmp[1];
4094 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
4095 "OFDM-CCA/OFDM-FA/CCK-FA",
4096 u32tmp[0] & 0xffff, fa_ofdm, fa_cck);
4100 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
4101 "CRC_OK CCK/11g/11n/11n-Agg",
4102 coex_sta->crc_ok_cck, coex_sta->crc_ok_11g,
4103 coex_sta->crc_ok_11n, coex_sta->crc_ok_11n_agg);
4106 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
4107 "CRC_Err CCK/11g/11n/11n-Agg",
4108 coex_sta->crc_err_cck, coex_sta->crc_err_11g,
4109 coex_sta->crc_err_11n, coex_sta->crc_err_11n_agg);
4112 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
4113 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
4114 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
4115 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
4116 "0x6c0/0x6c4/0x6c8(coexTable)",
4117 u32tmp[0], u32tmp[1], u32tmp[2]);
4120 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
4121 "0x770(high-pri rx/tx)",
4122 coex_sta->high_priority_rx, coex_sta->high_priority_tx);
4124 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
4125 "0x774(low-pri rx/tx)",
4126 coex_sta->low_priority_rx, coex_sta->low_priority_tx);
4128 #if (BT_AUTO_REPORT_ONLY_8723B_1ANT == 1)
4129 /* halbtc8723b1ant_monitor_bt_ctr(btcoexist); */
4131 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS);
4135 void ex_halbtc8723b1ant_ips_notify(IN struct btc_coexist *btcoexist, IN u8 type)
4137 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
4140 if (BTC_IPS_ENTER == type) {
4141 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4142 "[BTCoex], IPS ENTER notify\n");
4143 BTC_TRACE(trace_buf);
4144 coex_sta->under_ips = true;
4146 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
4147 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
4148 FORCE_EXEC, false, true);
4149 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
4150 } else if (BTC_IPS_LEAVE == type) {
4151 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4152 "[BTCoex], IPS LEAVE notify\n");
4153 BTC_TRACE(trace_buf);
4155 halbtc8723b1ant_init_hw_config(btcoexist, false, false);
4156 halbtc8723b1ant_init_coex_dm(btcoexist);
4157 halbtc8723b1ant_query_bt_info(btcoexist);
4159 coex_sta->under_ips = false;
4163 void ex_halbtc8723b1ant_lps_notify(IN struct btc_coexist *btcoexist, IN u8 type)
4165 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
4168 if (BTC_LPS_ENABLE == type) {
4169 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4170 "[BTCoex], LPS ENABLE notify\n");
4171 BTC_TRACE(trace_buf);
4172 coex_sta->under_lps = true;
4173 } else if (BTC_LPS_DISABLE == type) {
4174 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4175 "[BTCoex], LPS DISABLE notify\n");
4176 BTC_TRACE(trace_buf);
4177 coex_sta->under_lps = false;
4181 void ex_halbtc8723b1ant_scan_notify(IN struct btc_coexist *btcoexist,
4184 boolean wifi_connected = false, bt_hs_on = false;
4185 u32 wifi_link_status = 0;
4186 u32 num_of_wifi_link = 0;
4187 boolean bt_ctrl_agg_buf_size = false;
4188 u8 agg_buf_size = 5;
4193 if (btcoexist->manual_control ||
4194 btcoexist->stop_coex_dm)
4197 if (BTC_SCAN_START == type) {
4198 coex_sta->wifi_is_high_pri_task = true;
4199 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4200 "[BTCoex], SCAN START notify\n");
4201 BTC_TRACE(trace_buf);
4202 psd_scan->ant_det_is_ant_det_available = true;
4203 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false,
4204 8); /* Force antenna setup for no scan result issue */
4205 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
4206 FORCE_EXEC, false, false);
4207 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
4208 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
4209 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
4212 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4213 "[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",
4214 u32tmp, u8tmpa, u8tmpb);
4215 BTC_TRACE(trace_buf);
4217 coex_sta->wifi_is_high_pri_task = false;
4218 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4219 "[BTCoex], SCAN FINISH notify\n");
4220 BTC_TRACE(trace_buf);
4222 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
4223 &coex_sta->scan_ap_num);
4226 if (coex_sta->bt_disabled)
4229 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
4230 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
4233 halbtc8723b1ant_query_bt_info(btcoexist);
4235 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
4237 num_of_wifi_link = wifi_link_status >> 16;
4238 if (num_of_wifi_link >= 2) {
4239 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
4240 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
4241 bt_ctrl_agg_buf_size, agg_buf_size);
4242 halbtc8723b1ant_action_wifi_multi_port(btcoexist);
4246 if (coex_sta->c2h_bt_inquiry_page) {
4247 halbtc8723b1ant_action_bt_inquiry(btcoexist);
4249 } else if (bt_hs_on) {
4250 halbtc8723b1ant_action_hs(btcoexist);
4254 if (BTC_SCAN_START == type) {
4255 if (!wifi_connected) /* non-connected scan */
4256 halbtc8723b1ant_action_wifi_not_connected_scan(
4258 else /* wifi is connected */
4259 halbtc8723b1ant_action_wifi_connected_scan(btcoexist);
4260 } else if (BTC_SCAN_FINISH == type) {
4261 if (!wifi_connected) /* non-connected scan */
4262 halbtc8723b1ant_action_wifi_not_connected(btcoexist);
4264 halbtc8723b1ant_action_wifi_connected(btcoexist);
4268 void ex_halbtc8723b1ant_connect_notify(IN struct btc_coexist *btcoexist,
4271 boolean wifi_connected = false, bt_hs_on = false;
4272 u32 wifi_link_status = 0;
4273 u32 num_of_wifi_link = 0;
4274 boolean bt_ctrl_agg_buf_size = false;
4275 u8 agg_buf_size = 5;
4277 if (btcoexist->manual_control ||
4278 btcoexist->stop_coex_dm ||
4279 coex_sta->bt_disabled)
4282 if (BTC_ASSOCIATE_START == type) {
4283 coex_sta->wifi_is_high_pri_task = true;
4284 psd_scan->ant_det_is_ant_det_available = true;
4285 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false,
4286 8); /* Force antenna setup for no scan result issue */
4287 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
4288 FORCE_EXEC, false, false);
4289 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4290 "[BTCoex], CONNECT START notify\n");
4291 BTC_TRACE(trace_buf);
4292 coex_dm->arp_cnt = 0;
4294 coex_sta->wifi_is_high_pri_task = false;
4295 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4296 "[BTCoex], CONNECT FINISH notify\n");
4297 BTC_TRACE(trace_buf);
4298 /* coex_dm->arp_cnt = 0; */
4301 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
4303 num_of_wifi_link = wifi_link_status >> 16;
4304 if (num_of_wifi_link >= 2) {
4305 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
4306 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
4307 bt_ctrl_agg_buf_size, agg_buf_size);
4308 halbtc8723b1ant_action_wifi_multi_port(btcoexist);
4312 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
4313 if (coex_sta->c2h_bt_inquiry_page) {
4314 halbtc8723b1ant_action_bt_inquiry(btcoexist);
4316 } else if (bt_hs_on) {
4317 halbtc8723b1ant_action_hs(btcoexist);
4321 if (BTC_ASSOCIATE_START == type)
4322 halbtc8723b1ant_action_wifi_not_connected_asso_auth(btcoexist);
4323 else if (BTC_ASSOCIATE_FINISH == type) {
4324 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
4326 if (!wifi_connected) /* non-connected scan */
4327 halbtc8723b1ant_action_wifi_not_connected(btcoexist);
4329 halbtc8723b1ant_action_wifi_connected(btcoexist);
4333 void ex_halbtc8723b1ant_media_status_notify(IN struct btc_coexist *btcoexist,
4336 u8 h2c_parameter[3] = {0};
4338 u8 wifi_central_chnl;
4339 boolean wifi_under_b_mode = false;
4341 if (btcoexist->manual_control ||
4342 btcoexist->stop_coex_dm ||
4343 coex_sta->bt_disabled)
4346 if (BTC_MEDIA_CONNECT == type) {
4347 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4348 "[BTCoex], MEDIA connect notify\n");
4349 BTC_TRACE(trace_buf);
4350 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false,
4351 8); /* Force antenna setup for no scan result issue */
4352 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
4353 FORCE_EXEC, false, false);
4354 psd_scan->ant_det_is_ant_det_available = true;
4355 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
4356 &wifi_under_b_mode);
4358 /* Set CCK Tx/Rx high Pri except 11b mode */
4359 if (wifi_under_b_mode) {
4360 btcoexist->btc_write_1byte(btcoexist, 0x6cd,
4362 btcoexist->btc_write_1byte(btcoexist, 0x6cf,
4365 btcoexist->btc_write_1byte(btcoexist, 0x6cd,
4367 btcoexist->btc_write_1byte(btcoexist, 0x6cf,
4371 coex_dm->backup_arfr_cnt1 = btcoexist->btc_read_4byte(btcoexist,
4373 coex_dm->backup_arfr_cnt2 = btcoexist->btc_read_4byte(btcoexist,
4375 coex_dm->backup_retry_limit = btcoexist->btc_read_2byte(
4377 coex_dm->backup_ampdu_max_time = btcoexist->btc_read_1byte(
4380 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4381 "[BTCoex], MEDIA disconnect notify\n");
4382 BTC_TRACE(trace_buf);
4383 coex_dm->arp_cnt = 0;
4385 btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x0); /* CCK Tx */
4386 btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x0); /* CCK Rx */
4388 coex_sta->cck_ever_lock = false;
4391 /* only 2.4G we need to inform bt the chnl mask */
4392 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
4393 &wifi_central_chnl);
4394 if ((BTC_MEDIA_CONNECT == type) &&
4395 (wifi_central_chnl <= 14)) {
4396 /* h2c_parameter[0] = 0x1; */
4397 h2c_parameter[0] = 0x0;
4398 h2c_parameter[1] = wifi_central_chnl;
4399 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
4400 if (BTC_WIFI_BW_HT40 == wifi_bw)
4401 h2c_parameter[2] = 0x30;
4403 h2c_parameter[2] = 0x20;
4406 coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
4407 coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
4408 coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
4410 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
4413 void ex_halbtc8723b1ant_specific_packet_notify(IN struct btc_coexist *btcoexist,
4416 boolean bt_hs_on = false;
4417 u32 wifi_link_status = 0;
4418 u32 num_of_wifi_link = 0;
4419 boolean bt_ctrl_agg_buf_size = false, under_4way = false;
4420 u8 agg_buf_size = 5;
4422 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
4425 if (btcoexist->manual_control ||
4426 btcoexist->stop_coex_dm ||
4427 coex_sta->bt_disabled)
4430 if (BTC_PACKET_DHCP == type ||
4431 BTC_PACKET_EAPOL == type ||
4432 BTC_PACKET_ARP == type) {
4433 if (BTC_PACKET_ARP == type) {
4434 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4435 "[BTCoex], specific Packet ARP notify\n");
4436 BTC_TRACE(trace_buf);
4439 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4440 "[BTCoex], ARP Packet Count = %d\n",
4442 BTC_TRACE(trace_buf);
4444 if ((coex_dm->arp_cnt >= 10) &&
4445 (!under_4way)) /* if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecificPacket(btcoexist) */
4446 coex_sta->wifi_is_high_pri_task = false;
4448 coex_sta->wifi_is_high_pri_task = true;
4450 coex_sta->wifi_is_high_pri_task = true;
4451 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4452 "[BTCoex], specific Packet DHCP or EAPOL notify\n");
4453 BTC_TRACE(trace_buf);
4456 coex_sta->wifi_is_high_pri_task = false;
4457 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4458 "[BTCoex], specific Packet [Type = %d] notify\n", type);
4459 BTC_TRACE(trace_buf);
4462 coex_sta->specific_pkt_period_cnt = 0;
4464 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
4466 num_of_wifi_link = wifi_link_status >> 16;
4467 if (num_of_wifi_link >= 2) {
4468 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
4469 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
4470 bt_ctrl_agg_buf_size, agg_buf_size);
4471 halbtc8723b1ant_action_wifi_multi_port(btcoexist);
4475 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
4476 if (coex_sta->c2h_bt_inquiry_page) {
4477 halbtc8723b1ant_action_bt_inquiry(btcoexist);
4479 } else if (bt_hs_on) {
4480 halbtc8723b1ant_action_hs(btcoexist);
4484 if (BTC_PACKET_DHCP == type ||
4485 BTC_PACKET_EAPOL == type ||
4486 ((BTC_PACKET_ARP == type) && (coex_sta->wifi_is_high_pri_task)))
4487 halbtc8723b1ant_action_wifi_connected_specific_packet(
4491 void ex_halbtc8723b1ant_bt_info_notify(IN struct btc_coexist *btcoexist,
4492 IN u8 *tmp_buf, IN u8 length)
4495 u8 i, rsp_source = 0;
4496 boolean wifi_connected = false;
4497 boolean bt_busy = false;
4498 struct btc_board_info *board_info = &btcoexist->board_info;
4500 coex_sta->c2h_bt_info_req_sent = false;
4502 rsp_source = tmp_buf[0] & 0xf;
4503 if (rsp_source >= BT_INFO_SRC_8723B_1ANT_MAX)
4504 rsp_source = BT_INFO_SRC_8723B_1ANT_WIFI_FW;
4505 coex_sta->bt_info_c2h_cnt[rsp_source]++;
4507 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4508 "[BTCoex], Bt info[%d], length=%d, hex data=[", rsp_source,
4510 BTC_TRACE(trace_buf);
4511 for (i = 0; i < length; i++) {
4512 coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
4514 bt_info = tmp_buf[i];
4515 if (i == length - 1) {
4516 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x]\n",
4518 BTC_TRACE(trace_buf);
4520 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x, ",
4522 BTC_TRACE(trace_buf);
4526 /* if 0xff, it means BT is under WHCK test */
4527 if (bt_info == 0xff)
4528 coex_sta->bt_whck_test = true;
4530 coex_sta->bt_whck_test = false;
4532 if (BT_INFO_SRC_8723B_1ANT_WIFI_FW != rsp_source) {
4533 coex_sta->bt_retry_cnt = /* [3:0] */
4534 coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
4536 if (coex_sta->bt_retry_cnt >= 1)
4537 coex_sta->pop_event_cnt++;
4539 if (coex_sta->bt_info_c2h[rsp_source][2] & 0x20)
4540 coex_sta->c2h_bt_remote_name_req = true;
4542 coex_sta->c2h_bt_remote_name_req = false;
4545 coex_sta->bt_info_c2h[rsp_source][3] * 2 - 90;
4546 /* coex_sta->bt_info_c2h[rsp_source][3]*2+10; */
4548 coex_sta->bt_info_ext =
4549 coex_sta->bt_info_c2h[rsp_source][4];
4551 if (coex_sta->bt_info_c2h[rsp_source][1] == 0x49) {
4552 coex_sta->a2dp_bit_pool =
4553 coex_sta->bt_info_c2h[rsp_source][6];
4555 coex_sta->a2dp_bit_pool = 0;
4557 coex_sta->bt_tx_rx_mask = (coex_sta->bt_info_c2h[rsp_source][2]
4559 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK,
4560 &coex_sta->bt_tx_rx_mask);
4562 #if BT_8723B_1ANT_ANTDET_ENABLE
4563 #if BT_8723B_1ANT_ANTDET_COEXMECHANISMSWITCH_ENABLE
4564 if ((board_info->btdm_ant_det_finish) &&
4565 (board_info->btdm_ant_num_by_ant_det == 2)) {
4566 if (coex_sta->bt_tx_rx_mask) {
4567 /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */
4568 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4569 "[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x1\n");
4570 BTC_TRACE(trace_buf);
4572 /* BT TRx Mask un-lock 0x2c[0], 0x30[0] = 1 */
4573 btcoexist->btc_set_bt_reg(btcoexist,
4574 BTC_BT_REG_RF, 0x2c, 0x7c45);
4575 btcoexist->btc_set_bt_reg(btcoexist,
4576 BTC_BT_REG_RF, 0x30, 0x7c45);
4578 btcoexist->btc_set_bt_reg(btcoexist,
4579 BTC_BT_REG_RF, 0x3c, 0x1);
4586 if (!coex_sta->bt_tx_rx_mask) {
4587 /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */
4588 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4589 "[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n");
4590 BTC_TRACE(trace_buf);
4591 btcoexist->btc_set_bt_reg(btcoexist,
4595 /* BT TRx Mask lock 0x2c[0], 0x30[0] = 0 */
4596 btcoexist->btc_set_bt_reg(btcoexist,
4599 btcoexist->btc_set_bt_reg(btcoexist,
4605 /* Here we need to resend some wifi info to BT */
4606 /* because bt is reset and loss of the info. */
4607 if (coex_sta->bt_info_ext & BIT(1)) {
4608 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4609 "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
4610 BTC_TRACE(trace_buf);
4611 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
4614 ex_halbtc8723b1ant_media_status_notify(
4615 btcoexist, BTC_MEDIA_CONNECT);
4617 ex_halbtc8723b1ant_media_status_notify(
4618 btcoexist, BTC_MEDIA_DISCONNECT);
4621 if (coex_sta->bt_info_ext & BIT(3)) {
4622 if (!btcoexist->manual_control &&
4623 !btcoexist->stop_coex_dm) {
4624 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4625 "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
4626 BTC_TRACE(trace_buf);
4627 halbtc8723b1ant_ignore_wlan_act(btcoexist,
4631 /* BT already NOT ignore Wlan active, do nothing here. */
4633 #if (BT_AUTO_REPORT_ONLY_8723B_1ANT == 0)
4634 if ((coex_sta->bt_info_ext & BIT(4))) {
4635 /* BT auto report already enabled, do nothing */
4637 halbtc8723b1ant_bt_auto_report(btcoexist, FORCE_EXEC,
4642 /* check BIT2 first ==> check if bt is under inquiry or page scan */
4643 if (bt_info & BT_INFO_8723B_1ANT_B_INQ_PAGE)
4644 coex_sta->c2h_bt_inquiry_page = true;
4646 coex_sta->c2h_bt_inquiry_page = false;
4648 coex_sta->num_of_profile = 0;
4650 /* set link exist status */
4651 if (!(bt_info & BT_INFO_8723B_1ANT_B_CONNECTION)) {
4652 coex_sta->bt_link_exist = false;
4653 coex_sta->pan_exist = false;
4654 coex_sta->a2dp_exist = false;
4655 coex_sta->hid_exist = false;
4656 coex_sta->sco_exist = false;
4658 coex_sta->bt_hi_pri_link_exist = false;
4659 } else { /* connection exists */
4660 coex_sta->bt_link_exist = true;
4661 if (bt_info & BT_INFO_8723B_1ANT_B_FTP) {
4662 coex_sta->pan_exist = true;
4663 coex_sta->num_of_profile++;
4665 coex_sta->pan_exist = false;
4666 if (bt_info & BT_INFO_8723B_1ANT_B_A2DP) {
4667 coex_sta->a2dp_exist = true;
4668 coex_sta->num_of_profile++;
4670 coex_sta->a2dp_exist = false;
4671 if (bt_info & BT_INFO_8723B_1ANT_B_HID) {
4672 coex_sta->hid_exist = true;
4673 coex_sta->num_of_profile++;
4675 coex_sta->hid_exist = false;
4676 if (bt_info & BT_INFO_8723B_1ANT_B_SCO_ESCO) {
4677 coex_sta->sco_exist = true;
4678 coex_sta->num_of_profile++;
4680 coex_sta->sco_exist = false;
4682 if ((coex_sta->hid_exist == false) &&
4683 (coex_sta->c2h_bt_inquiry_page == false) &&
4684 (coex_sta->sco_exist == false)) {
4685 if (coex_sta->high_priority_tx +
4686 coex_sta->high_priority_rx >= 160) {
4687 coex_sta->hid_exist = true;
4688 coex_sta->wrong_profile_notification++;
4689 coex_sta->num_of_profile++;
4690 bt_info = bt_info | 0x28;
4694 /* Add Hi-Pri Tx/Rx counter to avoid false detection */
4695 if (((coex_sta->hid_exist) || (coex_sta->sco_exist)) &&
4696 (coex_sta->high_priority_tx +
4697 coex_sta->high_priority_rx >= 160)
4698 && (!coex_sta->c2h_bt_inquiry_page))
4699 coex_sta->bt_hi_pri_link_exist = true;
4701 if ((bt_info & BT_INFO_8723B_1ANT_B_ACL_BUSY) &&
4702 (coex_sta->num_of_profile == 0)) {
4703 if (coex_sta->low_priority_tx +
4704 coex_sta->low_priority_rx >= 160) {
4705 coex_sta->pan_exist = true;
4706 coex_sta->num_of_profile++;
4707 coex_sta->wrong_profile_notification++;
4708 bt_info = bt_info | 0x88;
4713 halbtc8723b1ant_update_bt_link_info(btcoexist);
4716 0x1f; /* mask profile bit for connect-ilde identification ( for CSR case: A2DP idle --> 0x41) */
4718 if (!(bt_info & BT_INFO_8723B_1ANT_B_CONNECTION))
4719 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
4721 BT_INFO_8723B_1ANT_B_CONNECTION) /* connection exists but no busy */
4722 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE;
4723 else if ((bt_info & BT_INFO_8723B_1ANT_B_SCO_ESCO) ||
4724 (bt_info & BT_INFO_8723B_1ANT_B_SCO_BUSY))
4725 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_SCO_BUSY;
4726 else if (bt_info & BT_INFO_8723B_1ANT_B_ACL_BUSY) {
4727 if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)
4728 coex_dm->auto_tdma_adjust = false;
4729 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_ACL_BUSY;
4731 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_MAX;
4733 if ((BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
4734 (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
4735 (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
4739 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
4741 halbtc8723b1ant_run_coexist_mechanism(btcoexist);
4744 void ex_halbtc8723b1ant_rf_status_notify(IN struct btc_coexist *btcoexist,
4748 u8 u8tmpa, u8tmpb, u8tmpc;
4750 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], RF Status notify\n");
4751 BTC_TRACE(trace_buf);
4753 if (BTC_RF_ON == type) {
4754 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4755 "[BTCoex], RF is turned ON!!\n");
4756 BTC_TRACE(trace_buf);
4757 btcoexist->stop_coex_dm = false;
4758 } else if (BTC_RF_OFF == type) {
4759 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4760 "[BTCoex], RF is turned OFF!!\n");
4761 BTC_TRACE(trace_buf);
4763 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
4765 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
4766 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
4767 FORCE_EXEC, false, true);
4769 halbtc8723b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
4770 btcoexist->stop_coex_dm = true;
4772 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
4773 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
4774 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
4775 u8tmpc = btcoexist->btc_read_1byte(btcoexist, 0x76e);
4778 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4779 "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x, 0x76e=0x%x\n",
4780 u32tmp, u8tmpa, u8tmpb, u8tmpc);
4781 BTC_TRACE(trace_buf);
4786 void ex_halbtc8723b1ant_halt_notify(IN struct btc_coexist *btcoexist)
4788 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Halt notify\n");
4789 BTC_TRACE(trace_buf);
4791 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
4793 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
4794 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, FORCE_EXEC,
4797 halbtc8723b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
4799 ex_halbtc8723b1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
4801 btcoexist->stop_coex_dm = true;
4804 void ex_halbtc8723b1ant_pnp_notify(IN struct btc_coexist *btcoexist,
4807 if (BTC_WIFI_PNP_SLEEP == pnp_state) {
4808 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4809 "[BTCoex], Pnp notify to SLEEP\n");
4810 BTC_TRACE(trace_buf);
4812 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
4814 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
4815 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
4816 FORCE_EXEC, false, true);
4817 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
4819 /* Sinda 20150819, workaround for driver skip leave IPS/LPS to speed up sleep time. */
4820 /* Driver do not leave IPS/LPS when driver is going to sleep, so BTCoexistence think wifi is still under IPS/LPS */
4821 /* BT should clear UnderIPS/UnderLPS state to avoid mismatch state after wakeup. */
4822 coex_sta->under_ips = false;
4823 coex_sta->under_lps = false;
4824 btcoexist->stop_coex_dm = true;
4825 } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
4826 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4827 "[BTCoex], Pnp notify to WAKE UP\n");
4828 BTC_TRACE(trace_buf);
4829 btcoexist->stop_coex_dm = false;
4830 halbtc8723b1ant_init_hw_config(btcoexist, false, false);
4831 halbtc8723b1ant_init_coex_dm(btcoexist);
4832 halbtc8723b1ant_query_bt_info(btcoexist);
4836 void ex_halbtc8723b1ant_coex_dm_reset(IN struct btc_coexist *btcoexist)
4839 halbtc8723b1ant_init_hw_config(btcoexist, false, false);
4840 /* btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); */
4841 /* btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x2, 0xfffff, 0x0); */
4842 halbtc8723b1ant_init_coex_dm(btcoexist);
4845 void ex_halbtc8723b1ant_periodical(IN struct btc_coexist *btcoexist)
4847 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4848 "[BTCoex], ==========================Periodical===========================\n");
4849 BTC_TRACE(trace_buf);
4851 #if (BT_AUTO_REPORT_ONLY_8723B_1ANT == 0)
4852 halbtc8723b1ant_query_bt_info(btcoexist);
4854 halbtc8723b1ant_monitor_bt_ctr(btcoexist);
4855 halbtc8723b1ant_monitor_wifi_ctr(btcoexist);
4857 halbtc8723b1ant_monitor_bt_enable_disable(btcoexist);
4860 if (halbtc8723b1ant_is_wifi_status_changed(btcoexist) ||
4861 coex_dm->auto_tdma_adjust || btcoexist->btInfo.bt_enable_disable_change)
4863 halbtc8723b1ant_run_coexist_mechanism(btcoexist);
4866 coex_sta->specific_pkt_period_cnt++;
4868 /* sample to set bt to execute Ant detection */
4869 /* btcoexist->btc_set_bt_ant_detection(btcoexist, 20, 14);
4871 if (psd_scan->is_ant_det_enable)
4873 if (psd_scan->psd_gen_count > psd_scan->realseconds)
4874 psd_scan->psd_gen_count = 0;
4876 halbtc8723b1ant_antenna_detection(btcoexist, psd_scan->realcent_freq, psd_scan->realoffset, psd_scan->realspan, psd_scan->realseconds);
4877 psd_scan->psd_gen_total_count +=2;
4878 psd_scan->psd_gen_count += 2;
4883 void ex_halbtc8723b1ant_antenna_detection(IN struct btc_coexist *btcoexist,
4884 IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds)
4886 #if BT_8723B_1ANT_ANTDET_ENABLE
4887 static u32 ant_det_count = 0, ant_det_fail_count = 0;
4888 struct btc_board_info *board_info = &btcoexist->board_info;
4889 /*boolean scan, roam;*/
4892 psd_scan->ant_det_try_count = 0;
4893 psd_scan->ant_det_fail_count = 0;
4895 ant_det_fail_count = 0;
4896 board_info->btdm_ant_det_finish = false;
4897 board_info->btdm_ant_num_by_ant_det = 1;
4901 if (!board_info->btdm_ant_det_finish) {
4902 psd_scan->ant_det_inteval_count =
4903 psd_scan->ant_det_inteval_count + 2;
4905 if (psd_scan->ant_det_inteval_count >=
4906 BT_8723B_1ANT_ANTDET_RETRY_INTERVAL) {
4907 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4908 "xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Timer is up, Try Detect!!\n");
4909 BTC_TRACE(trace_buf);
4910 halbtc8723b1ant_psd_antenna_detection_check(btcoexist);
4912 if (board_info->btdm_ant_det_finish) {
4913 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4914 "xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Success!!\n");
4915 BTC_TRACE(trace_buf);
4917 if (board_info->btdm_ant_num_by_ant_det == 2)
4918 halbtc8723b1ant_mechanism_switch(
4921 halbtc8723b1ant_mechanism_switch(
4925 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4926 "xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Fail!!\n");
4927 BTC_TRACE(trace_buf);
4929 psd_scan->ant_det_inteval_count = 0;
4931 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4932 "xxxxxxxxxxxxxxxx AntennaDetect(), Antenna Det Timer is not up! (%d)\n",
4933 psd_scan->ant_det_inteval_count);
4934 BTC_TRACE(trace_buf);
4942 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
4943 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
4946 psd_scan->ant_det_bt_tx_time = seconds;
4947 psd_scan->ant_det_bt_le_channel = cent_freq;
4951 psd_scan->ant_det_try_count = 0;
4952 psd_scan->ant_det_fail_count = 0;
4954 ant_det_fail_count = 0;
4955 board_info->btdm_ant_det_finish = false;
4956 board_info->btdm_ant_num_by_ant_det = 1;
4963 psd_scan->ant_det_try_count = ant_det_count;
4967 board_info->btdm_ant_det_finish = false;
4968 psd_scan->ant_det_result = 6;
4970 else if (coex_sta->num_of_profile >= 1)
4972 board_info->btdm_ant_det_finish = false;
4973 psd_scan->ant_det_result = 7;
4975 else if (!psd_scan->ant_det_is_ant_det_available)
4977 board_info->btdm_ant_det_finish = false;
4978 psd_scan->ant_det_result = 9;
4980 else if (coex_sta->c2h_bt_inquiry_page)
4982 board_info->btdm_ant_det_finish = false;
4983 psd_scan->ant_det_result = 10;
4990 if (!board_info->btdm_ant_det_finish)
4991 ant_det_fail_count++;
4993 psd_scan->ant_det_fail_count = ant_det_fail_count;
4999 void ex_halbtc8723b1ant_display_ant_detection(IN struct btc_coexist *btcoexist)
5001 #if BT_8723B_1ANT_ANTDET_ENABLE
5002 struct btc_board_info *board_info = &btcoexist->board_info;
5004 if (psd_scan->ant_det_try_count != 0) {
5005 halbtc8723b1ant_psd_show_antenna_detect_result(btcoexist);
5007 if (board_info->btdm_ant_det_finish)
5008 halbtc8723b1ant_psd_showdata(btcoexist);
5013 /* halbtc8723b1ant_show_psd_data(btcoexist); */
5018 #endif /* #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) */