brintos

brintos / linux-shallow public Read only

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