3449 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Copyright(c) 2012 Realtek Corporation.*/3 4/***************************************************************5 * Description:6 *7 * This file is for RTL8723B Co-exist mechanism8 *9 * History10 * 2012/11/15 Cosa first check in.11 *12 ***************************************************************/13 14/***************************************************************15 * include files16 ***************************************************************/17#include "halbt_precomp.h"18/***************************************************************19 * Global variables, these are static variables20 ***************************************************************/21static struct coex_dm_8723b_1ant glcoex_dm_8723b_1ant;22static struct coex_dm_8723b_1ant *coex_dm = &glcoex_dm_8723b_1ant;23static struct coex_sta_8723b_1ant glcoex_sta_8723b_1ant;24static struct coex_sta_8723b_1ant *coex_sta = &glcoex_sta_8723b_1ant;25 26static const char *const glbt_info_src_8723b_1ant[] = {27 "BT Info[wifi fw]",28 "BT Info[bt rsp]",29 "BT Info[bt auto report]",30};31 32static u32 glcoex_ver_date_8723b_1ant = 20130918;33static u32 glcoex_ver_8723b_1ant = 0x47;34 35/***************************************************************36 * local function proto type if needed37 ***************************************************************/38/***************************************************************39 * local function start with halbtc8723b1ant_40 ***************************************************************/41 42static void halbtc8723b1ant_updatera_mask(struct btc_coexist *btcoexist,43 bool force_exec, u32 dis_rate_mask)44{45 coex_dm->curra_mask = dis_rate_mask;46 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);50 51 coex_dm->prera_mask = coex_dm->curra_mask;52}53 54static void btc8723b1ant_auto_rate_fb_retry(struct btc_coexist *btcoexist,55 bool force_exec, u8 type)56{57 bool wifi_under_bmode = false;58 59 coex_dm->cur_arfr_type = type;60 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);68 break;69 case 1:70 btcoexist->btc_get(btcoexist,71 BTC_GET_BL_WIFI_UNDER_B_MODE,72 &wifi_under_bmode);73 if (wifi_under_bmode) {74 btcoexist->btc_write_4byte(btcoexist,75 0x430, 0x0);76 btcoexist->btc_write_4byte(btcoexist,77 0x434, 0x01010101);78 } else {79 btcoexist->btc_write_4byte(btcoexist,80 0x430, 0x0);81 btcoexist->btc_write_4byte(btcoexist,82 0x434, 0x04030201);83 }84 break;85 default:86 break;87 }88 }89 90 coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;91}92 93static void halbtc8723b1ant_retry_limit(struct btc_coexist *btcoexist,94 bool force_exec, u8 type)95{96 coex_dm->cur_retry_limit_type = type;97 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);104 break;105 case 1: /* retry limit = 8 */106 btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);107 break;108 default:109 break;110 }111 }112 113 coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;114}115 116static void halbtc8723b1ant_ampdu_maxtime(struct btc_coexist *btcoexist,117 bool force_exec, u8 type)118{119 coex_dm->cur_ampdu_time_type = type;120 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);127 break;128 case 1: /* AMPDU timw = 0x38 * 32us */129 btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);130 break;131 default:132 break;133 }134 }135 136 coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;137}138 139static void halbtc8723b1ant_limited_tx(struct btc_coexist *btcoexist,140 bool force_exec, u8 ra_masktype,141 u8 arfr_type, u8 retry_limit_type,142 u8 ampdu_time_type)143{144 switch (ra_masktype) {145 case 0: /* normal mode */146 halbtc8723b1ant_updatera_mask(btcoexist, force_exec, 0x0);147 break;148 case 1: /* disable cck 1/2 */149 halbtc8723b1ant_updatera_mask(btcoexist, force_exec,150 0x00000003);151 break;152 /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */153 case 2:154 halbtc8723b1ant_updatera_mask(btcoexist, force_exec,155 0x0001f1f7);156 break;157 default:158 break;159 }160 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);164}165 166static void halbtc8723b1ant_limited_rx(struct btc_coexist *btcoexist,167 bool force_exec, bool rej_ap_agg_pkt,168 bool bt_ctrl_agg_buf_size,169 u8 agg_buf_size)170{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;174 175 /**********************************************176 * Rx Aggregation related setting177 **********************************************/178 btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,179 &reject_rx_agg);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 work184 * when BT control Rx aggregation size.185 */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);189}190 191static void halbtc8723b1ant_query_bt_info(struct btc_coexist *btcoexist)192{193 u8 h2c_parameter[1] = {0};194 195 coex_sta->c2h_bt_info_req_sent = true;196 197 /* trigger */198 h2c_parameter[0] |= BIT(0);199 200 btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);201}202 203static void halbtc8723b1ant_monitor_bt_ctr(struct btc_coexist *btcoexist)204{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;209 210 reg_hp_txrx = 0x770;211 reg_lp_txrx = 0x774;212 213 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);214 reg_hp_tx = u32tmp & MASKLWORD;215 reg_hp_rx = (u32tmp & MASKHWORD) >> 16;216 217 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);218 reg_lp_tx = u32tmp & MASKLWORD;219 reg_lp_rx = (u32tmp & MASKHWORD) >> 16;220 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;225 226 if ((coex_sta->low_priority_tx > 1050) &&227 (!coex_sta->c2h_bt_inquiry_page))228 coex_sta->pop_event_cnt++;229 230 /* reset counter */231 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);232 233 /* This part is for wifi FW and driver to update BT's status as234 * disabled.235 *236 * The flow is as the following237 * 1. disable BT238 * 2. if all BT Tx/Rx counter = 0, after 6 sec we query bt info239 * 3. Because BT will not rsp from mailbox, so wifi fw will know BT is240 * disabled241 *242 * 4. FW will rsp c2h for BT that driver will know BT is disabled.243 */244 if ((reg_hp_tx == 0) && (reg_hp_rx == 0) && (reg_lp_tx == 0) &&245 (reg_lp_rx == 0)) {246 num_of_bt_counter_chk++;247 if (num_of_bt_counter_chk == 3)248 halbtc8723b1ant_query_bt_info(btcoexist);249 } else {250 num_of_bt_counter_chk = 0;251 }252}253 254static void halbtc8723b1ant_monitor_wifi_ctr(struct btc_coexist *btcoexist)255{256 s32 wifi_rssi = 0;257 bool wifi_busy = false, wifi_under_b_mode = false;258 static u8 cck_lock_counter;259 u32 total_cnt;260 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,264 &wifi_under_b_mode);265 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;271 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;276 } else {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);285 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);294 }295 296 /* reset counter */297 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x1);298 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x0);299 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;303 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)311 cck_lock_counter++;312 } else {313 if (cck_lock_counter > 0)314 cck_lock_counter--;315 }316 317 } else {318 if (cck_lock_counter > 0)319 cck_lock_counter--;320 }321 } else {322 if (cck_lock_counter > 0)323 cck_lock_counter--;324 }325 326 if (!coex_sta->pre_ccklock) {327 if (cck_lock_counter >= 3)328 coex_sta->cck_lock = true;329 else330 coex_sta->cck_lock = false;331 } else {332 if (cck_lock_counter == 0)333 coex_sta->cck_lock = false;334 else335 coex_sta->cck_lock = true;336 }337 338 if (coex_sta->cck_lock)339 coex_sta->cck_ever_lock = true;340 341 coex_sta->pre_ccklock = coex_sta->cck_lock;342}343 344static bool btc8723b1ant_is_wifi_status_changed(struct btc_coexist *btcoexist)345{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;350 351 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,352 &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,356 &under_4way);357 358 if (wifi_connected) {359 if (wifi_busy != pre_wifi_busy) {360 pre_wifi_busy = wifi_busy;361 return true;362 }363 if (under_4way != pre_under_4way) {364 pre_under_4way = under_4way;365 return true;366 }367 if (bt_hs_on != pre_bt_hs_on) {368 pre_bt_hs_on = bt_hs_on;369 return true;370 }371 }372 373 return false;374}375 376static void halbtc8723b1ant_update_bt_link_info(struct btc_coexist *btcoexist)377{378 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;379 bool bt_hs_on = false;380 381 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);382 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;389 390 /* work around for HS mode. */391 if (bt_hs_on) {392 bt_link_info->pan_exist = true;393 bt_link_info->bt_link_exist = true;394 }395 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;400 else401 bt_link_info->sco_only = false;402 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;407 else408 bt_link_info->a2dp_only = false;409 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;414 else415 bt_link_info->pan_only = false;416 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;421 else422 bt_link_info->hid_only = false;423}424 425static void halbtc8723b1ant_set_bt_auto_report(struct btc_coexist *btcoexist,426 bool enable_auto_report)427{428 u8 h2c_parameter[1] = {0};429 430 h2c_parameter[0] = 0;431 432 if (enable_auto_report)433 h2c_parameter[0] |= BIT(0);434 435 btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);436}437 438static void halbtc8723b1ant_bt_auto_report(struct btc_coexist *btcoexist,439 bool force_exec,440 bool enable_auto_report)441{442 coex_dm->cur_bt_auto_report = enable_auto_report;443 444 if (!force_exec) {445 if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)446 return;447 }448 halbtc8723b1ant_set_bt_auto_report(btcoexist,449 coex_dm->cur_bt_auto_report);450 451 coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;452}453 454static void btc8723b1ant_set_sw_pen_tx_rate_adapt(struct btc_coexist *btcoexist,455 bool low_penalty_ra)456{457 struct rtl_priv *rtlpriv = btcoexist->adapter;458 u8 h2c_parameter[6] = {0};459 460 h2c_parameter[0] = 0x6; /* opCode, 0x6= Retry_Penalty */461 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 */469 }470 471 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,472 "[BTCoex], set WiFi Low-Penalty Retry: %s",473 (low_penalty_ra ? "ON!!" : "OFF!!"));474 475 btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);476}477 478static void halbtc8723b1ant_low_penalty_ra(struct btc_coexist *btcoexist,479 bool force_exec, bool low_penalty_ra)480{481 coex_dm->cur_low_penalty_ra = low_penalty_ra;482 483 if (!force_exec) {484 if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)485 return;486 }487 btc8723b1ant_set_sw_pen_tx_rate_adapt(btcoexist,488 coex_dm->cur_low_penalty_ra);489 490 coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;491}492 493static void halbtc8723b1ant_set_coex_table(struct btc_coexist *btcoexist,494 u32 val0x6c0, u32 val0x6c4,495 u32 val0x6c8, u8 val0x6cc)496{497 struct rtl_priv *rtlpriv = btcoexist->adapter;498 499 rtl_dbg(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);502 503 rtl_dbg(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);506 507 rtl_dbg(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);510 511 rtl_dbg(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);514}515 516static void halbtc8723b1ant_coex_table(struct btc_coexist *btcoexist,517 bool force_exec, u32 val0x6c0,518 u32 val0x6c4, u32 val0x6c8,519 u8 val0x6cc)520{521 struct rtl_priv *rtlpriv = btcoexist->adapter;522 523 rtl_dbg(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;531 532 if (!force_exec) {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))537 return;538 }539 halbtc8723b1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,540 val0x6c8, val0x6cc);541 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;546}547 548static void halbtc8723b1ant_coex_table_with_type(struct btc_coexist *btcoexist,549 bool force_exec, u8 type)550{551 coex_sta->coex_table_type = type;552 553 switch (type) {554 case 0:555 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,556 0x55555555, 0xffffff, 0x3);557 break;558 case 1:559 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,560 0x5a5a5a5a, 0xffffff, 0x3);561 break;562 case 2:563 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,564 0x5a5a5a5a, 0xffffff, 0x3);565 break;566 case 3:567 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,568 0x5a5a5a5a, 0xffffff, 0x3);569 break;570 case 4:571 if ((coex_sta->cck_ever_lock) && (coex_sta->scan_ap_num <= 5))572 halbtc8723b1ant_coex_table(btcoexist, force_exec,573 0x55555555, 0xaaaa5a5a,574 0xffffff, 0x3);575 else576 halbtc8723b1ant_coex_table(btcoexist, force_exec,577 0x55555555, 0x5a5a5a5a,578 0xffffff, 0x3);579 break;580 case 5:581 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,582 0x5aaa5a5a, 0xffffff, 0x3);583 break;584 case 6:585 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,586 0xaaaaaaaa, 0xffffff, 0x3);587 break;588 case 7:589 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,590 0xaaaaaaaa, 0xffffff, 0x3);591 break;592 case 8:593 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,594 0x5ada5ada, 0xffffff, 0x3);595 break;596 case 9:597 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,598 0x5ada5ada, 0xffffff, 0x3);599 break;600 case 10:601 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,602 0x5ada5ada, 0xffffff, 0x3);603 break;604 case 11:605 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,606 0x5ada5ada, 0xffffff, 0x3);607 break;608 case 12:609 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,610 0x5ada5ada, 0xffffff, 0x3);611 break;612 case 13:613 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5fff5fff,614 0xaaaaaaaa, 0xffffff, 0x3);615 break;616 case 14:617 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5fff5fff,618 0x5ada5ada, 0xffffff, 0x3);619 break;620 case 15:621 halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,622 0xaaaaaaaa, 0xffffff, 0x3);623 break;624 default:625 break;626 }627}628 629static void630halbtc8723b1ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,631 bool enable)632{633 struct rtl_priv *rtlpriv = btcoexist->adapter;634 u8 h2c_parameter[1] = {0};635 636 if (enable)637 h2c_parameter[0] |= BIT0; /* function enable */638 639 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,640 "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",641 h2c_parameter[0]);642 643 btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);644}645 646static void halbtc8723b1ant_ignore_wlan_act(struct btc_coexist *btcoexist,647 bool force_exec, bool enable)648{649 struct rtl_priv *rtlpriv = btcoexist->adapter;650 651 rtl_dbg(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;655 656 if (!force_exec) {657 rtl_dbg(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);661 662 if (coex_dm->pre_ignore_wlan_act ==663 coex_dm->cur_ignore_wlan_act)664 return;665 }666 halbtc8723b1ant_set_fw_ignore_wlan_act(btcoexist, enable);667 668 coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;669}670 671static void halbtc8723b1ant_set_fw_ps_tdma(struct btc_coexist *btcoexist,672 u8 byte1, u8 byte2, u8 byte3,673 u8 byte4, u8 byte5)674{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;679 680 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,681 &ap_enable);682 683 if (ap_enable) {684 if ((byte1 & BIT4) && !(byte1 & BIT5)) {685 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,686 "[BTCoex], FW for 1Ant AP mode\n");687 real_byte1 &= ~BIT4;688 real_byte1 |= BIT5;689 690 real_byte5 |= BIT5;691 real_byte5 &= ~BIT6;692 }693 }694 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;700 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;706 707 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,708 "[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n",709 h2c_parameter[0],710 h2c_parameter[1] << 24 |711 h2c_parameter[2] << 16 |712 h2c_parameter[3] << 8 |713 h2c_parameter[4]);714 715 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);716}717 718static void halbtc8723b1ant_set_lps_rpwm(struct btc_coexist *btcoexist,719 u8 lps_val, u8 rpwm_val)720{721 u8 lps = lps_val;722 u8 rpwm = rpwm_val;723 724 btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);725 btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);726}727 728static void halbtc8723b1ant_lps_rpwm(struct btc_coexist *btcoexist,729 bool force_exec,730 u8 lps_val, u8 rpwm_val)731{732 struct rtl_priv *rtlpriv = btcoexist->adapter;733 734 rtl_dbg(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;739 740 if (!force_exec) {741 rtl_dbg(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);744 745 if ((coex_dm->pre_lps == coex_dm->cur_lps) &&746 (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) {747 rtl_dbg(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);750 751 return;752 }753 }754 halbtc8723b1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);755 756 coex_dm->pre_lps = coex_dm->cur_lps;757 coex_dm->pre_rpwm = coex_dm->cur_rpwm;758}759 760static void halbtc8723b1ant_sw_mechanism(struct btc_coexist *btcoexist,761 bool low_penalty_ra)762{763 struct rtl_priv *rtlpriv = btcoexist->adapter;764 765 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,766 "[BTCoex], SM[LpRA] = %d\n", low_penalty_ra);767 768 halbtc8723b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);769}770 771static 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)774{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;782 783 coex_dm->cur_ant_pos_type = ant_pos_type;784 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);788 789 if ((fw_ver < 0xc0000) || pg_ext_switch)790 use_ext_switch = true;791 792 if (init_hw_cfg) {793 /* WiFi TRx Mask on */794 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,795 0x780);796 /* remove due to interrupt is disabled that polling c2h will797 * fail and delay 100ms.798 */799 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,804 h2c_parameter);805 } else {806 /* set grant_bt to high */807 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);808 }809 /* set wlan_act control by PTA */810 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);811 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,823 h2c_parameter);824 } else {825 /* set grant_bt to high */826 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);827 }828 /* set wlan_act to always low */829 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);830 831 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE,832 &is_in_mp_mode);833 if (!is_in_mp_mode)834 /* BT select s0/s1 is controlled by BT */835 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67,836 0x20, 0x0);837 else838 /* BT select s0/s1 is controlled by WiFi */839 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67,840 0x20, 0x1);841 842 /* 0x4c[24:23]=00, Set Antenna control by BT_RFE_CTRL843 * BT Vendor 0xac=0xf002844 */845 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);846 u32tmp &= ~BIT23;847 u32tmp &= ~BIT24;848 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);849 } else {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,855 h2c_parameter);856 }857 } else {858 /* BT calibration check */859 while (cnt_bt_cal_chk <= 20) {860 u8tmp = btcoexist->btc_read_1byte(btcoexist,861 0x49d);862 cnt_bt_cal_chk++;863 if (u8tmp & BIT(0)) {864 rtl_dbg(rtlpriv, COMP_BT_COEXIST,865 DBG_LOUD,866 "[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n",867 cnt_bt_cal_chk);868 mdelay(50);869 } else {870 rtl_dbg(rtlpriv, COMP_BT_COEXIST,871 DBG_LOUD,872 "[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n",873 cnt_bt_cal_chk);874 break;875 }876 }877 878 /* set grant_bt to PTA */879 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x0);880 }881 882 if (btcoexist->btc_read_1byte(btcoexist, 0x76e) != 0xc) {883 /* set wlan_act control by PTA */884 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);885 }886 887 btcoexist->btc_write_1byte_bitmask(888 btcoexist, 0x67, 0x20,889 0x1); /* BT select s0/s1 is controlled by WiFi */890 }891 892 if (use_ext_switch) {893 if (init_hw_cfg) {894 /* 0x4c[23] = 0, 0x4c[24] = 1895 * Antenna control by WL/BT896 */897 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);898 u32tmp &= ~BIT23;899 u32tmp |= BIT24;900 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);901 902 /* fixed internal switch S1->WiFi, S0->BT */903 btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);904 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,912 h2c_parameter);913 } else {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,919 h2c_parameter);920 }921 }922 923 if (force_exec ||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);932 else933 btcoexist->btc_write_1byte_bitmask(934 btcoexist, 0x92c, 0x3, 0x2);935 break;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);941 else942 btcoexist->btc_write_1byte_bitmask(943 btcoexist, 0x92c, 0x3, 0x1);944 break;945 default: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);951 else952 btcoexist->btc_write_1byte_bitmask(953 btcoexist, 0x92c, 0x3, 0x2);954 break;955 }956 }957 } else {958 if (init_hw_cfg) {959 /* 0x4c[23] = 1, 0x4c[24] = 0,960 * Antenna control by 0x64961 */962 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);963 u32tmp |= BIT23;964 u32tmp &= ~BIT24;965 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);966 967 /* Fix Ext switch Main->S1, Aux->S0 */968 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x64, 0x1,969 0x0);970 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,978 h2c_parameter);979 } else {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,985 h2c_parameter);986 }987 }988 989 if (force_exec ||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,997 0x948, 0x0);998 else999 btcoexist->btc_write_4byte(btcoexist,1000 0x948, 0x280);1001 break;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,1006 0x948, 0x280);1007 else1008 btcoexist->btc_write_4byte(btcoexist,1009 0x948, 0x0);1010 break;1011 default: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,1016 0x948, 0x200);1017 else1018 btcoexist->btc_write_4byte(btcoexist,1019 0x948, 0x80);1020 break;1021 }1022 }1023 }1024 1025 coex_dm->pre_ant_pos_type = coex_dm->cur_ant_pos_type;1026}1027 1028static void halbtc8723b1ant_ps_tdma(struct btc_coexist *btcoexist,1029 bool force_exec, bool turn_on, u8 type)1030{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;1039 1040 coex_dm->cur_ps_tdma_on = turn_on;1041 coex_dm->cur_ps_tdma = type;1042 1043 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);1044 1045 if (wifi_busy != pre_wifi_busy) {1046 force_exec = true;1047 pre_wifi_busy = wifi_busy;1048 }1049 1050 if (!force_exec) {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))1053 return;1054 }1055 1056 if (coex_sta->scan_ap_num <= 5) {1057 wifi_duration_adjust = 5;1058 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;1065 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;1072 1073 if (coex_sta->a2dp_bit_pool >= 45)1074 wifi_duration_adjust = -15;1075 } else {1076 wifi_duration_adjust = 0;1077 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;1082 }1083 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 case1088 * 1/2/9/11 while wifi noisy threshold > 301089 */1090 1091 /* no null-pkt */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;1097 } else {1098 /* null-pkt */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;1104 }1105 } else if ((type == 3) || (type == 13) || (type == 14) ||1106 (type == 103) || (type == 113) || (type == 114)) {1107 /* null-pkt */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 */1114 /* no null-pkt */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 */1121 }1122 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;1127 1128 if (type > 100) {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;1133 }1134 1135 if (turn_on) {1136 switch (type) {1137 default:1138 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1a,1139 0x1a, 0x0,1140 ps_tdma_byte4_val);1141 break;1142 case 1: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);1147 1148 rssi_adjust_val = 11;1149 break;1150 case 2: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);1155 break;1156 case 3:1157 halbtc8723b1ant_set_fw_ps_tdma(1158 btcoexist, ps_tdma_byte0_val, 0x30, 0x03,1159 ps_tdma_byte3_val, ps_tdma_byte4_val);1160 break;1161 case 4:1162 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,1163 0x3, 0x14, 0x0);1164 break;1165 case 5:1166 halbtc8723b1ant_set_fw_ps_tdma(1167 btcoexist, ps_tdma_byte0_val, 0x1f, 0x3,1168 ps_tdma_byte3_val, 0x11);1169 break;1170 case 6:1171 halbtc8723b1ant_set_fw_ps_tdma(1172 btcoexist, ps_tdma_byte0_val, 0x20, 0x3,1173 ps_tdma_byte3_val, 0x11);1174 break;1175 case 7:1176 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xc,1177 0x5, 0x0, 0x0);1178 break;1179 case 8:1180 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,1181 0x3, 0x10, 0x0);1182 break;1183 case 9:1184 halbtc8723b1ant_set_fw_ps_tdma(1185 btcoexist, ps_tdma_byte0_val, 0x21, 0x3,1186 ps_tdma_byte3_val, ps_tdma_byte4_val);1187 break;1188 case 10:1189 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,1190 0xa, 0x0, 0x40);1191 break;1192 case 11:1193 halbtc8723b1ant_set_fw_ps_tdma(1194 btcoexist, ps_tdma_byte0_val, 0x21, 0x03,1195 ps_tdma_byte3_val, ps_tdma_byte4_val);1196 break;1197 case 12:1198 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x0a,1199 0x0a, 0x0, 0x50);1200 break;1201 case 13: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);1206 else1207 halbtc8723b1ant_set_fw_ps_tdma(1208 btcoexist, ps_tdma_byte0_val, 0x21, 0x3,1209 ps_tdma_byte3_val, ps_tdma_byte4_val);1210 break;1211 case 14:1212 if (coex_sta->scan_ap_num <= 3)1213 halbtc8723b1ant_set_fw_ps_tdma(1214 btcoexist, 0x51, 0x30, 0x3, 0x10, 0x50);1215 else1216 halbtc8723b1ant_set_fw_ps_tdma(1217 btcoexist, ps_tdma_byte0_val, 0x21, 0x3,1218 ps_tdma_byte3_val, ps_tdma_byte4_val);1219 break;1220 case 15:1221 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,1222 0x3, 0x8, 0x0);1223 break;1224 case 16:1225 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,1226 0x3, 0x10, 0x0);1227 break;1228 case 18:1229 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,1230 0x3, 0x10, 0x0);1231 break;1232 case 20:1233 halbtc8723b1ant_set_fw_ps_tdma(1234 btcoexist, ps_tdma_byte0_val, 0x3f, 0x03,1235 ps_tdma_byte3_val, 0x10);1236 break;1237 case 21:1238 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,1239 0x03, 0x11, 0x11);1240 break;1241 case 22:1242 halbtc8723b1ant_set_fw_ps_tdma(1243 btcoexist, ps_tdma_byte0_val, 0x25, 0x03,1244 ps_tdma_byte3_val, 0x10);1245 break;1246 case 23:1247 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,1248 0x3, 0x31, 0x18);1249 break;1250 case 24:1251 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,1252 0x3, 0x31, 0x18);1253 break;1254 case 25:1255 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,1256 0x3, 0x31, 0x18);1257 break;1258 case 26:1259 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,1260 0x3, 0x31, 0x18);1261 break;1262 case 27:1263 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,1264 0x3, 0x31, 0x98);1265 break;1266 case 28:1267 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x69, 0x25,1268 0x3, 0x31, 0x0);1269 break;1270 case 29:1271 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xab, 0x1a,1272 0x1a, 0x1, 0x10);1273 break;1274 case 30:1275 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x30,1276 0x3, 0x10, 0x10);1277 break;1278 case 31:1279 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1a,1280 0x1a, 0, 0x58);1281 break;1282 case 32:1283 halbtc8723b1ant_set_fw_ps_tdma(1284 btcoexist, ps_tdma_byte0_val, 0x35, 0x3,1285 ps_tdma_byte3_val, ps_tdma_byte4_val);1286 break;1287 case 33:1288 halbtc8723b1ant_set_fw_ps_tdma(1289 btcoexist, ps_tdma_byte0_val, 0x35, 0x3,1290 ps_tdma_byte3_val, 0x10);1291 break;1292 case 34:1293 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x53, 0x1a,1294 0x1a, 0x0, 0x10);1295 break;1296 case 35:1297 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x63, 0x1a,1298 0x1a, 0x0, 0x10);1299 break;1300 case 36:1301 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x12,1302 0x3, 0x14, 0x50);1303 break;1304 case 40:1305 /* SoftAP only with no sta associated,BT disable ,TDMA1306 * mode for power saving1307 *1308 * here softap mode screen off will cost 70-80mA for1309 * phone1310 */1311 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x23, 0x18,1312 0x00, 0x10, 0x24);1313 break;1314 1315 case 101: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);1321 break;1322 case 102: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);1327 break;1328 case 103:1329 halbtc8723b1ant_set_fw_ps_tdma(1330 btcoexist, ps_tdma_byte0_val, 0x3a, 0x03,1331 ps_tdma_byte3_val, ps_tdma_byte4_val);1332 break;1333 case 105:1334 halbtc8723b1ant_set_fw_ps_tdma(1335 btcoexist, ps_tdma_byte0_val, 0x15, 0x3,1336 ps_tdma_byte3_val, 0x11);1337 break;1338 case 106:1339 halbtc8723b1ant_set_fw_ps_tdma(1340 btcoexist, ps_tdma_byte0_val, 0x20, 0x3,1341 ps_tdma_byte3_val, 0x11);1342 break;1343 case 109:1344 halbtc8723b1ant_set_fw_ps_tdma(1345 btcoexist, ps_tdma_byte0_val, 0x21, 0x3,1346 ps_tdma_byte3_val, ps_tdma_byte4_val);1347 break;1348 case 111:1349 halbtc8723b1ant_set_fw_ps_tdma(1350 btcoexist, ps_tdma_byte0_val, 0x21, 0x03,1351 ps_tdma_byte3_val, ps_tdma_byte4_val);1352 break;1353 case 113:1354 halbtc8723b1ant_set_fw_ps_tdma(1355 btcoexist, ps_tdma_byte0_val, 0x21, 0x3,1356 ps_tdma_byte3_val, ps_tdma_byte4_val);1357 break;1358 case 114:1359 halbtc8723b1ant_set_fw_ps_tdma(1360 btcoexist, ps_tdma_byte0_val, 0x21, 0x3,1361 ps_tdma_byte3_val, ps_tdma_byte4_val);1362 break;1363 case 120:1364 halbtc8723b1ant_set_fw_ps_tdma(1365 btcoexist, ps_tdma_byte0_val, 0x3f, 0x03,1366 ps_tdma_byte3_val, 0x10);1367 break;1368 case 122:1369 halbtc8723b1ant_set_fw_ps_tdma(1370 btcoexist, ps_tdma_byte0_val, 0x25, 0x03,1371 ps_tdma_byte3_val, 0x10);1372 break;1373 case 132:1374 halbtc8723b1ant_set_fw_ps_tdma(1375 btcoexist, ps_tdma_byte0_val, 0x25, 0x03,1376 ps_tdma_byte3_val, ps_tdma_byte4_val);1377 break;1378 case 133:1379 halbtc8723b1ant_set_fw_ps_tdma(1380 btcoexist, ps_tdma_byte0_val, 0x25, 0x03,1381 ps_tdma_byte3_val, 0x11);1382 break;1383 }1384 } else {1385 /* disable PS tdma */1386 switch (type) {1387 case 8: /* PTA Control */1388 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x8, 0x0,1389 0x0, 0x0, 0x0);1390 halbtc8723b1ant_set_ant_path(btcoexist,1391 BTC_ANT_PATH_PTA,1392 FORCE_EXEC,1393 false, false);1394 break;1395 case 0:1396 default:1397 /* Software control, Antenna at BT side */1398 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0,1399 0x0, 0x0, 0x0);1400 break;1401 case 1: /* 2-Ant, 0x778=3, antenna control by ant diversity */1402 halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,1403 0x48, 0x0);1404 break;1405 }1406 }1407 rssi_adjust_val = 0;1408 btcoexist->btc_set(btcoexist,1409 BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE,1410 &rssi_adjust_val);1411 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;1415}1416 1417static1418void btc8723b1ant_tdma_dur_adj_for_acl(struct btc_coexist *btcoexist,1419 u8 wifi_status)1420{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 duration1425 */1426 s32 result;1427 u8 retry_count = 0;1428 1429 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1430 "[BTCoex], TdmaDurationAdjustForAcl()\n");1431 1432 if ((wifi_status ==1433 BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN) ||1434 (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN) ||1435 (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT)) {1436 if (coex_dm->cur_ps_tdma != 1 && coex_dm->cur_ps_tdma != 2 &&1437 coex_dm->cur_ps_tdma != 3 && coex_dm->cur_ps_tdma != 9) {1438 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1439 true, 9);1440 coex_dm->ps_tdma_du_adj_type = 9;1441 1442 up = 0;1443 dn = 0;1444 m = 1;1445 n = 3;1446 result = 0;1447 wait_count = 0;1448 }1449 return;1450 }1451 1452 if (!coex_dm->auto_tdma_adjust) {1453 coex_dm->auto_tdma_adjust = true;1454 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1455 "[BTCoex], first run TdmaDurationAdjust()!!\n");1456 1457 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2);1458 coex_dm->ps_tdma_du_adj_type = 2;1459 1460 up = 0;1461 dn = 0;1462 m = 1;1463 n = 3;1464 result = 0;1465 wait_count = 0;1466 } else {1467 /* acquire the BT TRx retry count from BT_Info byte2 */1468 retry_count = coex_sta->bt_retry_cnt;1469 1470 if ((coex_sta->low_priority_tx) > 1050 ||1471 (coex_sta->low_priority_rx) > 1250)1472 retry_count++;1473 1474 result = 0;1475 wait_count++;1476 /* no retry in the last 2-second duration */1477 if (retry_count == 0) {1478 up++;1479 dn--;1480 1481 if (dn <= 0)1482 dn = 0;1483 1484 if (up >= n) {1485 /* if retry count during continuous n*2 seconds1486 * is 0, enlarge WiFi duration1487 */1488 wait_count = 0;1489 n = 3;1490 up = 0;1491 dn = 0;1492 result = 1;1493 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1494 "[BTCoex], Increase wifi duration!!\n");1495 }1496 } else if (retry_count <= 3) {1497 /* <=3 retry in the last 2-second duration */1498 up--;1499 dn++;1500 1501 if (up <= 0)1502 up = 0;1503 1504 if (dn == 2) {1505 /* if continuous 2 retry count(every 2 seconds)1506 * >0 and < 3, reduce WiFi duration1507 */1508 if (wait_count <= 2)1509 /* avoid loop between the two levels */1510 m++;1511 else1512 m = 1;1513 1514 if (m >= 20)1515 /* maximum of m = 20 ' will recheck if1516 * need to adjust wifi duration in1517 * maximum time interval 120 seconds1518 */1519 m = 20;1520 1521 n = 3 * m;1522 up = 0;1523 dn = 0;1524 wait_count = 0;1525 result = -1;1526 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1527 "[BTCoex], Decrease wifi duration for retryCounter<3!!\n");1528 }1529 } else {1530 /* retry count > 3, once retry count > 3, to reduce1531 * WiFi duration1532 */1533 if (wait_count == 1)1534 /* to avoid loop between the two levels */1535 m++;1536 else1537 m = 1;1538 1539 if (m >= 20)1540 /* maximum of m = 20 ' will recheck if need to1541 * adjust wifi duration in maximum time interval1542 * 120 seconds1543 */1544 m = 20;1545 1546 n = 3 * m;1547 up = 0;1548 dn = 0;1549 wait_count = 0;1550 result = -1;1551 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1552 "[BTCoex], Decrease wifi duration for retryCounter>3!!\n");1553 }1554 1555 if (result == -1) {1556 if (coex_dm->cur_ps_tdma == 1) {1557 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1558 true, 2);1559 coex_dm->ps_tdma_du_adj_type = 2;1560 } else if (coex_dm->cur_ps_tdma == 2) {1561 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1562 true, 9);1563 coex_dm->ps_tdma_du_adj_type = 9;1564 } else if (coex_dm->cur_ps_tdma == 9) {1565 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1566 true, 11);1567 coex_dm->ps_tdma_du_adj_type = 11;1568 }1569 } else if (result == 1) {1570 if (coex_dm->cur_ps_tdma == 11) {1571 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1572 true, 9);1573 coex_dm->ps_tdma_du_adj_type = 9;1574 } else if (coex_dm->cur_ps_tdma == 9) {1575 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1576 true, 2);1577 coex_dm->ps_tdma_du_adj_type = 2;1578 } else if (coex_dm->cur_ps_tdma == 2) {1579 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1580 true, 1);1581 coex_dm->ps_tdma_du_adj_type = 1;1582 }1583 }1584 1585 if (coex_dm->cur_ps_tdma != 1 && coex_dm->cur_ps_tdma != 2 &&1586 coex_dm->cur_ps_tdma != 9 && coex_dm->cur_ps_tdma != 11) {1587 /* recover to previous adjust type */1588 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,1589 coex_dm->ps_tdma_du_adj_type);1590 }1591 }1592}1593 1594static void halbtc8723b1ant_ps_tdma_chk_pwr_save(struct btc_coexist *btcoexist,1595 bool new_ps_state)1596{1597 u8 lps_mode = 0x0;1598 1599 btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);1600 1601 if (lps_mode) {1602 /* already under LPS state */1603 if (new_ps_state) {1604 /* keep state under LPS, do nothing. */1605 } else {1606 /* will leave LPS state, turn off psTdma first */1607 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1608 false, 0);1609 }1610 } else {1611 /* NO PS state */1612 if (new_ps_state) {1613 /* will enter LPS state, turn off psTdma first */1614 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1615 false, 0);1616 } else {1617 /* keep state under NO PS state, do nothing. */1618 }1619 }1620}1621 1622static void halbtc8723b1ant_power_save_state(struct btc_coexist *btcoexist,1623 u8 ps_type, u8 lps_val,1624 u8 rpwm_val)1625{1626 bool low_pwr_disable = false;1627 1628 switch (ps_type) {1629 case BTC_PS_WIFI_NATIVE:1630 /* recover to original 32k low power setting */1631 low_pwr_disable = false;1632 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,1633 &low_pwr_disable);1634 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);1635 coex_sta->force_lps_on = false;1636 break;1637 case BTC_PS_LPS_ON:1638 halbtc8723b1ant_ps_tdma_chk_pwr_save(btcoexist, true);1639 halbtc8723b1ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,1640 rpwm_val);1641 /* when coex force to enter LPS, do not enter 32k low power */1642 low_pwr_disable = true;1643 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,1644 &low_pwr_disable);1645 /* power save must executed before psTdma */1646 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);1647 coex_sta->force_lps_on = true;1648 break;1649 case BTC_PS_LPS_OFF:1650 halbtc8723b1ant_ps_tdma_chk_pwr_save(btcoexist, false);1651 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);1652 coex_sta->force_lps_on = false;1653 break;1654 default:1655 break;1656 }1657}1658 1659static void halbtc8723b1ant_action_wifi_only(struct btc_coexist *btcoexist)1660{1661 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);1662 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);1663 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,1664 FORCE_EXEC, false, false);1665}1666 1667/* check if BT is disabled */1668static void halbtc8723b1ant_monitor_bt_enable_disable(struct btc_coexist1669 *btcoexist)1670{1671 struct rtl_priv *rtlpriv = btcoexist->adapter;1672 static u32 bt_disable_cnt;1673 bool bt_active = true, bt_disabled = false;1674 1675 if (coex_sta->high_priority_tx == 0 &&1676 coex_sta->high_priority_rx == 0 && coex_sta->low_priority_tx == 0 &&1677 coex_sta->low_priority_rx == 0)1678 bt_active = false;1679 if (coex_sta->high_priority_tx == 0xffff &&1680 coex_sta->high_priority_rx == 0xffff &&1681 coex_sta->low_priority_tx == 0xffff &&1682 coex_sta->low_priority_rx == 0xffff)1683 bt_active = false;1684 if (bt_active) {1685 bt_disable_cnt = 0;1686 bt_disabled = false;1687 } else {1688 bt_disable_cnt++;1689 if (bt_disable_cnt >= 2)1690 bt_disabled = true;1691 }1692 if (coex_sta->bt_disabled != bt_disabled) {1693 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1694 "[BTCoex], BT is from %s to %s!!\n",1695 (coex_sta->bt_disabled ? "disabled" : "enabled"),1696 (bt_disabled ? "disabled" : "enabled"));1697 1698 coex_sta->bt_disabled = bt_disabled;1699 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,1700 &bt_disabled);1701 if (bt_disabled) {1702 halbtc8723b1ant_action_wifi_only(btcoexist);1703 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS,1704 NULL);1705 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS,1706 NULL);1707 }1708 }1709}1710 1711/*****************************************************1712 *1713 * Non-Software Coex Mechanism start1714 *1715 *****************************************************/1716 1717static void halbtc8723b1ant_action_bt_whck_test(struct btc_coexist *btcoexist)1718{1719 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,1720 0x0);1721 1722 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1723 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,1724 false, false);1725 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);1726}1727 1728static void halbtc8723b1ant_action_wifi_multiport(struct btc_coexist *btcoexist)1729{1730 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1731 0x0, 0x0);1732 1733 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1734 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,1735 false, false);1736 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);1737}1738 1739static void halbtc8723b1ant_action_hs(struct btc_coexist *btcoexist)1740{1741 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);1742 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);1743}1744 1745static void halbtc8723b1ant_action_bt_inquiry(struct btc_coexist *btcoexist)1746{1747 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1748 bool wifi_connected = false, ap_enable = false;1749 bool wifi_busy = false, bt_busy = false;1750 1751 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,1752 &ap_enable);1753 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,1754 &wifi_connected);1755 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);1756 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);1757 1758 if (coex_sta->bt_abnormal_scan) {1759 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);1760 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);1761 } else if (!wifi_connected && !coex_sta->wifi_is_high_pri_task) {1762 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1763 0x0, 0x0);1764 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1765 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,1766 NORMAL_EXEC, false, false);1767 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);1768 } else if (bt_link_info->sco_exist || bt_link_info->hid_exist ||1769 bt_link_info->a2dp_exist) {1770 /* SCO/HID/A2DP busy */1771 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1772 0x0, 0x0);1773 if (coex_sta->c2h_bt_remote_name_req)1774 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,1775 33);1776 else1777 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,1778 32);1779 1780 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);1781 } else if (bt_link_info->pan_exist || wifi_busy) {1782 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1783 0x0, 0x0);1784 if (coex_sta->c2h_bt_remote_name_req)1785 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,1786 33);1787 else1788 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,1789 32);1790 1791 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);1792 } else {1793 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1794 0x0, 0x0);1795 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1796 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,1797 NORMAL_EXEC, false, false);1798 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);1799 }1800}1801 1802static void btc8723b1ant_act_bt_sco_hid_only_busy(struct btc_coexist *btcoexist,1803 u8 wifi_status)1804{1805 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1806 bool wifi_connected = false;1807 1808 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,1809 &wifi_connected);1810 1811 /* tdma and coex table */1812 if (bt_link_info->sco_exist) {1813 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);1814 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);1815 } else {1816 /* HID */1817 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 6);1818 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);1819 }1820}1821 1822static void halbtc8723b1ant_action_wifi_connected_bt_acl_busy(1823 struct btc_coexist *btcoexist,1824 u8 wifi_status)1825{1826 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1827 1828 if ((coex_sta->low_priority_rx >= 950) && (!coex_sta->under_ips))1829 bt_link_info->slave_role = true;1830 else1831 bt_link_info->slave_role = false;1832 1833 if (bt_link_info->hid_only) { /* HID */1834 btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist, wifi_status);1835 coex_dm->auto_tdma_adjust = false;1836 return;1837 } else if (bt_link_info->a2dp_only) { /* A2DP */1838 if (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE) {1839 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1840 true, 32);1841 halbtc8723b1ant_coex_table_with_type(btcoexist,1842 NORMAL_EXEC, 4);1843 coex_dm->auto_tdma_adjust = false;1844 } else {1845 btc8723b1ant_tdma_dur_adj_for_acl(btcoexist,1846 wifi_status);1847 halbtc8723b1ant_coex_table_with_type(btcoexist,1848 NORMAL_EXEC, 1);1849 coex_dm->auto_tdma_adjust = true;1850 }1851 } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) ||1852 (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&1853 bt_link_info->pan_exist)) {1854 /* A2DP + PAN(OPP,FTP), HID + A2DP + PAN(OPP,FTP) */1855 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);1856 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);1857 coex_dm->auto_tdma_adjust = false;1858 } else if (bt_link_info->hid_exist && bt_link_info->a2dp_exist) {1859 /* HID + A2DP */1860 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);1861 coex_dm->auto_tdma_adjust = false;1862 1863 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);1864 } else if (bt_link_info->pan_only ||1865 (bt_link_info->hid_exist && bt_link_info->pan_exist)) {1866 /* PAN(OPP,FTP), HID + PAN(OPP,FTP) */1867 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);1868 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);1869 coex_dm->auto_tdma_adjust = false;1870 } else {1871 /* BT no-profile busy (0x9) */1872 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);1873 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);1874 coex_dm->auto_tdma_adjust = false;1875 }1876}1877 1878static void btc8723b1ant_action_wifi_not_conn(struct btc_coexist *btcoexist)1879{1880 /* power save state */1881 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1882 0x0, 0x0);1883 1884 /* tdma and coex table */1885 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);1886 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,1887 false, false);1888 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);1889}1890 1891static void1892btc8723b1ant_action_wifi_not_conn_scan(struct btc_coexist *btcoexist)1893{1894 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1895 1896 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1897 0x0, 0x0);1898 1899 /* tdma and coex table */1900 if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {1901 if (bt_link_info->a2dp_exist) {1902 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1903 true, 32);1904 halbtc8723b1ant_coex_table_with_type(btcoexist,1905 NORMAL_EXEC, 4);1906 } else if (bt_link_info->pan_exist) {1907 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1908 true, 22);1909 halbtc8723b1ant_coex_table_with_type(btcoexist,1910 NORMAL_EXEC, 4);1911 } else {1912 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1913 true, 20);1914 halbtc8723b1ant_coex_table_with_type(btcoexist,1915 NORMAL_EXEC, 1);1916 }1917 } else if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||1918 coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY){1919 btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,1920 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);1921 } else {1922 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1923 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,1924 NORMAL_EXEC, false, false);1925 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);1926 }1927}1928 1929static void1930btc8723b1ant_act_wifi_not_conn_asso_auth(struct btc_coexist *btcoexist)1931{1932 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1933 1934 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1935 0x0, 0x0);1936 1937 /* tdma and coex table */1938 if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) ||1939 (bt_link_info->a2dp_exist)) {1940 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);1941 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);1942 } else if (bt_link_info->pan_exist) {1943 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);1944 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);1945 } else {1946 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1947 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,1948 NORMAL_EXEC, false, false);1949 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2);1950 }1951}1952 1953static void btc8723b1ant_action_wifi_conn_scan(struct btc_coexist *btcoexist)1954{1955 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1956 1957 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1958 0x0, 0x0);1959 1960 /* tdma and coex table */1961 if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {1962 if (bt_link_info->a2dp_exist) {1963 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1964 true, 32);1965 halbtc8723b1ant_coex_table_with_type(btcoexist,1966 NORMAL_EXEC, 4);1967 } else if (bt_link_info->pan_exist) {1968 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1969 true, 22);1970 halbtc8723b1ant_coex_table_with_type(btcoexist,1971 NORMAL_EXEC, 4);1972 } else {1973 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,1974 true, 20);1975 halbtc8723b1ant_coex_table_with_type(btcoexist,1976 NORMAL_EXEC, 4);1977 }1978 } else if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||1979 coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {1980 btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,1981 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);1982 } else {1983 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1984 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,1985 NORMAL_EXEC, false, false);1986 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);1987 }1988}1989 1990static void halbtc8723b1ant_action_wifi_connected_special_packet(1991 struct btc_coexist *btcoexist)1992{1993 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1994 bool wifi_busy = false;1995 1996 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);1997 1998 /* no special packet process for both WiFi and BT very busy */1999 if ((wifi_busy) &&2000 ((bt_link_info->pan_exist) || (coex_sta->num_of_profile >= 2)))2001 return;2002 2003 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,2004 0x0, 0x0);2005 2006 /* tdma and coex table */2007 if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) {2008 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);2009 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);2010 } else if (bt_link_info->a2dp_exist) {2011 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);2012 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);2013 } else if (bt_link_info->pan_exist) {2014 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);2015 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);2016 } else {2017 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);2018 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,2019 NORMAL_EXEC, false, false);2020 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);2021 }2022}2023 2024static void halbtc8723b1ant_action_wifi_connected(struct btc_coexist *btcoexist)2025{2026 struct rtl_priv *rtlpriv = btcoexist->adapter;2027 bool wifi_busy = false;2028 bool scan = false, link = false, roam = false;2029 bool under_4way = false, ap_enable = false;2030 2031 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2032 "[BTCoex], CoexForWifiConnect()===>\n");2033 2034 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,2035 &under_4way);2036 if (under_4way) {2037 halbtc8723b1ant_action_wifi_connected_special_packet(btcoexist);2038 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2039 "[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n");2040 return;2041 }2042 2043 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);2044 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);2045 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);2046 2047 if (scan || link || roam) {2048 if (scan)2049 btc8723b1ant_action_wifi_conn_scan(btcoexist);2050 else2051 halbtc8723b1ant_action_wifi_connected_special_packet(2052 btcoexist);2053 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2054 "[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n");2055 return;2056 }2057 2058 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,2059 &ap_enable);2060 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);2061 /* power save state */2062 if (!ap_enable &&2063 coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY &&2064 !btcoexist->bt_link_info.hid_only) {2065 if (btcoexist->bt_link_info.a2dp_only) {2066 if (!wifi_busy) {2067 halbtc8723b1ant_power_save_state(btcoexist,2068 BTC_PS_WIFI_NATIVE,2069 0x0, 0x0);2070 } else { /* busy */2071 if (coex_sta->scan_ap_num >=2072 BT_8723B_1ANT_WIFI_NOISY_THRESH)2073 /* no force LPS, no PS-TDMA,2074 * use pure TDMA2075 */2076 halbtc8723b1ant_power_save_state(2077 btcoexist, BTC_PS_WIFI_NATIVE,2078 0x0, 0x0);2079 else2080 halbtc8723b1ant_power_save_state(2081 btcoexist, BTC_PS_LPS_ON, 0x50,2082 0x4);2083 }2084 } else if ((!coex_sta->pan_exist) && (!coex_sta->a2dp_exist) &&2085 (!coex_sta->hid_exist))2086 halbtc8723b1ant_power_save_state(2087 btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);2088 else2089 halbtc8723b1ant_power_save_state(btcoexist,2090 BTC_PS_LPS_ON,2091 0x50, 0x4);2092 } else {2093 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,2094 0x0, 0x0);2095 }2096 /* tdma and coex table */2097 if (!wifi_busy) {2098 if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {2099 halbtc8723b1ant_action_wifi_connected_bt_acl_busy(2100 btcoexist,2101 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);2102 } else if (coex_dm->bt_status ==2103 BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||2104 coex_dm->bt_status ==2105 BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {2106 btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,2107 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);2108 } else {2109 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,2110 false, 8);2111 halbtc8723b1ant_set_ant_path(btcoexist,2112 BTC_ANT_PATH_PTA,2113 NORMAL_EXEC, false, false);2114 halbtc8723b1ant_coex_table_with_type(btcoexist,2115 NORMAL_EXEC, 2);2116 }2117 } else {2118 if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {2119 halbtc8723b1ant_action_wifi_connected_bt_acl_busy(2120 btcoexist,2121 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);2122 } else if (coex_dm->bt_status ==2123 BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||2124 coex_dm->bt_status ==2125 BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {2126 btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,2127 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);2128 } else {2129 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,2130 true, 32);2131 halbtc8723b1ant_set_ant_path(btcoexist,2132 BTC_ANT_PATH_PTA,2133 NORMAL_EXEC, false, false);2134 halbtc8723b1ant_coex_table_with_type(btcoexist,2135 NORMAL_EXEC, 4);2136 }2137 }2138}2139 2140static void halbtc8723b1ant_run_coexist_mechanism(struct btc_coexist *btcoexist)2141{2142 struct rtl_priv *rtlpriv = btcoexist->adapter;2143 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;2144 bool wifi_connected = false, bt_hs_on = false, wifi_busy = false;2145 bool increase_scan_dev_num = false;2146 bool bt_ctrl_agg_buf_size = false;2147 bool miracast_plus_bt = false;2148 u8 agg_buf_size = 5;2149 u8 iot_peer = BTC_IOT_PEER_UNKNOWN;2150 u32 wifi_link_status = 0;2151 u32 num_of_wifi_link = 0;2152 u32 wifi_bw;2153 2154 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2155 "[BTCoex], RunCoexistMechanism()===>\n");2156 2157 if (btcoexist->manual_control) {2158 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2159 "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");2160 return;2161 }2162 2163 if (btcoexist->stop_coex_dm) {2164 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2165 "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");2166 return;2167 }2168 2169 if (coex_sta->under_ips) {2170 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2171 "[BTCoex], wifi is under IPS !!!\n");2172 return;2173 }2174 2175 if (coex_sta->bt_whck_test) {2176 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2177 "[BTCoex], wifi is under IPS !!!\n");2178 halbtc8723b1ant_action_bt_whck_test(btcoexist);2179 return;2180 }2181 2182 if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY ||2183 coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||2184 coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY)2185 increase_scan_dev_num = true;2186 2187 btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM,2188 &increase_scan_dev_num);2189 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,2190 &wifi_connected);2191 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);2192 2193 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,2194 &wifi_link_status);2195 num_of_wifi_link = wifi_link_status >> 16;2196 2197 if (num_of_wifi_link >= 2 ||2198 wifi_link_status & WIFI_P2P_GO_CONNECTED) {2199 if (bt_link_info->bt_link_exist) {2200 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1,2201 0, 1);2202 miracast_plus_bt = true;2203 } else {2204 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0,2205 0, 0);2206 miracast_plus_bt = false;2207 }2208 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,2209 &miracast_plus_bt);2210 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,2211 bt_ctrl_agg_buf_size, agg_buf_size);2212 2213 if ((bt_link_info->a2dp_exist || wifi_busy) &&2214 (coex_sta->c2h_bt_inquiry_page))2215 halbtc8723b1ant_action_bt_inquiry(btcoexist);2216 else2217 halbtc8723b1ant_action_wifi_multiport(btcoexist);2218 2219 return;2220 }2221 2222 miracast_plus_bt = false;2223 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,2224 &miracast_plus_bt);2225 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);2226 2227 if (bt_link_info->bt_link_exist && wifi_connected) {2228 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1, 0, 1);2229 2230 btcoexist->btc_get(btcoexist, BTC_GET_U1_IOT_PEER, &iot_peer);2231 2232 if (iot_peer != BTC_IOT_PEER_CISCO &&2233 iot_peer != BTC_IOT_PEER_BROADCOM) {2234 bool sco_exist = bt_link_info->sco_exist;2235 2236 halbtc8723b1ant_limited_rx(btcoexist,2237 NORMAL_EXEC, sco_exist,2238 false, 0x5);2239 } else {2240 if (bt_link_info->sco_exist) {2241 halbtc8723b1ant_limited_rx(btcoexist,2242 NORMAL_EXEC, true,2243 false, 0x5);2244 } else {2245 if (wifi_bw == BTC_WIFI_BW_HT40)2246 halbtc8723b1ant_limited_rx(2247 btcoexist, NORMAL_EXEC, false,2248 true, 0x10);2249 else2250 halbtc8723b1ant_limited_rx(2251 btcoexist, NORMAL_EXEC, false,2252 true, 0x8);2253 }2254 }2255 2256 halbtc8723b1ant_sw_mechanism(btcoexist, true);2257 } else {2258 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);2259 2260 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,2261 0x5);2262 2263 halbtc8723b1ant_sw_mechanism(btcoexist, false);2264 }2265 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);2266 2267 if (coex_sta->c2h_bt_inquiry_page) {2268 halbtc8723b1ant_action_bt_inquiry(btcoexist);2269 return;2270 } else if (bt_hs_on) {2271 halbtc8723b1ant_action_hs(btcoexist);2272 return;2273 }2274 2275 if (!wifi_connected) {2276 bool scan = false, link = false, roam = false;2277 2278 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2279 "[BTCoex], wifi is non connected-idle !!!\n");2280 2281 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);2282 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);2283 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);2284 2285 if (scan || link || roam) {2286 if (scan)2287 btc8723b1ant_action_wifi_not_conn_scan(2288 btcoexist);2289 else2290 btc8723b1ant_act_wifi_not_conn_asso_auth(2291 btcoexist);2292 } else {2293 btc8723b1ant_action_wifi_not_conn(btcoexist);2294 }2295 } else { /* wifi LPS/Busy */2296 halbtc8723b1ant_action_wifi_connected(btcoexist);2297 }2298}2299 2300/* force coex mechanism to reset */2301static void halbtc8723b1ant_init_coex_dm(struct btc_coexist *btcoexist)2302{2303 /* sw all off */2304 halbtc8723b1ant_sw_mechanism(btcoexist, false);2305 2306 coex_sta->pop_event_cnt = 0;2307}2308 2309static void halbtc8723b1ant_init_hw_config(struct btc_coexist *btcoexist,2310 bool backup, bool wifi_only)2311{2312 struct rtl_priv *rtlpriv = btcoexist->adapter;2313 u32 u32tmp = 0;2314 u8 u8tmpa = 0, u8tmpb = 0;2315 2316 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2317 "[BTCoex], 1Ant Init HW Config!!\n");2318 2319 /* 0xf0[15:12] --> Chip Cut information */2320 coex_sta->cut_version =2321 (btcoexist->btc_read_1byte(btcoexist, 0xf1) & 0xf0) >> 4;2322 /* enable TBTT interrupt */2323 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8, 0x1);2324 2325 /* 0x790[5:0] = 0x5 */2326 btcoexist->btc_write_1byte(btcoexist, 0x790, 0x5);2327 2328 /* Enable counter statistics */2329 btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1);2330 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);2331 2332 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);2333 2334 /* Antenna config */2335 if (wifi_only)2336 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI,2337 FORCE_EXEC, true, false);2338 else2339 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,2340 FORCE_EXEC, true, false);2341 2342 /* PTA parameter */2343 halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);2344 2345 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);2346 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);2347 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);2348 2349 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2350 "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",2351 u32tmp, u8tmpa, u8tmpb);2352}2353 2354/**************************************************************2355 * extern function start with ex_btc8723b1ant_2356 **************************************************************/2357void ex_btc8723b1ant_power_on_setting(struct btc_coexist *btcoexist)2358{2359 struct rtl_priv *rtlpriv = btcoexist->adapter;2360 struct btc_board_info *board_info = &btcoexist->board_info;2361 u8 u8tmp = 0x0;2362 u16 u16tmp = 0x0;2363 u32 value;2364 2365 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2366 "xxxxxxxxxxxxxxxx Execute 8723b 1-Ant PowerOn Setting xxxxxxxxxxxxxxxx!!\n");2367 2368 btcoexist->stop_coex_dm = true;2369 2370 btcoexist->btc_write_1byte(btcoexist, 0x67, 0x20);2371 2372 /* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. */2373 u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2);2374 btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT0 | BIT1);2375 2376 /* set GRAN_BT = 1 */2377 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);2378 /* set WLAN_ACT = 0 */2379 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);2380 2381 /* S0 or S1 setting and Local register setting(By the setting fw can get2382 * ant number, S0/S1, ... info)2383 *2384 * Local setting bit define2385 * BIT0: "0" for no antenna inverse; "1" for antenna inverse2386 * BIT1: "0" for internal switch; "1" for external switch2387 * BIT2: "0" for one antenna; "1" for two antenna2388 * NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and2389 * BIT2 = 02390 */2391 if (btcoexist->chip_interface == BTC_INTF_USB) {2392 /* fixed at S0 for USB interface */2393 btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);2394 2395 u8tmp |= 0x1; /* antenna inverse */2396 btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);2397 2398 board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;2399 } else {2400 /* for PCIE and SDIO interface, we check efuse 0xc3[6] */2401 if (board_info->single_ant_path == 0) {2402 /* set to S1 */2403 btcoexist->btc_write_4byte(btcoexist, 0x948, 0x280);2404 board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;2405 value = 1;2406 } else if (board_info->single_ant_path == 1) {2407 /* set to S0 */2408 btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);2409 u8tmp |= 0x1; /* antenna inverse */2410 board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;2411 value = 0;2412 }2413 2414 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ANTPOSREGRISTRY_CTRL,2415 &value);2416 2417 if (btcoexist->chip_interface == BTC_INTF_PCI)2418 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x384,2419 u8tmp);2420 else if (btcoexist->chip_interface == BTC_INTF_SDIO)2421 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60,2422 u8tmp);2423 }2424}2425 2426 2427void ex_btc8723b1ant_init_hwconfig(struct btc_coexist *btcoexist,2428 bool wifi_only)2429{2430 halbtc8723b1ant_init_hw_config(btcoexist, true, wifi_only);2431 btcoexist->stop_coex_dm = false;2432}2433 2434void ex_btc8723b1ant_init_coex_dm(struct btc_coexist *btcoexist)2435{2436 struct rtl_priv *rtlpriv = btcoexist->adapter;2437 2438 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2439 "[BTCoex], Coex Mechanism Init!!\n");2440 2441 btcoexist->stop_coex_dm = false;2442 2443 halbtc8723b1ant_init_coex_dm(btcoexist);2444 2445 halbtc8723b1ant_query_bt_info(btcoexist);2446}2447 2448void ex_btc8723b1ant_display_coex_info(struct btc_coexist *btcoexist,2449 struct seq_file *m)2450{2451 struct btc_board_info *board_info = &btcoexist->board_info;2452 struct btc_stack_info *stack_info = &btcoexist->stack_info;2453 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;2454 u8 u8tmp[4], i, bt_info_ext, pstdmacase = 0;2455 u16 u16tmp[4];2456 u32 u32tmp[4];2457 bool roam = false, scan = false;2458 bool link = false, wifi_under_5g = false;2459 bool bt_hs_on = false, wifi_busy = false;2460 s32 wifi_rssi = 0, bt_hs_rssi = 0;2461 u32 wifi_bw, wifi_traffic_dir, fa_ofdm, fa_cck, wifi_link_status;2462 u8 wifi_dot11_chnl, wifi_hs_chnl;2463 u32 fw_ver = 0, bt_patch_ver = 0;2464 2465 seq_puts(m, "\n ============[BT Coexist info]============");2466 2467 if (btcoexist->manual_control) {2468 seq_puts(m, "\n ============[Under Manual Control]==========");2469 seq_puts(m, "\n ==========================================");2470 }2471 if (btcoexist->stop_coex_dm) {2472 seq_puts(m, "\n ============[Coex is STOPPED]============");2473 seq_puts(m, "\n ==========================================");2474 }2475 2476 seq_printf(m, "\n %-35s = %d/ %d/ %d",2477 "Ant PG Num/ Ant Mech/ Ant Pos:",2478 board_info->pg_ant_num, board_info->btdm_ant_num,2479 board_info->btdm_ant_pos);2480 2481 seq_printf(m, "\n %-35s = %s / %d",2482 "BT stack/ hci ext ver",2483 ((stack_info->profile_notified) ? "Yes" : "No"),2484 stack_info->hci_version);2485 2486 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);2487 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);2488 seq_printf(m, "\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",2489 "CoexVer/ FwVer/ PatchVer",2490 glcoex_ver_date_8723b_1ant, glcoex_ver_8723b_1ant,2491 fw_ver, bt_patch_ver, bt_patch_ver);2492 2493 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);2494 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,2495 &wifi_dot11_chnl);2496 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);2497 seq_printf(m, "\n %-35s = %d / %d(%d)",2498 "Dot11 channel / HsChnl(HsMode)",2499 wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);2500 2501 seq_printf(m, "\n %-35s = %3ph ",2502 "H2C Wifi inform bt chnl Info",2503 coex_dm->wifi_chnl_info);2504 2505 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);2506 btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);2507 seq_printf(m, "\n %-35s = %d/ %d",2508 "Wifi rssi/ HS rssi", wifi_rssi, bt_hs_rssi);2509 2510 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);2511 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);2512 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);2513 seq_printf(m, "\n %-35s = %d/ %d/ %d ",2514 "Wifi link/ roam/ scan", link, roam, scan);2515 2516 btcoexist->btc_get(btcoexist , BTC_GET_BL_WIFI_UNDER_5G,2517 &wifi_under_5g);2518 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);2519 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);2520 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,2521 &wifi_traffic_dir);2522 2523 seq_printf(m, "\n %-35s = %s / %s/ %s ",2524 "Wifi status", (wifi_under_5g ? "5G" : "2.4G"),2525 ((wifi_bw == BTC_WIFI_BW_LEGACY) ? "Legacy" :2526 ((wifi_bw == BTC_WIFI_BW_HT40) ? "HT40" : "HT20")),2527 ((!wifi_busy) ? "idle" :2528 ((wifi_traffic_dir == BTC_WIFI_TRAFFIC_TX) ?2529 "uplink" : "downlink")));2530 2531 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,2532 &wifi_link_status);2533 seq_printf(m, "\n %-35s = %d/ %d/ %d/ %d/ %d",2534 "sta/vwifi/hs/p2pGo/p2pGc",2535 ((wifi_link_status & WIFI_STA_CONNECTED) ? 1 : 0),2536 ((wifi_link_status & WIFI_AP_CONNECTED) ? 1 : 0),2537 ((wifi_link_status & WIFI_HS_CONNECTED) ? 1 : 0),2538 ((wifi_link_status & WIFI_P2P_GO_CONNECTED) ? 1 : 0),2539 ((wifi_link_status & WIFI_P2P_GC_CONNECTED) ? 1 : 0));2540 2541 seq_printf(m, "\n %-35s = [%s/ %d/ %d] ",2542 "BT [status/ rssi/ retryCnt]",2543 ((coex_sta->bt_disabled) ? ("disabled") :2544 ((coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan") :2545 ((BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==2546 coex_dm->bt_status) ?2547 "non-connected idle" :2548 ((BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE ==2549 coex_dm->bt_status) ?2550 "connected-idle" : "busy")))),2551 coex_sta->bt_rssi, coex_sta->bt_retry_cnt);2552 2553 seq_printf(m, "\n %-35s = %d / %d / %d / %d",2554 "SCO/HID/PAN/A2DP", bt_link_info->sco_exist,2555 bt_link_info->hid_exist, bt_link_info->pan_exist,2556 bt_link_info->a2dp_exist);2557 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO, m);2558 2559 bt_info_ext = coex_sta->bt_info_ext;2560 seq_printf(m, "\n %-35s = %s",2561 "BT Info A2DP rate",2562 (bt_info_ext & BIT0) ? "Basic rate" : "EDR rate");2563 2564 for (i = 0; i < BT_INFO_SRC_8723B_1ANT_MAX; i++) {2565 if (coex_sta->bt_info_c2h_cnt[i]) {2566 seq_printf(m, "\n %-35s = %7ph(%d)",2567 glbt_info_src_8723b_1ant[i],2568 coex_sta->bt_info_c2h[i],2569 coex_sta->bt_info_c2h_cnt[i]);2570 }2571 }2572 seq_printf(m, "\n %-35s = %s/%s, (0x%x/0x%x)",2573 "PS state, IPS/LPS, (lps/rpwm)",2574 ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),2575 ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")),2576 btcoexist->bt_info.lps_val,2577 btcoexist->bt_info.rpwm_val);2578 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);2579 2580 if (!btcoexist->manual_control) {2581 /* Sw mechanism */2582 seq_printf(m, "\n %-35s",2583 "============[Sw mechanism]============");2584 2585 seq_printf(m, "\n %-35s = %d/",2586 "SM[LowPenaltyRA]", coex_dm->cur_low_penalty_ra);2587 2588 seq_printf(m, "\n %-35s = %s/ %s/ %d ",2589 "DelBA/ BtCtrlAgg/ AggSize",2590 (btcoexist->bt_info.reject_agg_pkt ? "Yes" : "No"),2591 (btcoexist->bt_info.bt_ctrl_buf_size ? "Yes" : "No"),2592 btcoexist->bt_info.agg_buf_size);2593 2594 seq_printf(m, "\n %-35s = 0x%x ",2595 "Rate Mask", btcoexist->bt_info.ra_mask);2596 2597 /* Fw mechanism */2598 seq_printf(m, "\n %-35s",2599 "============[Fw mechanism]============");2600 2601 pstdmacase = coex_dm->cur_ps_tdma;2602 seq_printf(m, "\n %-35s = %5ph case-%d (auto:%d)",2603 "PS TDMA", coex_dm->ps_tdma_para,2604 pstdmacase, coex_dm->auto_tdma_adjust);2605 2606 seq_printf(m, "\n %-35s = %d ",2607 "IgnWlanAct", coex_dm->cur_ignore_wlan_act);2608 2609 seq_printf(m, "\n %-35s = 0x%x ",2610 "Latest error condition(should be 0)",2611 coex_dm->error_condition);2612 }2613 2614 seq_printf(m, "\n %-35s = %d",2615 "Coex Table Type", coex_sta->coex_table_type);2616 2617 /* Hw setting */2618 seq_printf(m, "\n %-35s",2619 "============[Hw setting]============");2620 2621 seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",2622 "backup ARFR1/ARFR2/RL/AMaxTime", coex_dm->backup_arfr_cnt1,2623 coex_dm->backup_arfr_cnt2, coex_dm->backup_retry_limit,2624 coex_dm->backup_ampdu_max_time);2625 2626 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);2627 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);2628 u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);2629 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);2630 seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",2631 "0x430/0x434/0x42a/0x456",2632 u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]);2633 2634 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);2635 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6cc);2636 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x880);2637 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",2638 "0x778/0x6cc/0x880[29:25]", u8tmp[0], u32tmp[0],2639 (u32tmp[1] & 0x3e000000) >> 25);2640 2641 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x948);2642 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x67);2643 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x765);2644 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",2645 "0x948/ 0x67[5] / 0x765",2646 u32tmp[0], ((u8tmp[0] & 0x20) >> 5), u8tmp[1]);2647 2648 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x92c);2649 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x930);2650 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x944);2651 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",2652 "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]",2653 u32tmp[0] & 0x3, u32tmp[1] & 0xff, u32tmp[2] & 0x3);2654 2655 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x39);2656 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);2657 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);2658 u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64);2659 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",2660 "0x38[11]/0x40/0x4c[24:23]/0x64[0]",2661 ((u8tmp[0] & 0x8) >> 3), u8tmp[1],2662 ((u32tmp[0] & 0x01800000) >> 23), u8tmp[2] & 0x1);2663 2664 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);2665 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);2666 seq_printf(m, "\n %-35s = 0x%x/ 0x%x",2667 "0x550(bcn ctrl)/0x522", u32tmp[0], u8tmp[0]);2668 2669 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);2670 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x49c);2671 seq_printf(m, "\n %-35s = 0x%x/ 0x%x",2672 "0xc50(dig)/0x49c(null-drop)", u32tmp[0] & 0xff, u8tmp[0]);2673 2674 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xda0);2675 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xda4);2676 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0xda8);2677 u32tmp[3] = btcoexist->btc_read_4byte(btcoexist, 0xcf0);2678 2679 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);2680 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);2681 2682 fa_ofdm = ((u32tmp[0] & 0xffff0000) >> 16) +2683 ((u32tmp[1] & 0xffff0000) >> 16) +2684 (u32tmp[1] & 0xffff) +2685 (u32tmp[2] & 0xffff) +2686 ((u32tmp[3] & 0xffff0000) >> 16) +2687 (u32tmp[3] & 0xffff);2688 fa_cck = (u8tmp[0] << 8) + u8tmp[1];2689 2690 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",2691 "OFDM-CCA/OFDM-FA/CCK-FA",2692 u32tmp[0] & 0xffff, fa_ofdm, fa_cck);2693 2694 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);2695 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);2696 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);2697 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",2698 "0x6c0/0x6c4/0x6c8(coexTable)",2699 u32tmp[0], u32tmp[1], u32tmp[2]);2700 2701 seq_printf(m, "\n %-35s = %d/ %d",2702 "0x770(high-pri rx/tx)", coex_sta->high_priority_rx,2703 coex_sta->high_priority_tx);2704 seq_printf(m, "\n %-35s = %d/ %d",2705 "0x774(low-pri rx/tx)", coex_sta->low_priority_rx,2706 coex_sta->low_priority_tx);2707 if (btcoexist->auto_report_1ant)2708 halbtc8723b1ant_monitor_bt_ctr(btcoexist);2709 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);2710}2711 2712void ex_btc8723b1ant_ips_notify(struct btc_coexist *btcoexist, u8 type)2713{2714 struct rtl_priv *rtlpriv = btcoexist->adapter;2715 2716 if (btcoexist->manual_control || btcoexist->stop_coex_dm)2717 return;2718 2719 if (BTC_IPS_ENTER == type) {2720 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2721 "[BTCoex], IPS ENTER notify\n");2722 coex_sta->under_ips = true;2723 2724 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,2725 FORCE_EXEC, false, true);2726 /* set PTA control */2727 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);2728 halbtc8723b1ant_coex_table_with_type(btcoexist,2729 NORMAL_EXEC, 0);2730 } else if (BTC_IPS_LEAVE == type) {2731 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2732 "[BTCoex], IPS LEAVE notify\n");2733 coex_sta->under_ips = false;2734 2735 halbtc8723b1ant_init_hw_config(btcoexist, false, false);2736 halbtc8723b1ant_init_coex_dm(btcoexist);2737 halbtc8723b1ant_query_bt_info(btcoexist);2738 }2739}2740 2741void ex_btc8723b1ant_lps_notify(struct btc_coexist *btcoexist, u8 type)2742{2743 struct rtl_priv *rtlpriv = btcoexist->adapter;2744 2745 if (btcoexist->manual_control || btcoexist->stop_coex_dm)2746 return;2747 2748 if (BTC_LPS_ENABLE == type) {2749 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2750 "[BTCoex], LPS ENABLE notify\n");2751 coex_sta->under_lps = true;2752 } else if (BTC_LPS_DISABLE == type) {2753 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2754 "[BTCoex], LPS DISABLE notify\n");2755 coex_sta->under_lps = false;2756 }2757}2758 2759void ex_btc8723b1ant_scan_notify(struct btc_coexist *btcoexist, u8 type)2760{2761 struct rtl_priv *rtlpriv = btcoexist->adapter;2762 bool wifi_connected = false, bt_hs_on = false;2763 u8 u8tmpa, u8tmpb;2764 u32 u32tmp;2765 u32 wifi_link_status = 0;2766 u32 num_of_wifi_link = 0;2767 bool bt_ctrl_agg_buf_size = false;2768 u8 agg_buf_size = 5;2769 2770 if (btcoexist->manual_control || btcoexist->stop_coex_dm)2771 return;2772 2773 if (type == BTC_SCAN_START) {2774 coex_sta->wifi_is_high_pri_task = true;2775 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2776 "[BTCoex], SCAN START notify\n");2777 /* Force antenna setup for no scan result issue */2778 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);2779 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,2780 FORCE_EXEC, false, false);2781 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);2782 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);2783 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);2784 2785 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2786 "[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",2787 u32tmp, u8tmpa, u8tmpb);2788 } else {2789 coex_sta->wifi_is_high_pri_task = false;2790 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2791 "[BTCoex], SCAN FINISH notify\n");2792 2793 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,2794 &coex_sta->scan_ap_num);2795 }2796 2797 if (coex_sta->bt_disabled)2798 return;2799 2800 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);2801 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,2802 &wifi_connected);2803 2804 halbtc8723b1ant_query_bt_info(btcoexist);2805 2806 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,2807 &wifi_link_status);2808 num_of_wifi_link = wifi_link_status >> 16;2809 if (num_of_wifi_link >= 2) {2810 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);2811 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,2812 bt_ctrl_agg_buf_size, agg_buf_size);2813 halbtc8723b1ant_action_wifi_multiport(btcoexist);2814 return;2815 }2816 2817 if (coex_sta->c2h_bt_inquiry_page) {2818 halbtc8723b1ant_action_bt_inquiry(btcoexist);2819 return;2820 } else if (bt_hs_on) {2821 halbtc8723b1ant_action_hs(btcoexist);2822 return;2823 }2824 2825 if (BTC_SCAN_START == type) {2826 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2827 "[BTCoex], SCAN START notify\n");2828 if (!wifi_connected)2829 /* non-connected scan */2830 btc8723b1ant_action_wifi_not_conn_scan(btcoexist);2831 else2832 /* wifi is connected */2833 btc8723b1ant_action_wifi_conn_scan(btcoexist);2834 } else if (BTC_SCAN_FINISH == type) {2835 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2836 "[BTCoex], SCAN FINISH notify\n");2837 if (!wifi_connected)2838 /* non-connected scan */2839 btc8723b1ant_action_wifi_not_conn(btcoexist);2840 else2841 halbtc8723b1ant_action_wifi_connected(btcoexist);2842 }2843}2844 2845void ex_btc8723b1ant_connect_notify(struct btc_coexist *btcoexist, u8 type)2846{2847 struct rtl_priv *rtlpriv = btcoexist->adapter;2848 bool wifi_connected = false, bt_hs_on = false;2849 u32 wifi_link_status = 0;2850 u32 num_of_wifi_link = 0;2851 bool bt_ctrl_agg_buf_size = false, under_4way = false;2852 u8 agg_buf_size = 5;2853 2854 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,2855 &under_4way);2856 2857 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||2858 coex_sta->bt_disabled)2859 return;2860 2861 if (type == BTC_ASSOCIATE_START) {2862 coex_sta->wifi_is_high_pri_task = true;2863 2864 /* Force antenna setup for no scan result issue */2865 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);2866 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,2867 FORCE_EXEC, false, false);2868 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2869 "[BTCoex], CONNECT START notify\n");2870 coex_dm->arp_cnt = 0;2871 } else {2872 coex_sta->wifi_is_high_pri_task = false;2873 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2874 "[BTCoex], CONNECT FINISH notify\n");2875 }2876 2877 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,2878 &wifi_link_status);2879 num_of_wifi_link = wifi_link_status>>16;2880 if (num_of_wifi_link >= 2) {2881 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);2882 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,2883 bt_ctrl_agg_buf_size, agg_buf_size);2884 halbtc8723b1ant_action_wifi_multiport(btcoexist);2885 return;2886 }2887 2888 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);2889 if (coex_sta->c2h_bt_inquiry_page) {2890 halbtc8723b1ant_action_bt_inquiry(btcoexist);2891 return;2892 } else if (bt_hs_on) {2893 halbtc8723b1ant_action_hs(btcoexist);2894 return;2895 }2896 2897 if (BTC_ASSOCIATE_START == type) {2898 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2899 "[BTCoex], CONNECT START notify\n");2900 btc8723b1ant_act_wifi_not_conn_asso_auth(btcoexist);2901 } else if (BTC_ASSOCIATE_FINISH == type) {2902 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2903 "[BTCoex], CONNECT FINISH notify\n");2904 2905 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,2906 &wifi_connected);2907 if (!wifi_connected)2908 /* non-connected scan */2909 btc8723b1ant_action_wifi_not_conn(btcoexist);2910 else2911 halbtc8723b1ant_action_wifi_connected(btcoexist);2912 }2913}2914 2915void ex_btc8723b1ant_media_status_notify(struct btc_coexist *btcoexist,2916 u8 type)2917{2918 struct rtl_priv *rtlpriv = btcoexist->adapter;2919 u8 h2c_parameter[3] = {0};2920 u32 wifi_bw;2921 u8 wifi_central_chnl;2922 bool wifi_under_b_mode = false;2923 2924 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||2925 coex_sta->bt_disabled)2926 return;2927 2928 if (type == BTC_MEDIA_CONNECT) {2929 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2930 "[BTCoex], MEDIA connect notify\n");2931 /* Force antenna setup for no scan result issue */2932 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);2933 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,2934 FORCE_EXEC, false, false);2935 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,2936 &wifi_under_b_mode);2937 2938 /* Set CCK Tx/Rx high Pri except 11b mode */2939 if (wifi_under_b_mode) {2940 btcoexist->btc_write_1byte(btcoexist, 0x6cd,2941 0x00); /* CCK Tx */2942 btcoexist->btc_write_1byte(btcoexist, 0x6cf,2943 0x00); /* CCK Rx */2944 } else {2945 btcoexist->btc_write_1byte(btcoexist, 0x6cd,2946 0x00); /* CCK Tx */2947 btcoexist->btc_write_1byte(btcoexist, 0x6cf,2948 0x10); /* CCK Rx */2949 }2950 2951 coex_dm->backup_arfr_cnt1 =2952 btcoexist->btc_read_4byte(btcoexist, 0x430);2953 coex_dm->backup_arfr_cnt2 =2954 btcoexist->btc_read_4byte(btcoexist, 0x434);2955 coex_dm->backup_retry_limit =2956 btcoexist->btc_read_2byte(btcoexist, 0x42a);2957 coex_dm->backup_ampdu_max_time =2958 btcoexist->btc_read_1byte(btcoexist, 0x456);2959 } else {2960 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2961 "[BTCoex], MEDIA disconnect notify\n");2962 coex_dm->arp_cnt = 0;2963 2964 btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x0); /* CCK Tx */2965 btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x0); /* CCK Rx */2966 2967 coex_sta->cck_ever_lock = false;2968 }2969 2970 /* only 2.4G we need to inform bt the chnl mask */2971 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,2972 &wifi_central_chnl);2973 2974 if (type == BTC_MEDIA_CONNECT && wifi_central_chnl <= 14) {2975 h2c_parameter[0] = 0x0;2976 h2c_parameter[1] = wifi_central_chnl;2977 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);2978 if (BTC_WIFI_BW_HT40 == wifi_bw)2979 h2c_parameter[2] = 0x30;2980 else2981 h2c_parameter[2] = 0x20;2982 }2983 2984 coex_dm->wifi_chnl_info[0] = h2c_parameter[0];2985 coex_dm->wifi_chnl_info[1] = h2c_parameter[1];2986 coex_dm->wifi_chnl_info[2] = h2c_parameter[2];2987 2988 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2989 "[BTCoex], FW write 0x66 = 0x%x\n",2990 h2c_parameter[0] << 16 | h2c_parameter[1] << 8 |2991 h2c_parameter[2]);2992 2993 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);2994}2995 2996void ex_btc8723b1ant_special_packet_notify(struct btc_coexist *btcoexist,2997 u8 type)2998{2999 struct rtl_priv *rtlpriv = btcoexist->adapter;3000 bool bt_hs_on = false;3001 u32 wifi_link_status = 0;3002 u32 num_of_wifi_link = 0;3003 bool bt_ctrl_agg_buf_size = false, under_4way = false;3004 u8 agg_buf_size = 5;3005 3006 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,3007 &under_4way);3008 3009 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||3010 coex_sta->bt_disabled)3011 return;3012 3013 if (type == BTC_PACKET_DHCP || type == BTC_PACKET_EAPOL ||3014 type == BTC_PACKET_ARP) {3015 if (type == BTC_PACKET_ARP) {3016 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3017 "[BTCoex], special Packet ARP notify\n");3018 3019 coex_dm->arp_cnt++;3020 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3021 "[BTCoex], ARP Packet Count = %d\n",3022 coex_dm->arp_cnt);3023 3024 if ((coex_dm->arp_cnt >= 10) && (!under_4way))3025 /* if APR PKT > 10 after connect, do not go to3026 * ActionWifiConnectedSpecificPacket(btcoexist)3027 */3028 coex_sta->wifi_is_high_pri_task = false;3029 else3030 coex_sta->wifi_is_high_pri_task = true;3031 } else {3032 coex_sta->wifi_is_high_pri_task = true;3033 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3034 "[BTCoex], special Packet DHCP or EAPOL notify\n");3035 }3036 } else {3037 coex_sta->wifi_is_high_pri_task = false;3038 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3039 "[BTCoex], special Packet [Type = %d] notify\n",3040 type);3041 }3042 3043 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,3044 &wifi_link_status);3045 num_of_wifi_link = wifi_link_status >> 16;3046 if (num_of_wifi_link >= 2) {3047 halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);3048 halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,3049 bt_ctrl_agg_buf_size, agg_buf_size);3050 halbtc8723b1ant_action_wifi_multiport(btcoexist);3051 return;3052 }3053 3054 coex_sta->special_pkt_period_cnt = 0;3055 3056 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);3057 if (coex_sta->c2h_bt_inquiry_page) {3058 halbtc8723b1ant_action_bt_inquiry(btcoexist);3059 return;3060 } else if (bt_hs_on) {3061 halbtc8723b1ant_action_hs(btcoexist);3062 return;3063 }3064 3065 if (BTC_PACKET_DHCP == type ||3066 BTC_PACKET_EAPOL == type) {3067 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3068 "[BTCoex], special Packet(%d) notify\n", type);3069 halbtc8723b1ant_action_wifi_connected_special_packet(btcoexist);3070 }3071}3072 3073void ex_btc8723b1ant_bt_info_notify(struct btc_coexist *btcoexist,3074 u8 *tmp_buf, u8 length)3075{3076 struct rtl_priv *rtlpriv = btcoexist->adapter;3077 u8 bt_info = 0;3078 u8 i, rsp_source = 0;3079 bool wifi_connected = false;3080 bool bt_busy = false;3081 3082 coex_sta->c2h_bt_info_req_sent = false;3083 3084 rsp_source = tmp_buf[0] & 0xf;3085 if (rsp_source >= BT_INFO_SRC_8723B_1ANT_MAX)3086 rsp_source = BT_INFO_SRC_8723B_1ANT_WIFI_FW;3087 coex_sta->bt_info_c2h_cnt[rsp_source]++;3088 3089 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3090 "[BTCoex], Bt info[%d], length=%d, hex data = [",3091 rsp_source, length);3092 for (i = 0; i < length; i++) {3093 coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];3094 if (i == 1)3095 bt_info = tmp_buf[i];3096 if (i == length - 1)3097 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3098 "0x%02x]\n", tmp_buf[i]);3099 else3100 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3101 "0x%02x, ", tmp_buf[i]);3102 }3103 3104 /* if 0xff, it means BT is under WHCK test */3105 if (bt_info == 0xff)3106 coex_sta->bt_whck_test = true;3107 else3108 coex_sta->bt_whck_test = false;3109 3110 if (rsp_source != BT_INFO_SRC_8723B_1ANT_WIFI_FW) {3111 coex_sta->bt_retry_cnt = /* [3:0] */3112 coex_sta->bt_info_c2h[rsp_source][2] & 0xf;3113 3114 if (coex_sta->bt_retry_cnt >= 1)3115 coex_sta->pop_event_cnt++;3116 3117 if (coex_sta->bt_info_c2h[rsp_source][2] & 0x20)3118 coex_sta->c2h_bt_remote_name_req = true;3119 else3120 coex_sta->c2h_bt_remote_name_req = false;3121 3122 coex_sta->bt_rssi =3123 coex_sta->bt_info_c2h[rsp_source][3] * 2 - 90;3124 3125 coex_sta->bt_info_ext =3126 coex_sta->bt_info_c2h[rsp_source][4];3127 3128 if (coex_sta->bt_info_c2h[rsp_source][1] == 0x49) {3129 coex_sta->a2dp_bit_pool =3130 coex_sta->bt_info_c2h[rsp_source][6];3131 } else {3132 coex_sta->a2dp_bit_pool = 0;3133 }3134 3135 coex_sta->bt_tx_rx_mask =3136 (coex_sta->bt_info_c2h[rsp_source][2] & 0x40);3137 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK,3138 &coex_sta->bt_tx_rx_mask);3139 3140 if (!coex_sta->bt_tx_rx_mask) {3141 /* BT into is responded by BT FW and BT RF REG3142 * 0x3C != 0x15 => Need to switch BT TRx Mask3143 */3144 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3145 "[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n");3146 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,3147 0x3c, 0x15);3148 3149 /* BT TRx Mask lock 0x2c[0], 0x30[0] = 0 */3150 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,3151 0x2c, 0x7c44);3152 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,3153 0x30, 0x7c44);3154 }3155 3156 /* Here we need to resend some wifi info to BT3157 * because bt is reset and loss of the info.3158 */3159 if (coex_sta->bt_info_ext & BIT1) {3160 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3161 "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");3162 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,3163 &wifi_connected);3164 if (wifi_connected)3165 ex_btc8723b1ant_media_status_notify(btcoexist,3166 BTC_MEDIA_CONNECT);3167 else3168 ex_btc8723b1ant_media_status_notify(btcoexist,3169 BTC_MEDIA_DISCONNECT);3170 }3171 3172 if (coex_sta->bt_info_ext & BIT3) {3173 if (!btcoexist->manual_control &&3174 !btcoexist->stop_coex_dm) {3175 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3176 "[BTCoex], BT ext info bit3 check, set BT NOT ignore Wlan active!!\n");3177 halbtc8723b1ant_ignore_wlan_act(btcoexist,3178 FORCE_EXEC,3179 false);3180 }3181 } else {3182 /* BT already NOT ignore Wlan active, do nothing here.*/3183 }3184 if (!btcoexist->auto_report_1ant) {3185 if (coex_sta->bt_info_ext & BIT4) {3186 /* BT auto report already enabled, do nothing */3187 } else {3188 halbtc8723b1ant_bt_auto_report(btcoexist,3189 FORCE_EXEC,3190 true);3191 }3192 }3193 }3194 3195 /* check BIT2 first ==> check if bt is under inquiry or page scan */3196 if (bt_info & BT_INFO_8723B_1ANT_B_INQ_PAGE)3197 coex_sta->c2h_bt_inquiry_page = true;3198 else3199 coex_sta->c2h_bt_inquiry_page = false;3200 3201 coex_sta->num_of_profile = 0;3202 3203 /* set link exist status */3204 if (!(bt_info & BT_INFO_8723B_1ANT_B_CONNECTION)) {3205 coex_sta->bt_link_exist = false;3206 coex_sta->pan_exist = false;3207 coex_sta->a2dp_exist = false;3208 coex_sta->hid_exist = false;3209 coex_sta->sco_exist = false;3210 3211 coex_sta->bt_hi_pri_link_exist = false;3212 } else {3213 /* connection exists */3214 coex_sta->bt_link_exist = true;3215 if (bt_info & BT_INFO_8723B_1ANT_B_FTP) {3216 coex_sta->pan_exist = true;3217 coex_sta->num_of_profile++;3218 } else {3219 coex_sta->pan_exist = false;3220 }3221 if (bt_info & BT_INFO_8723B_1ANT_B_A2DP) {3222 coex_sta->a2dp_exist = true;3223 coex_sta->num_of_profile++;3224 } else {3225 coex_sta->a2dp_exist = false;3226 }3227 if (bt_info & BT_INFO_8723B_1ANT_B_HID) {3228 coex_sta->hid_exist = true;3229 coex_sta->num_of_profile++;3230 } else {3231 coex_sta->hid_exist = false;3232 }3233 if (bt_info & BT_INFO_8723B_1ANT_B_SCO_ESCO) {3234 coex_sta->sco_exist = true;3235 coex_sta->num_of_profile++;3236 } else {3237 coex_sta->sco_exist = false;3238 }3239 3240 if ((!coex_sta->hid_exist) &&3241 (!coex_sta->c2h_bt_inquiry_page) &&3242 (!coex_sta->sco_exist)) {3243 if (coex_sta->high_priority_tx +3244 coex_sta->high_priority_rx >=3245 160) {3246 coex_sta->hid_exist = true;3247 coex_sta->wrong_profile_notification++;3248 coex_sta->num_of_profile++;3249 bt_info = bt_info | 0x28;3250 }3251 }3252 3253 /* Add Hi-Pri Tx/Rx counter to avoid false detection */3254 if (((coex_sta->hid_exist) || (coex_sta->sco_exist)) &&3255 (coex_sta->high_priority_tx + coex_sta->high_priority_rx >=3256 160) &&3257 (!coex_sta->c2h_bt_inquiry_page))3258 coex_sta->bt_hi_pri_link_exist = true;3259 3260 if ((bt_info & BT_INFO_8723B_1ANT_B_ACL_BUSY) &&3261 (coex_sta->num_of_profile == 0)) {3262 if (coex_sta->low_priority_tx +3263 coex_sta->low_priority_rx >=3264 160) {3265 coex_sta->pan_exist = true;3266 coex_sta->num_of_profile++;3267 coex_sta->wrong_profile_notification++;3268 bt_info = bt_info | 0x88;3269 }3270 }3271 }3272 3273 halbtc8723b1ant_update_bt_link_info(btcoexist);3274 3275 /* mask profile bit for connect-ilde identification3276 * ( for CSR case: A2DP idle --> 0x41)3277 */3278 bt_info = bt_info & 0x1f;3279 3280 if (!(bt_info & BT_INFO_8723B_1ANT_B_CONNECTION)) {3281 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;3282 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3283 "[BTCoex], BtInfoNotify(), BT Non-Connected idle!\n");3284 /* connection exists but no busy */3285 } else if (bt_info == BT_INFO_8723B_1ANT_B_CONNECTION) {3286 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE;3287 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3288 "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");3289 } else if ((bt_info & BT_INFO_8723B_1ANT_B_SCO_ESCO) ||3290 (bt_info & BT_INFO_8723B_1ANT_B_SCO_BUSY)) {3291 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_SCO_BUSY;3292 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3293 "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");3294 } else if (bt_info & BT_INFO_8723B_1ANT_B_ACL_BUSY) {3295 if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)3296 coex_dm->auto_tdma_adjust = false;3297 3298 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_ACL_BUSY;3299 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3300 "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");3301 } else {3302 coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_MAX;3303 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3304 "[BTCoex], BtInfoNotify(), BT Non-Defined state!!\n");3305 }3306 3307 if ((BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||3308 (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||3309 (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))3310 bt_busy = true;3311 else3312 bt_busy = false;3313 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);3314 3315 halbtc8723b1ant_run_coexist_mechanism(btcoexist);3316}3317 3318void ex_btc8723b1ant_rf_status_notify(struct btc_coexist *btcoexist, u8 type)3319{3320 struct rtl_priv *rtlpriv = btcoexist->adapter;3321 u32 u32tmp;3322 u8 u8tmpa, u8tmpb, u8tmpc;3323 3324 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3325 "[BTCoex], RF Status notify\n");3326 3327 if (type == BTC_RF_ON) {3328 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3329 "[BTCoex], RF is turned ON!!\n");3330 btcoexist->stop_coex_dm = false;3331 } else if (type == BTC_RF_OFF) {3332 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3333 "[BTCoex], RF is turned OFF!!\n");3334 3335 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,3336 0x0, 0x0);3337 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);3338 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,3339 FORCE_EXEC, false, true);3340 3341 halbtc8723b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);3342 btcoexist->stop_coex_dm = true;3343 3344 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);3345 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);3346 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);3347 u8tmpc = btcoexist->btc_read_1byte(btcoexist, 0x76e);3348 3349 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3350 "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x, 0x76e=0x%x\n",3351 u32tmp, u8tmpa, u8tmpb, u8tmpc);3352 }3353}3354 3355void ex_btc8723b1ant_halt_notify(struct btc_coexist *btcoexist)3356{3357 struct rtl_priv *rtlpriv = btcoexist->adapter;3358 3359 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Halt notify\n");3360 3361 btcoexist->stop_coex_dm = true;3362 3363 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, FORCE_EXEC,3364 false, true);3365 3366 halbtc8723b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);3367 3368 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,3369 0x0, 0x0);3370 halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);3371 3372 ex_btc8723b1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);3373 3374 btcoexist->stop_coex_dm = true;3375}3376 3377void ex_btc8723b1ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)3378{3379 struct rtl_priv *rtlpriv = btcoexist->adapter;3380 3381 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Pnp notify\n");3382 3383 if (BTC_WIFI_PNP_SLEEP == pnp_state) {3384 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3385 "[BTCoex], Pnp notify to SLEEP\n");3386 halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,3387 FORCE_EXEC, false, true);3388 halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,3389 0x0, 0x0);3390 halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);3391 halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);3392 3393 /* Driver do not leave IPS/LPS when driver is going to sleep, so3394 * BTCoexistence think wifi is still under IPS/LPS3395 *3396 * BT should clear UnderIPS/UnderLPS state to avoid mismatch3397 * state after wakeup.3398 */3399 coex_sta->under_ips = false;3400 coex_sta->under_lps = false;3401 btcoexist->stop_coex_dm = true;3402 } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {3403 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3404 "[BTCoex], Pnp notify to WAKE UP\n");3405 btcoexist->stop_coex_dm = false;3406 halbtc8723b1ant_init_hw_config(btcoexist, false, false);3407 halbtc8723b1ant_init_coex_dm(btcoexist);3408 halbtc8723b1ant_query_bt_info(btcoexist);3409 }3410}3411 3412void ex_btc8723b1ant_coex_dm_reset(struct btc_coexist *btcoexist)3413{3414 struct rtl_priv *rtlpriv = btcoexist->adapter;3415 3416 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3417 "[BTCoex], *****************Coex DM Reset****************\n");3418 3419 halbtc8723b1ant_init_hw_config(btcoexist, false, false);3420 halbtc8723b1ant_init_coex_dm(btcoexist);3421}3422 3423void ex_btc8723b1ant_periodical(struct btc_coexist *btcoexist)3424{3425 struct rtl_priv *rtlpriv = btcoexist->adapter;3426 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;3427 3428 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3429 "[BTCoex], ==========================Periodical===========================\n");3430 3431 if (!btcoexist->auto_report_1ant) {3432 halbtc8723b1ant_query_bt_info(btcoexist);3433 halbtc8723b1ant_monitor_bt_enable_disable(btcoexist);3434 } else {3435 halbtc8723b1ant_monitor_bt_ctr(btcoexist);3436 halbtc8723b1ant_monitor_wifi_ctr(btcoexist);3437 3438 if ((coex_sta->high_priority_tx + coex_sta->high_priority_rx < 50) &&3439 bt_link_info->hid_exist)3440 bt_link_info->hid_exist = false;3441 3442 if (btc8723b1ant_is_wifi_status_changed(btcoexist) ||3443 coex_dm->auto_tdma_adjust) {3444 halbtc8723b1ant_run_coexist_mechanism(btcoexist);3445 }3446 coex_sta->special_pkt_period_cnt++;3447 }3448}3449