1 /***************************************************************
4 * This file is for RTL8723B Co-exist mechanism
7 * 2012/11/15 Cosa first check in.
9 ***************************************************************/
12 /***************************************************************
14 ***************************************************************/
15 #include "halbt_precomp.h"
17 /***************************************************************
18 * Global variables, these are static variables
19 ***************************************************************/
20 static struct coex_dm_8723b_1ant glcoex_dm_8723b_1ant;
21 static struct coex_dm_8723b_1ant *coex_dm = &glcoex_dm_8723b_1ant;
22 static struct coex_sta_8723b_1ant glcoex_sta_8723b_1ant;
23 static struct coex_sta_8723b_1ant *coex_sta = &glcoex_sta_8723b_1ant;
25 const char *const GLBtInfoSrc8723b1Ant[]={
28 "BT Info[bt auto report]",
31 u32 glcoex_ver_date_8723b_1ant = 20130906;
32 u32 glcoex_ver_8723b_1ant = 0x45;
34 /***************************************************************
35 * local function proto type if needed
36 ***************************************************************/
37 /***************************************************************
38 * local function start with halbtc8723b1ant_
39 ***************************************************************/
40 u8 halbtc8723b1ant_bt_rssi_state(u8 level_num, u8 rssi_thresh, u8 rssi_thresh1)
43 u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;
45 bt_rssi = coex_sta->bt_rssi;
48 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
49 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
50 if (bt_rssi >= rssi_thresh +
51 BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT) {
52 bt_rssi_state = BTC_RSSI_STATE_HIGH;
53 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
54 "[BTCoex], BT Rssi state "
57 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
58 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
59 "[BTCoex], BT Rssi state "
63 if (bt_rssi < rssi_thresh) {
64 bt_rssi_state = BTC_RSSI_STATE_LOW;
65 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
66 "[BTCoex], BT Rssi state "
69 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
70 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
71 "[BTCoex], BT Rssi state "
75 } else if (level_num == 3) {
76 if (rssi_thresh > rssi_thresh1) {
77 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
78 "[BTCoex], BT Rssi thresh error!!\n");
79 return coex_sta->pre_bt_rssi_state;
82 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
83 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
84 if (bt_rssi >= rssi_thresh +
85 BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT) {
86 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
87 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
88 "[BTCoex], BT Rssi state "
89 "switch to Medium\n");
91 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
92 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
93 "[BTCoex], BT Rssi state "
96 } else if ((coex_sta->pre_bt_rssi_state ==
97 BTC_RSSI_STATE_MEDIUM) ||
98 (coex_sta->pre_bt_rssi_state ==
99 BTC_RSSI_STATE_STAY_MEDIUM)) {
100 if (bt_rssi >= rssi_thresh1 +
101 BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT) {
102 bt_rssi_state = BTC_RSSI_STATE_HIGH;
103 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
104 "[BTCoex], BT Rssi state "
106 } else if (bt_rssi < rssi_thresh) {
107 bt_rssi_state = BTC_RSSI_STATE_LOW;
108 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
109 "[BTCoex], BT Rssi state "
112 bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
113 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
114 "[BTCoex], BT Rssi state "
118 if (bt_rssi < rssi_thresh1) {
119 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
120 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
121 "[BTCoex], BT Rssi state "
122 "switch to Medium\n");
124 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
125 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
126 "[BTCoex], BT Rssi state "
132 coex_sta->pre_bt_rssi_state = bt_rssi_state;
134 return bt_rssi_state;
137 u8 halbtc8723b1ant_wifi_rssi_state(struct btc_coexist *btcoexist,
138 u8 index, u8 level_num,
139 u8 rssi_thresh, u8 rssi_thresh1)
142 u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
144 btcoexist->btc_get(btcoexist,
145 BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
147 if (level_num == 2) {
148 if ((coex_sta->pre_wifi_rssi_state[index] ==
149 BTC_RSSI_STATE_LOW) ||
150 (coex_sta->pre_wifi_rssi_state[index] ==
151 BTC_RSSI_STATE_STAY_LOW)) {
152 if (wifi_rssi >= rssi_thresh +
153 BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT) {
154 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
155 BTC_PRINT(BTC_MSG_ALGORITHM,
156 ALGO_WIFI_RSSI_STATE,
157 "[BTCoex], wifi RSSI state "
160 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
161 BTC_PRINT(BTC_MSG_ALGORITHM,
162 ALGO_WIFI_RSSI_STATE,
163 "[BTCoex], wifi RSSI state "
167 if (wifi_rssi < rssi_thresh) {
168 wifi_rssi_state = BTC_RSSI_STATE_LOW;
169 BTC_PRINT(BTC_MSG_ALGORITHM,
170 ALGO_WIFI_RSSI_STATE,
171 "[BTCoex], wifi RSSI state "
174 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
175 BTC_PRINT(BTC_MSG_ALGORITHM,
176 ALGO_WIFI_RSSI_STATE,
177 "[BTCoex], wifi RSSI state "
181 } else if (level_num == 3) {
182 if (rssi_thresh > rssi_thresh1) {
183 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE,
184 "[BTCoex], wifi RSSI thresh error!!\n");
185 return coex_sta->pre_wifi_rssi_state[index];
188 if ((coex_sta->pre_wifi_rssi_state[index] ==
189 BTC_RSSI_STATE_LOW) ||
190 (coex_sta->pre_wifi_rssi_state[index] ==
191 BTC_RSSI_STATE_STAY_LOW)) {
192 if (wifi_rssi >= rssi_thresh +
193 BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT) {
194 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
195 BTC_PRINT(BTC_MSG_ALGORITHM,
196 ALGO_WIFI_RSSI_STATE,
197 "[BTCoex], wifi RSSI state "
198 "switch to Medium\n");
200 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
201 BTC_PRINT(BTC_MSG_ALGORITHM,
202 ALGO_WIFI_RSSI_STATE,
203 "[BTCoex], wifi RSSI state "
206 } else if ((coex_sta->pre_wifi_rssi_state[index] ==
207 BTC_RSSI_STATE_MEDIUM) ||
208 (coex_sta->pre_wifi_rssi_state[index] ==
209 BTC_RSSI_STATE_STAY_MEDIUM)) {
210 if (wifi_rssi >= rssi_thresh1 +
211 BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT) {
212 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
213 BTC_PRINT(BTC_MSG_ALGORITHM,
214 ALGO_WIFI_RSSI_STATE,
215 "[BTCoex], wifi RSSI state "
217 } else if (wifi_rssi < rssi_thresh) {
218 wifi_rssi_state = BTC_RSSI_STATE_LOW;
219 BTC_PRINT(BTC_MSG_ALGORITHM,
220 ALGO_WIFI_RSSI_STATE,
221 "[BTCoex], wifi RSSI state "
224 wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
225 BTC_PRINT(BTC_MSG_ALGORITHM,
226 ALGO_WIFI_RSSI_STATE,
227 "[BTCoex], wifi RSSI state "
231 if (wifi_rssi < rssi_thresh1) {
232 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
233 BTC_PRINT(BTC_MSG_ALGORITHM,
234 ALGO_WIFI_RSSI_STATE,
235 "[BTCoex], wifi RSSI state "
236 "switch to Medium\n");
238 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
239 BTC_PRINT(BTC_MSG_ALGORITHM,
240 ALGO_WIFI_RSSI_STATE,
241 "[BTCoex], wifi RSSI state "
247 coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
249 return wifi_rssi_state;
252 void halbtc8723b1ant_updatera_mask(struct btc_coexist *btcoexist,
253 bool force_exec, u32 dis_rate_mask)
255 coex_dm->curra_mask = dis_rate_mask;
257 if (force_exec || (coex_dm->prera_mask != coex_dm->curra_mask))
258 btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_ra_mask,
259 &coex_dm->curra_mask);
261 coex_dm->prera_mask = coex_dm->curra_mask;
264 void halbtc8723b1ant_auto_rate_fallback_retry(struct btc_coexist *btcoexist,
265 bool force_exec, u8 type)
267 bool wifi_under_bmode = false;
269 coex_dm->cur_arfr_type = type;
271 if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {
272 switch (coex_dm->cur_arfr_type) {
273 case 0: /* normal mode */
274 btcoexist->btc_write_4byte(btcoexist, 0x430,
275 coex_dm->backup_arfr_cnt1);
276 btcoexist->btc_write_4byte(btcoexist, 0x434,
277 coex_dm->backup_arfr_cnt2);
280 btcoexist->btc_get(btcoexist,
281 BTC_GET_BL_WIFI_UNDER_B_MODE,
283 if (wifi_under_bmode) {
284 btcoexist->btc_write_4byte(btcoexist,
286 btcoexist->btc_write_4byte(btcoexist,
289 btcoexist->btc_write_4byte(btcoexist,
291 btcoexist->btc_write_4byte(btcoexist,
300 coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;
303 void halbtc8723b1ant_retry_limit(struct btc_coexist *btcoexist,
304 bool force_exec, u8 type)
306 coex_dm->cur_retry_limit_type = type;
308 if (force_exec || (coex_dm->pre_retry_limit_type !=
309 coex_dm->cur_retry_limit_type)) {
311 switch (coex_dm->cur_retry_limit_type) {
312 case 0: /* normal mode */
313 btcoexist->btc_write_2byte(btcoexist, 0x42a,
314 coex_dm->backup_retry_limit);
316 case 1: /* retry limit=8 */
317 btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);
324 coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;
327 void halbtc8723b1ant_ampdu_maxtime(struct btc_coexist *btcoexist,
328 bool force_exec, u8 type)
330 coex_dm->cur_ampdu_time_type = type;
332 if (force_exec || (coex_dm->pre_ampdu_time_type !=
333 coex_dm->cur_ampdu_time_type)) {
334 switch (coex_dm->cur_ampdu_time_type) {
335 case 0: /* normal mode */
336 btcoexist->btc_write_1byte(btcoexist, 0x456,
337 coex_dm->backup_ampdu_max_time);
339 case 1: /* AMPDU timw = 0x38 * 32us */
340 btcoexist->btc_write_1byte(btcoexist,
348 coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;
351 void halbtc8723b1ant_limited_tx(struct btc_coexist *btcoexist,
352 bool force_exec, u8 ra_maskType, u8 arfr_type,
353 u8 retry_limit_type, u8 ampdu_time_type)
355 switch (ra_maskType) {
356 case 0: /* normal mode */
357 halbtc8723b1ant_updatera_mask(btcoexist, force_exec, 0x0);
359 case 1: /* disable cck 1/2 */
360 halbtc8723b1ant_updatera_mask(btcoexist, force_exec,
363 /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4*/
365 halbtc8723b1ant_updatera_mask(btcoexist, force_exec,
372 halbtc8723b1ant_auto_rate_fallback_retry(btcoexist, force_exec,
374 halbtc8723b1ant_retry_limit(btcoexist, force_exec, retry_limit_type);
375 halbtc8723b1ant_ampdu_maxtime(btcoexist, force_exec, ampdu_time_type);
378 void halbtc8723b1ant_limited_rx(struct btc_coexist *btcoexist,
379 bool force_exec, bool rej_ap_agg_pkt,
380 bool b_bt_ctrl_agg_buf_size, u8 agg_buf_size)
382 bool reject_rx_agg = rej_ap_agg_pkt;
383 bool bt_ctrl_rx_agg_size = b_bt_ctrl_agg_buf_size;
384 u8 rxAggSize = agg_buf_size;
386 /**********************************************
387 * Rx Aggregation related setting
388 **********************************************/
389 btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
391 /* decide BT control aggregation buf size or not */
392 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
393 &bt_ctrl_rx_agg_size);
394 /* aggregation buf size, only work
395 *when BT control Rx aggregation size. */
396 btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);
397 /* real update aggregation setting */
398 btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
401 void halbtc8723b1ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
403 u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
404 u32 reg_hp_tx = 0, reg_hp_rx = 0;
405 u32 reg_lp_tx = 0, reg_lp_rx = 0;
410 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
411 reg_hp_tx = u32tmp & MASKLWORD;
412 reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
414 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
415 reg_lp_tx = u32tmp & MASKLWORD;
416 reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
418 coex_sta->high_priority_tx = reg_hp_tx;
419 coex_sta->high_priority_rx = reg_hp_rx;
420 coex_sta->low_priority_tx = reg_lp_tx;
421 coex_sta->low_priority_rx = reg_lp_rx;
424 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
427 void halbtc8723b1ant_query_bt_info(struct btc_coexist *btcoexist)
429 u8 h2c_parameter[1] = {0};
431 coex_sta->c2h_bt_info_req_sent = true;
433 h2c_parameter[0] |= BIT0; /* trigger*/
435 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
436 "[BTCoex], Query Bt Info, FW write 0x61=0x%x\n",
439 btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
442 bool halbtc8723b1ant_is_wifi_status_changed(struct btc_coexist *btcoexist)
444 static bool pre_wifi_busy = false;
445 static bool pre_under_4way = false, pre_bt_hs_on = false;
446 bool wifi_busy = false, under_4way = false, bt_hs_on = false;
447 bool wifi_connected = false;
449 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
451 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
452 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
453 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
456 if (wifi_connected) {
457 if (wifi_busy != pre_wifi_busy) {
458 pre_wifi_busy = wifi_busy;
461 if (under_4way != pre_under_4way) {
462 pre_under_4way = under_4way;
465 if (bt_hs_on != pre_bt_hs_on) {
466 pre_bt_hs_on = bt_hs_on;
474 void halbtc8723b1ant_update_bt_link_info(struct btc_coexist *btcoexist)
476 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
477 bool bt_hs_on = false;
479 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
481 bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
482 bt_link_info->sco_exist = coex_sta->sco_exist;
483 bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
484 bt_link_info->pan_exist = coex_sta->pan_exist;
485 bt_link_info->hid_exist = coex_sta->hid_exist;
487 /* work around for HS mode. */
489 bt_link_info->pan_exist = true;
490 bt_link_info->bt_link_exist = true;
493 /* check if Sco only */
494 if (bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
495 !bt_link_info->pan_exist && !bt_link_info->hid_exist)
496 bt_link_info->sco_only = true;
498 bt_link_info->sco_only = false;
500 /* check if A2dp only */
501 if (!bt_link_info->sco_exist && bt_link_info->a2dp_exist &&
502 !bt_link_info->pan_exist && !bt_link_info->hid_exist)
503 bt_link_info->a2dp_only = true;
505 bt_link_info->a2dp_only = false;
507 /* check if Pan only */
508 if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
509 bt_link_info->pan_exist && !bt_link_info->hid_exist)
510 bt_link_info->pan_only = true;
512 bt_link_info->pan_only = false;
514 /* check if Hid only */
515 if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
516 !bt_link_info->pan_exist && bt_link_info->hid_exist )
517 bt_link_info->hid_only = true;
519 bt_link_info->hid_only = false;
522 u8 halbtc8723b1ant_action_algorithm(struct btc_coexist *btcoexist)
524 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
525 bool bt_hs_on = false;
526 u8 algorithm = BT_8723B_1ANT_COEX_ALGO_UNDEFINED;
527 u8 numOfDiffProfile = 0;
529 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
531 if (!bt_link_info->bt_link_exist) {
532 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
533 "[BTCoex], No BT link exists!!!\n");
537 if (bt_link_info->sco_exist)
539 if (bt_link_info->hid_exist)
541 if (bt_link_info->pan_exist)
543 if (bt_link_info->a2dp_exist)
546 if (numOfDiffProfile == 1) {
547 if (bt_link_info->sco_exist) {
548 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
549 "[BTCoex], BT Profile = SCO only\n");
550 algorithm = BT_8723B_1ANT_COEX_ALGO_SCO;
552 if (bt_link_info->hid_exist) {
553 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
554 "[BTCoex], BT Profile = HID only\n");
555 algorithm = BT_8723B_1ANT_COEX_ALGO_HID;
556 } else if (bt_link_info->a2dp_exist) {
557 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
558 "[BTCoex], BT Profile = A2DP only\n");
559 algorithm = BT_8723B_1ANT_COEX_ALGO_A2DP;
560 } else if (bt_link_info->pan_exist) {
562 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
563 "[BTCoex], BT Profile = "
566 BT_8723B_1ANT_COEX_ALGO_PANHS;
568 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
569 "[BTCoex], BT Profile = "
572 BT_8723B_1ANT_COEX_ALGO_PANEDR;
576 } else if (numOfDiffProfile == 2) {
577 if (bt_link_info->sco_exist) {
578 if (bt_link_info->hid_exist) {
579 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
580 "[BTCoex], BT Profile = SCO + HID\n");
581 algorithm = BT_8723B_1ANT_COEX_ALGO_HID;
582 } else if (bt_link_info->a2dp_exist) {
583 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
584 "[BTCoex], BT Profile = "
585 "SCO + A2DP ==> SCO\n");
586 algorithm = BT_8723B_1ANT_COEX_ALGO_SCO;
587 } else if (bt_link_info->pan_exist) {
589 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
590 "[BTCoex], BT Profile "
591 "= SCO + PAN(HS)\n");
592 algorithm = BT_8723B_1ANT_COEX_ALGO_SCO;
594 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
595 "[BTCoex], BT Profile "
596 "= SCO + PAN(EDR)\n");
598 BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;
602 if (bt_link_info->hid_exist &&
603 bt_link_info->a2dp_exist) {
604 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
605 "[BTCoex], BT Profile = "
607 algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP;
608 } else if (bt_link_info->hid_exist &&
609 bt_link_info->pan_exist) {
611 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
612 "[BTCoex], BT Profile = "
615 BT_8723B_1ANT_COEX_ALGO_HID_A2DP;
617 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
618 "[BTCoex], BT Profile = "
621 BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;
623 } else if (bt_link_info->pan_exist &&
624 bt_link_info->a2dp_exist) {
626 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
627 "[BTCoex], BT Profile = "
630 BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS;
632 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
633 "[BTCoex], BT Profile = "
634 "A2DP + PAN(EDR)\n");
636 BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP;
640 } else if (numOfDiffProfile == 3) {
641 if (bt_link_info->sco_exist) {
642 if (bt_link_info->hid_exist &&
643 bt_link_info->a2dp_exist) {
644 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
645 "[BTCoex], BT Profile = "
646 "SCO + HID + A2DP ==> HID\n");
647 algorithm = BT_8723B_1ANT_COEX_ALGO_HID;
648 } else if (bt_link_info->hid_exist &&
649 bt_link_info->pan_exist) {
651 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
652 "[BTCoex], BT Profile = "
653 "SCO + HID + PAN(HS)\n");
655 BT_8723B_1ANT_COEX_ALGO_HID_A2DP;
657 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
658 "[BTCoex], BT Profile = "
659 "SCO + HID + PAN(EDR)\n");
661 BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;
663 } else if (bt_link_info->pan_exist &&
664 bt_link_info->a2dp_exist) {
666 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
667 "[BTCoex], BT Profile = "
668 "SCO + A2DP + PAN(HS)\n");
669 algorithm = BT_8723B_1ANT_COEX_ALGO_SCO;
671 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
672 "[BTCoex], BT Profile = SCO + "
673 "A2DP + PAN(EDR) ==> HID\n");
675 BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;
679 if (bt_link_info->hid_exist &&
680 bt_link_info->pan_exist &&
681 bt_link_info->a2dp_exist) {
683 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
684 "[BTCoex], BT Profile = "
685 "HID + A2DP + PAN(HS)\n");
687 BT_8723B_1ANT_COEX_ALGO_HID_A2DP;
689 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
690 "[BTCoex], BT Profile = "
691 "HID + A2DP + PAN(EDR)\n");
693 BT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR;
697 } else if (numOfDiffProfile >= 3) {
698 if (bt_link_info->sco_exist) {
699 if (bt_link_info->hid_exist &&
700 bt_link_info->pan_exist &&
701 bt_link_info->a2dp_exist) {
703 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
704 "[BTCoex], Error!!! "
705 "BT Profile = SCO + "
706 "HID + A2DP + PAN(HS)\n");
708 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
709 "[BTCoex], BT Profile = "
710 "SCO + HID + A2DP + PAN(EDR)"
711 "==>PAN(EDR)+HID\n");
713 BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;
722 bool halbtc8723b1ant_need_to_dec_bt_pwr(struct btc_coexist *btcoexist)
725 bool bt_hs_on = false, wifi_connected = false;
729 if (!btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on))
731 if (!btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
734 if (!btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi))
737 bt_rssi_state = halbtc8723b1ant_bt_rssi_state(2, 35, 0);
739 if (wifi_connected) {
744 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
745 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
753 void halbtc8723b1ant_set_fw_dac_swing_level(struct btc_coexist *btcoexist,
756 u8 h2c_parameter[1] = {0};
758 /* There are several type of dacswing
759 * 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 */
760 h2c_parameter[0] = dac_swing_lvl;
762 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
763 "[BTCoex], Set Dac Swing Level=0x%x\n", dac_swing_lvl);
764 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
765 "[BTCoex], FW write 0x64=0x%x\n", h2c_parameter[0]);
767 btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);
770 void halbtc8723b1ant_set_fw_dec_bt_pwr(struct btc_coexist *btcoexist,
773 u8 h2c_parameter[1] = {0};
775 h2c_parameter[0] = 0;
778 h2c_parameter[0] |= BIT1;
780 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
781 "[BTCoex], decrease Bt Power : %s, FW write 0x62=0x%x\n",
782 (dec_bt_pwr? "Yes!!":"No!!"),h2c_parameter[0]);
784 btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter);
787 void halbtc8723b1ant_dec_bt_pwr(struct btc_coexist *btcoexist,
788 bool force_exec, bool dec_bt_pwr)
791 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
792 "[BTCoex], %s Dec BT power = %s\n",
793 (force_exec ? "force to" : ""), (dec_bt_pwr ? "ON" : "OFF"));
794 coex_dm->cur_dec_bt_pwr = dec_bt_pwr;
797 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
798 "[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n",
799 coex_dm->pre_dec_bt_pwr, coex_dm->cur_dec_bt_pwr);
801 if (coex_dm->pre_dec_bt_pwr == coex_dm->cur_dec_bt_pwr)
804 halbtc8723b1ant_set_fw_dec_bt_pwr(btcoexist, coex_dm->cur_dec_bt_pwr);
806 coex_dm->pre_dec_bt_pwr = coex_dm->cur_dec_bt_pwr;
809 void halbtc8723b1ant_set_bt_auto_report(struct btc_coexist *btcoexist,
810 bool enable_auto_report)
812 u8 h2c_parameter[1] = {0};
814 h2c_parameter[0] = 0;
816 if (enable_auto_report)
817 h2c_parameter[0] |= BIT0;
819 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
820 "[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n",
821 (enable_auto_report? "Enabled!!":"Disabled!!"),
824 btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
827 void halbtc8723b1ant_bt_auto_report(struct btc_coexist *btcoexist,
828 bool force_exec, bool enable_auto_report)
830 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
831 "[BTCoex], %s BT Auto report = %s\n",
832 (force_exec? "force to":""),
833 ((enable_auto_report)? "Enabled":"Disabled"));
834 coex_dm->cur_bt_auto_report = enable_auto_report;
837 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
838 "[BTCoex], bPreBtAutoReport=%d, "
839 "bCurBtAutoReport=%d\n",
840 coex_dm->pre_bt_auto_report,
841 coex_dm->cur_bt_auto_report);
843 if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
846 halbtc8723b1ant_set_bt_auto_report(btcoexist,
847 coex_dm->cur_bt_auto_report);
849 coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
852 void halbtc8723b1ant_fw_dac_swing_lvl(struct btc_coexist *btcoexist,
853 bool force_exec, u8 fw_dac_swing_lvl)
856 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
857 "[BTCoex], %s set FW Dac Swing level = %d\n",
858 (force_exec? "force to":""), fw_dac_swing_lvl);
859 coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl;
862 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
863 "[BTCoex], preFwDacSwingLvl=%d, "
864 "curFwDacSwingLvl=%d\n",
865 coex_dm->pre_fw_dac_swing_lvl,
866 coex_dm->cur_fw_dac_swing_lvl);
868 if (coex_dm->pre_fw_dac_swing_lvl ==
869 coex_dm->cur_fw_dac_swing_lvl)
873 halbtc8723b1ant_set_fw_dac_swing_level(btcoexist,
874 coex_dm->cur_fw_dac_swing_lvl);
876 coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;
879 void halbtc8723b1ant_set_sw_rf_rx_lpf_corner(struct btc_coexist *btcoexist,
880 bool rx_rf_shrink_on)
882 if (rx_rf_shrink_on) {
883 /*Shrink RF Rx LPF corner */
884 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
885 "[BTCoex], Shrink RF Rx LPF corner!!\n");
886 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
889 /*Resume RF Rx LPF corner
890 * After initialized, we can use coex_dm->btRf0x1eBackup */
891 if (btcoexist->initilized) {
892 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
893 "[BTCoex], Resume RF Rx LPF corner!!\n");
894 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A,
896 coex_dm->bt_rf0x1e_backup);
901 void halbtc8723b1ant_rf_shrink(struct btc_coexist *btcoexist,
902 bool force_exec, bool rx_rf_shrink_on)
904 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW,
905 "[BTCoex], %s turn Rx RF Shrink = %s\n",
906 (force_exec? "force to":""),
907 ((rx_rf_shrink_on)? "ON":"OFF"));
908 coex_dm->cur_rf_rx_lpf_shrink = rx_rf_shrink_on;
911 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL,
912 "[BTCoex], bPreRfRxLpfShrink=%d, "
913 "bCurRfRxLpfShrink=%d\n",
914 coex_dm->pre_rf_rx_lpf_shrink,
915 coex_dm->cur_rf_rx_lpf_shrink);
917 if (coex_dm->pre_rf_rx_lpf_shrink ==
918 coex_dm->cur_rf_rx_lpf_shrink)
921 halbtc8723b1ant_set_sw_rf_rx_lpf_corner(btcoexist,
922 coex_dm->cur_rf_rx_lpf_shrink);
924 coex_dm->pre_rf_rx_lpf_shrink = coex_dm->cur_rf_rx_lpf_shrink;
927 void halbtc8723b1ant_set_sw_penalty_tx_rate_adaptive(
928 struct btc_coexist *btcoexist,
931 u8 h2c_parameter[6] = {0};
933 h2c_parameter[0] = 0x6; /* opCode, 0x6= Retry_Penalty */
935 if (low_penalty_ra) {
936 h2c_parameter[1] |= BIT0;
937 /*normal rate except MCS7/6/5, OFDM54/48/36 */
938 h2c_parameter[2] = 0x00;
939 h2c_parameter[3] = 0xf7; /*MCS7 or OFDM54 */
940 h2c_parameter[4] = 0xf8; /*MCS6 or OFDM48 */
941 h2c_parameter[5] = 0xf9; /*MCS5 or OFDM36 */
944 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
945 "[BTCoex], set WiFi Low-Penalty Retry: %s",
946 (low_penalty_ra ? "ON!!" : "OFF!!"));
948 btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
951 void halbtc8723b1ant_low_penalty_ra(struct btc_coexist *btcoexist,
952 bool force_exec, bool low_penalty_ra)
954 coex_dm->cur_low_penalty_ra = low_penalty_ra;
957 if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
960 halbtc8723b1ant_set_sw_penalty_tx_rate_adaptive(btcoexist,
961 coex_dm->cur_low_penalty_ra);
963 coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
966 void halbtc8723b1ant_set_dac_swing_reg(struct btc_coexist *btcoexist, u32 level)
970 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
971 "[BTCoex], Write SwDacSwing = 0x%x\n", level);
972 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x883, 0x3e, val);
975 void halbtc8723b1ant_set_sw_full_time_dac_swing(struct btc_coexist *btcoexist,
976 bool sw_dac_swing_on,
977 u32 sw_dac_swing_lvl)
980 halbtc8723b1ant_set_dac_swing_reg(btcoexist, sw_dac_swing_lvl);
982 halbtc8723b1ant_set_dac_swing_reg(btcoexist, 0x18);
986 void halbtc8723b1ant_dac_swing(struct btc_coexist *btcoexist, bool force_exec,
987 bool dac_swing_on, u32 dac_swing_lvl)
989 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW,
990 "[BTCoex], %s turn DacSwing=%s, dac_swing_lvl=0x%x\n",
991 (force_exec ? "force to" : ""), (dac_swing_on ? "ON" : "OFF"),
994 coex_dm->cur_dac_swing_on = dac_swing_on;
995 coex_dm->cur_dac_swing_lvl = dac_swing_lvl;
998 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL,
999 "[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, "
1000 "bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n",
1001 coex_dm->pre_dac_swing_on, coex_dm->pre_dac_swing_lvl,
1002 coex_dm->cur_dac_swing_on,
1003 coex_dm->cur_dac_swing_lvl);
1005 if ((coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) &&
1006 (coex_dm->pre_dac_swing_lvl == coex_dm->cur_dac_swing_lvl))
1010 halbtc8723b1ant_set_sw_full_time_dac_swing(btcoexist, dac_swing_on,
1013 coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on;
1014 coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl;
1017 void halbtc8723b1ant_set_adc_backoff(struct btc_coexist *btcoexist,
1021 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
1022 "[BTCoex], BB BackOff Level On!\n");
1023 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x8db, 0x60, 0x3);
1025 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
1026 "[BTCoex], BB BackOff Level Off!\n");
1027 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x8db, 0x60, 0x1);
1031 void halbtc8723b1ant_adc_backoff(struct btc_coexist *btcoexist,
1032 bool force_exec, bool adc_backoff)
1034 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW,
1035 "[BTCoex], %s turn AdcBackOff = %s\n",
1036 (force_exec ? "force to" : ""), (adc_backoff ? "ON" : "OFF"));
1037 coex_dm->cur_adc_backoff = adc_backoff;
1040 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL,
1041 "[BTCoex], bPreAdcBackOff=%d, bCurAdcBackOff=%d\n",
1042 coex_dm->pre_adc_backoff, coex_dm->cur_adc_backoff);
1044 if(coex_dm->pre_adc_backoff == coex_dm->cur_adc_backoff)
1047 halbtc8723b1ant_set_adc_backoff(btcoexist, coex_dm->cur_adc_backoff);
1049 coex_dm->pre_adc_backoff =
1050 coex_dm->cur_adc_backoff;
1053 void halbtc8723b1ant_set_agc_table(struct btc_coexist *btcoexist,
1056 u8 rssi_adjust_val = 0;
1058 btcoexist->btc_set_rf_reg(btcoexist,
1059 BTC_RF_A, 0xef, 0xfffff, 0x02000);
1061 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
1062 "[BTCoex], Agc Table On!\n");
1063 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b,
1065 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b,
1067 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b,
1069 rssi_adjust_val = 8;
1071 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
1072 "[BTCoex], Agc Table Off!\n");
1073 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b,
1075 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b,
1077 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b,
1080 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);
1082 /* set rssi_adjust_val for wifi module. */
1083 btcoexist->btc_set(btcoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON,
1088 void halbtc8723b1ant_agc_table(struct btc_coexist *btcoexist,
1089 bool force_exec, bool adc_table_en)
1091 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW,
1092 "[BTCoex], %s %s Agc Table\n",
1093 (force_exec ? "force to" : ""),
1094 (adc_table_en ? "Enable" : "Disable"));
1095 coex_dm->cur_agc_table_en = adc_table_en;
1098 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL,
1099 "[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n",
1100 coex_dm->pre_agc_table_en,
1101 coex_dm->cur_agc_table_en);
1103 if(coex_dm->pre_agc_table_en == coex_dm->cur_agc_table_en)
1106 halbtc8723b1ant_set_agc_table(btcoexist, adc_table_en);
1108 coex_dm->pre_agc_table_en = coex_dm->cur_agc_table_en;
1111 void halbtc8723b1ant_set_coex_table(struct btc_coexist *btcoexist,
1112 u32 val0x6c0, u32 val0x6c4,
1113 u32 val0x6c8, u8 val0x6cc)
1115 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
1116 "[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0);
1117 btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
1119 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
1120 "[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4);
1121 btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
1123 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
1124 "[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8);
1125 btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
1127 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
1128 "[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc);
1129 btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
1132 void halbtc8723b1ant_coex_table(struct btc_coexist *btcoexist,
1133 bool force_exec, u32 val0x6c0,
1134 u32 val0x6c4, u32 val0x6c8,
1137 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW,
1138 "[BTCoex], %s write Coex Table 0x6c0=0x%x,"
1139 " 0x6c4=0x%x, 0x6cc=0x%x\n", (force_exec ? "force to" : ""),
1140 val0x6c0, val0x6c4, val0x6cc);
1141 coex_dm->cur_val0x6c0 = val0x6c0;
1142 coex_dm->cur_val0x6c4 = val0x6c4;
1143 coex_dm->cur_val0x6c8 = val0x6c8;
1144 coex_dm->cur_val0x6cc = val0x6cc;
1147 if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
1148 (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
1149 (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
1150 (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
1153 halbtc8723b1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,
1154 val0x6c8, val0x6cc);
1156 coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
1157 coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
1158 coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
1159 coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
1162 void halbtc8723b1ant_coex_table_with_type(struct btc_coexist *btcoexist,
1163 bool force_exec, u8 type)
1167 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
1168 0x55555555, 0xffffff, 0x3);
1171 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
1172 0x5a5a5a5a, 0xffffff, 0x3);
1175 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
1176 0x5a5a5a5a, 0xffffff, 0x3);
1179 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
1180 0xaaaaaaaa, 0xffffff, 0x3);
1183 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
1184 0x5aaa5aaa, 0xffffff, 0x3);
1187 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
1188 0xaaaa5a5a, 0xffffff, 0x3);
1191 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
1192 0xaaaa5a5a, 0xffffff, 0x3);
1195 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5afa5afa,
1196 0x5afa5afa, 0xffffff, 0x3);
1203 void halbtc8723b1ant_SetFwIgnoreWlanAct(struct btc_coexist *btcoexist,
1206 u8 h2c_parameter[1] = {0};
1209 h2c_parameter[0] |= BIT0; /* function enable */
1211 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
1212 "[BTCoex], set FW for BT Ignore Wlan_Act,"
1213 " FW write 0x63=0x%x\n", h2c_parameter[0]);
1215 btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
1218 void halbtc8723b1ant_ignore_wlan_act(struct btc_coexist *btcoexist,
1219 bool force_exec, bool enable)
1221 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
1222 "[BTCoex], %s turn Ignore WlanAct %s\n",
1223 (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
1224 coex_dm->cur_ignore_wlan_act = enable;
1227 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
1228 "[BTCoex], bPreIgnoreWlanAct = %d, "
1229 "bCurIgnoreWlanAct = %d!!\n",
1230 coex_dm->pre_ignore_wlan_act,
1231 coex_dm->cur_ignore_wlan_act);
1233 if (coex_dm->pre_ignore_wlan_act ==
1234 coex_dm->cur_ignore_wlan_act)
1237 halbtc8723b1ant_SetFwIgnoreWlanAct(btcoexist, enable);
1239 coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
1242 void halbtc8723b1ant_set_fw_ps_tdma(struct btc_coexist *btcoexist,
1243 u8 byte1, u8 byte2, u8 byte3,
1246 u8 h2c_parameter[5] = {0};
1247 u8 real_byte1 = byte1, real_byte5 = byte5;
1248 bool ap_enable = false;
1250 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1254 if ((byte1 & BIT4) && !(byte1 & BIT5)) {
1255 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
1256 "[BTCoex], FW for 1Ant AP mode\n");
1257 real_byte1 &= ~BIT4;
1261 real_byte5 &= ~BIT6;
1265 h2c_parameter[0] = real_byte1;
1266 h2c_parameter[1] = byte2;
1267 h2c_parameter[2] = byte3;
1268 h2c_parameter[3] = byte4;
1269 h2c_parameter[4] = real_byte5;
1271 coex_dm->ps_tdma_para[0] = real_byte1;
1272 coex_dm->ps_tdma_para[1] = byte2;
1273 coex_dm->ps_tdma_para[2] = byte3;
1274 coex_dm->ps_tdma_para[3] = byte4;
1275 coex_dm->ps_tdma_para[4] = real_byte5;
1277 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
1278 "[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n",
1280 h2c_parameter[1] << 24 |
1281 h2c_parameter[2] << 16 |
1282 h2c_parameter[3] << 8 |
1285 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1288 void halbtc8723b1ant_SetLpsRpwm(struct btc_coexist *btcoexist,
1289 u8 lps_val, u8 rpwm_val)
1294 btcoexist->btc_set(btcoexist, BTC_SET_U1_1ANT_LPS, &lps);
1295 btcoexist->btc_set(btcoexist, BTC_SET_U1_1ANT_RPWM, &rpwm);
1298 void halbtc8723b1ant_LpsRpwm(struct btc_coexist *btcoexist, bool force_exec,
1299 u8 lps_val, u8 rpwm_val)
1302 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
1303 "[BTCoex], %s set lps/rpwm=0x%x/0x%x \n",
1304 (force_exec ? "force to" : ""), lps_val, rpwm_val);
1305 coex_dm->cur_lps = lps_val;
1306 coex_dm->cur_rpwm = rpwm_val;
1309 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
1310 "[BTCoex], LPS-RxBeaconMode=0x%x , LPS-RPWM=0x%x!!\n",
1311 coex_dm->cur_lps, coex_dm->cur_rpwm);
1313 if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
1314 (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) {
1315 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
1316 "[BTCoex], LPS-RPWM_Last=0x%x"
1317 " , LPS-RPWM_Now=0x%x!!\n",
1318 coex_dm->pre_rpwm, coex_dm->cur_rpwm);
1323 halbtc8723b1ant_SetLpsRpwm(btcoexist, lps_val, rpwm_val);
1325 coex_dm->pre_lps = coex_dm->cur_lps;
1326 coex_dm->pre_rpwm = coex_dm->cur_rpwm;
1329 void halbtc8723b1ant_sw_mechanism1(struct btc_coexist *btcoexist,
1330 bool shrink_rx_lpf, bool low_penalty_ra,
1331 bool limited_dig, bool bt_lna_constrain)
1333 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
1334 "[BTCoex], SM1[ShRf/ LpRA/ LimDig/ btLna] = %d %d %d %d\n",
1335 shrink_rx_lpf, low_penalty_ra, limited_dig, bt_lna_constrain);
1337 halbtc8723b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
1340 void halbtc8723b1ant_sw_mechanism2(struct btc_coexist *btcoexist,
1341 bool agc_table_shift, bool adc_backoff,
1342 bool sw_dac_swing, u32 dac_swing_lvl)
1344 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
1345 "[BTCoex], SM2[AgcT/ AdcB/ SwDacSwing(lvl)] = %d %d %d\n",
1346 agc_table_shift, adc_backoff, sw_dac_swing);
1349 void halbtc8723b1ant_SetAntPath(struct btc_coexist *btcoexist,
1350 u8 ant_pos_type, bool init_hw_cfg,
1353 struct btc_board_info *board_info = &btcoexist->board_info;
1354 u32 fw_ver = 0, u32tmp = 0;
1355 bool pg_ext_switch = false;
1356 bool use_ext_switch = false;
1357 u8 h2c_parameter[2] = {0};
1359 btcoexist->btc_get(btcoexist, BTC_GET_BL_EXT_SWITCH, &pg_ext_switch);
1360 /* [31:16]=fw ver, [15:0]=fw sub ver */
1361 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
1364 if ((fw_ver < 0xc0000) || pg_ext_switch)
1365 use_ext_switch = true;
1368 /*BT select s0/s1 is controlled by WiFi */
1369 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x1);
1371 /*Force GNT_BT to Normal */
1372 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x0);
1373 } else if (wifi_off) {
1374 /*Force GNT_BT to High */
1375 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x3);
1376 /*BT select s0/s1 is controlled by BT */
1377 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x0);
1379 /* 0x4c[24:23]=00, Set Antenna control by BT_RFE_CTRL
1380 * BT Vendor 0xac=0xf002 */
1381 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
1384 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
1387 if (use_ext_switch) {
1389 /* 0x4c[23]=0, 0x4c[24]=1 Antenna control by WL/BT */
1390 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
1393 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
1395 if (board_info->btdm_ant_pos ==
1396 BTC_ANTENNA_AT_MAIN_PORT) {
1397 /* Main Ant to BT for IPS case 0x4c[23]=1 */
1398 btcoexist->btc_write_1byte_bitmask(btcoexist,
1402 /*tell firmware "no antenna inverse"*/
1403 h2c_parameter[0] = 0;
1404 h2c_parameter[1] = 1; /*ext switch type*/
1405 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
1408 /*Aux Ant to BT for IPS case 0x4c[23]=1 */
1409 btcoexist->btc_write_1byte_bitmask(btcoexist,
1413 /*tell firmware "antenna inverse"*/
1414 h2c_parameter[0] = 1;
1415 h2c_parameter[1] = 1; /*ext switch type*/
1416 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
1421 /* fixed internal switch first*/
1422 /* fixed internal switch S1->WiFi, S0->BT*/
1423 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
1424 btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
1425 else/* fixed internal switch S0->WiFi, S1->BT*/
1426 btcoexist->btc_write_2byte(btcoexist, 0x948, 0x280);
1428 /* ext switch setting */
1429 switch (ant_pos_type) {
1430 case BTC_ANT_PATH_WIFI:
1431 if (board_info->btdm_ant_pos ==
1432 BTC_ANTENNA_AT_MAIN_PORT)
1433 btcoexist->btc_write_1byte_bitmask(btcoexist,
1437 btcoexist->btc_write_1byte_bitmask(btcoexist,
1441 case BTC_ANT_PATH_BT:
1442 if (board_info->btdm_ant_pos ==
1443 BTC_ANTENNA_AT_MAIN_PORT)
1444 btcoexist->btc_write_1byte_bitmask(btcoexist,
1448 btcoexist->btc_write_1byte_bitmask(btcoexist,
1453 case BTC_ANT_PATH_PTA:
1454 if (board_info->btdm_ant_pos ==
1455 BTC_ANTENNA_AT_MAIN_PORT)
1456 btcoexist->btc_write_1byte_bitmask(btcoexist,
1460 btcoexist->btc_write_1byte_bitmask(btcoexist,
1468 /* 0x4c[23]=1, 0x4c[24]=0 Antenna control by 0x64*/
1469 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
1472 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
1474 if (board_info->btdm_ant_pos ==
1475 BTC_ANTENNA_AT_MAIN_PORT) {
1476 /*Main Ant to WiFi for IPS case 0x4c[23]=1*/
1477 btcoexist->btc_write_1byte_bitmask(btcoexist,
1481 /*tell firmware "no antenna inverse"*/
1482 h2c_parameter[0] = 0;
1483 h2c_parameter[1] = 0; /*internal switch type*/
1484 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
1487 /*Aux Ant to BT for IPS case 0x4c[23]=1*/
1488 btcoexist->btc_write_1byte_bitmask(btcoexist,
1492 /*tell firmware "antenna inverse"*/
1493 h2c_parameter[0] = 1;
1494 h2c_parameter[1] = 0; /*internal switch type*/
1495 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
1500 /* fixed external switch first*/
1501 /*Main->WiFi, Aux->BT*/
1502 if(board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
1503 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x92c,
1505 else/*Main->BT, Aux->WiFi */
1506 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x92c,
1509 /* internal switch setting*/
1510 switch (ant_pos_type) {
1511 case BTC_ANT_PATH_WIFI:
1512 if(board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
1513 btcoexist->btc_write_2byte(btcoexist, 0x948,
1516 btcoexist->btc_write_2byte(btcoexist, 0x948,
1519 case BTC_ANT_PATH_BT:
1520 if(board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
1521 btcoexist->btc_write_2byte(btcoexist, 0x948,
1524 btcoexist->btc_write_2byte(btcoexist, 0x948,
1528 case BTC_ANT_PATH_PTA:
1529 if(board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
1530 btcoexist->btc_write_2byte(btcoexist, 0x948,
1533 btcoexist->btc_write_2byte(btcoexist, 0x948,
1540 void halbtc8723b1ant_ps_tdma(struct btc_coexist *btcoexist, bool force_exec,
1541 bool turn_on, u8 type)
1543 bool wifi_busy = false;
1544 u8 rssi_adjust_val = 0;
1546 coex_dm->cur_ps_tdma_on = turn_on;
1547 coex_dm->cur_ps_tdma = type;
1549 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1552 if (coex_dm->cur_ps_tdma_on)
1553 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
1554 "[BTCoex], ******** TDMA(on, %d) *********\n",
1555 coex_dm->cur_ps_tdma);
1557 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
1558 "[BTCoex], ******** TDMA(off, %d) ********\n",
1559 coex_dm->cur_ps_tdma);
1562 if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1563 (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1569 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1a,
1574 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51,
1578 halbtc8723b1ant_set_fw_ps_tdma(btcoexist,0x51,
1582 rssi_adjust_val = 11;
1586 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51,
1590 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51,
1593 rssi_adjust_val = 14;
1596 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1d,
1600 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1602 rssi_adjust_val = 17;
1605 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x15,
1609 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x20,
1613 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xc,
1617 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1622 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51,
1626 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51,
1629 rssi_adjust_val = 18;
1632 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1637 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51,
1641 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51,
1644 rssi_adjust_val = 20;
1647 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x0a,
1651 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x15,
1655 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x21,
1659 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1663 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1665 rssi_adjust_val = 18;
1668 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1670 rssi_adjust_val = 14;
1673 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x35,
1677 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x15,
1681 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,
1685 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1687 rssi_adjust_val = 22;
1690 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1692 rssi_adjust_val = 22;
1695 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1697 rssi_adjust_val = 22;
1700 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1702 rssi_adjust_val = 22;
1705 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1707 rssi_adjust_val = 22;
1710 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x69, 0x25,
1714 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xab, 0x1a,
1718 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x14,
1722 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1a,
1726 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0xa,
1730 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x25,
1734 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x53, 0x1a,
1738 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x63, 0x1a,
1742 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x12,
1745 /* SoftAP only with no sta associated,BT disable ,
1746 * TDMA mode for power saving
1747 * here softap mode screen off will cost 70-80mA for phone */
1749 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x23, 0x18,
1755 case 8: /*PTA Control */
1756 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x8, 0x0,
1758 halbtc8723b1ant_SetAntPath(btcoexist, BTC_ANT_PATH_PTA,
1762 default: /*Software control, Antenna at BT side */
1763 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0,
1765 halbtc8723b1ant_SetAntPath(btcoexist, BTC_ANT_PATH_BT,
1768 case 9: /*Software control, Antenna at WiFi side */
1769 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0,
1771 halbtc8723b1ant_SetAntPath(btcoexist, BTC_ANT_PATH_WIFI,
1776 rssi_adjust_val = 0;
1777 btcoexist->btc_set(btcoexist,
1778 BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE,
1781 /* update pre state */
1782 coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1783 coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1786 void halbtc8723b1ant_coex_alloff(struct btc_coexist *btcoexist)
1789 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1790 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
1793 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false, false, false);
1794 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1798 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1801 bool halbtc8723b1ant_is_common_action(struct btc_coexist *btcoexist)
1803 bool commom = false, wifi_connected = false;
1804 bool wifi_busy = false;
1806 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1808 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1810 if (!wifi_connected &&
1811 BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == coex_dm->bt_status) {
1812 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1813 "[BTCoex], Wifi non connected-idle + "
1814 "BT non connected-idle!!\n");
1815 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1816 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
1818 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
1820 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
1824 } else if (wifi_connected &&
1825 (BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
1826 coex_dm->bt_status)) {
1827 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1828 "[BTCoex], Wifi connected + "
1829 "BT non connected-idle!!\n");
1830 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1831 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
1833 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
1835 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
1839 } else if (!wifi_connected &&
1840 (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE ==
1841 coex_dm->bt_status)) {
1842 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1843 "[BTCoex], Wifi non connected-idle + "
1844 "BT connected-idle!!\n");
1845 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1846 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
1848 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
1850 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
1854 } else if (wifi_connected &&
1855 (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE ==
1856 coex_dm->bt_status)) {
1857 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1858 "[BTCoex], Wifi connected + BT connected-idle!!\n");
1859 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1860 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
1862 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
1864 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
1868 } else if (!wifi_connected &&
1869 (BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE !=
1870 coex_dm->bt_status)) {
1871 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1872 ("[BTCoex], Wifi non connected-idle + BT Busy!!\n"));
1873 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1874 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
1876 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
1878 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
1884 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1885 "[BTCoex], Wifi Connected-Busy"
1888 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1889 "[BTCoex], Wifi Connected-Idle"
1899 void halbtc8723b1ant_tdma_duration_adjust_for_acl(struct btc_coexist *btcoexist,
1902 static s32 up, dn, m, n, wait_count;
1903 /* 0: no change, +1: increase WiFi duration,
1904 * -1: decrease WiFi duration */
1906 u8 retry_count = 0, bt_info_ext;
1907 static bool pre_wifi_busy = false;
1908 bool wifi_busy = false;
1910 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
1911 "[BTCoex], TdmaDurationAdjustForAcl()\n");
1913 if (BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY == wifi_status)
1918 if ((BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN ==
1920 (BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifi_status) ||
1921 (BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifi_status)) {
1922 if (coex_dm->cur_ps_tdma != 1 && coex_dm->cur_ps_tdma != 2 &&
1923 coex_dm->cur_ps_tdma != 3 && coex_dm->cur_ps_tdma != 9) {
1924 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1926 coex_dm->ps_tdma_du_adj_type = 9;
1938 if (!coex_dm->auto_tdma_adjust) {
1939 coex_dm->auto_tdma_adjust = true;
1940 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
1941 "[BTCoex], first run TdmaDurationAdjust()!!\n");
1943 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2);
1944 coex_dm->ps_tdma_du_adj_type = 2;
1953 /*accquire the BT TRx retry count from BT_Info byte2 */
1954 retry_count = coex_sta->bt_retry_cnt;
1955 bt_info_ext = coex_sta->bt_info_ext;
1958 /* no retry in the last 2-second duration */
1959 if (retry_count == 0) {
1972 BTC_PRINT(BTC_MSG_ALGORITHM,
1973 ALGO_TRACE_FW_DETAIL,
1974 "[BTCoex], Increase wifi "
1977 } else if (retry_count <= 3) {
1985 if (wait_count <= 2)
1998 BTC_PRINT(BTC_MSG_ALGORITHM,
1999 ALGO_TRACE_FW_DETAIL,
2000 "[BTCoex], Decrease wifi duration"
2001 " for retryCounter<3!!\n");
2004 if (wait_count == 1)
2017 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
2018 "[BTCoex], Decrease wifi duration"
2019 " for retryCounter>3!!\n");
2023 if ((BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(bt_info_ext)) &&
2024 ((coex_dm->cur_ps_tdma == 1) ||
2025 (coex_dm->cur_ps_tdma == 2))) {
2026 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2028 coex_dm->ps_tdma_du_adj_type = 9;
2029 } else if (coex_dm->cur_ps_tdma == 1) {
2030 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2032 coex_dm->ps_tdma_du_adj_type = 2;
2033 } else if (coex_dm->cur_ps_tdma == 2) {
2034 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2036 coex_dm->ps_tdma_du_adj_type = 9;
2037 } else if (coex_dm->cur_ps_tdma == 9) {
2038 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2040 coex_dm->ps_tdma_du_adj_type = 11;
2042 } else if(result == 1) {
2043 if ((BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(bt_info_ext)) &&
2044 ((coex_dm->cur_ps_tdma == 1) ||
2045 (coex_dm->cur_ps_tdma == 2))) {
2046 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2048 coex_dm->ps_tdma_du_adj_type = 9;
2049 } else if (coex_dm->cur_ps_tdma == 11) {
2050 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2052 coex_dm->ps_tdma_du_adj_type = 9;
2053 } else if (coex_dm->cur_ps_tdma == 9) {
2054 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2056 coex_dm->ps_tdma_du_adj_type = 2;
2057 } else if (coex_dm->cur_ps_tdma == 2) {
2058 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2060 coex_dm->ps_tdma_du_adj_type = 1;
2062 } else { /*no change */
2063 /*if busy / idle change */
2064 if (wifi_busy != pre_wifi_busy) {
2065 pre_wifi_busy = wifi_busy;
2066 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC,
2068 coex_dm->cur_ps_tdma);
2071 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
2072 "[BTCoex],********* TDMA(on, %d) ********\n",
2073 coex_dm->cur_ps_tdma);
2076 if (coex_dm->cur_ps_tdma != 1 && coex_dm->cur_ps_tdma != 2 &&
2077 coex_dm->cur_ps_tdma != 9 && coex_dm->cur_ps_tdma != 11) {
2078 /* recover to previous adjust type */
2079 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2080 coex_dm->ps_tdma_du_adj_type);
2085 u8 halbtc8723b1ant_ps_tdma_type_by_wifi_rssi(s32 wifi_rssi, s32 pre_wifi_rssi,
2086 u8 wifi_rssi_thresh)
2090 if (wifi_rssi > pre_wifi_rssi) {
2091 if (wifi_rssi > (wifi_rssi_thresh + 5))
2096 if (wifi_rssi > wifi_rssi_thresh)
2102 return ps_tdma_type;
2105 void halbtc8723b1ant_PsTdmaCheckForPowerSaveState(struct btc_coexist *btcoexist,
2110 btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
2112 if (lps_mode) { /* already under LPS state */
2114 /* keep state under LPS, do nothing. */
2116 /* will leave LPS state, turn off psTdma first */
2117 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2120 } else { /* NO PS state */
2122 /* will enter LPS state, turn off psTdma first */
2123 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2126 /* keep state under NO PS state, do nothing. */
2131 void halbtc8723b1ant_power_save_state(struct btc_coexist *btcoexist,
2132 u8 ps_type, u8 lps_val,
2135 bool low_pwr_disable = false;
2138 case BTC_PS_WIFI_NATIVE:
2139 /* recover to original 32k low power setting */
2140 low_pwr_disable = false;
2141 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
2143 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
2146 halbtc8723b1ant_PsTdmaCheckForPowerSaveState(btcoexist, true);
2147 halbtc8723b1ant_LpsRpwm(btcoexist, NORMAL_EXEC, lps_val,
2149 /* when coex force to enter LPS, do not enter 32k low power. */
2150 low_pwr_disable = true;
2151 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
2153 /* power save must executed before psTdma. */
2154 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
2156 case BTC_PS_LPS_OFF:
2157 halbtc8723b1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
2158 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
2165 void halbtc8723b1ant_action_wifi_only(struct btc_coexist *btcoexist)
2167 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2168 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 9);
2171 void halbtc8723b1ant_monitor_bt_enable_disable(struct btc_coexist *btcoexist)
2173 static bool pre_bt_disabled = false;
2174 static u32 bt_disable_cnt = 0;
2175 bool bt_active = true, bt_disabled = false;
2177 /* This function check if bt is disabled */
2179 if (coex_sta->high_priority_tx == 0 &&
2180 coex_sta->high_priority_rx == 0 &&
2181 coex_sta->low_priority_tx == 0 &&
2182 coex_sta->low_priority_rx == 0)
2185 if (coex_sta->high_priority_tx == 0xffff &&
2186 coex_sta->high_priority_rx == 0xffff &&
2187 coex_sta->low_priority_tx == 0xffff &&
2188 coex_sta->low_priority_rx == 0xffff)
2193 bt_disabled = false;
2194 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
2196 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
2197 "[BTCoex], BT is enabled !!\n");
2200 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
2201 "[BTCoex], bt all counters=0, %d times!!\n",
2203 if (bt_disable_cnt >= 2) {
2205 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
2207 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
2208 "[BTCoex], BT is disabled !!\n");
2209 halbtc8723b1ant_action_wifi_only(btcoexist);
2212 if (pre_bt_disabled != bt_disabled) {
2213 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
2214 "[BTCoex], BT is from %s to %s!!\n",
2215 (pre_bt_disabled ? "disabled" : "enabled"),
2216 (bt_disabled ? "disabled" : "enabled"));
2217 pre_bt_disabled = bt_disabled;
2220 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS,
2222 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS,
2228 /***************************************************
2230 * Software Coex Mechanism start
2232 ***************************************************/
2233 /* SCO only or SCO+PAN(HS) */
2234 void halbtc8723b1ant_action_sco(struct btc_coexist *btcoexist)
2240 halbtc8723b1ant_wifi_rssi_state(btcoexist, 0, 2, 25, 0);
2242 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 4);
2244 if (halbtc8723b1ant_need_to_dec_bt_pwr(btcoexist))
2245 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2247 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2249 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2251 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2253 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2254 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2255 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2257 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2260 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2262 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2267 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2268 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2269 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2271 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2274 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2276 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2283 void halbtc8723b1ant_action_hid(struct btc_coexist *btcoexist)
2285 u8 wifi_rssi_state, bt_rssi_state;
2288 wifi_rssi_state = halbtc8723b1ant_wifi_rssi_state(btcoexist,
2290 bt_rssi_state = halbtc8723b1ant_bt_rssi_state(2, 50, 0);
2292 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2294 if (halbtc8723b1ant_need_to_dec_bt_pwr(btcoexist))
2295 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2297 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2299 btcoexist->btc_get(btcoexist,
2300 BTC_GET_U4_WIFI_BW, &wifi_bw);
2302 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2304 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2305 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2306 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2308 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2311 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2313 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2318 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2319 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2320 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2322 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2325 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2327 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2333 /*A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
2334 void halbtc8723b1ant_action_a2dp(struct btc_coexist *btcoexist)
2336 u8 wifi_rssi_state, bt_rssi_state;
2339 wifi_rssi_state = halbtc8723b1ant_wifi_rssi_state(btcoexist,
2341 bt_rssi_state = halbtc8723b1ant_bt_rssi_state(2, 50, 0);
2343 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2345 if (halbtc8723b1ant_need_to_dec_bt_pwr(btcoexist))
2346 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2348 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2350 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2352 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2354 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2355 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2356 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2358 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2361 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2363 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2368 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2369 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2370 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2372 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2375 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2377 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2383 void halbtc8723b1ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)
2385 u8 wifi_rssi_state, bt_rssi_state, bt_info_ext;
2388 bt_info_ext = coex_sta->bt_info_ext;
2389 wifi_rssi_state = halbtc8723b1ant_wifi_rssi_state(btcoexist,
2391 bt_rssi_state = halbtc8723b1ant_bt_rssi_state(2, 50, 0);
2393 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2395 if (halbtc8723b1ant_need_to_dec_bt_pwr(btcoexist))
2396 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2398 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2400 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2402 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2404 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2405 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2406 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2408 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2411 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2413 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2418 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2419 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2420 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2422 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2425 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2427 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2433 void halbtc8723b1ant_action_pan_edr(struct btc_coexist *btcoexist)
2435 u8 wifi_rssi_state, bt_rssi_state;
2438 wifi_rssi_state = halbtc8723b1ant_wifi_rssi_state(btcoexist,
2440 bt_rssi_state = halbtc8723b1ant_bt_rssi_state(2, 50, 0);
2442 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2444 if (halbtc8723b1ant_need_to_dec_bt_pwr(btcoexist))
2445 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2447 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2449 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2451 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2453 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2454 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2455 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2457 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2460 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2462 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2467 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2468 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2469 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2471 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2474 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2476 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2484 void halbtc8723b1ant_action_pan_hs(struct btc_coexist *btcoexist)
2486 u8 wifi_rssi_state, bt_rssi_state;
2489 wifi_rssi_state = halbtc8723b1ant_wifi_rssi_state(btcoexist,
2491 bt_rssi_state = halbtc8723b1ant_bt_rssi_state(2, 50, 0);
2493 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2495 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2497 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2499 if((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2500 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
2501 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC,
2504 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC,
2508 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2509 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2510 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2512 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2515 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2517 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2522 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2523 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
2524 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC,
2527 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC,
2531 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2532 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2533 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2535 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2538 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2540 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2547 void halbtc8723b1ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)
2549 u8 wifi_rssi_state, bt_rssi_state, bt_info_ext;
2552 bt_info_ext = coex_sta->bt_info_ext;
2553 wifi_rssi_state = halbtc8723b1ant_wifi_rssi_state(btcoexist,
2555 bt_rssi_state = halbtc8723b1ant_bt_rssi_state(2, 50, 0);
2557 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2559 if (halbtc8723b1ant_need_to_dec_bt_pwr(btcoexist))
2560 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2562 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2564 btcoexist->btc_get(btcoexist,
2565 BTC_GET_U4_WIFI_BW, &wifi_bw);
2567 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2569 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2570 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2571 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2573 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2576 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2578 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2583 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2584 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2585 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2587 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2590 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false,
2592 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2598 void halbtc8723b1ant_action_pan_edr_hid(struct btc_coexist *btcoexist)
2600 u8 wifi_rssi_state, bt_rssi_state;
2603 wifi_rssi_state = halbtc8723b1ant_wifi_rssi_state(btcoexist,
2605 bt_rssi_state = halbtc8723b1ant_bt_rssi_state(2, 50, 0);
2607 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2609 if (halbtc8723b1ant_need_to_dec_bt_pwr(btcoexist))
2610 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2612 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2614 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2616 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2618 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2619 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2620 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2622 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2625 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2627 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2632 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2633 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2634 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2636 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2639 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2641 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2647 /* HID+A2DP+PAN(EDR) */
2648 void halbtc8723b1ant_action_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)
2650 u8 wifi_rssi_state, bt_rssi_state, bt_info_ext;
2653 bt_info_ext = coex_sta->bt_info_ext;
2654 wifi_rssi_state = halbtc8723b1ant_wifi_rssi_state(btcoexist,
2656 bt_rssi_state = halbtc8723b1ant_bt_rssi_state(2, 50, 0);
2658 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2660 if (halbtc8723b1ant_need_to_dec_bt_pwr(btcoexist))
2661 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2663 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2665 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2667 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2669 if((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2670 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2671 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2673 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2676 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2678 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2683 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2684 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2685 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2687 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2690 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2692 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2698 void halbtc8723b1ant_action_hid_a2dp(struct btc_coexist *btcoexist)
2700 u8 wifi_rssi_state, bt_rssi_state, bt_info_ext;
2703 bt_info_ext = coex_sta->bt_info_ext;
2704 wifi_rssi_state = halbtc8723b1ant_wifi_rssi_state(btcoexist,
2706 bt_rssi_state = halbtc8723b1ant_bt_rssi_state(2, 50, 0);
2708 if (halbtc8723b1ant_need_to_dec_bt_pwr(btcoexist))
2709 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2711 halbtc8723b1ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2713 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2715 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2717 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2718 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2719 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2721 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2724 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2726 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2731 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2732 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2733 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2735 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2738 halbtc8723b1ant_sw_mechanism1(btcoexist, false, true,
2740 halbtc8723b1ant_sw_mechanism2(btcoexist, false, false,
2746 /*****************************************************
2748 * Non-Software Coex Mechanism start
2750 *****************************************************/
2751 void halbtc8723b1ant_action_hs(struct btc_coexist *btcoexist)
2753 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
2754 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2);
2757 void halbtc8723b1ant_action_bt_inquiry(struct btc_coexist *btcoexist)
2759 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2760 bool wifi_connected = false, ap_enable = false;
2762 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
2764 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2767 if (!wifi_connected) {
2768 halbtc8723b1ant_power_save_state(btcoexist,
2769 BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2770 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
2771 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
2772 } else if (bt_link_info->sco_exist || bt_link_info->hid_only) {
2773 /* SCO/HID-only busy */
2774 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2776 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
2777 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
2780 halbtc8723b1ant_power_save_state(btcoexist,
2784 halbtc8723b1ant_power_save_state(btcoexist,
2788 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 30);
2789 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
2793 void halbtc8723b1ant_action_bt_sco_hid_only_busy(struct btc_coexist * btcoexist,
2796 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2797 bool wifi_connected = false;
2799 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2802 /* tdma and coex table */
2804 if (bt_link_info->sco_exist) {
2805 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
2806 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2808 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 6);
2809 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
2813 void halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
2814 struct btc_coexist *btcoexist,
2819 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2820 bt_rssi_state = halbtc8723b1ant_bt_rssi_state(2, 28, 0);
2822 if (bt_link_info->hid_only) { /*HID */
2823 halbtc8723b1ant_action_bt_sco_hid_only_busy(btcoexist,
2825 coex_dm->auto_tdma_adjust = false;
2827 } else if (bt_link_info->a2dp_only) { /*A2DP */
2828 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2829 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2830 halbtc8723b1ant_tdma_duration_adjust_for_acl(btcoexist,
2832 } else { /*for low BT RSSI */
2833 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2835 coex_dm->auto_tdma_adjust = false;
2838 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
2839 } else if (bt_link_info->hid_exist &&
2840 bt_link_info->a2dp_exist) { /*HID+A2DP */
2841 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2842 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2843 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2845 coex_dm->auto_tdma_adjust = false;
2846 } else { /*for low BT RSSI*/
2847 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2849 coex_dm->auto_tdma_adjust = false;
2852 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
2853 /*PAN(OPP,FTP), HID+PAN(OPP,FTP) */
2854 } else if (bt_link_info->pan_only ||
2855 (bt_link_info->hid_exist && bt_link_info->pan_exist)) {
2856 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
2857 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
2858 coex_dm->auto_tdma_adjust = false;
2859 /*A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP)*/
2860 } else if ((bt_link_info->a2dp_exist && bt_link_info->pan_exist) ||
2861 (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&
2862 bt_link_info->pan_exist)) {
2863 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
2864 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
2865 coex_dm->auto_tdma_adjust = false;
2867 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
2868 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
2869 coex_dm->auto_tdma_adjust = false;
2873 void halbtc8723b1ant_action_wifi_not_connected(struct btc_coexist *btcoexist)
2875 /* power save state */
2876 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2879 /* tdma and coex table */
2880 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2881 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2884 void halbtc8723b1ant_action_wifi_not_connected_asso_auth_scan(
2885 struct btc_coexist *btcoexist)
2887 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2890 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
2891 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
2894 void halbtc8723b1ant_ActionWifiConnectedScan(struct btc_coexist *btcoexist)
2896 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2898 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2901 /* tdma and coex table */
2902 if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
2903 if (bt_link_info->a2dp_exist &&
2904 bt_link_info->pan_exist) {
2905 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2907 halbtc8723b1ant_coex_table_with_type(btcoexist,
2910 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
2911 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
2913 } else if ((BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
2914 (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
2915 coex_dm->bt_status)) {
2916 halbtc8723b1ant_action_bt_sco_hid_only_busy(btcoexist,
2917 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);
2919 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
2920 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
2924 void halbtc8723b1ant_action_wifi_connected_special_packet(
2925 struct btc_coexist *btcoexist)
2927 bool hs_connecting = false;
2928 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2930 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_CONNECTING, &hs_connecting);
2932 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2935 /* tdma and coex table */
2936 if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
2937 if (bt_link_info->a2dp_exist && bt_link_info->pan_exist) {
2938 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2940 halbtc8723b1ant_coex_table_with_type(btcoexist,
2943 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2945 halbtc8723b1ant_coex_table_with_type(btcoexist,
2949 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
2950 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
2954 void halbtc8723b1ant_action_wifi_connected(struct btc_coexist *btcoexist)
2956 bool wifi_busy = false;
2957 bool scan = false, link = false, roam = false;
2958 bool under_4way = false, ap_enable = false;
2960 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
2961 "[BTCoex], CoexForWifiConnect()===>\n");
2963 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
2966 halbtc8723b1ant_action_wifi_connected_special_packet(btcoexist);
2967 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
2968 "[BTCoex], CoexForWifiConnect(), "
2969 "return for wifi is under 4way<===\n");
2973 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2974 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2975 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2977 if (scan || link || roam) {
2978 halbtc8723b1ant_ActionWifiConnectedScan(btcoexist);
2979 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
2980 "[BTCoex], CoexForWifiConnect(), "
2981 "return for wifi is under scan<===\n");
2985 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
2987 /* power save state */
2989 BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status &&
2990 !btcoexist->bt_link_info.hid_only)
2991 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_LPS_ON,
2994 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2997 /* tdma and coex table */
2998 btcoexist->btc_get(btcoexist,
2999 BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3001 if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
3002 halbtc8723b1ant_action_wifi_connected_bt_acl_busy(btcoexist,
3003 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
3004 } else if ((BT_8723B_1ANT_BT_STATUS_SCO_BUSY ==
3005 coex_dm->bt_status) ||
3006 (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
3007 coex_dm->bt_status)) {
3008 halbtc8723b1ant_action_bt_sco_hid_only_busy(btcoexist,
3009 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
3011 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
3013 halbtc8723b1ant_coex_table_with_type(btcoexist,
3017 if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
3018 halbtc8723b1ant_action_wifi_connected_bt_acl_busy(btcoexist,
3019 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
3020 } else if ((BT_8723B_1ANT_BT_STATUS_SCO_BUSY ==
3021 coex_dm->bt_status) ||
3022 (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
3023 coex_dm->bt_status)) {
3024 halbtc8723b1ant_action_bt_sco_hid_only_busy(btcoexist,
3025 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
3027 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
3028 halbtc8723b1ant_coex_table_with_type(btcoexist,
3034 void halbtc8723b1ant_run_sw_coexist_mechanism(struct btc_coexist *btcoexist)
3038 algorithm = halbtc8723b1ant_action_algorithm(btcoexist);
3039 coex_dm->cur_algorithm = algorithm;
3041 if (halbtc8723b1ant_is_common_action(btcoexist)) {
3043 switch (coex_dm->cur_algorithm) {
3044 case BT_8723B_1ANT_COEX_ALGO_SCO:
3045 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3046 "[BTCoex], Action algorithm = SCO.\n");
3047 halbtc8723b1ant_action_sco(btcoexist);
3049 case BT_8723B_1ANT_COEX_ALGO_HID:
3050 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3051 "[BTCoex], Action algorithm = HID.\n");
3052 halbtc8723b1ant_action_hid(btcoexist);
3054 case BT_8723B_1ANT_COEX_ALGO_A2DP:
3055 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3056 "[BTCoex], Action algorithm = A2DP.\n");
3057 halbtc8723b1ant_action_a2dp(btcoexist);
3059 case BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS:
3060 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3061 "[BTCoex], Action algorithm = "
3063 halbtc8723b1ant_action_a2dp_pan_hs(btcoexist);
3065 case BT_8723B_1ANT_COEX_ALGO_PANEDR:
3066 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3067 "[BTCoex], Action algorithm = PAN(EDR).\n");
3068 halbtc8723b1ant_action_pan_edr(btcoexist);
3070 case BT_8723B_1ANT_COEX_ALGO_PANHS:
3071 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3072 "[BTCoex], Action algorithm = HS mode.\n");
3073 halbtc8723b1ant_action_pan_hs(btcoexist);
3075 case BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP:
3076 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3077 "[BTCoex], Action algorithm = PAN+A2DP.\n");
3078 halbtc8723b1ant_action_pan_edr_a2dp(btcoexist);
3080 case BT_8723B_1ANT_COEX_ALGO_PANEDR_HID:
3081 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3082 "[BTCoex], Action algorithm = "
3084 halbtc8723b1ant_action_pan_edr_hid(btcoexist);
3086 case BT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR:
3087 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3088 "[BTCoex], Action algorithm = "
3090 halbtc8723b1ant_action_hid_a2dp_pan_edr(btcoexist);
3092 case BT_8723B_1ANT_COEX_ALGO_HID_A2DP:
3093 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3094 "[BTCoex], Action algorithm = HID+A2DP.\n");
3095 halbtc8723b1ant_action_hid_a2dp(btcoexist);
3098 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3099 "[BTCoex], Action algorithm = "
3100 "coexist All Off!!\n");
3103 coex_dm->pre_algorithm = coex_dm->cur_algorithm;
3107 void halbtc8723b1ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
3109 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3110 bool wifi_connected = false, bt_hs_on = false;
3111 bool limited_dig = false, bIncreaseScanDevNum = false;
3112 bool b_bt_ctrl_agg_buf_size = false;
3113 u8 agg_buf_size = 5;
3114 u8 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
3116 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3117 "[BTCoex], RunCoexistMechanism()===>\n");
3119 if (btcoexist->manual_control) {
3120 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3121 "[BTCoex], RunCoexistMechanism(), "
3122 "return for Manual CTRL <===\n");
3126 if (btcoexist->stop_coex_dm) {
3127 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3128 "[BTCoex], RunCoexistMechanism(), "
3129 "return for Stop Coex DM <===\n");
3133 if (coex_sta->under_ips) {
3134 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3135 "[BTCoex], wifi is under IPS !!!\n");
3139 if ((BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
3140 (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
3141 (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) {
3143 bIncreaseScanDevNum = true;
3146 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig);
3147 btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM,
3148 &bIncreaseScanDevNum);
3150 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3153 if (!bt_link_info->sco_exist && !bt_link_info->hid_exist) {
3154 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3156 if (wifi_connected) {
3158 halbtc8723b1ant_wifi_rssi_state(btcoexist,
3160 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3161 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3162 halbtc8723b1ant_limited_tx(btcoexist,
3166 halbtc8723b1ant_limited_tx(btcoexist,
3171 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC,
3176 if (bt_link_info->sco_exist) {
3177 b_bt_ctrl_agg_buf_size = true;
3179 } else if (bt_link_info->hid_exist) {
3180 b_bt_ctrl_agg_buf_size = true;
3182 } else if (bt_link_info->a2dp_exist || bt_link_info->pan_exist) {
3183 b_bt_ctrl_agg_buf_size = true;
3186 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3187 b_bt_ctrl_agg_buf_size, agg_buf_size);
3189 halbtc8723b1ant_run_sw_coexist_mechanism(btcoexist);
3191 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3193 if (coex_sta->c2h_bt_inquiry_page) {
3194 halbtc8723b1ant_action_bt_inquiry(btcoexist);
3196 } else if (bt_hs_on) {
3197 halbtc8723b1ant_action_hs(btcoexist);
3202 if (!wifi_connected) {
3203 bool scan = false, link = false, roam = false;
3205 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3206 "[BTCoex], wifi is non connected-idle !!!\n");
3208 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3209 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3210 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3212 if (scan || link || roam)
3213 halbtc8723b1ant_action_wifi_not_connected_asso_auth_scan(btcoexist);
3215 halbtc8723b1ant_action_wifi_not_connected(btcoexist);
3216 } else { /* wifi LPS/Busy */
3217 halbtc8723b1ant_action_wifi_connected(btcoexist);
3221 void halbtc8723b1ant_init_coex_dm(struct btc_coexist *btcoexist)
3223 /* force to reset coex mechanism */
3224 halbtc8723b1ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
3225 halbtc8723b1ant_dec_bt_pwr(btcoexist, FORCE_EXEC, false);
3228 halbtc8723b1ant_sw_mechanism1(btcoexist, false, false, false, false);
3229 halbtc8723b1ant_sw_mechanism2(btcoexist,false, false, false, 0x18);
3231 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
3232 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
3235 void halbtc8723b1ant_init_hw_config(struct btc_coexist *btcoexist, bool backup)
3239 u32 cnt_bt_cal_chk = 0;
3241 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
3242 "[BTCoex], 1Ant Init HW Config!!\n");
3244 if (backup) {/* backup rf 0x1e value */
3245 coex_dm->bt_rf0x1e_backup =
3246 btcoexist->btc_get_rf_reg(btcoexist,
3247 BTC_RF_A, 0x1e, 0xfffff);
3249 coex_dm->backup_arfr_cnt1 =
3250 btcoexist->btc_read_4byte(btcoexist, 0x430);
3251 coex_dm->backup_arfr_cnt2 =
3252 btcoexist->btc_read_4byte(btcoexist, 0x434);
3253 coex_dm->backup_retry_limit =
3254 btcoexist->btc_read_2byte(btcoexist, 0x42a);
3255 coex_dm->backup_ampdu_max_time =
3256 btcoexist->btc_read_1byte(btcoexist, 0x456);
3259 /* WiFi goto standby while GNT_BT 0-->1 */
3260 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);
3261 /* BT goto standby while GNT_BT 1-->0 */
3262 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x2, 0xfffff, 0x500);
3264 btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
3265 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x944, 0x3, 0x3);
3266 btcoexist->btc_write_1byte(btcoexist, 0x930, 0x77);
3269 /* BT calibration check */
3270 while (cnt_bt_cal_chk <= 20) {
3271 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x49d);
3273 if (u32tmp & BIT0) {
3274 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
3275 "[BTCoex], ########### BT "
3276 "calibration(cnt=%d) ###########\n",
3280 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
3281 "[BTCoex], ********** BT NOT "
3282 "calibration (cnt=%d)**********\n",
3288 /* 0x790[5:0]=0x5 */
3289 u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
3292 btcoexist->btc_write_1byte(btcoexist, 0x790, u8tmp);
3294 /* Enable counter statistics */
3295 /*0x76e[3] =1, WLAN_Act control by PTA */
3296 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
3297 btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1);
3298 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
3301 halbtc8723b1ant_SetAntPath(btcoexist, BTC_ANT_PATH_PTA, true, false);
3303 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
3307 void halbtc8723b1ant_wifi_off_hw_cfg(struct btc_coexist *btcoexist)
3309 /* set wlan_act to low */
3310 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0);
3313 /**************************************************************
3314 * work around function start with wa_halbtc8723b1ant_
3315 **************************************************************/
3316 /**************************************************************
3317 * extern function start with EXhalbtc8723b1ant_
3318 **************************************************************/
3320 void ex_halbtc8723b1ant_init_hwconfig(struct btc_coexist *btcoexist)
3322 halbtc8723b1ant_init_hw_config(btcoexist, true);
3325 void ex_halbtc8723b1ant_init_coex_dm(struct btc_coexist *btcoexist)
3327 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
3328 "[BTCoex], Coex Mechanism Init!!\n");
3330 btcoexist->stop_coex_dm = false;
3332 halbtc8723b1ant_init_coex_dm(btcoexist);
3334 halbtc8723b1ant_query_bt_info(btcoexist);
3337 void ex_halbtc8723b1ant_display_coex_info(struct btc_coexist *btcoexist)
3339 struct btc_board_info *board_info = &btcoexist->board_info;
3340 struct btc_stack_info *stack_info = &btcoexist->stack_info;
3341 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3342 u8 *cli_buf = btcoexist->cli_buf;
3343 u8 u8tmp[4], i, bt_info_ext, psTdmaCase=0;
3346 bool roam = false, scan = false;
3347 bool link = false, wifi_under_5g = false;
3348 bool bt_hs_on = false, wifi_busy = false;
3349 s32 wifi_rssi =0, bt_hs_rssi = 0;
3350 u32 wifi_bw, wifi_traffic_dir, fa_ofdm, fa_cck;
3351 u8 wifi_dot11_chnl, wifi_hs_chnl;
3352 u32 fw_ver = 0, bt_patch_ver = 0;
3354 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3355 "\r\n ============[BT Coexist info]============");
3358 if (btcoexist->manual_control) {
3359 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3360 "\r\n ============[Under Manual Control]==========");
3362 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3363 "\r\n ==========================================");
3366 if (btcoexist->stop_coex_dm) {
3367 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3368 "\r\n ============[Coex is STOPPED]============");
3370 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3371 "\r\n ==========================================");
3375 if (!board_info->bt_exist) {
3376 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
3381 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d",
3382 "Ant PG Num/ Ant Mech/ Ant Pos:", \
3383 board_info->pg_ant_num, board_info->btdm_ant_num,
3384 board_info->btdm_ant_pos);
3387 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %d",
3388 "BT stack/ hci ext ver", \
3389 ((stack_info->profile_notified)? "Yes":"No"),
3390 stack_info->hci_version);
3393 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
3394 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3395 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3396 "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
3397 "CoexVer/ FwVer/ PatchVer", \
3398 glcoex_ver_date_8723b_1ant, glcoex_ver_8723b_1ant,
3399 fw_ver, bt_patch_ver, bt_patch_ver);
3402 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3403 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
3405 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);
3406 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)",
3407 "Dot11 channel / HsChnl(HsMode)", \
3408 wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);
3411 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ",
3412 "H2C Wifi inform bt chnl Info", \
3413 coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1],
3414 coex_dm->wifi_chnl_info[2]);
3417 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
3418 btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
3419 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
3420 "Wifi rssi/ HS rssi", wifi_rssi, bt_hs_rssi);
3423 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3424 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3425 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3426 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ",
3427 "Wifi link/ roam/ scan", link, roam, scan);
3430 btcoexist->btc_get(btcoexist,BTC_GET_BL_WIFI_UNDER_5G,
3432 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3433 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3434 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
3437 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ",
3438 "Wifi status", (wifi_under_5g? "5G":"2.4G"),
3439 ((BTC_WIFI_BW_LEGACY==wifi_bw)? "Legacy":
3440 (((BTC_WIFI_BW_HT40==wifi_bw)? "HT40":"HT20"))),
3441 ((!wifi_busy)? "idle":
3442 ((BTC_WIFI_TRAFFIC_TX==wifi_traffic_dir)?
3443 "uplink":"downlink")));
3445 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ",
3446 "BT [status/ rssi/ retryCnt]",
3447 ((btcoexist->bt_info.bt_disabled)? ("disabled"):
3448 ((coex_sta->c2h_bt_inquiry_page)?("inquiry/page scan"):
3449 ((BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE == coex_dm->bt_status)?
3450 "non-connected idle":
3451 ((BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)?
3452 "connected-idle":"busy")))),
3453 coex_sta->bt_rssi, coex_sta->bt_retry_cnt);
3457 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d",
3458 "SCO/HID/PAN/A2DP", bt_link_info->sco_exist,
3459 bt_link_info->hid_exist, bt_link_info->pan_exist,
3460 bt_link_info->a2dp_exist);
3462 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO);
3464 bt_info_ext = coex_sta->bt_info_ext;
3465 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s",
3466 "BT Info A2DP rate",
3467 (bt_info_ext & BIT0) ? "Basic rate" : "EDR rate");
3470 for (i = 0; i < BT_INFO_SRC_8723B_1ANT_MAX; i++) {
3471 if (coex_sta->bt_info_c2h_cnt[i]) {
3472 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3473 "\r\n %-35s = %02x %02x %02x "
3474 "%02x %02x %02x %02x(%d)",
3475 GLBtInfoSrc8723b1Ant[i],
3476 coex_sta->bt_info_c2h[i][0],
3477 coex_sta->bt_info_c2h[i][1],
3478 coex_sta->bt_info_c2h[i][2],
3479 coex_sta->bt_info_c2h[i][3],
3480 coex_sta->bt_info_c2h[i][4],
3481 coex_sta->bt_info_c2h[i][5],
3482 coex_sta->bt_info_c2h[i][6],
3483 coex_sta->bt_info_c2h_cnt[i]);
3487 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3488 "\r\n %-35s = %s/%s, (0x%x/0x%x)",
3489 "PS state, IPS/LPS, (lps/rpwm)", \
3490 ((coex_sta->under_ips? "IPS ON":"IPS OFF")),
3491 ((coex_sta->under_lps? "LPS ON":"LPS OFF")),
3492 btcoexist->bt_info.lps_1ant,
3493 btcoexist->bt_info.rpwm_1ant);
3495 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);
3497 if (!btcoexist->manual_control) {
3499 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
3500 "============[Sw mechanism]============");
3503 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ",
3504 "SM1[ShRf/ LpRA/ LimDig]", \
3505 coex_dm->cur_rf_rx_lpf_shrink,
3506 coex_dm->cur_low_penalty_ra,
3507 btcoexist->bt_info.limited_dig);
3509 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3510 "\r\n %-35s = %d/ %d/ %d(0x%x) ",
3511 "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]", \
3512 coex_dm->cur_agc_table_en,
3513 coex_dm->cur_adc_backoff,
3514 coex_dm->cur_dac_swing_on,
3515 coex_dm->cur_dac_swing_lvl);
3520 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ",
3521 "Rate Mask", btcoexist->bt_info.ra_mask);
3525 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
3526 "============[Fw mechanism]============");
3529 psTdmaCase = coex_dm->cur_ps_tdma;
3530 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3531 "\r\n %-35s = %02x %02x %02x %02x %02x "
3532 "case-%d (auto:%d)",
3533 "PS TDMA", coex_dm->ps_tdma_para[0],
3534 coex_dm->ps_tdma_para[1], coex_dm->ps_tdma_para[2],
3535 coex_dm->ps_tdma_para[3], coex_dm->ps_tdma_para[4],
3536 psTdmaCase, coex_dm->auto_tdma_adjust);
3539 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ",
3540 "Latest error condition(should be 0)", \
3541 coex_dm->error_condition);
3544 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ",
3545 "DecBtPwr/ IgnWlanAct", coex_dm->cur_dec_bt_pwr,
3546 coex_dm->cur_ignore_wlan_act);
3551 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
3552 "============[Hw setting]============");
3555 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x",
3556 "RF-A, 0x1e initVal", coex_dm->bt_rf0x1e_backup);
3558 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
3559 "backup ARFR1/ARFR2/RL/AMaxTime", coex_dm->backup_arfr_cnt1,
3560 coex_dm->backup_arfr_cnt2, coex_dm->backup_retry_limit,
3561 coex_dm->backup_ampdu_max_time);
3564 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
3565 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
3566 u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
3567 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
3568 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
3569 "0x430/0x434/0x42a/0x456",
3570 u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]);
3573 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
3574 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6cc);
3575 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x880);
3576 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
3577 "0x778/0x6cc/0x880[29:25]", u8tmp[0], u32tmp[0],
3578 (u32tmp[1] & 0x3e000000) >> 25);
3581 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x948);
3582 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x67);
3583 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x765);
3584 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
3585 "0x948/ 0x67[5] / 0x765",
3586 u32tmp[0], ((u8tmp[0] & 0x20)>> 5), u8tmp[1]);
3589 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x92c);
3590 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x930);
3591 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x944);
3592 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
3593 "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]",
3594 u32tmp[0] & 0x3, u32tmp[1] & 0xff, u32tmp[2] & 0x3);
3597 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x39);
3598 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
3599 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
3600 u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64);
3601 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3602 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
3603 "0x38[11]/0x40/0x4c[24:23]/0x64[0]",
3604 ((u8tmp[0] & 0x8)>>3), u8tmp[1],
3605 ((u32tmp[0] & 0x01800000) >> 23), u8tmp[2] & 0x1);
3608 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
3609 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
3610 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
3611 "0x550(bcn ctrl)/0x522", u32tmp[0], u8tmp[0]);
3614 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
3615 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x49c);
3616 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
3617 "0xc50(dig)/0x49c(null-drop)", u32tmp[0] & 0xff, u8tmp[0]);
3620 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xda0);
3621 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xda4);
3622 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0xda8);
3623 u32tmp[3] = btcoexist->btc_read_4byte(btcoexist, 0xcf0);
3625 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);
3626 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
3628 fa_ofdm = ((u32tmp[0] & 0xffff0000) >> 16) +
3629 ((u32tmp[1] & 0xffff0000) >> 16) +
3630 (u32tmp[1] & 0xffff) +
3631 (u32tmp[2] & 0xffff) + \
3632 ((u32tmp[3] & 0xffff0000) >> 16) +
3633 (u32tmp[3] & 0xffff) ;
3634 fa_cck = (u8tmp[0] << 8) + u8tmp[1];
3636 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
3637 "OFDM-CCA/OFDM-FA/CCK-FA",
3638 u32tmp[0] & 0xffff, fa_ofdm, fa_cck);
3641 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
3642 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
3643 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
3644 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
3645 "0x6c0/0x6c4/0x6c8(coexTable)",
3646 u32tmp[0], u32tmp[1], u32tmp[2]);
3649 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
3650 "0x770(high-pri rx/tx)", coex_sta->high_priority_rx,
3651 coex_sta->high_priority_tx);
3653 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
3654 "0x774(low-pri rx/tx)", coex_sta->low_priority_rx,
3655 coex_sta->low_priority_tx);
3657 #if(BT_AUTO_REPORT_ONLY_8723B_1ANT == 1)
3658 halbtc8723b1ant_monitor_bt_ctr(btcoexist);
3660 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS);
3664 void ex_halbtc8723b1ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
3667 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
3670 if (BTC_IPS_ENTER == type) {
3671 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
3672 "[BTCoex], IPS ENTER notify\n");
3673 coex_sta->under_ips = true;
3675 halbtc8723b1ant_SetAntPath(btcoexist, BTC_ANT_PATH_BT,
3677 /* set PTA control */
3678 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3679 halbtc8723b1ant_coex_table_with_type(btcoexist,
3681 } else if (BTC_IPS_LEAVE == type) {
3682 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
3683 "[BTCoex], IPS LEAVE notify\n");
3684 coex_sta->under_ips = false;
3686 halbtc8723b1ant_run_coexist_mechanism(btcoexist);
3690 void ex_halbtc8723b1ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
3692 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
3695 if (BTC_LPS_ENABLE == type) {
3696 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
3697 "[BTCoex], LPS ENABLE notify\n");
3698 coex_sta->under_lps = true;
3699 } else if (BTC_LPS_DISABLE == type) {
3700 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
3701 "[BTCoex], LPS DISABLE notify\n");
3702 coex_sta->under_lps = false;
3706 void ex_halbtc8723b1ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
3708 bool wifi_connected = false, bt_hs_on = false;
3710 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
3711 btcoexist->bt_info.bt_disabled)
3714 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3715 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3718 halbtc8723b1ant_query_bt_info(btcoexist);
3720 if (coex_sta->c2h_bt_inquiry_page) {
3721 halbtc8723b1ant_action_bt_inquiry(btcoexist);
3723 } else if (bt_hs_on) {
3724 halbtc8723b1ant_action_hs(btcoexist);
3728 if (BTC_SCAN_START == type) {
3729 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
3730 "[BTCoex], SCAN START notify\n");
3731 if (!wifi_connected) /* non-connected scan */
3732 halbtc8723b1ant_action_wifi_not_connected_asso_auth_scan(btcoexist);
3733 else /* wifi is connected */
3734 halbtc8723b1ant_ActionWifiConnectedScan(btcoexist);
3735 } else if (BTC_SCAN_FINISH == type) {
3736 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
3737 "[BTCoex], SCAN FINISH notify\n");
3738 if (!wifi_connected) /* non-connected scan */
3739 halbtc8723b1ant_action_wifi_not_connected(btcoexist);
3741 halbtc8723b1ant_action_wifi_connected(btcoexist);
3745 void ex_halbtc8723b1ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
3747 bool wifi_connected = false, bt_hs_on = false;
3749 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
3750 btcoexist->bt_info.bt_disabled)
3753 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3754 if (coex_sta->c2h_bt_inquiry_page) {
3755 halbtc8723b1ant_action_bt_inquiry(btcoexist);
3757 } else if (bt_hs_on) {
3758 halbtc8723b1ant_action_hs(btcoexist);
3762 if (BTC_ASSOCIATE_START == type) {
3763 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
3764 "[BTCoex], CONNECT START notify\n");
3765 halbtc8723b1ant_action_wifi_not_connected_asso_auth_scan(btcoexist);
3766 } else if (BTC_ASSOCIATE_FINISH == type) {
3767 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
3768 "[BTCoex], CONNECT FINISH notify\n");
3770 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3772 if (!wifi_connected) /* non-connected scan */
3773 halbtc8723b1ant_action_wifi_not_connected(btcoexist);
3775 halbtc8723b1ant_action_wifi_connected(btcoexist);
3779 void ex_halbtc8723b1ant_media_status_notify(struct btc_coexist *btcoexist,
3782 u8 h2c_parameter[3] ={0};
3786 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
3787 btcoexist->bt_info.bt_disabled )
3790 if (BTC_MEDIA_CONNECT == type)
3791 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
3792 "[BTCoex], MEDIA connect notify\n");
3794 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
3795 "[BTCoex], MEDIA disconnect notify\n");
3797 /* only 2.4G we need to inform bt the chnl mask */
3798 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
3801 if ((BTC_MEDIA_CONNECT == type) &&
3802 (wifiCentralChnl <= 14)) {
3803 h2c_parameter[0] = 0x0;
3804 h2c_parameter[1] = wifiCentralChnl;
3805 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3806 if (BTC_WIFI_BW_HT40 == wifi_bw)
3807 h2c_parameter[2] = 0x30;
3809 h2c_parameter[2] = 0x20;
3812 coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
3813 coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
3814 coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
3816 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
3817 "[BTCoex], FW write 0x66=0x%x\n",
3818 h2c_parameter[0] << 16 | h2c_parameter[1] << 8 |
3821 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
3824 void ex_halbtc8723b1ant_special_packet_notify(struct btc_coexist *btcoexist,
3827 bool bt_hs_on = false;
3829 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
3830 btcoexist->bt_info.bt_disabled)
3833 coex_sta->special_pkt_period_cnt = 0;
3835 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3836 if (coex_sta->c2h_bt_inquiry_page) {
3837 halbtc8723b1ant_action_bt_inquiry(btcoexist);
3839 } else if (bt_hs_on) {
3840 halbtc8723b1ant_action_hs(btcoexist);
3844 if (BTC_PACKET_DHCP == type ||
3845 BTC_PACKET_EAPOL == type) {
3846 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
3847 "[BTCoex], special Packet(%d) notify\n", type);
3848 halbtc8723b1ant_action_wifi_connected_special_packet(btcoexist);
3852 void ex_halbtc8723b1ant_bt_info_notify(struct btc_coexist *btcoexist,
3853 u8 *tmp_buf, u8 length)
3856 u8 i, rsp_source = 0;
3857 bool wifi_connected = false;
3858 bool bt_busy = false;
3860 coex_sta->c2h_bt_info_req_sent = false;
3862 rsp_source = tmp_buf[0] & 0xf;
3863 if (rsp_source >= BT_INFO_SRC_8723B_1ANT_MAX)
3864 rsp_source = BT_INFO_SRC_8723B_1ANT_WIFI_FW;
3865 coex_sta->bt_info_c2h_cnt[rsp_source]++;
3867 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
3868 "[BTCoex], Bt info[%d], length=%d, hex data=[",
3869 rsp_source, length);
3870 for (i=0; i<length; i++) {
3871 coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
3873 bt_info = tmp_buf[i];
3874 if (i == length - 1)
3875 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
3876 "0x%02x]\n", tmp_buf[i]);
3878 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
3879 "0x%02x, ", tmp_buf[i]);
3882 if (BT_INFO_SRC_8723B_1ANT_WIFI_FW != rsp_source) {
3883 coex_sta->bt_retry_cnt = /* [3:0] */
3884 coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
3887 coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;
3889 coex_sta->bt_info_ext =
3890 coex_sta->bt_info_c2h[rsp_source][4];
3892 /* Here we need to resend some wifi info to BT
3893 * because bt is reset and loss of the info.*/
3894 if(coex_sta->bt_info_ext & BIT1)
3896 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3897 "[BTCoex], BT ext info bit1 check, "
3898 "send wifi BW&Chnl to BT!!\n");
3899 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3902 ex_halbtc8723b1ant_media_status_notify(btcoexist,
3905 ex_halbtc8723b1ant_media_status_notify(btcoexist,
3906 BTC_MEDIA_DISCONNECT);
3909 if (coex_sta->bt_info_ext & BIT3) {
3910 if (!btcoexist->manual_control &&
3911 !btcoexist->stop_coex_dm) {
3912 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3913 "[BTCoex], BT ext info bit3 check, "
3914 "set BT NOT ignore Wlan active!!\n");
3915 halbtc8723b1ant_ignore_wlan_act(btcoexist,
3920 /* BT already NOT ignore Wlan active, do nothing here.*/
3922 #if(BT_AUTO_REPORT_ONLY_8723B_1ANT == 0)
3923 if (coex_sta->bt_info_ext & BIT4) {
3924 /* BT auto report already enabled, do nothing */
3926 halbtc8723b1ant_bt_auto_report(btcoexist, FORCE_EXEC,
3932 /* check BIT2 first ==> check if bt is under inquiry or page scan */
3933 if (bt_info & BT_INFO_8723B_1ANT_B_INQ_PAGE)
3934 coex_sta->c2h_bt_inquiry_page = true;
3936 coex_sta->c2h_bt_inquiry_page = false;
3938 /* set link exist status */
3939 if (!(bt_info & BT_INFO_8723B_1ANT_B_CONNECTION)) {
3940 coex_sta->bt_link_exist = false;
3941 coex_sta->pan_exist = false;
3942 coex_sta->a2dp_exist = false;
3943 coex_sta->hid_exist = false;
3944 coex_sta->sco_exist = false;
3945 } else { /* connection exists */
3946 coex_sta->bt_link_exist = true;
3947 if (bt_info & BT_INFO_8723B_1ANT_B_FTP)
3948 coex_sta->pan_exist = true;
3950 coex_sta->pan_exist = false;
3951 if (bt_info & BT_INFO_8723B_1ANT_B_A2DP)
3952 coex_sta->a2dp_exist = true;
3954 coex_sta->a2dp_exist = false;
3955 if (bt_info & BT_INFO_8723B_1ANT_B_HID)
3956 coex_sta->hid_exist = true;
3958 coex_sta->hid_exist = false;
3959 if (bt_info & BT_INFO_8723B_1ANT_B_SCO_ESCO)
3960 coex_sta->sco_exist = true;
3962 coex_sta->sco_exist = false;
3965 halbtc8723b1ant_update_bt_link_info(btcoexist);
3967 if (!(bt_info&BT_INFO_8723B_1ANT_B_CONNECTION)) {
3968 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
3969 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3970 "[BTCoex], BtInfoNotify(), "
3971 "BT Non-Connected idle!!!\n");
3972 /* connection exists but no busy */
3973 } else if (bt_info == BT_INFO_8723B_1ANT_B_CONNECTION) {
3974 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE;
3975 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3976 "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
3977 } else if ((bt_info & BT_INFO_8723B_1ANT_B_SCO_ESCO) ||
3978 (bt_info & BT_INFO_8723B_1ANT_B_SCO_BUSY)) {
3979 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_SCO_BUSY;
3980 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3981 "[BTCoex], BtInfoNotify(), "
3982 "BT SCO busy!!!\n");
3983 } else if (bt_info & BT_INFO_8723B_1ANT_B_ACL_BUSY) {
3984 if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)
3985 coex_dm->auto_tdma_adjust = false;
3987 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_ACL_BUSY;
3988 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3989 "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
3991 coex_dm->bt_status =
3992 BT_8723B_1ANT_BT_STATUS_MAX;
3993 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
3994 "[BTCoex], BtInfoNotify(), BT Non-Defined state!!\n");
3997 if ((BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
3998 (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
3999 (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
4003 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
4005 halbtc8723b1ant_run_coexist_mechanism(btcoexist);
4008 void ex_halbtc8723b1ant_halt_notify(struct btc_coexist *btcoexist)
4010 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, "[BTCoex], Halt notify\n");
4012 btcoexist->stop_coex_dm = true;
4014 halbtc8723b1ant_SetAntPath(btcoexist, BTC_ANT_PATH_BT, false, true);
4016 halbtc8723b1ant_wifi_off_hw_cfg(btcoexist);
4017 halbtc8723b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
4019 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
4021 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
4023 ex_halbtc8723b1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
4026 void ex_halbtc8723b1ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
4028 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, "[BTCoex], Pnp notify\n");
4030 if (BTC_WIFI_PNP_SLEEP == pnp_state) {
4031 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
4032 "[BTCoex], Pnp notify to SLEEP\n");
4033 btcoexist->stop_coex_dm = true;
4034 halbtc8723b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
4035 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
4037 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 9);
4038 } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
4039 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
4040 "[BTCoex], Pnp notify to WAKE UP\n");
4041 btcoexist->stop_coex_dm = false;
4042 halbtc8723b1ant_init_hw_config(btcoexist, false);
4043 halbtc8723b1ant_init_coex_dm(btcoexist);
4044 halbtc8723b1ant_query_bt_info(btcoexist);
4048 void ex_halbtc8723b1ant_periodical(struct btc_coexist *btcoexist)
4050 struct btc_board_info *board_info = &btcoexist->board_info;
4051 struct btc_stack_info *stack_info = &btcoexist->stack_info;
4052 static u8 dis_ver_info_cnt = 0;
4053 u32 fw_ver = 0, bt_patch_ver = 0;
4055 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
4056 "[BTCoex], =========================="
4057 "Periodical===========================\n");
4059 if (dis_ver_info_cnt <= 5) {
4060 dis_ver_info_cnt += 1;
4061 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
4062 "[BTCoex], *************************"
4063 "***************************************\n");
4064 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
4065 "[BTCoex], Ant PG Num/ Ant Mech/ "
4066 "Ant Pos = %d/ %d/ %d\n", \
4067 board_info->pg_ant_num, board_info->btdm_ant_num,
4068 board_info->btdm_ant_pos);
4069 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
4070 "[BTCoex], BT stack/ hci ext ver = %s / %d\n", \
4071 ((stack_info->profile_notified)? "Yes":"No"),
4072 stack_info->hci_version);
4073 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
4075 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
4076 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
4077 "[BTCoex], CoexVer/ FwVer/ PatchVer "
4078 "= %d_%x/ 0x%x/ 0x%x(%d)\n", \
4079 glcoex_ver_date_8723b_1ant,
4080 glcoex_ver_8723b_1ant, fw_ver,
4081 bt_patch_ver, bt_patch_ver);
4082 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
4083 "[BTCoex], *****************************"
4084 "***********************************\n");
4087 #if(BT_AUTO_REPORT_ONLY_8723B_1ANT == 0)
4088 halbtc8723b1ant_query_bt_info(btcoexist);
4089 halbtc8723b1ant_monitor_bt_ctr(btcoexist);
4090 halbtc8723b1ant_monitor_bt_enable_disable(btcoexist);
4092 if (halbtc8723b1ant_is_wifi_status_changed(btcoexist) ||
4093 coex_dm->auto_tdma_adjust) {
4094 if (coex_sta->special_pkt_period_cnt > 2)
4095 halbtc8723b1ant_run_coexist_mechanism(btcoexist);
4098 coex_sta->special_pkt_period_cnt++;