4206 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/08/22 Cosa first check in.11 * 2012/11/14 Cosa Revise for 8821A 2Ant out sourcing.12 *13 ************************************************************/14 15/************************************************************16 * include files17 ************************************************************/18#include "halbt_precomp.h"19/************************************************************20 * Global variables, these are static variables21 ************************************************************/22static struct coex_dm_8821a_2ant glcoex_dm_8821a_2ant;23static struct coex_dm_8821a_2ant *coex_dm = &glcoex_dm_8821a_2ant;24static struct coex_sta_8821a_2ant glcoex_sta_8821a_2ant;25static struct coex_sta_8821a_2ant *coex_sta = &glcoex_sta_8821a_2ant;26 27static const char *const glbt_info_src_8821a_2ant[] = {28 "BT Info[wifi fw]",29 "BT Info[bt rsp]",30 "BT Info[bt auto report]",31};32 33static u32 glcoex_ver_date_8821a_2ant = 20130618;34static u32 glcoex_ver_8821a_2ant = 0x5050;35 36/************************************************************37 * local function proto type if needed38 *39 * local function start with btc8821a2ant_40 ************************************************************/41static u8 btc8821a2ant_bt_rssi_state(struct btc_coexist *btcoexist,42 u8 level_num, u8 rssi_thresh,43 u8 rssi_thresh1)44{45 struct rtl_priv *rtlpriv = btcoexist->adapter;46 long bt_rssi = 0;47 u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;48 49 bt_rssi = coex_sta->bt_rssi;50 51 if (level_num == 2) {52 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||53 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {54 if (bt_rssi >=55 rssi_thresh + BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT) {56 bt_rssi_state = BTC_RSSI_STATE_HIGH;57 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,58 "[BTCoex], BT Rssi state switch to High\n");59 } else {60 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;61 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,62 "[BTCoex], BT Rssi state stay at Low\n");63 }64 } else {65 if (bt_rssi < rssi_thresh) {66 bt_rssi_state = BTC_RSSI_STATE_LOW;67 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,68 "[BTCoex], BT Rssi state switch to Low\n");69 } else {70 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;71 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,72 "[BTCoex], BT Rssi state stay at High\n");73 }74 }75 } else if (level_num == 3) {76 if (rssi_thresh > rssi_thresh1) {77 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,78 "[BTCoex], BT Rssi thresh error!!\n");79 return coex_sta->pre_bt_rssi_state;80 }81 82 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||83 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {84 if (bt_rssi >=85 (rssi_thresh +86 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {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 >=100 (rssi_thresh1 +101 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {102 bt_rssi_state = BTC_RSSI_STATE_HIGH;103 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,104 "[BTCoex], BT Rssi state switch to High\n");105 } else if (bt_rssi < rssi_thresh) {106 bt_rssi_state = BTC_RSSI_STATE_LOW;107 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,108 "[BTCoex], BT Rssi state switch to Low\n");109 } else {110 bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;111 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,112 "[BTCoex], BT Rssi state stay at Medium\n");113 }114 } else {115 if (bt_rssi < rssi_thresh1) {116 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;117 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,118 "[BTCoex], BT Rssi state switch to Medium\n");119 } else {120 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;121 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,122 "[BTCoex], BT Rssi state stay at High\n");123 }124 }125 }126 127 coex_sta->pre_bt_rssi_state = bt_rssi_state;128 129 return bt_rssi_state;130}131 132static u8 btc8821a2ant_wifi_rssi_state(struct btc_coexist *btcoexist,133 u8 index, u8 level_num,134 u8 rssi_thresh, u8 rssi_thresh1)135{136 struct rtl_priv *rtlpriv = btcoexist->adapter;137 long wifi_rssi = 0;138 u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];139 140 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);141 142 if (level_num == 2) {143 if ((coex_sta->pre_wifi_rssi_state[index] ==144 BTC_RSSI_STATE_LOW) ||145 (coex_sta->pre_wifi_rssi_state[index] ==146 BTC_RSSI_STATE_STAY_LOW)) {147 if (wifi_rssi >=148 (rssi_thresh+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {149 wifi_rssi_state = BTC_RSSI_STATE_HIGH;150 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,151 "[BTCoex], wifi RSSI state switch to High\n");152 } else {153 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;154 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,155 "[BTCoex], wifi RSSI state stay at Low\n");156 }157 } else {158 if (wifi_rssi < rssi_thresh) {159 wifi_rssi_state = BTC_RSSI_STATE_LOW;160 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,161 "[BTCoex], wifi RSSI state switch to Low\n");162 } else {163 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;164 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,165 "[BTCoex], wifi RSSI state stay at High\n");166 }167 }168 } else if (level_num == 3) {169 if (rssi_thresh > rssi_thresh1) {170 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,171 "[BTCoex], wifi RSSI thresh error!!\n");172 return coex_sta->pre_wifi_rssi_state[index];173 }174 175 if ((coex_sta->pre_wifi_rssi_state[index] ==176 BTC_RSSI_STATE_LOW) ||177 (coex_sta->pre_wifi_rssi_state[index] ==178 BTC_RSSI_STATE_STAY_LOW)) {179 if (wifi_rssi >=180 (rssi_thresh +181 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {182 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;183 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,184 "[BTCoex], wifi RSSI state switch to Medium\n");185 } else {186 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;187 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,188 "[BTCoex], wifi RSSI state stay at Low\n");189 }190 } else if ((coex_sta->pre_wifi_rssi_state[index] ==191 BTC_RSSI_STATE_MEDIUM) ||192 (coex_sta->pre_wifi_rssi_state[index] ==193 BTC_RSSI_STATE_STAY_MEDIUM)) {194 if (wifi_rssi >= (rssi_thresh1 +195 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {196 wifi_rssi_state = BTC_RSSI_STATE_HIGH;197 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,198 "[BTCoex], wifi RSSI state switch to High\n");199 } else if (wifi_rssi < rssi_thresh) {200 wifi_rssi_state = BTC_RSSI_STATE_LOW;201 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,202 "[BTCoex], wifi RSSI state switch to Low\n");203 } else {204 wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;205 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,206 "[BTCoex], wifi RSSI state stay at Medium\n");207 }208 } else {209 if (wifi_rssi < rssi_thresh1) {210 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;211 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,212 "[BTCoex], wifi RSSI state switch to Medium\n");213 } else {214 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;215 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,216 "[BTCoex], wifi RSSI state stay at High\n");217 }218 }219 }220 coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;221 222 return wifi_rssi_state;223}224 225static226void btc8821a2ant_limited_rx(struct btc_coexist *btcoexist, bool force_exec,227 bool rej_ap_agg_pkt, bool bt_ctrl_agg_buf_size,228 u8 agg_buf_size)229{230 bool reject_rx_agg = rej_ap_agg_pkt;231 bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;232 u8 rx_agg_size = agg_buf_size;233 234 /* Rx Aggregation related setting */235 btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,236 &reject_rx_agg);237 /* decide BT control aggregation buf size or not */238 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,239 &bt_ctrl_rx_agg_size);240 /* aggregation buf size, works when BT control Rx aggregation size */241 btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);242 /* real update aggregation setting */243 btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);244}245 246static void btc8821a2ant_monitor_bt_ctr(struct btc_coexist *btcoexist)247{248 struct rtl_priv *rtlpriv = btcoexist->adapter;249 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;250 u32 reg_hp_txrx, reg_lp_txrx, u4tmp;251 u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;252 253 reg_hp_txrx = 0x770;254 reg_lp_txrx = 0x774;255 256 u4tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);257 reg_hp_tx = u4tmp & MASKLWORD;258 reg_hp_rx = (u4tmp & MASKHWORD) >> 16;259 260 u4tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);261 reg_lp_tx = u4tmp & MASKLWORD;262 reg_lp_rx = (u4tmp & MASKHWORD) >> 16;263 264 coex_sta->high_priority_tx = reg_hp_tx;265 coex_sta->high_priority_rx = reg_hp_rx;266 coex_sta->low_priority_tx = reg_lp_tx;267 coex_sta->low_priority_rx = reg_lp_rx;268 269 if ((coex_sta->low_priority_rx >= 950) &&270 (coex_sta->low_priority_rx >= coex_sta->low_priority_tx) &&271 (!coex_sta->under_ips))272 bt_link_info->slave_role = true;273 else274 bt_link_info->slave_role = false;275 276 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,277 "[BTCoex], High Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",278 reg_hp_txrx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);279 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,280 "[BTCoex], Low Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",281 reg_lp_txrx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx);282 283 /* reset counter */284 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);285}286 287static void btc8821a2ant_monitor_wifi_ctr(struct btc_coexist *btcoexist)288{289 if (coex_sta->under_ips) {290 coex_sta->crc_ok_cck = 0;291 coex_sta->crc_ok_11g = 0;292 coex_sta->crc_ok_11n = 0;293 coex_sta->crc_ok_11n_agg = 0;294 295 coex_sta->crc_err_cck = 0;296 coex_sta->crc_err_11g = 0;297 coex_sta->crc_err_11n = 0;298 coex_sta->crc_err_11n_agg = 0;299 } else {300 coex_sta->crc_ok_cck =301 btcoexist->btc_read_4byte(btcoexist, 0xf88);302 coex_sta->crc_ok_11g =303 btcoexist->btc_read_2byte(btcoexist, 0xf94);304 coex_sta->crc_ok_11n =305 btcoexist->btc_read_2byte(btcoexist, 0xf90);306 coex_sta->crc_ok_11n_agg =307 btcoexist->btc_read_2byte(btcoexist, 0xfb8);308 309 coex_sta->crc_err_cck =310 btcoexist->btc_read_4byte(btcoexist, 0xf84);311 coex_sta->crc_err_11g =312 btcoexist->btc_read_2byte(btcoexist, 0xf96);313 coex_sta->crc_err_11n =314 btcoexist->btc_read_2byte(btcoexist, 0xf92);315 coex_sta->crc_err_11n_agg =316 btcoexist->btc_read_2byte(btcoexist, 0xfba);317 }318 319 /* reset counter */320 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x1);321 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x0);322}323 324static void btc8821a2ant_query_bt_info(struct btc_coexist *btcoexist)325{326 struct rtl_priv *rtlpriv = btcoexist->adapter;327 u8 h2c_parameter[1] = {0};328 329 coex_sta->c2h_bt_info_req_sent = true;330 331 h2c_parameter[0] |= BIT0; /* trigger */332 333 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,334 "[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n",335 h2c_parameter[0]);336 337 btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);338}339 340static bool btc8821a2ant_is_wifi_status_changed(struct btc_coexist *btcoexist)341{342 static bool pre_wifi_busy = true;343 static bool pre_under_4way = true;344 static bool pre_bt_hs_on = true;345 bool wifi_busy = false, under_4way = false, bt_hs_on = false;346 bool wifi_connected = false;347 u8 wifi_rssi_state = BTC_RSSI_STATE_HIGH;348 349 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,350 &wifi_connected);351 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);352 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);353 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,354 &under_4way);355 356 if (wifi_connected) {357 if (wifi_busy != pre_wifi_busy) {358 pre_wifi_busy = wifi_busy;359 return true;360 }361 if (under_4way != pre_under_4way) {362 pre_under_4way = under_4way;363 return true;364 }365 if (bt_hs_on != pre_bt_hs_on) {366 pre_bt_hs_on = bt_hs_on;367 return true;368 }369 370 wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 3, 2,371 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);372 373 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||374 (wifi_rssi_state == BTC_RSSI_STATE_LOW))375 return true;376 }377 378 return false;379}380 381static void btc8821a2ant_update_bt_link_info(struct btc_coexist *btcoexist)382{383 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;384 bool bt_hs_on = false;385 386 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);387 388 bt_link_info->bt_link_exist = coex_sta->bt_link_exist;389 bt_link_info->sco_exist = coex_sta->sco_exist;390 bt_link_info->a2dp_exist = coex_sta->a2dp_exist;391 bt_link_info->pan_exist = coex_sta->pan_exist;392 bt_link_info->hid_exist = coex_sta->hid_exist;393 394 /* work around for HS mode. */395 if (bt_hs_on) {396 bt_link_info->pan_exist = true;397 bt_link_info->bt_link_exist = true;398 }399 400 /* check if Sco only */401 if (bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&402 !bt_link_info->pan_exist && !bt_link_info->hid_exist)403 bt_link_info->sco_only = true;404 else405 bt_link_info->sco_only = false;406 407 /* check if A2dp only */408 if (!bt_link_info->sco_exist && bt_link_info->a2dp_exist &&409 !bt_link_info->pan_exist && !bt_link_info->hid_exist)410 bt_link_info->a2dp_only = true;411 else412 bt_link_info->a2dp_only = false;413 414 /* check if Pan only */415 if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&416 bt_link_info->pan_exist && !bt_link_info->hid_exist)417 bt_link_info->pan_only = true;418 else419 bt_link_info->pan_only = false;420 421 /* check if Hid only */422 if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&423 !bt_link_info->pan_exist && bt_link_info->hid_exist)424 bt_link_info->hid_only = true;425 else426 bt_link_info->hid_only = false;427}428 429static u8 btc8821a2ant_action_algorithm(struct btc_coexist *btcoexist)430{431 struct rtl_priv *rtlpriv = btcoexist->adapter;432 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;433 bool bt_hs_on = false;434 u8 algorithm = BT_8821A_2ANT_COEX_ALGO_UNDEFINED;435 u8 num_of_diff_profile = 0;436 437 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);438 439 if (!bt_link_info->bt_link_exist) {440 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,441 "[BTCoex], No BT link exists!!!\n");442 return algorithm;443 }444 445 if (bt_link_info->sco_exist)446 num_of_diff_profile++;447 if (bt_link_info->hid_exist)448 num_of_diff_profile++;449 if (bt_link_info->pan_exist)450 num_of_diff_profile++;451 if (bt_link_info->a2dp_exist)452 num_of_diff_profile++;453 454 if (num_of_diff_profile == 1) {455 if (bt_link_info->sco_exist) {456 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,457 "[BTCoex], SCO only\n");458 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;459 } else {460 if (bt_link_info->hid_exist) {461 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,462 "[BTCoex], HID only\n");463 algorithm = BT_8821A_2ANT_COEX_ALGO_HID;464 } else if (bt_link_info->a2dp_exist) {465 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,466 "[BTCoex], A2DP only\n");467 algorithm = BT_8821A_2ANT_COEX_ALGO_A2DP;468 } else if (bt_link_info->pan_exist) {469 if (bt_hs_on) {470 rtl_dbg(rtlpriv, COMP_BT_COEXIST,471 DBG_LOUD,472 "[BTCoex], PAN(HS) only\n");473 algorithm = BT_8821A_2ANT_COEX_ALGO_PANHS;474 } else {475 rtl_dbg(rtlpriv, COMP_BT_COEXIST,476 DBG_LOUD,477 "[BTCoex], PAN(EDR) only\n");478 algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR;479 }480 }481 }482 } else if (num_of_diff_profile == 2) {483 if (bt_link_info->sco_exist) {484 if (bt_link_info->hid_exist) {485 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,486 "[BTCoex], SCO + HID\n");487 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;488 } else if (bt_link_info->a2dp_exist) {489 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,490 "[BTCoex], SCO + A2DP ==> SCO\n");491 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;492 } else if (bt_link_info->pan_exist) {493 if (bt_hs_on) {494 rtl_dbg(rtlpriv, COMP_BT_COEXIST,495 DBG_LOUD,496 "[BTCoex], SCO + PAN(HS)\n");497 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;498 } else {499 rtl_dbg(rtlpriv, COMP_BT_COEXIST,500 DBG_LOUD,501 "[BTCoex], SCO + PAN(EDR)\n");502 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;503 }504 }505 } else {506 if (bt_link_info->hid_exist &&507 bt_link_info->a2dp_exist) {508 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,509 "[BTCoex], HID + A2DP\n");510 algorithm = BT_8821A_2ANT_COEX_ALGO_HID_A2DP;511 } else if (bt_link_info->hid_exist &&512 bt_link_info->pan_exist) {513 if (bt_hs_on) {514 rtl_dbg(rtlpriv, COMP_BT_COEXIST,515 DBG_LOUD,516 "[BTCoex], HID + PAN(HS)\n");517 algorithm = BT_8821A_2ANT_COEX_ALGO_HID;518 } else {519 rtl_dbg(rtlpriv, COMP_BT_COEXIST,520 DBG_LOUD,521 "[BTCoex], HID + PAN(EDR)\n");522 algorithm =523 BT_8821A_2ANT_COEX_ALGO_PANEDR_HID;524 }525 } else if (bt_link_info->pan_exist &&526 bt_link_info->a2dp_exist) {527 if (bt_hs_on) {528 rtl_dbg(rtlpriv, COMP_BT_COEXIST,529 DBG_LOUD,530 "[BTCoex], A2DP + PAN(HS)\n");531 algorithm =532 BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS;533 } else {534 rtl_dbg(rtlpriv, COMP_BT_COEXIST,535 DBG_LOUD,536 "[BTCoex], A2DP + PAN(EDR)\n");537 algorithm =538 BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP;539 }540 }541 }542 } else if (num_of_diff_profile == 3) {543 if (bt_link_info->sco_exist) {544 if (bt_link_info->hid_exist &&545 bt_link_info->a2dp_exist) {546 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,547 "[BTCoex], SCO + HID + A2DP ==> HID\n");548 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;549 } else if (bt_link_info->hid_exist &&550 bt_link_info->pan_exist) {551 if (bt_hs_on) {552 rtl_dbg(rtlpriv, COMP_BT_COEXIST,553 DBG_LOUD,554 "[BTCoex], SCO + HID + PAN(HS)\n");555 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;556 } else {557 rtl_dbg(rtlpriv, COMP_BT_COEXIST,558 DBG_LOUD,559 "[BTCoex], SCO + HID + PAN(EDR)\n");560 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;561 }562 } else if (bt_link_info->pan_exist &&563 bt_link_info->a2dp_exist) {564 if (bt_hs_on) {565 rtl_dbg(rtlpriv, COMP_BT_COEXIST,566 DBG_LOUD,567 "[BTCoex], SCO + A2DP + PAN(HS)\n");568 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;569 } else {570 rtl_dbg(rtlpriv, COMP_BT_COEXIST,571 DBG_LOUD,572 "[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n");573 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;574 }575 }576 } else {577 if (bt_link_info->hid_exist &&578 bt_link_info->pan_exist &&579 bt_link_info->a2dp_exist) {580 if (bt_hs_on) {581 rtl_dbg(rtlpriv, COMP_BT_COEXIST,582 DBG_LOUD,583 "[BTCoex], HID + A2DP + PAN(HS)\n");584 algorithm =585 BT_8821A_2ANT_COEX_ALGO_HID_A2DP;586 } else {587 rtl_dbg(rtlpriv, COMP_BT_COEXIST,588 DBG_LOUD,589 "[BTCoex], HID + A2DP + PAN(EDR)\n");590 algorithm =591 BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR;592 }593 }594 }595 } else if (num_of_diff_profile >= 3) {596 if (bt_link_info->sco_exist) {597 if (bt_link_info->hid_exist &&598 bt_link_info->pan_exist &&599 bt_link_info->a2dp_exist) {600 if (bt_hs_on) {601 rtl_dbg(rtlpriv, COMP_BT_COEXIST,602 DBG_LOUD,603 "[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n");604 605 } else {606 rtl_dbg(rtlpriv, COMP_BT_COEXIST,607 DBG_LOUD,608 "[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");609 algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;610 }611 }612 }613 }614 return algorithm;615}616 617static void btc8821a2ant_set_fw_dac_swing_lvl(struct btc_coexist *btcoexist,618 u8 dac_swing_lvl)619{620 struct rtl_priv *rtlpriv = btcoexist->adapter;621 u8 h2c_parameter[1] = {0};622 623 /* There are several type of dacswing624 * 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6625 */626 h2c_parameter[0] = dac_swing_lvl;627 628 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,629 "[BTCoex], Set Dac Swing Level = 0x%x\n", dac_swing_lvl);630 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,631 "[BTCoex], FW write 0x64 = 0x%x\n", h2c_parameter[0]);632 633 btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);634}635 636static void btc8821a2ant_set_fw_dec_bt_pwr(struct btc_coexist *btcoexist,637 u8 dec_bt_pwr_lvl)638{639 struct rtl_priv *rtlpriv = btcoexist->adapter;640 u8 h2c_parameter[1] = {0};641 642 h2c_parameter[0] = dec_bt_pwr_lvl;643 644 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,645 "[BTCoex], decrease Bt Power Level : %u, FW write 0x62 = 0x%x\n",646 dec_bt_pwr_lvl, h2c_parameter[0]);647 648 btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter);649}650 651static void btc8821a2ant_dec_bt_pwr(struct btc_coexist *btcoexist,652 bool force_exec, u8 dec_bt_pwr_lvl)653{654 struct rtl_priv *rtlpriv = btcoexist->adapter;655 656 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,657 "[BTCoex], %s Dec BT power level = %u\n",658 (force_exec ? "force to" : ""), dec_bt_pwr_lvl);659 coex_dm->cur_dec_bt_pwr_lvl = dec_bt_pwr_lvl;660 661 if (!force_exec) {662 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,663 "[BTCoex], pre_dec_bt_pwr_lvl = %d, cur_dec_bt_pwr_lvl = %d\n",664 coex_dm->pre_dec_bt_pwr_lvl,665 coex_dm->cur_dec_bt_pwr_lvl);666 667 if (coex_dm->pre_dec_bt_pwr_lvl == coex_dm->cur_dec_bt_pwr_lvl)668 return;669 }670 btc8821a2ant_set_fw_dec_bt_pwr(btcoexist, coex_dm->cur_dec_bt_pwr_lvl);671 672 coex_dm->pre_dec_bt_pwr_lvl = coex_dm->cur_dec_bt_pwr_lvl;673}674 675static void btc8821a2ant_fw_dac_swing_lvl(struct btc_coexist *btcoexist,676 bool force_exec, u8 fw_dac_swing_lvl)677{678 struct rtl_priv *rtlpriv = btcoexist->adapter;679 680 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,681 "[BTCoex], %s set FW Dac Swing level = %d\n",682 (force_exec ? "force to" : ""), fw_dac_swing_lvl);683 coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl;684 685 if (!force_exec) {686 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,687 "[BTCoex], pre_fw_dac_swing_lvl = %d, cur_fw_dac_swing_lvl = %d\n",688 coex_dm->pre_fw_dac_swing_lvl,689 coex_dm->cur_fw_dac_swing_lvl);690 691 if (coex_dm->pre_fw_dac_swing_lvl ==692 coex_dm->cur_fw_dac_swing_lvl)693 return;694 }695 696 btc8821a2ant_set_fw_dac_swing_lvl(btcoexist,697 coex_dm->cur_fw_dac_swing_lvl);698 699 coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;700}701 702static void btc8821a2ant_set_sw_penalty_tx_rate_adaptive(703 struct btc_coexist *btcoexist, bool low_penalty_ra)704{705 struct rtl_priv *rtlpriv = btcoexist->adapter;706 u8 h2c_parameter[6] = {0};707 708 h2c_parameter[0] = 0x6; /* opCode, 0x6 = Retry_Penalty */709 710 if (low_penalty_ra) {711 h2c_parameter[1] |= BIT0;712 /* normal rate except MCS7/6/5, OFDM54/48/36 */713 h2c_parameter[2] = 0x00;714 /* MCS7 or OFDM54 */715 h2c_parameter[3] = 0xf5;716 /* MCS6 or OFDM48 */717 h2c_parameter[4] = 0xa0;718 /* MCS5 or OFDM36 */719 h2c_parameter[5] = 0xa0;720 }721 722 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,723 "[BTCoex], set WiFi Low-Penalty Retry: %s",724 (low_penalty_ra ? "ON!!" : "OFF!!"));725 726 btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);727}728 729static void btc8821a2ant_low_penalty_ra(struct btc_coexist *btcoexist,730 bool force_exec, bool low_penalty_ra)731{732 struct rtl_priv *rtlpriv = btcoexist->adapter;733 734 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,735 "[BTCoex], %s turn LowPenaltyRA = %s\n",736 (force_exec ? "force to" : ""),737 ((low_penalty_ra) ? "ON" : "OFF"));738 coex_dm->cur_low_penalty_ra = low_penalty_ra;739 740 if (!force_exec) {741 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,742 "[BTCoex], pre_low_penalty_ra = %d, cur_low_penalty_ra = %d\n",743 coex_dm->pre_low_penalty_ra,744 coex_dm->cur_low_penalty_ra);745 746 if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)747 return;748 }749 btc8821a2ant_set_sw_penalty_tx_rate_adaptive(btcoexist,750 coex_dm->cur_low_penalty_ra);751 752 coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;753}754 755static void btc8821a2ant_set_dac_swing_reg(struct btc_coexist *btcoexist,756 u32 level)757{758 struct rtl_priv *rtlpriv = btcoexist->adapter;759 u8 val = (u8)level;760 761 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,762 "[BTCoex], Write SwDacSwing = 0x%x\n", level);763 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xc5b, 0x3e, val);764}765 766static void btc8821a2ant_set_sw_full_dac_swing(struct btc_coexist *btcoexist,767 bool sw_dac_swing_on,768 u32 sw_dac_swing_lvl)769{770 if (sw_dac_swing_on)771 btc8821a2ant_set_dac_swing_reg(btcoexist, sw_dac_swing_lvl);772 else773 btc8821a2ant_set_dac_swing_reg(btcoexist, 0x18);774}775 776static void btc8821a2ant_dac_swing(struct btc_coexist *btcoexist,777 bool force_exec, bool dac_swing_on,778 u32 dac_swing_lvl)779{780 struct rtl_priv *rtlpriv = btcoexist->adapter;781 782 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,783 "[BTCoex], %s turn DacSwing = %s, dac_swing_lvl = 0x%x\n",784 (force_exec ? "force to" : ""),785 ((dac_swing_on) ? "ON" : "OFF"),786 dac_swing_lvl);787 coex_dm->cur_dac_swing_on = dac_swing_on;788 coex_dm->cur_dac_swing_lvl = dac_swing_lvl;789 790 if (!force_exec) {791 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,792 "[BTCoex], pre_dac_swing_on = %d, pre_dac_swing_lvl = 0x%x, cur_dac_swing_on = %d, cur_dac_swing_lvl = 0x%x\n",793 coex_dm->pre_dac_swing_on,794 coex_dm->pre_dac_swing_lvl,795 coex_dm->cur_dac_swing_on,796 coex_dm->cur_dac_swing_lvl);797 798 if ((coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) &&799 (coex_dm->pre_dac_swing_lvl ==800 coex_dm->cur_dac_swing_lvl))801 return;802 }803 mdelay(30);804 btc8821a2ant_set_sw_full_dac_swing(btcoexist, dac_swing_on,805 dac_swing_lvl);806 807 coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on;808 coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl;809}810 811static void btc8821a2ant_set_coex_table(struct btc_coexist *btcoexist,812 u32 val0x6c0, u32 val0x6c4,813 u32 val0x6c8, u8 val0x6cc)814{815 struct rtl_priv *rtlpriv = btcoexist->adapter;816 817 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,818 "[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0);819 btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);820 821 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,822 "[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4);823 btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);824 825 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,826 "[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8);827 btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);828 829 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,830 "[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc);831 btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);832}833 834static void btc8821a2ant_coex_table(struct btc_coexist *btcoexist,835 bool force_exec, u32 val0x6c0,836 u32 val0x6c4, u32 val0x6c8, u8 val0x6cc)837{838 struct rtl_priv *rtlpriv = btcoexist->adapter;839 840 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,841 "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6c8 = 0x%x, 0x6cc = 0x%x\n",842 (force_exec ? "force to" : ""),843 val0x6c0, val0x6c4, val0x6c8, val0x6cc);844 coex_dm->cur_val0x6c0 = val0x6c0;845 coex_dm->cur_val0x6c4 = val0x6c4;846 coex_dm->cur_val0x6c8 = val0x6c8;847 coex_dm->cur_val0x6cc = val0x6cc;848 849 if (!force_exec) {850 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,851 "[BTCoex], pre_val0x6c0 = 0x%x, pre_val0x6c4 = 0x%x, pre_val0x6c8 = 0x%x, pre_val0x6cc = 0x%x !!\n",852 coex_dm->pre_val0x6c0,853 coex_dm->pre_val0x6c4,854 coex_dm->pre_val0x6c8,855 coex_dm->pre_val0x6cc);856 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,857 "[BTCoex], cur_val0x6c0 = 0x%x, cur_val0x6c4 = 0x%x, cur_val0x6c8 = 0x%x, cur_val0x6cc = 0x%x !!\n",858 coex_dm->cur_val0x6c0,859 coex_dm->cur_val0x6c4,860 coex_dm->cur_val0x6c8,861 coex_dm->cur_val0x6cc);862 863 if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&864 (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&865 (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&866 (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))867 return;868 }869 btc8821a2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8,870 val0x6cc);871 872 coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;873 coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;874 coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;875 coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;876}877 878static void btc8821a2ant_coex_table_with_type(struct btc_coexist *btcoexist,879 bool force_exec, u8 type)880{881 coex_sta->coex_table_type = type;882 883 switch (type) {884 case 0:885 btc8821a2ant_coex_table(btcoexist, force_exec, 0x55555555,886 0x55555555, 0xffffff, 0x3);887 break;888 case 1:889 btc8821a2ant_coex_table(btcoexist, force_exec, 0x55555555,890 0x5afa5afa, 0xffffff, 0x3);891 break;892 case 2:893 btc8821a2ant_coex_table(btcoexist, force_exec, 0x5ada5ada,894 0x5ada5ada, 0xffffff, 0x3);895 break;896 case 3:897 btc8821a2ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,898 0xaaaaaaaa, 0xffffff, 0x3);899 break;900 case 4:901 btc8821a2ant_coex_table(btcoexist, force_exec, 0xffffffff,902 0xffffffff, 0xffffff, 0x3);903 break;904 case 5:905 btc8821a2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,906 0x5fff5fff, 0xffffff, 0x3);907 break;908 case 6:909 btc8821a2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,910 0x5a5a5a5a, 0xffffff, 0x3);911 break;912 case 7:913 btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,914 0x5ada5ada, 0xffffff, 0x3);915 break;916 case 8:917 btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,918 0x5ada5ada, 0xffffff, 0x3);919 break;920 case 9:921 btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,922 0x5ada5ada, 0xffffff, 0x3);923 break;924 case 10:925 btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,926 0x5ada5ada, 0xffffff, 0x3);927 break;928 case 11:929 btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,930 0x5ada5ada, 0xffffff, 0x3);931 break;932 case 12:933 btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,934 0x5ada5ada, 0xffffff, 0x3);935 break;936 case 13:937 btc8821a2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,938 0xaaaaaaaa, 0xffffff, 0x3);939 break;940 case 14:941 btc8821a2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,942 0x5ada5ada, 0xffffff, 0x3);943 break;944 case 15:945 btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,946 0xaaaaaaaa, 0xffffff, 0x3);947 break;948 case 16:949 btc8821a2ant_coex_table(btcoexist, force_exec, 0x5fdf5fdf,950 0x5fdb5fdb, 0xffffff, 0x3);951 break;952 case 17:953 btc8821a2ant_coex_table(btcoexist, force_exec, 0xfafafafa,954 0xfafafafa, 0xffffff, 0x3);955 break;956 default:957 break;958 }959}960 961static void btc8821a2ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoex,962 bool enable)963{964 struct rtl_priv *rtlpriv = btcoex->adapter;965 u8 h2c_parameter[1] = {0};966 967 if (enable)968 h2c_parameter[0] |= BIT0; /* function enable */969 970 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,971 "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",972 h2c_parameter[0]);973 974 btcoex->btc_fill_h2c(btcoex, 0x63, 1, h2c_parameter);975}976 977static void btc8821a2ant_set_lps_rpwm(struct btc_coexist *btcoexist, u8 lps_val,978 u8 rpwm_val)979{980 u8 lps = lps_val;981 u8 rpwm = rpwm_val;982 983 btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);984 btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);985}986 987static void btc8821a2ant_lps_rpwm(struct btc_coexist *btcoexist,988 bool force_exec, u8 lps_val, u8 rpwm_val)989{990 coex_dm->cur_lps = lps_val;991 coex_dm->cur_rpwm = rpwm_val;992 993 if (!force_exec) {994 if ((coex_dm->pre_lps == coex_dm->cur_lps) &&995 (coex_dm->pre_rpwm == coex_dm->cur_rpwm))996 return;997 }998 btc8821a2ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);999 1000 coex_dm->pre_lps = coex_dm->cur_lps;1001 coex_dm->pre_rpwm = coex_dm->cur_rpwm;1002}1003 1004static void btc8821a2ant_ignore_wlan_act(struct btc_coexist *btcoexist,1005 bool force_exec, bool enable)1006{1007 struct rtl_priv *rtlpriv = btcoexist->adapter;1008 1009 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1010 "[BTCoex], %s turn Ignore WlanAct %s\n",1011 (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));1012 coex_dm->cur_ignore_wlan_act = enable;1013 1014 if (!force_exec) {1015 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1016 "[BTCoex], pre_ignore_wlan_act = %d, cur_ignore_wlan_act = %d!!\n",1017 coex_dm->pre_ignore_wlan_act,1018 coex_dm->cur_ignore_wlan_act);1019 1020 if (coex_dm->pre_ignore_wlan_act ==1021 coex_dm->cur_ignore_wlan_act)1022 return;1023 }1024 btc8821a2ant_set_fw_ignore_wlan_act(btcoexist, enable);1025 1026 coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;1027}1028 1029static void btc8821a2ant_set_fw_ps_tdma(struct btc_coexist *btcoexist,1030 u8 byte1, u8 byte2, u8 byte3,1031 u8 byte4, u8 byte5)1032{1033 struct rtl_priv *rtlpriv = btcoexist->adapter;1034 u8 h2c_parameter[5];1035 1036 h2c_parameter[0] = byte1;1037 h2c_parameter[1] = byte2;1038 h2c_parameter[2] = byte3;1039 h2c_parameter[3] = byte4;1040 h2c_parameter[4] = byte5;1041 1042 coex_dm->ps_tdma_para[0] = byte1;1043 coex_dm->ps_tdma_para[1] = byte2;1044 coex_dm->ps_tdma_para[2] = byte3;1045 coex_dm->ps_tdma_para[3] = byte4;1046 coex_dm->ps_tdma_para[4] = byte5;1047 1048 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1049 "[BTCoex], FW write 0x60(5bytes) = 0x%x%08x\n",1050 h2c_parameter[0],1051 h2c_parameter[1] << 24 |1052 h2c_parameter[2] << 16 |1053 h2c_parameter[3] << 8 |1054 h2c_parameter[4]);1055 1056 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);1057}1058 1059static void btc8821a2ant_sw_mechanism1(struct btc_coexist *btcoexist,1060 bool shrink_rx_lpf, bool low_penalty_ra,1061 bool limited_dig, bool bt_lna_constrain)1062{1063 btc8821a2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);1064}1065 1066static void btc8821a2ant_sw_mechanism2(struct btc_coexist *btcoexist,1067 bool agc_table_shift, bool adc_back_off,1068 bool sw_dac_swing, u32 dac_swing_lvl)1069{1070 btc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, sw_dac_swing,1071 dac_swing_lvl);1072}1073 1074static void btc8821a2ant_set_ant_path(struct btc_coexist *btcoexist,1075 u8 ant_pos_type, bool init_hw_cfg,1076 bool wifi_off)1077{1078 struct btc_board_info *board_info = &btcoexist->board_info;1079 u32 u4tmp = 0;1080 u8 h2c_parameter[2] = {0};1081 1082 if (init_hw_cfg) {1083 /* 0x4c[23] = 0, 0x4c[24] = 1 Antenna control by WL/BT */1084 u4tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);1085 u4tmp &= ~BIT23;1086 u4tmp |= BIT24;1087 btcoexist->btc_write_4byte(btcoexist, 0x4c, u4tmp);1088 1089 btcoexist->btc_write_4byte(btcoexist, 0x974, 0x3ff);1090 1091 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {1092 /* tell firmware "antenna inverse" ==> WRONG firmware1093 * antenna control code ==>need fw to fix1094 */1095 h2c_parameter[0] = 1;1096 h2c_parameter[1] = 1;1097 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,1098 h2c_parameter);1099 } else {1100 /* tell firmware "no antenna inverse" ==> WRONG firmware1101 * antenna control code ==>need fw to fix1102 */1103 h2c_parameter[0] = 0;1104 h2c_parameter[1] = 1;1105 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,1106 h2c_parameter);1107 }1108 }1109 1110 /* ext switch setting */1111 switch (ant_pos_type) {1112 case BTC_ANT_WIFI_AT_MAIN:1113 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7, 0x30, 0x1);1114 break;1115 case BTC_ANT_WIFI_AT_AUX:1116 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7, 0x30, 0x2);1117 break;1118 }1119}1120 1121static void btc8821a2ant_ps_tdma(struct btc_coexist *btcoexist,1122 bool force_exec, bool turn_on, u8 type)1123{1124 struct rtl_priv *rtlpriv = btcoexist->adapter;1125 1126 u8 wifi_rssi_state, bt_rssi_state;1127 1128 wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,1129 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);1130 bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist, 2,1131 BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);1132 1133 if (!(BTC_RSSI_HIGH(wifi_rssi_state) &&1134 BTC_RSSI_HIGH(bt_rssi_state)) &&1135 turn_on) {1136 /* for WiFi RSSI low or BT RSSI low */1137 type = type + 100;1138 }1139 1140 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1141 "[BTCoex], %s turn %s PS TDMA, type = %d\n",1142 (force_exec ? "force to" : ""), (turn_on ? "ON" : "OFF"),1143 type);1144 coex_dm->cur_ps_tdma_on = turn_on;1145 coex_dm->cur_ps_tdma = type;1146 1147 if (!force_exec) {1148 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1149 "[BTCoex], pre_ps_tdma_on = %d, cur_ps_tdma_on = %d!!\n",1150 coex_dm->pre_ps_tdma_on, coex_dm->cur_ps_tdma_on);1151 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1152 "[BTCoex], pre_ps_tdma = %d, cur_ps_tdma = %d!!\n",1153 coex_dm->pre_ps_tdma, coex_dm->cur_ps_tdma);1154 1155 if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&1156 (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))1157 return;1158 }1159 if (turn_on) {1160 switch (type) {1161 case 1:1162 default:1163 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,1164 0x03, 0xf1, 0x90);1165 break;1166 case 2:1167 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x2d,1168 0x03, 0xf1, 0x90);1169 break;1170 case 3:1171 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,1172 0x3, 0xf1, 0x90);1173 break;1174 case 4:1175 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,1176 0x03, 0xf1, 0x90);1177 break;1178 case 5:1179 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,1180 0x3, 0x70, 0x90);1181 break;1182 case 6:1183 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x2d,1184 0x3, 0x70, 0x90);1185 break;1186 case 7:1187 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,1188 0x3, 0x70, 0x90);1189 break;1190 case 8:1191 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x10,1192 0x3, 0x70, 0x90);1193 break;1194 case 9:1195 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,1196 0x03, 0xf1, 0x90);1197 break;1198 case 10:1199 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x2d,1200 0x03, 0xf1, 0x90);1201 break;1202 case 11:1203 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,1204 0x3, 0xf1, 0x90);1205 break;1206 case 12:1207 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,1208 0x3, 0xf1, 0x90);1209 break;1210 case 13:1211 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,1212 0x3, 0x70, 0x90);1213 break;1214 case 14:1215 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x2d,1216 0x3, 0x70, 0x90);1217 break;1218 case 15:1219 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,1220 0x3, 0x70, 0x90);1221 break;1222 case 16:1223 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,1224 0x3, 0x70, 0x90);1225 break;1226 case 17:1227 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x2f,1228 0x2f, 0x60, 0x90);1229 break;1230 case 18:1231 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5, 0x5,1232 0xe1, 0x90);1233 break;1234 case 19:1235 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,1236 0x25, 0xe1, 0x90);1237 break;1238 case 20:1239 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,1240 0x25, 0x60, 0x90);1241 break;1242 case 21:1243 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,1244 0x03, 0x70, 0x90);1245 break;1246 case 23:1247 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1e,1248 0x03, 0xf0, 0x14);1249 break;1250 case 24:1251 case 124:1252 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x3c,1253 0x03, 0x70, 0x50);1254 break;1255 case 25:1256 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x14,1257 0x03, 0xf1, 0x90);1258 break;1259 case 26:1260 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x30,1261 0x03, 0xf1, 0x90);1262 break;1263 case 71:1264 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,1265 0x03, 0xf1, 0x90);1266 break;1267 case 101:1268 case 105:1269 case 171:1270 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x3a,1271 0x03, 0x70, 0x50);1272 break;1273 case 102:1274 case 106:1275 case 110:1276 case 114:1277 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x2d,1278 0x03, 0x70, 0x50);1279 break;1280 case 103:1281 case 107:1282 case 111:1283 case 115:1284 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1c,1285 0x03, 0x70, 0x50);1286 break;1287 case 104:1288 case 108:1289 case 112:1290 case 116:1291 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x10,1292 0x03, 0x70, 0x50);1293 break;1294 case 109:1295 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,1296 0x03, 0xf1, 0x90);1297 break;1298 case 113:1299 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,1300 0x03, 0x70, 0x90);1301 break;1302 case 121:1303 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,1304 0x03, 0x70, 0x90);1305 break;1306 case 22:1307 case 122:1308 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x35,1309 0x03, 0x71, 0x11);1310 break;1311 case 123:1312 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1c,1313 0x03, 0x70, 0x54);1314 break;1315 case 125:1316 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x14,1317 0x03, 0x70, 0x50);1318 break;1319 case 126:1320 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x30,1321 0x03, 0x70, 0x50);1322 break;1323 }1324 } else {1325 /* disable PS tdma */1326 switch (type) {1327 case 0:1328 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,1329 0x40, 0x0);1330 break;1331 case 1:1332 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,1333 0x48, 0x0);1334 break;1335 default:1336 btc8821a2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,1337 0x40, 0x0);1338 break;1339 }1340 }1341 1342 /* update pre state */1343 coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;1344 coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;1345}1346 1347static void1348btc8821a2ant_ps_tdma_check_for_power_save_state(struct btc_coexist *btcoexist,1349 bool new_ps_state)1350{1351 u8 lps_mode = 0x0;1352 1353 btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);1354 1355 if (lps_mode) {1356 /* already under LPS state */1357 if (new_ps_state) {1358 /* keep state under LPS, do nothing */1359 } else {1360 /* will leave LPS state, turn off psTdma first */1361 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);1362 }1363 } else {1364 /* NO PS state */1365 if (new_ps_state) {1366 /* will enter LPS state, turn off psTdma first */1367 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);1368 } else {1369 /* keep state under NO PS state, do nothing */1370 }1371 }1372}1373 1374static void btc8821a2ant_power_save_state(struct btc_coexist *btcoexist,1375 u8 ps_type, u8 lps_val, u8 rpwm_val)1376{1377 bool low_pwr_disable = false;1378 1379 switch (ps_type) {1380 case BTC_PS_WIFI_NATIVE:1381 /* recover to original 32k low power setting */1382 low_pwr_disable = false;1383 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,1384 &low_pwr_disable);1385 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);1386 coex_sta->force_lps_on = false;1387 break;1388 case BTC_PS_LPS_ON:1389 btc8821a2ant_ps_tdma_check_for_power_save_state(btcoexist,1390 true);1391 btc8821a2ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,1392 rpwm_val);1393 /* when coex force to enter LPS, do not enter 32k low power */1394 low_pwr_disable = true;1395 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,1396 &low_pwr_disable);1397 /* power save must executed before psTdma */1398 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);1399 coex_sta->force_lps_on = true;1400 break;1401 case BTC_PS_LPS_OFF:1402 btc8821a2ant_ps_tdma_check_for_power_save_state(btcoexist,1403 false);1404 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);1405 coex_sta->force_lps_on = false;1406 break;1407 default:1408 break;1409 }1410}1411 1412static void btc8821a2ant_coex_all_off(struct btc_coexist *btcoexist)1413{1414 /* fw all off */1415 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);1416 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);1417 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);1418 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);1419 1420 /* sw all off */1421 btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);1422 btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);1423 1424 /* hw all off */1425 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);1426}1427 1428static void btc8821a2ant_coex_under_5g(struct btc_coexist *btcoexist)1429{1430 btc8821a2ant_coex_all_off(btcoexist);1431 btc8821a2ant_ignore_wlan_act(btcoexist, NORMAL_EXEC, true);1432}1433 1434static void btc8821a2ant_init_coex_dm(struct btc_coexist *btcoexist)1435{1436 /* force to reset coex mechanism */1437 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);1438 1439 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);1440 btc8821a2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1);1441 btc8821a2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);1442 btc8821a2ant_dec_bt_pwr(btcoexist, FORCE_EXEC, 0);1443 1444 btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);1445 btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);1446}1447 1448static void btc8821a2ant_action_bt_inquiry(struct btc_coexist *btcoexist)1449{1450 struct rtl_priv *rtlpriv = btcoexist->adapter;1451 bool wifi_connected = false;1452 bool low_pwr_disable = true;1453 bool scan = false, link = false, roam = false;1454 1455 btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);1456 btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,1457 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);1458 btc8821a2ant_bt_rssi_state(btcoexist,1459 2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);1460 1461 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,1462 &low_pwr_disable);1463 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,1464 &wifi_connected);1465 1466 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);1467 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);1468 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);1469 1470 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);1471 1472 if (scan || link || roam) {1473 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1474 "[BTCoex], Wifi link process + BT Inq/Page!!\n");1475 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);1476 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);1477 } else if (wifi_connected) {1478 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1479 "[BTCoex], Wifi connected + BT Inq/Page!!\n");1480 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);1481 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);1482 } else {1483 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1484 "[BTCoex], Wifi no-link + BT Inq/Page!!\n");1485 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);1486 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);1487 }1488 1489 btc8821a2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);1490 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);1491 1492 btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);1493 btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);1494}1495 1496static void btc8821a2ant_action_wifi_link_process(struct btc_coexist *btcoexist)1497{1498 struct rtl_priv *rtlpriv = btcoexist->adapter;1499 u8 u8tmpa, u8tmpb;1500 1501 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);1502 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);1503 1504 btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);1505 btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);1506 1507 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);1508 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x76e);1509 1510 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1511 "[BTCoex], 0x765=0x%x, 0x76e=0x%x\n", u8tmpa, u8tmpb);1512}1513 1514static bool btc8821a2ant_action_wifi_idle_process(struct btc_coexist *btcoexist)1515{1516 struct rtl_priv *rtlpriv = btcoexist->adapter;1517 u8 wifi_rssi_state1;1518 u8 ap_num = 0;1519 1520 btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);1521 wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,1522 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES - 20, 0);1523 btc8821a2ant_bt_rssi_state(btcoexist,1524 2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);1525 1526 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);1527 1528 /* define the office environment */1529 if (BTC_RSSI_HIGH(wifi_rssi_state1) && (coex_sta->hid_exist) &&1530 (coex_sta->a2dp_exist)) {1531 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1532 "[BTCoex], Wifi idle process for BT HID+A2DP exist!!\n");1533 1534 btc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x6);1535 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);1536 1537 /* sw all off */1538 btc8821a2ant_sw_mechanism1(btcoexist, false, false, false,1539 false);1540 btc8821a2ant_sw_mechanism2(btcoexist, false, false, false,1541 0x18);1542 1543 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);1544 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1545 0x0, 0x0);1546 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);1547 1548 return true;1549 } else if (coex_sta->pan_exist) {1550 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1551 "[BTCoex], Wifi idle process for BT PAN exist!!\n");1552 1553 btc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x6);1554 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);1555 1556 /* sw all off */1557 btc8821a2ant_sw_mechanism1(btcoexist, false, false, false,1558 false);1559 btc8821a2ant_sw_mechanism2(btcoexist, false, false, false,1560 0x18);1561 1562 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);1563 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1564 0x0, 0x0);1565 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);1566 1567 return true;1568 }1569 btc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x18);1570 return false;1571}1572 1573static bool btc8821a2ant_is_common_action(struct btc_coexist *btcoexist)1574{1575 struct rtl_priv *rtlpriv = btcoexist->adapter;1576 bool common = false, wifi_connected = false, wifi_busy = false;1577 bool low_pwr_disable = false;1578 bool bt_hs_on = false;1579 1580 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);1581 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,1582 &wifi_connected);1583 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);1584 1585 if (!wifi_connected) {1586 low_pwr_disable = false;1587 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,1588 &low_pwr_disable);1589 btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,1590 0x8);1591 1592 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1593 "[BTCoex], Wifi non-connected idle!!\n");1594 1595 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,1596 0x0);1597 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);1598 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,1599 0x0, 0x0);1600 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);1601 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);1602 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);1603 1604 btc8821a2ant_sw_mechanism1(btcoexist, false, false, false,1605 false);1606 btc8821a2ant_sw_mechanism2(btcoexist, false, false, false,1607 0x18);1608 1609 common = true;1610 } else {1611 if (BT_8821A_2ANT_BT_STATUS_IDLE ==1612 coex_dm->bt_status) {1613 low_pwr_disable = false;1614 btcoexist->btc_set(btcoexist,1615 BTC_SET_ACT_DISABLE_LOW_POWER,1616 &low_pwr_disable);1617 btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC,1618 false, false, 0x8);1619 1620 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1621 "[BTCoex], Wifi connected + BT non connected-idle!!\n");1622 1623 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,1624 0xfffff, 0x0);1625 btc8821a2ant_coex_table_with_type(btcoexist,1626 NORMAL_EXEC, 0);1627 1628 btc8821a2ant_power_save_state(1629 btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);1630 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);1631 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,1632 0xb);1633 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);1634 1635 btc8821a2ant_sw_mechanism1(btcoexist, false, false,1636 false, false);1637 btc8821a2ant_sw_mechanism2(btcoexist, false, false,1638 false, 0x18);1639 1640 common = true;1641 } else if (BT_8821A_2ANT_BT_STATUS_CON_IDLE ==1642 coex_dm->bt_status) {1643 low_pwr_disable = true;1644 btcoexist->btc_set(btcoexist,1645 BTC_SET_ACT_DISABLE_LOW_POWER,1646 &low_pwr_disable);1647 1648 if (bt_hs_on)1649 return false;1650 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1651 "[BTCoex], Wifi connected + BT connected-idle!!\n");1652 btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC,1653 false, false, 0x8);1654 1655 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,1656 0xfffff, 0x0);1657 btc8821a2ant_coex_table_with_type(btcoexist,1658 NORMAL_EXEC, 0);1659 1660 btc8821a2ant_power_save_state(1661 btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);1662 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);1663 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,1664 0xb);1665 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);1666 1667 btc8821a2ant_sw_mechanism1(btcoexist, true, false,1668 false, false);1669 btc8821a2ant_sw_mechanism2(btcoexist, false, false,1670 false, 0x18);1671 common = true;1672 } else {1673 low_pwr_disable = true;1674 btcoexist->btc_set(btcoexist,1675 BTC_SET_ACT_DISABLE_LOW_POWER,1676 &low_pwr_disable);1677 1678 if (wifi_busy) {1679 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1680 "[BTCoex], Wifi Connected-Busy + BT Busy!!\n");1681 common = false;1682 } else {1683 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1684 "[BTCoex], Wifi Connected-Idle + BT Busy!!\n");1685 common =1686 btc8821a2ant_action_wifi_idle_process(1687 btcoexist);1688 }1689 }1690 }1691 return common;1692}1693 1694static void btc8821a2ant_tdma_duration_adjust(struct btc_coexist *btcoexist,1695 bool sco_hid, bool tx_pause,1696 u8 max_interval)1697{1698 struct rtl_priv *rtlpriv = btcoexist->adapter;1699 static long up, dn, m, n, wait_count;1700 /* 0 : no change1701 * +1: increase WiFi duration1702 * -1: decrease WiFi duration1703 */1704 int result;1705 u8 retry_count = 0;1706 1707 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1708 "[BTCoex], TdmaDurationAdjust()\n");1709 1710 if (coex_dm->auto_tdma_adjust) {1711 coex_dm->auto_tdma_adjust = false;1712 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1713 "[BTCoex], first run TdmaDurationAdjust()!!\n");1714 if (sco_hid) {1715 if (tx_pause) {1716 if (max_interval == 1) {1717 btc8821a2ant_ps_tdma(btcoexist,1718 NORMAL_EXEC, true, 13);1719 coex_dm->ps_tdma_du_adj_type = 13;1720 } else if (max_interval == 2) {1721 btc8821a2ant_ps_tdma(btcoexist,1722 NORMAL_EXEC, true, 14);1723 coex_dm->ps_tdma_du_adj_type = 14;1724 } else {1725 btc8821a2ant_ps_tdma(btcoexist,1726 NORMAL_EXEC, true, 15);1727 coex_dm->ps_tdma_du_adj_type = 15;1728 }1729 } else {1730 if (max_interval == 1) {1731 btc8821a2ant_ps_tdma(btcoexist,1732 NORMAL_EXEC, true, 9);1733 coex_dm->ps_tdma_du_adj_type = 9;1734 } else if (max_interval == 2) {1735 btc8821a2ant_ps_tdma(btcoexist,1736 NORMAL_EXEC, true, 10);1737 coex_dm->ps_tdma_du_adj_type = 10;1738 } else {1739 btc8821a2ant_ps_tdma(btcoexist,1740 NORMAL_EXEC, true, 11);1741 coex_dm->ps_tdma_du_adj_type = 11;1742 }1743 }1744 } else {1745 if (tx_pause) {1746 if (max_interval == 1) {1747 btc8821a2ant_ps_tdma(btcoexist,1748 NORMAL_EXEC, true, 5);1749 coex_dm->ps_tdma_du_adj_type = 5;1750 } else if (max_interval == 2) {1751 btc8821a2ant_ps_tdma(btcoexist,1752 NORMAL_EXEC, true, 6);1753 coex_dm->ps_tdma_du_adj_type = 6;1754 } else {1755 btc8821a2ant_ps_tdma(btcoexist,1756 NORMAL_EXEC, true, 7);1757 coex_dm->ps_tdma_du_adj_type = 7;1758 }1759 } else {1760 if (max_interval == 1) {1761 btc8821a2ant_ps_tdma(btcoexist,1762 NORMAL_EXEC, true, 1);1763 coex_dm->ps_tdma_du_adj_type = 1;1764 } else if (max_interval == 2) {1765 btc8821a2ant_ps_tdma(btcoexist,1766 NORMAL_EXEC, true, 2);1767 coex_dm->ps_tdma_du_adj_type = 2;1768 } else {1769 btc8821a2ant_ps_tdma(btcoexist,1770 NORMAL_EXEC, true, 3);1771 coex_dm->ps_tdma_du_adj_type = 3;1772 }1773 }1774 }1775 1776 up = 0;1777 dn = 0;1778 m = 1;1779 n = 3;1780 result = 0;1781 wait_count = 0;1782 } else {1783 /* accquire the BT TRx retry count from BT_Info byte2 */1784 retry_count = coex_sta->bt_retry_cnt;1785 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1786 "[BTCoex], retry_count = %d\n", retry_count);1787 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1788 "[BTCoex], up = %d, dn = %d, m = %d, n = %d, wait_count = %d\n",1789 (int)up, (int)dn, (int)m, (int)n, (int)wait_count);1790 result = 0;1791 wait_count++;1792 1793 if (retry_count == 0) {1794 /* no retry in the last 2-second duration */1795 up++;1796 dn--;1797 1798 if (dn <= 0)1799 dn = 0;1800 1801 if (up >= n) {1802 /* if (retry count == 0) for 2*n seconds,1803 * make WiFi duration wider1804 */1805 wait_count = 0;1806 n = 3;1807 up = 0;1808 dn = 0;1809 result = 1;1810 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1811 "[BTCoex], Increase wifi duration!!\n");1812 }1813 } else if (retry_count <= 3) {1814 /* <=3 retry in the last 2-second duration */1815 up--;1816 dn++;1817 1818 if (up <= 0)1819 up = 0;1820 1821 if (dn == 2) {1822 /* if retry count < 3 for 2*2 seconds,1823 * shrink wifi duration1824 */1825 if (wait_count <= 2)1826 m++; /* avoid bounce in two levels */1827 else1828 m = 1;1829 /* m max value is 20, max time is 120 second,1830 * recheck if adjust WiFi duration.1831 */1832 if (m >= 20)1833 m = 20;1834 1835 n = 3 * m;1836 up = 0;1837 dn = 0;1838 wait_count = 0;1839 result = -1;1840 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1841 "[BTCoex], Decrease wifi duration for retryCounter<3!!\n");1842 }1843 } else {1844 /* retry count > 3, if retry count > 3 happens once,1845 * shrink WiFi duration1846 */1847 if (wait_count == 1)1848 m++; /* avoid bounce in two levels */1849 else1850 m = 1;1851 /* m max value is 20, max time is 120 second,1852 * recheck if adjust WiFi duration.1853 */1854 if (m >= 20)1855 m = 20;1856 1857 n = 3 * m;1858 up = 0;1859 dn = 0;1860 wait_count = 0;1861 result = -1;1862 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1863 "[BTCoex], Decrease wifi duration for retryCounter>3!!\n");1864 }1865 1866 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,1867 "[BTCoex], max Interval = %d\n", max_interval);1868 1869 if (max_interval == 1) {1870 if (tx_pause) {1871 if (coex_dm->cur_ps_tdma == 71) {1872 btc8821a2ant_ps_tdma(btcoexist,1873 NORMAL_EXEC, true, 5);1874 coex_dm->ps_tdma_du_adj_type = 5;1875 } else if (coex_dm->cur_ps_tdma == 1) {1876 btc8821a2ant_ps_tdma(btcoexist,1877 NORMAL_EXEC, true, 5);1878 coex_dm->ps_tdma_du_adj_type = 5;1879 } else if (coex_dm->cur_ps_tdma == 2) {1880 btc8821a2ant_ps_tdma(btcoexist,1881 NORMAL_EXEC, true, 6);1882 coex_dm->ps_tdma_du_adj_type = 6;1883 } else if (coex_dm->cur_ps_tdma == 3) {1884 btc8821a2ant_ps_tdma(btcoexist,1885 NORMAL_EXEC, true, 7);1886 coex_dm->ps_tdma_du_adj_type = 7;1887 } else if (coex_dm->cur_ps_tdma == 4) {1888 btc8821a2ant_ps_tdma(btcoexist,1889 NORMAL_EXEC, true, 8);1890 coex_dm->ps_tdma_du_adj_type = 8;1891 }1892 if (coex_dm->cur_ps_tdma == 9) {1893 btc8821a2ant_ps_tdma(btcoexist,1894 NORMAL_EXEC, true, 13);1895 coex_dm->ps_tdma_du_adj_type = 13;1896 } else if (coex_dm->cur_ps_tdma == 10) {1897 btc8821a2ant_ps_tdma(btcoexist,1898 NORMAL_EXEC, true, 14);1899 coex_dm->ps_tdma_du_adj_type = 14;1900 } else if (coex_dm->cur_ps_tdma == 11) {1901 btc8821a2ant_ps_tdma(btcoexist,1902 NORMAL_EXEC, true, 15);1903 coex_dm->ps_tdma_du_adj_type = 15;1904 } else if (coex_dm->cur_ps_tdma == 12) {1905 btc8821a2ant_ps_tdma(btcoexist,1906 NORMAL_EXEC, true, 16);1907 coex_dm->ps_tdma_du_adj_type = 16;1908 }1909 1910 if (result == -1) {1911 if (coex_dm->cur_ps_tdma == 5) {1912 btc8821a2ant_ps_tdma(1913 btcoexist, NORMAL_EXEC,1914 true, 6);1915 coex_dm->ps_tdma_du_adj_type =1916 6;1917 } else if (coex_dm->cur_ps_tdma == 6) {1918 btc8821a2ant_ps_tdma(1919 btcoexist, NORMAL_EXEC,1920 true, 7);1921 coex_dm->ps_tdma_du_adj_type =1922 7;1923 } else if (coex_dm->cur_ps_tdma == 7) {1924 btc8821a2ant_ps_tdma(1925 btcoexist, NORMAL_EXEC,1926 true, 8);1927 coex_dm->ps_tdma_du_adj_type =1928 8;1929 } else if (coex_dm->cur_ps_tdma == 13) {1930 btc8821a2ant_ps_tdma(1931 btcoexist, NORMAL_EXEC,1932 true, 14);1933 coex_dm->ps_tdma_du_adj_type =1934 14;1935 } else if (coex_dm->cur_ps_tdma == 14) {1936 btc8821a2ant_ps_tdma(1937 btcoexist, NORMAL_EXEC,1938 true, 15);1939 coex_dm->ps_tdma_du_adj_type =1940 15;1941 } else if (coex_dm->cur_ps_tdma == 15) {1942 btc8821a2ant_ps_tdma(1943 btcoexist, NORMAL_EXEC,1944 true, 16);1945 coex_dm->ps_tdma_du_adj_type =1946 16;1947 }1948 } else if (result == 1) {1949 if (coex_dm->cur_ps_tdma == 8) {1950 btc8821a2ant_ps_tdma(1951 btcoexist, NORMAL_EXEC,1952 true, 7);1953 coex_dm->ps_tdma_du_adj_type =1954 7;1955 } else if (coex_dm->cur_ps_tdma == 7) {1956 btc8821a2ant_ps_tdma(1957 btcoexist, NORMAL_EXEC,1958 true, 6);1959 coex_dm->ps_tdma_du_adj_type =1960 6;1961 } else if (coex_dm->cur_ps_tdma == 6) {1962 btc8821a2ant_ps_tdma(1963 btcoexist, NORMAL_EXEC,1964 true, 5);1965 coex_dm->ps_tdma_du_adj_type =1966 5;1967 } else if (coex_dm->cur_ps_tdma == 16) {1968 btc8821a2ant_ps_tdma(1969 btcoexist, NORMAL_EXEC,1970 true, 15);1971 coex_dm->ps_tdma_du_adj_type =1972 15;1973 } else if (coex_dm->cur_ps_tdma == 15) {1974 btc8821a2ant_ps_tdma(1975 btcoexist, NORMAL_EXEC,1976 true, 14);1977 coex_dm->ps_tdma_du_adj_type =1978 14;1979 } else if (coex_dm->cur_ps_tdma == 14) {1980 btc8821a2ant_ps_tdma(1981 btcoexist, NORMAL_EXEC,1982 true, 13);1983 coex_dm->ps_tdma_du_adj_type =1984 13;1985 }1986 }1987 } else {1988 if (coex_dm->cur_ps_tdma == 5) {1989 btc8821a2ant_ps_tdma(btcoexist,1990 NORMAL_EXEC, true, 71);1991 coex_dm->ps_tdma_du_adj_type = 71;1992 } else if (coex_dm->cur_ps_tdma == 6) {1993 btc8821a2ant_ps_tdma(btcoexist,1994 NORMAL_EXEC, true, 2);1995 coex_dm->ps_tdma_du_adj_type = 2;1996 } else if (coex_dm->cur_ps_tdma == 7) {1997 btc8821a2ant_ps_tdma(btcoexist,1998 NORMAL_EXEC, true, 3);1999 coex_dm->ps_tdma_du_adj_type = 3;2000 } else if (coex_dm->cur_ps_tdma == 8) {2001 btc8821a2ant_ps_tdma(btcoexist,2002 NORMAL_EXEC, true, 4);2003 coex_dm->ps_tdma_du_adj_type = 4;2004 }2005 if (coex_dm->cur_ps_tdma == 13) {2006 btc8821a2ant_ps_tdma(btcoexist,2007 NORMAL_EXEC, true, 9);2008 coex_dm->ps_tdma_du_adj_type = 9;2009 } else if (coex_dm->cur_ps_tdma == 14) {2010 btc8821a2ant_ps_tdma(btcoexist,2011 NORMAL_EXEC, true, 10);2012 coex_dm->ps_tdma_du_adj_type = 10;2013 } else if (coex_dm->cur_ps_tdma == 15) {2014 btc8821a2ant_ps_tdma(btcoexist,2015 NORMAL_EXEC, true, 11);2016 coex_dm->ps_tdma_du_adj_type = 11;2017 } else if (coex_dm->cur_ps_tdma == 16) {2018 btc8821a2ant_ps_tdma(btcoexist,2019 NORMAL_EXEC, true, 12);2020 coex_dm->ps_tdma_du_adj_type = 12;2021 }2022 2023 if (result == -1) {2024 if (coex_dm->cur_ps_tdma == 71) {2025 btc8821a2ant_ps_tdma(2026 btcoexist, NORMAL_EXEC,2027 true, 1);2028 coex_dm->ps_tdma_du_adj_type =2029 1;2030 } else if (coex_dm->cur_ps_tdma == 1) {2031 btc8821a2ant_ps_tdma(2032 btcoexist, NORMAL_EXEC,2033 true, 2);2034 coex_dm->ps_tdma_du_adj_type =2035 2;2036 } else if (coex_dm->cur_ps_tdma == 2) {2037 btc8821a2ant_ps_tdma(2038 btcoexist, NORMAL_EXEC,2039 true, 3);2040 coex_dm->ps_tdma_du_adj_type =2041 3;2042 } else if (coex_dm->cur_ps_tdma == 3) {2043 btc8821a2ant_ps_tdma(2044 btcoexist, NORMAL_EXEC,2045 true, 4);2046 coex_dm->ps_tdma_du_adj_type =2047 4;2048 } else if (coex_dm->cur_ps_tdma == 9) {2049 btc8821a2ant_ps_tdma(2050 btcoexist, NORMAL_EXEC,2051 true, 10);2052 coex_dm->ps_tdma_du_adj_type =2053 10;2054 } else if (coex_dm->cur_ps_tdma == 10) {2055 btc8821a2ant_ps_tdma(2056 btcoexist, NORMAL_EXEC,2057 true, 11);2058 coex_dm->ps_tdma_du_adj_type =2059 11;2060 } else if (coex_dm->cur_ps_tdma == 11) {2061 btc8821a2ant_ps_tdma(2062 btcoexist, NORMAL_EXEC,2063 true, 12);2064 coex_dm->ps_tdma_du_adj_type =2065 12;2066 }2067 } else if (result == 1) {2068 if (coex_dm->cur_ps_tdma == 4) {2069 btc8821a2ant_ps_tdma(2070 btcoexist, NORMAL_EXEC,2071 true, 3);2072 coex_dm->ps_tdma_du_adj_type =2073 3;2074 } else if (coex_dm->cur_ps_tdma == 3) {2075 btc8821a2ant_ps_tdma(2076 btcoexist, NORMAL_EXEC,2077 true, 2);2078 coex_dm->ps_tdma_du_adj_type =2079 2;2080 } else if (coex_dm->cur_ps_tdma == 2) {2081 btc8821a2ant_ps_tdma(2082 btcoexist, NORMAL_EXEC,2083 true, 1);2084 coex_dm->ps_tdma_du_adj_type =2085 1;2086 } else if (coex_dm->cur_ps_tdma == 1) {2087 btc8821a2ant_ps_tdma(2088 btcoexist, NORMAL_EXEC,2089 true, 71);2090 coex_dm->ps_tdma_du_adj_type =2091 71;2092 } else if (coex_dm->cur_ps_tdma == 12) {2093 btc8821a2ant_ps_tdma(2094 btcoexist, NORMAL_EXEC,2095 true, 11);2096 coex_dm->ps_tdma_du_adj_type =2097 11;2098 } else if (coex_dm->cur_ps_tdma == 11) {2099 btc8821a2ant_ps_tdma(2100 btcoexist, NORMAL_EXEC,2101 true, 10);2102 coex_dm->ps_tdma_du_adj_type =2103 10;2104 } else if (coex_dm->cur_ps_tdma == 10) {2105 btc8821a2ant_ps_tdma(2106 btcoexist, NORMAL_EXEC,2107 true, 9);2108 coex_dm->ps_tdma_du_adj_type =2109 9;2110 }2111 }2112 }2113 } else if (max_interval == 2) {2114 if (tx_pause) {2115 if (coex_dm->cur_ps_tdma == 1) {2116 btc8821a2ant_ps_tdma(btcoexist,2117 NORMAL_EXEC, true, 6);2118 coex_dm->ps_tdma_du_adj_type = 6;2119 } else if (coex_dm->cur_ps_tdma == 2) {2120 btc8821a2ant_ps_tdma(btcoexist,2121 NORMAL_EXEC, true, 6);2122 coex_dm->ps_tdma_du_adj_type = 6;2123 } else if (coex_dm->cur_ps_tdma == 3) {2124 btc8821a2ant_ps_tdma(btcoexist,2125 NORMAL_EXEC, true, 7);2126 coex_dm->ps_tdma_du_adj_type = 7;2127 } else if (coex_dm->cur_ps_tdma == 4) {2128 btc8821a2ant_ps_tdma(btcoexist,2129 NORMAL_EXEC, true, 8);2130 coex_dm->ps_tdma_du_adj_type = 8;2131 }2132 if (coex_dm->cur_ps_tdma == 9) {2133 btc8821a2ant_ps_tdma(btcoexist,2134 NORMAL_EXEC, true, 14);2135 coex_dm->ps_tdma_du_adj_type = 14;2136 } else if (coex_dm->cur_ps_tdma == 10) {2137 btc8821a2ant_ps_tdma(btcoexist,2138 NORMAL_EXEC, true, 14);2139 coex_dm->ps_tdma_du_adj_type = 14;2140 } else if (coex_dm->cur_ps_tdma == 11) {2141 btc8821a2ant_ps_tdma(btcoexist,2142 NORMAL_EXEC, true, 15);2143 coex_dm->ps_tdma_du_adj_type = 15;2144 } else if (coex_dm->cur_ps_tdma == 12) {2145 btc8821a2ant_ps_tdma(btcoexist,2146 NORMAL_EXEC, true, 16);2147 coex_dm->ps_tdma_du_adj_type = 16;2148 }2149 if (result == -1) {2150 if (coex_dm->cur_ps_tdma == 5) {2151 btc8821a2ant_ps_tdma(2152 btcoexist, NORMAL_EXEC,2153 true, 6);2154 coex_dm->ps_tdma_du_adj_type =2155 6;2156 } else if (coex_dm->cur_ps_tdma == 6) {2157 btc8821a2ant_ps_tdma(2158 btcoexist, NORMAL_EXEC,2159 true, 7);2160 coex_dm->ps_tdma_du_adj_type =2161 7;2162 } else if (coex_dm->cur_ps_tdma == 7) {2163 btc8821a2ant_ps_tdma(2164 btcoexist, NORMAL_EXEC,2165 true, 8);2166 coex_dm->ps_tdma_du_adj_type =2167 8;2168 } else if (coex_dm->cur_ps_tdma == 13) {2169 btc8821a2ant_ps_tdma(2170 btcoexist, NORMAL_EXEC,2171 true, 14);2172 coex_dm->ps_tdma_du_adj_type =2173 14;2174 } else if (coex_dm->cur_ps_tdma == 14) {2175 btc8821a2ant_ps_tdma(2176 btcoexist, NORMAL_EXEC,2177 true, 15);2178 coex_dm->ps_tdma_du_adj_type =2179 15;2180 } else if (coex_dm->cur_ps_tdma == 15) {2181 btc8821a2ant_ps_tdma(2182 btcoexist, NORMAL_EXEC,2183 true, 16);2184 coex_dm->ps_tdma_du_adj_type =2185 16;2186 }2187 } else if (result == 1) {2188 if (coex_dm->cur_ps_tdma == 8) {2189 btc8821a2ant_ps_tdma(2190 btcoexist, NORMAL_EXEC,2191 true, 7);2192 coex_dm->ps_tdma_du_adj_type =2193 7;2194 } else if (coex_dm->cur_ps_tdma == 7) {2195 btc8821a2ant_ps_tdma(2196 btcoexist, NORMAL_EXEC,2197 true, 6);2198 coex_dm->ps_tdma_du_adj_type =2199 6;2200 } else if (coex_dm->cur_ps_tdma == 6) {2201 btc8821a2ant_ps_tdma(2202 btcoexist, NORMAL_EXEC,2203 true, 6);2204 coex_dm->ps_tdma_du_adj_type =2205 6;2206 } else if (coex_dm->cur_ps_tdma == 16) {2207 btc8821a2ant_ps_tdma(2208 btcoexist, NORMAL_EXEC,2209 true, 15);2210 coex_dm->ps_tdma_du_adj_type =2211 15;2212 } else if (coex_dm->cur_ps_tdma == 15) {2213 btc8821a2ant_ps_tdma(2214 btcoexist, NORMAL_EXEC,2215 true, 14);2216 coex_dm->ps_tdma_du_adj_type =2217 14;2218 } else if (coex_dm->cur_ps_tdma == 14) {2219 btc8821a2ant_ps_tdma(2220 btcoexist, NORMAL_EXEC,2221 true, 14);2222 coex_dm->ps_tdma_du_adj_type =2223 14;2224 }2225 }2226 } else {2227 if (coex_dm->cur_ps_tdma == 5) {2228 btc8821a2ant_ps_tdma(btcoexist,2229 NORMAL_EXEC, true, 2);2230 coex_dm->ps_tdma_du_adj_type = 2;2231 } else if (coex_dm->cur_ps_tdma == 6) {2232 btc8821a2ant_ps_tdma(btcoexist,2233 NORMAL_EXEC, true, 2);2234 coex_dm->ps_tdma_du_adj_type = 2;2235 } else if (coex_dm->cur_ps_tdma == 7) {2236 btc8821a2ant_ps_tdma(btcoexist,2237 NORMAL_EXEC, true, 3);2238 coex_dm->ps_tdma_du_adj_type = 3;2239 } else if (coex_dm->cur_ps_tdma == 8) {2240 btc8821a2ant_ps_tdma(btcoexist,2241 NORMAL_EXEC, true, 4);2242 coex_dm->ps_tdma_du_adj_type = 4;2243 }2244 if (coex_dm->cur_ps_tdma == 13) {2245 btc8821a2ant_ps_tdma(btcoexist,2246 NORMAL_EXEC, true, 10);2247 coex_dm->ps_tdma_du_adj_type = 10;2248 } else if (coex_dm->cur_ps_tdma == 14) {2249 btc8821a2ant_ps_tdma(btcoexist,2250 NORMAL_EXEC, true, 10);2251 coex_dm->ps_tdma_du_adj_type = 10;2252 } else if (coex_dm->cur_ps_tdma == 15) {2253 btc8821a2ant_ps_tdma(btcoexist,2254 NORMAL_EXEC, true, 11);2255 coex_dm->ps_tdma_du_adj_type = 11;2256 } else if (coex_dm->cur_ps_tdma == 16) {2257 btc8821a2ant_ps_tdma(btcoexist,2258 NORMAL_EXEC, true, 12);2259 coex_dm->ps_tdma_du_adj_type = 12;2260 }2261 if (result == -1) {2262 if (coex_dm->cur_ps_tdma == 1) {2263 btc8821a2ant_ps_tdma(2264 btcoexist, NORMAL_EXEC,2265 true, 2);2266 coex_dm->ps_tdma_du_adj_type =2267 2;2268 } else if (coex_dm->cur_ps_tdma == 2) {2269 btc8821a2ant_ps_tdma(2270 btcoexist, NORMAL_EXEC,2271 true, 3);2272 coex_dm->ps_tdma_du_adj_type =2273 3;2274 } else if (coex_dm->cur_ps_tdma == 3) {2275 btc8821a2ant_ps_tdma(2276 btcoexist, NORMAL_EXEC,2277 true, 4);2278 coex_dm->ps_tdma_du_adj_type =2279 4;2280 } else if (coex_dm->cur_ps_tdma == 9) {2281 btc8821a2ant_ps_tdma(2282 btcoexist, NORMAL_EXEC,2283 true, 10);2284 coex_dm->ps_tdma_du_adj_type =2285 10;2286 } else if (coex_dm->cur_ps_tdma == 10) {2287 btc8821a2ant_ps_tdma(2288 btcoexist, NORMAL_EXEC,2289 true, 11);2290 coex_dm->ps_tdma_du_adj_type =2291 11;2292 } else if (coex_dm->cur_ps_tdma == 11) {2293 btc8821a2ant_ps_tdma(2294 btcoexist, NORMAL_EXEC,2295 true, 12);2296 coex_dm->ps_tdma_du_adj_type =2297 12;2298 }2299 } else if (result == 1) {2300 if (coex_dm->cur_ps_tdma == 4) {2301 btc8821a2ant_ps_tdma(2302 btcoexist, NORMAL_EXEC,2303 true, 3);2304 coex_dm->ps_tdma_du_adj_type =2305 3;2306 } else if (coex_dm->cur_ps_tdma == 3) {2307 btc8821a2ant_ps_tdma(2308 btcoexist, NORMAL_EXEC,2309 true, 2);2310 coex_dm->ps_tdma_du_adj_type =2311 2;2312 } else if (coex_dm->cur_ps_tdma == 2) {2313 btc8821a2ant_ps_tdma(2314 btcoexist, NORMAL_EXEC,2315 true, 2);2316 coex_dm->ps_tdma_du_adj_type =2317 2;2318 } else if (coex_dm->cur_ps_tdma == 12) {2319 btc8821a2ant_ps_tdma(2320 btcoexist, NORMAL_EXEC,2321 true, 11);2322 coex_dm->ps_tdma_du_adj_type =2323 11;2324 } else if (coex_dm->cur_ps_tdma == 11) {2325 btc8821a2ant_ps_tdma(2326 btcoexist, NORMAL_EXEC,2327 true, 10);2328 coex_dm->ps_tdma_du_adj_type =2329 10;2330 } else if (coex_dm->cur_ps_tdma == 10) {2331 btc8821a2ant_ps_tdma(2332 btcoexist, NORMAL_EXEC,2333 true, 10);2334 coex_dm->ps_tdma_du_adj_type =2335 10;2336 }2337 }2338 }2339 } else if (max_interval == 3) {2340 if (tx_pause) {2341 if (coex_dm->cur_ps_tdma == 1) {2342 btc8821a2ant_ps_tdma(btcoexist,2343 NORMAL_EXEC, true, 7);2344 coex_dm->ps_tdma_du_adj_type = 7;2345 } else if (coex_dm->cur_ps_tdma == 2) {2346 btc8821a2ant_ps_tdma(btcoexist,2347 NORMAL_EXEC, true, 7);2348 coex_dm->ps_tdma_du_adj_type = 7;2349 } else if (coex_dm->cur_ps_tdma == 3) {2350 btc8821a2ant_ps_tdma(btcoexist,2351 NORMAL_EXEC, true, 7);2352 coex_dm->ps_tdma_du_adj_type = 7;2353 } else if (coex_dm->cur_ps_tdma == 4) {2354 btc8821a2ant_ps_tdma(btcoexist,2355 NORMAL_EXEC, true, 8);2356 coex_dm->ps_tdma_du_adj_type = 8;2357 }2358 if (coex_dm->cur_ps_tdma == 9) {2359 btc8821a2ant_ps_tdma(btcoexist,2360 NORMAL_EXEC, true, 15);2361 coex_dm->ps_tdma_du_adj_type = 15;2362 } else if (coex_dm->cur_ps_tdma == 10) {2363 btc8821a2ant_ps_tdma(btcoexist,2364 NORMAL_EXEC, true, 15);2365 coex_dm->ps_tdma_du_adj_type = 15;2366 } else if (coex_dm->cur_ps_tdma == 11) {2367 btc8821a2ant_ps_tdma(btcoexist,2368 NORMAL_EXEC, true, 15);2369 coex_dm->ps_tdma_du_adj_type = 15;2370 } else if (coex_dm->cur_ps_tdma == 12) {2371 btc8821a2ant_ps_tdma(btcoexist,2372 NORMAL_EXEC, true, 16);2373 coex_dm->ps_tdma_du_adj_type = 16;2374 }2375 if (result == -1) {2376 if (coex_dm->cur_ps_tdma == 5) {2377 btc8821a2ant_ps_tdma(2378 btcoexist, NORMAL_EXEC,2379 true, 7);2380 coex_dm->ps_tdma_du_adj_type =2381 7;2382 } else if (coex_dm->cur_ps_tdma == 6) {2383 btc8821a2ant_ps_tdma(2384 btcoexist, NORMAL_EXEC,2385 true, 7);2386 coex_dm->ps_tdma_du_adj_type =2387 7;2388 } else if (coex_dm->cur_ps_tdma == 7) {2389 btc8821a2ant_ps_tdma(2390 btcoexist, NORMAL_EXEC,2391 true, 8);2392 coex_dm->ps_tdma_du_adj_type =2393 8;2394 } else if (coex_dm->cur_ps_tdma == 13) {2395 btc8821a2ant_ps_tdma(2396 btcoexist, NORMAL_EXEC,2397 true, 15);2398 coex_dm->ps_tdma_du_adj_type =2399 15;2400 } else if (coex_dm->cur_ps_tdma == 14) {2401 btc8821a2ant_ps_tdma(2402 btcoexist, NORMAL_EXEC,2403 true, 15);2404 coex_dm->ps_tdma_du_adj_type =2405 15;2406 } else if (coex_dm->cur_ps_tdma == 15) {2407 btc8821a2ant_ps_tdma(2408 btcoexist, NORMAL_EXEC,2409 true, 16);2410 coex_dm->ps_tdma_du_adj_type =2411 16;2412 }2413 } else if (result == 1) {2414 if (coex_dm->cur_ps_tdma == 8) {2415 btc8821a2ant_ps_tdma(2416 btcoexist, NORMAL_EXEC,2417 true, 7);2418 coex_dm->ps_tdma_du_adj_type =2419 7;2420 } else if (coex_dm->cur_ps_tdma == 7) {2421 btc8821a2ant_ps_tdma(2422 btcoexist, NORMAL_EXEC,2423 true, 7);2424 coex_dm->ps_tdma_du_adj_type =2425 7;2426 } else if (coex_dm->cur_ps_tdma == 6) {2427 btc8821a2ant_ps_tdma(2428 btcoexist, NORMAL_EXEC,2429 true, 7);2430 coex_dm->ps_tdma_du_adj_type =2431 7;2432 } else if (coex_dm->cur_ps_tdma == 16) {2433 btc8821a2ant_ps_tdma(2434 btcoexist, NORMAL_EXEC,2435 true, 15);2436 coex_dm->ps_tdma_du_adj_type =2437 15;2438 } else if (coex_dm->cur_ps_tdma == 15) {2439 btc8821a2ant_ps_tdma(2440 btcoexist, NORMAL_EXEC,2441 true, 15);2442 coex_dm->ps_tdma_du_adj_type =2443 15;2444 } else if (coex_dm->cur_ps_tdma == 14) {2445 btc8821a2ant_ps_tdma(2446 btcoexist, NORMAL_EXEC,2447 true, 15);2448 coex_dm->ps_tdma_du_adj_type =2449 15;2450 }2451 }2452 } else {2453 if (coex_dm->cur_ps_tdma == 5) {2454 btc8821a2ant_ps_tdma(btcoexist,2455 NORMAL_EXEC, true, 3);2456 coex_dm->ps_tdma_du_adj_type = 3;2457 } else if (coex_dm->cur_ps_tdma == 6) {2458 btc8821a2ant_ps_tdma(btcoexist,2459 NORMAL_EXEC, true, 3);2460 coex_dm->ps_tdma_du_adj_type = 3;2461 } else if (coex_dm->cur_ps_tdma == 7) {2462 btc8821a2ant_ps_tdma(btcoexist,2463 NORMAL_EXEC, true, 3);2464 coex_dm->ps_tdma_du_adj_type = 3;2465 } else if (coex_dm->cur_ps_tdma == 8) {2466 btc8821a2ant_ps_tdma(btcoexist,2467 NORMAL_EXEC, true, 4);2468 coex_dm->ps_tdma_du_adj_type = 4;2469 }2470 if (coex_dm->cur_ps_tdma == 13) {2471 btc8821a2ant_ps_tdma(btcoexist,2472 NORMAL_EXEC, true, 11);2473 coex_dm->ps_tdma_du_adj_type = 11;2474 } else if (coex_dm->cur_ps_tdma == 14) {2475 btc8821a2ant_ps_tdma(btcoexist,2476 NORMAL_EXEC, true, 11);2477 coex_dm->ps_tdma_du_adj_type = 11;2478 } else if (coex_dm->cur_ps_tdma == 15) {2479 btc8821a2ant_ps_tdma(btcoexist,2480 NORMAL_EXEC, true, 11);2481 coex_dm->ps_tdma_du_adj_type = 11;2482 } else if (coex_dm->cur_ps_tdma == 16) {2483 btc8821a2ant_ps_tdma(btcoexist,2484 NORMAL_EXEC, true, 12);2485 coex_dm->ps_tdma_du_adj_type = 12;2486 }2487 if (result == -1) {2488 if (coex_dm->cur_ps_tdma == 1) {2489 btc8821a2ant_ps_tdma(2490 btcoexist, NORMAL_EXEC,2491 true, 3);2492 coex_dm->ps_tdma_du_adj_type =2493 3;2494 } else if (coex_dm->cur_ps_tdma == 2) {2495 btc8821a2ant_ps_tdma(2496 btcoexist, NORMAL_EXEC,2497 true, 3);2498 coex_dm->ps_tdma_du_adj_type =2499 3;2500 } else if (coex_dm->cur_ps_tdma == 3) {2501 btc8821a2ant_ps_tdma(2502 btcoexist, NORMAL_EXEC,2503 true, 4);2504 coex_dm->ps_tdma_du_adj_type =2505 4;2506 } else if (coex_dm->cur_ps_tdma == 9) {2507 btc8821a2ant_ps_tdma(2508 btcoexist, NORMAL_EXEC,2509 true, 11);2510 coex_dm->ps_tdma_du_adj_type =2511 11;2512 } else if (coex_dm->cur_ps_tdma == 10) {2513 btc8821a2ant_ps_tdma(2514 btcoexist, NORMAL_EXEC,2515 true, 11);2516 coex_dm->ps_tdma_du_adj_type =2517 11;2518 } else if (coex_dm->cur_ps_tdma == 11) {2519 btc8821a2ant_ps_tdma(2520 btcoexist, NORMAL_EXEC,2521 true, 12);2522 coex_dm->ps_tdma_du_adj_type =2523 12;2524 }2525 } else if (result == 1) {2526 if (coex_dm->cur_ps_tdma == 4) {2527 btc8821a2ant_ps_tdma(2528 btcoexist, NORMAL_EXEC,2529 true, 3);2530 coex_dm->ps_tdma_du_adj_type =2531 3;2532 } else if (coex_dm->cur_ps_tdma == 3) {2533 btc8821a2ant_ps_tdma(2534 btcoexist, NORMAL_EXEC,2535 true, 3);2536 coex_dm->ps_tdma_du_adj_type =2537 3;2538 } else if (coex_dm->cur_ps_tdma == 2) {2539 btc8821a2ant_ps_tdma(2540 btcoexist, NORMAL_EXEC,2541 true, 3);2542 coex_dm->ps_tdma_du_adj_type =2543 3;2544 } else if (coex_dm->cur_ps_tdma == 12) {2545 btc8821a2ant_ps_tdma(2546 btcoexist, NORMAL_EXEC,2547 true, 11);2548 coex_dm->ps_tdma_du_adj_type =2549 11;2550 } else if (coex_dm->cur_ps_tdma == 11) {2551 btc8821a2ant_ps_tdma(2552 btcoexist, NORMAL_EXEC,2553 true, 11);2554 coex_dm->ps_tdma_du_adj_type =2555 11;2556 } else if (coex_dm->cur_ps_tdma == 10) {2557 btc8821a2ant_ps_tdma(2558 btcoexist, NORMAL_EXEC,2559 true, 11);2560 coex_dm->ps_tdma_du_adj_type =2561 11;2562 }2563 }2564 }2565 }2566 }2567 2568 /* if current PsTdma not match with the recorded one2569 * (when scan, dhcp...), then we have to adjust it back to2570 * the previous recorded one.2571 */2572 if (coex_dm->cur_ps_tdma != coex_dm->ps_tdma_du_adj_type) {2573 bool scan = false, link = false, roam = false;2574 2575 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2576 "[BTCoex], PsTdma type mismatch!!!, cur_ps_tdma = %d, recordPsTdma = %d\n",2577 coex_dm->cur_ps_tdma, coex_dm->ps_tdma_du_adj_type);2578 2579 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);2580 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);2581 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);2582 2583 if (!scan && !link && !roam) {2584 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,2585 coex_dm->ps_tdma_du_adj_type);2586 } else {2587 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,2588 "[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n");2589 }2590 }2591}2592 2593/* SCO only or SCO+PAN(HS)*/2594static void btc8821a2ant_action_sco(struct btc_coexist *btcoexist)2595{2596 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;2597 u8 wifi_rssi_state, bt_rssi_state;2598 u32 wifi_bw;2599 2600 wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);2601 bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist, 2, 35, 0);2602 2603 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);2604 2605 btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);2606 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 4);2607 2608 if (BTC_RSSI_HIGH(bt_rssi_state))2609 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);2610 else2611 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);2612 2613 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);2614 2615 if (wifi_bw == BTC_WIFI_BW_LEGACY) {2616 /* for SCO quality at 11b/g mode */2617 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);2618 } else {2619 /* for SCO quality & wifi performance balance at 11n mode */2620 if (wifi_bw == BTC_WIFI_BW_HT40) {2621 btc8821a2ant_coex_table_with_type(btcoexist,2622 NORMAL_EXEC, 8);2623 } else {2624 if (bt_link_info->sco_only)2625 btc8821a2ant_coex_table_with_type(2626 btcoexist, NORMAL_EXEC, 17);2627 else2628 btc8821a2ant_coex_table_with_type(2629 btcoexist, NORMAL_EXEC, 12);2630 }2631 }2632 2633 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);2634 /* for voice quality */2635 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);2636 2637 /* sw mechanism */2638 if (wifi_bw == BTC_WIFI_BW_HT40) {2639 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||2640 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {2641 btc8821a2ant_sw_mechanism1(btcoexist, true, true,2642 false, false);2643 btc8821a2ant_sw_mechanism2(btcoexist, true, false,2644 true, 0x18);2645 } else {2646 btc8821a2ant_sw_mechanism1(btcoexist, true, true,2647 false, false);2648 btc8821a2ant_sw_mechanism2(btcoexist, false, false,2649 true, 0x18);2650 }2651 } else {2652 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||2653 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {2654 btc8821a2ant_sw_mechanism1(btcoexist, false, true,2655 false, false);2656 btc8821a2ant_sw_mechanism2(btcoexist, true, false,2657 true, 0x18);2658 } else {2659 btc8821a2ant_sw_mechanism1(btcoexist, false, true,2660 false, false);2661 btc8821a2ant_sw_mechanism2(btcoexist, false, false,2662 true, 0x18);2663 }2664 }2665}2666 2667static void btc8821a2ant_action_hid(struct btc_coexist *btcoexist)2668{2669 u8 wifi_rssi_state, bt_rssi_state;2670 u32 wifi_bw;2671 2672 wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);2673 bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,2674 2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);2675 2676 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);2677 2678 btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);2679 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);2680 2681 if (BTC_RSSI_HIGH(bt_rssi_state))2682 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);2683 else2684 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);2685 2686 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);2687 2688 if (wifi_bw == BTC_WIFI_BW_LEGACY) {2689 /* for HID at 11b/g mode */2690 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);2691 } else {2692 /* for HID quality & wifi performance balance at 11n mode */2693 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);2694 }2695 2696 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);2697 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 24);2698 2699 if (wifi_bw == BTC_WIFI_BW_HT40) {2700 /* sw mechanism */2701 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||2702 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {2703 btc8821a2ant_sw_mechanism1(btcoexist, true, true,2704 false, false);2705 btc8821a2ant_sw_mechanism2(btcoexist, true, false,2706 false, 0x18);2707 } else {2708 btc8821a2ant_sw_mechanism1(btcoexist, true, true,2709 false, false);2710 btc8821a2ant_sw_mechanism2(btcoexist, false, false,2711 false, 0x18);2712 }2713 } else {2714 /* sw mechanism */2715 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||2716 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {2717 btc8821a2ant_sw_mechanism1(btcoexist, false, true,2718 false, false);2719 btc8821a2ant_sw_mechanism2(btcoexist, true, false,2720 false, 0x18);2721 } else {2722 btc8821a2ant_sw_mechanism1(btcoexist, false, true,2723 false, false);2724 btc8821a2ant_sw_mechanism2(btcoexist, false, false,2725 false, 0x18);2726 }2727 }2728}2729 2730/* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */2731static void btc8821a2ant_action_a2dp(struct btc_coexist *btcoexist)2732{2733 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;2734 u8 ap_num = 0;2735 u32 wifi_bw;2736 2737 wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);2738 wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,2739 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);2740 bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,2741 2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);2742 2743 if ((ap_num >= 10) && BTC_RSSI_HIGH(wifi_rssi_state1) &&2744 BTC_RSSI_HIGH(bt_rssi_state)) {2745 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,2746 0x0, 0x0);2747 2748 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,2749 0x0);2750 btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,2751 0x8);2752 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);2753 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);2754 2755 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);2756 2757 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,2758 0x0, 0x0);2759 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);2760 2761 /* sw mechanism */2762 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);2763 if (wifi_bw == BTC_WIFI_BW_HT40) {2764 btc8821a2ant_sw_mechanism1(btcoexist, true, false,2765 false, false);2766 btc8821a2ant_sw_mechanism2(btcoexist, true, false,2767 true, 0x6);2768 } else {2769 btc8821a2ant_sw_mechanism1(btcoexist, false, false,2770 false, false);2771 btc8821a2ant_sw_mechanism2(btcoexist, true, false,2772 true, 0x6);2773 }2774 return;2775 }2776 2777 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);2778 btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);2779 2780 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);2781 2782 if (BTC_RSSI_HIGH(bt_rssi_state))2783 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);2784 else2785 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);2786 2787 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {2788 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);2789 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,2790 0x0, 0x0);2791 } else {2792 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);2793 btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,2794 0x4);2795 }2796 2797 /* preserve identical branches for further fine-tuning */2798 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||2799 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {2800 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);2801 } else {2802 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);2803 }2804 2805 /* sw mechanism */2806 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);2807 if (wifi_bw == BTC_WIFI_BW_HT40) {2808 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||2809 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {2810 btc8821a2ant_sw_mechanism1(btcoexist, true, false,2811 false, false);2812 btc8821a2ant_sw_mechanism2(btcoexist, true, false,2813 false, 0x18);2814 } else {2815 btc8821a2ant_sw_mechanism1(btcoexist, true, false,2816 false, false);2817 btc8821a2ant_sw_mechanism2(btcoexist, false, false,2818 false, 0x18);2819 }2820 } else {2821 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||2822 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {2823 btc8821a2ant_sw_mechanism1(btcoexist, false, false,2824 false, false);2825 btc8821a2ant_sw_mechanism2(btcoexist, true, false,2826 false, 0x18);2827 } else {2828 btc8821a2ant_sw_mechanism1(btcoexist, false, false,2829 false, false);2830 btc8821a2ant_sw_mechanism2(btcoexist, false, false,2831 false, 0x18);2832 }2833 }2834}2835 2836static void btc8821a2ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)2837{2838 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;2839 u32 wifi_bw;2840 2841 wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);2842 wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,2843 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);2844 bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,2845 2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);2846 2847 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);2848 2849 btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);2850 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);2851 2852 if (BTC_RSSI_HIGH(bt_rssi_state))2853 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);2854 else2855 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);2856 2857 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {2858 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);2859 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,2860 0x0, 0x0);2861 } else {2862 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);2863 btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,2864 0x4);2865 }2866 2867 btc8821a2ant_tdma_duration_adjust(btcoexist, false, true, 2);2868 2869 /* sw mechanism */2870 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);2871 if (wifi_bw == BTC_WIFI_BW_HT40) {2872 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||2873 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {2874 btc8821a2ant_sw_mechanism1(btcoexist, true, false,2875 false, false);2876 btc8821a2ant_sw_mechanism2(btcoexist, true, false,2877 false, 0x18);2878 } else {2879 btc8821a2ant_sw_mechanism1(btcoexist, true, false,2880 false, false);2881 btc8821a2ant_sw_mechanism2(btcoexist, false, false,2882 false, 0x18);2883 }2884 } else {2885 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||2886 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {2887 btc8821a2ant_sw_mechanism1(btcoexist, false, false,2888 false, false);2889 btc8821a2ant_sw_mechanism2(btcoexist, true, false,2890 false, 0x18);2891 } else {2892 btc8821a2ant_sw_mechanism1(btcoexist, false, false,2893 false, false);2894 btc8821a2ant_sw_mechanism2(btcoexist, false, false,2895 false, 0x18);2896 }2897 }2898}2899 2900static void btc8821a2ant_action_pan_edr(struct btc_coexist *btcoexist)2901{2902 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;2903 u32 wifi_bw;2904 2905 wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);2906 wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,2907 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);2908 bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,2909 2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);2910 2911 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);2912 2913 btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);2914 2915 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);2916 2917 if (BTC_RSSI_HIGH(bt_rssi_state))2918 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);2919 else2920 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);2921 2922 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {2923 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 10);2924 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,2925 0x0, 0x0);2926 } else {2927 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);2928 btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,2929 0x4);2930 }2931 2932 /* preserve identical branches for further fine-tuning */2933 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||2934 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))2935 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 26);2936 else2937 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 26);2938 2939 /* sw mechanism */2940 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);2941 if (wifi_bw == BTC_WIFI_BW_HT40) {2942 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||2943 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {2944 btc8821a2ant_sw_mechanism1(btcoexist, true, false,2945 false, false);2946 btc8821a2ant_sw_mechanism2(btcoexist, true, false,2947 false, 0x18);2948 } else {2949 btc8821a2ant_sw_mechanism1(btcoexist, true, false,2950 false, false);2951 btc8821a2ant_sw_mechanism2(btcoexist, false, false,2952 false, 0x18);2953 }2954 } else {2955 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||2956 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {2957 btc8821a2ant_sw_mechanism1(btcoexist, false, false,2958 false, false);2959 btc8821a2ant_sw_mechanism2(btcoexist, true, false,2960 false, 0x18);2961 } else {2962 btc8821a2ant_sw_mechanism1(btcoexist, false, false,2963 false, false);2964 btc8821a2ant_sw_mechanism2(btcoexist, false, false,2965 false, 0x18);2966 }2967 }2968}2969 2970/* PAN(HS) only */2971static void btc8821a2ant_action_pan_hs(struct btc_coexist *btcoexist)2972{2973 u8 wifi_rssi_state, bt_rssi_state;2974 u32 wifi_bw;2975 2976 wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);2977 btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,2978 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);2979 bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,2980 2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);2981 2982 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);2983 2984 btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);2985 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);2986 2987 if (BTC_RSSI_HIGH(bt_rssi_state))2988 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);2989 else2990 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);2991 2992 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);2993 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);2994 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);2995 2996 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);2997 if (wifi_bw == BTC_WIFI_BW_HT40) {2998 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||2999 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3000 btc8821a2ant_sw_mechanism1(btcoexist, true, false,3001 false, false);3002 btc8821a2ant_sw_mechanism2(btcoexist, true, false,3003 false, 0x18);3004 } else {3005 btc8821a2ant_sw_mechanism1(btcoexist, true, false,3006 false, false);3007 btc8821a2ant_sw_mechanism2(btcoexist, false, false,3008 false, 0x18);3009 }3010 } else {3011 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||3012 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3013 btc8821a2ant_sw_mechanism1(btcoexist, false, false,3014 false, false);3015 btc8821a2ant_sw_mechanism2(btcoexist, true, false,3016 false, 0x18);3017 } else {3018 btc8821a2ant_sw_mechanism1(btcoexist, false, false,3019 false, false);3020 btc8821a2ant_sw_mechanism2(btcoexist, false, false,3021 false, 0x18);3022 }3023 }3024}3025 3026/* PAN(EDR)+A2DP */3027static void btc8821a2ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)3028{3029 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;3030 u32 wifi_bw;3031 3032 wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);3033 wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,3034 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);3035 bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,3036 2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);3037 3038 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);3039 3040 btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);3041 3042 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);3043 3044 if (BTC_RSSI_HIGH(bt_rssi_state))3045 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);3046 else3047 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);3048 3049 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state))3050 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,3051 0x0, 0x0);3052 else3053 btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,3054 0x4);3055 3056 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);3057 3058 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||3059 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3060 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 12);3061 3062 if (wifi_bw == BTC_WIFI_BW_HT40)3063 btc8821a2ant_tdma_duration_adjust(btcoexist, false,3064 true, 3);3065 else3066 btc8821a2ant_tdma_duration_adjust(btcoexist, false,3067 false, 3);3068 } else {3069 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);3070 btc8821a2ant_tdma_duration_adjust(btcoexist, false, true, 3);3071 }3072 3073 /* sw mechanism */3074 if (wifi_bw == BTC_WIFI_BW_HT40) {3075 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||3076 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3077 btc8821a2ant_sw_mechanism1(btcoexist, true, false,3078 false, false);3079 btc8821a2ant_sw_mechanism2(btcoexist, true, false,3080 false, 0x18);3081 } else {3082 btc8821a2ant_sw_mechanism1(btcoexist, true, false,3083 false, false);3084 btc8821a2ant_sw_mechanism2(btcoexist, false, false,3085 false, 0x18);3086 }3087 } else {3088 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||3089 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3090 btc8821a2ant_sw_mechanism1(btcoexist, false, false,3091 false, false);3092 btc8821a2ant_sw_mechanism2(btcoexist, true, false,3093 false, 0x18);3094 } else {3095 btc8821a2ant_sw_mechanism1(btcoexist, false, false,3096 false, false);3097 btc8821a2ant_sw_mechanism2(btcoexist, false, false,3098 false, 0x18);3099 }3100 }3101}3102 3103static void btc8821a2ant_action_pan_edr_hid(struct btc_coexist *btcoexist)3104{3105 u8 wifi_rssi_state, bt_rssi_state;3106 u32 wifi_bw;3107 3108 wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);3109 bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,3110 2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);3111 3112 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);3113 3114 if (BTC_RSSI_HIGH(bt_rssi_state))3115 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);3116 else3117 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);3118 3119 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);3120 3121 /* preserve identical branches for further fine-tuning */3122 if (wifi_bw == BTC_WIFI_BW_LEGACY) {3123 /* for HID at 11b/g mode */3124 btc8821a2ant_coex_table(btcoexist, NORMAL_EXEC, 0x55ff55ff,3125 0x5a5f5a5f, 0xffff, 0x3);3126 } else {3127 /* for HID quality & wifi performance balance at 11n mode */3128 btc8821a2ant_coex_table(btcoexist, NORMAL_EXEC, 0x55ff55ff,3129 0x5a5f5a5f, 0xffff, 0x3);3130 }3131 3132 if (wifi_bw == BTC_WIFI_BW_HT40) {3133 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 3);3134 /* fw mechanism */3135 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||3136 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3137 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC,3138 true, 10);3139 } else {3140 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);3141 }3142 3143 /* sw mechanism */3144 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||3145 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3146 btc8821a2ant_sw_mechanism1(btcoexist, true, true,3147 false, false);3148 btc8821a2ant_sw_mechanism2(btcoexist, true, false,3149 false, 0x18);3150 } else {3151 btc8821a2ant_sw_mechanism1(btcoexist, true, true,3152 false, false);3153 btc8821a2ant_sw_mechanism2(btcoexist, false, false,3154 false, 0x18);3155 }3156 } else {3157 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);3158 /* fw mechanism */3159 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||3160 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3161 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10);3162 } else {3163 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);3164 }3165 3166 /* sw mechanism */3167 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||3168 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3169 btc8821a2ant_sw_mechanism1(btcoexist, false, true,3170 false, false);3171 btc8821a2ant_sw_mechanism2(btcoexist, true, false,3172 false, 0x18);3173 } else {3174 btc8821a2ant_sw_mechanism1(btcoexist, false, true,3175 false, false);3176 btc8821a2ant_sw_mechanism2(btcoexist, false, false,3177 false, 0x18);3178 }3179 }3180}3181 3182/* HID+A2DP+PAN(EDR) */3183static void btc8821a2ant_act_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)3184{3185 u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;3186 u32 wifi_bw;3187 3188 wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);3189 wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,3190 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);3191 bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,3192 2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);3193 3194 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);3195 3196 btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);3197 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);3198 3199 if (BTC_RSSI_HIGH(bt_rssi_state))3200 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);3201 else3202 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);3203 3204 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {3205 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);3206 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,3207 0x0, 0x0);3208 } else {3209 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 14);3210 btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,3211 0x4);3212 }3213 3214 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);3215 3216 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||3217 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3218 if (wifi_bw == BTC_WIFI_BW_HT40)3219 btc8821a2ant_tdma_duration_adjust(btcoexist, true,3220 true, 3);3221 else3222 btc8821a2ant_tdma_duration_adjust(btcoexist, true,3223 false, 3);3224 } else {3225 btc8821a2ant_tdma_duration_adjust(btcoexist, true, true, 3);3226 }3227 3228 /* sw mechanism */3229 if (wifi_bw == BTC_WIFI_BW_HT40) {3230 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||3231 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3232 btc8821a2ant_sw_mechanism1(btcoexist, true, true,3233 false, false);3234 btc8821a2ant_sw_mechanism2(btcoexist, true, false,3235 false, 0x18);3236 } else {3237 btc8821a2ant_sw_mechanism1(btcoexist, true, true,3238 false, false);3239 btc8821a2ant_sw_mechanism2(btcoexist, false, false,3240 false, 0x18);3241 }3242 } else {3243 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||3244 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3245 btc8821a2ant_sw_mechanism1(btcoexist, false, true,3246 false, false);3247 btc8821a2ant_sw_mechanism2(btcoexist, true, false,3248 false, 0x18);3249 } else {3250 btc8821a2ant_sw_mechanism1(btcoexist, false, true,3251 false, false);3252 btc8821a2ant_sw_mechanism2(btcoexist, false, false,3253 false, 0x18);3254 }3255 }3256}3257 3258static void btc8821a2ant_action_hid_a2dp(struct btc_coexist *btcoexist)3259{3260 u32 wifi_bw;3261 u8 wifi_rssi_state, bt_rssi_state;3262 u8 ap_num = 0;3263 3264 wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);3265 btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,3266 BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);3267 bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,3268 3, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 37);3269 3270 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);3271 3272 btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, true, 0x5);3273 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);3274 3275 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);3276 if (wifi_bw == BTC_WIFI_BW_LEGACY) {3277 if (BTC_RSSI_HIGH(bt_rssi_state))3278 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);3279 else if (BTC_RSSI_MEDIUM(bt_rssi_state))3280 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);3281 else3282 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);3283 } else {3284 /* only 802.11N mode we have to dec bt power to 4 degree */3285 if (BTC_RSSI_HIGH(bt_rssi_state)) {3286 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,3287 &ap_num);3288 if (ap_num < 10)3289 btc8821a2ant_dec_bt_pwr(btcoexist,3290 NORMAL_EXEC, 4);3291 else3292 btc8821a2ant_dec_bt_pwr(btcoexist,3293 NORMAL_EXEC, 2);3294 } else if (BTC_RSSI_MEDIUM(bt_rssi_state)) {3295 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);3296 } else {3297 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);3298 }3299 }3300 3301 if (wifi_bw == BTC_WIFI_BW_LEGACY) {3302 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);3303 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,3304 0x0, 0x0);3305 } else {3306 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 14);3307 btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,3308 0x4);3309 }3310 3311 /* preserve identical branches for further fine-tuning */3312 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||3313 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3314 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);3315 } else {3316 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);3317 }3318 3319 /* sw mechanism */3320 if (wifi_bw == BTC_WIFI_BW_HT40) {3321 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||3322 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3323 btc8821a2ant_sw_mechanism1(btcoexist, true, true,3324 false, false);3325 btc8821a2ant_sw_mechanism2(btcoexist, true, false,3326 false, 0x18);3327 } else {3328 btc8821a2ant_sw_mechanism1(btcoexist, true, true,3329 false, false);3330 btc8821a2ant_sw_mechanism2(btcoexist, false, false,3331 false, 0x18);3332 }3333 } else {3334 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||3335 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {3336 btc8821a2ant_sw_mechanism1(btcoexist, false, true,3337 false, false);3338 btc8821a2ant_sw_mechanism2(btcoexist, true, false,3339 false, 0x18);3340 } else {3341 btc8821a2ant_sw_mechanism1(btcoexist, false, true,3342 false, false);3343 btc8821a2ant_sw_mechanism2(btcoexist, false, false,3344 false, 0x18);3345 }3346 }3347}3348 3349static void btc8821a2ant_action_wifi_multi_port(struct btc_coexist *btcoexist)3350{3351 btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);3352 btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);3353 3354 /* sw all off */3355 btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);3356 btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);3357 3358 /* hw all off */3359 btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);3360 3361 btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);3362 btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);3363}3364 3365static void btc8821a2ant_run_coexist_mechanism(struct btc_coexist *btcoexist)3366{3367 struct rtl_priv *rtlpriv = btcoexist->adapter;3368 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;3369 bool wifi_under_5g = false;3370 u8 algorithm = 0;3371 u32 num_of_wifi_link = 0;3372 u32 wifi_link_status = 0;3373 bool miracast_plus_bt = false;3374 bool scan = false, link = false, roam = false;3375 3376 if (btcoexist->manual_control) {3377 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3378 "[BTCoex], Manual control!!!\n");3379 return;3380 }3381 3382 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);3383 3384 if (wifi_under_5g) {3385 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3386 "[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n");3387 btc8821a2ant_coex_under_5g(btcoexist);3388 return;3389 }3390 3391 if (coex_sta->under_ips) {3392 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3393 "[BTCoex], wifi is under IPS !!!\n");3394 return;3395 }3396 3397 algorithm = btc8821a2ant_action_algorithm(btcoexist);3398 if (coex_sta->c2h_bt_inquiry_page &&3399 (BT_8821A_2ANT_COEX_ALGO_PANHS != algorithm)) {3400 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3401 "[BTCoex], BT is under inquiry/page scan !!\n");3402 btc8821a2ant_action_bt_inquiry(btcoexist);3403 return;3404 }3405 3406 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);3407 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);3408 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);3409 3410 if (scan || link || roam) {3411 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3412 "[BTCoex], WiFi is under Link Process !!\n");3413 btc8821a2ant_action_wifi_link_process(btcoexist);3414 return;3415 }3416 3417 /* for P2P */3418 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,3419 &wifi_link_status);3420 num_of_wifi_link = wifi_link_status >> 16;3421 3422 if ((num_of_wifi_link >= 2) ||3423 (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {3424 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3425 "############# [BTCoex], Multi-Port num_of_wifi_link = %d, wifi_link_status = 0x%x\n",3426 num_of_wifi_link, wifi_link_status);3427 3428 if (bt_link_info->bt_link_exist)3429 miracast_plus_bt = true;3430 else3431 miracast_plus_bt = false;3432 3433 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,3434 &miracast_plus_bt);3435 btc8821a2ant_action_wifi_multi_port(btcoexist);3436 3437 return;3438 }3439 3440 miracast_plus_bt = false;3441 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,3442 &miracast_plus_bt);3443 3444 coex_dm->cur_algorithm = algorithm;3445 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3446 "[BTCoex], Algorithm = %d\n", coex_dm->cur_algorithm);3447 3448 if (btc8821a2ant_is_common_action(btcoexist)) {3449 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3450 "[BTCoex], Action 2-Ant common\n");3451 coex_dm->auto_tdma_adjust = true;3452 } else {3453 if (coex_dm->cur_algorithm != coex_dm->pre_algorithm) {3454 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3455 "[BTCoex], pre_algorithm = %d, cur_algorithm = %d\n",3456 coex_dm->pre_algorithm,3457 coex_dm->cur_algorithm);3458 coex_dm->auto_tdma_adjust = false;3459 }3460 switch (coex_dm->cur_algorithm) {3461 case BT_8821A_2ANT_COEX_ALGO_SCO:3462 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3463 "[BTCoex], Action 2-Ant, algorithm = SCO\n");3464 btc8821a2ant_action_sco(btcoexist);3465 break;3466 case BT_8821A_2ANT_COEX_ALGO_HID:3467 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3468 "[BTCoex], Action 2-Ant, algorithm = HID\n");3469 btc8821a2ant_action_hid(btcoexist);3470 break;3471 case BT_8821A_2ANT_COEX_ALGO_A2DP:3472 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3473 "[BTCoex], Action 2-Ant, algorithm = A2DP\n");3474 btc8821a2ant_action_a2dp(btcoexist);3475 break;3476 case BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS:3477 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3478 "[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS)\n");3479 btc8821a2ant_action_a2dp_pan_hs(btcoexist);3480 break;3481 case BT_8821A_2ANT_COEX_ALGO_PANEDR:3482 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3483 "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)\n");3484 btc8821a2ant_action_pan_edr(btcoexist);3485 break;3486 case BT_8821A_2ANT_COEX_ALGO_PANHS:3487 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3488 "[BTCoex], Action 2-Ant, algorithm = HS mode\n");3489 btc8821a2ant_action_pan_hs(btcoexist);3490 break;3491 case BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP:3492 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3493 "[BTCoex], Action 2-Ant, algorithm = PAN+A2DP\n");3494 btc8821a2ant_action_pan_edr_a2dp(btcoexist);3495 break;3496 case BT_8821A_2ANT_COEX_ALGO_PANEDR_HID:3497 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3498 "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID\n");3499 btc8821a2ant_action_pan_edr_hid(btcoexist);3500 break;3501 case BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR:3502 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3503 "[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN\n");3504 btc8821a2ant_act_hid_a2dp_pan_edr(btcoexist);3505 break;3506 case BT_8821A_2ANT_COEX_ALGO_HID_A2DP:3507 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3508 "[BTCoex], Action 2-Ant, algorithm = HID+A2DP\n");3509 btc8821a2ant_action_hid_a2dp(btcoexist);3510 break;3511 default:3512 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3513 "[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n");3514 btc8821a2ant_coex_all_off(btcoexist);3515 break;3516 }3517 coex_dm->pre_algorithm = coex_dm->cur_algorithm;3518 }3519}3520 3521static void btc8821a2ant_wifi_off_hw_cfg(struct btc_coexist *btcoexist)3522{3523 u8 h2c_parameter[2] = {0};3524 u32 fw_ver = 0;3525 3526 /* set wlan_act to low */3527 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);3528 3529 /* WiFi goto standby while GNT_BT 0-->1 */3530 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);3531 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);3532 if (fw_ver >= 0x180000) {3533 /* Use H2C to set GNT_BT to HIGH */3534 h2c_parameter[0] = 1;3535 btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1, h2c_parameter);3536 } else {3537 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);3538 }3539}3540 3541/**************************************************************3542 * extern function start with ex_btc8821a2ant_3543 **************************************************************/3544void ex_btc8821a2ant_init_hwconfig(struct btc_coexist *btcoexist)3545{3546 struct rtl_priv *rtlpriv = btcoexist->adapter;3547 u8 u1tmp = 0;3548 3549 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3550 "[BTCoex], 2Ant Init HW Config!!\n");3551 3552 /* backup rf 0x1e value */3553 coex_dm->bt_rf0x1e_backup =3554 btcoexist->btc_get_rf_reg(btcoexist, BTC_RF_A, 0x1e, 0xfffff);3555 3556 /* 0x790[5:0] = 0x5 */3557 u1tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);3558 u1tmp &= 0xc0;3559 u1tmp |= 0x5;3560 btcoexist->btc_write_1byte(btcoexist, 0x790, u1tmp);3561 3562 /* Antenna config */3563 btc8821a2ant_set_ant_path(btcoexist, BTC_ANT_WIFI_AT_MAIN, true, false);3564 coex_sta->dis_ver_info_cnt = 0;3565 3566 /* PTA parameter */3567 btc8821a2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);3568 3569 /* Enable counter statistics */3570 /* 0x76e[3] = 1, WLAN_Act control by PTA */3571 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);3572 btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);3573 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);3574}3575 3576void ex_btc8821a2ant_pre_load_firmware(struct btc_coexist *btcoexist)3577{3578 struct btc_board_info *board_info = &btcoexist->board_info;3579 u8 u8tmp = 0x4; /* Set BIT2 by default since it's 2ant case */3580 3581 /**3582 * S0 or S1 setting and Local register setting(By the setting fw can get3583 * ant number, S0/S1, ... info)3584 *3585 * Local setting bit define3586 * BIT0: "0" for no antenna inverse; "1" for antenna inverse3587 * BIT1: "0" for internal switch; "1" for external switch3588 * BIT2: "0" for one antenna; "1" for two antenna3589 * NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and3590 * BIT2=03591 */3592 if (btcoexist->chip_interface == BTC_INTF_USB) {3593 /* fixed at S0 for USB interface */3594 u8tmp |= 0x1; /* antenna inverse */3595 btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);3596 } else {3597 /* for PCIE and SDIO interface, we check efuse 0xc3[6] */3598 if (board_info->single_ant_path == 0) {3599 } else if (board_info->single_ant_path == 1) {3600 /* set to S0 */3601 u8tmp |= 0x1; /* antenna inverse */3602 }3603 3604 if (btcoexist->chip_interface == BTC_INTF_PCI)3605 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x384,3606 u8tmp);3607 else if (btcoexist->chip_interface == BTC_INTF_SDIO)3608 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60,3609 u8tmp);3610 }3611}3612 3613void ex_btc8821a2ant_init_coex_dm(struct btc_coexist *btcoexist)3614{3615 struct rtl_priv *rtlpriv = btcoexist->adapter;3616 3617 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3618 "[BTCoex], Coex Mechanism Init!!\n");3619 3620 btc8821a2ant_init_coex_dm(btcoexist);3621}3622 3623void ex_btc8821a2ant_display_coex_info(struct btc_coexist *btcoexist,3624 struct seq_file *m)3625{3626 struct btc_board_info *board_info = &btcoexist->board_info;3627 struct btc_stack_info *stack_info = &btcoexist->stack_info;3628 u8 u1tmp[4], i, bt_info_ext, ps_tdma_case = 0;3629 u32 u4tmp[4];3630 bool roam = false, scan = false, link = false, wifi_under_5g = false;3631 bool bt_hs_on = false, wifi_busy = false;3632 long wifi_rssi = 0, bt_hs_rssi = 0;3633 u32 wifi_bw, wifi_traffic_dir;3634 u8 wifi_dot_11_chnl, wifi_hs_chnl;3635 u32 fw_ver = 0, bt_patch_ver = 0;3636 3637 seq_puts(m, "\n ============[BT Coexist info]============");3638 3639 seq_printf(m, "\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:",3640 board_info->pg_ant_num, board_info->btdm_ant_num);3641 3642 if (btcoexist->manual_control) {3643 seq_printf(m, "\n %-35s", "[Action Manual control]!!");3644 }3645 3646 seq_printf(m, "\n %-35s = %s / %d", "BT stack/ hci ext ver",3647 ((stack_info->profile_notified) ? "Yes" : "No"),3648 stack_info->hci_version);3649 3650 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);3651 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);3652 seq_printf(m, "\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)",3653 "CoexVer/ FwVer/ PatchVer",3654 glcoex_ver_date_8821a_2ant, glcoex_ver_8821a_2ant,3655 fw_ver, bt_patch_ver, bt_patch_ver);3656 3657 btcoexist->btc_get(btcoexist,3658 BTC_GET_BL_HS_OPERATION, &bt_hs_on);3659 btcoexist->btc_get(btcoexist,3660 BTC_GET_U1_WIFI_DOT11_CHNL, &wifi_dot_11_chnl);3661 btcoexist->btc_get(btcoexist,3662 BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);3663 seq_printf(m, "\n %-35s = %d / %d(%d)",3664 "Dot11 channel / HsMode(HsChnl)",3665 wifi_dot_11_chnl, bt_hs_on, wifi_hs_chnl);3666 3667 seq_printf(m, "\n %-35s = %3ph ",3668 "H2C Wifi inform bt chnl Info",3669 coex_dm->wifi_chnl_info);3670 3671 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);3672 btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);3673 seq_printf(m, "\n %-35s = %ld/ %ld", "Wifi rssi/ HS rssi",3674 wifi_rssi, bt_hs_rssi);3675 3676 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);3677 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);3678 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);3679 seq_printf(m, "\n %-35s = %d/ %d/ %d ", "Wifi link/ roam/ scan",3680 link, roam, scan);3681 3682 btcoexist->btc_get(btcoexist,3683 BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);3684 btcoexist->btc_get(btcoexist,3685 BTC_GET_U4_WIFI_BW, &wifi_bw);3686 btcoexist->btc_get(btcoexist,3687 BTC_GET_BL_WIFI_BUSY, &wifi_busy);3688 btcoexist->btc_get(btcoexist,3689 BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifi_traffic_dir);3690 seq_printf(m, "\n %-35s = %s / %s/ %s ", "Wifi status",3691 (wifi_under_5g ? "5G" : "2.4G"),3692 ((BTC_WIFI_BW_LEGACY == wifi_bw) ? "Legacy" :3693 (((BTC_WIFI_BW_HT40 == wifi_bw) ? "HT40" : "HT20"))),3694 ((!wifi_busy) ? "idle" :3695 ((BTC_WIFI_TRAFFIC_TX == wifi_traffic_dir) ?3696 "uplink" : "downlink")));3697 3698 if (stack_info->profile_notified) {3699 seq_printf(m, "\n %-35s = %d / %d / %d / %d",3700 "SCO/HID/PAN/A2DP",3701 stack_info->sco_exist, stack_info->hid_exist,3702 stack_info->pan_exist, stack_info->a2dp_exist);3703 3704 btcoexist->btc_disp_dbg_msg(btcoexist,3705 BTC_DBG_DISP_BT_LINK_INFO,3706 m);3707 }3708 3709 bt_info_ext = coex_sta->bt_info_ext;3710 seq_printf(m, "\n %-35s = %s", "BT Info A2DP rate",3711 (bt_info_ext&BIT0) ? "Basic rate" : "EDR rate");3712 3713 for (i = 0; i < BT_INFO_SRC_8821A_2ANT_MAX; i++) {3714 if (coex_sta->bt_info_c2h_cnt[i]) {3715 seq_printf(m, "\n %-35s = %7ph(%d)",3716 glbt_info_src_8821a_2ant[i],3717 coex_sta->bt_info_c2h[i],3718 coex_sta->bt_info_c2h_cnt[i]);3719 }3720 }3721 3722 seq_printf(m, "\n %-35s = %s/%s",3723 "PS state, IPS/LPS",3724 ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),3725 ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")));3726 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);3727 3728 /* Sw mechanism*/3729 seq_printf(m, "\n %-35s",3730 "============[Sw mechanism]============");3731 seq_printf(m, "\n %-35s = %d/ %d/ %d(0x%x) ",3732 "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]",3733 coex_dm->cur_agc_table_en, coex_dm->cur_adc_back_off,3734 coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl);3735 3736 /* Fw mechanism*/3737 seq_printf(m, "\n %-35s",3738 "============[Fw mechanism]============");3739 3740 if (!btcoexist->manual_control) {3741 ps_tdma_case = coex_dm->cur_ps_tdma;3742 seq_printf(m, "\n %-35s = %5ph case-%d",3743 "PS TDMA",3744 coex_dm->ps_tdma_para, ps_tdma_case);3745 3746 seq_printf(m, "\n %-35s = %d/ %d ", "DecBtPwr/ IgnWlanAct",3747 coex_dm->cur_dec_bt_pwr_lvl,3748 coex_dm->cur_ignore_wlan_act);3749 }3750 3751 /* Hw setting*/3752 seq_printf(m, "\n %-35s", "============[Hw setting]============");3753 3754 seq_printf(m, "\n %-35s = 0x%x", "RF-A, 0x1e initVal",3755 coex_dm->bt_rf0x1e_backup);3756 3757 u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);3758 u1tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);3759 seq_printf(m, "\n %-35s = 0x%x/ 0x%x ",3760 "0x778 (W_Act)/ 0x6cc (CoTab Sel)",3761 u1tmp[0], u1tmp[1]);3762 3763 u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x8db);3764 u1tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xc5b);3765 seq_printf(m, "\n %-35s = 0x%x/ 0x%x",3766 "0x8db(ADC)/0xc5b[29:25](DAC)",3767 ((u1tmp[0] & 0x60) >> 5), ((u1tmp[1] & 0x3e) >> 1));3768 3769 u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xcb4);3770 seq_printf(m, "\n %-35s = 0x%x/ 0x%x",3771 "0xcb4[7:0](ctrl)/ 0xcb4[29:28](val)",3772 u4tmp[0] & 0xff, ((u4tmp[0] & 0x30000000) >> 28));3773 3774 u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40);3775 u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);3776 u4tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x974);3777 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",3778 "0x40/ 0x4c[24:23]/ 0x974",3779 u1tmp[0], ((u4tmp[0] & 0x01800000) >> 23), u4tmp[1]);3780 3781 u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);3782 u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);3783 seq_printf(m, "\n %-35s = 0x%x/ 0x%x",3784 "0x550(bcn ctrl)/0x522",3785 u4tmp[0], u1tmp[0]);3786 3787 u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);3788 u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa0a);3789 seq_printf(m, "\n %-35s = 0x%x/ 0x%x",3790 "0xc50(DIG)/0xa0a(CCK-TH)",3791 u4tmp[0], u1tmp[0]);3792 3793 u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xf48);3794 u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);3795 u1tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);3796 seq_printf(m, "\n %-35s = 0x%x/ 0x%x",3797 "OFDM-FA/ CCK-FA",3798 u4tmp[0], (u1tmp[0] << 8) + u1tmp[1]);3799 3800 u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);3801 u4tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);3802 u4tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);3803 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",3804 "0x6c0/0x6c4/0x6c8",3805 u4tmp[0], u4tmp[1], u4tmp[2]);3806 3807 seq_printf(m, "\n %-35s = %d/ %d",3808 "0x770 (hi-pri Rx/Tx)",3809 coex_sta->high_priority_rx, coex_sta->high_priority_tx);3810 seq_printf(m, "\n %-35s = %d/ %d",3811 "0x774(low-pri Rx/Tx)",3812 coex_sta->low_priority_rx, coex_sta->low_priority_tx);3813 3814 /* Tx mgnt queue hang or not, 0x41b should = 0xf, ex: 0xd ==>hang*/3815 u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x41b);3816 seq_printf(m, "\n %-35s = 0x%x",3817 "0x41b (mgntQ hang chk == 0xf)",3818 u1tmp[0]);3819 3820 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);3821}3822 3823void ex_btc8821a2ant_ips_notify(struct btc_coexist *btcoexist, u8 type)3824{3825 struct rtl_priv *rtlpriv = btcoexist->adapter;3826 3827 if (BTC_IPS_ENTER == type) {3828 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3829 "[BTCoex], IPS ENTER notify\n");3830 coex_sta->under_ips = true;3831 btc8821a2ant_wifi_off_hw_cfg(btcoexist);3832 btc8821a2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);3833 btc8821a2ant_coex_all_off(btcoexist);3834 } else if (BTC_IPS_LEAVE == type) {3835 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3836 "[BTCoex], IPS LEAVE notify\n");3837 coex_sta->under_ips = false;3838 ex_btc8821a2ant_init_hwconfig(btcoexist);3839 btc8821a2ant_init_coex_dm(btcoexist);3840 btc8821a2ant_query_bt_info(btcoexist);3841 }3842}3843 3844void ex_btc8821a2ant_lps_notify(struct btc_coexist *btcoexist, u8 type)3845{3846 struct rtl_priv *rtlpriv = btcoexist->adapter;3847 3848 if (BTC_LPS_ENABLE == type) {3849 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3850 "[BTCoex], LPS ENABLE notify\n");3851 coex_sta->under_lps = true;3852 } else if (BTC_LPS_DISABLE == type) {3853 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3854 "[BTCoex], LPS DISABLE notify\n");3855 coex_sta->under_lps = false;3856 }3857}3858 3859void ex_btc8821a2ant_scan_notify(struct btc_coexist *btcoexist, u8 type)3860{3861 struct rtl_priv *rtlpriv = btcoexist->adapter;3862 3863 if (BTC_SCAN_START == type) {3864 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3865 "[BTCoex], SCAN START notify\n");3866 } else if (BTC_SCAN_FINISH == type) {3867 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3868 "[BTCoex], SCAN FINISH notify\n");3869 }3870}3871 3872void ex_btc8821a2ant_connect_notify(struct btc_coexist *btcoexist, u8 type)3873{3874 struct rtl_priv *rtlpriv = btcoexist->adapter;3875 3876 if (BTC_ASSOCIATE_START == type) {3877 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3878 "[BTCoex], CONNECT START notify\n");3879 } else if (BTC_ASSOCIATE_FINISH == type) {3880 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3881 "[BTCoex], CONNECT FINISH notify\n");3882 }3883}3884 3885void ex_btc8821a2ant_media_status_notify(struct btc_coexist *btcoexist,3886 u8 type)3887{3888 struct rtl_priv *rtlpriv = btcoexist->adapter;3889 u8 h2c_parameter[3] = {0};3890 u32 wifi_bw;3891 u8 wifi_central_chnl;3892 u8 ap_num = 0;3893 3894 if (BTC_MEDIA_CONNECT == type) {3895 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3896 "[BTCoex], MEDIA connect notify\n");3897 } else {3898 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3899 "[BTCoex], MEDIA disconnect notify\n");3900 }3901 3902 /* only 2.4G we need to inform bt the chnl mask */3903 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,3904 &wifi_central_chnl);3905 if ((BTC_MEDIA_CONNECT == type) &&3906 (wifi_central_chnl <= 14)) {3907 h2c_parameter[0] = 0x1;3908 h2c_parameter[1] = wifi_central_chnl;3909 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);3910 if (wifi_bw == BTC_WIFI_BW_HT40) {3911 h2c_parameter[2] = 0x30;3912 } else {3913 h2c_parameter[2] = 0x20;3914 if (ap_num < 10)3915 h2c_parameter[2] = 0x30;3916 else3917 h2c_parameter[2] = 0x20;3918 }3919 }3920 3921 coex_dm->wifi_chnl_info[0] = h2c_parameter[0];3922 coex_dm->wifi_chnl_info[1] = h2c_parameter[1];3923 coex_dm->wifi_chnl_info[2] = h2c_parameter[2];3924 3925 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3926 "[BTCoex], FW write 0x66 = 0x%x\n",3927 h2c_parameter[0] << 16 |3928 h2c_parameter[1] << 8 |3929 h2c_parameter[2]);3930 3931 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);3932}3933 3934void ex_btc8821a2ant_special_packet_notify(struct btc_coexist *btcoexist,3935 u8 type)3936{3937 struct rtl_priv *rtlpriv = btcoexist->adapter;3938 3939 if (type == BTC_PACKET_DHCP) {3940 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3941 "[BTCoex], DHCP Packet notify\n");3942 }3943}3944 3945void ex_btc8821a2ant_bt_info_notify(struct btc_coexist *btcoexist,3946 u8 *tmp_buf, u8 length)3947{3948 struct rtl_priv *rtlpriv = btcoexist->adapter;3949 u8 bt_info = 0;3950 u8 i, rsp_source = 0;3951 bool bt_busy = false, limited_dig = false;3952 bool wifi_connected = false, wifi_under_5g = false;3953 3954 coex_sta->c2h_bt_info_req_sent = false;3955 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);3956 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,3957 &wifi_connected);3958 3959 rsp_source = tmp_buf[0] & 0xf;3960 if (rsp_source >= BT_INFO_SRC_8821A_2ANT_MAX)3961 rsp_source = BT_INFO_SRC_8821A_2ANT_WIFI_FW;3962 coex_sta->bt_info_c2h_cnt[rsp_source]++;3963 3964 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3965 "[BTCoex], Bt info[%d], length = %d, hex data = [",3966 rsp_source, length);3967 for (i = 0; i < length; i++) {3968 coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];3969 if (i == 1)3970 bt_info = tmp_buf[i];3971 if (i == length - 1) {3972 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3973 "0x%02x]\n", tmp_buf[i]);3974 } else {3975 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3976 "0x%02x, ", tmp_buf[i]);3977 }3978 }3979 3980 if (btcoexist->manual_control) {3981 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,3982 "[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n");3983 return;3984 }3985 3986 if (BT_INFO_SRC_8821A_2ANT_WIFI_FW != rsp_source) {3987 /* [3:0] */3988 coex_sta->bt_retry_cnt =3989 coex_sta->bt_info_c2h[rsp_source][2]&0xf;3990 3991 coex_sta->bt_rssi =3992 coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;3993 3994 coex_sta->bt_info_ext = coex_sta->bt_info_c2h[rsp_source][4];3995 3996 coex_sta->bt_tx_rx_mask =3997 (coex_sta->bt_info_c2h[rsp_source][2] & 0x40);3998 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK,3999 &coex_sta->bt_tx_rx_mask);4000 if (coex_sta->bt_tx_rx_mask) {4001 /* BT into is responded by BT FW and BT RF REG 0x3C !=4002 * 0x01 => Need to switch BT TRx Mask4003 */4004 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,4005 "[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\n");4006 btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,4007 0x3c, 0x01);4008 }4009 4010 /* Here we need to resend some wifi info to BT4011 * because bt is reset and loss of the info4012 */4013 if ((coex_sta->bt_info_ext & BIT1)) {4014 btcoexist->btc_get(btcoexist,4015 BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);4016 if (wifi_connected) {4017 ex_btc8821a2ant_media_status_notify(btcoexist,4018 BTC_MEDIA_CONNECT);4019 } else {4020 ex_btc8821a2ant_media_status_notify(btcoexist,4021 BTC_MEDIA_DISCONNECT);4022 }4023 4024 }4025 4026 if (!btcoexist->manual_control && !wifi_under_5g) {4027 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,4028 "[BTCoex], BT ext info = 0x%x!!\n",4029 coex_sta->bt_info_ext);4030 if ((coex_sta->bt_info_ext & BIT(3))) {4031 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,4032 "[BTCoex], BT ext info bit3=1, wifi_connected=%d\n",4033 wifi_connected);4034 if (wifi_connected) {4035 rtl_dbg(rtlpriv, COMP_BT_COEXIST,4036 DBG_LOUD,4037 "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");4038 btc8821a2ant_ignore_wlan_act(btcoexist,4039 FORCE_EXEC,4040 false);4041 }4042 } else {4043 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,4044 "[BTCoex], BT ext info bit3=0, wifi_connected=%d\n",4045 wifi_connected);4046 /* BT already NOT ignore Wlan active, do nothing4047 * here.4048 */4049 if (!wifi_connected) {4050 rtl_dbg(rtlpriv, COMP_BT_COEXIST,4051 DBG_LOUD,4052 "[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\n");4053 btc8821a2ant_ignore_wlan_act(4054 btcoexist, FORCE_EXEC, true);4055 }4056 }4057 }4058 }4059 4060 /* check BIT2 first ==> check if bt is under inquiry or page scan*/4061 if (bt_info & BT_INFO_8821A_2ANT_B_INQ_PAGE) {4062 coex_sta->c2h_bt_inquiry_page = true;4063 } else {4064 coex_sta->c2h_bt_inquiry_page = false;4065 }4066 /* set link exist status */4067 if (!(bt_info & BT_INFO_8821A_2ANT_B_CONNECTION)) {4068 coex_sta->bt_link_exist = false;4069 coex_sta->pan_exist = false;4070 coex_sta->a2dp_exist = false;4071 coex_sta->hid_exist = false;4072 coex_sta->sco_exist = false;4073 } else { /* connection exists */4074 coex_sta->bt_link_exist = true;4075 if (bt_info & BT_INFO_8821A_2ANT_B_FTP)4076 coex_sta->pan_exist = true;4077 else4078 coex_sta->pan_exist = false;4079 if (bt_info & BT_INFO_8821A_2ANT_B_A2DP)4080 coex_sta->a2dp_exist = true;4081 else4082 coex_sta->a2dp_exist = false;4083 if (bt_info & BT_INFO_8821A_2ANT_B_HID)4084 coex_sta->hid_exist = true;4085 else4086 coex_sta->hid_exist = false;4087 if (bt_info & BT_INFO_8821A_2ANT_B_SCO_ESCO)4088 coex_sta->sco_exist = true;4089 else4090 coex_sta->sco_exist = false;4091 4092 if ((!coex_sta->hid_exist) &&4093 (!coex_sta->c2h_bt_inquiry_page) &&4094 (!coex_sta->sco_exist)) {4095 if (coex_sta->high_priority_tx +4096 coex_sta->high_priority_rx >= 160)4097 coex_sta->hid_exist = true;4098 }4099 }4100 4101 btc8821a2ant_update_bt_link_info(btcoexist);4102 4103 if (!(bt_info & BT_INFO_8821A_2ANT_B_CONNECTION)) {4104 coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_IDLE;4105 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,4106 "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");4107 } else if (bt_info == BT_INFO_8821A_2ANT_B_CONNECTION) {4108 /* connection exists but no busy */4109 coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_CON_IDLE;4110 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,4111 "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");4112 } else if ((bt_info & BT_INFO_8821A_2ANT_B_SCO_ESCO) ||4113 (bt_info & BT_INFO_8821A_2ANT_B_SCO_BUSY)) {4114 coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_SCO_BUSY;4115 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,4116 "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");4117 } else if (bt_info & BT_INFO_8821A_2ANT_B_ACL_BUSY) {4118 coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_ACL_BUSY;4119 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,4120 "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");4121 } else {4122 coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_MAX;4123 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,4124 "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");4125 }4126 4127 if ((coex_dm->bt_status == BT_8821A_2ANT_BT_STATUS_ACL_BUSY) ||4128 (coex_dm->bt_status == BT_8821A_2ANT_BT_STATUS_SCO_BUSY) ||4129 (coex_dm->bt_status == BT_8821A_2ANT_BT_STATUS_ACL_SCO_BUSY)) {4130 bt_busy = true;4131 limited_dig = true;4132 } else {4133 bt_busy = false;4134 limited_dig = false;4135 }4136 4137 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);4138 4139 coex_dm->limited_dig = limited_dig;4140 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig);4141 4142 btc8821a2ant_run_coexist_mechanism(btcoexist);4143}4144 4145void ex_btc8821a2ant_halt_notify(struct btc_coexist *btcoexist)4146{4147 struct rtl_priv *rtlpriv = btcoexist->adapter;4148 4149 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,4150 "[BTCoex], Halt notify\n");4151 4152 btc8821a2ant_wifi_off_hw_cfg(btcoexist);4153 btc8821a2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);4154 ex_btc8821a2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);4155}4156 4157void ex_btc8821a2ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)4158{4159 struct rtl_priv *rtlpriv = btcoexist->adapter;4160 4161 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Pnp notify\n");4162 4163 if (pnp_state == BTC_WIFI_PNP_SLEEP) {4164 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,4165 "[BTCoex], Pnp notify to SLEEP\n");4166 } else if (pnp_state == BTC_WIFI_PNP_WAKE_UP) {4167 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,4168 "[BTCoex], Pnp notify to WAKE UP\n");4169 ex_btc8821a2ant_init_hwconfig(btcoexist);4170 btc8821a2ant_init_coex_dm(btcoexist);4171 btc8821a2ant_query_bt_info(btcoexist);4172 }4173}4174 4175void ex_btc8821a2ant_periodical(struct btc_coexist *btcoexist)4176{4177 struct rtl_priv *rtlpriv = btcoexist->adapter;4178 4179 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,4180 "[BTCoex], ==========================Periodical===========================\n");4181 4182 if (coex_sta->dis_ver_info_cnt <= 5) {4183 coex_sta->dis_ver_info_cnt += 1;4184 if (coex_sta->dis_ver_info_cnt == 3) {4185 /* Antenna config to set 0x765 = 0x0 (GNT_BT control by4186 * PTA) after initial4187 */4188 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,4189 "[BTCoex], Set GNT_BT control by PTA\n");4190 btc8821a2ant_set_ant_path(btcoexist,4191 BTC_ANT_WIFI_AT_MAIN, false, false);4192 }4193 }4194 4195 if (btcoexist->auto_report_2ant) {4196 btc8821a2ant_query_bt_info(btcoexist);4197 } else {4198 btc8821a2ant_monitor_bt_ctr(btcoexist);4199 btc8821a2ant_monitor_wifi_ctr(btcoexist);4200 4201 if (btc8821a2ant_is_wifi_status_changed(btcoexist) ||4202 coex_dm->auto_tdma_adjust)4203 btc8821a2ant_run_coexist_mechanism(btcoexist);4204 }4205}4206