1 /* ************************************************************
4 * This file is for RTL8821A Co-exist mechanism
7 * 2012/11/15 Cosa first check in.
9 * ************************************************************ */
11 /* ************************************************************
13 * ************************************************************ */
14 #include "mp_precomp.h"
16 #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
18 #if (RTL8821A_SUPPORT == 1)
19 /* ************************************************************
20 * Global variables, these are static variables
21 * ************************************************************ */
22 static u8 *trace_buf = &gl_btc_trace_buf[0];
23 static struct coex_dm_8821a_2ant glcoex_dm_8821a_2ant;
24 static struct coex_dm_8821a_2ant *coex_dm = &glcoex_dm_8821a_2ant;
25 static struct coex_sta_8821a_2ant glcoex_sta_8821a_2ant;
26 static struct coex_sta_8821a_2ant *coex_sta = &glcoex_sta_8821a_2ant;
28 const char *const glbt_info_src_8821a_2ant[] = {
31 "BT Info[bt auto report]",
34 u32 glcoex_ver_date_8821a_2ant = 20160816;
35 u32 glcoex_ver_8821a_2ant = 0x5d;
36 u32 glcoex_ver_btdesired_8821a_2ant = 0x5c;
38 /* modify 20140903v43 a2dpandhid tdmaonoff a2dp glitch _ tdma off 778=3(case1)->778=1(case0)
39 * and to improve tp while a2dphid case23->case25 , case123->case125 for asus spec
40 * and modify for asus bt WHQL test _ tdma off_ 778=3->1_
41 * ************************************************************
42 * local function proto type if needed
43 * ************************************************************
44 * ************************************************************
45 * local function start with halbtc8821a2ant_
46 * ************************************************************ */
47 u8 halbtc8821a2ant_bt_rssi_state(u8 level_num, u8 rssi_thresh, u8 rssi_thresh1)
50 u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;
52 bt_rssi = coex_sta->bt_rssi;
55 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
56 (coex_sta->pre_bt_rssi_state ==
57 BTC_RSSI_STATE_STAY_LOW)) {
58 if (bt_rssi >= (rssi_thresh +
59 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT))
60 bt_rssi_state = BTC_RSSI_STATE_HIGH;
62 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
64 if (bt_rssi < rssi_thresh)
65 bt_rssi_state = BTC_RSSI_STATE_LOW;
67 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
69 } else if (level_num == 3) {
70 if (rssi_thresh > rssi_thresh1) {
71 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
72 "[BTCoex], BT Rssi thresh error!!\n");
74 return coex_sta->pre_bt_rssi_state;
77 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
78 (coex_sta->pre_bt_rssi_state ==
79 BTC_RSSI_STATE_STAY_LOW)) {
80 if (bt_rssi >= (rssi_thresh +
81 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT))
82 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
84 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
85 } else if ((coex_sta->pre_bt_rssi_state ==
86 BTC_RSSI_STATE_MEDIUM) ||
87 (coex_sta->pre_bt_rssi_state ==
88 BTC_RSSI_STATE_STAY_MEDIUM)) {
89 if (bt_rssi >= (rssi_thresh1 +
90 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT))
91 bt_rssi_state = BTC_RSSI_STATE_HIGH;
92 else if (bt_rssi < rssi_thresh)
93 bt_rssi_state = BTC_RSSI_STATE_LOW;
95 bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
97 if (bt_rssi < rssi_thresh1)
98 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
100 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
104 coex_sta->pre_bt_rssi_state = bt_rssi_state;
106 return bt_rssi_state;
109 u8 halbtc8821a2ant_wifi_rssi_state(IN struct btc_coexist *btcoexist,
110 IN u8 index, IN u8 level_num, IN u8 rssi_thresh, IN u8 rssi_thresh1)
113 u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
115 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
117 if (level_num == 2) {
118 if ((coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW)
120 (coex_sta->pre_wifi_rssi_state[index] ==
121 BTC_RSSI_STATE_STAY_LOW)) {
122 if (wifi_rssi >= (rssi_thresh +
123 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT))
124 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
126 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
128 if (wifi_rssi < rssi_thresh)
129 wifi_rssi_state = BTC_RSSI_STATE_LOW;
131 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
133 } else if (level_num == 3) {
134 if (rssi_thresh > rssi_thresh1) {
135 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
136 "[BTCoex], wifi RSSI thresh error!!\n");
137 BTC_TRACE(trace_buf);
138 return coex_sta->pre_wifi_rssi_state[index];
141 if ((coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW)
143 (coex_sta->pre_wifi_rssi_state[index] ==
144 BTC_RSSI_STATE_STAY_LOW)) {
145 if (wifi_rssi >= (rssi_thresh +
146 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT))
147 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
149 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
150 } else if ((coex_sta->pre_wifi_rssi_state[index] ==
151 BTC_RSSI_STATE_MEDIUM) ||
152 (coex_sta->pre_wifi_rssi_state[index] ==
153 BTC_RSSI_STATE_STAY_MEDIUM)) {
154 if (wifi_rssi >= (rssi_thresh1 +
155 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT))
156 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
157 else if (wifi_rssi < rssi_thresh)
158 wifi_rssi_state = BTC_RSSI_STATE_LOW;
160 wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
162 if (wifi_rssi < rssi_thresh1)
163 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
165 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
169 coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
171 return wifi_rssi_state;
174 void halbtc8821a2ant_monitor_bt_enable_disable(IN struct btc_coexist *btcoexist)
176 static u32 bt_disable_cnt = 0;
177 boolean bt_active = true, bt_disabled = false;
179 /* This function check if bt is disabled */
181 if (coex_sta->high_priority_tx == 0 &&
182 coex_sta->high_priority_rx == 0 &&
183 coex_sta->low_priority_tx == 0 &&
184 coex_sta->low_priority_rx == 0)
186 if (coex_sta->high_priority_tx == 0xffff &&
187 coex_sta->high_priority_rx == 0xffff &&
188 coex_sta->low_priority_tx == 0xffff &&
189 coex_sta->low_priority_rx == 0xffff)
194 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
196 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
197 "[BTCoex], BT is enabled !!\n");
198 BTC_TRACE(trace_buf);
201 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
202 "[BTCoex], bt all counters=0, %d times!!\n",
204 BTC_TRACE(trace_buf);
205 if (bt_disable_cnt >= 10) {
207 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
209 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
210 "[BTCoex], BT is disabled !!\n");
211 BTC_TRACE(trace_buf);
214 if (coex_sta->bt_disabled != bt_disabled) {
215 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
216 "[BTCoex], BT is from %s to %s!!\n",
217 (coex_sta->bt_disabled ? "disabled" : "enabled"),
218 (bt_disabled ? "disabled" : "enabled"));
219 BTC_TRACE(trace_buf);
220 coex_sta->bt_disabled = bt_disabled;
221 /* if (!bt_disabled) {
227 void halbtc8821a2ant_limited_rx(IN struct btc_coexist *btcoexist,
228 IN boolean force_exec, IN boolean rej_ap_agg_pkt,
229 IN boolean bt_ctrl_agg_buf_size, IN u8 agg_buf_size)
231 boolean reject_rx_agg = rej_ap_agg_pkt;
232 boolean bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
233 u8 rx_agg_size = agg_buf_size;
235 /* ============================================ */
236 /* Rx Aggregation related setting */
237 /* ============================================ */
238 btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
240 /* decide BT control aggregation buf size or not */
241 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
242 &bt_ctrl_rx_agg_size);
243 /* aggregation buf size, only work when BT control Rx aggregation size. */
244 btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
245 /* real update aggregation setting */
246 btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
249 void halbtc8821a2ant_monitor_bt_ctr(IN struct btc_coexist *btcoexist)
251 u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
252 u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
254 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
259 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
260 reg_hp_tx = u32tmp & MASKLWORD;
261 reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
263 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
264 reg_lp_tx = u32tmp & MASKLWORD;
265 reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
267 coex_sta->high_priority_tx = reg_hp_tx;
268 coex_sta->high_priority_rx = reg_hp_rx;
269 coex_sta->low_priority_tx = reg_lp_tx;
270 coex_sta->low_priority_rx = reg_lp_rx;
272 if ((coex_sta->low_priority_rx >= 950) &&
273 (coex_sta->low_priority_rx >= coex_sta->low_priority_tx) &&
274 (!coex_sta->under_ips))
275 bt_link_info->slave_role = true;
277 bt_link_info->slave_role = false;
279 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
280 "[BTCoex], High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
281 reg_hp_txrx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);
282 BTC_TRACE(trace_buf);
283 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
284 "[BTCoex], Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
285 reg_lp_txrx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx);
286 BTC_TRACE(trace_buf);
289 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
292 void halbtc8821a2ant_monitor_wifi_ctr(IN struct btc_coexist *btcoexist)
296 coex_sta->crc_ok_cck = btcoexist->btc_phydm_query_PHY_counter(
298 PHYDM_INFO_CRC32_OK_CCK);
299 coex_sta->crc_ok_11g = btcoexist->btc_phydm_query_PHY_counter(
301 PHYDM_INFO_CRC32_OK_LEGACY);
302 coex_sta->crc_ok_11n = btcoexist->btc_phydm_query_PHY_counter(
304 PHYDM_INFO_CRC32_OK_HT);
305 coex_sta->crc_ok_11n_vht =
306 btcoexist->btc_phydm_query_PHY_counter(
308 PHYDM_INFO_CRC32_OK_VHT);
310 coex_sta->crc_err_cck = btcoexist->btc_phydm_query_PHY_counter(
312 PHYDM_INFO_CRC32_ERROR_CCK);
313 coex_sta->crc_err_11g = btcoexist->btc_phydm_query_PHY_counter(
315 PHYDM_INFO_CRC32_ERROR_LEGACY);
316 coex_sta->crc_err_11n = btcoexist->btc_phydm_query_PHY_counter(
318 PHYDM_INFO_CRC32_ERROR_HT);
319 coex_sta->crc_err_11n_vht =
320 btcoexist->btc_phydm_query_PHY_counter(
322 PHYDM_INFO_CRC32_ERROR_VHT);
327 void halbtc8821a2ant_query_bt_info(IN struct btc_coexist *btcoexist)
329 u8 h2c_parameter[1] = {0};
331 coex_sta->c2h_bt_info_req_sent = true;
333 h2c_parameter[0] |= BIT(0); /* trigger */
335 btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
338 boolean halbtc8821a2ant_is_wifi_status_changed(IN struct btc_coexist *btcoexist)
340 static boolean pre_wifi_busy = false, pre_under_4way = false,
341 pre_bt_hs_on = false;
342 boolean wifi_busy = false, under_4way = false, bt_hs_on = false;
343 boolean wifi_connected = false;
344 u8 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
347 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
349 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
350 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
351 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
354 if (wifi_connected) {
355 if (wifi_busy != pre_wifi_busy) {
356 pre_wifi_busy = wifi_busy;
359 if (under_4way != pre_under_4way) {
360 pre_under_4way = under_4way;
363 if (bt_hs_on != pre_bt_hs_on) {
364 pre_bt_hs_on = bt_hs_on;
369 wifi_rssi_state = halbtc8821a2ant_wifi_rssi_state(btcoexist, 3,
370 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
372 if ((BTC_RSSI_STATE_HIGH == wifi_rssi_state) ||
373 (BTC_RSSI_STATE_LOW == wifi_rssi_state))
381 void halbtc8821a2ant_update_bt_link_info(IN struct btc_coexist *btcoexist)
383 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
384 boolean bt_hs_on = false;
386 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
388 bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
389 bt_link_info->sco_exist = coex_sta->sco_exist;
390 bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
391 bt_link_info->pan_exist = coex_sta->pan_exist;
392 bt_link_info->hid_exist = coex_sta->hid_exist;
394 /* work around for HS mode. */
396 bt_link_info->pan_exist = true;
397 bt_link_info->bt_link_exist = true;
400 /* check if Sco only */
401 if (bt_link_info->sco_exist &&
402 !bt_link_info->a2dp_exist &&
403 !bt_link_info->pan_exist &&
404 !bt_link_info->hid_exist)
405 bt_link_info->sco_only = true;
407 bt_link_info->sco_only = false;
409 /* check if A2dp only */
410 if (!bt_link_info->sco_exist &&
411 bt_link_info->a2dp_exist &&
412 !bt_link_info->pan_exist &&
413 !bt_link_info->hid_exist)
414 bt_link_info->a2dp_only = true;
416 bt_link_info->a2dp_only = false;
418 /* check if Pan only */
419 if (!bt_link_info->sco_exist &&
420 !bt_link_info->a2dp_exist &&
421 bt_link_info->pan_exist &&
422 !bt_link_info->hid_exist)
423 bt_link_info->pan_only = true;
425 bt_link_info->pan_only = false;
427 /* check if Hid only */
428 if (!bt_link_info->sco_exist &&
429 !bt_link_info->a2dp_exist &&
430 !bt_link_info->pan_exist &&
431 bt_link_info->hid_exist)
432 bt_link_info->hid_only = true;
434 bt_link_info->hid_only = false;
437 u8 halbtc8821a2ant_action_algorithm(IN struct btc_coexist *btcoexist)
439 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
440 boolean bt_hs_on = false;
441 u8 algorithm = BT_8821A_2ANT_COEX_ALGO_UNDEFINED;
442 u8 num_of_diff_profile = 0;
444 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
446 if (!bt_link_info->bt_link_exist) {
447 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
448 "[BTCoex], No BT link exists!!!\n");
449 BTC_TRACE(trace_buf);
453 if (bt_link_info->sco_exist)
454 num_of_diff_profile++;
455 if (bt_link_info->hid_exist)
456 num_of_diff_profile++;
457 if (bt_link_info->pan_exist)
458 num_of_diff_profile++;
459 if (bt_link_info->a2dp_exist)
460 num_of_diff_profile++;
462 if (num_of_diff_profile == 1) {
463 if (bt_link_info->sco_exist) {
464 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
465 "[BTCoex], SCO only\n");
466 BTC_TRACE(trace_buf);
467 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
469 if (bt_link_info->hid_exist) {
470 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
471 "[BTCoex], HID only\n");
472 BTC_TRACE(trace_buf);
473 algorithm = BT_8821A_2ANT_COEX_ALGO_HID;
474 } else if (bt_link_info->a2dp_exist) {
475 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
476 "[BTCoex], A2DP only\n");
477 BTC_TRACE(trace_buf);
478 algorithm = BT_8821A_2ANT_COEX_ALGO_A2DP;
479 } else if (bt_link_info->pan_exist) {
481 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
482 "[BTCoex], PAN(HS) only\n");
483 BTC_TRACE(trace_buf);
485 BT_8821A_2ANT_COEX_ALGO_PANHS;
487 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
488 "[BTCoex], PAN(EDR) only\n");
489 BTC_TRACE(trace_buf);
491 BT_8821A_2ANT_COEX_ALGO_PANEDR;
495 } else if (num_of_diff_profile == 2) {
496 if (bt_link_info->sco_exist) {
497 if (bt_link_info->hid_exist) {
498 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
499 "[BTCoex], SCO + HID\n");
500 BTC_TRACE(trace_buf);
501 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
502 } else if (bt_link_info->a2dp_exist) {
503 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
504 "[BTCoex], SCO + A2DP ==> SCO\n");
505 BTC_TRACE(trace_buf);
506 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
507 } else if (bt_link_info->pan_exist) {
509 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
510 "[BTCoex], SCO + PAN(HS)\n");
511 BTC_TRACE(trace_buf);
512 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
514 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
515 "[BTCoex], SCO + PAN(EDR)\n");
516 BTC_TRACE(trace_buf);
517 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
521 if (bt_link_info->hid_exist &&
522 bt_link_info->a2dp_exist) {
524 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
525 "[BTCoex], HID + A2DP\n");
526 BTC_TRACE(trace_buf);
528 BT_8821A_2ANT_COEX_ALGO_HID_A2DP;
530 } else if (bt_link_info->hid_exist &&
531 bt_link_info->pan_exist) {
533 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
534 "[BTCoex], HID + PAN(HS)\n");
535 BTC_TRACE(trace_buf);
536 algorithm = BT_8821A_2ANT_COEX_ALGO_HID;
538 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
539 "[BTCoex], HID + PAN(EDR)\n");
540 BTC_TRACE(trace_buf);
542 BT_8821A_2ANT_COEX_ALGO_PANEDR_HID;
544 } else if (bt_link_info->pan_exist &&
545 bt_link_info->a2dp_exist) {
547 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
548 "[BTCoex], A2DP + PAN(HS)\n");
549 BTC_TRACE(trace_buf);
551 BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS;
553 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
554 "[BTCoex], A2DP + PAN(EDR)\n");
555 BTC_TRACE(trace_buf);
557 BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP;
561 } else if (num_of_diff_profile == 3) {
562 if (bt_link_info->sco_exist) {
563 if (bt_link_info->hid_exist &&
564 bt_link_info->a2dp_exist) {
565 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
566 "[BTCoex], SCO + HID + A2DP ==> SCO\n");
567 BTC_TRACE(trace_buf);
568 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
569 } else if (bt_link_info->hid_exist &&
570 bt_link_info->pan_exist) {
572 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
573 "[BTCoex], SCO + HID + PAN(HS) ==> SCO\n");
574 BTC_TRACE(trace_buf);
575 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
577 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
578 "[BTCoex], SCO + HID + PAN(EDR) ==> SCO\n");
579 BTC_TRACE(trace_buf);
580 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
582 } else if (bt_link_info->pan_exist &&
583 bt_link_info->a2dp_exist) {
585 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
586 "[BTCoex], SCO + A2DP + PAN(HS)\n");
587 BTC_TRACE(trace_buf);
588 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
590 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
591 "[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n");
592 BTC_TRACE(trace_buf);
593 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
597 if (bt_link_info->hid_exist &&
598 bt_link_info->pan_exist &&
599 bt_link_info->a2dp_exist) {
601 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
602 "[BTCoex], HID + A2DP + PAN(HS)\n");
603 BTC_TRACE(trace_buf);
605 BT_8821A_2ANT_COEX_ALGO_HID_A2DP;
607 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
608 "[BTCoex], HID + A2DP + PAN(EDR)\n");
609 BTC_TRACE(trace_buf);
611 BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
615 } else if (num_of_diff_profile >= 3) {
616 if (bt_link_info->sco_exist) {
617 if (bt_link_info->hid_exist &&
618 bt_link_info->pan_exist &&
619 bt_link_info->a2dp_exist) {
621 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
622 "[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n");
623 BTC_TRACE(trace_buf);
626 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
627 "[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");
628 BTC_TRACE(trace_buf);
629 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
638 void halbtc8821a2ant_set_fw_dac_swing_level(IN struct btc_coexist *btcoexist,
641 u8 h2c_parameter[1] = {0};
643 /* There are several type of dacswing */
644 /* 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 */
645 h2c_parameter[0] = dac_swing_lvl;
647 btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);
650 void halbtc8821a2ant_set_fw_dec_bt_pwr(IN struct btc_coexist *btcoexist,
651 IN u8 dec_bt_pwr_lvl)
653 u8 h2c_parameter[1] = {0};
655 h2c_parameter[0] = dec_bt_pwr_lvl;
657 btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter);
660 void halbtc8821a2ant_dec_bt_pwr(IN struct btc_coexist *btcoexist,
661 IN boolean force_exec, IN u8 dec_bt_pwr_lvl)
663 coex_dm->cur_bt_dec_pwr_lvl = dec_bt_pwr_lvl;
666 if (coex_dm->pre_bt_dec_pwr_lvl == coex_dm->cur_bt_dec_pwr_lvl)
669 halbtc8821a2ant_set_fw_dec_bt_pwr(btcoexist,
670 coex_dm->cur_bt_dec_pwr_lvl);
672 coex_dm->pre_bt_dec_pwr_lvl = coex_dm->cur_bt_dec_pwr_lvl;
675 void halbtc8821a2ant_set_bt_auto_report(IN struct btc_coexist *btcoexist,
676 IN boolean enable_auto_report)
678 u8 h2c_parameter[1] = {0};
680 h2c_parameter[0] = 0;
682 if (enable_auto_report)
683 h2c_parameter[0] |= BIT(0);
685 btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
688 void halbtc8821a2ant_bt_auto_report(IN struct btc_coexist *btcoexist,
689 IN boolean force_exec, IN boolean enable_auto_report)
691 coex_dm->cur_bt_auto_report = enable_auto_report;
694 if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
697 halbtc8821a2ant_set_bt_auto_report(btcoexist,
698 coex_dm->cur_bt_auto_report);
700 coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
703 void halbtc8821a2ant_fw_dac_swing_lvl(IN struct btc_coexist *btcoexist,
704 IN boolean force_exec, IN u8 fw_dac_swing_lvl)
706 coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl;
709 if (coex_dm->pre_fw_dac_swing_lvl ==
710 coex_dm->cur_fw_dac_swing_lvl)
714 halbtc8821a2ant_set_fw_dac_swing_level(btcoexist,
715 coex_dm->cur_fw_dac_swing_lvl);
717 coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;
720 void halbtc8821a2ant_set_sw_rf_rx_lpf_corner(IN struct btc_coexist *btcoexist,
721 IN boolean rx_rf_shrink_on)
723 if (rx_rf_shrink_on) {
724 /* Shrink RF Rx LPF corner */
725 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
726 "[BTCoex], Shrink RF Rx LPF corner!!\n");
727 BTC_TRACE(trace_buf);
728 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e, 0xfffff,
731 /* Resume RF Rx LPF corner */
732 /* After initialized, we can use coex_dm->bt_rf_0x1e_backup */
733 if (btcoexist->initilized) {
734 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
735 "[BTCoex], Resume RF Rx LPF corner!!\n");
736 BTC_TRACE(trace_buf);
737 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
738 0xfffff, coex_dm->bt_rf_0x1e_backup);
743 void halbtc8821a2ant_rf_shrink(IN struct btc_coexist *btcoexist,
744 IN boolean force_exec, IN boolean rx_rf_shrink_on)
746 coex_dm->cur_rf_rx_lpf_shrink = rx_rf_shrink_on;
749 if (coex_dm->pre_rf_rx_lpf_shrink ==
750 coex_dm->cur_rf_rx_lpf_shrink)
753 halbtc8821a2ant_set_sw_rf_rx_lpf_corner(btcoexist,
754 coex_dm->cur_rf_rx_lpf_shrink);
756 coex_dm->pre_rf_rx_lpf_shrink = coex_dm->cur_rf_rx_lpf_shrink;
759 void halbtc8821a2ant_set_sw_penalty_tx_rate_adaptive(IN struct btc_coexist
760 *btcoexist, IN boolean low_penalty_ra)
762 u8 h2c_parameter[6] = {0};
764 h2c_parameter[0] = 0x6; /* op_code, 0x6= Retry_Penalty */
766 if (low_penalty_ra) {
767 h2c_parameter[1] |= BIT(0);
769 0x00; /* normal rate except MCS7/6/5, OFDM54/48/36 */
770 h2c_parameter[3] = 0xf3; /* MCS7 or OFDM54 */
771 h2c_parameter[4] = 0xa0; /* MCS6 or OFDM48 */
772 h2c_parameter[5] = 0xa0; /* MCS5 or OFDM36 */
773 /* h2c_parameter[3] = 0xf7; */ /*MCS7 or OFDM54 */
774 /* h2c_parameter[4] = 0xf8; */ /*MCS6 or OFDM48 */
775 /* h2c_parameter[5] = 0xf9; /MCS5 or OFDM36 */
778 btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
781 void halbtc8821a2ant_low_penalty_ra(IN struct btc_coexist *btcoexist,
782 IN boolean force_exec, IN boolean low_penalty_ra)
784 coex_dm->cur_low_penalty_ra = low_penalty_ra;
787 if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
790 halbtc8821a2ant_set_sw_penalty_tx_rate_adaptive(btcoexist,
791 coex_dm->cur_low_penalty_ra);
793 coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
796 void halbtc8821a2ant_set_dac_swing_reg(IN struct btc_coexist *btcoexist,
801 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
802 "[BTCoex], Write SwDacSwing = 0x%x\n", level);
803 BTC_TRACE(trace_buf);
804 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xc5b, 0x3e, val);
807 void halbtc8821a2ant_set_sw_full_time_dac_swing(IN struct btc_coexist
808 *btcoexist, IN boolean sw_dac_swing_on, IN u32 sw_dac_swing_lvl)
811 halbtc8821a2ant_set_dac_swing_reg(btcoexist, sw_dac_swing_lvl);
813 halbtc8821a2ant_set_dac_swing_reg(btcoexist, 0x18);
817 void halbtc8821a2ant_dac_swing(IN struct btc_coexist *btcoexist,
818 IN boolean force_exec, IN boolean dac_swing_on, IN u32 dac_swing_lvl)
820 coex_dm->cur_dac_swing_on = dac_swing_on;
821 coex_dm->cur_dac_swing_lvl = dac_swing_lvl;
824 if ((coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) &&
825 (coex_dm->pre_dac_swing_lvl ==
826 coex_dm->cur_dac_swing_lvl))
830 halbtc8821a2ant_set_sw_full_time_dac_swing(btcoexist, dac_swing_on,
833 coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on;
834 coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl;
837 void halbtc8821a2ant_set_adc_back_off(IN struct btc_coexist *btcoexist,
838 IN boolean adc_back_off)
841 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
842 "[BTCoex], BB BackOff Level On!\n");
843 BTC_TRACE(trace_buf);
844 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x8db, 0x60, 0x3);
846 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
847 "[BTCoex], BB BackOff Level Off!\n");
848 BTC_TRACE(trace_buf);
849 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x8db, 0x60, 0x1);
853 void halbtc8821a2ant_adc_back_off(IN struct btc_coexist *btcoexist,
854 IN boolean force_exec, IN boolean adc_back_off)
856 coex_dm->cur_adc_back_off = adc_back_off;
859 if (coex_dm->pre_adc_back_off == coex_dm->cur_adc_back_off)
862 halbtc8821a2ant_set_adc_back_off(btcoexist, coex_dm->cur_adc_back_off);
864 coex_dm->pre_adc_back_off = coex_dm->cur_adc_back_off;
867 void halbtc8821a2ant_set_agc_table(IN struct btc_coexist *btcoexist,
868 IN boolean agc_table_en)
870 u8 rssi_adjust_val = 0;
872 /* =================BB AGC Gain Table */
874 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
875 "[BTCoex], BB Agc Table On!\n");
876 BTC_TRACE(trace_buf);
877 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6e1A0001);
878 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6d1B0001);
879 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6c1C0001);
880 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6b1D0001);
881 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6a1E0001);
882 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x691F0001);
883 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x68200001);
885 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
886 "[BTCoex], BB Agc Table Off!\n");
887 BTC_TRACE(trace_buf);
888 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xaa1A0001);
889 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa91B0001);
890 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa81C0001);
891 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa71D0001);
892 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa61E0001);
893 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa51F0001);
894 btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa4200001);
898 /* =================RF Gain */
899 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);
901 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
902 "[BTCoex], Agc Table On!\n");
903 BTC_TRACE(trace_buf);
904 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b, 0xfffff,
906 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b, 0xfffff,
909 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
910 "[BTCoex], Agc Table Off!\n");
911 BTC_TRACE(trace_buf);
912 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b, 0xfffff,
914 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b, 0xfffff,
917 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);
919 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xed, 0xfffff, 0x1);
921 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
922 "[BTCoex], Agc Table On!\n");
923 BTC_TRACE(trace_buf);
924 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x40, 0xfffff,
926 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x40, 0xfffff,
929 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
930 "[BTCoex], Agc Table Off!\n");
931 BTC_TRACE(trace_buf);
932 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x40, 0xfffff,
934 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x40, 0xfffff,
937 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xed, 0xfffff, 0x0);
939 /* set rssi_adjust_val for wifi module. */
942 btcoexist->btc_set(btcoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON,
946 void halbtc8821a2ant_agc_table(IN struct btc_coexist *btcoexist,
947 IN boolean force_exec, IN boolean agc_table_en)
949 coex_dm->cur_agc_table_en = agc_table_en;
952 if (coex_dm->pre_agc_table_en == coex_dm->cur_agc_table_en)
955 halbtc8821a2ant_set_agc_table(btcoexist, agc_table_en);
957 coex_dm->pre_agc_table_en = coex_dm->cur_agc_table_en;
960 void halbtc8821a2ant_set_coex_table(IN struct btc_coexist *btcoexist,
961 IN u32 val0x6c0, IN u32 val0x6c4, IN u32 val0x6c8, IN u8 val0x6cc)
963 btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
965 btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
967 btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
969 btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
972 void halbtc8821a2ant_coex_table(IN struct btc_coexist *btcoexist,
973 IN boolean force_exec, IN u32 val0x6c0, IN u32 val0x6c4,
974 IN u32 val0x6c8, IN u8 val0x6cc)
976 coex_dm->cur_val0x6c0 = val0x6c0;
977 coex_dm->cur_val0x6c4 = val0x6c4;
978 coex_dm->cur_val0x6c8 = val0x6c8;
979 coex_dm->cur_val0x6cc = val0x6cc;
982 if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
983 (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
984 (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
985 (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
988 halbtc8821a2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8,
991 coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
992 coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
993 coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
994 coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
997 void halbtc8821a2ant_coex_table_with_type(IN struct btc_coexist *btcoexist,
998 IN boolean force_exec, IN u8 type)
1000 coex_sta->coex_table_type = type;
1004 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1005 0x55555555, 0x55555555, 0xffffff, 0x3);
1008 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1009 0x55555555, 0x5afa5afa, 0xffffff, 0x3);
1012 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1013 0x5ada5ada, 0x5ada5ada, 0xffffff, 0x3);
1016 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1017 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 0x3);
1020 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1021 0xffffffff, 0xffffffff, 0xffffff, 0x3);
1024 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1025 0x5fff5fff, 0x5fff5fff, 0xffffff, 0x3);
1028 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1029 0x55ff55ff, 0x5a5a5a5a, 0xffffff, 0x3);
1032 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1033 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);
1036 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1037 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);
1040 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1041 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);
1044 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1045 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);
1048 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1049 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);
1052 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1053 0x55dd55dd, 0x5ada5ada, 0xffffff, 0x3);
1056 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1057 0x5fff5fff, 0xaaaaaaaa, 0xffffff, 0x3);
1060 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1061 0x5fff5fff, 0x5ada5ada, 0xffffff, 0x3);
1064 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1065 0x55dd55dd, 0xaaaaaaaa, 0xffffff, 0x3);
1068 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1069 0x5fdf5fdf, 0x5fdb5fdb, 0xffffff, 0x3);
1072 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1073 0xfafafafa, 0xfafafafa, 0xffffff, 0x3);
1076 halbtc8821a2ant_coex_table(btcoexist, force_exec,
1077 0x5555555f, 0x5ada5ada, 0xffffff, 0x3);
1084 void halbtc8821a2ant_set_fw_ignore_wlan_act(IN struct btc_coexist *btcoexist,
1087 u8 h2c_parameter[1] = {0};
1090 h2c_parameter[0] |= BIT(0); /* function enable */
1092 btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
1095 void halbtc8821a2ant_set_lps_rpwm(IN struct btc_coexist *btcoexist,
1096 IN u8 lps_val, IN u8 rpwm_val)
1101 btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
1102 btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
1105 void halbtc8821a2ant_lps_rpwm(IN struct btc_coexist *btcoexist,
1106 IN boolean force_exec, IN u8 lps_val, IN u8 rpwm_val)
1108 coex_dm->cur_lps = lps_val;
1109 coex_dm->cur_rpwm = rpwm_val;
1112 if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
1113 (coex_dm->pre_rpwm == coex_dm->cur_rpwm))
1116 halbtc8821a2ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
1118 coex_dm->pre_lps = coex_dm->cur_lps;
1119 coex_dm->pre_rpwm = coex_dm->cur_rpwm;
1122 void halbtc8821a2ant_ignore_wlan_act(IN struct btc_coexist *btcoexist,
1123 IN boolean force_exec, IN boolean enable)
1125 coex_dm->cur_ignore_wlan_act = enable;
1128 if (coex_dm->pre_ignore_wlan_act ==
1129 coex_dm->cur_ignore_wlan_act)
1132 halbtc8821a2ant_set_fw_ignore_wlan_act(btcoexist, enable);
1134 coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
1137 void halbtc8821a2ant_set_fw_pstdma(IN struct btc_coexist *btcoexist,
1138 IN u8 byte1, IN u8 byte2, IN u8 byte3, IN u8 byte4, IN u8 byte5)
1140 u8 h2c_parameter[5] = {0};
1142 h2c_parameter[0] = byte1;
1143 h2c_parameter[1] = byte2;
1144 h2c_parameter[2] = byte3;
1145 h2c_parameter[3] = byte4;
1146 h2c_parameter[4] = byte5;
1148 coex_dm->ps_tdma_para[0] = byte1;
1149 coex_dm->ps_tdma_para[1] = byte2;
1150 coex_dm->ps_tdma_para[2] = byte3;
1151 coex_dm->ps_tdma_para[3] = byte4;
1152 coex_dm->ps_tdma_para[4] = byte5;
1154 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1157 void halbtc8821a2ant_sw_mechanism1(IN struct btc_coexist *btcoexist,
1158 IN boolean shrink_rx_lpf, IN boolean low_penalty_ra,
1159 IN boolean limited_dig, IN boolean bt_lna_constrain)
1164 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
1166 if(BTC_WIFI_BW_HT40 != wifi_bw)
1169 shrink_rx_lpf = false;
1173 /* halbtc8821a2ant_rf_shrink(btcoexist, NORMAL_EXEC, shrink_rx_lpf); */
1174 halbtc8821a2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
1177 void halbtc8821a2ant_sw_mechanism2(IN struct btc_coexist *btcoexist,
1178 IN boolean agc_table_shift, IN boolean adc_back_off,
1179 IN boolean sw_dac_swing, IN u32 dac_swing_lvl)
1181 /* halbtc8821a2ant_agc_table(btcoexist, NORMAL_EXEC, agc_table_shift); */
1182 /* halbtc8821a2ant_adc_back_off(btcoexist, NORMAL_EXEC, adc_back_off); */
1183 halbtc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, sw_dac_swing,
1187 void halbtc8821a2ant_set_ant_path(IN struct btc_coexist *btcoexist,
1188 IN u8 ant_pos_type, IN boolean init_hwcfg, IN boolean wifi_off)
1190 struct btc_board_info *board_info = &btcoexist->board_info;
1192 u8 h2c_parameter[2] = {0};
1195 /* 0x4c[23]=0, 0x4c[24]=1 Antenna control by WL/BT */
1196 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
1199 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
1201 btcoexist->btc_write_4byte(btcoexist, 0x974, 0x3ff);
1202 /* btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x77); */
1204 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {
1205 /* tell firmware "antenna inverse" ==> WRONG firmware antenna control code.==>need fw to fix */
1206 h2c_parameter[0] = 1;
1207 h2c_parameter[1] = 1;
1208 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
1211 /* tell firmware "no antenna inverse" ==> WRONG firmware antenna control code.==>need fw to fix */
1212 h2c_parameter[0] = 0;
1213 h2c_parameter[1] = 1;
1214 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
1219 /* ext switch setting */
1220 switch (ant_pos_type) {
1221 case BTC_ANT_WIFI_AT_MAIN:
1222 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
1225 case BTC_ANT_WIFI_AT_AUX:
1226 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
1232 void halbtc8821a2ant_ps_tdma(IN struct btc_coexist *btcoexist,
1233 IN boolean force_exec, IN boolean turn_on, IN u8 type)
1235 u8 wifi_rssi_state1, bt_rssi_state;
1238 wifi_rssi_state1 = halbtc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
1239 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
1240 bt_rssi_state = halbtc8821a2ant_bt_rssi_state(2,
1241 BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
1243 if (!(BTC_RSSI_HIGH(wifi_rssi_state1) &&
1244 BTC_RSSI_HIGH(bt_rssi_state)) && turn_on) {
1245 type = type + 100; /* for WiFi RSSI low or BT RSSI low */
1248 coex_dm->cur_ps_tdma_on = turn_on;
1249 coex_dm->cur_ps_tdma = type;
1252 if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1253 (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1260 /* halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); */
1261 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1262 0x3c, 0x03, 0xf1, 0x90);
1265 /* halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90); */
1266 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1267 0x2d, 0x03, 0xf1, 0x90);
1270 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1271 0x1c, 0x3, 0xf1, 0x90);
1274 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1275 0x10, 0x03, 0xf1, 0x90);
1278 /* halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90); */
1279 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1280 0x3c, 0x3, 0x70, 0x90);
1283 /* halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3, 0x12, 0x12, 0x60, 0x90); */
1284 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1285 0x2d, 0x3, 0x70, 0x90);
1288 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1289 0x1c, 0x3, 0x70, 0x90);
1292 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xa3,
1293 0x10, 0x3, 0x70, 0x90);
1296 /* halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); */
1297 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1298 0x3c, 0x03, 0xf1, 0x90);
1301 /* halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90); */
1302 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1303 0x2d, 0x03, 0xf1, 0x90);
1306 /* halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3, 0xa, 0xa, 0xe1, 0x90); */
1307 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1308 0x1c, 0x3, 0xf1, 0x90);
1311 /* halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90); */
1312 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1313 0x10, 0x3, 0xf1, 0x90);
1316 /* halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90); */
1317 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1318 0x3c, 0x3, 0x70, 0x90);
1321 /* halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3, 0x12, 0x12, 0x60, 0x90); */
1322 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1323 0x2d, 0x3, 0x70, 0x90);
1326 /* halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3, 0xa, 0xa, 0x60, 0x90); */
1327 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1328 0x1c, 0x3, 0x70, 0x90);
1331 /* halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3, 0x5, 0x5, 0x60, 0x90); */
1332 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1333 0x10, 0x3, 0x70, 0x90);
1336 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xa3,
1337 0x2f, 0x2f, 0x60, 0x90);
1340 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1341 0x5, 0x5, 0xe1, 0x90);
1344 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1345 0x25, 0x25, 0xe1, 0x90);
1348 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1349 0x25, 0x25, 0x60, 0x90);
1352 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1353 0x15, 0x03, 0x70, 0x90);
1356 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1357 0x1e, 0x03, 0xf0, 0x14);
1361 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xd3,
1362 0x3c, 0x03, 0x70, 0x50);
1364 /* case25/case125 : for lenovo bt pan tp degrade<30% while wifi downlink */
1366 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1367 0x14, 0x03, 0xf1, 0x90);
1370 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1371 0x30, 0x03, 0xf1, 0x90);
1374 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xd3,
1375 0x23, 0x03, 0x70, 0x50);
1378 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xd3,
1379 0x1e, 0x03, 0x70, 0x50);
1382 /* halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90); */
1384 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1385 0x3c, 0x03, 0xf1, 0x90);
1390 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xd3,
1391 0x3a, 0x03, 0x70, 0x50);
1397 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xd3,
1398 0x2d, 0x03, 0x70, 0x50);
1404 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xd3,
1405 0x1c, 0x03, 0x70, 0x50);
1411 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xd3,
1412 0x10, 0x03, 0x70, 0x50);
1415 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1416 0x3c, 0x03, 0xf1, 0x90);
1419 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1420 0x3c, 0x03, 0x70, 0x90);
1423 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1424 0x15, 0x03, 0x70, 0x90);
1428 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xe3,
1429 0x35, 0x03, 0x71, 0x11);
1432 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xd3,
1433 0x1c, 0x03, 0x70, 0x54);
1435 /* case25/case125 : for lenovo bt pan tp degrade<30% while wifi downlink */
1437 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xd3,
1438 0x14, 0x03, 0x70, 0x50);
1441 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xd3,
1442 0x30, 0x03, 0x70, 0x50);
1445 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0xd3,
1446 0x28, 0x03, 0x70, 0x50);
1450 /* disable PS tdma */
1453 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0x0,
1454 0x0, 0x0, 0x40, 0x0);
1457 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0x0,
1458 0x0, 0x0, 0x48, 0x0);
1461 halbtc8821a2ant_set_fw_pstdma(btcoexist, 0x0,
1462 0x0, 0x0, 0x40, 0x0);
1467 /* update pre state */
1468 coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1469 coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1472 void halbtc8821a2ant_ps_tdma_check_for_power_save_state(
1473 IN struct btc_coexist *btcoexist, IN boolean new_ps_state)
1477 btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1479 if (lps_mode) { /* already under LPS state */
1481 /* keep state under LPS, do nothing. */
1483 /* will leave LPS state, turn off psTdma first */
1484 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
1487 } else { /* NO PS state */
1489 /* will enter LPS state, turn off psTdma first */
1490 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
1493 /* keep state under NO PS state, do nothing. */
1498 void halbtc8821a2ant_power_save_state(IN struct btc_coexist *btcoexist,
1499 IN u8 ps_type, IN u8 lps_val, IN u8 rpwm_val)
1501 boolean low_pwr_disable = false;
1504 case BTC_PS_WIFI_NATIVE:
1505 /* recover to original 32k low power setting */
1506 low_pwr_disable = false;
1507 btcoexist->btc_set(btcoexist,
1508 BTC_SET_ACT_DISABLE_LOW_POWER,
1510 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS,
1512 coex_sta->force_lps_on = false;
1515 halbtc8821a2ant_ps_tdma_check_for_power_save_state(
1517 halbtc8821a2ant_lps_rpwm(btcoexist, NORMAL_EXEC,
1519 /* when coex force to enter LPS, do not enter 32k low power. */
1520 low_pwr_disable = true;
1521 btcoexist->btc_set(btcoexist,
1522 BTC_SET_ACT_DISABLE_LOW_POWER,
1524 /* power save must executed before psTdma. */
1525 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS,
1527 coex_sta->force_lps_on = true;
1529 case BTC_PS_LPS_OFF:
1530 halbtc8821a2ant_ps_tdma_check_for_power_save_state(
1532 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS,
1534 coex_sta->force_lps_on = false;
1542 void halbtc8821a2ant_coex_all_off(IN struct btc_coexist *btcoexist)
1545 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
1547 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1548 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1549 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1552 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
1553 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1556 /* btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); */
1557 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1560 void halbtc8821a2ant_coex_under_5g(IN struct btc_coexist *btcoexist)
1562 halbtc8821a2ant_coex_all_off(btcoexist);
1564 halbtc8821a2ant_ignore_wlan_act(btcoexist, NORMAL_EXEC, true);
1567 void halbtc8821a2ant_init_coex_dm(IN struct btc_coexist *btcoexist)
1569 /* force to reset coex mechanism */
1570 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1572 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
1574 halbtc8821a2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1);
1575 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
1576 halbtc8821a2ant_dec_bt_pwr(btcoexist, FORCE_EXEC, 0);
1578 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
1579 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1582 void halbtc8821a2ant_action_bt_inquiry(IN struct btc_coexist *btcoexist)
1584 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
1585 boolean wifi_connected = false;
1586 boolean low_pwr_disable = true;
1587 boolean scan = false, link = false, roam = false;
1590 wifi_rssi_state = halbtc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15,
1592 wifi_rssi_state1 = halbtc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
1593 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
1594 bt_rssi_state = halbtc8821a2ant_bt_rssi_state(2,
1595 BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
1597 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1599 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1602 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
1603 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
1604 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
1607 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
1610 if (scan || link || roam) {
1611 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1612 "[BTCoex], Wifi link process + BT Inq/Page!!\n");
1613 BTC_TRACE(trace_buf);
1614 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
1616 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1617 } else if (wifi_connected) {
1618 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1619 "[BTCoex], Wifi connected + BT Inq/Page!!\n");
1620 BTC_TRACE(trace_buf);
1621 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
1623 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1625 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1626 "[BTCoex], Wifi no-link + BT Inq/Page!!\n");
1627 BTC_TRACE(trace_buf);
1628 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1629 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1632 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
1633 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1635 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
1636 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1641 void halbtc8821a2ant_action_wifi_link_process(IN struct btc_coexist *btcoexist)
1645 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
1646 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1648 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
1649 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1653 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
1654 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x76e);
1656 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1657 "############# [BTCoex], 0x765=0x%x, 0x76e=0x%x\n", u8tmpa,
1659 BTC_TRACE(trace_buf);
1662 boolean halbtc8821a2ant_action_wifi_idle_process(IN struct btc_coexist
1665 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
1668 wifi_rssi_state = halbtc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15,
1670 /* wifi_rssi_state1 = halbtc8821a2ant_wifi_rssi_state(btcoexist, 1, 2, BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0); */
1671 wifi_rssi_state1 = halbtc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
1672 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES - 20, 0);
1673 bt_rssi_state = halbtc8821a2ant_bt_rssi_state(2,
1674 BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
1676 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
1678 /* define the office environment */
1679 if (BTC_RSSI_HIGH(wifi_rssi_state1) &&
1680 (coex_sta->hid_exist == true) &&
1681 (coex_sta->a2dp_exist == true)) {
1683 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1684 "[BTCoex], Wifi idle process for BT HID+A2DP exist!!\n");
1685 BTC_TRACE(trace_buf);
1687 halbtc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x6);
1688 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1691 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false, false,
1693 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false, false,
1696 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1698 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1700 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1706 else if (coex_sta->pan_exist == true) {
1708 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1709 "[BTCoex], Wifi idle process for BT PAN exist!!\n");
1710 BTC_TRACE(trace_buf);
1712 halbtc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x6);
1713 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1716 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false, false,
1718 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false, false,
1721 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1723 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1725 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1731 halbtc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x18);
1740 boolean halbtc8821a2ant_is_common_action(IN struct btc_coexist *btcoexist)
1742 boolean common = false, wifi_connected = false, wifi_busy = false;
1743 boolean bt_hs_on = false, low_pwr_disable = false;
1745 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
1746 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1748 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1750 if (!wifi_connected) {
1751 low_pwr_disable = false;
1752 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1754 halbtc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
1757 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1758 "[BTCoex], Wifi non-connected idle!!\n");
1759 BTC_TRACE(trace_buf);
1761 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
1763 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1765 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1767 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1768 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1769 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1771 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false, false,
1773 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false, false,
1778 if (BT_8821A_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
1779 coex_dm->bt_status) {
1780 low_pwr_disable = false;
1781 btcoexist->btc_set(btcoexist,
1782 BTC_SET_ACT_DISABLE_LOW_POWER,
1784 halbtc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC,
1787 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1788 "[BTCoex], Wifi connected + BT non connected-idle!!\n");
1789 BTC_TRACE(trace_buf);
1791 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
1793 halbtc8821a2ant_coex_table_with_type(btcoexist,
1796 halbtc8821a2ant_power_save_state(btcoexist,
1797 BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1798 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
1800 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
1802 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1804 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false,
1807 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
1811 } else if (BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE ==
1812 coex_dm->bt_status) {
1813 low_pwr_disable = true;
1814 btcoexist->btc_set(btcoexist,
1815 BTC_SET_ACT_DISABLE_LOW_POWER,
1820 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1821 "[BTCoex], Wifi connected + BT connected-idle!!\n");
1822 BTC_TRACE(trace_buf);
1823 halbtc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC,
1826 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
1828 halbtc8821a2ant_coex_table_with_type(btcoexist,
1831 halbtc8821a2ant_power_save_state(btcoexist,
1832 BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1833 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
1835 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
1837 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1839 halbtc8821a2ant_sw_mechanism1(btcoexist, true, false,
1841 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
1846 low_pwr_disable = true;
1847 btcoexist->btc_set(btcoexist,
1848 BTC_SET_ACT_DISABLE_LOW_POWER,
1852 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1853 "[BTCoex], Wifi Connected-Busy + BT Busy!!\n");
1854 BTC_TRACE(trace_buf);
1856 /* common = halbtc8821a2ant_action_wifi_idle_process(btcoexist); */
1858 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
1859 "[BTCoex], Wifi Connected-Idle + BT Busy!!\n");
1860 BTC_TRACE(trace_buf);
1861 /* common = false; */
1862 common = halbtc8821a2ant_action_wifi_idle_process(
1870 void halbtc8821a2ant_tdma_duration_adjust(IN struct btc_coexist *btcoexist,
1871 IN boolean sco_hid, IN boolean tx_pause, IN u8 max_interval)
1873 static s32 up, dn, m, n, wait_count;
1874 s32 result; /* 0: no change, +1: increase WiFi duration, -1: decrease WiFi duration */
1877 if (!coex_dm->auto_tdma_adjust) {
1878 coex_dm->auto_tdma_adjust = true;
1882 if (max_interval == 1) {
1883 halbtc8821a2ant_ps_tdma(
1884 btcoexist, NORMAL_EXEC,
1886 coex_dm->ps_tdma_du_adj_type =
1888 } else if (max_interval == 2) {
1889 halbtc8821a2ant_ps_tdma(
1890 btcoexist, NORMAL_EXEC,
1892 coex_dm->ps_tdma_du_adj_type =
1894 } else if (max_interval == 3) {
1895 halbtc8821a2ant_ps_tdma(
1896 btcoexist, NORMAL_EXEC,
1898 coex_dm->ps_tdma_du_adj_type =
1901 halbtc8821a2ant_ps_tdma(
1902 btcoexist, NORMAL_EXEC,
1904 coex_dm->ps_tdma_du_adj_type =
1908 if (max_interval == 1) {
1909 halbtc8821a2ant_ps_tdma(
1910 btcoexist, NORMAL_EXEC,
1912 coex_dm->ps_tdma_du_adj_type =
1914 } else if (max_interval == 2) {
1915 halbtc8821a2ant_ps_tdma(
1916 btcoexist, NORMAL_EXEC,
1918 coex_dm->ps_tdma_du_adj_type =
1920 } else if (max_interval == 3) {
1921 halbtc8821a2ant_ps_tdma(
1922 btcoexist, NORMAL_EXEC,
1924 coex_dm->ps_tdma_du_adj_type =
1927 halbtc8821a2ant_ps_tdma(
1928 btcoexist, NORMAL_EXEC,
1930 coex_dm->ps_tdma_du_adj_type =
1936 if (max_interval == 1) {
1937 halbtc8821a2ant_ps_tdma(
1938 btcoexist, NORMAL_EXEC,
1940 coex_dm->ps_tdma_du_adj_type =
1942 } else if (max_interval == 2) {
1943 halbtc8821a2ant_ps_tdma(
1944 btcoexist, NORMAL_EXEC,
1946 coex_dm->ps_tdma_du_adj_type =
1948 } else if (max_interval == 3) {
1949 halbtc8821a2ant_ps_tdma(
1950 btcoexist, NORMAL_EXEC,
1952 coex_dm->ps_tdma_du_adj_type =
1955 halbtc8821a2ant_ps_tdma(
1956 btcoexist, NORMAL_EXEC,
1958 coex_dm->ps_tdma_du_adj_type =
1962 if (max_interval == 1) {
1963 halbtc8821a2ant_ps_tdma(
1964 btcoexist, NORMAL_EXEC,
1966 coex_dm->ps_tdma_du_adj_type =
1968 } else if (max_interval == 2) {
1969 halbtc8821a2ant_ps_tdma(
1970 btcoexist, NORMAL_EXEC,
1972 coex_dm->ps_tdma_du_adj_type =
1974 } else if (max_interval == 3) {
1975 halbtc8821a2ant_ps_tdma(
1976 btcoexist, NORMAL_EXEC,
1978 coex_dm->ps_tdma_du_adj_type =
1981 halbtc8821a2ant_ps_tdma(
1982 btcoexist, NORMAL_EXEC,
1984 coex_dm->ps_tdma_du_adj_type =
1998 /* acquire the BT TRx retry count from BT_Info byte2 */
1999 retry_count = coex_sta->bt_retry_cnt;
2004 0) { /* no retry in the last 2-second duration */
2011 if (up >= n) { /* if ³sÄò n Ó2¬í retry count¬°0, «h½Õ¼eWiFi duration */
2018 } else if (retry_count <=
2019 3) { /* <=3 retry in the last 2-second duration */
2026 if (dn == 2) { /* if ³sÄò 2 Ó2¬í retry count< 3, «h½Õ¯¶WiFi duration */
2027 if (wait_count <= 2)
2028 m++; /* ÁקK¤@ª½¦b¨âÓlevel¤¤¨Ó¦^ */
2032 if (m >= 20) /* m ³Ì¤jÈ = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration. */
2041 } else { /* retry count > 3, ¥un1¦¸ retry count > 3, «h½Õ¯¶WiFi duration */
2042 if (wait_count == 1)
2043 m++; /* ÁקK¤@ª½¦b¨âÓlevel¤¤¨Ó¦^ */
2047 if (m >= 20) /* m ³Ì¤jÈ = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration. */
2057 if (max_interval == 1) {
2059 if (coex_dm->cur_ps_tdma == 71) {
2060 halbtc8821a2ant_ps_tdma(btcoexist,
2061 NORMAL_EXEC, true, 5);
2062 coex_dm->ps_tdma_du_adj_type = 5;
2063 } else if (coex_dm->cur_ps_tdma == 1) {
2064 halbtc8821a2ant_ps_tdma(btcoexist,
2065 NORMAL_EXEC, true, 5);
2066 coex_dm->ps_tdma_du_adj_type = 5;
2067 } else if (coex_dm->cur_ps_tdma == 2) {
2068 halbtc8821a2ant_ps_tdma(btcoexist,
2069 NORMAL_EXEC, true, 6);
2070 coex_dm->ps_tdma_du_adj_type = 6;
2071 } else if (coex_dm->cur_ps_tdma == 3) {
2072 halbtc8821a2ant_ps_tdma(btcoexist,
2073 NORMAL_EXEC, true, 7);
2074 coex_dm->ps_tdma_du_adj_type = 7;
2075 } else if (coex_dm->cur_ps_tdma == 4) {
2076 halbtc8821a2ant_ps_tdma(btcoexist,
2077 NORMAL_EXEC, true, 8);
2078 coex_dm->ps_tdma_du_adj_type = 8;
2080 if (coex_dm->cur_ps_tdma == 9) {
2081 halbtc8821a2ant_ps_tdma(btcoexist,
2082 NORMAL_EXEC, true, 13);
2083 coex_dm->ps_tdma_du_adj_type = 13;
2084 } else if (coex_dm->cur_ps_tdma == 10) {
2085 halbtc8821a2ant_ps_tdma(btcoexist,
2086 NORMAL_EXEC, true, 14);
2087 coex_dm->ps_tdma_du_adj_type = 14;
2088 } else if (coex_dm->cur_ps_tdma == 11) {
2089 halbtc8821a2ant_ps_tdma(btcoexist,
2090 NORMAL_EXEC, true, 15);
2091 coex_dm->ps_tdma_du_adj_type = 15;
2092 } else if (coex_dm->cur_ps_tdma == 12) {
2093 halbtc8821a2ant_ps_tdma(btcoexist,
2094 NORMAL_EXEC, true, 16);
2095 coex_dm->ps_tdma_du_adj_type = 16;
2099 if (coex_dm->cur_ps_tdma == 5) {
2100 halbtc8821a2ant_ps_tdma(
2101 btcoexist, NORMAL_EXEC,
2103 coex_dm->ps_tdma_du_adj_type =
2105 } else if (coex_dm->cur_ps_tdma == 6) {
2106 halbtc8821a2ant_ps_tdma(
2107 btcoexist, NORMAL_EXEC,
2109 coex_dm->ps_tdma_du_adj_type =
2111 } else if (coex_dm->cur_ps_tdma == 7) {
2112 halbtc8821a2ant_ps_tdma(
2113 btcoexist, NORMAL_EXEC,
2115 coex_dm->ps_tdma_du_adj_type =
2117 } else if (coex_dm->cur_ps_tdma == 13) {
2118 halbtc8821a2ant_ps_tdma(
2119 btcoexist, NORMAL_EXEC,
2121 coex_dm->ps_tdma_du_adj_type =
2123 } else if (coex_dm->cur_ps_tdma == 14) {
2124 halbtc8821a2ant_ps_tdma(
2125 btcoexist, NORMAL_EXEC,
2127 coex_dm->ps_tdma_du_adj_type =
2129 } else if (coex_dm->cur_ps_tdma == 15) {
2130 halbtc8821a2ant_ps_tdma(
2131 btcoexist, NORMAL_EXEC,
2133 coex_dm->ps_tdma_du_adj_type =
2136 } else if (result == 1) {
2137 if (coex_dm->cur_ps_tdma == 8) {
2138 halbtc8821a2ant_ps_tdma(
2139 btcoexist, NORMAL_EXEC,
2141 coex_dm->ps_tdma_du_adj_type =
2143 } else if (coex_dm->cur_ps_tdma == 7) {
2144 halbtc8821a2ant_ps_tdma(
2145 btcoexist, NORMAL_EXEC,
2147 coex_dm->ps_tdma_du_adj_type =
2149 } else if (coex_dm->cur_ps_tdma == 6) {
2150 halbtc8821a2ant_ps_tdma(
2151 btcoexist, NORMAL_EXEC,
2153 coex_dm->ps_tdma_du_adj_type =
2155 } else if (coex_dm->cur_ps_tdma == 16) {
2156 halbtc8821a2ant_ps_tdma(
2157 btcoexist, NORMAL_EXEC,
2159 coex_dm->ps_tdma_du_adj_type =
2161 } else if (coex_dm->cur_ps_tdma == 15) {
2162 halbtc8821a2ant_ps_tdma(
2163 btcoexist, NORMAL_EXEC,
2165 coex_dm->ps_tdma_du_adj_type =
2167 } else if (coex_dm->cur_ps_tdma == 14) {
2168 halbtc8821a2ant_ps_tdma(
2169 btcoexist, NORMAL_EXEC,
2171 coex_dm->ps_tdma_du_adj_type =
2176 if (coex_dm->cur_ps_tdma == 5) {
2177 halbtc8821a2ant_ps_tdma(btcoexist,
2178 NORMAL_EXEC, true, 71);
2179 coex_dm->ps_tdma_du_adj_type = 71;
2180 } else if (coex_dm->cur_ps_tdma == 6) {
2181 halbtc8821a2ant_ps_tdma(btcoexist,
2182 NORMAL_EXEC, true, 2);
2183 coex_dm->ps_tdma_du_adj_type = 2;
2184 } else if (coex_dm->cur_ps_tdma == 7) {
2185 halbtc8821a2ant_ps_tdma(btcoexist,
2186 NORMAL_EXEC, true, 3);
2187 coex_dm->ps_tdma_du_adj_type = 3;
2188 } else if (coex_dm->cur_ps_tdma == 8) {
2189 halbtc8821a2ant_ps_tdma(btcoexist,
2190 NORMAL_EXEC, true, 4);
2191 coex_dm->ps_tdma_du_adj_type = 4;
2193 if (coex_dm->cur_ps_tdma == 13) {
2194 halbtc8821a2ant_ps_tdma(btcoexist,
2195 NORMAL_EXEC, true, 9);
2196 coex_dm->ps_tdma_du_adj_type = 9;
2197 } else if (coex_dm->cur_ps_tdma == 14) {
2198 halbtc8821a2ant_ps_tdma(btcoexist,
2199 NORMAL_EXEC, true, 10);
2200 coex_dm->ps_tdma_du_adj_type = 10;
2201 } else if (coex_dm->cur_ps_tdma == 15) {
2202 halbtc8821a2ant_ps_tdma(btcoexist,
2203 NORMAL_EXEC, true, 11);
2204 coex_dm->ps_tdma_du_adj_type = 11;
2205 } else if (coex_dm->cur_ps_tdma == 16) {
2206 halbtc8821a2ant_ps_tdma(btcoexist,
2207 NORMAL_EXEC, true, 12);
2208 coex_dm->ps_tdma_du_adj_type = 12;
2212 if (coex_dm->cur_ps_tdma == 71) {
2213 halbtc8821a2ant_ps_tdma(
2214 btcoexist, NORMAL_EXEC,
2216 coex_dm->ps_tdma_du_adj_type =
2218 } else if (coex_dm->cur_ps_tdma == 1) {
2219 halbtc8821a2ant_ps_tdma(
2220 btcoexist, NORMAL_EXEC,
2222 coex_dm->ps_tdma_du_adj_type =
2224 } else if (coex_dm->cur_ps_tdma == 2) {
2225 halbtc8821a2ant_ps_tdma(
2226 btcoexist, NORMAL_EXEC,
2228 coex_dm->ps_tdma_du_adj_type =
2230 } else if (coex_dm->cur_ps_tdma == 3) {
2231 halbtc8821a2ant_ps_tdma(
2232 btcoexist, NORMAL_EXEC,
2234 coex_dm->ps_tdma_du_adj_type =
2236 } else if (coex_dm->cur_ps_tdma == 9) {
2237 halbtc8821a2ant_ps_tdma(
2238 btcoexist, NORMAL_EXEC,
2240 coex_dm->ps_tdma_du_adj_type =
2242 } else if (coex_dm->cur_ps_tdma == 10) {
2243 halbtc8821a2ant_ps_tdma(
2244 btcoexist, NORMAL_EXEC,
2246 coex_dm->ps_tdma_du_adj_type =
2248 } else if (coex_dm->cur_ps_tdma == 11) {
2249 halbtc8821a2ant_ps_tdma(
2250 btcoexist, NORMAL_EXEC,
2252 coex_dm->ps_tdma_du_adj_type =
2255 } else if (result == 1) {
2256 if (coex_dm->cur_ps_tdma == 4) {
2257 halbtc8821a2ant_ps_tdma(
2258 btcoexist, NORMAL_EXEC,
2260 coex_dm->ps_tdma_du_adj_type =
2262 } else if (coex_dm->cur_ps_tdma == 3) {
2263 halbtc8821a2ant_ps_tdma(
2264 btcoexist, NORMAL_EXEC,
2266 coex_dm->ps_tdma_du_adj_type =
2268 } else if (coex_dm->cur_ps_tdma == 2) {
2269 halbtc8821a2ant_ps_tdma(
2270 btcoexist, NORMAL_EXEC,
2272 coex_dm->ps_tdma_du_adj_type =
2274 } else if (coex_dm->cur_ps_tdma == 1) {
2275 halbtc8821a2ant_ps_tdma(
2276 btcoexist, NORMAL_EXEC,
2278 coex_dm->ps_tdma_du_adj_type =
2280 } else if (coex_dm->cur_ps_tdma == 12) {
2281 halbtc8821a2ant_ps_tdma(
2282 btcoexist, NORMAL_EXEC,
2284 coex_dm->ps_tdma_du_adj_type =
2286 } else if (coex_dm->cur_ps_tdma == 11) {
2287 halbtc8821a2ant_ps_tdma(
2288 btcoexist, NORMAL_EXEC,
2290 coex_dm->ps_tdma_du_adj_type =
2292 } else if (coex_dm->cur_ps_tdma == 10) {
2293 halbtc8821a2ant_ps_tdma(
2294 btcoexist, NORMAL_EXEC,
2296 coex_dm->ps_tdma_du_adj_type =
2301 } else if (max_interval == 2) {
2303 if (coex_dm->cur_ps_tdma == 1) {
2304 halbtc8821a2ant_ps_tdma(btcoexist,
2305 NORMAL_EXEC, true, 6);
2306 coex_dm->ps_tdma_du_adj_type = 6;
2307 } else if (coex_dm->cur_ps_tdma == 2) {
2308 halbtc8821a2ant_ps_tdma(btcoexist,
2309 NORMAL_EXEC, true, 6);
2310 coex_dm->ps_tdma_du_adj_type = 6;
2311 } else if (coex_dm->cur_ps_tdma == 3) {
2312 halbtc8821a2ant_ps_tdma(btcoexist,
2313 NORMAL_EXEC, true, 7);
2314 coex_dm->ps_tdma_du_adj_type = 7;
2315 } else if (coex_dm->cur_ps_tdma == 4) {
2316 halbtc8821a2ant_ps_tdma(btcoexist,
2317 NORMAL_EXEC, true, 8);
2318 coex_dm->ps_tdma_du_adj_type = 8;
2320 if (coex_dm->cur_ps_tdma == 9) {
2321 halbtc8821a2ant_ps_tdma(btcoexist,
2322 NORMAL_EXEC, true, 14);
2323 coex_dm->ps_tdma_du_adj_type = 14;
2324 } else if (coex_dm->cur_ps_tdma == 10) {
2325 halbtc8821a2ant_ps_tdma(btcoexist,
2326 NORMAL_EXEC, true, 14);
2327 coex_dm->ps_tdma_du_adj_type = 14;
2328 } else if (coex_dm->cur_ps_tdma == 11) {
2329 halbtc8821a2ant_ps_tdma(btcoexist,
2330 NORMAL_EXEC, true, 15);
2331 coex_dm->ps_tdma_du_adj_type = 15;
2332 } else if (coex_dm->cur_ps_tdma == 12) {
2333 halbtc8821a2ant_ps_tdma(btcoexist,
2334 NORMAL_EXEC, true, 16);
2335 coex_dm->ps_tdma_du_adj_type = 16;
2338 if (coex_dm->cur_ps_tdma == 5) {
2339 halbtc8821a2ant_ps_tdma(
2340 btcoexist, NORMAL_EXEC,
2342 coex_dm->ps_tdma_du_adj_type =
2344 } else if (coex_dm->cur_ps_tdma == 6) {
2345 halbtc8821a2ant_ps_tdma(
2346 btcoexist, NORMAL_EXEC,
2348 coex_dm->ps_tdma_du_adj_type =
2350 } else if (coex_dm->cur_ps_tdma == 7) {
2351 halbtc8821a2ant_ps_tdma(
2352 btcoexist, NORMAL_EXEC,
2354 coex_dm->ps_tdma_du_adj_type =
2356 } else if (coex_dm->cur_ps_tdma == 13) {
2357 halbtc8821a2ant_ps_tdma(
2358 btcoexist, NORMAL_EXEC,
2360 coex_dm->ps_tdma_du_adj_type =
2362 } else if (coex_dm->cur_ps_tdma == 14) {
2363 halbtc8821a2ant_ps_tdma(
2364 btcoexist, NORMAL_EXEC,
2366 coex_dm->ps_tdma_du_adj_type =
2368 } else if (coex_dm->cur_ps_tdma == 15) {
2369 halbtc8821a2ant_ps_tdma(
2370 btcoexist, NORMAL_EXEC,
2372 coex_dm->ps_tdma_du_adj_type =
2375 } else if (result == 1) {
2376 if (coex_dm->cur_ps_tdma == 8) {
2377 halbtc8821a2ant_ps_tdma(
2378 btcoexist, NORMAL_EXEC,
2380 coex_dm->ps_tdma_du_adj_type =
2382 } else if (coex_dm->cur_ps_tdma == 7) {
2383 halbtc8821a2ant_ps_tdma(
2384 btcoexist, NORMAL_EXEC,
2386 coex_dm->ps_tdma_du_adj_type =
2388 } else if (coex_dm->cur_ps_tdma == 6) {
2389 halbtc8821a2ant_ps_tdma(
2390 btcoexist, NORMAL_EXEC,
2392 coex_dm->ps_tdma_du_adj_type =
2394 } else if (coex_dm->cur_ps_tdma == 16) {
2395 halbtc8821a2ant_ps_tdma(
2396 btcoexist, NORMAL_EXEC,
2398 coex_dm->ps_tdma_du_adj_type =
2400 } else if (coex_dm->cur_ps_tdma == 15) {
2401 halbtc8821a2ant_ps_tdma(
2402 btcoexist, NORMAL_EXEC,
2404 coex_dm->ps_tdma_du_adj_type =
2406 } else if (coex_dm->cur_ps_tdma == 14) {
2407 halbtc8821a2ant_ps_tdma(
2408 btcoexist, NORMAL_EXEC,
2410 coex_dm->ps_tdma_du_adj_type =
2415 if (coex_dm->cur_ps_tdma == 5) {
2416 halbtc8821a2ant_ps_tdma(btcoexist,
2417 NORMAL_EXEC, true, 2);
2418 coex_dm->ps_tdma_du_adj_type = 2;
2419 } else if (coex_dm->cur_ps_tdma == 6) {
2420 halbtc8821a2ant_ps_tdma(btcoexist,
2421 NORMAL_EXEC, true, 2);
2422 coex_dm->ps_tdma_du_adj_type = 2;
2423 } else if (coex_dm->cur_ps_tdma == 7) {
2424 halbtc8821a2ant_ps_tdma(btcoexist,
2425 NORMAL_EXEC, true, 3);
2426 coex_dm->ps_tdma_du_adj_type = 3;
2427 } else if (coex_dm->cur_ps_tdma == 8) {
2428 halbtc8821a2ant_ps_tdma(btcoexist,
2429 NORMAL_EXEC, true, 4);
2430 coex_dm->ps_tdma_du_adj_type = 4;
2432 if (coex_dm->cur_ps_tdma == 13) {
2433 halbtc8821a2ant_ps_tdma(btcoexist,
2434 NORMAL_EXEC, true, 10);
2435 coex_dm->ps_tdma_du_adj_type = 10;
2436 } else if (coex_dm->cur_ps_tdma == 14) {
2437 halbtc8821a2ant_ps_tdma(btcoexist,
2438 NORMAL_EXEC, true, 10);
2439 coex_dm->ps_tdma_du_adj_type = 10;
2440 } else if (coex_dm->cur_ps_tdma == 15) {
2441 halbtc8821a2ant_ps_tdma(btcoexist,
2442 NORMAL_EXEC, true, 11);
2443 coex_dm->ps_tdma_du_adj_type = 11;
2444 } else if (coex_dm->cur_ps_tdma == 16) {
2445 halbtc8821a2ant_ps_tdma(btcoexist,
2446 NORMAL_EXEC, true, 12);
2447 coex_dm->ps_tdma_du_adj_type = 12;
2450 if (coex_dm->cur_ps_tdma == 1) {
2451 halbtc8821a2ant_ps_tdma(
2452 btcoexist, NORMAL_EXEC,
2454 coex_dm->ps_tdma_du_adj_type =
2456 } else if (coex_dm->cur_ps_tdma == 2) {
2457 halbtc8821a2ant_ps_tdma(
2458 btcoexist, NORMAL_EXEC,
2460 coex_dm->ps_tdma_du_adj_type =
2462 } else if (coex_dm->cur_ps_tdma == 3) {
2463 halbtc8821a2ant_ps_tdma(
2464 btcoexist, NORMAL_EXEC,
2466 coex_dm->ps_tdma_du_adj_type =
2468 } else if (coex_dm->cur_ps_tdma == 9) {
2469 halbtc8821a2ant_ps_tdma(
2470 btcoexist, NORMAL_EXEC,
2472 coex_dm->ps_tdma_du_adj_type =
2474 } else if (coex_dm->cur_ps_tdma == 10) {
2475 halbtc8821a2ant_ps_tdma(
2476 btcoexist, NORMAL_EXEC,
2478 coex_dm->ps_tdma_du_adj_type =
2480 } else if (coex_dm->cur_ps_tdma == 11) {
2481 halbtc8821a2ant_ps_tdma(
2482 btcoexist, NORMAL_EXEC,
2484 coex_dm->ps_tdma_du_adj_type =
2487 } else if (result == 1) {
2488 if (coex_dm->cur_ps_tdma == 4) {
2489 halbtc8821a2ant_ps_tdma(
2490 btcoexist, NORMAL_EXEC,
2492 coex_dm->ps_tdma_du_adj_type =
2494 } else if (coex_dm->cur_ps_tdma == 3) {
2495 halbtc8821a2ant_ps_tdma(
2496 btcoexist, NORMAL_EXEC,
2498 coex_dm->ps_tdma_du_adj_type =
2500 } else if (coex_dm->cur_ps_tdma == 2) {
2501 halbtc8821a2ant_ps_tdma(
2502 btcoexist, NORMAL_EXEC,
2504 coex_dm->ps_tdma_du_adj_type =
2506 } else if (coex_dm->cur_ps_tdma == 12) {
2507 halbtc8821a2ant_ps_tdma(
2508 btcoexist, NORMAL_EXEC,
2510 coex_dm->ps_tdma_du_adj_type =
2512 } else if (coex_dm->cur_ps_tdma == 11) {
2513 halbtc8821a2ant_ps_tdma(
2514 btcoexist, NORMAL_EXEC,
2516 coex_dm->ps_tdma_du_adj_type =
2518 } else if (coex_dm->cur_ps_tdma == 10) {
2519 halbtc8821a2ant_ps_tdma(
2520 btcoexist, NORMAL_EXEC,
2522 coex_dm->ps_tdma_du_adj_type =
2527 } else if (max_interval == 3) {
2529 if (coex_dm->cur_ps_tdma == 1) {
2530 halbtc8821a2ant_ps_tdma(btcoexist,
2531 NORMAL_EXEC, true, 7);
2532 coex_dm->ps_tdma_du_adj_type = 7;
2533 } else if (coex_dm->cur_ps_tdma == 2) {
2534 halbtc8821a2ant_ps_tdma(btcoexist,
2535 NORMAL_EXEC, true, 7);
2536 coex_dm->ps_tdma_du_adj_type = 7;
2537 } else if (coex_dm->cur_ps_tdma == 3) {
2538 halbtc8821a2ant_ps_tdma(btcoexist,
2539 NORMAL_EXEC, true, 7);
2540 coex_dm->ps_tdma_du_adj_type = 7;
2541 } else if (coex_dm->cur_ps_tdma == 4) {
2542 halbtc8821a2ant_ps_tdma(btcoexist,
2543 NORMAL_EXEC, true, 8);
2544 coex_dm->ps_tdma_du_adj_type = 8;
2546 if (coex_dm->cur_ps_tdma == 9) {
2547 halbtc8821a2ant_ps_tdma(btcoexist,
2548 NORMAL_EXEC, true, 15);
2549 coex_dm->ps_tdma_du_adj_type = 15;
2550 } else if (coex_dm->cur_ps_tdma == 10) {
2551 halbtc8821a2ant_ps_tdma(btcoexist,
2552 NORMAL_EXEC, true, 15);
2553 coex_dm->ps_tdma_du_adj_type = 15;
2554 } else if (coex_dm->cur_ps_tdma == 11) {
2555 halbtc8821a2ant_ps_tdma(btcoexist,
2556 NORMAL_EXEC, true, 15);
2557 coex_dm->ps_tdma_du_adj_type = 15;
2558 } else if (coex_dm->cur_ps_tdma == 12) {
2559 halbtc8821a2ant_ps_tdma(btcoexist,
2560 NORMAL_EXEC, true, 16);
2561 coex_dm->ps_tdma_du_adj_type = 16;
2564 if (coex_dm->cur_ps_tdma == 5) {
2565 halbtc8821a2ant_ps_tdma(
2566 btcoexist, NORMAL_EXEC,
2568 coex_dm->ps_tdma_du_adj_type =
2570 } else if (coex_dm->cur_ps_tdma == 6) {
2571 halbtc8821a2ant_ps_tdma(
2572 btcoexist, NORMAL_EXEC,
2574 coex_dm->ps_tdma_du_adj_type =
2576 } else if (coex_dm->cur_ps_tdma == 7) {
2577 halbtc8821a2ant_ps_tdma(
2578 btcoexist, NORMAL_EXEC,
2580 coex_dm->ps_tdma_du_adj_type =
2582 } else if (coex_dm->cur_ps_tdma == 13) {
2583 halbtc8821a2ant_ps_tdma(
2584 btcoexist, NORMAL_EXEC,
2586 coex_dm->ps_tdma_du_adj_type =
2588 } else if (coex_dm->cur_ps_tdma == 14) {
2589 halbtc8821a2ant_ps_tdma(
2590 btcoexist, NORMAL_EXEC,
2592 coex_dm->ps_tdma_du_adj_type =
2594 } else if (coex_dm->cur_ps_tdma == 15) {
2595 halbtc8821a2ant_ps_tdma(
2596 btcoexist, NORMAL_EXEC,
2598 coex_dm->ps_tdma_du_adj_type =
2601 } else if (result == 1) {
2602 if (coex_dm->cur_ps_tdma == 8) {
2603 halbtc8821a2ant_ps_tdma(
2604 btcoexist, NORMAL_EXEC,
2606 coex_dm->ps_tdma_du_adj_type =
2608 } else if (coex_dm->cur_ps_tdma == 7) {
2609 halbtc8821a2ant_ps_tdma(
2610 btcoexist, NORMAL_EXEC,
2612 coex_dm->ps_tdma_du_adj_type =
2614 } else if (coex_dm->cur_ps_tdma == 6) {
2615 halbtc8821a2ant_ps_tdma(
2616 btcoexist, NORMAL_EXEC,
2618 coex_dm->ps_tdma_du_adj_type =
2620 } else if (coex_dm->cur_ps_tdma == 16) {
2621 halbtc8821a2ant_ps_tdma(
2622 btcoexist, NORMAL_EXEC,
2624 coex_dm->ps_tdma_du_adj_type =
2626 } else if (coex_dm->cur_ps_tdma == 15) {
2627 halbtc8821a2ant_ps_tdma(
2628 btcoexist, NORMAL_EXEC,
2630 coex_dm->ps_tdma_du_adj_type =
2632 } else if (coex_dm->cur_ps_tdma == 14) {
2633 halbtc8821a2ant_ps_tdma(
2634 btcoexist, NORMAL_EXEC,
2636 coex_dm->ps_tdma_du_adj_type =
2641 if (coex_dm->cur_ps_tdma == 5) {
2642 halbtc8821a2ant_ps_tdma(btcoexist,
2643 NORMAL_EXEC, true, 3);
2644 coex_dm->ps_tdma_du_adj_type = 3;
2645 } else if (coex_dm->cur_ps_tdma == 6) {
2646 halbtc8821a2ant_ps_tdma(btcoexist,
2647 NORMAL_EXEC, true, 3);
2648 coex_dm->ps_tdma_du_adj_type = 3;
2649 } else if (coex_dm->cur_ps_tdma == 7) {
2650 halbtc8821a2ant_ps_tdma(btcoexist,
2651 NORMAL_EXEC, true, 3);
2652 coex_dm->ps_tdma_du_adj_type = 3;
2653 } else if (coex_dm->cur_ps_tdma == 8) {
2654 halbtc8821a2ant_ps_tdma(btcoexist,
2655 NORMAL_EXEC, true, 4);
2656 coex_dm->ps_tdma_du_adj_type = 4;
2658 if (coex_dm->cur_ps_tdma == 13) {
2659 halbtc8821a2ant_ps_tdma(btcoexist,
2660 NORMAL_EXEC, true, 11);
2661 coex_dm->ps_tdma_du_adj_type = 11;
2662 } else if (coex_dm->cur_ps_tdma == 14) {
2663 halbtc8821a2ant_ps_tdma(btcoexist,
2664 NORMAL_EXEC, true, 11);
2665 coex_dm->ps_tdma_du_adj_type = 11;
2666 } else if (coex_dm->cur_ps_tdma == 15) {
2667 halbtc8821a2ant_ps_tdma(btcoexist,
2668 NORMAL_EXEC, true, 11);
2669 coex_dm->ps_tdma_du_adj_type = 11;
2670 } else if (coex_dm->cur_ps_tdma == 16) {
2671 halbtc8821a2ant_ps_tdma(btcoexist,
2672 NORMAL_EXEC, true, 12);
2673 coex_dm->ps_tdma_du_adj_type = 12;
2676 if (coex_dm->cur_ps_tdma == 1) {
2677 halbtc8821a2ant_ps_tdma(
2678 btcoexist, NORMAL_EXEC,
2680 coex_dm->ps_tdma_du_adj_type =
2682 } else if (coex_dm->cur_ps_tdma == 2) {
2683 halbtc8821a2ant_ps_tdma(
2684 btcoexist, NORMAL_EXEC,
2686 coex_dm->ps_tdma_du_adj_type =
2688 } else if (coex_dm->cur_ps_tdma == 3) {
2689 halbtc8821a2ant_ps_tdma(
2690 btcoexist, NORMAL_EXEC,
2692 coex_dm->ps_tdma_du_adj_type =
2694 } else if (coex_dm->cur_ps_tdma == 9) {
2695 halbtc8821a2ant_ps_tdma(
2696 btcoexist, NORMAL_EXEC,
2698 coex_dm->ps_tdma_du_adj_type =
2700 } else if (coex_dm->cur_ps_tdma == 10) {
2701 halbtc8821a2ant_ps_tdma(
2702 btcoexist, NORMAL_EXEC,
2704 coex_dm->ps_tdma_du_adj_type =
2706 } else if (coex_dm->cur_ps_tdma == 11) {
2707 halbtc8821a2ant_ps_tdma(
2708 btcoexist, NORMAL_EXEC,
2710 coex_dm->ps_tdma_du_adj_type =
2713 } else if (result == 1) {
2714 if (coex_dm->cur_ps_tdma == 4) {
2715 halbtc8821a2ant_ps_tdma(
2716 btcoexist, NORMAL_EXEC,
2718 coex_dm->ps_tdma_du_adj_type =
2720 } else if (coex_dm->cur_ps_tdma == 3) {
2721 halbtc8821a2ant_ps_tdma(
2722 btcoexist, NORMAL_EXEC,
2724 coex_dm->ps_tdma_du_adj_type =
2726 } else if (coex_dm->cur_ps_tdma == 2) {
2727 halbtc8821a2ant_ps_tdma(
2728 btcoexist, NORMAL_EXEC,
2730 coex_dm->ps_tdma_du_adj_type =
2732 } else if (coex_dm->cur_ps_tdma == 12) {
2733 halbtc8821a2ant_ps_tdma(
2734 btcoexist, NORMAL_EXEC,
2736 coex_dm->ps_tdma_du_adj_type =
2738 } else if (coex_dm->cur_ps_tdma == 11) {
2739 halbtc8821a2ant_ps_tdma(
2740 btcoexist, NORMAL_EXEC,
2742 coex_dm->ps_tdma_du_adj_type =
2744 } else if (coex_dm->cur_ps_tdma == 10) {
2745 halbtc8821a2ant_ps_tdma(
2746 btcoexist, NORMAL_EXEC,
2748 coex_dm->ps_tdma_du_adj_type =
2756 /* if current PsTdma not match with the recorded one (when scan, dhcp...), */
2757 /* then we have to adjust it back to the previous record one. */
2758 if (coex_dm->cur_ps_tdma != coex_dm->ps_tdma_du_adj_type) {
2759 boolean scan = false, link = false, roam = false;
2761 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2762 "[BTCoex], PsTdma type dismatch!!!, cur_ps_tdma=%d, recordPsTdma=%d\n",
2763 coex_dm->cur_ps_tdma, coex_dm->ps_tdma_du_adj_type);
2764 BTC_TRACE(trace_buf);
2766 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2767 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2768 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2770 if (!scan && !link && !roam)
2771 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2772 coex_dm->ps_tdma_du_adj_type);
2774 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
2775 "[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n");
2776 BTC_TRACE(trace_buf);
2781 /* SCO only or SCO+PAN(HS) */
2782 void halbtc8821a2ant_action_sco(IN struct btc_coexist *btcoexist)
2784 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2785 u8 wifi_rssi_state, bt_rssi_state;
2788 wifi_rssi_state = halbtc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15,
2790 bt_rssi_state = halbtc8821a2ant_bt_rssi_state(2,
2791 BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
2793 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2795 halbtc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2797 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 4);
2799 if (BTC_RSSI_HIGH(bt_rssi_state))
2800 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2802 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2804 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2806 if (BTC_WIFI_BW_LEGACY == wifi_bw) /* for SCO quality at 11b/g mode */
2807 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2808 else { /* for SCO quality & wifi performance balance at 11n mode */
2809 if (BTC_WIFI_BW_HT40 == wifi_bw)
2810 halbtc8821a2ant_coex_table_with_type(btcoexist,
2813 if (bt_link_info->sco_only)
2814 halbtc8821a2ant_coex_table_with_type(btcoexist,
2817 halbtc8821a2ant_coex_table_with_type(btcoexist,
2822 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
2824 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
2825 0); /* for voice quality */
2828 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2829 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2830 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2831 halbtc8821a2ant_sw_mechanism1(btcoexist, true, true,
2833 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
2836 halbtc8821a2ant_sw_mechanism1(btcoexist, true, true,
2838 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
2842 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2843 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2844 halbtc8821a2ant_sw_mechanism1(btcoexist, false, true,
2846 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
2849 halbtc8821a2ant_sw_mechanism1(btcoexist, false, true,
2851 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
2858 void halbtc8821a2ant_action_hid(IN struct btc_coexist *btcoexist)
2860 u8 wifi_rssi_state, bt_rssi_state;
2863 btcoexist->btc_phydm_modify_RA_PCR_threshold(btcoexist, 0, 25);
2865 wifi_rssi_state = halbtc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15,
2867 bt_rssi_state = halbtc8821a2ant_bt_rssi_state(2,
2868 BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
2870 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2872 halbtc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2874 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2876 if (BTC_RSSI_HIGH(bt_rssi_state))
2877 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2879 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2881 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2883 if (BTC_WIFI_BW_LEGACY == wifi_bw) /* for HID at 11b/g mode */
2884 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2885 else /* for HID quality & wifi performance balance at 11n mode */
2886 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2888 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
2891 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 24);
2894 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2895 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2896 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2897 halbtc8821a2ant_sw_mechanism1(btcoexist, true, true,
2899 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
2902 halbtc8821a2ant_sw_mechanism1(btcoexist, true, true,
2904 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
2908 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2909 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2910 halbtc8821a2ant_sw_mechanism1(btcoexist, false, true,
2912 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
2915 halbtc8821a2ant_sw_mechanism1(btcoexist, false, true,
2917 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
2923 /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
2924 void halbtc8821a2ant_action_a2dp(IN struct btc_coexist *btcoexist)
2926 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
2930 wifi_rssi_state = halbtc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15,
2932 wifi_rssi_state1 = halbtc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
2933 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
2934 bt_rssi_state = halbtc8821a2ant_bt_rssi_state(2,
2935 BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
2937 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
2939 /* define the office environment */
2940 if ((ap_num >= 10) && BTC_RSSI_HIGH(wifi_rssi_state1) &&
2941 BTC_RSSI_HIGH(bt_rssi_state)) {
2942 /* dbg_print(" AP#>10(%d)\n", ap_num); */
2943 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2946 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
2948 halbtc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
2950 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2951 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2953 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2955 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2957 /* halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1); */
2958 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
2961 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2962 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2963 halbtc8821a2ant_sw_mechanism1(btcoexist, true, false,
2965 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
2968 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false,
2970 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
2977 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2978 halbtc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2980 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2982 if (BTC_RSSI_HIGH(bt_rssi_state))
2983 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2985 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2988 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
2989 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2990 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2993 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
2995 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3000 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3001 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3002 /* halbtc8821a2ant_tdma_duration_adjust(btcoexist, false, false, 1); */
3003 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
3005 /* halbtc8821a2ant_tdma_duration_adjust(btcoexist, false, true, 1); */
3006 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
3010 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3011 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3012 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3013 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3014 halbtc8821a2ant_sw_mechanism1(btcoexist, true, false,
3016 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3019 halbtc8821a2ant_sw_mechanism1(btcoexist, true, false,
3021 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3025 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3026 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3027 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false,
3029 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3032 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false,
3034 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3040 void halbtc8821a2ant_action_a2dp_pan_hs(IN struct btc_coexist *btcoexist)
3042 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
3045 wifi_rssi_state = halbtc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15,
3047 wifi_rssi_state1 = halbtc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
3048 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
3049 bt_rssi_state = halbtc8821a2ant_bt_rssi_state(2,
3050 BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
3052 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3054 halbtc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3056 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3058 if (BTC_RSSI_HIGH(bt_rssi_state))
3059 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3061 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3063 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
3064 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3065 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3068 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3070 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3074 halbtc8821a2ant_tdma_duration_adjust(btcoexist, false, true, 2);
3077 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3078 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3079 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3080 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3081 halbtc8821a2ant_sw_mechanism1(btcoexist, true, false,
3083 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3086 halbtc8821a2ant_sw_mechanism1(btcoexist, true, false,
3088 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3092 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3093 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3094 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false,
3096 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3099 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false,
3101 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3107 void halbtc8821a2ant_action_pan_edr(IN struct btc_coexist *btcoexist)
3109 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
3112 wifi_rssi_state = halbtc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15,
3114 wifi_rssi_state1 = halbtc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
3115 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
3116 bt_rssi_state = halbtc8821a2ant_bt_rssi_state(2,
3117 BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
3119 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3121 halbtc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3123 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3125 if (BTC_RSSI_HIGH(bt_rssi_state))
3126 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3128 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3130 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
3131 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3133 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3136 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3138 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3142 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3143 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
3144 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 26);
3146 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 26);
3149 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3150 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3151 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3152 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3153 halbtc8821a2ant_sw_mechanism1(btcoexist, true, false,
3155 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3158 halbtc8821a2ant_sw_mechanism1(btcoexist, true, false,
3160 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3164 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3165 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3166 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false,
3168 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3171 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false,
3173 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3181 void halbtc8821a2ant_action_pan_hs(IN struct btc_coexist *btcoexist)
3183 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
3186 wifi_rssi_state = halbtc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15,
3188 wifi_rssi_state1 = halbtc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
3189 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
3190 bt_rssi_state = halbtc8821a2ant_bt_rssi_state(2,
3191 BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
3193 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3195 halbtc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3197 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3199 if (BTC_RSSI_HIGH(bt_rssi_state))
3200 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3202 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3204 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3206 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
3208 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3210 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3211 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3212 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3213 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3214 halbtc8821a2ant_sw_mechanism1(btcoexist, true, false,
3216 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3219 halbtc8821a2ant_sw_mechanism1(btcoexist, true, false,
3221 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3225 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3226 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3227 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false,
3229 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3232 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false,
3234 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3241 void halbtc8821a2ant_action_pan_edr_a2dp(IN struct btc_coexist *btcoexist)
3243 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
3246 wifi_rssi_state = halbtc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15,
3248 wifi_rssi_state1 = halbtc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
3249 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
3250 bt_rssi_state = halbtc8821a2ant_bt_rssi_state(2,
3251 BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
3253 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3255 halbtc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3257 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3259 if (BTC_RSSI_HIGH(bt_rssi_state))
3260 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3262 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3264 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state))
3265 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3268 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3271 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3273 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3274 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3275 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3278 if (BTC_WIFI_BW_HT40 == wifi_bw)
3279 halbtc8821a2ant_tdma_duration_adjust(btcoexist, false,
3282 halbtc8821a2ant_tdma_duration_adjust(btcoexist, false,
3285 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3287 halbtc8821a2ant_tdma_duration_adjust(btcoexist, false, true, 3);
3291 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3292 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3293 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3294 halbtc8821a2ant_sw_mechanism1(btcoexist, true, false,
3296 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3299 halbtc8821a2ant_sw_mechanism1(btcoexist, true, false,
3301 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3305 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3306 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3307 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false,
3309 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3312 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false,
3314 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3320 void halbtc8821a2ant_action_pan_edr_hid(IN struct btc_coexist *btcoexist)
3322 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
3325 btcoexist->btc_phydm_modify_RA_PCR_threshold(btcoexist, 0, 25);
3327 wifi_rssi_state = halbtc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15,
3329 wifi_rssi_state1 = halbtc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
3330 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
3331 bt_rssi_state = halbtc8821a2ant_bt_rssi_state(2,
3332 BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
3333 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3335 halbtc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3337 if (BTC_RSSI_HIGH(bt_rssi_state))
3338 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3340 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3342 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
3343 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3344 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3347 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3349 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3353 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3354 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3355 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3356 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
3358 /* halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 11); */
3359 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
3362 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
3364 /* halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7); */
3365 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
3368 halbtc8821a2ant_tdma_duration_adjust(btcoexist, true, false, 2);
3370 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3371 /* halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 14); */
3372 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
3374 halbtc8821a2ant_tdma_duration_adjust(btcoexist, true, true, 2);
3378 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3379 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3380 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3381 halbtc8821a2ant_sw_mechanism1(btcoexist, true, true,
3383 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3386 halbtc8821a2ant_sw_mechanism1(btcoexist, true, true,
3388 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3392 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3393 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3394 halbtc8821a2ant_sw_mechanism1(btcoexist, false, true,
3396 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3399 halbtc8821a2ant_sw_mechanism1(btcoexist, false, true,
3401 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3407 /* HID+A2DP+PAN(EDR) */
3408 void halbtc8821a2ant_action_hid_a2dp_pan_edr(IN struct btc_coexist *btcoexist)
3410 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
3413 btcoexist->btc_phydm_modify_RA_PCR_threshold(btcoexist, 0, 25);
3415 wifi_rssi_state = halbtc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15,
3417 wifi_rssi_state1 = halbtc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
3418 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
3419 bt_rssi_state = halbtc8821a2ant_bt_rssi_state(2,
3420 BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
3422 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3424 halbtc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3426 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3428 if (BTC_RSSI_HIGH(bt_rssi_state))
3429 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3431 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3433 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
3434 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3435 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3438 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3440 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3444 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3446 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3447 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3448 if (BTC_WIFI_BW_HT40 == wifi_bw)
3449 halbtc8821a2ant_tdma_duration_adjust(btcoexist, true,
3452 halbtc8821a2ant_tdma_duration_adjust(btcoexist, true,
3455 halbtc8821a2ant_tdma_duration_adjust(btcoexist, true, true, 3);
3458 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3459 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3460 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3461 halbtc8821a2ant_sw_mechanism1(btcoexist, true, true,
3463 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3466 halbtc8821a2ant_sw_mechanism1(btcoexist, true, true,
3468 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3472 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3473 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3474 halbtc8821a2ant_sw_mechanism1(btcoexist, false, true,
3476 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3479 halbtc8821a2ant_sw_mechanism1(btcoexist, false, true,
3481 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3487 void halbtc8821a2ant_action_hid_a2dp(IN struct btc_coexist *btcoexist)
3489 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
3493 btcoexist->btc_phydm_modify_RA_PCR_threshold(btcoexist, 0, 25);
3495 wifi_rssi_state = halbtc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15,
3497 /* bt_rssi_state = halbtc8821a2ant_bt_rssi_state(2, 29, 0); */
3498 wifi_rssi_state1 = halbtc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
3499 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
3500 bt_rssi_state = halbtc8821a2ant_bt_rssi_state(3,
3501 BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 37);
3503 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3505 halbtc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, true, 0x6);
3507 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3509 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3510 if (BTC_WIFI_BW_LEGACY == wifi_bw) {
3511 if (BTC_RSSI_HIGH(bt_rssi_state))
3512 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3513 else if (BTC_RSSI_MEDIUM(bt_rssi_state))
3514 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3516 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3518 /* only 802.11N mode we have to dec bt power to 4 degree */
3519 if (BTC_RSSI_HIGH(bt_rssi_state)) {
3520 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
3522 /* need to check ap Number of Not */
3524 halbtc8821a2ant_dec_bt_pwr(btcoexist,
3527 halbtc8821a2ant_dec_bt_pwr(btcoexist,
3529 } else if (BTC_RSSI_MEDIUM(bt_rssi_state))
3530 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3532 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3535 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
3536 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3538 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3541 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3543 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3547 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3548 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3549 /* halbtc8821a2ant_tdma_duration_adjust(btcoexist, true, false, 3); */
3550 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 28);
3552 /* halbtc8821a2ant_tdma_duration_adjust(btcoexist, true, true, 3); */
3553 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 28);
3557 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3558 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3559 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3560 halbtc8821a2ant_sw_mechanism1(btcoexist, true, true,
3562 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3565 halbtc8821a2ant_sw_mechanism1(btcoexist, true, true,
3567 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3571 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3572 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3573 halbtc8821a2ant_sw_mechanism1(btcoexist, false, true,
3575 halbtc8821a2ant_sw_mechanism2(btcoexist, true, false,
3578 halbtc8821a2ant_sw_mechanism1(btcoexist, false, true,
3580 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false,
3586 void halbtc8821a2ant_action_bt_whck_test(IN struct btc_coexist *btcoexist)
3588 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3591 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
3592 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
3594 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
3597 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3598 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3601 void halbtc8821a2ant_action_wifi_multi_port(IN struct btc_coexist *btcoexist)
3603 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3604 halbtc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3607 halbtc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
3608 halbtc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
3611 /* btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); */
3612 halbtc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3614 halbtc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
3616 halbtc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3619 void halbtc8821a2ant_run_coexist_mechanism(IN struct btc_coexist *btcoexist)
3621 boolean wifi_under_5g = false;
3623 u32 num_of_wifi_link = 0;
3624 u32 wifi_link_status = 0;
3625 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3626 boolean miracast_plus_bt = false;
3627 boolean scan = false, link = false, roam = false;
3629 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3630 "[BTCoex], RunCoexistMechanism()===>\n");
3631 BTC_TRACE(trace_buf);
3633 if (btcoexist->manual_control) {
3634 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3635 "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
3636 BTC_TRACE(trace_buf);
3640 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3641 if (wifi_under_5g) {
3642 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3643 "[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n");
3644 BTC_TRACE(trace_buf);
3645 halbtc8821a2ant_coex_under_5g(btcoexist);
3649 if (coex_sta->under_ips) {
3650 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3651 "[BTCoex], wifi is under IPS !!!\n");
3652 BTC_TRACE(trace_buf);
3656 if (coex_sta->bt_whck_test) {
3657 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3658 "[BTCoex], BT is under WHCK TEST!!!\n");
3659 BTC_TRACE(trace_buf);
3660 halbtc8821a2ant_action_bt_whck_test(btcoexist);
3664 algorithm = halbtc8821a2ant_action_algorithm(btcoexist);
3665 if (coex_sta->c2h_bt_inquiry_page &&
3666 (BT_8821A_2ANT_COEX_ALGO_PANHS != algorithm)) {
3667 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3668 "[BTCoex], BT is under inquiry/page scan !!\n");
3669 BTC_TRACE(trace_buf);
3670 halbtc8821a2ant_action_bt_inquiry(btcoexist);
3674 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3675 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3676 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3678 if (scan || link || roam) {
3679 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3680 "[BTCoex], WiFi is under Link Process !!\n");
3681 BTC_TRACE(trace_buf);
3682 halbtc8821a2ant_action_wifi_link_process(btcoexist);
3688 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3690 num_of_wifi_link = wifi_link_status >> 16;
3692 if ((num_of_wifi_link >= 2) ||
3693 (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {
3694 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3695 "############# [BTCoex], Multi-Port num_of_wifi_link = %d, wifi_link_status = 0x%x\n",
3696 num_of_wifi_link, wifi_link_status);
3697 BTC_TRACE(trace_buf);
3699 if (bt_link_info->bt_link_exist)
3700 miracast_plus_bt = true;
3702 miracast_plus_bt = false;
3704 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3706 halbtc8821a2ant_action_wifi_multi_port(btcoexist);
3711 miracast_plus_bt = false;
3712 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3715 coex_dm->cur_algorithm = algorithm;
3716 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Algorithm = %d\n",
3717 coex_dm->cur_algorithm);
3718 BTC_TRACE(trace_buf);
3720 if (halbtc8821a2ant_is_common_action(btcoexist)) {
3721 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3722 "[BTCoex], Action 2-Ant common.\n");
3723 BTC_TRACE(trace_buf);
3724 coex_dm->auto_tdma_adjust = false;
3726 if (coex_dm->cur_algorithm != coex_dm->pre_algorithm) {
3727 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3728 "[BTCoex], pre_algorithm=%d, cur_algorithm=%d\n",
3729 coex_dm->pre_algorithm, coex_dm->cur_algorithm);
3730 BTC_TRACE(trace_buf);
3731 coex_dm->auto_tdma_adjust = false;
3733 switch (coex_dm->cur_algorithm) {
3734 case BT_8821A_2ANT_COEX_ALGO_SCO:
3735 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3736 "[BTCoex], Action 2-Ant, algorithm = SCO.\n");
3737 BTC_TRACE(trace_buf);
3738 halbtc8821a2ant_action_sco(btcoexist);
3740 case BT_8821A_2ANT_COEX_ALGO_HID:
3741 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3742 "[BTCoex], Action 2-Ant, algorithm = HID.\n");
3743 BTC_TRACE(trace_buf);
3744 halbtc8821a2ant_action_hid(btcoexist);
3746 case BT_8821A_2ANT_COEX_ALGO_A2DP:
3747 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3748 "[BTCoex], Action 2-Ant, algorithm = A2DP.\n");
3749 BTC_TRACE(trace_buf);
3750 halbtc8821a2ant_action_a2dp(btcoexist);
3752 case BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS:
3753 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3754 "[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n");
3755 BTC_TRACE(trace_buf);
3756 halbtc8821a2ant_action_a2dp_pan_hs(btcoexist);
3758 case BT_8821A_2ANT_COEX_ALGO_PANEDR:
3759 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3760 "[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n");
3761 BTC_TRACE(trace_buf);
3762 halbtc8821a2ant_action_pan_edr(btcoexist);
3764 case BT_8821A_2ANT_COEX_ALGO_PANHS:
3765 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3766 "[BTCoex], Action 2-Ant, algorithm = HS mode.\n");
3767 BTC_TRACE(trace_buf);
3768 halbtc8821a2ant_action_pan_hs(btcoexist);
3770 case BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP:
3771 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3772 "[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n");
3773 BTC_TRACE(trace_buf);
3774 halbtc8821a2ant_action_pan_edr_a2dp(btcoexist);
3776 case BT_8821A_2ANT_COEX_ALGO_PANEDR_HID:
3777 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3778 "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n");
3779 BTC_TRACE(trace_buf);
3780 halbtc8821a2ant_action_pan_edr_hid(btcoexist);
3782 case BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
3783 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3784 "[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n");
3785 BTC_TRACE(trace_buf);
3786 halbtc8821a2ant_action_hid_a2dp_pan_edr(
3789 case BT_8821A_2ANT_COEX_ALGO_HID_A2DP:
3790 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3791 "[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n");
3792 BTC_TRACE(trace_buf);
3793 halbtc8821a2ant_action_hid_a2dp(btcoexist);
3796 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3797 "[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n");
3798 BTC_TRACE(trace_buf);
3799 halbtc8821a2ant_coex_all_off(btcoexist);
3802 coex_dm->pre_algorithm = coex_dm->cur_algorithm;
3806 void halbtc8821a2ant_wifi_off_hw_cfg(IN struct btc_coexist *btcoexist)
3808 u8 h2c_parameter[2] = {0};
3811 /* set wlan_act to low */
3812 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
3814 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
3815 0x780); /* WiFi goto standby while GNT_BT 0-->1 */
3816 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3817 if (fw_ver >= 0x180000) {
3818 /* Use H2C to set GNT_BT to HIGH */
3819 h2c_parameter[0] = 1;
3820 btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1, h2c_parameter);
3822 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
3825 void halbtc8821a2ant_init_hw_config(IN struct btc_coexist *btcoexist,
3831 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3832 "[BTCoex], 2Ant Init HW Config!!\n");
3833 BTC_TRACE(trace_buf);
3835 /* Give bt_coex_supported_version the default value */
3836 coex_sta->bt_coex_supported_version = 0;
3838 /* 0xf0[15:12] --> Chip Cut information */
3839 coex_sta->cut_version = (btcoexist->btc_read_1byte(btcoexist,
3842 /* backup rf 0x1e value */
3843 coex_dm->bt_rf_0x1e_backup =
3844 btcoexist->btc_get_rf_reg(btcoexist, BTC_RF_A, 0x1e, 0xfffff);
3846 /* 0x790[5:0]=0x5 */
3847 u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
3850 btcoexist->btc_write_1byte(btcoexist, 0x790, u8tmp);
3852 /* Antenna config */
3853 halbtc8821a2ant_set_ant_path(btcoexist, BTC_ANT_WIFI_AT_MAIN, true,
3855 coex_sta->dis_ver_info_cnt = 0;
3858 halbtc8821a2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
3860 /* Enable counter statistics */
3861 btcoexist->btc_write_1byte(btcoexist, 0x76e,
3862 0x4); /* 0x76e[3] =1, WLAN_Act control by PTA */
3863 btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
3864 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
3867 /* ************************************************************
3868 * work around function start with wa_halbtc8821a2ant_
3869 * ************************************************************
3870 * ************************************************************
3871 * extern function start with ex_halbtc8821a2ant_
3872 * ************************************************************ */
3873 void ex_halbtc8821a2ant_power_on_setting(IN struct btc_coexist *btcoexist)
3878 void ex_halbtc8821a2ant_pre_load_firmware(IN struct btc_coexist *btcoexist)
3880 struct btc_board_info *board_info = &btcoexist->board_info;
3881 u8 u8tmp = 0x4; /* Set BIT2 by default since it's 2ant case */
3884 /* S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info) */
3885 /* Local setting bit define */
3886 /* BIT0: "0" for no antenna inverse; "1" for antenna inverse */
3887 /* BIT1: "0" for internal switch; "1" for external switch */
3888 /* BIT2: "0" for one antenna; "1" for two antenna */
3889 /* NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0 */
3890 if (btcoexist->chip_interface == BTC_INTF_USB) {
3891 /* fixed at S0 for USB interface */
3892 u8tmp |= 0x1; /* antenna inverse */
3893 btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
3895 /* for PCIE and SDIO interface, we check efuse 0xc3[6] */
3896 if (board_info->single_ant_path == 0) {
3897 } else if (board_info->single_ant_path == 1) {
3899 u8tmp |= 0x1; /* antenna inverse */
3902 if (btcoexist->chip_interface == BTC_INTF_PCI)
3903 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x384,
3905 else if (btcoexist->chip_interface == BTC_INTF_SDIO)
3906 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60,
3911 void ex_halbtc8821a2ant_init_hw_config(IN struct btc_coexist *btcoexist,
3912 IN boolean wifi_only)
3914 halbtc8821a2ant_init_hw_config(btcoexist, true);
3917 void ex_halbtc8821a2ant_init_coex_dm(IN struct btc_coexist *btcoexist)
3919 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
3920 "[BTCoex], Coex Mechanism Init!!\n");
3921 BTC_TRACE(trace_buf);
3923 halbtc8821a2ant_init_coex_dm(btcoexist);
3926 void ex_halbtc8821a2ant_display_coex_info(IN struct btc_coexist *btcoexist)
3928 struct btc_board_info *board_info = &btcoexist->board_info;
3929 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3930 u8 *cli_buf = btcoexist->cli_buf;
3931 u8 u8tmp[4], i, bt_info_ext, ps_tdma_case = 0;
3933 u32 fw_ver = 0, bt_patch_ver = 0;
3934 u32 bt_coex_ver = 0;
3936 u32 fa_ofdm, fa_cck, cca_ofdm, cca_cck;
3938 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3939 "\r\n ============[BT Coexist info]============");
3942 if (btcoexist->manual_control) {
3943 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3944 "\r\n ============[Under Manual Control]============");
3946 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3947 "\r\n ==========================================");
3951 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ",
3952 "Ant PG number/ Ant mechanism:",
3953 board_info->pg_ant_num, board_info->btdm_ant_num);
3956 /* btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver); */
3957 bt_patch_ver = btcoexist->bt_info.bt_get_fw_ver;
3958 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3959 phyver = btcoexist->btc_get_bt_phydm_version(btcoexist);
3960 bt_coex_ver = coex_sta->bt_coex_supported_version & 0xff;
3962 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3963 "\r\n %-35s = %d_%02x/ 0x%02x/ 0x%02x (%s)",
3964 "CoexVer WL/ BT_Desired/ BT_Report",
3965 glcoex_ver_date_8821a_2ant, glcoex_ver_8821a_2ant,
3966 glcoex_ver_btdesired_8821a_2ant,
3968 (bt_coex_ver == 0xff ? "Unknown" :
3969 (bt_coex_ver >= glcoex_ver_btdesired_8821a_2ant ?
3970 "Match" : "Mis-Match")));
3973 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
3974 "\r\n %-35s = 0x%x/ 0x%x/ v%d/ %c",
3975 "W_FW/ B_FW/ Phy/ Kt",
3976 fw_ver, bt_patch_ver, phyver,
3977 coex_sta->cut_version + 65);
3980 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ",
3981 "Wifi channel informed to BT",
3982 coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1],
3983 coex_dm->wifi_chnl_info[2]);
3987 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
3988 "============[Wifi Status]============");
3990 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_WIFI_STATUS);
3992 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
3993 "============[BT Status]============");
3996 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %ddBm/ %d] ",
3997 "BT [status/ rssi/ retryCnt]",
3998 ((coex_sta->bt_disabled) ? ("disabled") : ((
3999 coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan")
4000 : ((BT_8821A_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
4001 coex_dm->bt_status) ? "non-connected idle" :
4002 ((BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)
4003 ? "connected-idle" : "busy")))),
4004 coex_sta->bt_rssi - 100, coex_sta->bt_retry_cnt);
4007 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d",
4009 bt_link_info->sco_exist, bt_link_info->hid_exist,
4010 bt_link_info->pan_exist, bt_link_info->a2dp_exist);
4014 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s",
4016 (bt_link_info->slave_role) ? "Slave" : "Master");
4020 bt_info_ext = coex_sta->bt_info_ext;
4021 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s",
4022 "BT Info A2DP rate",
4023 (bt_info_ext & BIT(0)) ? "Basic rate" : "EDR rate");
4026 for (i = 0; i < BT_INFO_SRC_8821A_2ANT_MAX; i++) {
4027 if (coex_sta->bt_info_c2h_cnt[i]) {
4028 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4029 "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)",
4030 glbt_info_src_8821a_2ant[i],
4031 coex_sta->bt_info_c2h[i][0],
4032 coex_sta->bt_info_c2h[i][1],
4033 coex_sta->bt_info_c2h[i][2],
4034 coex_sta->bt_info_c2h[i][3],
4035 coex_sta->bt_info_c2h[i][4],
4036 coex_sta->bt_info_c2h[i][5],
4037 coex_sta->bt_info_c2h[i][6],
4038 coex_sta->bt_info_c2h_cnt[i]);
4044 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4045 "============[Sw mechanism]============");
4047 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ",
4048 "SM1[ShRf/ LpRA/ LimDig]",
4049 coex_dm->cur_rf_rx_lpf_shrink, coex_dm->cur_low_penalty_ra,
4050 coex_dm->limited_dig);
4052 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d(0x%x) ",
4053 "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]",
4054 coex_dm->cur_agc_table_en, coex_dm->cur_adc_back_off,
4055 coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl);
4059 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4060 "============[Fw mechanism]============");
4063 ps_tdma_case = coex_dm->cur_ps_tdma;
4064 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4065 "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)",
4067 coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1],
4068 coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3],
4069 coex_dm->ps_tdma_para[4], ps_tdma_case,
4070 coex_dm->auto_tdma_adjust);
4073 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d",
4075 coex_sta->coex_table_type);
4078 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ",
4079 "DecBtPwr/ IgnWlanAct",
4080 coex_dm->cur_bt_dec_pwr_lvl, coex_dm->cur_ignore_wlan_act);
4084 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
4085 "============[Hw setting]============");
4088 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x",
4089 "RF-A, 0x1e initVal",
4090 coex_dm->bt_rf_0x1e_backup);
4093 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
4094 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xc5b);
4095 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x880);
4096 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
4097 "0x778/0x880[29:25]/0xc58[29:25]",
4098 u8tmp[0], (u32tmp[0] & 0x3e000000) >> 25,
4099 ((u8tmp[1] & 0x3e) >> 1));
4102 u32tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x764);
4103 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x76e);
4104 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
4105 "0x764/ 0x765/ 0x76e",
4106 (u32tmp[0] & 0xff), (u32tmp[0] & 0xff00) >> 8, u8tmp[0]);
4109 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
4110 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
4111 "0xcb4[7:0](ctrl)/ 0xcb4[29:28](val)",
4112 u32tmp[0] & 0xff, ((u32tmp[0] & 0x30000000) >> 28));
4115 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40);
4116 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
4117 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x974);
4118 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
4119 "0x40/ 0x4c[24:23]/ 0x974",
4120 u8tmp[0], ((u32tmp[0] & 0x01800000) >> 23), u32tmp[1]);
4123 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
4124 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
4125 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
4126 "0x550(bcn ctrl)/0x522",
4127 u32tmp[0], u8tmp[0]);
4130 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
4131 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x49c);
4132 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
4133 "0xc50(dig)/0x49c(null-drop)",
4134 u32tmp[0] & 0xff, u8tmp[0]);
4137 fa_ofdm = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
4138 PHYDM_INFO_FA_OFDM);
4139 fa_cck = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
4141 cca_ofdm = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
4142 PHYDM_INFO_CCA_OFDM);
4143 cca_cck = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
4144 PHYDM_INFO_CCA_CCK);
4146 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4147 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
4148 "CCK-CCA/CCK-FA/OFDM-CCA/OFDM-FA",
4149 cca_cck, fa_cck, cca_ofdm, fa_ofdm);
4152 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
4153 "CRC_OK CCK/11g/11n/11n-agg",
4154 coex_sta->crc_ok_cck, coex_sta->crc_ok_11g,
4155 coex_sta->crc_ok_11n, coex_sta->crc_ok_11n_vht);
4158 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
4159 "CRC_Err CCK/11g/11n/11n-agg",
4160 coex_sta->crc_err_cck, coex_sta->crc_err_11g,
4161 coex_sta->crc_err_11n, coex_sta->crc_err_11n_vht);
4164 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
4165 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
4166 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
4167 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
4168 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
4169 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
4170 "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)",
4171 u32tmp[0], u32tmp[1], u32tmp[2], u8tmp[0]);
4174 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
4175 "0x770(high-pri rx/tx)",
4176 coex_sta->high_priority_rx, coex_sta->high_priority_tx);
4178 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
4179 "0x774(low-pri rx/tx)",
4180 coex_sta->low_priority_rx, coex_sta->low_priority_tx);
4182 #if (BT_AUTO_REPORT_ONLY_8821A_2ANT == 1)
4183 /* halbtc8821a2ant_monitor_bt_ctr(btcoexist); */
4185 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS);
4189 void ex_halbtc8821a2ant_ips_notify(IN struct btc_coexist *btcoexist, IN u8 type)
4191 if (BTC_IPS_ENTER == type) {
4192 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4193 "[BTCoex], IPS ENTER notify\n");
4194 BTC_TRACE(trace_buf);
4195 coex_sta->under_ips = true;
4196 halbtc8821a2ant_wifi_off_hw_cfg(btcoexist);
4197 halbtc8821a2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
4198 halbtc8821a2ant_coex_all_off(btcoexist);
4199 } else if (BTC_IPS_LEAVE == type) {
4200 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4201 "[BTCoex], IPS LEAVE notify\n");
4202 BTC_TRACE(trace_buf);
4203 coex_sta->under_ips = false;
4204 halbtc8821a2ant_init_hw_config(btcoexist, false);
4205 halbtc8821a2ant_init_coex_dm(btcoexist);
4206 halbtc8821a2ant_query_bt_info(btcoexist);
4210 void ex_halbtc8821a2ant_lps_notify(IN struct btc_coexist *btcoexist, IN u8 type)
4212 if (BTC_LPS_ENABLE == type) {
4213 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4214 "[BTCoex], LPS ENABLE notify\n");
4215 BTC_TRACE(trace_buf);
4216 coex_sta->under_lps = true;
4217 } else if (BTC_LPS_DISABLE == type) {
4218 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4219 "[BTCoex], LPS DISABLE notify\n");
4220 BTC_TRACE(trace_buf);
4221 coex_sta->under_lps = false;
4225 void ex_halbtc8821a2ant_scan_notify(IN struct btc_coexist *btcoexist,
4230 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
4231 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x76e);
4233 if (BTC_SCAN_START == type) {
4234 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4235 "[BTCoex], SCAN START notify\n");
4236 BTC_TRACE(trace_buf);
4237 } else if (BTC_SCAN_FINISH == type) {
4238 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4239 "[BTCoex], SCAN FINISH notify\n");
4240 BTC_TRACE(trace_buf);
4243 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4244 "############# [BTCoex], 0x765=0x%x, 0x76e=0x%x\n", u8tmpa,
4246 BTC_TRACE(trace_buf);
4249 /* copy scan notify content to switch band notify */
4250 void ex_halbtc8821a2ant_switchband_notify(IN struct btc_coexist *btcoexist,
4255 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
4256 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x76e);
4258 if (BTC_SCAN_START == type) {
4259 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4260 "[BTCoex], SCAN START notify\n");
4261 BTC_TRACE(trace_buf);
4262 } else if (BTC_SCAN_FINISH == type) {
4263 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4264 "[BTCoex], SCAN FINISH notify\n");
4265 BTC_TRACE(trace_buf);
4268 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4269 "############# [BTCoex], 0x765=0x%x, 0x76e=0x%x\n", u8tmpa,
4271 BTC_TRACE(trace_buf);
4274 void ex_halbtc8821a2ant_connect_notify(IN struct btc_coexist *btcoexist,
4277 if (BTC_ASSOCIATE_START == type) {
4278 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4279 "[BTCoex], CONNECT START notify\n");
4280 BTC_TRACE(trace_buf);
4281 } else if (BTC_ASSOCIATE_FINISH == type) {
4282 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4283 "[BTCoex], CONNECT FINISH notify\n");
4284 BTC_TRACE(trace_buf);
4288 void ex_halbtc8821a2ant_media_status_notify(IN struct btc_coexist *btcoexist,
4291 u8 h2c_parameter[3] = {0};
4293 u8 wifi_central_chnl;
4296 if (BTC_MEDIA_CONNECT == type) {
4297 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4298 "[BTCoex], MEDIA connect notify\n");
4299 BTC_TRACE(trace_buf);
4301 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4302 "[BTCoex], MEDIA disconnect notify\n");
4303 BTC_TRACE(trace_buf);
4306 /* only 2.4G we need to inform bt the chnl mask */
4307 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
4308 &wifi_central_chnl);
4309 if ((BTC_MEDIA_CONNECT == type) &&
4310 (wifi_central_chnl <= 14)) {
4311 h2c_parameter[0] = 0x1;
4312 h2c_parameter[1] = wifi_central_chnl;
4313 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
4314 if (BTC_WIFI_BW_HT40 == wifi_bw)
4315 h2c_parameter[2] = 0x30;
4317 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
4320 h2c_parameter[2] = 0x30;
4322 h2c_parameter[2] = 0x20;
4326 coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
4327 coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
4328 coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
4330 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
4333 void ex_halbtc8821a2ant_specific_packet_notify(IN struct btc_coexist *btcoexist,
4336 if (type == BTC_PACKET_DHCP) {
4337 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4338 "[BTCoex], DHCP Packet notify\n");
4339 BTC_TRACE(trace_buf);
4343 void ex_halbtc8821a2ant_bt_info_notify(IN struct btc_coexist *btcoexist,
4344 IN u8 *tmp_buf, IN u8 length)
4347 u8 i, rsp_source = 0;
4348 boolean bt_busy = false, limited_dig = false;
4349 boolean wifi_connected = false, wifi_under_5g = false;
4351 coex_sta->c2h_bt_info_req_sent = false;
4352 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
4353 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
4356 rsp_source = tmp_buf[0] & 0xf;
4357 if (rsp_source >= BT_INFO_SRC_8821A_2ANT_MAX)
4358 rsp_source = BT_INFO_SRC_8821A_2ANT_WIFI_FW;
4359 coex_sta->bt_info_c2h_cnt[rsp_source]++;
4361 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4362 "[BTCoex], Bt info[%d], length=%d, hex data=[", rsp_source,
4364 BTC_TRACE(trace_buf);
4365 for (i = 0; i < length; i++) {
4366 coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
4368 bt_info = tmp_buf[i];
4369 if (i == length - 1) {
4370 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x]\n",
4372 BTC_TRACE(trace_buf);
4374 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x, ",
4376 BTC_TRACE(trace_buf);
4380 if (btcoexist->manual_control) {
4381 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4382 "[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n");
4383 BTC_TRACE(trace_buf);
4387 /* if 0xff, it means BT is under WHCK test */
4388 if (bt_info == 0xff)
4389 coex_sta->bt_whck_test = true;
4391 coex_sta->bt_whck_test = false;
4393 if (BT_INFO_SRC_8821A_2ANT_WIFI_FW != rsp_source) {
4394 coex_sta->bt_retry_cnt = /* [3:0] */
4395 coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
4398 coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;
4400 coex_sta->bt_info_ext =
4401 coex_sta->bt_info_c2h[rsp_source][4];
4403 coex_sta->bt_tx_rx_mask = (coex_sta->bt_info_c2h[rsp_source][2]
4405 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK,
4406 &coex_sta->bt_tx_rx_mask);
4407 if (coex_sta->bt_tx_rx_mask) {
4408 /* BT into is responded by BT FW and BT RF REG 0x3C != 0x01 => Need to switch BT TRx Mask */
4409 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4410 "[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\n");
4411 BTC_TRACE(trace_buf);
4412 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
4416 /* Here we need to resend some wifi info to BT */
4417 /* because bt is reset and loss of the info. */
4418 if ((coex_sta->bt_info_ext & BIT(1))) {
4419 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4420 "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
4421 BTC_TRACE(trace_buf);
4423 ex_halbtc8821a2ant_media_status_notify(
4424 btcoexist, BTC_MEDIA_CONNECT);
4426 ex_halbtc8821a2ant_media_status_notify(
4427 btcoexist, BTC_MEDIA_DISCONNECT);
4431 if (!btcoexist->manual_control && !wifi_under_5g) {
4432 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4433 "[BTCoex], BT ext info = 0x%x!!\n",
4434 coex_sta->bt_info_ext);
4435 BTC_TRACE(trace_buf);
4436 if ((coex_sta->bt_info_ext & BIT(3))) {
4437 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4438 "[BTCoex], BT ext info bit3=1, wifi_connected=%d\n",
4440 BTC_TRACE(trace_buf);
4441 if (wifi_connected) {
4442 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4443 "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
4444 BTC_TRACE(trace_buf);
4445 halbtc8821a2ant_ignore_wlan_act(
4446 btcoexist, FORCE_EXEC, false);
4449 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4450 "[BTCoex], BT ext info bit3=0, wifi_connected=%d\n",
4452 BTC_TRACE(trace_buf);
4453 /* BT already NOT ignore Wlan active, do nothing here. */
4454 if (!wifi_connected) {
4455 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4456 "[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\n");
4457 BTC_TRACE(trace_buf);
4458 halbtc8821a2ant_ignore_wlan_act(
4459 btcoexist, FORCE_EXEC, true);
4464 #if (BT_AUTO_REPORT_ONLY_8821A_2ANT == 0)
4465 if ((coex_sta->bt_info_ext & BIT(4))) {
4466 /* BT auto report already enabled, do nothing */
4468 halbtc8821a2ant_bt_auto_report(btcoexist, FORCE_EXEC,
4473 /* check BIT2 first ==> check if bt is under inquiry or page scan */
4474 if (bt_info & BT_INFO_8821A_2ANT_B_INQ_PAGE)
4475 coex_sta->c2h_bt_inquiry_page = true;
4477 coex_sta->c2h_bt_inquiry_page = false;
4479 /* set link exist status */
4480 if (!(bt_info & BT_INFO_8821A_2ANT_B_CONNECTION)) {
4481 coex_sta->bt_link_exist = false;
4482 coex_sta->pan_exist = false;
4483 coex_sta->a2dp_exist = false;
4484 coex_sta->hid_exist = false;
4485 coex_sta->sco_exist = false;
4486 } else { /* connection exists */
4487 coex_sta->bt_link_exist = true;
4488 if (bt_info & BT_INFO_8821A_2ANT_B_FTP)
4489 coex_sta->pan_exist = true;
4491 coex_sta->pan_exist = false;
4492 if (bt_info & BT_INFO_8821A_2ANT_B_A2DP)
4493 coex_sta->a2dp_exist = true;
4495 coex_sta->a2dp_exist = false;
4496 if (bt_info & BT_INFO_8821A_2ANT_B_HID)
4497 coex_sta->hid_exist = true;
4499 coex_sta->hid_exist = false;
4500 if (bt_info & BT_INFO_8821A_2ANT_B_SCO_ESCO)
4501 coex_sta->sco_exist = true;
4503 coex_sta->sco_exist = false;
4505 if ((coex_sta->hid_exist == false) &&
4506 (coex_sta->c2h_bt_inquiry_page == false) &&
4507 (coex_sta->sco_exist == false)) {
4508 if (coex_sta->high_priority_tx +
4509 coex_sta->high_priority_rx >= 160)
4510 coex_sta->hid_exist = true;
4514 halbtc8821a2ant_update_bt_link_info(btcoexist);
4516 if (!(bt_info & BT_INFO_8821A_2ANT_B_CONNECTION)) {
4517 coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_NON_CONNECTED_IDLE;
4518 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4519 "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
4520 BTC_TRACE(trace_buf);
4521 } else if (bt_info ==
4522 BT_INFO_8821A_2ANT_B_CONNECTION) { /* connection exists but no busy */
4523 coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE;
4524 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4525 "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
4526 BTC_TRACE(trace_buf);
4527 } else if ((bt_info & BT_INFO_8821A_2ANT_B_SCO_ESCO) ||
4528 (bt_info & BT_INFO_8821A_2ANT_B_SCO_BUSY)) {
4529 coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_SCO_BUSY;
4530 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4531 "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
4532 BTC_TRACE(trace_buf);
4533 } else if (bt_info & BT_INFO_8821A_2ANT_B_ACL_BUSY) {
4534 coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_ACL_BUSY;
4535 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4536 "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
4537 BTC_TRACE(trace_buf);
4539 coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_MAX;
4540 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4541 "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
4542 BTC_TRACE(trace_buf);
4545 if ((BT_8821A_2ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
4546 (BT_8821A_2ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
4547 (BT_8821A_2ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) {
4552 limited_dig = false;
4555 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
4557 coex_dm->limited_dig = limited_dig;
4558 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig);
4560 halbtc8821a2ant_run_coexist_mechanism(btcoexist);
4563 void ex_halbtc8821a2ant_halt_notify(IN struct btc_coexist *btcoexist)
4565 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Halt notify\n");
4566 BTC_TRACE(trace_buf);
4568 halbtc8821a2ant_wifi_off_hw_cfg(btcoexist);
4569 /* remove due to interrupt is disabled that polling c2h will fail and delay 100ms. */
4570 /* btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF, 0x3c, 0x15); */ /*BT goto standby while GNT_BT 1-->0 */
4571 halbtc8821a2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
4573 ex_halbtc8821a2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
4576 void ex_halbtc8821a2ant_pnp_notify(IN struct btc_coexist *btcoexist,
4579 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Pnp notify\n");
4580 BTC_TRACE(trace_buf);
4582 if (BTC_WIFI_PNP_SLEEP == pnp_state) {
4583 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4584 "[BTCoex], Pnp notify to SLEEP\n");
4585 BTC_TRACE(trace_buf);
4586 } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
4587 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4588 "[BTCoex], Pnp notify to WAKE UP\n");
4589 BTC_TRACE(trace_buf);
4590 halbtc8821a2ant_init_hw_config(btcoexist, false);
4591 halbtc8821a2ant_init_coex_dm(btcoexist);
4592 halbtc8821a2ant_query_bt_info(btcoexist);
4596 void ex_halbtc8821a2ant_periodical(IN struct btc_coexist *btcoexist)
4598 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4599 "[BTCoex], ==========================Periodical===========================\n");
4600 BTC_TRACE(trace_buf);
4602 if (coex_sta->dis_ver_info_cnt <= 5) {
4603 coex_sta->dis_ver_info_cnt += 1;
4604 if (coex_sta->dis_ver_info_cnt == 3) {
4605 /* Antenna config to set 0x765 = 0x0 (GNT_BT control by PTA) after initial */
4606 BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
4607 "[BTCoex], Set GNT_BT control by PTA\n");
4608 BTC_TRACE(trace_buf);
4609 halbtc8821a2ant_set_ant_path(btcoexist,
4610 BTC_ANT_WIFI_AT_MAIN, false, false);
4614 if (((coex_sta->bt_coex_supported_version == 0) ||
4615 (coex_sta->bt_coex_supported_version == 0xffff)) &&
4616 (!coex_sta->bt_disabled))
4617 coex_sta->bt_coex_supported_version =
4618 btcoexist->btc_get_bt_coex_supported_version(btcoexist);
4621 #if (BT_AUTO_REPORT_ONLY_8821A_2ANT == 0)
4622 halbtc8821a2ant_query_bt_info(btcoexist);
4623 halbtc8821a2ant_monitor_bt_enable_disable(btcoexist);
4625 halbtc8821a2ant_monitor_bt_ctr(btcoexist);
4626 halbtc8821a2ant_monitor_wifi_ctr(btcoexist);
4627 halbtc8821a2ant_monitor_bt_enable_disable(btcoexist);
4629 if (halbtc8821a2ant_is_wifi_status_changed(btcoexist) ||
4630 coex_dm->auto_tdma_adjust)
4631 halbtc8821a2ant_run_coexist_mechanism(btcoexist);
4637 #endif /* #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1) */