2968 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Copyright(c) 2012 Realtek Corporation.*/3 4/**************************************************************5 * Description:6 *7 * This file is for RTL8821A 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_8821a_1ant glcoex_dm_8821a_1ant;22static struct coex_dm_8821a_1ant *coex_dm = &glcoex_dm_8821a_1ant;23static struct coex_sta_8821a_1ant glcoex_sta_8821a_1ant;24static struct coex_sta_8821a_1ant *coex_sta = &glcoex_sta_8821a_1ant;25static void btc8821a1ant_act_bt_sco_hid_only_busy(struct btc_coexist *btcoexist,26 u8 wifi_status);27 28static const char *const glbt_info_src_8821a_1ant[] = {29 "BT Info[wifi fw]",30 "BT Info[bt rsp]",31 "BT Info[bt auto report]",32};33 34static u32 glcoex_ver_date_8821a_1ant = 20130816;35static u32 glcoex_ver_8821a_1ant = 0x41;36 37/**************************************************************38 * local function proto type if needed39 *40 * local function start with btc8821a1ant_41 **************************************************************/42static u8 btc8821a1ant_bt_rssi_state(struct btc_coexist *btcoexist,43 u8 level_num, u8 rssi_thresh,44 u8 rssi_thresh1)45{46 struct rtl_priv *rtlpriv = btcoexist->adapter;47 long bt_rssi = 0;48 u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;49 50 bt_rssi = coex_sta->bt_rssi;51 52 if (level_num == 2) {53 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||54 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {55 if (bt_rssi >= (rssi_thresh +56 BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {57 bt_rssi_state = BTC_RSSI_STATE_HIGH;58 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,59 "[BTCoex], BT Rssi state switch to High\n");60 } else {61 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;62 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,63 "[BTCoex], BT Rssi state stay at Low\n");64 }65 } else {66 if (bt_rssi < rssi_thresh) {67 bt_rssi_state = BTC_RSSI_STATE_LOW;68 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,69 "[BTCoex], BT Rssi state switch to Low\n");70 } else {71 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;72 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,73 "[BTCoex], BT Rssi state stay at High\n");74 }75 }76 } else if (level_num == 3) {77 if (rssi_thresh > rssi_thresh1) {78 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,79 "[BTCoex], BT Rssi thresh error!!\n");80 return coex_sta->pre_bt_rssi_state;81 }82 83 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||84 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {85 if (bt_rssi >= (rssi_thresh +86 BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {87 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;88 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,89 "[BTCoex], BT Rssi state switch to Medium\n");90 } else {91 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;92 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,93 "[BTCoex], BT Rssi state stay at Low\n");94 }95 } else if ((coex_sta->pre_bt_rssi_state ==96 BTC_RSSI_STATE_MEDIUM) ||97 (coex_sta->pre_bt_rssi_state ==98 BTC_RSSI_STATE_STAY_MEDIUM)) {99 if (bt_rssi >= (rssi_thresh1 +100 BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {101 bt_rssi_state = BTC_RSSI_STATE_HIGH;102 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,103 "[BTCoex], BT Rssi state switch to High\n");104 } else if (bt_rssi < rssi_thresh) {105 bt_rssi_state = BTC_RSSI_STATE_LOW;106 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,107 "[BTCoex], BT Rssi state switch to Low\n");108 } else {109 bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;110 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,111 "[BTCoex], BT Rssi state stay at Medium\n");112 }113 } else {114 if (bt_rssi < rssi_thresh1) {115 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;116 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,117 "[BTCoex], BT Rssi state switch to Medium\n");118 } else {119 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;120 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,121 "[BTCoex], BT Rssi state stay at High\n");122 }123 }124 }125 coex_sta->pre_bt_rssi_state = bt_rssi_state;126 127 return bt_rssi_state;128}129 130static u8 btc8821a1ant_wifi_rssi_state(struct btc_coexist *btcoexist,131 u8 index, u8 level_num, u8 rssi_thresh,132 u8 rssi_thresh1)133{134 struct rtl_priv *rtlpriv = btcoexist->adapter;135 long wifi_rssi = 0;136 u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];137 138 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);139 140 if (level_num == 2) {141 if ((coex_sta->pre_wifi_rssi_state[index] ==142 BTC_RSSI_STATE_LOW) ||143 (coex_sta->pre_wifi_rssi_state[index] ==144 BTC_RSSI_STATE_STAY_LOW)) {145 if (wifi_rssi >= (rssi_thresh +146 BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {147 wifi_rssi_state = BTC_RSSI_STATE_HIGH;148 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,149 "[BTCoex], wifi RSSI state switch to High\n");150 } else {151 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;152 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,153 "[BTCoex], wifi RSSI state stay at Low\n");154 }155 } else {156 if (wifi_rssi < rssi_thresh) {157 wifi_rssi_state = BTC_RSSI_STATE_LOW;158 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,159 "[BTCoex], wifi RSSI state switch to Low\n");160 } else {161 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;162 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,163 "[BTCoex], wifi RSSI state stay at High\n");164 }165 }166 } else if (level_num == 3) {167 if (rssi_thresh > rssi_thresh1) {168 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,169 "[BTCoex], wifi RSSI thresh error!!\n");170 return coex_sta->pre_wifi_rssi_state[index];171 }172 173 if ((coex_sta->pre_wifi_rssi_state[index] ==174 BTC_RSSI_STATE_LOW) ||175 (coex_sta->pre_wifi_rssi_state[index] ==176 BTC_RSSI_STATE_STAY_LOW)) {177 if (wifi_rssi >= (rssi_thresh +178 BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {179 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;180 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,181 "[BTCoex], wifi RSSI state switch to Medium\n");182 } else {183 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;184 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,185 "[BTCoex], wifi RSSI state stay at Low\n");186 }187 } else if ((coex_sta->pre_wifi_rssi_state[index] ==188 BTC_RSSI_STATE_MEDIUM) ||189 (coex_sta->pre_wifi_rssi_state[index] ==190 BTC_RSSI_STATE_STAY_MEDIUM)) {191 if (wifi_rssi >= (rssi_thresh1 +192 BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {193 wifi_rssi_state = BTC_RSSI_STATE_HIGH;194 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,195 "[BTCoex], wifi RSSI state switch to High\n");196 } else if (wifi_rssi < rssi_thresh) {197 wifi_rssi_state = BTC_RSSI_STATE_LOW;198 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,199 "[BTCoex], wifi RSSI state switch to Low\n");200 } else {201 wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;202 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,203 "[BTCoex], wifi RSSI state stay at Medium\n");204 }205 } else {206 if (wifi_rssi < rssi_thresh1) {207 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;208 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,209 "[BTCoex], wifi RSSI state switch to Medium\n");210 } else {211 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;212 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,213 "[BTCoex], wifi RSSI state stay at High\n");214 }215 }216 }217 coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;218 219 return wifi_rssi_state;220}221 222static void btc8821a1ant_update_ra_mask(struct btc_coexist *btcoexist,223 bool force_exec, u32 dis_rate_mask)224{225 coex_dm->cur_ra_mask = dis_rate_mask;226 227 if (force_exec ||228 (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask)) {229 btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK,230 &coex_dm->cur_ra_mask);231 }232 coex_dm->pre_ra_mask = coex_dm->cur_ra_mask;233}234 235static void btc8821a1ant_auto_rate_fb_retry(struct btc_coexist *btcoexist,236 bool force_exec, u8 type)237{238 bool wifi_under_b_mode = false;239 240 coex_dm->cur_arfr_type = type;241 242 if (force_exec ||243 (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {244 switch (coex_dm->cur_arfr_type) {245 case 0: /* normal mode */246 btcoexist->btc_write_4byte(btcoexist, 0x430,247 coex_dm->backup_arfr_cnt1);248 btcoexist->btc_write_4byte(btcoexist, 0x434,249 coex_dm->backup_arfr_cnt2);250 break;251 case 1:252 btcoexist->btc_get(btcoexist,253 BTC_GET_BL_WIFI_UNDER_B_MODE,254 &wifi_under_b_mode);255 if (wifi_under_b_mode) {256 btcoexist->btc_write_4byte(btcoexist, 0x430,257 0x0);258 btcoexist->btc_write_4byte(btcoexist, 0x434,259 0x01010101);260 } else {261 btcoexist->btc_write_4byte(btcoexist, 0x430,262 0x0);263 btcoexist->btc_write_4byte(btcoexist, 0x434,264 0x04030201);265 }266 break;267 default:268 break;269 }270 }271 272 coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;273}274 275static void btc8821a1ant_retry_limit(struct btc_coexist *btcoexist,276 bool force_exec, u8 type)277{278 coex_dm->cur_retry_limit_type = type;279 280 if (force_exec ||281 (coex_dm->pre_retry_limit_type != coex_dm->cur_retry_limit_type)) {282 switch (coex_dm->cur_retry_limit_type) {283 case 0: /* normal mode */284 btcoexist->btc_write_2byte(btcoexist, 0x42a,285 coex_dm->backup_retry_limit);286 break;287 case 1: /* retry limit = 8 */288 btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);289 break;290 default:291 break;292 }293 }294 coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;295}296 297static void btc8821a1ant_ampdu_max_time(struct btc_coexist *btcoexist,298 bool force_exec, u8 type)299{300 coex_dm->cur_ampdu_time_type = type;301 302 if (force_exec ||303 (coex_dm->pre_ampdu_time_type != coex_dm->cur_ampdu_time_type)) {304 switch (coex_dm->cur_ampdu_time_type) {305 case 0: /* normal mode */306 btcoexist->btc_write_1byte(btcoexist, 0x456,307 coex_dm->backup_ampdu_max_time);308 break;309 case 1: /* AMPDU time = 0x38 * 32us */310 btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);311 break;312 default:313 break;314 }315 }316 317 coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;318}319 320static void btc8821a1ant_limited_tx(struct btc_coexist *btcoexist,321 bool force_exec, u8 ra_mask_type,322 u8 arfr_type, u8 retry_limit_type,323 u8 ampdu_time_type)324{325 switch (ra_mask_type) {326 case 0: /* normal mode */327 btc8821a1ant_update_ra_mask(btcoexist, force_exec, 0x0);328 break;329 case 1: /* disable cck 1/2 */330 btc8821a1ant_update_ra_mask(btcoexist, force_exec,331 0x00000003);332 break;333 case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */334 btc8821a1ant_update_ra_mask(btcoexist, force_exec,335 0x0001f1f7);336 break;337 default:338 break;339 }340 341 btc8821a1ant_auto_rate_fb_retry(btcoexist, force_exec, arfr_type);342 btc8821a1ant_retry_limit(btcoexist, force_exec, retry_limit_type);343 btc8821a1ant_ampdu_max_time(btcoexist, force_exec, ampdu_time_type);344}345 346static void btc8821a1ant_limited_rx(struct btc_coexist *btcoexist,347 bool force_exec, bool rej_ap_agg_pkt,348 bool bt_ctrl_agg_buf_size, u8 agg_buf_size)349{350 bool reject_rx_agg = rej_ap_agg_pkt;351 bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;352 u8 rx_agg_size = agg_buf_size;353 354 /* Rx Aggregation related setting */355 btcoexist->btc_set(btcoexist,356 BTC_SET_BL_TO_REJ_AP_AGG_PKT, &reject_rx_agg);357 /* decide BT control aggregation buf size or not */358 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,359 &bt_ctrl_rx_agg_size);360 /* aggregation buf size, only work when BT control Rx agg size */361 btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);362 /* real update aggregation setting */363 btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);364}365 366static void btc8821a1ant_monitor_bt_ctr(struct btc_coexist *btcoexist)367{368 u32 reg_hp_tx_rx, reg_lp_tx_rx, u4_tmp;369 u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;370 371 reg_hp_tx_rx = 0x770;372 reg_lp_tx_rx = 0x774;373 374 u4_tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_tx_rx);375 reg_hp_tx = u4_tmp & MASKLWORD;376 reg_hp_rx = (u4_tmp & MASKHWORD) >> 16;377 378 u4_tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_tx_rx);379 reg_lp_tx = u4_tmp & MASKLWORD;380 reg_lp_rx = (u4_tmp & MASKHWORD) >> 16;381 382 coex_sta->high_priority_tx = reg_hp_tx;383 coex_sta->high_priority_rx = reg_hp_rx;384 coex_sta->low_priority_tx = reg_lp_tx;385 coex_sta->low_priority_rx = reg_lp_rx;386 387 /* reset counter */388 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);389}390 391static void btc8821a1ant_query_bt_info(struct btc_coexist *btcoexist)392{393 struct rtl_priv *rtlpriv = btcoexist->adapter;394 u8 h2c_parameter[1] = {0};395 396 coex_sta->c2h_bt_info_req_sent = true;397 398 h2c_parameter[0] |= BIT0; /* trigger */399 400 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,401 "[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n",402 h2c_parameter[0]);403 404 btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);405}406 407static void btc8821a1ant_update_bt_link_info(struct btc_coexist *btcoexist)408{409 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;410 bool bt_hs_on = false;411 412 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);413 414 bt_link_info->bt_link_exist = coex_sta->bt_link_exist;415 bt_link_info->sco_exist = coex_sta->sco_exist;416 bt_link_info->a2dp_exist = coex_sta->a2dp_exist;417 bt_link_info->pan_exist = coex_sta->pan_exist;418 bt_link_info->hid_exist = coex_sta->hid_exist;419 420 /* work around for HS mode */421 if (bt_hs_on) {422 bt_link_info->pan_exist = true;423 bt_link_info->bt_link_exist = true;424 }425 426 /* check if Sco only */427 if (bt_link_info->sco_exist &&428 !bt_link_info->a2dp_exist &&429 !bt_link_info->pan_exist &&430 !bt_link_info->hid_exist)431 bt_link_info->sco_only = true;432 else433 bt_link_info->sco_only = false;434 435 /* check if A2dp only */436 if (!bt_link_info->sco_exist &&437 bt_link_info->a2dp_exist &&438 !bt_link_info->pan_exist &&439 !bt_link_info->hid_exist)440 bt_link_info->a2dp_only = true;441 else442 bt_link_info->a2dp_only = false;443 444 /* check if Pan only */445 if (!bt_link_info->sco_exist &&446 !bt_link_info->a2dp_exist &&447 bt_link_info->pan_exist &&448 !bt_link_info->hid_exist)449 bt_link_info->pan_only = true;450 else451 bt_link_info->pan_only = false;452 453 /* check if Hid only */454 if (!bt_link_info->sco_exist &&455 !bt_link_info->a2dp_exist &&456 !bt_link_info->pan_exist &&457 bt_link_info->hid_exist)458 bt_link_info->hid_only = true;459 else460 bt_link_info->hid_only = false;461}462 463static u8 btc8821a1ant_action_algorithm(struct btc_coexist *btcoexist)464{465 struct rtl_priv *rtlpriv = btcoexist->adapter;466 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;467 bool bt_hs_on = false;468 u8 algorithm = BT_8821A_1ANT_COEX_ALGO_UNDEFINED;469 u8 num_of_diff_profile = 0;470 471 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);472 473 if (!bt_link_info->bt_link_exist) {474 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,475 "[BTCoex], No BT link exists!!!\n");476 return algorithm;477 }478 479 if (bt_link_info->sco_exist)480 num_of_diff_profile++;481 if (bt_link_info->hid_exist)482 num_of_diff_profile++;483 if (bt_link_info->pan_exist)484 num_of_diff_profile++;485 if (bt_link_info->a2dp_exist)486 num_of_diff_profile++;487 488 if (num_of_diff_profile == 1) {489 if (bt_link_info->sco_exist) {490 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,491 "[BTCoex], BT Profile = SCO only\n");492 algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;493 } else {494 if (bt_link_info->hid_exist) {495 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,496 "[BTCoex], BT Profile = HID only\n");497 algorithm = BT_8821A_1ANT_COEX_ALGO_HID;498 } else if (bt_link_info->a2dp_exist) {499 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,500 "[BTCoex], BT Profile = A2DP only\n");501 algorithm = BT_8821A_1ANT_COEX_ALGO_A2DP;502 } else if (bt_link_info->pan_exist) {503 if (bt_hs_on) {504 rtl_dbg(rtlpriv, COMP_BT_COEXIST,505 DBG_LOUD,506 "[BTCoex], BT Profile = PAN(HS) only\n");507 algorithm = BT_8821A_1ANT_COEX_ALGO_PANHS;508 } else {509 rtl_dbg(rtlpriv, COMP_BT_COEXIST,510 DBG_LOUD,511 "[BTCoex], BT Profile = PAN(EDR) only\n");512 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR;513 }514 }515 }516 } else if (num_of_diff_profile == 2) {517 if (bt_link_info->sco_exist) {518 if (bt_link_info->hid_exist) {519 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,520 "[BTCoex], BT Profile = SCO + HID\n");521 algorithm = BT_8821A_1ANT_COEX_ALGO_HID;522 } else if (bt_link_info->a2dp_exist) {523 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,524 "[BTCoex], BT Profile = SCO + A2DP ==> SCO\n");525 algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;526 } else if (bt_link_info->pan_exist) {527 if (bt_hs_on) {528 rtl_dbg(rtlpriv, COMP_BT_COEXIST,529 DBG_LOUD,530 "[BTCoex], BT Profile = SCO + PAN(HS)\n");531 algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;532 } else {533 rtl_dbg(rtlpriv, COMP_BT_COEXIST,534 DBG_LOUD,535 "[BTCoex], BT Profile = SCO + PAN(EDR)\n");536 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;537 }538 }539 } else {540 if (bt_link_info->hid_exist &&541 bt_link_info->a2dp_exist) {542 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,543 "[BTCoex], BT Profile = HID + A2DP\n");544 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;545 } else if (bt_link_info->hid_exist &&546 bt_link_info->pan_exist) {547 if (bt_hs_on) {548 rtl_dbg(rtlpriv, COMP_BT_COEXIST,549 DBG_LOUD,550 "[BTCoex], BT Profile = HID + PAN(HS)\n");551 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;552 } else {553 rtl_dbg(rtlpriv, COMP_BT_COEXIST,554 DBG_LOUD,555 "[BTCoex], BT Profile = HID + PAN(EDR)\n");556 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;557 }558 } else if (bt_link_info->pan_exist &&559 bt_link_info->a2dp_exist) {560 if (bt_hs_on) {561 rtl_dbg(rtlpriv, COMP_BT_COEXIST,562 DBG_LOUD,563 "[BTCoex], BT Profile = A2DP + PAN(HS)\n");564 algorithm = BT_8821A_1ANT_COEX_ALGO_A2DP_PANHS;565 } else {566 rtl_dbg(rtlpriv, COMP_BT_COEXIST,567 DBG_LOUD,568 "[BTCoex], BT Profile = A2DP + PAN(EDR)\n");569 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP;570 }571 }572 }573 } else if (num_of_diff_profile == 3) {574 if (bt_link_info->sco_exist) {575 if (bt_link_info->hid_exist &&576 bt_link_info->a2dp_exist) {577 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,578 "[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n");579 algorithm = BT_8821A_1ANT_COEX_ALGO_HID;580 } else if (bt_link_info->hid_exist &&581 bt_link_info->pan_exist) {582 if (bt_hs_on) {583 rtl_dbg(rtlpriv, COMP_BT_COEXIST,584 DBG_LOUD,585 "[BTCoex], BT Profile = SCO + HID + PAN(HS)\n");586 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;587 } else {588 rtl_dbg(rtlpriv, COMP_BT_COEXIST,589 DBG_LOUD,590 "[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n");591 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;592 }593 } else if (bt_link_info->pan_exist &&594 bt_link_info->a2dp_exist) {595 if (bt_hs_on) {596 rtl_dbg(rtlpriv, COMP_BT_COEXIST,597 DBG_LOUD,598 "[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n");599 algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;600 } else {601 rtl_dbg(rtlpriv, COMP_BT_COEXIST,602 DBG_LOUD,603 "[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n");604 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;605 }606 }607 } else {608 if (bt_link_info->hid_exist &&609 bt_link_info->pan_exist &&610 bt_link_info->a2dp_exist) {611 if (bt_hs_on) {612 rtl_dbg(rtlpriv, COMP_BT_COEXIST,613 DBG_LOUD,614 "[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n");615 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;616 } else {617 rtl_dbg(rtlpriv, COMP_BT_COEXIST,618 DBG_LOUD,619 "[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n");620 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR;621 }622 }623 }624 } else if (num_of_diff_profile >= 3) {625 if (bt_link_info->sco_exist) {626 if (bt_link_info->hid_exist &&627 bt_link_info->pan_exist &&628 bt_link_info->a2dp_exist) {629 if (bt_hs_on) {630 rtl_dbg(rtlpriv, COMP_BT_COEXIST,631 DBG_LOUD,632 "[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n");633 634 } else {635 rtl_dbg(rtlpriv, COMP_BT_COEXIST,636 DBG_LOUD,637 "[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");638 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;639 }640 }641 }642 }643 return algorithm;644}645 646static void btc8821a1ant_set_sw_penalty_tx_rate(struct btc_coexist *btcoexist,647 bool low_penalty_ra)648{649 struct rtl_priv *rtlpriv = btcoexist->adapter;650 u8 h2c_parameter[6] = {0};651 652 h2c_parameter[0] = 0x6; /* opCode, 0x6= Retry_Penalty*/653 654 if (low_penalty_ra) {655 h2c_parameter[1] |= BIT0;656 /* normal rate except MCS7/6/5, OFDM54/48/36 */657 h2c_parameter[2] = 0x00;658 h2c_parameter[3] = 0xf7; /* MCS7 or OFDM54 */659 h2c_parameter[4] = 0xf8; /* MCS6 or OFDM48 */660 h2c_parameter[5] = 0xf9; /* MCS5 or OFDM36 */661 }662 663 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,664 "[BTCoex], set WiFi Low-Penalty Retry: %s",665 (low_penalty_ra ? "ON!!" : "OFF!!"));666 667 btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);668}669 670static void btc8821a1ant_low_penalty_ra(struct btc_coexist *btcoexist,671 bool force_exec, bool low_penalty_ra)672{673 coex_dm->cur_low_penalty_ra = low_penalty_ra;674 675 if (!force_exec) {676 if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)677 return;678 }679 btc8821a1ant_set_sw_penalty_tx_rate(btcoexist,680 coex_dm->cur_low_penalty_ra);681 682 coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;683}684 685static void btc8821a1ant_set_coex_table(struct btc_coexist *btcoexist,686 u32 val0x6c0, u32 val0x6c4,687 u32 val0x6c8, u8 val0x6cc)688{689 struct rtl_priv *rtlpriv = btcoexist->adapter;690 691 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,692 "[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0);693 btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);694 695 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,696 "[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4);697 btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);698 699 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,700 "[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8);701 btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);702 703 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,704 "[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc);705 btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);706}707 708static void btc8821a1ant_coex_table(struct btc_coexist *btcoexist,709 bool force_exec, u32 val0x6c0, u32 val0x6c4,710 u32 val0x6c8, u8 val0x6cc)711{712 struct rtl_priv *rtlpriv = btcoexist->adapter;713 714 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,715 "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6c8 = 0x%x, 0x6cc = 0x%x\n",716 (force_exec ? "force to" : ""), val0x6c0, val0x6c4,717 val0x6c8, val0x6cc);718 coex_dm->cur_val_0x6c0 = val0x6c0;719 coex_dm->cur_val_0x6c4 = val0x6c4;720 coex_dm->cur_val_0x6c8 = val0x6c8;721 coex_dm->cur_val_0x6cc = val0x6cc;722 723 if (!force_exec) {724 if ((coex_dm->pre_val_0x6c0 == coex_dm->cur_val_0x6c0) &&725 (coex_dm->pre_val_0x6c4 == coex_dm->cur_val_0x6c4) &&726 (coex_dm->pre_val_0x6c8 == coex_dm->cur_val_0x6c8) &&727 (coex_dm->pre_val_0x6cc == coex_dm->cur_val_0x6cc))728 return;729 }730 btc8821a1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,731 val0x6c8, val0x6cc);732 733 coex_dm->pre_val_0x6c0 = coex_dm->cur_val_0x6c0;734 coex_dm->pre_val_0x6c4 = coex_dm->cur_val_0x6c4;735 coex_dm->pre_val_0x6c8 = coex_dm->cur_val_0x6c8;736 coex_dm->pre_val_0x6cc = coex_dm->cur_val_0x6cc;737}738 739static void btc8821a1ant_coex_table_with_type(struct btc_coexist *btcoexist,740 bool force_exec, u8 type)741{742 switch (type) {743 case 0:744 btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,745 0x55555555, 0xffffff, 0x3);746 break;747 case 1:748 btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,749 0x5a5a5a5a, 0xffffff, 0x3);750 break;751 case 2:752 btc8821a1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,753 0x5a5a5a5a, 0xffffff, 0x3);754 break;755 case 3:756 btc8821a1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,757 0xaaaaaaaa, 0xffffff, 0x3);758 break;759 case 4:760 btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,761 0x5a5a5a5a, 0xffffff, 0x3);762 break;763 case 5:764 btc8821a1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,765 0xaaaa5a5a, 0xffffff, 0x3);766 break;767 case 6:768 btc8821a1ant_coex_table(btcoexist, force_exec, 0x55555555,769 0xaaaa5a5a, 0xffffff, 0x3);770 break;771 case 7:772 btc8821a1ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,773 0xaaaaaaaa, 0xffffff, 0x3);774 break;775 default:776 break;777 }778}779 780static void btc8821a1ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,781 bool enable)782{783 struct rtl_priv *rtlpriv = btcoexist->adapter;784 u8 h2c_parameter[1] = {0};785 786 if (enable)787 h2c_parameter[0] |= BIT0; /* function enable */788 789 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,790 "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",791 h2c_parameter[0]);792 793 btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);794}795 796static void btc8821a1ant_ignore_wlan_act(struct btc_coexist *btcoexist,797 bool force_exec, bool enable)798{799 struct rtl_priv *rtlpriv = btcoexist->adapter;800 801 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,802 "[BTCoex], %s turn Ignore WlanAct %s\n",803 (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));804 coex_dm->cur_ignore_wlan_act = enable;805 806 if (!force_exec) {807 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,808 "[BTCoex], pre_ignore_wlan_act = %d, cur_ignore_wlan_act = %d!!\n",809 coex_dm->pre_ignore_wlan_act,810 coex_dm->cur_ignore_wlan_act);811 812 if (coex_dm->pre_ignore_wlan_act ==813 coex_dm->cur_ignore_wlan_act)814 return;815 }816 btc8821a1ant_set_fw_ignore_wlan_act(btcoexist, enable);817 818 coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;819}820 821static void btc8821a1ant_set_fw_ps_tdma(struct btc_coexist *btcoexist, u8 byte1,822 u8 byte2, u8 byte3, u8 byte4, u8 byte5)823{824 struct rtl_priv *rtlpriv = btcoexist->adapter;825 u8 h2c_parameter[5] = {0};826 u8 real_byte1 = byte1, real_byte5 = byte5;827 bool ap_enable = false;828 829 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,830 &ap_enable);831 832 if (ap_enable) {833 if (byte1 & BIT4 && !(byte1 & BIT5)) {834 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,835 "[BTCoex], FW for 1Ant AP mode\n");836 real_byte1 &= ~BIT4;837 real_byte1 |= BIT5;838 839 real_byte5 |= BIT5;840 real_byte5 &= ~BIT6;841 }842 }843 844 h2c_parameter[0] = real_byte1;845 h2c_parameter[1] = byte2;846 h2c_parameter[2] = byte3;847 h2c_parameter[3] = byte4;848 h2c_parameter[4] = real_byte5;849 850 coex_dm->ps_tdma_para[0] = real_byte1;851 coex_dm->ps_tdma_para[1] = byte2;852 coex_dm->ps_tdma_para[2] = byte3;853 coex_dm->ps_tdma_para[3] = byte4;854 coex_dm->ps_tdma_para[4] = real_byte5;855 856 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,857 "[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n",858 h2c_parameter[0],859 h2c_parameter[1] << 24 |860 h2c_parameter[2] << 16 |861 h2c_parameter[3] << 8 |862 h2c_parameter[4]);863 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);864}865 866static void btc8821a1ant_set_lps_rpwm(struct btc_coexist *btcoexist,867 u8 lps_val, u8 rpwm_val)868{869 u8 lps = lps_val;870 u8 rpwm = rpwm_val;871 872 btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);873 btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);874}875 876static void btc8821a1ant_lps_rpwm(struct btc_coexist *btcoexist,877 bool force_exec, u8 lps_val, u8 rpwm_val)878{879 struct rtl_priv *rtlpriv = btcoexist->adapter;880 881 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,882 "[BTCoex], %s set lps/rpwm = 0x%x/0x%x\n",883 (force_exec ? "force to" : ""), lps_val, rpwm_val);884 coex_dm->cur_lps = lps_val;885 coex_dm->cur_rpwm = rpwm_val;886 887 if (!force_exec) {888 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,889 "[BTCoex], LPS-RxBeaconMode = 0x%x, LPS-RPWM = 0x%x!!\n",890 coex_dm->cur_lps, coex_dm->cur_rpwm);891 892 if ((coex_dm->pre_lps == coex_dm->cur_lps) &&893 (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) {894 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,895 "[BTCoex], LPS-RPWM_Last = 0x%x, LPS-RPWM_Now = 0x%x!!\n",896 coex_dm->pre_rpwm, coex_dm->cur_rpwm);897 898 return;899 }900 }901 btc8821a1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);902 903 coex_dm->pre_lps = coex_dm->cur_lps;904 coex_dm->pre_rpwm = coex_dm->cur_rpwm;905}906 907static void btc8821a1ant_sw_mechanism(struct btc_coexist *btcoexist,908 bool low_penalty_ra)909{910 struct rtl_priv *rtlpriv = btcoexist->adapter;911 912 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,913 "[BTCoex], SM[LpRA] = %d\n", low_penalty_ra);914 915 btc8821a1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);916}917 918static void btc8821a1ant_set_ant_path(struct btc_coexist *btcoexist,919 u8 ant_pos_type, bool init_hw_cfg,920 bool wifi_off)921{922 struct btc_board_info *board_info = &btcoexist->board_info;923 u32 u4_tmp = 0;924 u8 h2c_parameter[2] = {0};925 926 if (init_hw_cfg) {927 /* 0x4c[23] = 0, 0x4c[24] = 1 Antenna control by WL/BT */928 u4_tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);929 u4_tmp &= ~BIT23;930 u4_tmp |= BIT24;931 btcoexist->btc_write_4byte(btcoexist, 0x4c, u4_tmp);932 933 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x975, 0x3, 0x3);934 btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x77);935 936 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {937 /* tell firmware "antenna inverse"938 * WRONG firmware antenna control code, need fw to fix939 */940 h2c_parameter[0] = 1;941 h2c_parameter[1] = 1;942 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,943 h2c_parameter);944 } else {945 /* tell firmware "no antenna inverse"946 * WRONG firmware antenna control code, need fw to fix947 */948 h2c_parameter[0] = 0;949 h2c_parameter[1] = 1;950 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,951 h2c_parameter);952 }953 } else if (wifi_off) {954 /* 0x4c[24:23] = 00, Set Antenna control955 * by BT_RFE_CTRL BT Vendor 0xac = 0xf002956 */957 u4_tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);958 u4_tmp &= ~BIT23;959 u4_tmp &= ~BIT24;960 btcoexist->btc_write_4byte(btcoexist, 0x4c, u4_tmp);961 962 /* 0x765 = 0x18 */963 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x3);964 } else {965 /* 0x765 = 0x0 */966 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x0);967 }968 969 /* ext switch setting */970 switch (ant_pos_type) {971 case BTC_ANT_PATH_WIFI:972 btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x77);973 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)974 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,975 0x30, 0x1);976 else977 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,978 0x30, 0x2);979 break;980 case BTC_ANT_PATH_BT:981 btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x77);982 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)983 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,984 0x30, 0x2);985 else986 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,987 0x30, 0x1);988 break;989 default:990 case BTC_ANT_PATH_PTA:991 btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x66);992 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)993 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,994 0x30, 0x1);995 else996 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,997 0x30, 0x2);998 break;999 }1000}1001 1002static void btc8821a1ant_ps_tdma(struct btc_coexist *btcoexist,1003 bool force_exec, bool turn_on, u8 type)1004{1005 struct rtl_priv *rtlpriv = btcoexist->adapter;1006 u8 rssi_adjust_val = 0;1007 1008 coex_dm->cur_ps_tdma_on = turn_on;1009 coex_dm->cur_ps_tdma = type;1010 1011 if (!force_exec) {1012 if (coex_dm->cur_ps_tdma_on) {1013 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1014 "[BTCoex], ********** TDMA(on, %d) **********\n",1015 coex_dm->cur_ps_tdma);1016 } else {1017 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1018 "[BTCoex], ********** TDMA(off, %d) **********\n",1019 coex_dm->cur_ps_tdma);1020 }1021 if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&1022 (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))1023 return;1024 }1025 if (turn_on) {1026 switch (type) {1027 default:1028 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1a,1029 0x1a, 0x0, 0x50);1030 break;1031 case 1:1032 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x3a,1033 0x03, 0x10, 0x50);1034 rssi_adjust_val = 11;1035 break;1036 case 2:1037 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x2b,1038 0x03, 0x10, 0x50);1039 rssi_adjust_val = 14;1040 break;1041 case 3:1042 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1d,1043 0x1d, 0x0, 0x10);1044 break;1045 case 4:1046 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,1047 0x3, 0x14, 0x0);1048 rssi_adjust_val = 17;1049 break;1050 case 5:1051 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x15,1052 0x3, 0x11, 0x10);1053 break;1054 case 6:1055 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x20,1056 0x3, 0x11, 0x13);1057 break;1058 case 7:1059 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xc,1060 0x5, 0x0, 0x0);1061 break;1062 case 8:1063 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,1064 0x3, 0x10, 0x0);1065 break;1066 case 9:1067 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x21,1068 0x3, 0x10, 0x50);1069 rssi_adjust_val = 18;1070 break;1071 case 10:1072 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,1073 0xa, 0x0, 0x40);1074 break;1075 case 11:1076 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x15,1077 0x03, 0x10, 0x50);1078 rssi_adjust_val = 20;1079 break;1080 case 12:1081 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x0a,1082 0x0a, 0x0, 0x50);1083 break;1084 case 13:1085 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x12,1086 0x12, 0x0, 0x50);1087 break;1088 case 14:1089 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1e,1090 0x3, 0x10, 0x14);1091 break;1092 case 15:1093 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,1094 0x3, 0x8, 0x0);1095 break;1096 case 16:1097 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,1098 0x3, 0x10, 0x0);1099 rssi_adjust_val = 18;1100 break;1101 case 18:1102 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,1103 0x3, 0x10, 0x0);1104 rssi_adjust_val = 14;1105 break;1106 case 20:1107 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x35,1108 0x03, 0x11, 0x10);1109 break;1110 case 21:1111 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,1112 0x03, 0x11, 0x11);1113 break;1114 case 22:1115 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,1116 0x03, 0x11, 0x10);1117 break;1118 case 23:1119 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,1120 0x3, 0x31, 0x18);1121 rssi_adjust_val = 22;1122 break;1123 case 24:1124 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,1125 0x3, 0x31, 0x18);1126 rssi_adjust_val = 22;1127 break;1128 case 25:1129 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,1130 0x3, 0x31, 0x18);1131 rssi_adjust_val = 22;1132 break;1133 case 26:1134 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,1135 0x3, 0x31, 0x18);1136 rssi_adjust_val = 22;1137 break;1138 case 27:1139 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,1140 0x3, 0x31, 0x98);1141 rssi_adjust_val = 22;1142 break;1143 case 28:1144 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x69, 0x25,1145 0x3, 0x31, 0x0);1146 break;1147 case 29:1148 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xab, 0x1a,1149 0x1a, 0x1, 0x10);1150 break;1151 case 30:1152 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x30,1153 0x3, 0x10, 0x10);1154 break;1155 case 31:1156 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1a,1157 0x1a, 0, 0x58);1158 break;1159 case 32:1160 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x35,1161 0x3, 0x11, 0x11);1162 break;1163 case 33:1164 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x25,1165 0x3, 0x30, 0x90);1166 break;1167 case 34:1168 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x53, 0x1a,1169 0x1a, 0x0, 0x10);1170 break;1171 case 35:1172 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x63, 0x1a,1173 0x1a, 0x0, 0x10);1174 break;1175 case 36:1176 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x12,1177 0x3, 0x14, 0x50);1178 break;1179 case 40:1180 /* SoftAP only with no sta associated, BT disable, TDMA1181 * mode for power saving1182 *1183 * here softap mode screen off will cost 70-80mA for1184 * phone1185 */1186 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x23, 0x18,1187 0x00, 0x10, 0x24);1188 break;1189 case 41:1190 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x15,1191 0x3, 0x11, 0x11);1192 break;1193 case 42:1194 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x20,1195 0x3, 0x11, 0x11);1196 break;1197 case 43:1198 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x30,1199 0x3, 0x10, 0x11);1200 break;1201 }1202 } else {1203 /* disable PS tdma */1204 switch (type) {1205 case 8:1206 /* PTA Control */1207 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x8, 0x0, 0x0,1208 0x0, 0x0);1209 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,1210 false, false);1211 break;1212 case 0:1213 default:1214 /* Software control, Antenna at BT side */1215 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,1216 0x0, 0x0);1217 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,1218 false, false);1219 break;1220 case 9:1221 /* Software control, Antenna at WiFi side */1222 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,1223 0x0, 0x0);1224 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI,1225 false, false);1226 break;1227 case 10:1228 /* under 5G */1229 btc8821a1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,1230 0x8, 0x0);1231 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,1232 false, false);1233 break;1234 }1235 }1236 rssi_adjust_val = 0;1237 btcoexist->btc_set(btcoexist,1238 BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssi_adjust_val);1239 1240 /* update pre state */1241 coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;1242 coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;1243}1244 1245static bool btc8821a1ant_is_common_action(struct btc_coexist *btcoexist)1246{1247 struct rtl_priv *rtlpriv = btcoexist->adapter;1248 bool common = false, wifi_connected = false, wifi_busy = false;1249 1250 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,1251 &wifi_connected);1252 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);1253 1254 if (!wifi_connected &&1255 BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==1256 coex_dm->bt_status) {1257 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1258 "[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n");1259 btc8821a1ant_sw_mechanism(btcoexist, false);1260 1261 common = true;1262 } else if (wifi_connected &&1263 (BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==1264 coex_dm->bt_status)) {1265 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1266 "[BTCoex], Wifi connected + BT non connected-idle!!\n");1267 btc8821a1ant_sw_mechanism(btcoexist, false);1268 1269 common = true;1270 } else if (!wifi_connected &&1271 (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE ==1272 coex_dm->bt_status)) {1273 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1274 "[BTCoex], Wifi non connected-idle + BT connected-idle!!\n");1275 btc8821a1ant_sw_mechanism(btcoexist, false);1276 1277 common = true;1278 } else if (wifi_connected &&1279 (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE ==1280 coex_dm->bt_status)) {1281 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1282 "[BTCoex], Wifi connected + BT connected-idle!!\n");1283 btc8821a1ant_sw_mechanism(btcoexist, false);1284 1285 common = true;1286 } else if (!wifi_connected &&1287 (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE !=1288 coex_dm->bt_status)) {1289 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1290 "[BTCoex], Wifi non connected-idle + BT Busy!!\n");1291 btc8821a1ant_sw_mechanism(btcoexist, false);1292 1293 common = true;1294 } else {1295 if (wifi_busy) {1296 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1297 "[BTCoex], Wifi Connected-Busy + BT Busy!!\n");1298 } else {1299 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1300 "[BTCoex], Wifi Connected-Idle + BT Busy!!\n");1301 }1302 1303 common = false;1304 }1305 1306 return common;1307}1308 1309static void btc8821a1ant_ps_tdma_check_for_pwr_save(struct btc_coexist *btcoex,1310 bool new_ps_state)1311{1312 u8 lps_mode = 0x0;1313 1314 btcoex->btc_get(btcoex, BTC_GET_U1_LPS_MODE, &lps_mode);1315 1316 if (lps_mode) {1317 /* already under LPS state */1318 if (new_ps_state) {1319 /* keep state under LPS, do nothing */1320 } else {1321 /* will leave LPS state, turn off psTdma first */1322 btc8821a1ant_ps_tdma(btcoex, NORMAL_EXEC, false, 0);1323 }1324 } else {1325 /* NO PS state*/1326 if (new_ps_state) {1327 /* will enter LPS state, turn off psTdma first */1328 btc8821a1ant_ps_tdma(btcoex, NORMAL_EXEC, false, 0);1329 } else {1330 /* keep state under NO PS state, do nothing */1331 }1332 }1333}1334 1335static void btc8821a1ant_power_save_state(struct btc_coexist *btcoexist,1336 u8 ps_type, u8 lps_val, u8 rpwm_val)1337{1338 bool low_pwr_disable = false;1339 1340 switch (ps_type) {1341 case BTC_PS_WIFI_NATIVE:1342 /* recover to original 32k low power setting */1343 low_pwr_disable = false;1344 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,1345 &low_pwr_disable);1346 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);1347 break;1348 case BTC_PS_LPS_ON:1349 btc8821a1ant_ps_tdma_check_for_pwr_save(btcoexist,1350 true);1351 btc8821a1ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,1352 rpwm_val);1353 /* when coex force to enter LPS, do not enter 32k low power */1354 low_pwr_disable = true;1355 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,1356 &low_pwr_disable);1357 /* power save must executed before psTdma */1358 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);1359 break;1360 case BTC_PS_LPS_OFF:1361 btc8821a1ant_ps_tdma_check_for_pwr_save(btcoexist, false);1362 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);1363 break;1364 default:1365 break;1366 }1367}1368 1369static void btc8821a1ant_coex_under_5g(struct btc_coexist *btcoexist)1370{1371 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1372 0x0, 0x0);1373 btc8821a1ant_ignore_wlan_act(btcoexist, NORMAL_EXEC, true);1374 1375 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 10);1376 1377 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);1378 1379 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);1380 1381 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 5);1382}1383 1384/***********************************************1385 *1386 * Software Coex Mechanism start1387 *1388 ***********************************************/1389 1390/* SCO only or SCO+PAN(HS) */1391static void btc8821a1ant_action_sco(struct btc_coexist *btcoexist)1392{1393 btc8821a1ant_sw_mechanism(btcoexist, true);1394}1395 1396static void btc8821a1ant_action_hid(struct btc_coexist *btcoexist)1397{1398 btc8821a1ant_sw_mechanism(btcoexist, true);1399}1400 1401/* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */1402static void btc8821a1ant_action_a2dp(struct btc_coexist *btcoexist)1403{1404 btc8821a1ant_sw_mechanism(btcoexist, false);1405}1406 1407static void btc8821a1ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)1408{1409 btc8821a1ant_sw_mechanism(btcoexist, false);1410}1411 1412static void btc8821a1ant_action_pan_edr(struct btc_coexist *btcoexist)1413{1414 btc8821a1ant_sw_mechanism(btcoexist, false);1415}1416 1417/* PAN(HS) only */1418static void btc8821a1ant_action_pan_hs(struct btc_coexist *btcoexist)1419{1420 btc8821a1ant_sw_mechanism(btcoexist, false);1421}1422 1423/* PAN(EDR)+A2DP */1424static void btc8821a1ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)1425{1426 btc8821a1ant_sw_mechanism(btcoexist, false);1427}1428 1429static void btc8821a1ant_action_pan_edr_hid(struct btc_coexist *btcoexist)1430{1431 btc8821a1ant_sw_mechanism(btcoexist, true);1432}1433 1434/* HID+A2DP+PAN(EDR) */1435static void btc8821a1ant_action_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)1436{1437 btc8821a1ant_sw_mechanism(btcoexist, true);1438}1439 1440static void btc8821a1ant_action_hid_a2dp(struct btc_coexist *btcoexist)1441{1442 btc8821a1ant_sw_mechanism(btcoexist, true);1443}1444 1445/***********************************************1446 *1447 * Non-Software Coex Mechanism start1448 *1449 ***********************************************/1450static1451void btc8821a1ant_action_wifi_multi_port(struct btc_coexist *btcoexist)1452{1453 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1454 1455 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);1456 /* tdma and coex table */1457 if (coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_ACL_BUSY) {1458 if (bt_link_info->a2dp_exist) {1459 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);1460 btc8821a1ant_coex_table_with_type(btcoexist,1461 NORMAL_EXEC, 1);1462 } else if (bt_link_info->a2dp_exist &&1463 bt_link_info->pan_exist) {1464 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1465 btc8821a1ant_coex_table_with_type(btcoexist,1466 NORMAL_EXEC, 4);1467 } else {1468 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);1469 btc8821a1ant_coex_table_with_type(btcoexist,1470 NORMAL_EXEC, 4);1471 }1472 } else if ((coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_SCO_BUSY) ||1473 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==1474 coex_dm->bt_status)) {1475 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,1476 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);1477 } else {1478 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1479 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);1480 }1481}1482 1483static1484void btc8821a1ant_action_wifi_not_connected_asso_auth(1485 struct btc_coexist *btcoexist)1486{1487 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1488 1489 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,1490 0x0);1491 1492 /* tdma and coex table */1493 if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) {1494 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);1495 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);1496 } else if ((bt_link_info->a2dp_exist) || (bt_link_info->pan_exist)) {1497 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);1498 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);1499 } else {1500 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1501 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);1502 }1503}1504 1505 1506static void btc8821a1ant_action_hs(struct btc_coexist *btcoexist)1507{1508 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);1509 btc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2);1510}1511 1512static void btc8821a1ant_action_bt_inquiry(struct btc_coexist *btcoexist)1513{1514 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1515 bool wifi_connected = false;1516 bool ap_enable = false;1517 bool wifi_busy = false, bt_busy = false;1518 1519 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,1520 &wifi_connected);1521 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,1522 &ap_enable);1523 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);1524 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);1525 1526 if (!wifi_connected && !coex_sta->wifi_is_high_pri_task) {1527 btc8821a1ant_power_save_state(btcoexist,1528 BTC_PS_WIFI_NATIVE, 0x0, 0x0);1529 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1530 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);1531 } else if ((bt_link_info->sco_exist) || (bt_link_info->a2dp_exist) ||1532 (bt_link_info->hid_only)) {1533 /* SCO/HID-only busy */1534 btc8821a1ant_power_save_state(btcoexist,1535 BTC_PS_WIFI_NATIVE, 0x0, 0x0);1536 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);1537 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);1538 } else if ((bt_link_info->a2dp_exist) && (bt_link_info->hid_exist)) {1539 /* A2DP+HID busy */1540 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1541 0x0, 0x0);1542 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);1543 1544 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);1545 } else if ((bt_link_info->pan_exist) || (wifi_busy)) {1546 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1547 0x0, 0x0);1548 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);1549 1550 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);1551 } else {1552 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1553 0x0, 0x0);1554 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1555 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);1556 }1557}1558 1559static void btc8821a1ant_act_bt_sco_hid_only_busy(struct btc_coexist *btcoexist,1560 u8 wifi_status)1561{1562 /* tdma and coex table */1563 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);1564 1565 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);1566}1567 1568static void btc8821a1ant_act_wifi_con_bt_acl_busy(struct btc_coexist *btcoexist,1569 u8 wifi_status)1570{1571 u8 bt_rssi_state;1572 1573 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1574 1575 bt_rssi_state = btc8821a1ant_bt_rssi_state(btcoexist, 2, 28, 0);1576 1577 if (bt_link_info->hid_only) {1578 /* HID */1579 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,1580 wifi_status);1581 coex_dm->auto_tdma_adjust = false;1582 return;1583 } else if (bt_link_info->a2dp_only) {1584 /* A2DP */1585 if (wifi_status == BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE) {1586 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);1587 btc8821a1ant_coex_table_with_type(btcoexist,1588 NORMAL_EXEC, 1);1589 coex_dm->auto_tdma_adjust = false;1590 } else if ((bt_rssi_state != BTC_RSSI_STATE_HIGH) &&1591 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {1592 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);1593 btc8821a1ant_coex_table_with_type(btcoexist,1594 NORMAL_EXEC, 1);1595 } else {1596 /* for low BT RSSI */1597 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);1598 btc8821a1ant_coex_table_with_type(btcoexist,1599 NORMAL_EXEC, 1);1600 coex_dm->auto_tdma_adjust = false;1601 }1602 } else if (bt_link_info->hid_exist && bt_link_info->a2dp_exist) {1603 /* HID+A2DP (no need to consider BT RSSI) */1604 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC,1605 true, 14);1606 coex_dm->auto_tdma_adjust = false;1607 1608 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);1609 } else if ((bt_link_info->pan_only) ||1610 (bt_link_info->hid_exist && bt_link_info->pan_exist)) {1611 /* PAN(OPP, FTP), HID+PAN(OPP, FTP) */1612 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);1613 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);1614 coex_dm->auto_tdma_adjust = false;1615 } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) ||1616 (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&1617 bt_link_info->pan_exist)) {1618 /* A2DP+PAN(OPP, FTP), HID+A2DP+PAN(OPP, FTP) */1619 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 43);1620 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);1621 coex_dm->auto_tdma_adjust = false;1622 } else {1623 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);1624 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);1625 coex_dm->auto_tdma_adjust = false;1626 }1627}1628 1629static1630void btc8821a1ant_action_wifi_not_connected(struct btc_coexist *btcoexist)1631{1632 /* power save state */1633 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);1634 1635 /* tdma and coex table */1636 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1637 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);1638}1639 1640static void btc8821a1ant_act_wifi_not_conn_scan(struct btc_coexist *btcoexist)1641{1642 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1643 1644 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);1645 1646 /* tdma and coex table */1647 if (coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_ACL_BUSY) {1648 if (bt_link_info->a2dp_exist) {1649 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);1650 btc8821a1ant_coex_table_with_type(btcoexist,1651 NORMAL_EXEC, 1);1652 } else if (bt_link_info->a2dp_exist &&1653 bt_link_info->pan_exist) {1654 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);1655 btc8821a1ant_coex_table_with_type(btcoexist,1656 NORMAL_EXEC, 4);1657 } else {1658 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);1659 btc8821a1ant_coex_table_with_type(btcoexist,1660 NORMAL_EXEC, 4);1661 }1662 } else if ((coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_SCO_BUSY) ||1663 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==1664 coex_dm->bt_status)) {1665 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,1666 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);1667 } else {1668 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1669 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);1670 }1671}1672 1673static1674void btc8821a1ant_action_wifi_connected_scan(struct btc_coexist *btcoexist)1675{1676 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1677 1678 /* power save state */1679 btc8821a1ant_power_save_state(btcoexist,1680 BTC_PS_WIFI_NATIVE, 0x0, 0x0);1681 1682 /* tdma and coex table */1683 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {1684 if (bt_link_info->a2dp_exist) {1685 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);1686 btc8821a1ant_coex_table_with_type(btcoexist,1687 NORMAL_EXEC, 1);1688 } else {1689 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);1690 btc8821a1ant_coex_table_with_type(btcoexist,1691 NORMAL_EXEC, 4);1692 }1693 } else if ((coex_dm->bt_status == BT_8821A_1ANT_BT_STATUS_SCO_BUSY) ||1694 (coex_dm->bt_status ==1695 BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY)) {1696 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,1697 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);1698 } else {1699 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1700 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);1701 }1702}1703 1704static void btc8821a1ant_act_wifi_conn_sp_pkt(struct btc_coexist *btcoexist)1705{1706 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1707 1708 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1709 0x0, 0x0);1710 1711 /* tdma and coex table */1712 if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) ||1713 (bt_link_info->a2dp_exist)) {1714 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);1715 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);1716 }1717 1718 if ((bt_link_info->hid_exist) && (bt_link_info->a2dp_exist)) {1719 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);1720 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);1721 } else if (bt_link_info->pan_exist) {1722 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);1723 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);1724 } else {1725 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1726 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);1727 }1728}1729 1730static void btc8821a1ant_action_wifi_connected(struct btc_coexist *btcoexist)1731{1732 struct rtl_priv *rtlpriv = btcoexist->adapter;1733 bool wifi_busy = false;1734 bool scan = false, link = false, roam = false;1735 bool under_4way = false;1736 bool ap_enable = false;1737 1738 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1739 "[BTCoex], CoexForWifiConnect()===>\n");1740 1741 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,1742 &under_4way);1743 if (under_4way) {1744 btc8821a1ant_act_wifi_conn_sp_pkt(btcoexist);1745 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1746 "[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n");1747 return;1748 }1749 1750 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);1751 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);1752 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);1753 if (scan || link || roam) {1754 if (scan)1755 btc8821a1ant_action_wifi_connected_scan(btcoexist);1756 else1757 btc8821a1ant_act_wifi_conn_sp_pkt(btcoexist);1758 1759 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1760 "[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n");1761 return;1762 }1763 1764 /* power save state*/1765 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,1766 &ap_enable);1767 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);1768 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY ==1769 coex_dm->bt_status && !ap_enable &&1770 !btcoexist->bt_link_info.hid_only) {1771 if (!wifi_busy && btcoexist->bt_link_info.a2dp_only)1772 /* A2DP */1773 btc8821a1ant_power_save_state(btcoexist,1774 BTC_PS_WIFI_NATIVE, 0x0, 0x0);1775 else1776 btc8821a1ant_power_save_state(btcoexist, BTC_PS_LPS_ON,1777 0x50, 0x4);1778 } else {1779 btc8821a1ant_power_save_state(btcoexist,1780 BTC_PS_WIFI_NATIVE,1781 0x0, 0x0);1782 }1783 1784 /* tdma and coex table */1785 if (!wifi_busy) {1786 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {1787 btc8821a1ant_act_wifi_con_bt_acl_busy(btcoexist,1788 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE);1789 } else if ((BT_8821A_1ANT_BT_STATUS_SCO_BUSY ==1790 coex_dm->bt_status) ||1791 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==1792 coex_dm->bt_status)) {1793 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,1794 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE);1795 } else {1796 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1797 btc8821a1ant_coex_table_with_type(btcoexist,1798 NORMAL_EXEC, 2);1799 }1800 } else {1801 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {1802 btc8821a1ant_act_wifi_con_bt_acl_busy(btcoexist,1803 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_BUSY);1804 } else if ((BT_8821A_1ANT_BT_STATUS_SCO_BUSY ==1805 coex_dm->bt_status) ||1806 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==1807 coex_dm->bt_status)) {1808 btc8821a1ant_act_bt_sco_hid_only_busy(btcoexist,1809 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_BUSY);1810 } else {1811 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);1812 btc8821a1ant_coex_table_with_type(btcoexist,1813 NORMAL_EXEC, 2);1814 }1815 }1816}1817 1818static void btc8821a1ant_run_sw_coex_mech(struct btc_coexist *btcoexist)1819{1820 struct rtl_priv *rtlpriv = btcoexist->adapter;1821 u8 algorithm = 0;1822 1823 algorithm = btc8821a1ant_action_algorithm(btcoexist);1824 coex_dm->cur_algorithm = algorithm;1825 1826 if (!btc8821a1ant_is_common_action(btcoexist)) {1827 switch (coex_dm->cur_algorithm) {1828 case BT_8821A_1ANT_COEX_ALGO_SCO:1829 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1830 "[BTCoex], Action algorithm = SCO\n");1831 btc8821a1ant_action_sco(btcoexist);1832 break;1833 case BT_8821A_1ANT_COEX_ALGO_HID:1834 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1835 "[BTCoex], Action algorithm = HID\n");1836 btc8821a1ant_action_hid(btcoexist);1837 break;1838 case BT_8821A_1ANT_COEX_ALGO_A2DP:1839 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1840 "[BTCoex], Action algorithm = A2DP\n");1841 btc8821a1ant_action_a2dp(btcoexist);1842 break;1843 case BT_8821A_1ANT_COEX_ALGO_A2DP_PANHS:1844 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1845 "[BTCoex], Action algorithm = A2DP+PAN(HS)\n");1846 btc8821a1ant_action_a2dp_pan_hs(btcoexist);1847 break;1848 case BT_8821A_1ANT_COEX_ALGO_PANEDR:1849 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1850 "[BTCoex], Action algorithm = PAN(EDR)\n");1851 btc8821a1ant_action_pan_edr(btcoexist);1852 break;1853 case BT_8821A_1ANT_COEX_ALGO_PANHS:1854 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1855 "[BTCoex], Action algorithm = HS mode\n");1856 btc8821a1ant_action_pan_hs(btcoexist);1857 break;1858 case BT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP:1859 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1860 "[BTCoex], Action algorithm = PAN+A2DP\n");1861 btc8821a1ant_action_pan_edr_a2dp(btcoexist);1862 break;1863 case BT_8821A_1ANT_COEX_ALGO_PANEDR_HID:1864 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1865 "[BTCoex], Action algorithm = PAN(EDR)+HID\n");1866 btc8821a1ant_action_pan_edr_hid(btcoexist);1867 break;1868 case BT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR:1869 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1870 "[BTCoex], Action algorithm = HID+A2DP+PAN\n");1871 btc8821a1ant_action_hid_a2dp_pan_edr(btcoexist);1872 break;1873 case BT_8821A_1ANT_COEX_ALGO_HID_A2DP:1874 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1875 "[BTCoex], Action algorithm = HID+A2DP\n");1876 btc8821a1ant_action_hid_a2dp(btcoexist);1877 break;1878 default:1879 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1880 "[BTCoex], Action algorithm = coexist All Off!!\n");1881 /*btc8821a1ant_coex_all_off(btcoexist);*/1882 break;1883 }1884 coex_dm->pre_algorithm = coex_dm->cur_algorithm;1885 }1886}1887 1888static void btc8821a1ant_run_coexist_mechanism(struct btc_coexist *btcoexist)1889{1890 struct rtl_priv *rtlpriv = btcoexist->adapter;1891 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;1892 bool wifi_connected = false, bt_hs_on = false;1893 bool increase_scan_dev_num = false;1894 bool bt_ctrl_agg_buf_size = false;1895 u8 agg_buf_size = 5;1896 u32 wifi_link_status = 0;1897 u32 num_of_wifi_link = 0;1898 bool wifi_under_5g = false;1899 1900 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1901 "[BTCoex], RunCoexistMechanism()===>\n");1902 1903 if (btcoexist->manual_control) {1904 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1905 "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");1906 return;1907 }1908 1909 if (btcoexist->stop_coex_dm) {1910 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1911 "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");1912 return;1913 }1914 1915 if (coex_sta->under_ips) {1916 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1917 "[BTCoex], wifi is under IPS !!!\n");1918 return;1919 }1920 1921 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);1922 if (wifi_under_5g) {1923 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1924 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");1925 btc8821a1ant_coex_under_5g(btcoexist);1926 return;1927 }1928 1929 if ((BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||1930 (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||1931 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))1932 increase_scan_dev_num = true;1933 1934 btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM,1935 &increase_scan_dev_num);1936 1937 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,1938 &wifi_connected);1939 1940 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,1941 &wifi_link_status);1942 num_of_wifi_link = wifi_link_status >> 16;1943 if ((num_of_wifi_link >= 2) ||1944 (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {1945 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);1946 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,1947 bt_ctrl_agg_buf_size, agg_buf_size);1948 btc8821a1ant_action_wifi_multi_port(btcoexist);1949 return;1950 }1951 1952 if (!bt_link_info->sco_exist && !bt_link_info->hid_exist) {1953 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);1954 } else {1955 if (wifi_connected) {1956 btc8821a1ant_wifi_rssi_state(btcoexist, 1, 2,1957 30, 0);1958 btc8821a1ant_limited_tx(btcoexist,1959 NORMAL_EXEC, 1, 1,1960 0, 1);1961 } else {1962 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC,1963 0, 0, 0, 0);1964 }1965 }1966 1967 if (bt_link_info->sco_exist) {1968 bt_ctrl_agg_buf_size = true;1969 agg_buf_size = 0x3;1970 } else if (bt_link_info->hid_exist) {1971 bt_ctrl_agg_buf_size = true;1972 agg_buf_size = 0x5;1973 } else if (bt_link_info->a2dp_exist || bt_link_info->pan_exist) {1974 bt_ctrl_agg_buf_size = true;1975 agg_buf_size = 0x8;1976 }1977 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,1978 bt_ctrl_agg_buf_size, agg_buf_size);1979 1980 btc8821a1ant_run_sw_coex_mech(btcoexist);1981 1982 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);1983 if (coex_sta->c2h_bt_inquiry_page) {1984 btc8821a1ant_action_bt_inquiry(btcoexist);1985 return;1986 } else if (bt_hs_on) {1987 btc8821a1ant_action_hs(btcoexist);1988 return;1989 }1990 1991 if (!wifi_connected) {1992 bool scan = false, link = false, roam = false;1993 1994 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1995 "[BTCoex], wifi is non connected-idle !!!\n");1996 1997 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);1998 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);1999 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);2000 2001 if (scan || link || roam) {2002 if (scan)2003 btc8821a1ant_act_wifi_not_conn_scan(btcoexist);2004 else2005 btc8821a1ant_action_wifi_not_connected_asso_auth(2006 btcoexist);2007 } else {2008 btc8821a1ant_action_wifi_not_connected(btcoexist);2009 }2010 } else {2011 /* wifi LPS/Busy */2012 btc8821a1ant_action_wifi_connected(btcoexist);2013 }2014}2015 2016static void btc8821a1ant_init_coex_dm(struct btc_coexist *btcoexist)2017{2018 /* force to reset coex mechanism2019 * sw all off2020 */2021 btc8821a1ant_sw_mechanism(btcoexist, false);2022 2023 btc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);2024}2025 2026static void btc8821a1ant_init_hw_config(struct btc_coexist *btcoexist,2027 bool back_up, bool wifi_only)2028{2029 struct rtl_priv *rtlpriv = btcoexist->adapter;2030 u8 u1_tmp = 0;2031 bool wifi_under_5g = false;2032 2033 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2034 "[BTCoex], 1Ant Init HW Config!!\n");2035 2036 if (wifi_only)2037 return;2038 2039 if (back_up) {2040 coex_dm->backup_arfr_cnt1 = btcoexist->btc_read_4byte(btcoexist,2041 0x430);2042 coex_dm->backup_arfr_cnt2 = btcoexist->btc_read_4byte(btcoexist,2043 0x434);2044 coex_dm->backup_retry_limit =2045 btcoexist->btc_read_2byte(btcoexist, 0x42a);2046 coex_dm->backup_ampdu_max_time =2047 btcoexist->btc_read_1byte(btcoexist, 0x456);2048 }2049 2050 /* 0x790[5:0] = 0x5 */2051 u1_tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);2052 u1_tmp &= 0xc0;2053 u1_tmp |= 0x5;2054 btcoexist->btc_write_1byte(btcoexist, 0x790, u1_tmp);2055 2056 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);2057 2058 /* Antenna config */2059 if (wifi_under_5g)2060 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,2061 true, false);2062 else2063 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,2064 true, false);2065 /* PTA parameter */2066 btc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);2067 2068 /* Enable counter statistics2069 * 0x76e[3] =1, WLAN_Act control by PTA2070 */2071 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);2072 btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);2073 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);2074}2075 2076/**************************************************************2077 * extern function start with ex_btc8821a1ant_2078 **************************************************************/2079void ex_btc8821a1ant_init_hwconfig(struct btc_coexist *btcoexist, bool wifionly)2080{2081 btc8821a1ant_init_hw_config(btcoexist, true, wifionly);2082 btcoexist->auto_report_1ant = true;2083}2084 2085void ex_btc8821a1ant_init_coex_dm(struct btc_coexist *btcoexist)2086{2087 struct rtl_priv *rtlpriv = btcoexist->adapter;2088 2089 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2090 "[BTCoex], Coex Mechanism Init!!\n");2091 2092 btcoexist->stop_coex_dm = false;2093 2094 btc8821a1ant_init_coex_dm(btcoexist);2095 2096 btc8821a1ant_query_bt_info(btcoexist);2097}2098 2099void ex_btc8821a1ant_display_coex_info(struct btc_coexist *btcoexist,2100 struct seq_file *m)2101{2102 struct btc_board_info *board_info = &btcoexist->board_info;2103 struct btc_stack_info *stack_info = &btcoexist->stack_info;2104 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;2105 u8 u1_tmp[4], i, bt_info_ext, ps_tdma_case = 0;2106 u16 u2_tmp[4];2107 u32 u4_tmp[4];2108 bool roam = false, scan = false, link = false, wifi_under_5g = false;2109 bool bt_hs_on = false, wifi_busy = false;2110 long wifi_rssi = 0, bt_hs_rssi = 0;2111 u32 wifi_bw, wifi_traffic_dir;2112 u8 wifi_dot11_chnl, wifi_hs_chnl;2113 u32 fw_ver = 0, bt_patch_ver = 0;2114 2115 seq_puts(m, "\n ============[BT Coexist info]============");2116 2117 if (btcoexist->manual_control) {2118 seq_puts(m, "\n ============[Under Manual Control]============");2119 seq_puts(m, "\n ==========================================");2120 }2121 if (btcoexist->stop_coex_dm) {2122 seq_puts(m, "\n ============[Coex is STOPPED]============");2123 seq_puts(m, "\n ==========================================");2124 }2125 2126 seq_printf(m, "\n %-35s = %d/ %d/ %d",2127 "Ant PG Num/ Ant Mech/ Ant Pos:",2128 board_info->pg_ant_num,2129 board_info->btdm_ant_num,2130 board_info->btdm_ant_pos);2131 2132 seq_printf(m, "\n %-35s = %s / %d", "BT stack/ hci ext ver",2133 ((stack_info->profile_notified) ? "Yes" : "No"),2134 stack_info->hci_version);2135 2136 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,2137 &bt_patch_ver);2138 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);2139 seq_printf(m, "\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",2140 "CoexVer/ FwVer/ PatchVer",2141 glcoex_ver_date_8821a_1ant,2142 glcoex_ver_8821a_1ant,2143 fw_ver, bt_patch_ver,2144 bt_patch_ver);2145 2146 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION,2147 &bt_hs_on);2148 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,2149 &wifi_dot11_chnl);2150 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL,2151 &wifi_hs_chnl);2152 seq_printf(m, "\n %-35s = %d / %d(%d)",2153 "Dot11 channel / HsChnl(HsMode)",2154 wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);2155 2156 seq_printf(m, "\n %-35s = %3ph ",2157 "H2C Wifi inform bt chnl Info",2158 coex_dm->wifi_chnl_info);2159 2160 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);2161 btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);2162 seq_printf(m, "\n %-35s = %d/ %d", "Wifi rssi/ HS rssi",2163 (int)wifi_rssi, (int)bt_hs_rssi);2164 2165 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);2166 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);2167 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);2168 seq_printf(m, "\n %-35s = %d/ %d/ %d ", "Wifi link/ roam/ scan",2169 link, roam, scan);2170 2171 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G,2172 &wifi_under_5g);2173 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW,2174 &wifi_bw);2175 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY,2176 &wifi_busy);2177 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,2178 &wifi_traffic_dir);2179 seq_printf(m, "\n %-35s = %s / %s/ %s ", "Wifi status",2180 (wifi_under_5g ? "5G" : "2.4G"),2181 ((wifi_bw == BTC_WIFI_BW_LEGACY) ? "Legacy" :2182 (((wifi_bw == BTC_WIFI_BW_HT40) ? "HT40" : "HT20"))),2183 ((!wifi_busy) ? "idle" :2184 ((wifi_traffic_dir == BTC_WIFI_TRAFFIC_TX) ?2185 "uplink" : "downlink")));2186 seq_printf(m, "\n %-35s = [%s/ %d/ %d] ",2187 "BT [status/ rssi/ retryCnt]",2188 ((coex_sta->bt_disabled) ? ("disabled") :2189 ((coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan") :2190 ((BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==2191 coex_dm->bt_status) ?2192 "non-connected idle" :2193 ((BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE ==2194 coex_dm->bt_status) ?2195 "connected-idle" : "busy")))),2196 coex_sta->bt_rssi, coex_sta->bt_retry_cnt);2197 2198 seq_printf(m, "\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP",2199 bt_link_info->sco_exist,2200 bt_link_info->hid_exist,2201 bt_link_info->pan_exist,2202 bt_link_info->a2dp_exist);2203 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO, m);2204 2205 bt_info_ext = coex_sta->bt_info_ext;2206 seq_printf(m, "\n %-35s = %s",2207 "BT Info A2DP rate",2208 (bt_info_ext & BIT0) ?2209 "Basic rate" : "EDR rate");2210 2211 for (i = 0; i < BT_INFO_SRC_8821A_1ANT_MAX; i++) {2212 if (coex_sta->bt_info_c2h_cnt[i]) {2213 seq_printf(m, "\n %-35s = %7ph(%d)",2214 glbt_info_src_8821a_1ant[i],2215 coex_sta->bt_info_c2h[i],2216 coex_sta->bt_info_c2h_cnt[i]);2217 }2218 }2219 seq_printf(m, "\n %-35s = %s/%s, (0x%x/0x%x)",2220 "PS state, IPS/LPS, (lps/rpwm)",2221 ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),2222 ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")),2223 btcoexist->bt_info.lps_val,2224 btcoexist->bt_info.rpwm_val);2225 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);2226 2227 if (!btcoexist->manual_control) {2228 /* Sw mechanism*/2229 seq_printf(m, "\n %-35s",2230 "============[Sw mechanism]============");2231 2232 seq_printf(m, "\n %-35s = %d", "SM[LowPenaltyRA]",2233 coex_dm->cur_low_penalty_ra);2234 2235 seq_printf(m, "\n %-35s = %s/ %s/ %d ",2236 "DelBA/ BtCtrlAgg/ AggSize",2237 (btcoexist->bt_info.reject_agg_pkt ? "Yes" : "No"),2238 (btcoexist->bt_info.bt_ctrl_buf_size ? "Yes" : "No"),2239 btcoexist->bt_info.agg_buf_size);2240 seq_printf(m, "\n %-35s = 0x%x ", "Rate Mask",2241 btcoexist->bt_info.ra_mask);2242 2243 /* Fw mechanism */2244 seq_printf(m, "\n %-35s",2245 "============[Fw mechanism]============");2246 2247 ps_tdma_case = coex_dm->cur_ps_tdma;2248 seq_printf(m, "\n %-35s = %5ph case-%d (auto:%d)",2249 "PS TDMA",2250 coex_dm->ps_tdma_para,2251 ps_tdma_case,2252 coex_dm->auto_tdma_adjust);2253 2254 seq_printf(m, "\n %-35s = 0x%x ",2255 "Latest error condition(should be 0)",2256 coex_dm->error_condition);2257 2258 seq_printf(m, "\n %-35s = %d ", "IgnWlanAct",2259 coex_dm->cur_ignore_wlan_act);2260 }2261 2262 /* Hw setting */2263 seq_printf(m, "\n %-35s", "============[Hw setting]============");2264 2265 seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",2266 "backup ARFR1/ARFR2/RL/AMaxTime",2267 coex_dm->backup_arfr_cnt1,2268 coex_dm->backup_arfr_cnt2,2269 coex_dm->backup_retry_limit,2270 coex_dm->backup_ampdu_max_time);2271 2272 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);2273 u4_tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);2274 u2_tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);2275 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);2276 seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",2277 "0x430/0x434/0x42a/0x456",2278 u4_tmp[0], u4_tmp[1], u2_tmp[0], u1_tmp[0]);2279 2280 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);2281 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc58);2282 seq_printf(m, "\n %-35s = 0x%x/ 0x%x", "0x778/ 0xc58[29:25]",2283 u1_tmp[0], (u4_tmp[0] & 0x3e000000) >> 25);2284 2285 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x8db);2286 seq_printf(m, "\n %-35s = 0x%x", "0x8db[6:5]",2287 ((u1_tmp[0] & 0x60) >> 5));2288 2289 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x975);2290 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xcb4);2291 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",2292 "0xcb4[29:28]/0xcb4[7:0]/0x974[9:8]",2293 (u4_tmp[0] & 0x30000000) >> 28,2294 u4_tmp[0] & 0xff,2295 u1_tmp[0] & 0x3);2296 2297 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40);2298 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);2299 u1_tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x64);2300 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",2301 "0x40/0x4c[24:23]/0x64[0]",2302 u1_tmp[0], ((u4_tmp[0] & 0x01800000) >> 23),2303 u1_tmp[1] & 0x1);2304 2305 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);2306 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);2307 seq_printf(m, "\n %-35s = 0x%x/ 0x%x", "0x550(bcn ctrl)/0x522",2308 u4_tmp[0], u1_tmp[0]);2309 2310 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);2311 seq_printf(m, "\n %-35s = 0x%x", "0xc50(dig)",2312 u4_tmp[0] & 0xff);2313 2314 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xf48);2315 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5d);2316 u1_tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);2317 seq_printf(m, "\n %-35s = 0x%x/ 0x%x", "OFDM-FA/ CCK-FA",2318 u4_tmp[0], (u1_tmp[0] << 8) + u1_tmp[1]);2319 2320 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);2321 u4_tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);2322 u4_tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);2323 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);2324 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",2325 "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)",2326 u4_tmp[0], u4_tmp[1], u4_tmp[2], u1_tmp[0]);2327 2328 seq_printf(m, "\n %-35s = %d/ %d", "0x770(high-pri rx/tx)",2329 coex_sta->high_priority_rx, coex_sta->high_priority_tx);2330 seq_printf(m, "\n %-35s = %d/ %d", "0x774(low-pri rx/tx)",2331 coex_sta->low_priority_rx, coex_sta->low_priority_tx);2332 if (btcoexist->auto_report_1ant)2333 btc8821a1ant_monitor_bt_ctr(btcoexist);2334 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);2335}2336 2337void ex_btc8821a1ant_ips_notify(struct btc_coexist *btcoexist, u8 type)2338{2339 struct rtl_priv *rtlpriv = btcoexist->adapter;2340 bool wifi_under_5g = false;2341 2342 if (btcoexist->manual_control || btcoexist->stop_coex_dm)2343 return;2344 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);2345 if (wifi_under_5g) {2346 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2347 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");2348 btc8821a1ant_coex_under_5g(btcoexist);2349 return;2350 }2351 2352 if (BTC_IPS_ENTER == type) {2353 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2354 "[BTCoex], IPS ENTER notify\n");2355 coex_sta->under_ips = true;2356 btc8821a1ant_set_ant_path(btcoexist,2357 BTC_ANT_PATH_BT, false, true);2358 /* set PTA control */2359 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);2360 btc8821a1ant_coex_table_with_type(btcoexist,2361 NORMAL_EXEC, 0);2362 } else if (BTC_IPS_LEAVE == type) {2363 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2364 "[BTCoex], IPS LEAVE notify\n");2365 coex_sta->under_ips = false;2366 2367 btc8821a1ant_init_hw_config(btcoexist, false, false);2368 btc8821a1ant_init_coex_dm(btcoexist);2369 btc8821a1ant_query_bt_info(btcoexist);2370 }2371}2372 2373void ex_btc8821a1ant_lps_notify(struct btc_coexist *btcoexist, u8 type)2374{2375 struct rtl_priv *rtlpriv = btcoexist->adapter;2376 2377 if (btcoexist->manual_control || btcoexist->stop_coex_dm)2378 return;2379 2380 if (BTC_LPS_ENABLE == type) {2381 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2382 "[BTCoex], LPS ENABLE notify\n");2383 coex_sta->under_lps = true;2384 } else if (BTC_LPS_DISABLE == type) {2385 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2386 "[BTCoex], LPS DISABLE notify\n");2387 coex_sta->under_lps = false;2388 }2389}2390 2391void ex_btc8821a1ant_scan_notify(struct btc_coexist *btcoexist, u8 type)2392{2393 struct rtl_priv *rtlpriv = btcoexist->adapter;2394 bool wifi_connected = false, bt_hs_on = false;2395 bool bt_ctrl_agg_buf_size = false;2396 bool wifi_under_5g = false;2397 u32 wifi_link_status = 0;2398 u32 num_of_wifi_link = 0;2399 u8 agg_buf_size = 5;2400 2401 if (btcoexist->manual_control || btcoexist->stop_coex_dm)2402 return;2403 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);2404 if (wifi_under_5g) {2405 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2406 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");2407 btc8821a1ant_coex_under_5g(btcoexist);2408 return;2409 }2410 2411 if (type == BTC_SCAN_START) {2412 coex_sta->wifi_is_high_pri_task = true;2413 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2414 "[BTCoex], SCAN START notify\n");2415 2416 /* Force antenna setup for no scan result issue */2417 btc8821a1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);2418 } else {2419 coex_sta->wifi_is_high_pri_task = false;2420 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2421 "[BTCoex], SCAN FINISH notify\n");2422 }2423 2424 if (coex_sta->bt_disabled)2425 return;2426 2427 btcoexist->btc_get(btcoexist,2428 BTC_GET_BL_HS_OPERATION, &bt_hs_on);2429 btcoexist->btc_get(btcoexist,2430 BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);2431 2432 btc8821a1ant_query_bt_info(btcoexist);2433 2434 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,2435 &wifi_link_status);2436 num_of_wifi_link = wifi_link_status >> 16;2437 if (num_of_wifi_link >= 2) {2438 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);2439 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,2440 bt_ctrl_agg_buf_size, agg_buf_size);2441 btc8821a1ant_action_wifi_multi_port(btcoexist);2442 return;2443 }2444 2445 if (coex_sta->c2h_bt_inquiry_page) {2446 btc8821a1ant_action_bt_inquiry(btcoexist);2447 return;2448 } else if (bt_hs_on) {2449 btc8821a1ant_action_hs(btcoexist);2450 return;2451 }2452 2453 if (BTC_SCAN_START == type) {2454 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2455 "[BTCoex], SCAN START notify\n");2456 if (!wifi_connected) {2457 /* non-connected scan */2458 btc8821a1ant_act_wifi_not_conn_scan(btcoexist);2459 } else {2460 /* wifi is connected */2461 btc8821a1ant_action_wifi_connected_scan(btcoexist);2462 }2463 } else if (BTC_SCAN_FINISH == type) {2464 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2465 "[BTCoex], SCAN FINISH notify\n");2466 if (!wifi_connected) {2467 /* non-connected scan */2468 btc8821a1ant_action_wifi_not_connected(btcoexist);2469 } else {2470 btc8821a1ant_action_wifi_connected(btcoexist);2471 }2472 }2473}2474 2475void ex_btc8821a1ant_connect_notify(struct btc_coexist *btcoexist, u8 type)2476{2477 struct rtl_priv *rtlpriv = btcoexist->adapter;2478 bool wifi_connected = false, bt_hs_on = false;2479 u32 wifi_link_status = 0;2480 u32 num_of_wifi_link = 0;2481 bool bt_ctrl_agg_buf_size = false;2482 bool wifi_under_5g = false;2483 u8 agg_buf_size = 5;2484 2485 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||2486 coex_sta->bt_disabled)2487 return;2488 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);2489 if (wifi_under_5g) {2490 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2491 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");2492 btc8821a1ant_coex_under_5g(btcoexist);2493 return;2494 }2495 2496 if (type == BTC_ASSOCIATE_START) {2497 coex_sta->wifi_is_high_pri_task = true;2498 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2499 "[BTCoex], CONNECT START notify\n");2500 coex_dm->arp_cnt = 0;2501 } else {2502 coex_sta->wifi_is_high_pri_task = false;2503 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2504 "[BTCoex], CONNECT FINISH notify\n");2505 coex_dm->arp_cnt = 0;2506 }2507 2508 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,2509 &wifi_link_status);2510 num_of_wifi_link = wifi_link_status >> 16;2511 if (num_of_wifi_link >= 2) {2512 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);2513 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,2514 bt_ctrl_agg_buf_size, agg_buf_size);2515 btc8821a1ant_action_wifi_multi_port(btcoexist);2516 return;2517 }2518 2519 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);2520 if (coex_sta->c2h_bt_inquiry_page) {2521 btc8821a1ant_action_bt_inquiry(btcoexist);2522 return;2523 } else if (bt_hs_on) {2524 btc8821a1ant_action_hs(btcoexist);2525 return;2526 }2527 2528 if (BTC_ASSOCIATE_START == type) {2529 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2530 "[BTCoex], CONNECT START notify\n");2531 btc8821a1ant_act_wifi_not_conn_scan(btcoexist);2532 } else if (BTC_ASSOCIATE_FINISH == type) {2533 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2534 "[BTCoex], CONNECT FINISH notify\n");2535 2536 btcoexist->btc_get(btcoexist,2537 BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);2538 if (!wifi_connected) {2539 /* non-connected scan */2540 btc8821a1ant_action_wifi_not_connected(btcoexist);2541 } else {2542 btc8821a1ant_action_wifi_connected(btcoexist);2543 }2544 }2545}2546 2547void ex_btc8821a1ant_media_status_notify(struct btc_coexist *btcoexist,2548 u8 type)2549{2550 struct rtl_priv *rtlpriv = btcoexist->adapter;2551 u8 h2c_parameter[3] = {0};2552 u32 wifi_bw;2553 u8 wifi_central_chnl;2554 bool wifi_under_5g = false;2555 2556 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||2557 coex_sta->bt_disabled)2558 return;2559 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);2560 if (wifi_under_5g) {2561 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2562 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");2563 btc8821a1ant_coex_under_5g(btcoexist);2564 return;2565 }2566 2567 if (BTC_MEDIA_CONNECT == type) {2568 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2569 "[BTCoex], MEDIA connect notify\n");2570 } else {2571 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2572 "[BTCoex], MEDIA disconnect notify\n");2573 coex_dm->arp_cnt = 0;2574 }2575 2576 /* only 2.4G we need to inform bt the chnl mask */2577 btcoexist->btc_get(btcoexist,2578 BTC_GET_U1_WIFI_CENTRAL_CHNL,2579 &wifi_central_chnl);2580 if ((type == BTC_MEDIA_CONNECT) &&2581 (wifi_central_chnl <= 14)) {2582 h2c_parameter[0] = 0x0;2583 h2c_parameter[1] = wifi_central_chnl;2584 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);2585 if (wifi_bw == BTC_WIFI_BW_HT40)2586 h2c_parameter[2] = 0x30;2587 else2588 h2c_parameter[2] = 0x20;2589 }2590 2591 coex_dm->wifi_chnl_info[0] = h2c_parameter[0];2592 coex_dm->wifi_chnl_info[1] = h2c_parameter[1];2593 coex_dm->wifi_chnl_info[2] = h2c_parameter[2];2594 2595 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2596 "[BTCoex], FW write 0x66 = 0x%x\n",2597 h2c_parameter[0] << 16 |2598 h2c_parameter[1] << 8 |2599 h2c_parameter[2]);2600 2601 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);2602}2603 2604void ex_btc8821a1ant_special_packet_notify(struct btc_coexist *btcoexist,2605 u8 type)2606{2607 struct rtl_priv *rtlpriv = btcoexist->adapter;2608 bool bt_hs_on = false;2609 bool bt_ctrl_agg_buf_size = false;2610 bool wifi_under_5g = false;2611 u32 wifi_link_status = 0;2612 u32 num_of_wifi_link = 0;2613 u8 agg_buf_size = 5;2614 2615 if (btcoexist->manual_control || btcoexist->stop_coex_dm ||2616 coex_sta->bt_disabled)2617 return;2618 2619 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);2620 if (wifi_under_5g) {2621 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2622 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");2623 btc8821a1ant_coex_under_5g(btcoexist);2624 return;2625 }2626 2627 if (type == BTC_PACKET_DHCP || type == BTC_PACKET_EAPOL ||2628 type == BTC_PACKET_ARP) {2629 coex_sta->wifi_is_high_pri_task = true;2630 2631 if (type == BTC_PACKET_ARP) {2632 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2633 "[BTCoex], specific Packet ARP notify\n");2634 } else {2635 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2636 "[BTCoex], specific Packet DHCP or EAPOL notify\n");2637 }2638 } else {2639 coex_sta->wifi_is_high_pri_task = false;2640 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2641 "[BTCoex], specific Packet [Type = %d] notify\n",2642 type);2643 }2644 2645 coex_sta->special_pkt_period_cnt = 0;2646 2647 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,2648 &wifi_link_status);2649 num_of_wifi_link = wifi_link_status >> 16;2650 if (num_of_wifi_link >= 2) {2651 btc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);2652 btc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,2653 bt_ctrl_agg_buf_size, agg_buf_size);2654 btc8821a1ant_action_wifi_multi_port(btcoexist);2655 return;2656 }2657 2658 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);2659 if (coex_sta->c2h_bt_inquiry_page) {2660 btc8821a1ant_action_bt_inquiry(btcoexist);2661 return;2662 } else if (bt_hs_on) {2663 btc8821a1ant_action_hs(btcoexist);2664 return;2665 }2666 2667 if (type == BTC_PACKET_DHCP || type == BTC_PACKET_EAPOL ||2668 type == BTC_PACKET_ARP) {2669 if (type == BTC_PACKET_ARP) {2670 coex_dm->arp_cnt++;2671 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2672 "[BTCoex], ARP Packet Count = %d\n",2673 coex_dm->arp_cnt);2674 if (coex_dm->arp_cnt >= 10)2675 /* if APR PKT > 10 after connect, do not go to2676 * btc8821a1ant_act_wifi_conn_sp_pkt2677 */2678 return;2679 }2680 2681 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2682 "[BTCoex], special Packet(%d) notify\n", type);2683 btc8821a1ant_act_wifi_conn_sp_pkt(btcoexist);2684 }2685}2686 2687void ex_btc8821a1ant_bt_info_notify(struct btc_coexist *btcoexist,2688 u8 *tmp_buf, u8 length)2689{2690 struct rtl_priv *rtlpriv = btcoexist->adapter;2691 u8 i;2692 u8 bt_info = 0;2693 u8 rsp_source = 0;2694 bool wifi_connected = false;2695 bool bt_busy = false;2696 bool wifi_under_5g = false;2697 2698 coex_sta->c2h_bt_info_req_sent = false;2699 2700 btcoexist->btc_get(btcoexist,2701 BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);2702 2703 rsp_source = tmp_buf[0] & 0xf;2704 if (rsp_source >= BT_INFO_SRC_8821A_1ANT_MAX)2705 rsp_source = BT_INFO_SRC_8821A_1ANT_WIFI_FW;2706 coex_sta->bt_info_c2h_cnt[rsp_source]++;2707 2708 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2709 "[BTCoex], Bt info[%d], length = %d, hex data = [",2710 rsp_source, length);2711 for (i = 0; i < length; i++) {2712 coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];2713 if (i == 1)2714 bt_info = tmp_buf[i];2715 if (i == length - 1) {2716 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2717 "0x%02x]\n", tmp_buf[i]);2718 } else {2719 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2720 "0x%02x, ", tmp_buf[i]);2721 }2722 }2723 2724 if (BT_INFO_SRC_8821A_1ANT_WIFI_FW != rsp_source) {2725 /* [3:0] */2726 coex_sta->bt_retry_cnt =2727 coex_sta->bt_info_c2h[rsp_source][2] & 0xf;2728 2729 coex_sta->bt_rssi =2730 coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;2731 2732 coex_sta->bt_info_ext = coex_sta->bt_info_c2h[rsp_source][4];2733 2734 coex_sta->bt_tx_rx_mask =2735 (coex_sta->bt_info_c2h[rsp_source][2] & 0x40);2736 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK,2737 &coex_sta->bt_tx_rx_mask);2738 if (!coex_sta->bt_tx_rx_mask) {2739 /* BT into is responded by BT FW and BT RF REG 0x3C !=2740 * 0x15 => Need to switch BT TRx Mask2741 */2742 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2743 "[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n");2744 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,2745 0x3c, 0x15);2746 }2747 2748 /* Here we need to resend some wifi info to BT2749 * because bt is reset and lost the info2750 */2751 if (coex_sta->bt_info_ext & BIT1) {2752 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2753 "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");2754 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,2755 &wifi_connected);2756 if (wifi_connected) {2757 ex_btc8821a1ant_media_status_notify(btcoexist,2758 BTC_MEDIA_CONNECT);2759 } else {2760 ex_btc8821a1ant_media_status_notify(btcoexist,2761 BTC_MEDIA_DISCONNECT);2762 }2763 }2764 2765 if ((coex_sta->bt_info_ext & BIT3) && !wifi_under_5g) {2766 if (!btcoexist->manual_control &&2767 !btcoexist->stop_coex_dm) {2768 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2769 "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");2770 btc8821a1ant_ignore_wlan_act(btcoexist,2771 FORCE_EXEC,2772 false);2773 }2774 }2775 }2776 2777 /* check BIT2 first ==> check if bt is under inquiry or page scan */2778 if (bt_info & BT_INFO_8821A_1ANT_B_INQ_PAGE)2779 coex_sta->c2h_bt_inquiry_page = true;2780 else2781 coex_sta->c2h_bt_inquiry_page = false;2782 2783 /* set link exist status */2784 if (!(bt_info & BT_INFO_8821A_1ANT_B_CONNECTION)) {2785 coex_sta->bt_link_exist = false;2786 coex_sta->pan_exist = false;2787 coex_sta->a2dp_exist = false;2788 coex_sta->hid_exist = false;2789 coex_sta->sco_exist = false;2790 } else {2791 /* connection exists */2792 coex_sta->bt_link_exist = true;2793 if (bt_info & BT_INFO_8821A_1ANT_B_FTP)2794 coex_sta->pan_exist = true;2795 else2796 coex_sta->pan_exist = false;2797 if (bt_info & BT_INFO_8821A_1ANT_B_A2DP)2798 coex_sta->a2dp_exist = true;2799 else2800 coex_sta->a2dp_exist = false;2801 if (bt_info & BT_INFO_8821A_1ANT_B_HID)2802 coex_sta->hid_exist = true;2803 else2804 coex_sta->hid_exist = false;2805 if (bt_info & BT_INFO_8821A_1ANT_B_SCO_ESCO)2806 coex_sta->sco_exist = true;2807 else2808 coex_sta->sco_exist = false;2809 }2810 2811 btc8821a1ant_update_bt_link_info(btcoexist);2812 2813 /* mask profile bit for connect-ilde identification2814 * (for CSR case: A2DP idle --> 0x41)2815 */2816 bt_info = bt_info & 0x1f;2817 2818 if (!(bt_info & BT_INFO_8821A_1ANT_B_CONNECTION)) {2819 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE;2820 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2821 "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");2822 } else if (bt_info == BT_INFO_8821A_1ANT_B_CONNECTION) {2823 /* connection exists but no busy */2824 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE;2825 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2826 "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");2827 } else if ((bt_info&BT_INFO_8821A_1ANT_B_SCO_ESCO) ||2828 (bt_info & BT_INFO_8821A_1ANT_B_SCO_BUSY)) {2829 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_SCO_BUSY;2830 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2831 "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");2832 } else if (bt_info & BT_INFO_8821A_1ANT_B_ACL_BUSY) {2833 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)2834 coex_dm->auto_tdma_adjust = false;2835 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_ACL_BUSY;2836 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2837 "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");2838 } else {2839 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_MAX;2840 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2841 "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");2842 }2843 2844 if ((BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||2845 (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||2846 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))2847 bt_busy = true;2848 else2849 bt_busy = false;2850 btcoexist->btc_set(btcoexist,2851 BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);2852 2853 btc8821a1ant_run_coexist_mechanism(btcoexist);2854}2855 2856void ex_btc8821a1ant_halt_notify(struct btc_coexist *btcoexist)2857{2858 struct rtl_priv *rtlpriv = btcoexist->adapter;2859 bool wifi_under_5g = false;2860 2861 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2862 "[BTCoex], Halt notify\n");2863 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);2864 if (wifi_under_5g) {2865 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2866 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");2867 btc8821a1ant_coex_under_5g(btcoexist);2868 return;2869 }2870 2871 2872 btcoexist->stop_coex_dm = true;2873 2874 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, true);2875 btc8821a1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);2876 2877 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);2878 btc8821a1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);2879 2880 ex_btc8821a1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);2881}2882 2883void ex_btc8821a1ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)2884{2885 struct rtl_priv *rtlpriv = btcoexist->adapter;2886 bool wifi_under_5g = false;2887 2888 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);2889 if (wifi_under_5g) {2890 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2891 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");2892 btc8821a1ant_coex_under_5g(btcoexist);2893 return;2894 }2895 2896 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2897 "[BTCoex], Pnp notify\n");2898 2899 if (BTC_WIFI_PNP_SLEEP == pnp_state) {2900 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2901 "[BTCoex], Pnp notify to SLEEP\n");2902 /* BT should clear UnderIPS/UnderLPS state to avoid mismatch2903 * state after wakeup.2904 */2905 coex_sta->under_ips = false;2906 coex_sta->under_lps = false;2907 btcoexist->stop_coex_dm = true;2908 btc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,2909 0x0, 0x0);2910 btc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);2911 btc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);2912 btc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false,2913 true);2914 } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {2915 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2916 "[BTCoex], Pnp notify to WAKE UP\n");2917 btcoexist->stop_coex_dm = false;2918 btc8821a1ant_init_hw_config(btcoexist, false, false);2919 btc8821a1ant_init_coex_dm(btcoexist);2920 btc8821a1ant_query_bt_info(btcoexist);2921 }2922}2923 2924void ex_btc8821a1ant_periodical(struct btc_coexist *btcoexist)2925{2926 struct rtl_priv *rtlpriv = btcoexist->adapter;2927 static u8 dis_ver_info_cnt;2928 u32 fw_ver = 0, bt_patch_ver = 0;2929 struct btc_board_info *board_info = &btcoexist->board_info;2930 struct btc_stack_info *stack_info = &btcoexist->stack_info;2931 2932 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2933 "[BTCoex], ==========================Periodical===========================\n");2934 2935 if (dis_ver_info_cnt <= 5) {2936 dis_ver_info_cnt += 1;2937 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2938 "[BTCoex], ****************************************************************\n");2939 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2940 "[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n",2941 board_info->pg_ant_num,2942 board_info->btdm_ant_num,2943 board_info->btdm_ant_pos);2944 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2945 "[BTCoex], BT stack/ hci ext ver = %s / %d\n",2946 stack_info->profile_notified ? "Yes" : "No",2947 stack_info->hci_version);2948 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,2949 &bt_patch_ver);2950 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);2951 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2952 "[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n",2953 glcoex_ver_date_8821a_1ant,2954 glcoex_ver_8821a_1ant,2955 fw_ver, bt_patch_ver,2956 bt_patch_ver);2957 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2958 "[BTCoex], ****************************************************************\n");2959 }2960 2961 if (!btcoexist->auto_report_1ant) {2962 btc8821a1ant_query_bt_info(btcoexist);2963 btc8821a1ant_monitor_bt_ctr(btcoexist);2964 } else {2965 coex_sta->special_pkt_period_cnt++;2966 }2967}2968