brintos

brintos / linux-shallow public Read only

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