1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2012 Realtek Corporation.*/
4 /***************************************************************
7 * This file is for RTL8723B Co-exist mechanism
10 * 2012/11/15 Cosa first check in.
12 ***************************************************************/
14 /***************************************************************
16 ***************************************************************/
17 #include "halbt_precomp.h"
18 /***************************************************************
19 * Global variables, these are static variables
20 ***************************************************************/
21 static struct coex_dm_8723b_1ant glcoex_dm_8723b_1ant;
22 static struct coex_dm_8723b_1ant *coex_dm = &glcoex_dm_8723b_1ant;
23 static struct coex_sta_8723b_1ant glcoex_sta_8723b_1ant;
24 static struct coex_sta_8723b_1ant *coex_sta = &glcoex_sta_8723b_1ant;
26 static const char *const glbt_info_src_8723b_1ant[] = {
29 "BT Info[bt auto report]",
32 static u32 glcoex_ver_date_8723b_1ant = 20130918;
33 static u32 glcoex_ver_8723b_1ant = 0x47;
35 /***************************************************************
36 * local function proto type if needed
37 ***************************************************************/
38 /***************************************************************
39 * local function start with halbtc8723b1ant_
40 ***************************************************************/
42 static void halbtc8723b1ant_updatera_mask(struct btc_coexist *btcoexist,
43 bool force_exec, u32 dis_rate_mask)
45 coex_dm->curra_mask = dis_rate_mask;
47 if (force_exec || (coex_dm->prera_mask != coex_dm->curra_mask))
48 btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK,
49 &coex_dm->curra_mask);
51 coex_dm->prera_mask = coex_dm->curra_mask;
54 static void btc8723b1ant_auto_rate_fb_retry(struct btc_coexist *btcoexist,
55 bool force_exec, u8 type)
57 bool wifi_under_bmode = false;
59 coex_dm->cur_arfr_type = type;
61 if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {
62 switch (coex_dm->cur_arfr_type) {
63 case 0: /* normal mode */
64 btcoexist->btc_write_4byte(btcoexist, 0x430,
65 coex_dm->backup_arfr_cnt1);
66 btcoexist->btc_write_4byte(btcoexist, 0x434,
67 coex_dm->backup_arfr_cnt2);
70 btcoexist->btc_get(btcoexist,
71 BTC_GET_BL_WIFI_UNDER_B_MODE,
73 if (wifi_under_bmode) {
74 btcoexist->btc_write_4byte(btcoexist,
76 btcoexist->btc_write_4byte(btcoexist,
79 btcoexist->btc_write_4byte(btcoexist,
81 btcoexist->btc_write_4byte(btcoexist,
90 coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;
93 static void halbtc8723b1ant_retry_limit(struct btc_coexist *btcoexist,
94 bool force_exec, u8 type)
96 coex_dm->cur_retry_limit_type = type;
98 if (force_exec || (coex_dm->pre_retry_limit_type !=
99 coex_dm->cur_retry_limit_type)) {
100 switch (coex_dm->cur_retry_limit_type) {
101 case 0: /* normal mode */
102 btcoexist->btc_write_2byte(btcoexist, 0x42a,
103 coex_dm->backup_retry_limit);
105 case 1: /* retry limit = 8 */
106 btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);
113 coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;
116 static void halbtc8723b1ant_ampdu_maxtime(struct btc_coexist *btcoexist,
117 bool force_exec, u8 type)
119 coex_dm->cur_ampdu_time_type = type;
121 if (force_exec || (coex_dm->pre_ampdu_time_type !=
122 coex_dm->cur_ampdu_time_type)) {
123 switch (coex_dm->cur_ampdu_time_type) {
124 case 0: /* normal mode */
125 btcoexist->btc_write_1byte(btcoexist, 0x456,
126 coex_dm->backup_ampdu_max_time);
128 case 1: /* AMPDU timw = 0x38 * 32us */
129 btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);
136 coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;
139 static void halbtc8723b1ant_limited_tx(struct btc_coexist *btcoexist,
140 bool force_exec, u8 ra_masktype,
141 u8 arfr_type, u8 retry_limit_type,
144 switch (ra_masktype) {
145 case 0: /* normal mode */
146 halbtc8723b1ant_updatera_mask(btcoexist, force_exec, 0x0);
148 case 1: /* disable cck 1/2 */
149 halbtc8723b1ant_updatera_mask(btcoexist, force_exec,
152 /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
154 halbtc8723b1ant_updatera_mask(btcoexist, force_exec,
161 btc8723b1ant_auto_rate_fb_retry(btcoexist, force_exec, arfr_type);
162 halbtc8723b1ant_retry_limit(btcoexist, force_exec, retry_limit_type);
163 halbtc8723b1ant_ampdu_maxtime(btcoexist, force_exec, ampdu_time_type);
166 static void halbtc8723b1ant_limited_rx(struct btc_coexist *btcoexist,
167 bool force_exec, bool rej_ap_agg_pkt,
168 bool bt_ctrl_agg_buf_size,
171 bool reject_rx_agg = rej_ap_agg_pkt;
172 bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
173 u8 rxaggsize = agg_buf_size;
175 /**********************************************
176 * Rx Aggregation related setting
177 **********************************************/
178 btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
180 /* decide BT control aggregation buf size or not */
181 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
182 &bt_ctrl_rx_agg_size);
183 /* aggregation buf size, only work
184 * when BT control Rx aggregation size.
186 btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxaggsize);
187 /* real update aggregation setting */
188 btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
191 static void halbtc8723b1ant_query_bt_info(struct btc_coexist *btcoexist)
193 u8 h2c_parameter[1] = {0};
195 coex_sta->c2h_bt_info_req_sent = true;
198 h2c_parameter[0] |= BIT(0);
200 btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
203 static void halbtc8723b1ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
205 u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
206 u32 reg_hp_tx = 0, reg_hp_rx = 0;
207 u32 reg_lp_tx = 0, reg_lp_rx = 0;
208 static u32 num_of_bt_counter_chk;
213 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
214 reg_hp_tx = u32tmp & MASKLWORD;
215 reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
217 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
218 reg_lp_tx = u32tmp & MASKLWORD;
219 reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
221 coex_sta->high_priority_tx = reg_hp_tx;
222 coex_sta->high_priority_rx = reg_hp_rx;
223 coex_sta->low_priority_tx = reg_lp_tx;
224 coex_sta->low_priority_rx = reg_lp_rx;
226 if ((coex_sta->low_priority_tx > 1050) &&
227 (!coex_sta->c2h_bt_inquiry_page))
228 coex_sta->pop_event_cnt++;
231 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
233 /* This part is for wifi FW and driver to update BT's status as
236 * The flow is as the following
238 * 2. if all BT Tx/Rx counter = 0, after 6 sec we query bt info
239 * 3. Because BT will not rsp from mailbox, so wifi fw will know BT is
242 * 4. FW will rsp c2h for BT that driver will know BT is disabled.
244 if ((reg_hp_tx == 0) && (reg_hp_rx == 0) && (reg_lp_tx == 0) &&
246 num_of_bt_counter_chk++;
247 if (num_of_bt_counter_chk == 3)
248 halbtc8723b1ant_query_bt_info(btcoexist);
250 num_of_bt_counter_chk = 0;
254 static void halbtc8723b1ant_monitor_wifi_ctr(struct btc_coexist *btcoexist)
257 bool wifi_busy = false, wifi_under_b_mode = false;
258 static u8 cck_lock_counter;
261 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
262 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
263 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
266 if (coex_sta->under_ips) {
267 coex_sta->crc_ok_cck = 0;
268 coex_sta->crc_ok_11g = 0;
269 coex_sta->crc_ok_11n = 0;
270 coex_sta->crc_ok_11n_agg = 0;
272 coex_sta->crc_err_cck = 0;
273 coex_sta->crc_err_11g = 0;
274 coex_sta->crc_err_11n = 0;
275 coex_sta->crc_err_11n_agg = 0;
277 coex_sta->crc_ok_cck =
278 btcoexist->btc_read_4byte(btcoexist, 0xf88);
279 coex_sta->crc_ok_11g =
280 btcoexist->btc_read_2byte(btcoexist, 0xf94);
281 coex_sta->crc_ok_11n =
282 btcoexist->btc_read_2byte(btcoexist, 0xf90);
283 coex_sta->crc_ok_11n_agg =
284 btcoexist->btc_read_2byte(btcoexist, 0xfb8);
286 coex_sta->crc_err_cck =
287 btcoexist->btc_read_4byte(btcoexist, 0xf84);
288 coex_sta->crc_err_11g =
289 btcoexist->btc_read_2byte(btcoexist, 0xf96);
290 coex_sta->crc_err_11n =
291 btcoexist->btc_read_2byte(btcoexist, 0xf92);
292 coex_sta->crc_err_11n_agg =
293 btcoexist->btc_read_2byte(btcoexist, 0xfba);
297 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x1);
298 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x0);
300 if ((wifi_busy) && (wifi_rssi >= 30) && (!wifi_under_b_mode)) {
301 total_cnt = coex_sta->crc_ok_cck + coex_sta->crc_ok_11g +
302 coex_sta->crc_ok_11n + coex_sta->crc_ok_11n_agg;
304 if ((coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) ||
305 (coex_dm->bt_status ==
306 BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) ||
307 (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY)) {
308 if (coex_sta->crc_ok_cck >
309 (total_cnt - coex_sta->crc_ok_cck)) {
310 if (cck_lock_counter < 3)
313 if (cck_lock_counter > 0)
318 if (cck_lock_counter > 0)
322 if (cck_lock_counter > 0)
326 if (!coex_sta->pre_ccklock) {
327 if (cck_lock_counter >= 3)
328 coex_sta->cck_lock = true;
330 coex_sta->cck_lock = false;
332 if (cck_lock_counter == 0)
333 coex_sta->cck_lock = false;
335 coex_sta->cck_lock = true;
338 if (coex_sta->cck_lock)
339 coex_sta->cck_ever_lock = true;
341 coex_sta->pre_ccklock = coex_sta->cck_lock;
344 static bool btc8723b1ant_is_wifi_status_changed(struct btc_coexist *btcoexist)
346 static bool pre_wifi_busy;
347 static bool pre_under_4way, pre_bt_hs_on;
348 bool wifi_busy = false, under_4way = false, bt_hs_on = false;
349 bool wifi_connected = false;
351 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
353 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
354 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
355 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
358 if (wifi_connected) {
359 if (wifi_busy != pre_wifi_busy) {
360 pre_wifi_busy = wifi_busy;
363 if (under_4way != pre_under_4way) {
364 pre_under_4way = under_4way;
367 if (bt_hs_on != pre_bt_hs_on) {
368 pre_bt_hs_on = bt_hs_on;
376 static void halbtc8723b1ant_update_bt_link_info(struct btc_coexist *btcoexist)
378 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
379 bool bt_hs_on = false;
381 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
383 bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
384 bt_link_info->sco_exist = coex_sta->sco_exist;
385 bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
386 bt_link_info->pan_exist = coex_sta->pan_exist;
387 bt_link_info->hid_exist = coex_sta->hid_exist;
388 bt_link_info->bt_hi_pri_link_exist = coex_sta->bt_hi_pri_link_exist;
390 /* work around for HS mode. */
392 bt_link_info->pan_exist = true;
393 bt_link_info->bt_link_exist = true;
396 /* check if Sco only */
397 if (bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
398 !bt_link_info->pan_exist && !bt_link_info->hid_exist)
399 bt_link_info->sco_only = true;
401 bt_link_info->sco_only = false;
403 /* check if A2dp only */
404 if (!bt_link_info->sco_exist && bt_link_info->a2dp_exist &&
405 !bt_link_info->pan_exist && !bt_link_info->hid_exist)
406 bt_link_info->a2dp_only = true;
408 bt_link_info->a2dp_only = false;
410 /* check if Pan only */
411 if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
412 bt_link_info->pan_exist && !bt_link_info->hid_exist)
413 bt_link_info->pan_only = true;
415 bt_link_info->pan_only = false;
417 /* check if Hid only */
418 if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
419 !bt_link_info->pan_exist && bt_link_info->hid_exist)
420 bt_link_info->hid_only = true;
422 bt_link_info->hid_only = false;
425 static void halbtc8723b1ant_set_bt_auto_report(struct btc_coexist *btcoexist,
426 bool enable_auto_report)
428 u8 h2c_parameter[1] = {0};
430 h2c_parameter[0] = 0;
432 if (enable_auto_report)
433 h2c_parameter[0] |= BIT(0);
435 btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
438 static void halbtc8723b1ant_bt_auto_report(struct btc_coexist *btcoexist,
440 bool enable_auto_report)
442 coex_dm->cur_bt_auto_report = enable_auto_report;
445 if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
448 halbtc8723b1ant_set_bt_auto_report(btcoexist,
449 coex_dm->cur_bt_auto_report);
451 coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
454 static void btc8723b1ant_set_sw_pen_tx_rate_adapt(struct btc_coexist *btcoexist,
457 struct rtl_priv *rtlpriv = btcoexist->adapter;
458 u8 h2c_parameter[6] = {0};
460 h2c_parameter[0] = 0x6; /* opCode, 0x6= Retry_Penalty */
462 if (low_penalty_ra) {
463 h2c_parameter[1] |= BIT0;
464 /* normal rate except MCS7/6/5, OFDM54/48/36 */
465 h2c_parameter[2] = 0x00;
466 h2c_parameter[3] = 0xf7; /* MCS7 or OFDM54 */
467 h2c_parameter[4] = 0xf8; /* MCS6 or OFDM48 */
468 h2c_parameter[5] = 0xf9; /* MCS5 or OFDM36 */
471 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
472 "[BTCoex], set WiFi Low-Penalty Retry: %s",
473 (low_penalty_ra ? "ON!!" : "OFF!!"));
475 btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
478 static void halbtc8723b1ant_low_penalty_ra(struct btc_coexist *btcoexist,
479 bool force_exec, bool low_penalty_ra)
481 coex_dm->cur_low_penalty_ra = low_penalty_ra;
484 if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
487 btc8723b1ant_set_sw_pen_tx_rate_adapt(btcoexist,
488 coex_dm->cur_low_penalty_ra);
490 coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
493 static void halbtc8723b1ant_set_coex_table(struct btc_coexist *btcoexist,
494 u32 val0x6c0, u32 val0x6c4,
495 u32 val0x6c8, u8 val0x6cc)
497 struct rtl_priv *rtlpriv = btcoexist->adapter;
499 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
500 "[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0);
501 btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
503 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
504 "[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4);
505 btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
507 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
508 "[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8);
509 btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
511 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
512 "[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc);
513 btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
516 static void halbtc8723b1ant_coex_table(struct btc_coexist *btcoexist,
517 bool force_exec, u32 val0x6c0,
518 u32 val0x6c4, u32 val0x6c8,
521 struct rtl_priv *rtlpriv = btcoexist->adapter;
523 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
524 "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6cc = 0x%x\n",
525 (force_exec ? "force to" : ""),
526 val0x6c0, val0x6c4, val0x6cc);
527 coex_dm->cur_val0x6c0 = val0x6c0;
528 coex_dm->cur_val0x6c4 = val0x6c4;
529 coex_dm->cur_val0x6c8 = val0x6c8;
530 coex_dm->cur_val0x6cc = val0x6cc;
533 if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
534 (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
535 (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
536 (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
539 halbtc8723b1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,
542 coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
543 coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
544 coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
545 coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
548 static void halbtc8723b1ant_coex_table_with_type(struct btc_coexist *btcoexist,
549 bool force_exec, u8 type)
551 coex_sta->coex_table_type = type;
555 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
556 0x55555555, 0xffffff, 0x3);
559 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
560 0x5a5a5a5a, 0xffffff, 0x3);
563 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
564 0x5a5a5a5a, 0xffffff, 0x3);
567 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
568 0x5a5a5a5a, 0xffffff, 0x3);
571 if ((coex_sta->cck_ever_lock) && (coex_sta->scan_ap_num <= 5))
572 halbtc8723b1ant_coex_table(btcoexist, force_exec,
573 0x55555555, 0xaaaa5a5a,
576 halbtc8723b1ant_coex_table(btcoexist, force_exec,
577 0x55555555, 0x5a5a5a5a,
581 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
582 0x5aaa5a5a, 0xffffff, 0x3);
585 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
586 0xaaaaaaaa, 0xffffff, 0x3);
589 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,
590 0xaaaaaaaa, 0xffffff, 0x3);
593 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
594 0x5ada5ada, 0xffffff, 0x3);
597 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
598 0x5ada5ada, 0xffffff, 0x3);
601 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
602 0x5ada5ada, 0xffffff, 0x3);
605 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
606 0x5ada5ada, 0xffffff, 0x3);
609 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
610 0x5ada5ada, 0xffffff, 0x3);
613 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
614 0xaaaaaaaa, 0xffffff, 0x3);
617 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
618 0x5ada5ada, 0xffffff, 0x3);
621 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
622 0xaaaaaaaa, 0xffffff, 0x3);
630 halbtc8723b1ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,
633 struct rtl_priv *rtlpriv = btcoexist->adapter;
634 u8 h2c_parameter[1] = {0};
637 h2c_parameter[0] |= BIT0; /* function enable */
639 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
640 "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
643 btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
646 static void halbtc8723b1ant_ignore_wlan_act(struct btc_coexist *btcoexist,
647 bool force_exec, bool enable)
649 struct rtl_priv *rtlpriv = btcoexist->adapter;
651 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
652 "[BTCoex], %s turn Ignore WlanAct %s\n",
653 (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
654 coex_dm->cur_ignore_wlan_act = enable;
657 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
658 "[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n",
659 coex_dm->pre_ignore_wlan_act,
660 coex_dm->cur_ignore_wlan_act);
662 if (coex_dm->pre_ignore_wlan_act ==
663 coex_dm->cur_ignore_wlan_act)
666 halbtc8723b1ant_set_fw_ignore_wlan_act(btcoexist, enable);
668 coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
671 static void halbtc8723b1ant_set_fw_ps_tdma(struct btc_coexist *btcoexist,
672 u8 byte1, u8 byte2, u8 byte3,
675 struct rtl_priv *rtlpriv = btcoexist->adapter;
676 u8 h2c_parameter[5] = {0};
677 u8 real_byte1 = byte1, real_byte5 = byte5;
678 bool ap_enable = false;
680 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
684 if ((byte1 & BIT4) && !(byte1 & BIT5)) {
685 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
686 "[BTCoex], FW for 1Ant AP mode\n");
695 h2c_parameter[0] = real_byte1;
696 h2c_parameter[1] = byte2;
697 h2c_parameter[2] = byte3;
698 h2c_parameter[3] = byte4;
699 h2c_parameter[4] = real_byte5;
701 coex_dm->ps_tdma_para[0] = real_byte1;
702 coex_dm->ps_tdma_para[1] = byte2;
703 coex_dm->ps_tdma_para[2] = byte3;
704 coex_dm->ps_tdma_para[3] = byte4;
705 coex_dm->ps_tdma_para[4] = real_byte5;
707 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
708 "[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n",
710 h2c_parameter[1] << 24 |
711 h2c_parameter[2] << 16 |
712 h2c_parameter[3] << 8 |
715 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
718 static void halbtc8723b1ant_set_lps_rpwm(struct btc_coexist *btcoexist,
719 u8 lps_val, u8 rpwm_val)
724 btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
725 btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
728 static void halbtc8723b1ant_lps_rpwm(struct btc_coexist *btcoexist,
730 u8 lps_val, u8 rpwm_val)
732 struct rtl_priv *rtlpriv = btcoexist->adapter;
734 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
735 "[BTCoex], %s set lps/rpwm = 0x%x/0x%x\n",
736 (force_exec ? "force to" : ""), lps_val, rpwm_val);
737 coex_dm->cur_lps = lps_val;
738 coex_dm->cur_rpwm = rpwm_val;
741 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
742 "[BTCoex], LPS-RxBeaconMode = 0x%x , LPS-RPWM = 0x%x!!\n",
743 coex_dm->cur_lps, coex_dm->cur_rpwm);
745 if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
746 (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) {
747 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
748 "[BTCoex], LPS-RPWM_Last = 0x%x , LPS-RPWM_Now = 0x%x!!\n",
749 coex_dm->pre_rpwm, coex_dm->cur_rpwm);
754 halbtc8723b1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
756 coex_dm->pre_lps = coex_dm->cur_lps;
757 coex_dm->pre_rpwm = coex_dm->cur_rpwm;
760 static void halbtc8723b1ant_sw_mechanism(struct btc_coexist *btcoexist,
763 struct rtl_priv *rtlpriv = btcoexist->adapter;
765 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
766 "[BTCoex], SM[LpRA] = %d\n", low_penalty_ra);
768 halbtc8723b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
771 static void halbtc8723b1ant_set_ant_path(struct btc_coexist *btcoexist,
772 u8 ant_pos_type, bool force_exec,
773 bool init_hw_cfg, bool wifi_off)
775 struct rtl_priv *rtlpriv = btcoexist->adapter;
776 struct btc_board_info *board_info = &btcoexist->board_info;
777 u32 fw_ver = 0, u32tmp = 0, cnt_bt_cal_chk = 0;
778 bool pg_ext_switch = false;
779 bool use_ext_switch = false;
780 bool is_in_mp_mode = false;
781 u8 h2c_parameter[2] = {0}, u8tmp = 0;
783 coex_dm->cur_ant_pos_type = ant_pos_type;
785 btcoexist->btc_get(btcoexist, BTC_GET_BL_EXT_SWITCH, &pg_ext_switch);
786 /* [31:16] = fw ver, [15:0] = fw sub ver */
787 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
789 if ((fw_ver < 0xc0000) || pg_ext_switch)
790 use_ext_switch = true;
793 /* WiFi TRx Mask on */
794 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
796 /* remove due to interrupt is disabled that polling c2h will
797 * fail and delay 100ms.
800 if (fw_ver >= 0x180000) {
801 /* Use H2C to set GNT_BT to HIGH */
802 h2c_parameter[0] = 1;
803 btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
806 /* set grant_bt to high */
807 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
809 /* set wlan_act control by PTA */
810 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
812 /* BT select s0/s1 is controlled by BT */
813 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x0);
814 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x39, 0x8, 0x1);
815 btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
816 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x944, 0x3, 0x3);
817 btcoexist->btc_write_1byte(btcoexist, 0x930, 0x77);
818 } else if (wifi_off) {
819 if (fw_ver >= 0x180000) {
820 /* Use H2C to set GNT_BT to HIGH */
821 h2c_parameter[0] = 1;
822 btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
825 /* set grant_bt to high */
826 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
828 /* set wlan_act to always low */
829 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
831 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE,
834 /* BT select s0/s1 is controlled by BT */
835 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67,
838 /* BT select s0/s1 is controlled by WiFi */
839 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67,
842 /* 0x4c[24:23]=00, Set Antenna control by BT_RFE_CTRL
843 * BT Vendor 0xac=0xf002
845 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
848 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
850 /* Use H2C to set GNT_BT to LOW */
851 if (fw_ver >= 0x180000) {
852 if (btcoexist->btc_read_1byte(btcoexist, 0x765) != 0) {
853 h2c_parameter[0] = 0;
854 btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
858 /* BT calibration check */
859 while (cnt_bt_cal_chk <= 20) {
860 u8tmp = btcoexist->btc_read_1byte(btcoexist,
863 if (u8tmp & BIT(0)) {
864 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
866 "[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n",
870 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
872 "[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n",
878 /* set grant_bt to PTA */
879 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x0);
882 if (btcoexist->btc_read_1byte(btcoexist, 0x76e) != 0xc) {
883 /* set wlan_act control by PTA */
884 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
887 btcoexist->btc_write_1byte_bitmask(
888 btcoexist, 0x67, 0x20,
889 0x1); /* BT select s0/s1 is controlled by WiFi */
892 if (use_ext_switch) {
894 /* 0x4c[23] = 0, 0x4c[24] = 1
895 * Antenna control by WL/BT
897 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
900 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
902 /* fixed internal switch S1->WiFi, S0->BT */
903 btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
905 if (board_info->btdm_ant_pos ==
906 BTC_ANTENNA_AT_MAIN_PORT) {
907 /* tell firmware "no antenna inverse" */
908 h2c_parameter[0] = 0;
909 /* ext switch type */
910 h2c_parameter[1] = 1;
911 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
914 /* tell firmware "antenna inverse" */
915 h2c_parameter[0] = 1;
916 /* ext switch type */
917 h2c_parameter[1] = 1;
918 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
924 (coex_dm->cur_ant_pos_type != coex_dm->pre_ant_pos_type)) {
925 /* ext switch setting */
926 switch (ant_pos_type) {
927 case BTC_ANT_PATH_WIFI:
928 if (board_info->btdm_ant_pos ==
929 BTC_ANTENNA_AT_MAIN_PORT)
930 btcoexist->btc_write_1byte_bitmask(
931 btcoexist, 0x92c, 0x3, 0x1);
933 btcoexist->btc_write_1byte_bitmask(
934 btcoexist, 0x92c, 0x3, 0x2);
936 case BTC_ANT_PATH_BT:
937 if (board_info->btdm_ant_pos ==
938 BTC_ANTENNA_AT_MAIN_PORT)
939 btcoexist->btc_write_1byte_bitmask(
940 btcoexist, 0x92c, 0x3, 0x2);
942 btcoexist->btc_write_1byte_bitmask(
943 btcoexist, 0x92c, 0x3, 0x1);
946 case BTC_ANT_PATH_PTA:
947 if (board_info->btdm_ant_pos ==
948 BTC_ANTENNA_AT_MAIN_PORT)
949 btcoexist->btc_write_1byte_bitmask(
950 btcoexist, 0x92c, 0x3, 0x1);
952 btcoexist->btc_write_1byte_bitmask(
953 btcoexist, 0x92c, 0x3, 0x2);
959 /* 0x4c[23] = 1, 0x4c[24] = 0,
960 * Antenna control by 0x64
962 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
965 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
967 /* Fix Ext switch Main->S1, Aux->S0 */
968 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x64, 0x1,
971 if (board_info->btdm_ant_pos ==
972 BTC_ANTENNA_AT_MAIN_PORT) {
973 /* tell firmware "no antenna inverse" */
974 h2c_parameter[0] = 0;
975 /* internal switch type */
976 h2c_parameter[1] = 0;
977 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
980 /* tell firmware "antenna inverse" */
981 h2c_parameter[0] = 1;
982 /* internal switch type */
983 h2c_parameter[1] = 0;
984 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
990 (coex_dm->cur_ant_pos_type != coex_dm->pre_ant_pos_type)) {
991 /* internal switch setting */
992 switch (ant_pos_type) {
993 case BTC_ANT_PATH_WIFI:
994 if (board_info->btdm_ant_pos ==
995 BTC_ANTENNA_AT_MAIN_PORT)
996 btcoexist->btc_write_4byte(btcoexist,
999 btcoexist->btc_write_4byte(btcoexist,
1002 case BTC_ANT_PATH_BT:
1003 if (board_info->btdm_ant_pos ==
1004 BTC_ANTENNA_AT_MAIN_PORT)
1005 btcoexist->btc_write_4byte(btcoexist,
1008 btcoexist->btc_write_4byte(btcoexist,
1012 case BTC_ANT_PATH_PTA:
1013 if (board_info->btdm_ant_pos ==
1014 BTC_ANTENNA_AT_MAIN_PORT)
1015 btcoexist->btc_write_4byte(btcoexist,
1018 btcoexist->btc_write_4byte(btcoexist,
1025 coex_dm->pre_ant_pos_type = coex_dm->cur_ant_pos_type;
1028 static void halbtc8723b1ant_ps_tdma(struct btc_coexist *btcoexist,
1029 bool force_exec, bool turn_on, u8 type)
1031 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1032 bool wifi_busy = false;
1033 u8 rssi_adjust_val = 0;
1034 u8 ps_tdma_byte0_val = 0x51;
1035 u8 ps_tdma_byte3_val = 0x10;
1036 u8 ps_tdma_byte4_val = 0x50;
1037 s8 wifi_duration_adjust = 0x0;
1038 static bool pre_wifi_busy;
1040 coex_dm->cur_ps_tdma_on = turn_on;
1041 coex_dm->cur_ps_tdma = type;
1043 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1045 if (wifi_busy != pre_wifi_busy) {
1047 pre_wifi_busy = wifi_busy;
1051 if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1052 (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1056 if (coex_sta->scan_ap_num <= 5) {
1057 wifi_duration_adjust = 5;
1059 if (coex_sta->a2dp_bit_pool >= 35)
1060 wifi_duration_adjust = -10;
1061 else if (coex_sta->a2dp_bit_pool >= 45)
1062 wifi_duration_adjust = -15;
1063 } else if (coex_sta->scan_ap_num >= 40) {
1064 wifi_duration_adjust = -15;
1066 if (coex_sta->a2dp_bit_pool < 35)
1067 wifi_duration_adjust = -5;
1068 else if (coex_sta->a2dp_bit_pool < 45)
1069 wifi_duration_adjust = -10;
1070 } else if (coex_sta->scan_ap_num >= 20) {
1071 wifi_duration_adjust = -10;
1073 if (coex_sta->a2dp_bit_pool >= 45)
1074 wifi_duration_adjust = -15;
1076 wifi_duration_adjust = 0;
1078 if (coex_sta->a2dp_bit_pool >= 35)
1079 wifi_duration_adjust = -10;
1080 else if (coex_sta->a2dp_bit_pool >= 45)
1081 wifi_duration_adjust = -15;
1084 if ((type == 1) || (type == 2) || (type == 9) || (type == 11) ||
1085 (type == 101) || (type == 102) || (type == 109) || (type == 111)) {
1086 if (!coex_sta->force_lps_on) {
1087 /* Native power save TDMA, only for A2DP-only case
1088 * 1/2/9/11 while wifi noisy threshold > 30
1092 ps_tdma_byte0_val = 0x61;
1093 /* no tx-pause at BT-slot */
1094 ps_tdma_byte3_val = 0x11;
1095 /* 0x778 = d/1 toggle, no dynamic slot */
1096 ps_tdma_byte4_val = 0x10;
1099 ps_tdma_byte0_val = 0x51;
1100 /* tx-pause at BT-slot */
1101 ps_tdma_byte3_val = 0x10;
1102 /* 0x778 = d/1 toggle, dynamic slot */
1103 ps_tdma_byte4_val = 0x50;
1105 } else if ((type == 3) || (type == 13) || (type == 14) ||
1106 (type == 103) || (type == 113) || (type == 114)) {
1108 ps_tdma_byte0_val = 0x51;
1109 /* tx-pause at BT-slot */
1110 ps_tdma_byte3_val = 0x10;
1111 /* 0x778 = d/1 toggle, no dynamic slot */
1112 ps_tdma_byte4_val = 0x10;
1113 } else { /* native power save case */
1115 ps_tdma_byte0_val = 0x61;
1116 /* no tx-pause at BT-slot */
1117 ps_tdma_byte3_val = 0x11;
1118 /* 0x778 = d/1 toggle, no dynamic slot */
1119 ps_tdma_byte4_val = 0x11;
1120 /* psTdmaByte4Va is not define for 0x778 = d/1, 1/1 case */
1123 /* if (bt_link_info->slave_role) */
1124 if ((bt_link_info->slave_role) && (bt_link_info->a2dp_exist))
1125 /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
1126 ps_tdma_byte4_val = ps_tdma_byte4_val | 0x1;
1129 /* set antenna control by SW */
1130 ps_tdma_byte0_val = ps_tdma_byte0_val | 0x82;
1131 /* set antenna no toggle, control by antenna diversity */
1132 ps_tdma_byte3_val = ps_tdma_byte3_val | 0x60;
1138 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1a,
1143 halbtc8723b1ant_set_fw_ps_tdma(
1144 btcoexist, ps_tdma_byte0_val,
1145 0x3a + wifi_duration_adjust, 0x03,
1146 ps_tdma_byte3_val, ps_tdma_byte4_val);
1148 rssi_adjust_val = 11;
1151 halbtc8723b1ant_set_fw_ps_tdma(
1152 btcoexist, ps_tdma_byte0_val,
1153 0x2d + wifi_duration_adjust, 0x03,
1154 ps_tdma_byte3_val, ps_tdma_byte4_val);
1157 halbtc8723b1ant_set_fw_ps_tdma(
1158 btcoexist, ps_tdma_byte0_val, 0x30, 0x03,
1159 ps_tdma_byte3_val, ps_tdma_byte4_val);
1162 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1166 halbtc8723b1ant_set_fw_ps_tdma(
1167 btcoexist, ps_tdma_byte0_val, 0x1f, 0x3,
1168 ps_tdma_byte3_val, 0x11);
1171 halbtc8723b1ant_set_fw_ps_tdma(
1172 btcoexist, ps_tdma_byte0_val, 0x20, 0x3,
1173 ps_tdma_byte3_val, 0x11);
1176 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xc,
1180 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1184 halbtc8723b1ant_set_fw_ps_tdma(
1185 btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
1186 ps_tdma_byte3_val, ps_tdma_byte4_val);
1189 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1193 halbtc8723b1ant_set_fw_ps_tdma(
1194 btcoexist, ps_tdma_byte0_val, 0x21, 0x03,
1195 ps_tdma_byte3_val, ps_tdma_byte4_val);
1198 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x0a,
1202 if (coex_sta->scan_ap_num <= 3)
1203 halbtc8723b1ant_set_fw_ps_tdma(
1204 btcoexist, ps_tdma_byte0_val, 0x40, 0x3,
1205 ps_tdma_byte3_val, ps_tdma_byte4_val);
1207 halbtc8723b1ant_set_fw_ps_tdma(
1208 btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
1209 ps_tdma_byte3_val, ps_tdma_byte4_val);
1212 if (coex_sta->scan_ap_num <= 3)
1213 halbtc8723b1ant_set_fw_ps_tdma(
1214 btcoexist, 0x51, 0x30, 0x3, 0x10, 0x50);
1216 halbtc8723b1ant_set_fw_ps_tdma(
1217 btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
1218 ps_tdma_byte3_val, ps_tdma_byte4_val);
1221 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1225 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1229 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1233 halbtc8723b1ant_set_fw_ps_tdma(
1234 btcoexist, ps_tdma_byte0_val, 0x3f, 0x03,
1235 ps_tdma_byte3_val, 0x10);
1238 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,
1242 halbtc8723b1ant_set_fw_ps_tdma(
1243 btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
1244 ps_tdma_byte3_val, 0x10);
1247 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1251 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1255 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1259 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1263 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1267 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x69, 0x25,
1271 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xab, 0x1a,
1275 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x30,
1279 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1a,
1283 halbtc8723b1ant_set_fw_ps_tdma(
1284 btcoexist, ps_tdma_byte0_val, 0x35, 0x3,
1285 ps_tdma_byte3_val, ps_tdma_byte4_val);
1288 halbtc8723b1ant_set_fw_ps_tdma(
1289 btcoexist, ps_tdma_byte0_val, 0x35, 0x3,
1290 ps_tdma_byte3_val, 0x10);
1293 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x53, 0x1a,
1297 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x63, 0x1a,
1301 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x12,
1305 /* SoftAP only with no sta associated,BT disable ,TDMA
1306 * mode for power saving
1308 * here softap mode screen off will cost 70-80mA for
1311 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x23, 0x18,
1316 /* for 1-Ant translate to 2-Ant */
1317 halbtc8723b1ant_set_fw_ps_tdma(
1318 btcoexist, ps_tdma_byte0_val,
1319 0x3a + wifi_duration_adjust, 0x03,
1320 ps_tdma_byte3_val, ps_tdma_byte4_val);
1323 halbtc8723b1ant_set_fw_ps_tdma(
1324 btcoexist, ps_tdma_byte0_val,
1325 0x2d + wifi_duration_adjust, 0x03,
1326 ps_tdma_byte3_val, ps_tdma_byte4_val);
1329 halbtc8723b1ant_set_fw_ps_tdma(
1330 btcoexist, ps_tdma_byte0_val, 0x3a, 0x03,
1331 ps_tdma_byte3_val, ps_tdma_byte4_val);
1334 halbtc8723b1ant_set_fw_ps_tdma(
1335 btcoexist, ps_tdma_byte0_val, 0x15, 0x3,
1336 ps_tdma_byte3_val, 0x11);
1339 halbtc8723b1ant_set_fw_ps_tdma(
1340 btcoexist, ps_tdma_byte0_val, 0x20, 0x3,
1341 ps_tdma_byte3_val, 0x11);
1344 halbtc8723b1ant_set_fw_ps_tdma(
1345 btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
1346 ps_tdma_byte3_val, ps_tdma_byte4_val);
1349 halbtc8723b1ant_set_fw_ps_tdma(
1350 btcoexist, ps_tdma_byte0_val, 0x21, 0x03,
1351 ps_tdma_byte3_val, ps_tdma_byte4_val);
1354 halbtc8723b1ant_set_fw_ps_tdma(
1355 btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
1356 ps_tdma_byte3_val, ps_tdma_byte4_val);
1359 halbtc8723b1ant_set_fw_ps_tdma(
1360 btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
1361 ps_tdma_byte3_val, ps_tdma_byte4_val);
1364 halbtc8723b1ant_set_fw_ps_tdma(
1365 btcoexist, ps_tdma_byte0_val, 0x3f, 0x03,
1366 ps_tdma_byte3_val, 0x10);
1369 halbtc8723b1ant_set_fw_ps_tdma(
1370 btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
1371 ps_tdma_byte3_val, 0x10);
1374 halbtc8723b1ant_set_fw_ps_tdma(
1375 btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
1376 ps_tdma_byte3_val, ps_tdma_byte4_val);
1379 halbtc8723b1ant_set_fw_ps_tdma(
1380 btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
1381 ps_tdma_byte3_val, 0x11);
1385 /* disable PS tdma */
1387 case 8: /* PTA Control */
1388 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x8, 0x0,
1390 halbtc8723b1ant_set_ant_path(btcoexist,
1397 /* Software control, Antenna at BT side */
1398 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0,
1401 case 1: /* 2-Ant, 0x778=3, antenna control by ant diversity */
1402 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1407 rssi_adjust_val = 0;
1408 btcoexist->btc_set(btcoexist,
1409 BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE,
1412 /* update pre state */
1413 coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1414 coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1418 void btc8723b1ant_tdma_dur_adj_for_acl(struct btc_coexist *btcoexist,
1421 struct rtl_priv *rtlpriv = btcoexist->adapter;
1422 static s32 up, dn, m, n, wait_count;
1423 /* 0: no change, +1: increase WiFi duration,
1424 * -1: decrease WiFi duration
1427 u8 retry_count = 0, bt_info_ext;
1428 bool wifi_busy = false;
1430 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1431 "[BTCoex], TdmaDurationAdjustForAcl()\n");
1433 if (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY)
1439 BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN) ||
1440 (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN) ||
1441 (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT)) {
1442 if (coex_dm->cur_ps_tdma != 1 && coex_dm->cur_ps_tdma != 2 &&
1443 coex_dm->cur_ps_tdma != 3 && coex_dm->cur_ps_tdma != 9) {
1444 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1446 coex_dm->ps_tdma_du_adj_type = 9;
1458 if (!coex_dm->auto_tdma_adjust) {
1459 coex_dm->auto_tdma_adjust = true;
1460 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1461 "[BTCoex], first run TdmaDurationAdjust()!!\n");
1463 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2);
1464 coex_dm->ps_tdma_du_adj_type = 2;
1473 /* acquire the BT TRx retry count from BT_Info byte2 */
1474 retry_count = coex_sta->bt_retry_cnt;
1475 bt_info_ext = coex_sta->bt_info_ext;
1477 if ((coex_sta->low_priority_tx) > 1050 ||
1478 (coex_sta->low_priority_rx) > 1250)
1483 /* no retry in the last 2-second duration */
1484 if (retry_count == 0) {
1492 /* if retry count during continuous n*2 seconds
1493 * is 0, enlarge WiFi duration
1500 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1501 "[BTCoex], Increase wifi duration!!\n");
1503 } else if (retry_count <= 3) {
1504 /* <=3 retry in the last 2-second duration */
1512 /* if continuous 2 retry count(every 2 seconds)
1513 * >0 and < 3, reduce WiFi duration
1515 if (wait_count <= 2)
1516 /* avoid loop between the two levels */
1522 /* maximum of m = 20 ' will recheck if
1523 * need to adjust wifi duration in
1524 * maximum time interval 120 seconds
1533 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1534 "[BTCoex], Decrease wifi duration for retryCounter<3!!\n");
1537 /* retry count > 3, once retry count > 3, to reduce
1540 if (wait_count == 1)
1541 /* to avoid loop between the two levels */
1547 /* maximum of m = 20 ' will recheck if need to
1548 * adjust wifi duration in maximum time interval
1558 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1559 "[BTCoex], Decrease wifi duration for retryCounter>3!!\n");
1563 if (coex_dm->cur_ps_tdma == 1) {
1564 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1566 coex_dm->ps_tdma_du_adj_type = 2;
1567 } else if (coex_dm->cur_ps_tdma == 2) {
1568 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1570 coex_dm->ps_tdma_du_adj_type = 9;
1571 } else if (coex_dm->cur_ps_tdma == 9) {
1572 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1574 coex_dm->ps_tdma_du_adj_type = 11;
1576 } else if (result == 1) {
1577 if (coex_dm->cur_ps_tdma == 11) {
1578 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1580 coex_dm->ps_tdma_du_adj_type = 9;
1581 } else if (coex_dm->cur_ps_tdma == 9) {
1582 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1584 coex_dm->ps_tdma_du_adj_type = 2;
1585 } else if (coex_dm->cur_ps_tdma == 2) {
1586 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1588 coex_dm->ps_tdma_du_adj_type = 1;
1592 if (coex_dm->cur_ps_tdma != 1 && coex_dm->cur_ps_tdma != 2 &&
1593 coex_dm->cur_ps_tdma != 9 && coex_dm->cur_ps_tdma != 11) {
1594 /* recover to previous adjust type */
1595 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1596 coex_dm->ps_tdma_du_adj_type);
1601 static void halbtc8723b1ant_ps_tdma_chk_pwr_save(struct btc_coexist *btcoexist,
1606 btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1609 /* already under LPS state */
1611 /* keep state under LPS, do nothing. */
1613 /* will leave LPS state, turn off psTdma first */
1614 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1620 /* will enter LPS state, turn off psTdma first */
1621 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1624 /* keep state under NO PS state, do nothing. */
1629 static void halbtc8723b1ant_power_save_state(struct btc_coexist *btcoexist,
1630 u8 ps_type, u8 lps_val,
1633 bool low_pwr_disable = false;
1636 case BTC_PS_WIFI_NATIVE:
1637 /* recover to original 32k low power setting */
1638 low_pwr_disable = false;
1639 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1641 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
1642 coex_sta->force_lps_on = false;
1645 halbtc8723b1ant_ps_tdma_chk_pwr_save(btcoexist, true);
1646 halbtc8723b1ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,
1648 /* when coex force to enter LPS, do not enter 32k low power */
1649 low_pwr_disable = true;
1650 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1652 /* power save must executed before psTdma */
1653 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
1654 coex_sta->force_lps_on = true;
1656 case BTC_PS_LPS_OFF:
1657 halbtc8723b1ant_ps_tdma_chk_pwr_save(btcoexist, false);
1658 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
1659 coex_sta->force_lps_on = false;
1666 static void halbtc8723b1ant_action_wifi_only(struct btc_coexist *btcoexist)
1668 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
1669 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
1670 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1671 FORCE_EXEC, false, false);
1674 /* check if BT is disabled */
1675 static void halbtc8723b1ant_monitor_bt_enable_disable(struct btc_coexist
1678 struct rtl_priv *rtlpriv = btcoexist->adapter;
1679 static u32 bt_disable_cnt;
1680 bool bt_active = true, bt_disabled = false;
1682 if (coex_sta->high_priority_tx == 0 &&
1683 coex_sta->high_priority_rx == 0 && coex_sta->low_priority_tx == 0 &&
1684 coex_sta->low_priority_rx == 0)
1686 if (coex_sta->high_priority_tx == 0xffff &&
1687 coex_sta->high_priority_rx == 0xffff &&
1688 coex_sta->low_priority_tx == 0xffff &&
1689 coex_sta->low_priority_rx == 0xffff)
1693 bt_disabled = false;
1696 if (bt_disable_cnt >= 2)
1699 if (coex_sta->bt_disabled != bt_disabled) {
1700 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1701 "[BTCoex], BT is from %s to %s!!\n",
1702 (coex_sta->bt_disabled ? "disabled" : "enabled"),
1703 (bt_disabled ? "disabled" : "enabled"));
1705 coex_sta->bt_disabled = bt_disabled;
1706 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
1709 halbtc8723b1ant_action_wifi_only(btcoexist);
1710 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS,
1712 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS,
1718 /*****************************************************
1720 * Non-Software Coex Mechanism start
1722 *****************************************************/
1724 static void halbtc8723b1ant_action_bt_whck_test(struct btc_coexist *btcoexist)
1726 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
1729 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1730 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
1732 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1735 static void halbtc8723b1ant_action_wifi_multiport(struct btc_coexist *btcoexist)
1737 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1740 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1741 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
1743 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1746 static void halbtc8723b1ant_action_hs(struct btc_coexist *btcoexist)
1748 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1749 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1752 static void halbtc8723b1ant_action_bt_inquiry(struct btc_coexist *btcoexist)
1754 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1755 bool wifi_connected = false, ap_enable = false;
1756 bool wifi_busy = false, bt_busy = false;
1758 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1760 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1762 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1763 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
1765 if (coex_sta->bt_abnormal_scan) {
1766 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);
1767 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
1768 } else if (!wifi_connected && !coex_sta->wifi_is_high_pri_task) {
1769 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1771 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1772 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1773 NORMAL_EXEC, false, false);
1774 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1775 } else if (bt_link_info->sco_exist || bt_link_info->hid_exist ||
1776 bt_link_info->a2dp_exist) {
1777 /* SCO/HID/A2DP busy */
1778 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1780 if (coex_sta->c2h_bt_remote_name_req)
1781 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1784 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1787 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1788 } else if (bt_link_info->pan_exist || wifi_busy) {
1789 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1791 if (coex_sta->c2h_bt_remote_name_req)
1792 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1795 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
1798 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1800 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1802 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1803 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1804 NORMAL_EXEC, false, false);
1805 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
1809 static void btc8723b1ant_act_bt_sco_hid_only_busy(struct btc_coexist *btcoexist,
1812 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1813 bool wifi_connected = false;
1815 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1818 /* tdma and coex table */
1819 if (bt_link_info->sco_exist) {
1820 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1821 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
1824 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 6);
1825 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
1829 static void halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
1830 struct btc_coexist *btcoexist,
1833 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1835 if ((coex_sta->low_priority_rx >= 950) && (!coex_sta->under_ips))
1836 bt_link_info->slave_role = true;
1838 bt_link_info->slave_role = false;
1840 if (bt_link_info->hid_only) { /* HID */
1841 btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist, wifi_status);
1842 coex_dm->auto_tdma_adjust = false;
1844 } else if (bt_link_info->a2dp_only) { /* A2DP */
1845 if (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE) {
1846 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1848 halbtc8723b1ant_coex_table_with_type(btcoexist,
1850 coex_dm->auto_tdma_adjust = false;
1852 btc8723b1ant_tdma_dur_adj_for_acl(btcoexist,
1854 halbtc8723b1ant_coex_table_with_type(btcoexist,
1856 coex_dm->auto_tdma_adjust = true;
1858 } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) ||
1859 (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&
1860 bt_link_info->pan_exist)) {
1861 /* A2DP + PAN(OPP,FTP), HID + A2DP + PAN(OPP,FTP) */
1862 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
1863 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1864 coex_dm->auto_tdma_adjust = false;
1865 } else if (bt_link_info->hid_exist && bt_link_info->a2dp_exist) {
1867 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1868 coex_dm->auto_tdma_adjust = false;
1870 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1871 } else if (bt_link_info->pan_only ||
1872 (bt_link_info->hid_exist && bt_link_info->pan_exist)) {
1873 /* PAN(OPP,FTP), HID + PAN(OPP,FTP) */
1874 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
1875 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1876 coex_dm->auto_tdma_adjust = false;
1878 /* BT no-profile busy (0x9) */
1879 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);
1880 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1881 coex_dm->auto_tdma_adjust = false;
1885 static void btc8723b1ant_action_wifi_not_conn(struct btc_coexist *btcoexist)
1887 /* power save state */
1888 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1891 /* tdma and coex table */
1892 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
1893 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
1895 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1899 btc8723b1ant_action_wifi_not_conn_scan(struct btc_coexist *btcoexist)
1901 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1903 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1906 /* tdma and coex table */
1907 if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
1908 if (bt_link_info->a2dp_exist) {
1909 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1911 halbtc8723b1ant_coex_table_with_type(btcoexist,
1913 } else if (bt_link_info->a2dp_exist) {
1914 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1916 halbtc8723b1ant_coex_table_with_type(btcoexist,
1919 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1921 halbtc8723b1ant_coex_table_with_type(btcoexist,
1924 } else if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
1925 coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY){
1926 btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
1927 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1929 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1930 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1931 NORMAL_EXEC, false, false);
1932 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1937 btc8723b1ant_act_wifi_not_conn_asso_auth(struct btc_coexist *btcoexist)
1939 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1941 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1944 /* tdma and coex table */
1945 if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) ||
1946 (bt_link_info->a2dp_exist)) {
1947 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
1948 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);
1949 } else if (bt_link_info->pan_exist) {
1950 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1951 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);
1953 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1954 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1955 NORMAL_EXEC, false, false);
1956 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2);
1960 static void btc8723b1ant_action_wifi_conn_scan(struct btc_coexist *btcoexist)
1962 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1964 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1967 /* tdma and coex table */
1968 if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
1969 if (bt_link_info->a2dp_exist) {
1970 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1972 halbtc8723b1ant_coex_table_with_type(btcoexist,
1974 } else if (bt_link_info->a2dp_exist &&
1975 bt_link_info->pan_exist) {
1976 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1978 halbtc8723b1ant_coex_table_with_type(btcoexist,
1981 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1983 halbtc8723b1ant_coex_table_with_type(btcoexist,
1986 } else if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
1987 coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {
1988 btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
1989 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1991 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1992 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
1993 NORMAL_EXEC, false, false);
1994 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1998 static void halbtc8723b1ant_action_wifi_connected_special_packet(
1999 struct btc_coexist *btcoexist)
2001 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2002 bool wifi_busy = false;
2004 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2006 /* no special packet process for both WiFi and BT very busy */
2008 ((bt_link_info->pan_exist) || (coex_sta->num_of_profile >= 2)))
2011 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2014 /* tdma and coex table */
2015 if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) {
2016 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
2017 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
2018 } else if (bt_link_info->a2dp_exist) {
2019 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
2020 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2021 } else if (bt_link_info->pan_exist) {
2022 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
2023 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2025 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2026 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2027 NORMAL_EXEC, false, false);
2028 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2032 static void halbtc8723b1ant_action_wifi_connected(struct btc_coexist *btcoexist)
2034 struct rtl_priv *rtlpriv = btcoexist->adapter;
2035 bool wifi_busy = false;
2036 bool scan = false, link = false, roam = false;
2037 bool under_4way = false, ap_enable = false;
2039 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2040 "[BTCoex], CoexForWifiConnect()===>\n");
2042 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
2045 halbtc8723b1ant_action_wifi_connected_special_packet(btcoexist);
2046 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2047 "[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n");
2051 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2052 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2053 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2055 if (scan || link || roam) {
2057 btc8723b1ant_action_wifi_conn_scan(btcoexist);
2059 halbtc8723b1ant_action_wifi_connected_special_packet(
2061 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2062 "[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n");
2066 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
2068 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2069 /* power save state */
2071 coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY &&
2072 !btcoexist->bt_link_info.hid_only) {
2073 if (btcoexist->bt_link_info.a2dp_only) {
2075 halbtc8723b1ant_power_save_state(btcoexist,
2079 if (coex_sta->scan_ap_num >=
2080 BT_8723B_1ANT_WIFI_NOISY_THRESH)
2081 /* no force LPS, no PS-TDMA,
2084 halbtc8723b1ant_power_save_state(
2085 btcoexist, BTC_PS_WIFI_NATIVE,
2088 halbtc8723b1ant_power_save_state(
2089 btcoexist, BTC_PS_LPS_ON, 0x50,
2092 } else if ((!coex_sta->pan_exist) && (!coex_sta->a2dp_exist) &&
2093 (!coex_sta->hid_exist))
2094 halbtc8723b1ant_power_save_state(
2095 btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2097 halbtc8723b1ant_power_save_state(btcoexist,
2101 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2104 /* tdma and coex table */
2106 if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
2107 halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
2109 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
2110 } else if (coex_dm->bt_status ==
2111 BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
2112 coex_dm->bt_status ==
2113 BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {
2114 btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
2115 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
2117 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2119 halbtc8723b1ant_set_ant_path(btcoexist,
2121 NORMAL_EXEC, false, false);
2122 halbtc8723b1ant_coex_table_with_type(btcoexist,
2126 if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
2127 halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
2129 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
2130 } else if (coex_dm->bt_status ==
2131 BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
2132 coex_dm->bt_status ==
2133 BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {
2134 btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
2135 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
2137 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2139 halbtc8723b1ant_set_ant_path(btcoexist,
2141 NORMAL_EXEC, false, false);
2142 halbtc8723b1ant_coex_table_with_type(btcoexist,
2148 static void halbtc8723b1ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
2150 struct rtl_priv *rtlpriv = btcoexist->adapter;
2151 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2152 bool wifi_connected = false, bt_hs_on = false, wifi_busy = false;
2153 bool increase_scan_dev_num = false;
2154 bool bt_ctrl_agg_buf_size = false;
2155 bool miracast_plus_bt = false;
2156 u8 agg_buf_size = 5;
2157 u8 iot_peer = BTC_IOT_PEER_UNKNOWN;
2158 u32 wifi_link_status = 0;
2159 u32 num_of_wifi_link = 0;
2162 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2163 "[BTCoex], RunCoexistMechanism()===>\n");
2165 if (btcoexist->manual_control) {
2166 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2167 "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
2171 if (btcoexist->stop_coex_dm) {
2172 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2173 "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");
2177 if (coex_sta->under_ips) {
2178 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2179 "[BTCoex], wifi is under IPS !!!\n");
2183 if (coex_sta->bt_whck_test) {
2184 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2185 "[BTCoex], wifi is under IPS !!!\n");
2186 halbtc8723b1ant_action_bt_whck_test(btcoexist);
2190 if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY ||
2191 coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
2192 coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY)
2193 increase_scan_dev_num = true;
2195 btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM,
2196 &increase_scan_dev_num);
2197 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2199 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2201 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2203 num_of_wifi_link = wifi_link_status >> 16;
2205 if (num_of_wifi_link >= 2 ||
2206 wifi_link_status & WIFI_P2P_GO_CONNECTED) {
2207 if (bt_link_info->bt_link_exist) {
2208 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1,
2210 miracast_plus_bt = true;
2212 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0,
2214 miracast_plus_bt = false;
2216 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
2218 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2219 bt_ctrl_agg_buf_size, agg_buf_size);
2221 if ((bt_link_info->a2dp_exist || wifi_busy) &&
2222 (coex_sta->c2h_bt_inquiry_page))
2223 halbtc8723b1ant_action_bt_inquiry(btcoexist);
2225 halbtc8723b1ant_action_wifi_multiport(btcoexist);
2230 miracast_plus_bt = false;
2231 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
2233 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2235 if (bt_link_info->bt_link_exist && wifi_connected) {
2236 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1, 0, 1);
2238 btcoexist->btc_get(btcoexist, BTC_GET_U1_IOT_PEER, &iot_peer);
2240 if (iot_peer != BTC_IOT_PEER_CISCO &&
2241 iot_peer != BTC_IOT_PEER_BROADCOM) {
2242 bool sco_exist = bt_link_info->sco_exist;
2244 halbtc8723b1ant_limited_rx(btcoexist,
2245 NORMAL_EXEC, sco_exist,
2248 if (bt_link_info->sco_exist) {
2249 halbtc8723b1ant_limited_rx(btcoexist,
2253 if (wifi_bw == BTC_WIFI_BW_HT40)
2254 halbtc8723b1ant_limited_rx(
2255 btcoexist, NORMAL_EXEC, false,
2258 halbtc8723b1ant_limited_rx(
2259 btcoexist, NORMAL_EXEC, false,
2264 halbtc8723b1ant_sw_mechanism(btcoexist, true);
2266 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2268 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
2271 halbtc8723b1ant_sw_mechanism(btcoexist, false);
2273 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2275 if (coex_sta->c2h_bt_inquiry_page) {
2276 halbtc8723b1ant_action_bt_inquiry(btcoexist);
2278 } else if (bt_hs_on) {
2279 halbtc8723b1ant_action_hs(btcoexist);
2283 if (!wifi_connected) {
2284 bool scan = false, link = false, roam = false;
2286 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2287 "[BTCoex], wifi is non connected-idle !!!\n");
2289 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2290 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2291 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2293 if (scan || link || roam) {
2295 btc8723b1ant_action_wifi_not_conn_scan(
2298 btc8723b1ant_act_wifi_not_conn_asso_auth(
2301 btc8723b1ant_action_wifi_not_conn(btcoexist);
2303 } else { /* wifi LPS/Busy */
2304 halbtc8723b1ant_action_wifi_connected(btcoexist);
2308 /* force coex mechanism to reset */
2309 static void halbtc8723b1ant_init_coex_dm(struct btc_coexist *btcoexist)
2312 halbtc8723b1ant_sw_mechanism(btcoexist, false);
2314 coex_sta->pop_event_cnt = 0;
2317 static void halbtc8723b1ant_init_hw_config(struct btc_coexist *btcoexist,
2318 bool backup, bool wifi_only)
2320 struct rtl_priv *rtlpriv = btcoexist->adapter;
2322 u8 u8tmpa = 0, u8tmpb = 0;
2324 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2325 "[BTCoex], 1Ant Init HW Config!!\n");
2327 /* 0xf0[15:12] --> Chip Cut information */
2328 coex_sta->cut_version =
2329 (btcoexist->btc_read_1byte(btcoexist, 0xf1) & 0xf0) >> 4;
2330 /* enable TBTT interrupt */
2331 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8, 0x1);
2333 /* 0x790[5:0] = 0x5 */
2334 btcoexist->btc_write_1byte(btcoexist, 0x790, 0x5);
2336 /* Enable counter statistics */
2337 btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1);
2338 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
2340 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2342 /* Antenna config */
2344 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI,
2345 FORCE_EXEC, true, false);
2347 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
2348 FORCE_EXEC, true, false);
2351 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
2353 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
2354 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
2355 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
2357 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2358 "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",
2359 u32tmp, u8tmpa, u8tmpb);
2362 /**************************************************************
2363 * extern function start with ex_btc8723b1ant_
2364 **************************************************************/
2365 void ex_btc8723b1ant_power_on_setting(struct btc_coexist *btcoexist)
2367 struct rtl_priv *rtlpriv = btcoexist->adapter;
2368 struct btc_board_info *board_info = &btcoexist->board_info;
2373 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2374 "xxxxxxxxxxxxxxxx Execute 8723b 1-Ant PowerOn Setting xxxxxxxxxxxxxxxx!!\n");
2376 btcoexist->stop_coex_dm = true;
2378 btcoexist->btc_write_1byte(btcoexist, 0x67, 0x20);
2380 /* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. */
2381 u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2);
2382 btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT0 | BIT1);
2384 /* set GRAN_BT = 1 */
2385 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
2386 /* set WLAN_ACT = 0 */
2387 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
2389 /* S0 or S1 setting and Local register setting(By the setting fw can get
2390 * ant number, S0/S1, ... info)
2392 * Local setting bit define
2393 * BIT0: "0" for no antenna inverse; "1" for antenna inverse
2394 * BIT1: "0" for internal switch; "1" for external switch
2395 * BIT2: "0" for one antenna; "1" for two antenna
2396 * NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and
2399 if (btcoexist->chip_interface == BTC_INTF_USB) {
2400 /* fixed at S0 for USB interface */
2401 btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
2403 u8tmp |= 0x1; /* antenna inverse */
2404 btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
2406 board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
2408 /* for PCIE and SDIO interface, we check efuse 0xc3[6] */
2409 if (board_info->single_ant_path == 0) {
2411 btcoexist->btc_write_4byte(btcoexist, 0x948, 0x280);
2412 board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
2414 } else if (board_info->single_ant_path == 1) {
2416 btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
2417 u8tmp |= 0x1; /* antenna inverse */
2418 board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
2422 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ANTPOSREGRISTRY_CTRL,
2425 if (btcoexist->chip_interface == BTC_INTF_PCI)
2426 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x384,
2428 else if (btcoexist->chip_interface == BTC_INTF_SDIO)
2429 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60,
2435 void ex_btc8723b1ant_init_hwconfig(struct btc_coexist *btcoexist,
2438 halbtc8723b1ant_init_hw_config(btcoexist, true, wifi_only);
2439 btcoexist->stop_coex_dm = false;
2442 void ex_btc8723b1ant_init_coex_dm(struct btc_coexist *btcoexist)
2444 struct rtl_priv *rtlpriv = btcoexist->adapter;
2446 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2447 "[BTCoex], Coex Mechanism Init!!\n");
2449 btcoexist->stop_coex_dm = false;
2451 halbtc8723b1ant_init_coex_dm(btcoexist);
2453 halbtc8723b1ant_query_bt_info(btcoexist);
2456 void ex_btc8723b1ant_display_coex_info(struct btc_coexist *btcoexist,
2459 struct btc_board_info *board_info = &btcoexist->board_info;
2460 struct btc_stack_info *stack_info = &btcoexist->stack_info;
2461 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2462 u8 u8tmp[4], i, bt_info_ext, pstdmacase = 0;
2465 bool roam = false, scan = false;
2466 bool link = false, wifi_under_5g = false;
2467 bool bt_hs_on = false, wifi_busy = false;
2468 s32 wifi_rssi = 0, bt_hs_rssi = 0;
2469 u32 wifi_bw, wifi_traffic_dir, fa_ofdm, fa_cck, wifi_link_status;
2470 u8 wifi_dot11_chnl, wifi_hs_chnl;
2471 u32 fw_ver = 0, bt_patch_ver = 0;
2473 seq_puts(m, "\n ============[BT Coexist info]============");
2475 if (btcoexist->manual_control) {
2476 seq_puts(m, "\n ============[Under Manual Control]==========");
2477 seq_puts(m, "\n ==========================================");
2479 if (btcoexist->stop_coex_dm) {
2480 seq_puts(m, "\n ============[Coex is STOPPED]============");
2481 seq_puts(m, "\n ==========================================");
2484 seq_printf(m, "\n %-35s = %d/ %d/ %d",
2485 "Ant PG Num/ Ant Mech/ Ant Pos:",
2486 board_info->pg_ant_num, board_info->btdm_ant_num,
2487 board_info->btdm_ant_pos);
2489 seq_printf(m, "\n %-35s = %s / %d",
2490 "BT stack/ hci ext ver",
2491 ((stack_info->profile_notified) ? "Yes" : "No"),
2492 stack_info->hci_version);
2494 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
2495 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
2496 seq_printf(m, "\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
2497 "CoexVer/ FwVer/ PatchVer",
2498 glcoex_ver_date_8723b_1ant, glcoex_ver_8723b_1ant,
2499 fw_ver, bt_patch_ver, bt_patch_ver);
2501 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2502 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
2504 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);
2505 seq_printf(m, "\n %-35s = %d / %d(%d)",
2506 "Dot11 channel / HsChnl(HsMode)",
2507 wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);
2509 seq_printf(m, "\n %-35s = %3ph ",
2510 "H2C Wifi inform bt chnl Info",
2511 coex_dm->wifi_chnl_info);
2513 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
2514 btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
2515 seq_printf(m, "\n %-35s = %d/ %d",
2516 "Wifi rssi/ HS rssi", wifi_rssi, bt_hs_rssi);
2518 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2519 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2520 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2521 seq_printf(m, "\n %-35s = %d/ %d/ %d ",
2522 "Wifi link/ roam/ scan", link, roam, scan);
2524 btcoexist->btc_get(btcoexist , BTC_GET_BL_WIFI_UNDER_5G,
2526 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2527 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2528 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
2531 seq_printf(m, "\n %-35s = %s / %s/ %s ",
2532 "Wifi status", (wifi_under_5g ? "5G" : "2.4G"),
2533 ((wifi_bw == BTC_WIFI_BW_LEGACY) ? "Legacy" :
2534 ((wifi_bw == BTC_WIFI_BW_HT40) ? "HT40" : "HT20")),
2535 ((!wifi_busy) ? "idle" :
2536 ((wifi_traffic_dir == BTC_WIFI_TRAFFIC_TX) ?
2537 "uplink" : "downlink")));
2539 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2541 seq_printf(m, "\n %-35s = %d/ %d/ %d/ %d/ %d",
2542 "sta/vwifi/hs/p2pGo/p2pGc",
2543 ((wifi_link_status & WIFI_STA_CONNECTED) ? 1 : 0),
2544 ((wifi_link_status & WIFI_AP_CONNECTED) ? 1 : 0),
2545 ((wifi_link_status & WIFI_HS_CONNECTED) ? 1 : 0),
2546 ((wifi_link_status & WIFI_P2P_GO_CONNECTED) ? 1 : 0),
2547 ((wifi_link_status & WIFI_P2P_GC_CONNECTED) ? 1 : 0));
2549 seq_printf(m, "\n %-35s = [%s/ %d/ %d] ",
2550 "BT [status/ rssi/ retryCnt]",
2551 ((coex_sta->bt_disabled) ? ("disabled") :
2552 ((coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan") :
2553 ((BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
2554 coex_dm->bt_status) ?
2555 "non-connected idle" :
2556 ((BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE ==
2557 coex_dm->bt_status) ?
2558 "connected-idle" : "busy")))),
2559 coex_sta->bt_rssi, coex_sta->bt_retry_cnt);
2561 seq_printf(m, "\n %-35s = %d / %d / %d / %d",
2562 "SCO/HID/PAN/A2DP", bt_link_info->sco_exist,
2563 bt_link_info->hid_exist, bt_link_info->pan_exist,
2564 bt_link_info->a2dp_exist);
2565 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO, m);
2567 bt_info_ext = coex_sta->bt_info_ext;
2568 seq_printf(m, "\n %-35s = %s",
2569 "BT Info A2DP rate",
2570 (bt_info_ext & BIT0) ? "Basic rate" : "EDR rate");
2572 for (i = 0; i < BT_INFO_SRC_8723B_1ANT_MAX; i++) {
2573 if (coex_sta->bt_info_c2h_cnt[i]) {
2574 seq_printf(m, "\n %-35s = %7ph(%d)",
2575 glbt_info_src_8723b_1ant[i],
2576 coex_sta->bt_info_c2h[i],
2577 coex_sta->bt_info_c2h_cnt[i]);
2580 seq_printf(m, "\n %-35s = %s/%s, (0x%x/0x%x)",
2581 "PS state, IPS/LPS, (lps/rpwm)",
2582 ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
2583 ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")),
2584 btcoexist->bt_info.lps_val,
2585 btcoexist->bt_info.rpwm_val);
2586 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);
2588 if (!btcoexist->manual_control) {
2590 seq_printf(m, "\n %-35s",
2591 "============[Sw mechanism]============");
2593 seq_printf(m, "\n %-35s = %d/",
2594 "SM[LowPenaltyRA]", coex_dm->cur_low_penalty_ra);
2596 seq_printf(m, "\n %-35s = %s/ %s/ %d ",
2597 "DelBA/ BtCtrlAgg/ AggSize",
2598 (btcoexist->bt_info.reject_agg_pkt ? "Yes" : "No"),
2599 (btcoexist->bt_info.bt_ctrl_buf_size ? "Yes" : "No"),
2600 btcoexist->bt_info.agg_buf_size);
2602 seq_printf(m, "\n %-35s = 0x%x ",
2603 "Rate Mask", btcoexist->bt_info.ra_mask);
2606 seq_printf(m, "\n %-35s",
2607 "============[Fw mechanism]============");
2609 pstdmacase = coex_dm->cur_ps_tdma;
2610 seq_printf(m, "\n %-35s = %5ph case-%d (auto:%d)",
2611 "PS TDMA", coex_dm->ps_tdma_para,
2612 pstdmacase, coex_dm->auto_tdma_adjust);
2614 seq_printf(m, "\n %-35s = %d ",
2615 "IgnWlanAct", coex_dm->cur_ignore_wlan_act);
2617 seq_printf(m, "\n %-35s = 0x%x ",
2618 "Latest error condition(should be 0)",
2619 coex_dm->error_condition);
2622 seq_printf(m, "\n %-35s = %d",
2623 "Coex Table Type", coex_sta->coex_table_type);
2626 seq_printf(m, "\n %-35s",
2627 "============[Hw setting]============");
2629 seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2630 "backup ARFR1/ARFR2/RL/AMaxTime", coex_dm->backup_arfr_cnt1,
2631 coex_dm->backup_arfr_cnt2, coex_dm->backup_retry_limit,
2632 coex_dm->backup_ampdu_max_time);
2634 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
2635 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
2636 u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
2637 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
2638 seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2639 "0x430/0x434/0x42a/0x456",
2640 u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]);
2642 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
2643 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6cc);
2644 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x880);
2645 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2646 "0x778/0x6cc/0x880[29:25]", u8tmp[0], u32tmp[0],
2647 (u32tmp[1] & 0x3e000000) >> 25);
2649 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x948);
2650 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x67);
2651 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x765);
2652 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2653 "0x948/ 0x67[5] / 0x765",
2654 u32tmp[0], ((u8tmp[0] & 0x20) >> 5), u8tmp[1]);
2656 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x92c);
2657 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x930);
2658 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x944);
2659 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2660 "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]",
2661 u32tmp[0] & 0x3, u32tmp[1] & 0xff, u32tmp[2] & 0x3);
2663 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x39);
2664 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
2665 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
2666 u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64);
2667 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
2668 "0x38[11]/0x40/0x4c[24:23]/0x64[0]",
2669 ((u8tmp[0] & 0x8) >> 3), u8tmp[1],
2670 ((u32tmp[0] & 0x01800000) >> 23), u8tmp[2] & 0x1);
2672 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
2673 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
2674 seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
2675 "0x550(bcn ctrl)/0x522", u32tmp[0], u8tmp[0]);
2677 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
2678 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x49c);
2679 seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
2680 "0xc50(dig)/0x49c(null-drop)", u32tmp[0] & 0xff, u8tmp[0]);
2682 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xda0);
2683 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xda4);
2684 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0xda8);
2685 u32tmp[3] = btcoexist->btc_read_4byte(btcoexist, 0xcf0);
2687 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);
2688 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
2690 fa_ofdm = ((u32tmp[0] & 0xffff0000) >> 16) +
2691 ((u32tmp[1] & 0xffff0000) >> 16) +
2692 (u32tmp[1] & 0xffff) +
2693 (u32tmp[2] & 0xffff) +
2694 ((u32tmp[3] & 0xffff0000) >> 16) +
2695 (u32tmp[3] & 0xffff);
2696 fa_cck = (u8tmp[0] << 8) + u8tmp[1];
2698 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2699 "OFDM-CCA/OFDM-FA/CCK-FA",
2700 u32tmp[0] & 0xffff, fa_ofdm, fa_cck);
2702 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
2703 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
2704 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
2705 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2706 "0x6c0/0x6c4/0x6c8(coexTable)",
2707 u32tmp[0], u32tmp[1], u32tmp[2]);
2709 seq_printf(m, "\n %-35s = %d/ %d",
2710 "0x770(high-pri rx/tx)", coex_sta->high_priority_rx,
2711 coex_sta->high_priority_tx);
2712 seq_printf(m, "\n %-35s = %d/ %d",
2713 "0x774(low-pri rx/tx)", coex_sta->low_priority_rx,
2714 coex_sta->low_priority_tx);
2715 if (btcoexist->auto_report_1ant)
2716 halbtc8723b1ant_monitor_bt_ctr(btcoexist);
2717 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);
2720 void ex_btc8723b1ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
2722 struct rtl_priv *rtlpriv = btcoexist->adapter;
2724 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2727 if (BTC_IPS_ENTER == type) {
2728 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2729 "[BTCoex], IPS ENTER notify\n");
2730 coex_sta->under_ips = true;
2732 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
2733 FORCE_EXEC, false, true);
2734 /* set PTA control */
2735 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2736 halbtc8723b1ant_coex_table_with_type(btcoexist,
2738 } else if (BTC_IPS_LEAVE == type) {
2739 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2740 "[BTCoex], IPS LEAVE notify\n");
2741 coex_sta->under_ips = false;
2743 halbtc8723b1ant_init_hw_config(btcoexist, false, false);
2744 halbtc8723b1ant_init_coex_dm(btcoexist);
2745 halbtc8723b1ant_query_bt_info(btcoexist);
2749 void ex_btc8723b1ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
2751 struct rtl_priv *rtlpriv = btcoexist->adapter;
2753 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2756 if (BTC_LPS_ENABLE == type) {
2757 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2758 "[BTCoex], LPS ENABLE notify\n");
2759 coex_sta->under_lps = true;
2760 } else if (BTC_LPS_DISABLE == type) {
2761 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2762 "[BTCoex], LPS DISABLE notify\n");
2763 coex_sta->under_lps = false;
2767 void ex_btc8723b1ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
2769 struct rtl_priv *rtlpriv = btcoexist->adapter;
2770 bool wifi_connected = false, bt_hs_on = false;
2773 u32 wifi_link_status = 0;
2774 u32 num_of_wifi_link = 0;
2775 bool bt_ctrl_agg_buf_size = false;
2776 u8 agg_buf_size = 5;
2778 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2781 if (type == BTC_SCAN_START) {
2782 coex_sta->wifi_is_high_pri_task = true;
2783 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2784 "[BTCoex], SCAN START notify\n");
2785 /* Force antenna setup for no scan result issue */
2786 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2787 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2788 FORCE_EXEC, false, false);
2789 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
2790 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
2791 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
2793 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2794 "[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",
2795 u32tmp, u8tmpa, u8tmpb);
2797 coex_sta->wifi_is_high_pri_task = false;
2798 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2799 "[BTCoex], SCAN FINISH notify\n");
2801 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
2802 &coex_sta->scan_ap_num);
2805 if (coex_sta->bt_disabled)
2808 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2809 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2812 halbtc8723b1ant_query_bt_info(btcoexist);
2814 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2816 num_of_wifi_link = wifi_link_status >> 16;
2817 if (num_of_wifi_link >= 2) {
2818 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2819 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2820 bt_ctrl_agg_buf_size, agg_buf_size);
2821 halbtc8723b1ant_action_wifi_multiport(btcoexist);
2825 if (coex_sta->c2h_bt_inquiry_page) {
2826 halbtc8723b1ant_action_bt_inquiry(btcoexist);
2828 } else if (bt_hs_on) {
2829 halbtc8723b1ant_action_hs(btcoexist);
2833 if (BTC_SCAN_START == type) {
2834 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2835 "[BTCoex], SCAN START notify\n");
2836 if (!wifi_connected)
2837 /* non-connected scan */
2838 btc8723b1ant_action_wifi_not_conn_scan(btcoexist);
2840 /* wifi is connected */
2841 btc8723b1ant_action_wifi_conn_scan(btcoexist);
2842 } else if (BTC_SCAN_FINISH == type) {
2843 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2844 "[BTCoex], SCAN FINISH notify\n");
2845 if (!wifi_connected)
2846 /* non-connected scan */
2847 btc8723b1ant_action_wifi_not_conn(btcoexist);
2849 halbtc8723b1ant_action_wifi_connected(btcoexist);
2853 void ex_btc8723b1ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
2855 struct rtl_priv *rtlpriv = btcoexist->adapter;
2856 bool wifi_connected = false, bt_hs_on = false;
2857 u32 wifi_link_status = 0;
2858 u32 num_of_wifi_link = 0;
2859 bool bt_ctrl_agg_buf_size = false, under_4way = false;
2860 u8 agg_buf_size = 5;
2862 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
2865 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
2866 coex_sta->bt_disabled)
2869 if (type == BTC_ASSOCIATE_START) {
2870 coex_sta->wifi_is_high_pri_task = true;
2872 /* Force antenna setup for no scan result issue */
2873 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2874 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2875 FORCE_EXEC, false, false);
2876 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2877 "[BTCoex], CONNECT START notify\n");
2878 coex_dm->arp_cnt = 0;
2880 coex_sta->wifi_is_high_pri_task = false;
2881 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2882 "[BTCoex], CONNECT FINISH notify\n");
2885 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2887 num_of_wifi_link = wifi_link_status>>16;
2888 if (num_of_wifi_link >= 2) {
2889 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2890 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2891 bt_ctrl_agg_buf_size, agg_buf_size);
2892 halbtc8723b1ant_action_wifi_multiport(btcoexist);
2896 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2897 if (coex_sta->c2h_bt_inquiry_page) {
2898 halbtc8723b1ant_action_bt_inquiry(btcoexist);
2900 } else if (bt_hs_on) {
2901 halbtc8723b1ant_action_hs(btcoexist);
2905 if (BTC_ASSOCIATE_START == type) {
2906 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2907 "[BTCoex], CONNECT START notify\n");
2908 btc8723b1ant_act_wifi_not_conn_asso_auth(btcoexist);
2909 } else if (BTC_ASSOCIATE_FINISH == type) {
2910 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2911 "[BTCoex], CONNECT FINISH notify\n");
2913 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2915 if (!wifi_connected)
2916 /* non-connected scan */
2917 btc8723b1ant_action_wifi_not_conn(btcoexist);
2919 halbtc8723b1ant_action_wifi_connected(btcoexist);
2923 void ex_btc8723b1ant_media_status_notify(struct btc_coexist *btcoexist,
2926 struct rtl_priv *rtlpriv = btcoexist->adapter;
2927 u8 h2c_parameter[3] = {0};
2929 u8 wifi_central_chnl;
2930 bool wifi_under_b_mode = false;
2932 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
2933 coex_sta->bt_disabled)
2936 if (type == BTC_MEDIA_CONNECT) {
2937 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2938 "[BTCoex], MEDIA connect notify\n");
2939 /* Force antenna setup for no scan result issue */
2940 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2941 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2942 FORCE_EXEC, false, false);
2943 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
2944 &wifi_under_b_mode);
2946 /* Set CCK Tx/Rx high Pri except 11b mode */
2947 if (wifi_under_b_mode) {
2948 btcoexist->btc_write_1byte(btcoexist, 0x6cd,
2950 btcoexist->btc_write_1byte(btcoexist, 0x6cf,
2953 btcoexist->btc_write_1byte(btcoexist, 0x6cd,
2955 btcoexist->btc_write_1byte(btcoexist, 0x6cf,
2959 coex_dm->backup_arfr_cnt1 =
2960 btcoexist->btc_read_4byte(btcoexist, 0x430);
2961 coex_dm->backup_arfr_cnt2 =
2962 btcoexist->btc_read_4byte(btcoexist, 0x434);
2963 coex_dm->backup_retry_limit =
2964 btcoexist->btc_read_2byte(btcoexist, 0x42a);
2965 coex_dm->backup_ampdu_max_time =
2966 btcoexist->btc_read_1byte(btcoexist, 0x456);
2968 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2969 "[BTCoex], MEDIA disconnect notify\n");
2970 coex_dm->arp_cnt = 0;
2972 btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x0); /* CCK Tx */
2973 btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x0); /* CCK Rx */
2975 coex_sta->cck_ever_lock = false;
2978 /* only 2.4G we need to inform bt the chnl mask */
2979 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
2980 &wifi_central_chnl);
2982 if (type == BTC_MEDIA_CONNECT && wifi_central_chnl <= 14) {
2983 h2c_parameter[0] = 0x0;
2984 h2c_parameter[1] = wifi_central_chnl;
2985 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2986 if (BTC_WIFI_BW_HT40 == wifi_bw)
2987 h2c_parameter[2] = 0x30;
2989 h2c_parameter[2] = 0x20;
2992 coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
2993 coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
2994 coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
2996 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2997 "[BTCoex], FW write 0x66 = 0x%x\n",
2998 h2c_parameter[0] << 16 | h2c_parameter[1] << 8 |
3001 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
3004 void ex_btc8723b1ant_special_packet_notify(struct btc_coexist *btcoexist,
3007 struct rtl_priv *rtlpriv = btcoexist->adapter;
3008 bool bt_hs_on = false;
3009 u32 wifi_link_status = 0;
3010 u32 num_of_wifi_link = 0;
3011 bool bt_ctrl_agg_buf_size = false, under_4way = false;
3012 u8 agg_buf_size = 5;
3014 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
3017 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
3018 coex_sta->bt_disabled)
3021 if (type == BTC_PACKET_DHCP || type == BTC_PACKET_EAPOL ||
3022 type == BTC_PACKET_ARP) {
3023 if (type == BTC_PACKET_ARP) {
3024 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3025 "[BTCoex], special Packet ARP notify\n");
3028 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3029 "[BTCoex], ARP Packet Count = %d\n",
3032 if ((coex_dm->arp_cnt >= 10) && (!under_4way))
3033 /* if APR PKT > 10 after connect, do not go to
3034 * ActionWifiConnectedSpecificPacket(btcoexist)
3036 coex_sta->wifi_is_high_pri_task = false;
3038 coex_sta->wifi_is_high_pri_task = true;
3040 coex_sta->wifi_is_high_pri_task = true;
3041 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3042 "[BTCoex], special Packet DHCP or EAPOL notify\n");
3045 coex_sta->wifi_is_high_pri_task = false;
3046 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3047 "[BTCoex], special Packet [Type = %d] notify\n",
3051 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3053 num_of_wifi_link = wifi_link_status >> 16;
3054 if (num_of_wifi_link >= 2) {
3055 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3056 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3057 bt_ctrl_agg_buf_size, agg_buf_size);
3058 halbtc8723b1ant_action_wifi_multiport(btcoexist);
3062 coex_sta->special_pkt_period_cnt = 0;
3064 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3065 if (coex_sta->c2h_bt_inquiry_page) {
3066 halbtc8723b1ant_action_bt_inquiry(btcoexist);
3068 } else if (bt_hs_on) {
3069 halbtc8723b1ant_action_hs(btcoexist);
3073 if (BTC_PACKET_DHCP == type ||
3074 BTC_PACKET_EAPOL == type) {
3075 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3076 "[BTCoex], special Packet(%d) notify\n", type);
3077 halbtc8723b1ant_action_wifi_connected_special_packet(btcoexist);
3081 void ex_btc8723b1ant_bt_info_notify(struct btc_coexist *btcoexist,
3082 u8 *tmp_buf, u8 length)
3084 struct rtl_priv *rtlpriv = btcoexist->adapter;
3086 u8 i, rsp_source = 0;
3087 bool wifi_connected = false;
3088 bool bt_busy = false;
3090 coex_sta->c2h_bt_info_req_sent = false;
3092 rsp_source = tmp_buf[0] & 0xf;
3093 if (rsp_source >= BT_INFO_SRC_8723B_1ANT_MAX)
3094 rsp_source = BT_INFO_SRC_8723B_1ANT_WIFI_FW;
3095 coex_sta->bt_info_c2h_cnt[rsp_source]++;
3097 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3098 "[BTCoex], Bt info[%d], length=%d, hex data = [",
3099 rsp_source, length);
3100 for (i = 0; i < length; i++) {
3101 coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
3103 bt_info = tmp_buf[i];
3104 if (i == length - 1)
3105 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3106 "0x%02x]\n", tmp_buf[i]);
3108 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3109 "0x%02x, ", tmp_buf[i]);
3112 /* if 0xff, it means BT is under WHCK test */
3113 if (bt_info == 0xff)
3114 coex_sta->bt_whck_test = true;
3116 coex_sta->bt_whck_test = false;
3118 if (rsp_source != BT_INFO_SRC_8723B_1ANT_WIFI_FW) {
3119 coex_sta->bt_retry_cnt = /* [3:0] */
3120 coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
3122 if (coex_sta->bt_retry_cnt >= 1)
3123 coex_sta->pop_event_cnt++;
3125 if (coex_sta->bt_info_c2h[rsp_source][2] & 0x20)
3126 coex_sta->c2h_bt_remote_name_req = true;
3128 coex_sta->c2h_bt_remote_name_req = false;
3131 coex_sta->bt_info_c2h[rsp_source][3] * 2 - 90;
3133 coex_sta->bt_info_ext =
3134 coex_sta->bt_info_c2h[rsp_source][4];
3136 if (coex_sta->bt_info_c2h[rsp_source][1] == 0x49) {
3137 coex_sta->a2dp_bit_pool =
3138 coex_sta->bt_info_c2h[rsp_source][6];
3140 coex_sta->a2dp_bit_pool = 0;
3143 coex_sta->bt_tx_rx_mask =
3144 (coex_sta->bt_info_c2h[rsp_source][2] & 0x40);
3145 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK,
3146 &coex_sta->bt_tx_rx_mask);
3148 if (!coex_sta->bt_tx_rx_mask) {
3149 /* BT into is responded by BT FW and BT RF REG
3150 * 0x3C != 0x15 => Need to switch BT TRx Mask
3152 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3153 "[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n");
3154 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
3157 /* BT TRx Mask lock 0x2c[0], 0x30[0] = 0 */
3158 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
3160 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
3164 /* Here we need to resend some wifi info to BT
3165 * because bt is reset and loss of the info.
3167 if (coex_sta->bt_info_ext & BIT1) {
3168 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3169 "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
3170 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3173 ex_btc8723b1ant_media_status_notify(btcoexist,
3176 ex_btc8723b1ant_media_status_notify(btcoexist,
3177 BTC_MEDIA_DISCONNECT);
3180 if (coex_sta->bt_info_ext & BIT3) {
3181 if (!btcoexist->manual_control &&
3182 !btcoexist->stop_coex_dm) {
3183 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3184 "[BTCoex], BT ext info bit3 check, set BT NOT ignore Wlan active!!\n");
3185 halbtc8723b1ant_ignore_wlan_act(btcoexist,
3190 /* BT already NOT ignore Wlan active, do nothing here.*/
3192 if (!btcoexist->auto_report_1ant) {
3193 if (coex_sta->bt_info_ext & BIT4) {
3194 /* BT auto report already enabled, do nothing */
3196 halbtc8723b1ant_bt_auto_report(btcoexist,
3203 /* check BIT2 first ==> check if bt is under inquiry or page scan */
3204 if (bt_info & BT_INFO_8723B_1ANT_B_INQ_PAGE)
3205 coex_sta->c2h_bt_inquiry_page = true;
3207 coex_sta->c2h_bt_inquiry_page = false;
3209 coex_sta->num_of_profile = 0;
3211 /* set link exist status */
3212 if (!(bt_info & BT_INFO_8723B_1ANT_B_CONNECTION)) {
3213 coex_sta->bt_link_exist = false;
3214 coex_sta->pan_exist = false;
3215 coex_sta->a2dp_exist = false;
3216 coex_sta->hid_exist = false;
3217 coex_sta->sco_exist = false;
3219 coex_sta->bt_hi_pri_link_exist = false;
3221 /* connection exists */
3222 coex_sta->bt_link_exist = true;
3223 if (bt_info & BT_INFO_8723B_1ANT_B_FTP) {
3224 coex_sta->pan_exist = true;
3225 coex_sta->num_of_profile++;
3227 coex_sta->pan_exist = false;
3229 if (bt_info & BT_INFO_8723B_1ANT_B_A2DP) {
3230 coex_sta->a2dp_exist = true;
3231 coex_sta->num_of_profile++;
3233 coex_sta->a2dp_exist = false;
3235 if (bt_info & BT_INFO_8723B_1ANT_B_HID) {
3236 coex_sta->hid_exist = true;
3237 coex_sta->num_of_profile++;
3239 coex_sta->hid_exist = false;
3241 if (bt_info & BT_INFO_8723B_1ANT_B_SCO_ESCO) {
3242 coex_sta->sco_exist = true;
3243 coex_sta->num_of_profile++;
3245 coex_sta->sco_exist = false;
3248 if ((!coex_sta->hid_exist) &&
3249 (!coex_sta->c2h_bt_inquiry_page) &&
3250 (!coex_sta->sco_exist)) {
3251 if (coex_sta->high_priority_tx +
3252 coex_sta->high_priority_rx >=
3254 coex_sta->hid_exist = true;
3255 coex_sta->wrong_profile_notification++;
3256 coex_sta->num_of_profile++;
3257 bt_info = bt_info | 0x28;
3261 /* Add Hi-Pri Tx/Rx counter to avoid false detection */
3262 if (((coex_sta->hid_exist) || (coex_sta->sco_exist)) &&
3263 (coex_sta->high_priority_tx + coex_sta->high_priority_rx >=
3265 (!coex_sta->c2h_bt_inquiry_page))
3266 coex_sta->bt_hi_pri_link_exist = true;
3268 if ((bt_info & BT_INFO_8723B_1ANT_B_ACL_BUSY) &&
3269 (coex_sta->num_of_profile == 0)) {
3270 if (coex_sta->low_priority_tx +
3271 coex_sta->low_priority_rx >=
3273 coex_sta->pan_exist = true;
3274 coex_sta->num_of_profile++;
3275 coex_sta->wrong_profile_notification++;
3276 bt_info = bt_info | 0x88;
3281 halbtc8723b1ant_update_bt_link_info(btcoexist);
3283 /* mask profile bit for connect-ilde identification
3284 * ( for CSR case: A2DP idle --> 0x41)
3286 bt_info = bt_info & 0x1f;
3288 if (!(bt_info & BT_INFO_8723B_1ANT_B_CONNECTION)) {
3289 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
3290 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3291 "[BTCoex], BtInfoNotify(), BT Non-Connected idle!\n");
3292 /* connection exists but no busy */
3293 } else if (bt_info == BT_INFO_8723B_1ANT_B_CONNECTION) {
3294 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE;
3295 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3296 "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
3297 } else if ((bt_info & BT_INFO_8723B_1ANT_B_SCO_ESCO) ||
3298 (bt_info & BT_INFO_8723B_1ANT_B_SCO_BUSY)) {
3299 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_SCO_BUSY;
3300 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3301 "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
3302 } else if (bt_info & BT_INFO_8723B_1ANT_B_ACL_BUSY) {
3303 if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)
3304 coex_dm->auto_tdma_adjust = false;
3306 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_ACL_BUSY;
3307 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3308 "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
3310 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_MAX;
3311 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3312 "[BTCoex], BtInfoNotify(), BT Non-Defined state!!\n");
3315 if ((BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
3316 (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
3317 (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
3321 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
3323 halbtc8723b1ant_run_coexist_mechanism(btcoexist);
3326 void ex_btc8723b1ant_rf_status_notify(struct btc_coexist *btcoexist, u8 type)
3328 struct rtl_priv *rtlpriv = btcoexist->adapter;
3330 u8 u8tmpa, u8tmpb, u8tmpc;
3332 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3333 "[BTCoex], RF Status notify\n");
3335 if (type == BTC_RF_ON) {
3336 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3337 "[BTCoex], RF is turned ON!!\n");
3338 btcoexist->stop_coex_dm = false;
3339 } else if (type == BTC_RF_OFF) {
3340 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3341 "[BTCoex], RF is turned OFF!!\n");
3343 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3345 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
3346 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
3347 FORCE_EXEC, false, true);
3349 halbtc8723b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
3350 btcoexist->stop_coex_dm = true;
3352 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
3353 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
3354 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
3355 u8tmpc = btcoexist->btc_read_1byte(btcoexist, 0x76e);
3357 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3358 "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x, 0x76e=0x%x\n",
3359 u32tmp, u8tmpa, u8tmpb, u8tmpc);
3363 void ex_btc8723b1ant_halt_notify(struct btc_coexist *btcoexist)
3365 struct rtl_priv *rtlpriv = btcoexist->adapter;
3367 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Halt notify\n");
3369 btcoexist->stop_coex_dm = true;
3371 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, FORCE_EXEC,
3374 halbtc8723b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
3376 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3378 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
3380 ex_btc8723b1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
3382 btcoexist->stop_coex_dm = true;
3385 void ex_btc8723b1ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
3387 struct rtl_priv *rtlpriv = btcoexist->adapter;
3389 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Pnp notify\n");
3391 if (BTC_WIFI_PNP_SLEEP == pnp_state) {
3392 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3393 "[BTCoex], Pnp notify to SLEEP\n");
3394 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
3395 FORCE_EXEC, false, true);
3396 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3398 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3399 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
3401 /* Driver do not leave IPS/LPS when driver is going to sleep, so
3402 * BTCoexistence think wifi is still under IPS/LPS
3404 * BT should clear UnderIPS/UnderLPS state to avoid mismatch
3405 * state after wakeup.
3407 coex_sta->under_ips = false;
3408 coex_sta->under_lps = false;
3409 btcoexist->stop_coex_dm = true;
3410 } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
3411 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3412 "[BTCoex], Pnp notify to WAKE UP\n");
3413 btcoexist->stop_coex_dm = false;
3414 halbtc8723b1ant_init_hw_config(btcoexist, false, false);
3415 halbtc8723b1ant_init_coex_dm(btcoexist);
3416 halbtc8723b1ant_query_bt_info(btcoexist);
3420 void ex_btc8723b1ant_coex_dm_reset(struct btc_coexist *btcoexist)
3422 struct rtl_priv *rtlpriv = btcoexist->adapter;
3424 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3425 "[BTCoex], *****************Coex DM Reset****************\n");
3427 halbtc8723b1ant_init_hw_config(btcoexist, false, false);
3428 halbtc8723b1ant_init_coex_dm(btcoexist);
3431 void ex_btc8723b1ant_periodical(struct btc_coexist *btcoexist)
3433 struct rtl_priv *rtlpriv = btcoexist->adapter;
3434 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3436 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3437 "[BTCoex], ==========================Periodical===========================\n");
3439 if (!btcoexist->auto_report_1ant) {
3440 halbtc8723b1ant_query_bt_info(btcoexist);
3441 halbtc8723b1ant_monitor_bt_enable_disable(btcoexist);
3443 halbtc8723b1ant_monitor_bt_ctr(btcoexist);
3444 halbtc8723b1ant_monitor_wifi_ctr(btcoexist);
3446 if ((coex_sta->high_priority_tx + coex_sta->high_priority_rx < 50) &&
3447 bt_link_info->hid_exist)
3448 bt_link_info->hid_exist = false;
3450 if (btc8723b1ant_is_wifi_status_changed(btcoexist) ||
3451 coex_dm->auto_tdma_adjust) {
3452 halbtc8723b1ant_run_coexist_mechanism(btcoexist);
3454 coex_sta->special_pkt_period_cnt++;