brintos

brintos / linux-shallow public Read only

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