File Index
Files and directories
Sign in
FILE

halbtc8192e2ant.c

File preview with syntax highlighting.

linux-6.19.14/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8192e2ant.c C
   1// SPDX-License-Identifier: GPL-2.0
   2/* Copyright(c) 2012  Realtek Corporation.*/
   3
   4/**************************************************************
   5 *   include files
   6 **************************************************************/
   7#include "halbt_precomp.h"
   8/**************************************************************
   9 *   Global variables, these are static variables
  10 **************************************************************/
  11static struct coex_dm_8192e_2ant glcoex_dm_8192e_2ant;
  12static struct coex_dm_8192e_2ant *coex_dm = &glcoex_dm_8192e_2ant;
  13static struct coex_sta_8192e_2ant glcoex_sta_8192e_2ant;
  14static struct coex_sta_8192e_2ant *coex_sta = &glcoex_sta_8192e_2ant;
  15
  16static const char *const glbt_info_src_8192e_2ant[] = {
  17	"BT Info[wifi fw]",
  18	"BT Info[bt rsp]",
  19	"BT Info[bt auto report]",
  20};
  21
  22static u32 glcoex_ver_date_8192e_2ant = 20130902;
  23static u32 glcoex_ver_8192e_2ant = 0x34;
  24
  25/**************************************************************
  26 *   local function proto type if needed
  27 **************************************************************/
  28/**************************************************************
  29 *   local function start with btc8192e2ant_
  30 **************************************************************/
  31static u8 btc8192e2ant_bt_rssi_state(struct btc_coexist *btcoexist,
  32				     u8 level_num, u8 rssi_thresh,
  33				     u8 rssi_thresh1)
  34{
  35	struct rtl_priv *rtlpriv = btcoexist->adapter;
  36	int bt_rssi = 0;
  37	u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;
  38
  39	bt_rssi = coex_sta->bt_rssi;
  40
  41	if (level_num == 2) {
  42		if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
  43		    (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
  44			if (bt_rssi >=
  45			    (rssi_thresh + BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))
  46				bt_rssi_state = BTC_RSSI_STATE_HIGH;
  47			else
  48				bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
  49		} else {
  50			if (bt_rssi < rssi_thresh)
  51				bt_rssi_state = BTC_RSSI_STATE_LOW;
  52			else
  53				bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
  54		}
  55	} else if (level_num == 3) {
  56		if (rssi_thresh > rssi_thresh1) {
  57			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
  58				"[BTCoex], BT Rssi thresh error!!\n");
  59			return coex_sta->pre_bt_rssi_state;
  60		}
  61
  62		if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
  63		    (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
  64			if (bt_rssi >=
  65			    (rssi_thresh + BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))
  66				bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
  67			else
  68				bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
  69		} else if ((coex_sta->pre_bt_rssi_state ==
  70			    BTC_RSSI_STATE_MEDIUM) ||
  71			   (coex_sta->pre_bt_rssi_state ==
  72			    BTC_RSSI_STATE_STAY_MEDIUM)) {
  73			if (bt_rssi >= (rssi_thresh1 +
  74					BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))
  75				bt_rssi_state = BTC_RSSI_STATE_HIGH;
  76			else if (bt_rssi < rssi_thresh)
  77				bt_rssi_state = BTC_RSSI_STATE_LOW;
  78			else
  79				bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
  80		} else {
  81			if (bt_rssi < rssi_thresh1)
  82				bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
  83			else
  84				bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
  85		}
  86	}
  87
  88	coex_sta->pre_bt_rssi_state = bt_rssi_state;
  89
  90	return bt_rssi_state;
  91}
  92
  93static u8 btc8192e2ant_wifi_rssi_state(struct btc_coexist *btcoexist,
  94				       u8 index, u8 level_num, u8 rssi_thresh,
  95				       u8 rssi_thresh1)
  96{
  97	struct rtl_priv *rtlpriv = btcoexist->adapter;
  98	int wifi_rssi = 0;
  99	u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
 100
 101	btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
 102
 103	if (level_num == 2) {
 104		if ((coex_sta->pre_wifi_rssi_state[index] ==
 105		     BTC_RSSI_STATE_LOW) ||
 106		    (coex_sta->pre_wifi_rssi_state[index] ==
 107		     BTC_RSSI_STATE_STAY_LOW)) {
 108			if (wifi_rssi >=
 109			    (rssi_thresh + BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))
 110				wifi_rssi_state = BTC_RSSI_STATE_HIGH;
 111			else
 112				wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
 113		} else {
 114			if (wifi_rssi < rssi_thresh)
 115				wifi_rssi_state = BTC_RSSI_STATE_LOW;
 116			else
 117				wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
 118		}
 119	} else if (level_num == 3) {
 120		if (rssi_thresh > rssi_thresh1) {
 121			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 122				"[BTCoex], wifi RSSI thresh error!!\n");
 123			return coex_sta->pre_wifi_rssi_state[index];
 124		}
 125
 126		if ((coex_sta->pre_wifi_rssi_state[index] ==
 127		     BTC_RSSI_STATE_LOW) ||
 128		    (coex_sta->pre_wifi_rssi_state[index] ==
 129		     BTC_RSSI_STATE_STAY_LOW)) {
 130			if (wifi_rssi >=
 131			    (rssi_thresh + BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))
 132				wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
 133			else
 134				wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
 135		} else if ((coex_sta->pre_wifi_rssi_state[index] ==
 136			    BTC_RSSI_STATE_MEDIUM) ||
 137			   (coex_sta->pre_wifi_rssi_state[index] ==
 138			    BTC_RSSI_STATE_STAY_MEDIUM)) {
 139			if (wifi_rssi >= (rssi_thresh1 +
 140					 BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT))
 141				wifi_rssi_state = BTC_RSSI_STATE_HIGH;
 142			else if (wifi_rssi < rssi_thresh)
 143				wifi_rssi_state = BTC_RSSI_STATE_LOW;
 144			else
 145				wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
 146		} else {
 147			if (wifi_rssi < rssi_thresh1)
 148				wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
 149			else
 150				wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
 151		}
 152	}
 153
 154	coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
 155
 156	return wifi_rssi_state;
 157}
 158
 159static void btc8192e2ant_monitor_bt_enable_disable(struct btc_coexist
 160						   *btcoexist)
 161{
 162	struct rtl_priv *rtlpriv = btcoexist->adapter;
 163	static bool pre_bt_disabled;
 164	static u32 bt_disable_cnt;
 165	bool bt_active = true, bt_disabled = false;
 166
 167	/* This function check if bt is disabled */
 168
 169	if (coex_sta->high_priority_tx == 0 &&
 170	    coex_sta->high_priority_rx == 0 &&
 171	    coex_sta->low_priority_tx == 0 &&
 172	    coex_sta->low_priority_rx == 0)
 173		bt_active = false;
 174
 175	if (coex_sta->high_priority_tx == 0xffff &&
 176	    coex_sta->high_priority_rx == 0xffff &&
 177	    coex_sta->low_priority_tx == 0xffff &&
 178	    coex_sta->low_priority_rx == 0xffff)
 179		bt_active = false;
 180
 181	if (bt_active) {
 182		bt_disable_cnt = 0;
 183		bt_disabled = false;
 184		btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
 185				   &bt_disabled);
 186		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 187			"[BTCoex], BT is enabled !!\n");
 188	} else {
 189		bt_disable_cnt++;
 190		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 191			"[BTCoex], bt all counters = 0, %d times!!\n",
 192			bt_disable_cnt);
 193		if (bt_disable_cnt >= 2) {
 194			bt_disabled = true;
 195			btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
 196					   &bt_disabled);
 197			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 198				"[BTCoex], BT is disabled !!\n");
 199		}
 200	}
 201	if (pre_bt_disabled != bt_disabled) {
 202		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 203			"[BTCoex], BT is from %s to %s!!\n",
 204			(pre_bt_disabled ? "disabled" : "enabled"),
 205			(bt_disabled ? "disabled" : "enabled"));
 206		pre_bt_disabled = bt_disabled;
 207	}
 208}
 209
 210static u32 btc8192e2ant_decide_ra_mask(struct btc_coexist *btcoexist,
 211				       u8 ss_type, u32 ra_mask_type)
 212{
 213	u32 dis_ra_mask = 0x0;
 214
 215	switch (ra_mask_type) {
 216	case 0: /* normal mode */
 217		if (ss_type == 2)
 218			dis_ra_mask = 0x0; /* enable 2ss */
 219		else
 220			dis_ra_mask = 0xfff00000; /* disable 2ss */
 221		break;
 222	case 1: /* disable cck 1/2 */
 223		if (ss_type == 2)
 224			dis_ra_mask = 0x00000003; /* enable 2ss */
 225		else
 226			dis_ra_mask = 0xfff00003; /* disable 2ss */
 227		break;
 228	case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
 229		if (ss_type == 2)
 230			dis_ra_mask = 0x0001f1f7; /* enable 2ss */
 231		else
 232			dis_ra_mask = 0xfff1f1f7; /* disable 2ss */
 233		break;
 234	default:
 235		break;
 236	}
 237
 238	return dis_ra_mask;
 239}
 240
 241static void btc8192e2ant_update_ra_mask(struct btc_coexist *btcoexist,
 242					bool force_exec, u32 dis_rate_mask)
 243{
 244	coex_dm->cur_ra_mask = dis_rate_mask;
 245
 246	if (force_exec || (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask))
 247		btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK,
 248				   &coex_dm->cur_ra_mask);
 249	coex_dm->pre_ra_mask = coex_dm->cur_ra_mask;
 250}
 251
 252static void btc8192e2ant_auto_rate_fallback_retry(struct btc_coexist *btcoexist,
 253						  bool force_exec, u8 type)
 254{
 255	bool wifi_under_b_mode = false;
 256
 257	coex_dm->cur_arfr_type = type;
 258
 259	if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {
 260		switch (coex_dm->cur_arfr_type) {
 261		case 0:	/* normal mode */
 262			btcoexist->btc_write_4byte(btcoexist, 0x430,
 263						   coex_dm->backup_arfr_cnt1);
 264			btcoexist->btc_write_4byte(btcoexist, 0x434,
 265						   coex_dm->backup_arfr_cnt2);
 266			break;
 267		case 1:
 268			btcoexist->btc_get(btcoexist,
 269					   BTC_GET_BL_WIFI_UNDER_B_MODE,
 270					   &wifi_under_b_mode);
 271			if (wifi_under_b_mode) {
 272				btcoexist->btc_write_4byte(btcoexist, 0x430,
 273							   0x0);
 274				btcoexist->btc_write_4byte(btcoexist, 0x434,
 275							   0x01010101);
 276			} else {
 277				btcoexist->btc_write_4byte(btcoexist, 0x430,
 278							   0x0);
 279				btcoexist->btc_write_4byte(btcoexist, 0x434,
 280							   0x04030201);
 281			}
 282			break;
 283		default:
 284			break;
 285		}
 286	}
 287
 288	coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;
 289}
 290
 291static void btc8192e2ant_retry_limit(struct btc_coexist *btcoexist,
 292				     bool force_exec, u8 type)
 293{
 294	coex_dm->cur_retry_limit_type = type;
 295
 296	if (force_exec || (coex_dm->pre_retry_limit_type !=
 297			   coex_dm->cur_retry_limit_type)) {
 298		switch (coex_dm->cur_retry_limit_type) {
 299		case 0:	/* normal mode */
 300			btcoexist->btc_write_2byte(btcoexist, 0x42a,
 301						   coex_dm->backup_retry_limit);
 302			break;
 303		case 1:	/* retry limit = 8 */
 304			btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);
 305			break;
 306		default:
 307			break;
 308		}
 309	}
 310
 311	coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;
 312}
 313
 314static void btc8192e2ant_ampdu_maxtime(struct btc_coexist *btcoexist,
 315				       bool force_exec, u8 type)
 316{
 317	coex_dm->cur_ampdu_time_type = type;
 318
 319	if (force_exec || (coex_dm->pre_ampdu_time_type !=
 320			   coex_dm->cur_ampdu_time_type)) {
 321		switch (coex_dm->cur_ampdu_time_type) {
 322		case 0:	/* normal mode */
 323			btcoexist->btc_write_1byte(btcoexist, 0x456,
 324						coex_dm->backup_ampdu_maxtime);
 325			break;
 326		case 1:	/* AMPDU time = 0x38 * 32us */
 327			btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);
 328			break;
 329		default:
 330			break;
 331		}
 332	}
 333
 334	coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;
 335}
 336
 337static void btc8192e2ant_limited_tx(struct btc_coexist *btcoexist,
 338				    bool force_exec, u8 ra_mask_type,
 339				    u8 arfr_type, u8 retry_limit_type,
 340				    u8 ampdu_time_type)
 341{
 342	u32 dis_ra_mask = 0x0;
 343
 344	coex_dm->cur_ra_mask_type = ra_mask_type;
 345	dis_ra_mask =
 346		 btc8192e2ant_decide_ra_mask(btcoexist, coex_dm->cur_ss_type,
 347					     ra_mask_type);
 348	btc8192e2ant_update_ra_mask(btcoexist, force_exec, dis_ra_mask);
 349	btc8192e2ant_auto_rate_fallback_retry(btcoexist, force_exec, arfr_type);
 350	btc8192e2ant_retry_limit(btcoexist, force_exec, retry_limit_type);
 351	btc8192e2ant_ampdu_maxtime(btcoexist, force_exec, ampdu_time_type);
 352}
 353
 354static void btc8192e2ant_limited_rx(struct btc_coexist *btcoexist,
 355				    bool force_exec, bool rej_ap_agg_pkt,
 356				    bool bt_ctrl_agg_buf_size,
 357				    u8 agg_buf_size)
 358{
 359	bool reject_rx_agg = rej_ap_agg_pkt;
 360	bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
 361	u8 rx_agg_size = agg_buf_size;
 362
 363	/*********************************************
 364	 *	Rx Aggregation related setting
 365	 *********************************************/
 366	btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
 367			   &reject_rx_agg);
 368	/* decide BT control aggregation buf size or not */
 369	btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
 370			   &bt_ctrl_rx_agg_size);
 371	/* aggregation buf size, only work
 372	 * when BT control Rx aggregation size.
 373	 */
 374	btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
 375	/* real update aggregation setting */
 376	btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
 377}
 378
 379static void btc8192e2ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
 380{
 381	struct rtl_priv *rtlpriv = btcoexist->adapter;
 382	u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
 383	u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
 384
 385	reg_hp_txrx = 0x770;
 386	reg_lp_txrx = 0x774;
 387
 388	u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
 389	reg_hp_tx = u32tmp & MASKLWORD;
 390	reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
 391
 392	u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
 393	reg_lp_tx = u32tmp & MASKLWORD;
 394	reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
 395
 396	coex_sta->high_priority_tx = reg_hp_tx;
 397	coex_sta->high_priority_rx = reg_hp_rx;
 398	coex_sta->low_priority_tx = reg_lp_tx;
 399	coex_sta->low_priority_rx = reg_lp_rx;
 400
 401	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 402		"[BTCoex] High Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",
 403		reg_hp_txrx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);
 404	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 405		"[BTCoex] Low Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",
 406		reg_lp_txrx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx);
 407
 408	/* reset counter */
 409	btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
 410}
 411
 412static void btc8192e2ant_query_bt_info(struct btc_coexist *btcoexist)
 413{
 414	struct rtl_priv *rtlpriv = btcoexist->adapter;
 415	u8 h2c_parameter[1] = {0};
 416
 417	coex_sta->c2h_bt_info_req_sent = true;
 418
 419	h2c_parameter[0] |= BIT0; /* trigger */
 420
 421	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 422		"[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n",
 423		h2c_parameter[0]);
 424
 425	btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
 426}
 427
 428static
 429bool btc8192e2ant_is_wifi_status_changed(struct btc_coexist *btcoexist)
 430{
 431	static bool pre_wifi_busy = false, pre_under_4way = false,
 432		    pre_bt_hs_on = false;
 433	bool wifi_busy = false, under_4way = false, bt_hs_on = false;
 434	bool wifi_connected = false;
 435
 436	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
 437			   &wifi_connected);
 438	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
 439	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
 440	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
 441			   &under_4way);
 442
 443	if (wifi_connected) {
 444		if (wifi_busy != pre_wifi_busy) {
 445			pre_wifi_busy = wifi_busy;
 446			return true;
 447		}
 448		if (under_4way != pre_under_4way) {
 449			pre_under_4way = under_4way;
 450			return true;
 451		}
 452		if (bt_hs_on != pre_bt_hs_on) {
 453			pre_bt_hs_on = bt_hs_on;
 454			return true;
 455		}
 456	}
 457
 458	return false;
 459}
 460
 461static void btc8192e2ant_update_bt_link_info(struct btc_coexist *btcoexist)
 462{
 463	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
 464	bool bt_hs_on = false;
 465
 466	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
 467
 468	bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
 469	bt_link_info->sco_exist = coex_sta->sco_exist;
 470	bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
 471	bt_link_info->pan_exist = coex_sta->pan_exist;
 472	bt_link_info->hid_exist = coex_sta->hid_exist;
 473
 474	/* work around for HS mode. */
 475	if (bt_hs_on) {
 476		bt_link_info->pan_exist = true;
 477		bt_link_info->bt_link_exist = true;
 478	}
 479
 480	/* check if Sco only */
 481	if (bt_link_info->sco_exist &&
 482	    !bt_link_info->a2dp_exist &&
 483	    !bt_link_info->pan_exist &&
 484	    !bt_link_info->hid_exist)
 485		bt_link_info->sco_only = true;
 486	else
 487		bt_link_info->sco_only = false;
 488
 489	/* check if A2dp only */
 490	if (!bt_link_info->sco_exist &&
 491	    bt_link_info->a2dp_exist &&
 492	    !bt_link_info->pan_exist &&
 493	    !bt_link_info->hid_exist)
 494		bt_link_info->a2dp_only = true;
 495	else
 496		bt_link_info->a2dp_only = false;
 497
 498	/* check if Pan only */
 499	if (!bt_link_info->sco_exist &&
 500	    !bt_link_info->a2dp_exist &&
 501	    bt_link_info->pan_exist &&
 502	    !bt_link_info->hid_exist)
 503		bt_link_info->pan_only = true;
 504	else
 505		bt_link_info->pan_only = false;
 506
 507	/* check if Hid only */
 508	if (!bt_link_info->sco_exist &&
 509	    !bt_link_info->a2dp_exist &&
 510	    !bt_link_info->pan_exist &&
 511	    bt_link_info->hid_exist)
 512		bt_link_info->hid_only = true;
 513	else
 514		bt_link_info->hid_only = false;
 515}
 516
 517static u8 btc8192e2ant_action_algorithm(struct btc_coexist *btcoexist)
 518{
 519	struct rtl_priv *rtlpriv = btcoexist->adapter;
 520	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
 521	struct btc_stack_info *stack_info = &btcoexist->stack_info;
 522	bool bt_hs_on = false;
 523	u8 algorithm = BT_8192E_2ANT_COEX_ALGO_UNDEFINED;
 524	u8 num_of_diff_profile = 0;
 525
 526	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
 527
 528	if (!bt_link_info->bt_link_exist) {
 529		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 530			"No BT link exists!!!\n");
 531		return algorithm;
 532	}
 533
 534	if (bt_link_info->sco_exist)
 535		num_of_diff_profile++;
 536	if (bt_link_info->hid_exist)
 537		num_of_diff_profile++;
 538	if (bt_link_info->pan_exist)
 539		num_of_diff_profile++;
 540	if (bt_link_info->a2dp_exist)
 541		num_of_diff_profile++;
 542
 543	if (num_of_diff_profile == 1) {
 544		if (bt_link_info->sco_exist) {
 545			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 546				"SCO only\n");
 547			algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
 548		} else {
 549			if (bt_link_info->hid_exist) {
 550				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 551					"HID only\n");
 552				algorithm = BT_8192E_2ANT_COEX_ALGO_HID;
 553			} else if (bt_link_info->a2dp_exist) {
 554				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 555					"A2DP only\n");
 556				algorithm = BT_8192E_2ANT_COEX_ALGO_A2DP;
 557			} else if (bt_link_info->pan_exist) {
 558				if (bt_hs_on) {
 559					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 560						DBG_LOUD,
 561						"PAN(HS) only\n");
 562					algorithm =
 563						BT_8192E_2ANT_COEX_ALGO_PANHS;
 564				} else {
 565					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 566						DBG_LOUD,
 567						"PAN(EDR) only\n");
 568					algorithm =
 569						BT_8192E_2ANT_COEX_ALGO_PANEDR;
 570				}
 571			}
 572		}
 573	} else if (num_of_diff_profile == 2) {
 574		if (bt_link_info->sco_exist) {
 575			if (bt_link_info->hid_exist) {
 576				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 577					"SCO + HID\n");
 578				algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
 579			} else if (bt_link_info->a2dp_exist) {
 580				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 581					"SCO + A2DP ==> SCO\n");
 582				algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
 583			} else if (bt_link_info->pan_exist) {
 584				if (bt_hs_on) {
 585					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 586						DBG_LOUD,
 587						 "SCO + PAN(HS)\n");
 588					algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
 589				} else {
 590					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 591						DBG_LOUD,
 592						 "SCO + PAN(EDR)\n");
 593					algorithm =
 594						BT_8192E_2ANT_COEX_ALGO_SCO_PAN;
 595				}
 596			}
 597		} else {
 598			if (bt_link_info->hid_exist &&
 599			    bt_link_info->a2dp_exist) {
 600				if (stack_info->num_of_hid >= 2) {
 601					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 602						DBG_LOUD,
 603						 "HID*2 + A2DP\n");
 604					algorithm =
 605					BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
 606				} else {
 607					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 608						DBG_LOUD,
 609						 "HID + A2DP\n");
 610					algorithm =
 611					    BT_8192E_2ANT_COEX_ALGO_HID_A2DP;
 612				}
 613			} else if (bt_link_info->hid_exist &&
 614				   bt_link_info->pan_exist) {
 615				if (bt_hs_on) {
 616					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 617						DBG_LOUD,
 618						 "HID + PAN(HS)\n");
 619					algorithm = BT_8192E_2ANT_COEX_ALGO_HID;
 620				} else {
 621					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 622						DBG_LOUD,
 623						"HID + PAN(EDR)\n");
 624					algorithm =
 625					    BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
 626				}
 627			} else if (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						"A2DP + PAN(HS)\n");
 633					algorithm =
 634					    BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS;
 635				} else {
 636					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 637						DBG_LOUD,
 638						"A2DP + PAN(EDR)\n");
 639					algorithm =
 640					    BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP;
 641				}
 642			}
 643		}
 644	} else if (num_of_diff_profile == 3) {
 645		if (bt_link_info->sco_exist) {
 646			if (bt_link_info->hid_exist &&
 647			    bt_link_info->a2dp_exist) {
 648				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 649					"SCO + HID + A2DP ==> HID\n");
 650				algorithm = BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
 651			} else if (bt_link_info->hid_exist &&
 652				   bt_link_info->pan_exist) {
 653				if (bt_hs_on) {
 654					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 655						DBG_LOUD,
 656						"SCO + HID + PAN(HS)\n");
 657					algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
 658				} else {
 659					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 660						DBG_LOUD,
 661						"SCO + HID + PAN(EDR)\n");
 662					algorithm =
 663						BT_8192E_2ANT_COEX_ALGO_SCO_PAN;
 664				}
 665			} else if (bt_link_info->pan_exist &&
 666				   bt_link_info->a2dp_exist) {
 667				if (bt_hs_on) {
 668					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 669						DBG_LOUD,
 670						"SCO + A2DP + PAN(HS)\n");
 671					algorithm = BT_8192E_2ANT_COEX_ALGO_SCO;
 672				} else {
 673					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 674						DBG_LOUD,
 675						"SCO + A2DP + PAN(EDR)\n");
 676					algorithm =
 677					    BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
 678				}
 679			}
 680		} else {
 681			if (bt_link_info->hid_exist &&
 682			    bt_link_info->pan_exist &&
 683			    bt_link_info->a2dp_exist) {
 684				if (bt_hs_on) {
 685					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 686						DBG_LOUD,
 687						"HID + A2DP + PAN(HS)\n");
 688					algorithm =
 689					    BT_8192E_2ANT_COEX_ALGO_HID_A2DP;
 690				} else {
 691					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 692						DBG_LOUD,
 693						"HID + A2DP + PAN(EDR)\n");
 694					algorithm =
 695					BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
 696				}
 697			}
 698		}
 699	} else if (num_of_diff_profile >= 3) {
 700		if (bt_link_info->sco_exist) {
 701			if (bt_link_info->hid_exist &&
 702			    bt_link_info->pan_exist &&
 703			    bt_link_info->a2dp_exist) {
 704				if (bt_hs_on) {
 705					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 706						DBG_LOUD,
 707						"ErrorSCO+HID+A2DP+PAN(HS)\n");
 708
 709				} else {
 710					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
 711						DBG_LOUD,
 712						"SCO+HID+A2DP+PAN(EDR)\n");
 713					algorithm =
 714					    BT_8192E_2ANT_COEX_ALGO_PANEDR_HID;
 715				}
 716			}
 717		}
 718	}
 719
 720	return algorithm;
 721}
 722
 723static void btc8192e2ant_set_fw_dac_swing_level(struct btc_coexist *btcoexist,
 724						u8 dac_swing_lvl)
 725{
 726	struct rtl_priv *rtlpriv = btcoexist->adapter;
 727	u8 h2c_parameter[1] = {0};
 728
 729	/* There are several type of dacswing
 730	 * 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6
 731	 */
 732	h2c_parameter[0] = dac_swing_lvl;
 733
 734	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 735		"[BTCoex], Set Dac Swing Level = 0x%x\n", dac_swing_lvl);
 736	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 737		"[BTCoex], FW write 0x64 = 0x%x\n", h2c_parameter[0]);
 738
 739	btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);
 740}
 741
 742static void btc8192e2ant_set_fw_dec_bt_pwr(struct btc_coexist *btcoexist,
 743					   u8 dec_bt_pwr_lvl)
 744{
 745	struct rtl_priv *rtlpriv = btcoexist->adapter;
 746	u8 h2c_parameter[1] = {0};
 747
 748	h2c_parameter[0] = dec_bt_pwr_lvl;
 749
 750	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 751		"[BTCoex] decrease Bt Power level = %d, FW write 0x62 = 0x%x\n",
 752		dec_bt_pwr_lvl, h2c_parameter[0]);
 753
 754	btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter);
 755}
 756
 757static void btc8192e2ant_dec_bt_pwr(struct btc_coexist *btcoexist,
 758				    bool force_exec, u8 dec_bt_pwr_lvl)
 759{
 760	struct rtl_priv *rtlpriv = btcoexist->adapter;
 761
 762	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 763		"[BTCoex], %s Dec BT power level = %d\n",
 764		force_exec ? "force to" : "", dec_bt_pwr_lvl);
 765	coex_dm->cur_dec_bt_pwr = dec_bt_pwr_lvl;
 766
 767	if (!force_exec) {
 768		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 769			"[BTCoex], preBtDecPwrLvl=%d, curBtDecPwrLvl=%d\n",
 770			coex_dm->pre_dec_bt_pwr, coex_dm->cur_dec_bt_pwr);
 771	}
 772	btc8192e2ant_set_fw_dec_bt_pwr(btcoexist, coex_dm->cur_dec_bt_pwr);
 773
 774	coex_dm->pre_dec_bt_pwr = coex_dm->cur_dec_bt_pwr;
 775}
 776
 777static void btc8192e2ant_set_bt_auto_report(struct btc_coexist *btcoexist,
 778					    bool enable_auto_report)
 779{
 780	struct rtl_priv *rtlpriv = btcoexist->adapter;
 781	u8 h2c_parameter[1] = {0};
 782
 783	h2c_parameter[0] = 0;
 784
 785	if (enable_auto_report)
 786		h2c_parameter[0] |= BIT0;
 787
 788	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 789		"[BTCoex], BT FW auto report : %s, FW write 0x68 = 0x%x\n",
 790		(enable_auto_report ? "Enabled!!" : "Disabled!!"),
 791		 h2c_parameter[0]);
 792
 793	btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
 794}
 795
 796static void btc8192e2ant_bt_auto_report(struct btc_coexist *btcoexist,
 797					bool force_exec,
 798					bool enable_auto_report)
 799{
 800	struct rtl_priv *rtlpriv = btcoexist->adapter;
 801
 802	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 803		"[BTCoex], %s BT Auto report = %s\n",
 804		(force_exec ? "force to" : ""),
 805		 ((enable_auto_report) ? "Enabled" : "Disabled"));
 806	coex_dm->cur_bt_auto_report = enable_auto_report;
 807
 808	if (!force_exec) {
 809		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 810			"[BTCoex] bPreBtAutoReport=%d, bCurBtAutoReport=%d\n",
 811			coex_dm->pre_bt_auto_report,
 812			coex_dm->cur_bt_auto_report);
 813
 814		if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
 815			return;
 816	}
 817	btc8192e2ant_set_bt_auto_report(btcoexist,
 818					coex_dm->cur_bt_auto_report);
 819
 820	coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
 821}
 822
 823static void btc8192e2ant_fw_dac_swing_lvl(struct btc_coexist *btcoexist,
 824					  bool force_exec, u8 fw_dac_swing_lvl)
 825{
 826	struct rtl_priv *rtlpriv = btcoexist->adapter;
 827
 828	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 829		"[BTCoex], %s set FW Dac Swing level = %d\n",
 830		(force_exec ? "force to" : ""), fw_dac_swing_lvl);
 831	coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl;
 832
 833	if (!force_exec) {
 834		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 835			"[BTCoex] preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n",
 836			coex_dm->pre_fw_dac_swing_lvl,
 837			coex_dm->cur_fw_dac_swing_lvl);
 838
 839		if (coex_dm->pre_fw_dac_swing_lvl ==
 840		    coex_dm->cur_fw_dac_swing_lvl)
 841			return;
 842	}
 843
 844	btc8192e2ant_set_fw_dac_swing_level(btcoexist,
 845					    coex_dm->cur_fw_dac_swing_lvl);
 846
 847	coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;
 848}
 849
 850static void btc8192e2ant_set_sw_rf_rx_lpf_corner(struct btc_coexist *btcoexist,
 851						 bool rx_rf_shrink_on)
 852{
 853	struct rtl_priv *rtlpriv = btcoexist->adapter;
 854
 855	if (rx_rf_shrink_on) {
 856		/* Shrink RF Rx LPF corner */
 857		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 858			"[BTCoex], Shrink RF Rx LPF corner!!\n");
 859		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
 860					  0xfffff, 0xffffc);
 861	} else {
 862		/* Resume RF Rx LPF corner
 863		 * After initialized, we can use coex_dm->btRf0x1eBackup
 864		 */
 865		if (btcoexist->initialized) {
 866			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 867				"[BTCoex], Resume RF Rx LPF corner!!\n");
 868			btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
 869						  0xfffff,
 870						  coex_dm->bt_rf0x1e_backup);
 871		}
 872	}
 873}
 874
 875static void btc8192e2ant_rf_shrink(struct btc_coexist *btcoexist,
 876				   bool force_exec, bool rx_rf_shrink_on)
 877{
 878	struct rtl_priv *rtlpriv = btcoexist->adapter;
 879
 880	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 881		"[BTCoex], %s turn Rx RF Shrink = %s\n",
 882		(force_exec ? "force to" : ""),
 883		((rx_rf_shrink_on) ? "ON" : "OFF"));
 884	coex_dm->cur_rf_rx_lpf_shrink = rx_rf_shrink_on;
 885
 886	if (!force_exec) {
 887		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 888			"[BTCoex]bPreRfRxLpfShrink=%d,bCurRfRxLpfShrink=%d\n",
 889			coex_dm->pre_rf_rx_lpf_shrink,
 890			coex_dm->cur_rf_rx_lpf_shrink);
 891
 892		if (coex_dm->pre_rf_rx_lpf_shrink ==
 893		    coex_dm->cur_rf_rx_lpf_shrink)
 894			return;
 895	}
 896	btc8192e2ant_set_sw_rf_rx_lpf_corner(btcoexist,
 897					     coex_dm->cur_rf_rx_lpf_shrink);
 898
 899	coex_dm->pre_rf_rx_lpf_shrink = coex_dm->cur_rf_rx_lpf_shrink;
 900}
 901
 902static void btc8192e2ant_set_dac_swing_reg(struct btc_coexist *btcoexist,
 903					   u32 level)
 904{
 905	struct rtl_priv *rtlpriv = btcoexist->adapter;
 906	u8 val = (u8)level;
 907
 908	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 909		"[BTCoex], Write SwDacSwing = 0x%x\n", level);
 910	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x883, 0x3e, val);
 911}
 912
 913static void btc8192e2ant_set_sw_full_swing(struct btc_coexist *btcoexist,
 914					   bool sw_dac_swing_on,
 915					   u32 sw_dac_swing_lvl)
 916{
 917	if (sw_dac_swing_on)
 918		btc8192e2ant_set_dac_swing_reg(btcoexist, sw_dac_swing_lvl);
 919	else
 920		btc8192e2ant_set_dac_swing_reg(btcoexist, 0x18);
 921}
 922
 923static void btc8192e2ant_dac_swing(struct btc_coexist *btcoexist,
 924				   bool force_exec, bool dac_swing_on,
 925				   u32 dac_swing_lvl)
 926{
 927	struct rtl_priv *rtlpriv = btcoexist->adapter;
 928
 929	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 930		"[BTCoex], %s turn DacSwing=%s, dac_swing_lvl = 0x%x\n",
 931		(force_exec ? "force to" : ""),
 932		((dac_swing_on) ? "ON" : "OFF"), dac_swing_lvl);
 933	coex_dm->cur_dac_swing_on = dac_swing_on;
 934	coex_dm->cur_dac_swing_lvl = dac_swing_lvl;
 935
 936	if (!force_exec) {
 937		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 938			"[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl = 0x%x, ",
 939			coex_dm->pre_dac_swing_on,
 940			coex_dm->pre_dac_swing_lvl);
 941		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 942			"bCurDacSwingOn=%d, curDacSwingLvl = 0x%x\n",
 943			coex_dm->cur_dac_swing_on,
 944			coex_dm->cur_dac_swing_lvl);
 945
 946		if ((coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) &&
 947		    (coex_dm->pre_dac_swing_lvl == coex_dm->cur_dac_swing_lvl))
 948			return;
 949	}
 950	mdelay(30);
 951	btc8192e2ant_set_sw_full_swing(btcoexist, dac_swing_on, dac_swing_lvl);
 952
 953	coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on;
 954	coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl;
 955}
 956
 957static void btc8192e2ant_set_agc_table(struct btc_coexist *btcoexist,
 958				       bool agc_table_en)
 959{
 960	struct rtl_priv *rtlpriv = btcoexist->adapter;
 961
 962	/* BB AGC Gain Table */
 963	if (agc_table_en) {
 964		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 965			"[BTCoex], BB Agc Table On!\n");
 966		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x0a1A0001);
 967		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x091B0001);
 968		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x081C0001);
 969		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x071D0001);
 970		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x061E0001);
 971		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x051F0001);
 972	} else {
 973		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 974			"[BTCoex], BB Agc Table Off!\n");
 975		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xaa1A0001);
 976		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa91B0001);
 977		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa81C0001);
 978		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa71D0001);
 979		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa61E0001);
 980		btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa51F0001);
 981	}
 982}
 983
 984static void btc8192e2ant_agc_table(struct btc_coexist *btcoexist,
 985				   bool force_exec, bool agc_table_en)
 986{
 987	struct rtl_priv *rtlpriv = btcoexist->adapter;
 988
 989	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 990		"[BTCoex], %s %s Agc Table\n",
 991		(force_exec ? "force to" : ""),
 992		((agc_table_en) ? "Enable" : "Disable"));
 993	coex_dm->cur_agc_table_en = agc_table_en;
 994
 995	if (!force_exec) {
 996		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
 997			"[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n",
 998			coex_dm->pre_agc_table_en,
 999			coex_dm->cur_agc_table_en);
1000
1001		if (coex_dm->pre_agc_table_en == coex_dm->cur_agc_table_en)
1002			return;
1003	}
1004	btc8192e2ant_set_agc_table(btcoexist, agc_table_en);
1005
1006	coex_dm->pre_agc_table_en = coex_dm->cur_agc_table_en;
1007}
1008
1009static void btc8192e2ant_set_coex_table(struct btc_coexist *btcoexist,
1010					u32 val0x6c0, u32 val0x6c4,
1011					u32 val0x6c8, u8 val0x6cc)
1012{
1013	struct rtl_priv *rtlpriv = btcoexist->adapter;
1014
1015	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1016		"[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0);
1017	btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
1018
1019	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1020		"[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4);
1021	btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
1022
1023	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1024		"[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8);
1025	btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
1026
1027	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1028		"[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc);
1029	btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
1030}
1031
1032static void btc8192e2ant_coex_table(struct btc_coexist *btcoexist,
1033				    bool force_exec, u32 val0x6c0, u32 val0x6c4,
1034				    u32 val0x6c8, u8 val0x6cc)
1035{
1036	struct rtl_priv *rtlpriv = btcoexist->adapter;
1037
1038	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1039		"[BTCoex], %s write Coex Table 0x6c0 = 0x%x, ",
1040		(force_exec ? "force to" : ""), val0x6c0);
1041	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1042		"0x6c4 = 0x%x, 0x6c8 = 0x%x, 0x6cc = 0x%x\n",
1043		val0x6c4, val0x6c8, val0x6cc);
1044	coex_dm->cur_val0x6c0 = val0x6c0;
1045	coex_dm->cur_val0x6c4 = val0x6c4;
1046	coex_dm->cur_val0x6c8 = val0x6c8;
1047	coex_dm->cur_val0x6cc = val0x6cc;
1048
1049	if (!force_exec) {
1050		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1051			"[BTCoex], preVal0x6c0 = 0x%x, preVal0x6c4 = 0x%x, ",
1052			coex_dm->pre_val0x6c0, coex_dm->pre_val0x6c4);
1053		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1054			"preVal0x6c8 = 0x%x, preVal0x6cc = 0x%x !!\n",
1055			coex_dm->pre_val0x6c8, coex_dm->pre_val0x6cc);
1056		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1057			"[BTCoex], curVal0x6c0 = 0x%x, curVal0x6c4 = 0x%x\n",
1058			coex_dm->cur_val0x6c0, coex_dm->cur_val0x6c4);
1059		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1060			"curVal0x6c8 = 0x%x, curVal0x6cc = 0x%x !!\n",
1061			coex_dm->cur_val0x6c8, coex_dm->cur_val0x6cc);
1062
1063		if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
1064		    (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
1065		    (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
1066		    (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
1067			return;
1068	}
1069	btc8192e2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8,
1070				    val0x6cc);
1071
1072	coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
1073	coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
1074	coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
1075	coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
1076}
1077
1078static void btc8192e2ant_coex_table_with_type(struct btc_coexist *btcoexist,
1079					      bool force_exec, u8 type)
1080{
1081	switch (type) {
1082	case 0:
1083		btc8192e2ant_coex_table(btcoexist, force_exec, 0x55555555,
1084					0x5a5a5a5a, 0xffffff, 0x3);
1085		break;
1086	case 1:
1087		btc8192e2ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
1088					0x5a5a5a5a, 0xffffff, 0x3);
1089		break;
1090	case 2:
1091		btc8192e2ant_coex_table(btcoexist, force_exec, 0x55555555,
1092					0x5ffb5ffb, 0xffffff, 0x3);
1093		break;
1094	case 3:
1095		btc8192e2ant_coex_table(btcoexist, force_exec, 0xdfffdfff,
1096					0x5fdb5fdb, 0xffffff, 0x3);
1097		break;
1098	case 4:
1099		btc8192e2ant_coex_table(btcoexist, force_exec, 0xdfffdfff,
1100					0x5ffb5ffb, 0xffffff, 0x3);
1101		break;
1102	default:
1103		break;
1104	}
1105}
1106
1107static void btc8192e2ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,
1108						bool enable)
1109{
1110	struct rtl_priv *rtlpriv = btcoexist->adapter;
1111	u8 h2c_parameter[1] = {0};
1112
1113	if (enable)
1114		h2c_parameter[0] |= BIT0; /* function enable */
1115
1116	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1117		"[BTCoex]set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
1118		h2c_parameter[0]);
1119
1120	btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
1121}
1122
1123static void btc8192e2ant_ignore_wlan_act(struct btc_coexist *btcoexist,
1124					 bool force_exec, bool enable)
1125{
1126	struct rtl_priv *rtlpriv = btcoexist->adapter;
1127
1128	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1129		"[BTCoex], %s turn Ignore WlanAct %s\n",
1130		(force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
1131	coex_dm->cur_ignore_wlan_act = enable;
1132
1133	if (!force_exec) {
1134		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1135			"[BTCoex], bPreIgnoreWlanAct = %d ",
1136			coex_dm->pre_ignore_wlan_act);
1137		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1138			"bCurIgnoreWlanAct = %d!!\n",
1139			coex_dm->cur_ignore_wlan_act);
1140
1141		if (coex_dm->pre_ignore_wlan_act ==
1142		    coex_dm->cur_ignore_wlan_act)
1143			return;
1144	}
1145	btc8192e2ant_set_fw_ignore_wlan_act(btcoexist, enable);
1146
1147	coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
1148}
1149
1150static void btc8192e2ant_set_fw_ps_tdma(struct btc_coexist *btcoexist, u8 byte1,
1151					u8 byte2, u8 byte3, u8 byte4, u8 byte5)
1152{
1153	struct rtl_priv *rtlpriv = btcoexist->adapter;
1154
1155	u8 h2c_parameter[5] = {0};
1156
1157	h2c_parameter[0] = byte1;
1158	h2c_parameter[1] = byte2;
1159	h2c_parameter[2] = byte3;
1160	h2c_parameter[3] = byte4;
1161	h2c_parameter[4] = byte5;
1162
1163	coex_dm->ps_tdma_para[0] = byte1;
1164	coex_dm->ps_tdma_para[1] = byte2;
1165	coex_dm->ps_tdma_para[2] = byte3;
1166	coex_dm->ps_tdma_para[3] = byte4;
1167	coex_dm->ps_tdma_para[4] = byte5;
1168
1169	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1170		"[BTCoex], FW write 0x60(5bytes) = 0x%x%08x\n",
1171		h2c_parameter[0],
1172		h2c_parameter[1] << 24 | h2c_parameter[2] << 16 |
1173		h2c_parameter[3] << 8 | h2c_parameter[4]);
1174
1175	btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1176}
1177
1178static void btc8192e2ant_sw_mechanism1(struct btc_coexist *btcoexist,
1179				       bool shrink_rx_lpf, bool low_penalty_ra,
1180				       bool limited_dig, bool btlan_constrain)
1181{
1182	btc8192e2ant_rf_shrink(btcoexist, NORMAL_EXEC, shrink_rx_lpf);
1183}
1184
1185static void btc8192e2ant_sw_mechanism2(struct btc_coexist *btcoexist,
1186				       bool agc_table_shift, bool adc_backoff,
1187				       bool sw_dac_swing, u32 dac_swing_lvl)
1188{
1189	btc8192e2ant_agc_table(btcoexist, NORMAL_EXEC, agc_table_shift);
1190	btc8192e2ant_dac_swing(btcoexist, NORMAL_EXEC, sw_dac_swing,
1191			       dac_swing_lvl);
1192}
1193
1194static void btc8192e2ant_ps_tdma(struct btc_coexist *btcoexist,
1195				 bool force_exec, bool turn_on, u8 type)
1196{
1197	struct rtl_priv *rtlpriv = btcoexist->adapter;
1198
1199	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1200		"[BTCoex], %s turn %s PS TDMA, type=%d\n",
1201		(force_exec ? "force to" : ""),
1202		(turn_on ? "ON" : "OFF"), type);
1203	coex_dm->cur_ps_tdma_on = turn_on;
1204	coex_dm->cur_ps_tdma = type;
1205
1206	if (!force_exec) {
1207		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1208			"[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n",
1209			coex_dm->pre_ps_tdma_on, coex_dm->cur_ps_tdma_on);
1210		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1211			"[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n",
1212			coex_dm->pre_ps_tdma, coex_dm->cur_ps_tdma);
1213
1214		if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1215		    (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1216			return;
1217	}
1218	if (turn_on) {
1219		switch (type) {
1220		case 1:
1221		default:
1222			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
1223						    0x1a, 0xe1, 0x90);
1224			break;
1225		case 2:
1226			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
1227						    0x12, 0xe1, 0x90);
1228			break;
1229		case 3:
1230			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1231						    0x3, 0xf1, 0x90);
1232			break;
1233		case 4:
1234			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
1235						    0x3, 0xf1, 0x90);
1236			break;
1237		case 5:
1238			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
1239						    0x1a, 0x60, 0x90);
1240			break;
1241		case 6:
1242			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
1243						    0x12, 0x60, 0x90);
1244			break;
1245		case 7:
1246			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1247						    0x3, 0x70, 0x90);
1248			break;
1249		case 8:
1250			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x10,
1251						    0x3, 0x70, 0x90);
1252			break;
1253		case 9:
1254			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
1255						    0x1a, 0xe1, 0x10);
1256			break;
1257		case 10:
1258			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
1259						    0x12, 0xe1, 0x10);
1260			break;
1261		case 11:
1262			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1263						    0x3, 0xf1, 0x10);
1264			break;
1265		case 12:
1266			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
1267						    0x3, 0xf1, 0x10);
1268			break;
1269		case 13:
1270			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
1271						    0x1a, 0xe0, 0x10);
1272			break;
1273		case 14:
1274			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
1275						    0x12, 0xe0, 0x10);
1276			break;
1277		case 15:
1278			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1279						    0x3, 0xf0, 0x10);
1280			break;
1281		case 16:
1282			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
1283						    0x3, 0xf0, 0x10);
1284			break;
1285		case 17:
1286			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0x61, 0x20,
1287						    0x03, 0x10, 0x10);
1288			break;
1289		case 18:
1290			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5,
1291						    0x5, 0xe1, 0x90);
1292			break;
1293		case 19:
1294			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1295						    0x25, 0xe1, 0x90);
1296			break;
1297		case 20:
1298			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1299						    0x25, 0x60, 0x90);
1300			break;
1301		case 21:
1302			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1303						    0x03, 0x70, 0x90);
1304			break;
1305		case 71:
1306			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
1307						    0x1a, 0xe1, 0x90);
1308			break;
1309		}
1310	} else {
1311		/* disable PS tdma */
1312		switch (type) {
1313		default:
1314		case 0:
1315			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0x8, 0x0, 0x0,
1316						    0x0, 0x0);
1317			btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x4);
1318			break;
1319		case 1:
1320			btc8192e2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1321						    0x8, 0x0);
1322			mdelay(5);
1323			btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x20);
1324			break;
1325		}
1326	}
1327
1328	/* update pre state */
1329	coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1330	coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1331}
1332
1333static void btc8192e2ant_set_switch_ss_type(struct btc_coexist *btcoexist,
1334					    u8 ss_type)
1335{
1336	struct rtl_priv *rtlpriv = btcoexist->adapter;
1337	u8 mimops = BTC_MIMO_PS_DYNAMIC;
1338	u32 dis_ra_mask = 0x0;
1339
1340	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1341		"[BTCoex], REAL set SS Type = %d\n", ss_type);
1342
1343	dis_ra_mask = btc8192e2ant_decide_ra_mask(btcoexist, ss_type,
1344						  coex_dm->cur_ra_mask_type);
1345	btc8192e2ant_update_ra_mask(btcoexist, FORCE_EXEC, dis_ra_mask);
1346
1347	if (ss_type == 1) {
1348		btc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1);
1349		/* switch ofdm path */
1350		btcoexist->btc_write_1byte(btcoexist, 0xc04, 0x11);
1351		btcoexist->btc_write_1byte(btcoexist, 0xd04, 0x1);
1352		btcoexist->btc_write_4byte(btcoexist, 0x90c, 0x81111111);
1353		/* switch cck patch */
1354		btcoexist->btc_write_1byte_bitmask(btcoexist, 0xe77, 0x4, 0x1);
1355		btcoexist->btc_write_1byte(btcoexist, 0xa07, 0x81);
1356		mimops = BTC_MIMO_PS_STATIC;
1357	} else if (ss_type == 2) {
1358		btc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
1359		btcoexist->btc_write_1byte(btcoexist, 0xc04, 0x33);
1360		btcoexist->btc_write_1byte(btcoexist, 0xd04, 0x3);
1361		btcoexist->btc_write_4byte(btcoexist, 0x90c, 0x81121313);
1362		btcoexist->btc_write_1byte_bitmask(btcoexist, 0xe77, 0x4, 0x0);
1363		btcoexist->btc_write_1byte(btcoexist, 0xa07, 0x41);
1364		mimops = BTC_MIMO_PS_DYNAMIC;
1365	}
1366	/* set rx 1ss or 2ss */
1367	btcoexist->btc_set(btcoexist, BTC_SET_ACT_SEND_MIMO_PS, &mimops);
1368}
1369
1370static void btc8192e2ant_switch_ss_type(struct btc_coexist *btcoexist,
1371					bool force_exec, u8 new_ss_type)
1372{
1373	struct rtl_priv *rtlpriv = btcoexist->adapter;
1374
1375	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1376		"[BTCoex], %s Switch SS Type = %d\n",
1377		(force_exec ? "force to" : ""), new_ss_type);
1378	coex_dm->cur_ss_type = new_ss_type;
1379
1380	if (!force_exec) {
1381		if (coex_dm->pre_ss_type == coex_dm->cur_ss_type)
1382			return;
1383	}
1384	btc8192e2ant_set_switch_ss_type(btcoexist, coex_dm->cur_ss_type);
1385
1386	coex_dm->pre_ss_type = coex_dm->cur_ss_type;
1387}
1388
1389static void btc8192e2ant_coex_all_off(struct btc_coexist *btcoexist)
1390{
1391	/* fw all off */
1392	btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1393	btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1394	btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1395
1396	/* sw all off */
1397	btc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
1398	btc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1399
1400	/* hw all off */
1401	btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1402}
1403
1404static void btc8192e2ant_init_coex_dm(struct btc_coexist *btcoexist)
1405{
1406	/* force to reset coex mechanism */
1407
1408	btc8192e2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1);
1409	btc8192e2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
1410	btc8192e2ant_dec_bt_pwr(btcoexist, FORCE_EXEC, 0);
1411
1412	btc8192e2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
1413	btc8192e2ant_switch_ss_type(btcoexist, FORCE_EXEC, 2);
1414
1415	btc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
1416	btc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1417}
1418
1419static void btc8192e2ant_action_bt_inquiry(struct btc_coexist *btcoexist)
1420{
1421	bool low_pwr_disable = true;
1422
1423	btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1424			   &low_pwr_disable);
1425
1426	btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);
1427
1428	btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1429	btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
1430	btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1431	btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1432
1433	btc8192e2ant_sw_mechanism1(btcoexist, false, false, false, false);
1434	btc8192e2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1435}
1436
1437static bool btc8192e2ant_is_common_action(struct btc_coexist *btcoexist)
1438{
1439	struct rtl_priv *rtlpriv = btcoexist->adapter;
1440	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1441	bool common = false, wifi_connected = false, wifi_busy = false;
1442	bool bt_hs_on = false, low_pwr_disable = false;
1443
1444	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
1445	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1446			   &wifi_connected);
1447	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1448
1449	if (bt_link_info->sco_exist || bt_link_info->hid_exist)
1450		btc8192e2ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 0, 0, 0);
1451	else
1452		btc8192e2ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
1453
1454	if (!wifi_connected) {
1455		low_pwr_disable = false;
1456		btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1457				   &low_pwr_disable);
1458
1459		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1460			"[BTCoex], Wifi non-connected idle!!\n");
1461
1462		if ((BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
1463		     coex_dm->bt_status) ||
1464		    (BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE ==
1465		     coex_dm->bt_status)) {
1466			btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 2);
1467			btc8192e2ant_coex_table_with_type(btcoexist,
1468							  NORMAL_EXEC, 1);
1469			btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
1470		} else {
1471			btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);
1472			btc8192e2ant_coex_table_with_type(btcoexist,
1473							  NORMAL_EXEC, 0);
1474			btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1475		}
1476
1477		btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1478		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1479
1480		btc8192e2ant_sw_mechanism1(btcoexist, false, false, false,
1481					   false);
1482		btc8192e2ant_sw_mechanism2(btcoexist, false, false, false,
1483					   0x18);
1484
1485		common = true;
1486	} else {
1487		if (BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
1488		    coex_dm->bt_status) {
1489			low_pwr_disable = false;
1490			btcoexist->btc_set(btcoexist,
1491					   BTC_SET_ACT_DISABLE_LOW_POWER,
1492					   &low_pwr_disable);
1493
1494			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1495				"Wifi connected + BT non connected-idle!!\n");
1496
1497			btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 2);
1498			btc8192e2ant_coex_table_with_type(btcoexist,
1499							  NORMAL_EXEC, 1);
1500			btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
1501			btc8192e2ant_fw_dac_swing_lvl(btcoexist,
1502						      NORMAL_EXEC, 6);
1503			btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1504
1505			btc8192e2ant_sw_mechanism1(btcoexist, false, false,
1506						   false, false);
1507			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
1508						   false, 0x18);
1509
1510			common = true;
1511		} else if (BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE ==
1512			   coex_dm->bt_status) {
1513			low_pwr_disable = true;
1514			btcoexist->btc_set(btcoexist,
1515					   BTC_SET_ACT_DISABLE_LOW_POWER,
1516					   &low_pwr_disable);
1517
1518			if (bt_hs_on)
1519				return false;
1520			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1521				"Wifi connected + BT connected-idle!!\n");
1522
1523			btc8192e2ant_switch_ss_type(btcoexist,
1524						    NORMAL_EXEC, 2);
1525			btc8192e2ant_coex_table_with_type(btcoexist,
1526							  NORMAL_EXEC, 1);
1527			btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1528					     false, 0);
1529			btc8192e2ant_fw_dac_swing_lvl(btcoexist,
1530						      NORMAL_EXEC, 6);
1531			btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1532
1533			btc8192e2ant_sw_mechanism1(btcoexist, true, false,
1534						   false, false);
1535			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
1536						   false, 0x18);
1537
1538			common = true;
1539		} else {
1540			low_pwr_disable = true;
1541			btcoexist->btc_set(btcoexist,
1542					   BTC_SET_ACT_DISABLE_LOW_POWER,
1543					   &low_pwr_disable);
1544
1545			if (wifi_busy) {
1546				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1547					"Wifi Connected-Busy + BT Busy!!\n");
1548				common = false;
1549			} else {
1550				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1551					"Wifi Connected-Idle + BT Busy!!\n");
1552
1553				btc8192e2ant_switch_ss_type(btcoexist,
1554							    NORMAL_EXEC, 1);
1555				btc8192e2ant_coex_table_with_type(btcoexist,
1556								  NORMAL_EXEC,
1557								  2);
1558				btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1559						     true, 21);
1560				btc8192e2ant_fw_dac_swing_lvl(btcoexist,
1561							      NORMAL_EXEC, 6);
1562				btc8192e2ant_dec_bt_pwr(btcoexist,
1563							NORMAL_EXEC, 0);
1564				btc8192e2ant_sw_mechanism1(btcoexist, false,
1565							   false, false, false);
1566				btc8192e2ant_sw_mechanism2(btcoexist, false,
1567							   false, false, 0x18);
1568				common = true;
1569			}
1570		}
1571	}
1572	return common;
1573}
1574
1575static void btc8192e2ant_tdma_duration_adjust(struct btc_coexist *btcoexist,
1576					      bool sco_hid, bool tx_pause,
1577					      u8 max_interval)
1578{
1579	struct rtl_priv *rtlpriv = btcoexist->adapter;
1580	static int up, dn, m, n, wait_cnt;
1581	u8 retry_cnt = 0;
1582
1583	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1584		"[BTCoex], TdmaDurationAdjust()\n");
1585
1586	if (!coex_dm->auto_tdma_adjust) {
1587		coex_dm->auto_tdma_adjust = true;
1588		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1589			"[BTCoex], first run TdmaDurationAdjust()!!\n");
1590		if (sco_hid) {
1591			if (tx_pause) {
1592				if (max_interval == 1) {
1593					btc8192e2ant_ps_tdma(btcoexist,
1594							     NORMAL_EXEC,
1595							     true, 13);
1596					coex_dm->tdma_adj_type = 13;
1597				} else if (max_interval == 2) {
1598					btc8192e2ant_ps_tdma(btcoexist,
1599							     NORMAL_EXEC,
1600							     true, 14);
1601					coex_dm->tdma_adj_type = 14;
1602				} else {
1603					btc8192e2ant_ps_tdma(btcoexist,
1604							     NORMAL_EXEC,
1605							     true, 15);
1606					coex_dm->tdma_adj_type = 15;
1607				}
1608			} else {
1609				if (max_interval == 1) {
1610					btc8192e2ant_ps_tdma(btcoexist,
1611							     NORMAL_EXEC,
1612							     true, 9);
1613					coex_dm->tdma_adj_type = 9;
1614				} else if (max_interval == 2) {
1615					btc8192e2ant_ps_tdma(btcoexist,
1616							     NORMAL_EXEC,
1617							     true, 10);
1618					coex_dm->tdma_adj_type = 10;
1619				} else {
1620					btc8192e2ant_ps_tdma(btcoexist,
1621							     NORMAL_EXEC,
1622							     true, 11);
1623					coex_dm->tdma_adj_type = 11;
1624				}
1625			}
1626		} else {
1627			if (tx_pause) {
1628				if (max_interval == 1) {
1629					btc8192e2ant_ps_tdma(btcoexist,
1630							     NORMAL_EXEC,
1631							     true, 5);
1632					coex_dm->tdma_adj_type = 5;
1633				} else if (max_interval == 2) {
1634					btc8192e2ant_ps_tdma(btcoexist,
1635							     NORMAL_EXEC,
1636							     true, 6);
1637					coex_dm->tdma_adj_type = 6;
1638				} else {
1639					btc8192e2ant_ps_tdma(btcoexist,
1640							     NORMAL_EXEC,
1641							     true, 7);
1642					coex_dm->tdma_adj_type = 7;
1643				}
1644			} else {
1645				if (max_interval == 1) {
1646					btc8192e2ant_ps_tdma(btcoexist,
1647							     NORMAL_EXEC,
1648							     true, 1);
1649					coex_dm->tdma_adj_type = 1;
1650				} else if (max_interval == 2) {
1651					btc8192e2ant_ps_tdma(btcoexist,
1652							     NORMAL_EXEC,
1653							     true, 2);
1654					coex_dm->tdma_adj_type = 2;
1655				} else {
1656					btc8192e2ant_ps_tdma(btcoexist,
1657							     NORMAL_EXEC,
1658							     true, 3);
1659					coex_dm->tdma_adj_type = 3;
1660				}
1661			}
1662		}
1663
1664		up = 0;
1665		dn = 0;
1666		m = 1;
1667		n = 3;
1668		wait_cnt = 0;
1669	} else {
1670		/* accquire the BT TRx retry count from BT_Info byte2 */
1671		retry_cnt = coex_sta->bt_retry_cnt;
1672		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1673			"[BTCoex], retry_cnt = %d\n", retry_cnt);
1674		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1675			"[BTCoex], up=%d, dn=%d, m=%d, n=%d, wait_cnt=%d\n",
1676			up, dn, m, n, wait_cnt);
1677		wait_cnt++;
1678		/* no retry in the last 2-second duration */
1679		if (retry_cnt == 0) {
1680			up++;
1681			dn--;
1682
1683			if (dn <= 0)
1684				dn = 0;
1685
1686			if (up >= n) {
1687				wait_cnt = 0;
1688				n = 3;
1689				up = 0;
1690				dn = 0;
1691				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1692					"[BTCoex]Increase wifi duration!!\n");
1693			}
1694		} else if (retry_cnt <= 3) {
1695			up--;
1696			dn++;
1697
1698			if (up <= 0)
1699				up = 0;
1700
1701			if (dn == 2) {
1702				if (wait_cnt <= 2)
1703					m++;
1704				else
1705					m = 1;
1706
1707				if (m >= 20)
1708					m = 20;
1709
1710				n = 3 * m;
1711				up = 0;
1712				dn = 0;
1713				wait_cnt = 0;
1714				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1715					"Reduce wifi duration for retry<3\n");
1716			}
1717		} else {
1718			if (wait_cnt == 1)
1719				m++;
1720			else
1721				m = 1;
1722
1723			if (m >= 20)
1724				m = 20;
1725
1726			n = 3*m;
1727			up = 0;
1728			dn = 0;
1729			wait_cnt = 0;
1730			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1731				"Decrease wifi duration for retryCounter>3!!\n");
1732		}
1733
1734		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1735			"[BTCoex], max Interval = %d\n", max_interval);
1736	}
1737
1738	/* if current PsTdma not match with
1739	 * the recorded one (when scan, dhcp...),
1740	 * then we have to adjust it back to the previous record one.
1741	 */
1742	if (coex_dm->cur_ps_tdma != coex_dm->tdma_adj_type) {
1743		bool scan = false, link = false, roam = false;
1744
1745		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1746			"[BTCoex], PsTdma type mismatch!!!, ");
1747		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1748			"curPsTdma=%d, recordPsTdma=%d\n",
1749			 coex_dm->cur_ps_tdma, coex_dm->tdma_adj_type);
1750
1751		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
1752		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
1753		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
1754
1755		if (!scan && !link && !roam)
1756			btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
1757					     true, coex_dm->tdma_adj_type);
1758		else
1759			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1760				"[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n");
1761	}
1762}
1763
1764/* SCO only or SCO+PAN(HS) */
1765static void btc8192e2ant_action_sco(struct btc_coexist *btcoexist)
1766{
1767	u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
1768	u32 wifi_bw;
1769
1770	wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
1771
1772	btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);
1773	btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
1774
1775	btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1776
1777	btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1778
1779	bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42);
1780
1781	if ((bt_rssi_state == BTC_RSSI_STATE_LOW) ||
1782	    (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
1783		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1784		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
1785	} else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
1786		   (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
1787		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
1788		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
1789	} else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
1790		   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1791		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4);
1792		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
1793	}
1794
1795	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
1796
1797	/* sw mechanism */
1798	if (BTC_WIFI_BW_HT40 == wifi_bw) {
1799		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
1800		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1801			btc8192e2ant_sw_mechanism1(btcoexist, true, true,
1802						   false, false);
1803			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
1804						   false, 0x6);
1805		} else {
1806			btc8192e2ant_sw_mechanism1(btcoexist, true, true,
1807						   false, false);
1808			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
1809						   false, 0x6);
1810		}
1811	} else {
1812		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
1813		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1814			btc8192e2ant_sw_mechanism1(btcoexist, false, true,
1815						   false, false);
1816			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
1817						   false, 0x6);
1818		} else {
1819			btc8192e2ant_sw_mechanism1(btcoexist, false, true,
1820						   false, false);
1821			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
1822						   false, 0x6);
1823		}
1824	}
1825}
1826
1827static void btc8192e2ant_action_sco_pan(struct btc_coexist *btcoexist)
1828{
1829	u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
1830	u32 wifi_bw;
1831
1832	wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
1833
1834	btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);
1835	btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
1836
1837	btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1838
1839	btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1840
1841	bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42);
1842
1843	if ((bt_rssi_state == BTC_RSSI_STATE_LOW) ||
1844	    (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
1845		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1846		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1847	} else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
1848		   (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
1849		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
1850		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10);
1851	} else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
1852		   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1853		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4);
1854		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10);
1855	}
1856
1857	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
1858
1859	/* sw mechanism */
1860	if (BTC_WIFI_BW_HT40 == wifi_bw) {
1861		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
1862		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1863			btc8192e2ant_sw_mechanism1(btcoexist, true, true,
1864						   false, false);
1865			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
1866						   false, 0x6);
1867		} else {
1868			btc8192e2ant_sw_mechanism1(btcoexist, true, true,
1869						   false, false);
1870			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
1871						   false, 0x6);
1872		}
1873	} else {
1874		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
1875		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1876			btc8192e2ant_sw_mechanism1(btcoexist, false, true,
1877						   false, false);
1878			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
1879						   false, 0x6);
1880		} else {
1881			btc8192e2ant_sw_mechanism1(btcoexist, false, true,
1882						   false, false);
1883			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
1884						   false, 0x6);
1885		}
1886	}
1887}
1888
1889static void btc8192e2ant_action_hid(struct btc_coexist *btcoexist)
1890{
1891	u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
1892	u32 wifi_bw;
1893
1894	wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
1895	bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42);
1896
1897	btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);
1898	btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
1899
1900	btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1901
1902	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
1903
1904	btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3);
1905
1906	if ((bt_rssi_state == BTC_RSSI_STATE_LOW) ||
1907	    (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
1908		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1909		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
1910	} else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
1911		   (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
1912		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
1913		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
1914	} else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
1915		   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1916		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4);
1917		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
1918	}
1919
1920	/* sw mechanism */
1921	if (BTC_WIFI_BW_HT40 == wifi_bw) {
1922		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
1923		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1924			btc8192e2ant_sw_mechanism1(btcoexist, true, true,
1925						   false, false);
1926			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
1927						   false, 0x18);
1928		} else {
1929			btc8192e2ant_sw_mechanism1(btcoexist, true, true,
1930						   false, false);
1931			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
1932						   false, 0x18);
1933		}
1934	} else {
1935		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
1936		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1937			btc8192e2ant_sw_mechanism1(btcoexist, false, true,
1938						   false, false);
1939			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
1940						   false, 0x18);
1941		} else {
1942			btc8192e2ant_sw_mechanism1(btcoexist, false, true,
1943						   false, false);
1944			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
1945						   false, 0x18);
1946		}
1947	}
1948}
1949
1950/* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
1951static void btc8192e2ant_action_a2dp(struct btc_coexist *btcoexist)
1952{
1953	struct rtl_priv *rtlpriv = btcoexist->adapter;
1954	u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
1955	u32 wifi_bw;
1956	bool long_dist = false;
1957
1958	wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
1959	bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42);
1960
1961	if ((bt_rssi_state == BTC_RSSI_STATE_LOW ||
1962	     bt_rssi_state == BTC_RSSI_STATE_STAY_LOW) &&
1963	    (wifi_rssi_state == BTC_RSSI_STATE_LOW ||
1964	     wifi_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
1965		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1966			"[BTCoex], A2dp, wifi/bt rssi both LOW!!\n");
1967		long_dist = true;
1968	}
1969	if (long_dist) {
1970		btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 2);
1971		btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, true,
1972					0x4);
1973	} else {
1974		btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);
1975		btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
1976					0x8);
1977	}
1978
1979	btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1980
1981	if (long_dist)
1982		btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1983	else
1984		btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1985
1986	if (long_dist) {
1987		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 17);
1988		coex_dm->auto_tdma_adjust = false;
1989		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1990	} else {
1991		if ((bt_rssi_state == BTC_RSSI_STATE_LOW) ||
1992		    (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
1993			btc8192e2ant_tdma_duration_adjust(btcoexist, false,
1994							  true, 1);
1995			btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1996		} else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
1997			   (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
1998			btc8192e2ant_tdma_duration_adjust(btcoexist, false,
1999							  false, 1);
2000			btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2001		} else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2002			   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2003			btc8192e2ant_tdma_duration_adjust(btcoexist, false,
2004							  false, 1);
2005			btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4);
2006		}
2007	}
2008
2009	/* sw mechanism */
2010	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2011	if (BTC_WIFI_BW_HT40 == wifi_bw) {
2012		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2013		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2014			btc8192e2ant_sw_mechanism1(btcoexist, true, false,
2015						   false, false);
2016			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2017						   false, 0x18);
2018		} else {
2019			btc8192e2ant_sw_mechanism1(btcoexist, true, false,
2020						   false, false);
2021			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2022						   false, 0x18);
2023		}
2024	} else {
2025		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2026		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2027			btc8192e2ant_sw_mechanism1(btcoexist, false, false,
2028						   false, false);
2029			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2030						   false, 0x18);
2031		} else {
2032			btc8192e2ant_sw_mechanism1(btcoexist, false, false,
2033						   false, false);
2034			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2035						   false, 0x18);
2036		}
2037	}
2038}
2039
2040static void btc8192e2ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)
2041{
2042	u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
2043	u32 wifi_bw;
2044
2045	wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2046	bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42);
2047
2048	btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);
2049	btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2050
2051	btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2052	btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2053
2054	if ((bt_rssi_state == BTC_RSSI_STATE_LOW) ||
2055	    (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2056		btc8192e2ant_tdma_duration_adjust(btcoexist, false, true, 2);
2057		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2058	} else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
2059		   (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2060		btc8192e2ant_tdma_duration_adjust(btcoexist, false, false, 2);
2061		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2062	} else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2063		   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2064		btc8192e2ant_tdma_duration_adjust(btcoexist, false, false, 2);
2065		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4);
2066	}
2067
2068	/* sw mechanism */
2069	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2070	if (BTC_WIFI_BW_HT40 == wifi_bw) {
2071		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2072		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2073			btc8192e2ant_sw_mechanism1(btcoexist, true, false,
2074						   false, false);
2075			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2076						   true, 0x6);
2077		} else {
2078			btc8192e2ant_sw_mechanism1(btcoexist, true, false,
2079						   false, false);
2080			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2081						   true, 0x6);
2082		}
2083	} else {
2084		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2085		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2086			btc8192e2ant_sw_mechanism1(btcoexist, false, false,
2087						   false, false);
2088			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2089						   true, 0x6);
2090		} else {
2091			btc8192e2ant_sw_mechanism1(btcoexist, false, false,
2092						   false, false);
2093			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2094						   true, 0x6);
2095		}
2096	}
2097}
2098
2099static void btc8192e2ant_action_pan_edr(struct btc_coexist *btcoexist)
2100{
2101	u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
2102	u32 wifi_bw;
2103
2104	wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2105	bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42);
2106
2107	btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);
2108	btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2109
2110	btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2111
2112	btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2113
2114	if ((bt_rssi_state == BTC_RSSI_STATE_LOW) ||
2115	    (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2116		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2117		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
2118	} else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
2119		   (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2120		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2121		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1);
2122	} else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2123		   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2124		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4);
2125		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1);
2126	}
2127
2128	/* sw mechanism */
2129	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2130	if (BTC_WIFI_BW_HT40 == wifi_bw) {
2131		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2132		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2133			btc8192e2ant_sw_mechanism1(btcoexist, true, false,
2134						   false, false);
2135			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2136						   false, 0x18);
2137		} else {
2138			btc8192e2ant_sw_mechanism1(btcoexist, true, false,
2139						   false, false);
2140			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2141						   false, 0x18);
2142		}
2143	} else {
2144		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2145		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2146			btc8192e2ant_sw_mechanism1(btcoexist, false, false,
2147						   false, false);
2148			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2149						   false, 0x18);
2150		} else {
2151			btc8192e2ant_sw_mechanism1(btcoexist, false, false,
2152						   false, false);
2153			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2154						   false, 0x18);
2155		}
2156	}
2157}
2158
2159/* PAN(HS) only */
2160static void btc8192e2ant_action_pan_hs(struct btc_coexist *btcoexist)
2161{
2162	u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
2163	u32 wifi_bw;
2164
2165	wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2166	bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42);
2167
2168	btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);
2169	btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2170
2171	btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2172
2173	btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2174
2175	if ((bt_rssi_state == BTC_RSSI_STATE_LOW) ||
2176	    (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2177		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2178	} else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
2179		   (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2180		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2181	} else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2182		   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2183		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4);
2184	}
2185	btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
2186
2187	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2188	if (BTC_WIFI_BW_HT40 == wifi_bw) {
2189		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2190		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2191			btc8192e2ant_sw_mechanism1(btcoexist, true, false,
2192						   false, false);
2193			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2194						   false, 0x18);
2195		} else {
2196			btc8192e2ant_sw_mechanism1(btcoexist, true, false,
2197						   false, false);
2198			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2199						   false, 0x18);
2200		}
2201	} else {
2202		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2203		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2204			btc8192e2ant_sw_mechanism1(btcoexist, false, false,
2205						   false, false);
2206			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2207						   false, 0x18);
2208		} else {
2209			btc8192e2ant_sw_mechanism1(btcoexist, false, false,
2210						   false, false);
2211			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2212						   false, 0x18);
2213		}
2214	}
2215}
2216
2217/* PAN(EDR)+A2DP */
2218static void btc8192e2ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)
2219{
2220	u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
2221	u32 wifi_bw;
2222
2223	wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2224	bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42);
2225
2226	btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);
2227	btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2228
2229	btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2230
2231	btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2232
2233	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2234
2235	if ((bt_rssi_state == BTC_RSSI_STATE_LOW) ||
2236	    (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2237		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2238		btc8192e2ant_tdma_duration_adjust(btcoexist, false, true, 3);
2239	} else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
2240		   (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2241		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2242		btc8192e2ant_tdma_duration_adjust(btcoexist, false, false, 3);
2243	} else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2244		   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2245		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4);
2246		btc8192e2ant_tdma_duration_adjust(btcoexist, false, false, 3);
2247	}
2248
2249	/* sw mechanism	*/
2250	if (BTC_WIFI_BW_HT40 == wifi_bw) {
2251		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2252		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2253			btc8192e2ant_sw_mechanism1(btcoexist, true, false,
2254						   false, false);
2255			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2256						   false, 0x18);
2257		} else {
2258			btc8192e2ant_sw_mechanism1(btcoexist, true, false,
2259						   false, false);
2260			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2261						   false, 0x18);
2262		}
2263	} else {
2264		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2265		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2266			btc8192e2ant_sw_mechanism1(btcoexist, false, false,
2267						   false, false);
2268			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2269						   false, 0x18);
2270		} else {
2271			btc8192e2ant_sw_mechanism1(btcoexist, false, false,
2272						   false, false);
2273			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2274						   false, 0x18);
2275		}
2276	}
2277}
2278
2279static void btc8192e2ant_action_pan_edr_hid(struct btc_coexist *btcoexist)
2280{
2281	u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
2282	u32 wifi_bw;
2283
2284	wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2285	bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42);
2286
2287	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2288
2289	btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);
2290	btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2291
2292	btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2293
2294	btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3);
2295
2296	if ((bt_rssi_state == BTC_RSSI_STATE_LOW) ||
2297	    (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2298		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2299		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
2300	} else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
2301		   (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2302		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2303		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10);
2304	} else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2305		   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2306		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4);
2307		btc8192e2ant_ps_tdma(btcoexist, NORMAL_EXEC,
2308				     true, 10);
2309	}
2310
2311	/* sw mechanism */
2312	if (BTC_WIFI_BW_HT40 == wifi_bw) {
2313		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2314		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2315			btc8192e2ant_sw_mechanism1(btcoexist, true, true,
2316						   false, false);
2317			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2318						   false, 0x18);
2319		} else {
2320			btc8192e2ant_sw_mechanism1(btcoexist, true, true,
2321						   false, false);
2322			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2323						   false, 0x18);
2324		}
2325	} else {
2326		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2327		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2328			btc8192e2ant_sw_mechanism1(btcoexist, false, true,
2329						   false, false);
2330			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2331						   false, 0x18);
2332		} else {
2333			btc8192e2ant_sw_mechanism1(btcoexist, false, true,
2334						   false, false);
2335			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2336						   false, 0x18);
2337		}
2338	}
2339}
2340
2341/* HID+A2DP+PAN(EDR) */
2342static void btc8192e2ant_action_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)
2343{
2344	u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
2345	u32 wifi_bw;
2346
2347	wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2348	bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42);
2349
2350	btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);
2351	btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2352
2353	btc8192e2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2354
2355	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2356
2357	btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3);
2358
2359	if ((bt_rssi_state == BTC_RSSI_STATE_LOW) ||
2360	    (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2361		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2362		btc8192e2ant_tdma_duration_adjust(btcoexist, true, true, 3);
2363	} else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
2364		   (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
2365		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2366		btc8192e2ant_tdma_duration_adjust(btcoexist, true, false, 3);
2367	} else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2368		   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2369		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4);
2370		btc8192e2ant_tdma_duration_adjust(btcoexist, true, false, 3);
2371	}
2372
2373	/* sw mechanism */
2374	if (BTC_WIFI_BW_HT40 == wifi_bw) {
2375		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2376		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2377			btc8192e2ant_sw_mechanism1(btcoexist, true, true,
2378						   false, false);
2379			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2380						   false, 0x18);
2381		} else {
2382			btc8192e2ant_sw_mechanism1(btcoexist, true, true,
2383						   false, false);
2384			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2385						   false, 0x18);
2386		}
2387	} else {
2388		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2389		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2390			btc8192e2ant_sw_mechanism1(btcoexist, false, true,
2391						   false, false);
2392			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2393						   false, 0x18);
2394		} else {
2395			btc8192e2ant_sw_mechanism1(btcoexist, false, true,
2396						   false, false);
2397			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2398						   false, 0x18);
2399		}
2400	}
2401}
2402
2403static void btc8192e2ant_action_hid_a2dp(struct btc_coexist *btcoexist)
2404{
2405	u8 wifi_rssi_state, bt_rssi_state = BTC_RSSI_STATE_HIGH;
2406	u32 wifi_bw;
2407
2408	wifi_rssi_state = btc8192e2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2409	bt_rssi_state = btc8192e2ant_bt_rssi_state(btcoexist, 3, 34, 42);
2410
2411	btc8192e2ant_switch_ss_type(btcoexist, NORMAL_EXEC, 1);
2412	btc8192e2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2413
2414	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2415
2416	btc8192e2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3);
2417
2418	if ((bt_rssi_state == BTC_RSSI_STATE_LOW) ||
2419	    (bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
2420		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2421		btc8192e2ant_tdma_duration_adjust(btcoexist, true, true, 2);
2422	} else if ((bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
2423		   (bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM))	{
2424		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2425		btc8192e2ant_tdma_duration_adjust(btcoexist, true, false, 2);
2426	} else if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2427		   (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2428		btc8192e2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 4);
2429		btc8192e2ant_tdma_duration_adjust(btcoexist, true, false, 2);
2430	}
2431
2432	/* sw mechanism */
2433	if (BTC_WIFI_BW_HT40 == wifi_bw) {
2434		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2435		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2436			btc8192e2ant_sw_mechanism1(btcoexist, true, true,
2437						   false, false);
2438			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2439						   false, 0x18);
2440		} else {
2441			btc8192e2ant_sw_mechanism1(btcoexist, true, true,
2442						   false, false);
2443			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2444						   false, 0x18);
2445		}
2446	} else {
2447		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2448		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2449			btc8192e2ant_sw_mechanism1(btcoexist, false, true,
2450						   false, false);
2451			btc8192e2ant_sw_mechanism2(btcoexist, true, false,
2452						   false, 0x18);
2453		} else {
2454			btc8192e2ant_sw_mechanism1(btcoexist, false, true,
2455						   false, false);
2456			btc8192e2ant_sw_mechanism2(btcoexist, false, false,
2457						   false, 0x18);
2458		}
2459	}
2460}
2461
2462static void btc8192e2ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
2463{
2464	struct rtl_priv *rtlpriv = btcoexist->adapter;
2465	u8 algorithm = 0;
2466
2467	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2468		"[BTCoex], RunCoexistMechanism()===>\n");
2469
2470	if (btcoexist->manual_control) {
2471		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2472			"[BTCoex], return for Manual CTRL <===\n");
2473		return;
2474	}
2475
2476	if (coex_sta->under_ips) {
2477		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2478			"[BTCoex], wifi is under IPS !!!\n");
2479		return;
2480	}
2481
2482	algorithm = btc8192e2ant_action_algorithm(btcoexist);
2483	if (coex_sta->c2h_bt_inquiry_page &&
2484	    (BT_8192E_2ANT_COEX_ALGO_PANHS != algorithm)) {
2485		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2486			"[BTCoex], BT is under inquiry/page scan !!\n");
2487		btc8192e2ant_action_bt_inquiry(btcoexist);
2488		return;
2489	}
2490
2491	coex_dm->cur_algorithm = algorithm;
2492	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2493		"[BTCoex], Algorithm = %d\n", coex_dm->cur_algorithm);
2494
2495	if (btc8192e2ant_is_common_action(btcoexist)) {
2496		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2497			"[BTCoex], Action 2-Ant common\n");
2498		coex_dm->auto_tdma_adjust = false;
2499	} else {
2500		if (coex_dm->cur_algorithm != coex_dm->pre_algorithm) {
2501			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2502				"[BTCoex] preAlgorithm=%d, curAlgorithm=%d\n",
2503				 coex_dm->pre_algorithm,
2504				 coex_dm->cur_algorithm);
2505			coex_dm->auto_tdma_adjust = false;
2506		}
2507		switch (coex_dm->cur_algorithm) {
2508		case BT_8192E_2ANT_COEX_ALGO_SCO:
2509			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2510				"Action 2-Ant, algorithm = SCO\n");
2511			btc8192e2ant_action_sco(btcoexist);
2512			break;
2513		case BT_8192E_2ANT_COEX_ALGO_SCO_PAN:
2514			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2515				"Action 2-Ant, algorithm = SCO+PAN(EDR)\n");
2516			btc8192e2ant_action_sco_pan(btcoexist);
2517			break;
2518		case BT_8192E_2ANT_COEX_ALGO_HID:
2519			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2520				"Action 2-Ant, algorithm = HID\n");
2521			btc8192e2ant_action_hid(btcoexist);
2522			break;
2523		case BT_8192E_2ANT_COEX_ALGO_A2DP:
2524			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2525				"Action 2-Ant, algorithm = A2DP\n");
2526			btc8192e2ant_action_a2dp(btcoexist);
2527			break;
2528		case BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS:
2529			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2530				"Action 2-Ant, algorithm = A2DP+PAN(HS)\n");
2531			btc8192e2ant_action_a2dp_pan_hs(btcoexist);
2532			break;
2533		case BT_8192E_2ANT_COEX_ALGO_PANEDR:
2534			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2535				"Action 2-Ant, algorithm = PAN(EDR)\n");
2536			btc8192e2ant_action_pan_edr(btcoexist);
2537			break;
2538		case BT_8192E_2ANT_COEX_ALGO_PANHS:
2539			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2540				"Action 2-Ant, algorithm = HS mode\n");
2541			btc8192e2ant_action_pan_hs(btcoexist);
2542			break;
2543		case BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP:
2544			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2545				"Action 2-Ant, algorithm = PAN+A2DP\n");
2546			btc8192e2ant_action_pan_edr_a2dp(btcoexist);
2547			break;
2548		case BT_8192E_2ANT_COEX_ALGO_PANEDR_HID:
2549			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2550				"Action 2-Ant, algorithm = PAN(EDR)+HID\n");
2551			btc8192e2ant_action_pan_edr_hid(btcoexist);
2552			break;
2553		case BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
2554			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2555				"Action 2-Ant, algorithm = HID+A2DP+PAN\n");
2556			btc8192e2ant_action_hid_a2dp_pan_edr(btcoexist);
2557			break;
2558		case BT_8192E_2ANT_COEX_ALGO_HID_A2DP:
2559			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2560				"Action 2-Ant, algorithm = HID+A2DP\n");
2561			btc8192e2ant_action_hid_a2dp(btcoexist);
2562			break;
2563		default:
2564			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2565				"Action 2-Ant, algorithm = unknown!!\n");
2566			/* btc8192e2ant_coex_all_off(btcoexist); */
2567			break;
2568		}
2569		coex_dm->pre_algorithm = coex_dm->cur_algorithm;
2570	}
2571}
2572
2573static void btc8192e2ant_init_hwconfig(struct btc_coexist *btcoexist,
2574				       bool backup)
2575{
2576	struct rtl_priv *rtlpriv = btcoexist->adapter;
2577	u16 u16tmp = 0;
2578	u8 u8tmp = 0;
2579
2580	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2581		"[BTCoex], 2Ant Init HW Config!!\n");
2582
2583	if (backup) {
2584		/* backup rf 0x1e value */
2585		coex_dm->bt_rf0x1e_backup =
2586			btcoexist->btc_get_rf_reg(btcoexist, BTC_RF_A,
2587						  0x1e, 0xfffff);
2588
2589		coex_dm->backup_arfr_cnt1 = btcoexist->btc_read_4byte(btcoexist,
2590								      0x430);
2591		coex_dm->backup_arfr_cnt2 = btcoexist->btc_read_4byte(btcoexist,
2592								     0x434);
2593		coex_dm->backup_retry_limit = btcoexist->btc_read_2byte(
2594								    btcoexist,
2595								    0x42a);
2596		coex_dm->backup_ampdu_maxtime = btcoexist->btc_read_1byte(
2597								    btcoexist,
2598								    0x456);
2599	}
2600
2601	/* antenna sw ctrl to bt */
2602	btcoexist->btc_write_1byte(btcoexist, 0x4f, 0x6);
2603	btcoexist->btc_write_1byte(btcoexist, 0x944, 0x24);
2604	btcoexist->btc_write_4byte(btcoexist, 0x930, 0x700700);
2605	btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x20);
2606	if (btcoexist->chip_interface == BTC_INTF_USB)
2607		btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30430004);
2608	else
2609		btcoexist->btc_write_4byte(btcoexist, 0x64, 0x30030004);
2610
2611	btc8192e2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
2612
2613	/* antenna switch control parameter */
2614	btcoexist->btc_write_4byte(btcoexist, 0x858, 0x55555555);
2615
2616	/* coex parameters */
2617	btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
2618	/* 0x790[5:0] = 0x5 */
2619	u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
2620	u8tmp &= 0xc0;
2621	u8tmp |= 0x5;
2622	btcoexist->btc_write_1byte(btcoexist, 0x790, u8tmp);
2623
2624	/* enable counter statistics */
2625	btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
2626
2627	/* enable PTA */
2628	btcoexist->btc_write_1byte(btcoexist, 0x40, 0x20);
2629	/* enable mailbox interface */
2630	u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x40);
2631	u16tmp |= BIT9;
2632	btcoexist->btc_write_2byte(btcoexist, 0x40, u16tmp);
2633
2634	/* enable PTA I2C mailbox */
2635	u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x101);
2636	u8tmp |= BIT4;
2637	btcoexist->btc_write_1byte(btcoexist, 0x101, u8tmp);
2638
2639	/* enable bt clock when wifi is disabled. */
2640	u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x93);
2641	u8tmp |= BIT0;
2642	btcoexist->btc_write_1byte(btcoexist, 0x93, u8tmp);
2643	/* enable bt clock when suspend. */
2644	u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x7);
2645	u8tmp |= BIT0;
2646	btcoexist->btc_write_1byte(btcoexist, 0x7, u8tmp);
2647}
2648
2649/************************************************************
2650 *   extern function start with ex_btc8192e2ant_
2651 ************************************************************/
2652
2653void ex_btc8192e2ant_init_hwconfig(struct btc_coexist *btcoexist)
2654{
2655	btc8192e2ant_init_hwconfig(btcoexist, true);
2656}
2657
2658void ex_btc8192e2ant_init_coex_dm(struct btc_coexist *btcoexist)
2659{
2660	struct rtl_priv *rtlpriv = btcoexist->adapter;
2661
2662	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2663		"[BTCoex], Coex Mechanism Init!!\n");
2664	btc8192e2ant_init_coex_dm(btcoexist);
2665}
2666
2667void ex_btc8192e2ant_display_coex_info(struct btc_coexist *btcoexist,
2668				       struct seq_file *m)
2669{
2670	struct btc_board_info *board_info = &btcoexist->board_info;
2671	struct btc_stack_info *stack_info = &btcoexist->stack_info;
2672	u8 u8tmp[4], i, bt_info_ext, ps_tdma_case = 0;
2673	u16 u16tmp[4];
2674	u32 u32tmp[4];
2675	bool roam = false, scan = false, link = false, wifi_under_5g = false;
2676	bool bt_hs_on = false, wifi_busy = false;
2677	int wifi_rssi = 0, bt_hs_rssi = 0;
2678	u32 wifi_bw, wifi_traffic_dir;
2679	u8 wifi_dot11_chnl, wifi_hs_chnl;
2680	u32 fw_ver = 0, bt_patch_ver = 0;
2681
2682	seq_puts(m, "\n ============[BT Coexist info]============");
2683
2684	if (btcoexist->manual_control) {
2685		seq_puts(m, "\n ===========[Under Manual Control]===========");
2686		seq_puts(m, "\n ==========================================");
2687	}
2688
2689	seq_printf(m, "\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:",
2690		   board_info->pg_ant_num, board_info->btdm_ant_num);
2691
2692	seq_printf(m, "\n %-35s = %s / %d", "BT stack/ hci ext ver",
2693		   ((stack_info->profile_notified) ? "Yes" : "No"),
2694		   stack_info->hci_version);
2695
2696	btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
2697	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
2698	seq_printf(m, "\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)",
2699		   "CoexVer/ FwVer/ PatchVer",
2700		   glcoex_ver_date_8192e_2ant, glcoex_ver_8192e_2ant,
2701		   fw_ver, bt_patch_ver, bt_patch_ver);
2702
2703	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2704	btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
2705			   &wifi_dot11_chnl);
2706	btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);
2707	seq_printf(m, "\n %-35s = %d / %d(%d)",
2708		   "Dot11 channel / HsMode(HsChnl)",
2709		   wifi_dot11_chnl, bt_hs_on, wifi_hs_chnl);
2710
2711	seq_printf(m, "\n %-35s = %3ph ",
2712		   "H2C Wifi inform bt chnl Info", coex_dm->wifi_chnl_info);
2713
2714	btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
2715	btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
2716	seq_printf(m, "\n %-35s = %d/ %d",
2717		   "Wifi rssi/ HS rssi", wifi_rssi, bt_hs_rssi);
2718
2719	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2720	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2721	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2722	seq_printf(m, "\n %-35s = %d/ %d/ %d ",
2723		   "Wifi link/ roam/ scan", link, roam, scan);
2724
2725	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2726	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2727	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2728	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
2729			   &wifi_traffic_dir);
2730	seq_printf(m, "\n %-35s = %s / %s/ %s ",
2731		   "Wifi status", (wifi_under_5g ? "5G" : "2.4G"),
2732		   ((BTC_WIFI_BW_LEGACY == wifi_bw) ? "Legacy" :
2733			(((BTC_WIFI_BW_HT40 == wifi_bw) ? "HT40" : "HT20"))),
2734		   ((!wifi_busy) ? "idle" :
2735			((BTC_WIFI_TRAFFIC_TX == wifi_traffic_dir) ?
2736				"uplink" : "downlink")));
2737
2738	seq_printf(m, "\n %-35s = [%s/ %d/ %d] ",
2739		   "BT [status/ rssi/ retryCnt]",
2740		   ((btcoexist->bt_info.bt_disabled) ? ("disabled") :
2741		    ((coex_sta->c2h_bt_inquiry_page) ?
2742		     ("inquiry/page scan") :
2743		      ((BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
2744			coex_dm->bt_status) ? "non-connected idle" :
2745			 ((BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE ==
2746			   coex_dm->bt_status) ? "connected-idle" : "busy")))),
2747		   coex_sta->bt_rssi, coex_sta->bt_retry_cnt);
2748
2749	seq_printf(m, "\n %-35s = %d / %d / %d / %d",
2750		   "SCO/HID/PAN/A2DP", stack_info->sco_exist,
2751		   stack_info->hid_exist, stack_info->pan_exist,
2752		   stack_info->a2dp_exist);
2753	btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO, m);
2754
2755	bt_info_ext = coex_sta->bt_info_ext;
2756	seq_printf(m, "\n %-35s = %s",
2757		   "BT Info A2DP rate",
2758		   (bt_info_ext&BIT0) ? "Basic rate" : "EDR rate");
2759
2760	for (i = 0; i < BT_INFO_SRC_8192E_2ANT_MAX; i++) {
2761		if (coex_sta->bt_info_c2h_cnt[i]) {
2762			seq_printf(m, "\n %-35s = %7ph(%d)",
2763				   glbt_info_src_8192e_2ant[i],
2764				   coex_sta->bt_info_c2h[i],
2765				   coex_sta->bt_info_c2h_cnt[i]);
2766		}
2767	}
2768
2769	seq_printf(m, "\n %-35s = %s/%s",
2770		   "PS state, IPS/LPS",
2771		   ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
2772		   ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")));
2773	btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);
2774
2775	seq_printf(m, "\n %-35s = 0x%x ", "SS Type",
2776		   coex_dm->cur_ss_type);
2777
2778	/* Sw mechanism	*/
2779	seq_printf(m, "\n %-35s",
2780		   "============[Sw mechanism]============");
2781	seq_printf(m, "\n %-35s = %d/ %d/ %d ",
2782		   "SM1[ShRf/ LpRA/ LimDig]", coex_dm->cur_rf_rx_lpf_shrink,
2783		   coex_dm->cur_low_penalty_ra, coex_dm->limited_dig);
2784	seq_printf(m, "\n %-35s = %d/ %d/ %d(0x%x) ",
2785		   "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]",
2786		   coex_dm->cur_agc_table_en, coex_dm->cur_adc_back_off,
2787		   coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl);
2788
2789	seq_printf(m, "\n %-35s = 0x%x ", "Rate Mask",
2790		   btcoexist->bt_info.ra_mask);
2791
2792	/* Fw mechanism	*/
2793	seq_printf(m, "\n %-35s",
2794		   "============[Fw mechanism]============");
2795
2796	ps_tdma_case = coex_dm->cur_ps_tdma;
2797	seq_printf(m,
2798		   "\n %-35s = %5ph case-%d (auto:%d)",
2799		   "PS TDMA", coex_dm->ps_tdma_para,
2800		   ps_tdma_case, coex_dm->auto_tdma_adjust);
2801
2802	seq_printf(m, "\n %-35s = %d/ %d ",
2803		   "DecBtPwr/ IgnWlanAct",
2804		   coex_dm->cur_dec_bt_pwr, coex_dm->cur_ignore_wlan_act);
2805
2806	/* Hw setting */
2807	seq_printf(m, "\n %-35s",
2808		   "============[Hw setting]============");
2809
2810	seq_printf(m, "\n %-35s = 0x%x",
2811		   "RF-A, 0x1e initVal", coex_dm->bt_rf0x1e_backup);
2812
2813	seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2814		   "backup ARFR1/ARFR2/RL/AMaxTime", coex_dm->backup_arfr_cnt1,
2815		   coex_dm->backup_arfr_cnt2, coex_dm->backup_retry_limit,
2816		   coex_dm->backup_ampdu_maxtime);
2817
2818	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
2819	u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
2820	u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
2821	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
2822	seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2823		   "0x430/0x434/0x42a/0x456",
2824		   u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]);
2825
2826	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc04);
2827	u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xd04);
2828	u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x90c);
2829	seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2830		   "0xc04/ 0xd04/ 0x90c", u32tmp[0], u32tmp[1], u32tmp[2]);
2831
2832	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
2833	seq_printf(m, "\n %-35s = 0x%x", "0x778", u8tmp[0]);
2834
2835	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x92c);
2836	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x930);
2837	seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
2838		   "0x92c/ 0x930", (u8tmp[0]), u32tmp[0]);
2839
2840	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40);
2841	u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x4f);
2842	seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
2843		   "0x40/ 0x4f", u8tmp[0], u8tmp[1]);
2844
2845	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
2846	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
2847	seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
2848		   "0x550(bcn ctrl)/0x522", u32tmp[0], u8tmp[0]);
2849
2850	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
2851	seq_printf(m, "\n %-35s = 0x%x", "0xc50(dig)",
2852		   u32tmp[0]);
2853
2854	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
2855	u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
2856	u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
2857	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
2858	seq_printf(m,
2859		   "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
2860		   "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)",
2861		   u32tmp[0], u32tmp[1], u32tmp[2], u8tmp[0]);
2862
2863	seq_printf(m, "\n %-35s = %d/ %d",
2864		   "0x770(hp rx[31:16]/tx[15:0])",
2865		   coex_sta->high_priority_rx, coex_sta->high_priority_tx);
2866	seq_printf(m, "\n %-35s = %d/ %d",
2867		   "0x774(lp rx[31:16]/tx[15:0])",
2868		   coex_sta->low_priority_rx, coex_sta->low_priority_tx);
2869	if (btcoexist->auto_report_2ant)
2870		btc8192e2ant_monitor_bt_ctr(btcoexist);
2871	btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);
2872}
2873
2874void ex_btc8192e2ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
2875{
2876	struct rtl_priv *rtlpriv = btcoexist->adapter;
2877
2878	if (BTC_IPS_ENTER == type) {
2879		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2880			"[BTCoex], IPS ENTER notify\n");
2881		coex_sta->under_ips = true;
2882		btc8192e2ant_coex_all_off(btcoexist);
2883	} else if (BTC_IPS_LEAVE == type) {
2884		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2885			"[BTCoex], IPS LEAVE notify\n");
2886		coex_sta->under_ips = false;
2887	}
2888}
2889
2890void ex_btc8192e2ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
2891{
2892	struct rtl_priv *rtlpriv = btcoexist->adapter;
2893
2894	if (BTC_LPS_ENABLE == type) {
2895		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2896			"[BTCoex], LPS ENABLE notify\n");
2897		coex_sta->under_lps = true;
2898	} else if (BTC_LPS_DISABLE == type) {
2899		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2900			"[BTCoex], LPS DISABLE notify\n");
2901		coex_sta->under_lps = false;
2902	}
2903}
2904
2905void ex_btc8192e2ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
2906{
2907	struct rtl_priv *rtlpriv = btcoexist->adapter;
2908
2909	if (BTC_SCAN_START == type)
2910		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2911			"[BTCoex], SCAN START notify\n");
2912	else if (BTC_SCAN_FINISH == type)
2913		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2914			"[BTCoex], SCAN FINISH notify\n");
2915}
2916
2917void ex_btc8192e2ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
2918{
2919	struct rtl_priv *rtlpriv = btcoexist->adapter;
2920
2921	if (BTC_ASSOCIATE_START == type)
2922		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2923			"[BTCoex], CONNECT START notify\n");
2924	else if (BTC_ASSOCIATE_FINISH == type)
2925		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2926			"[BTCoex], CONNECT FINISH notify\n");
2927}
2928
2929void ex_btc8192e2ant_media_status_notify(struct btc_coexist *btcoexist,
2930					 u8 type)
2931{
2932	struct rtl_priv *rtlpriv = btcoexist->adapter;
2933	u8 h2c_parameter[3] = {0};
2934	u32 wifi_bw;
2935	u8 wifi_center_chnl;
2936
2937	if (btcoexist->manual_control ||
2938	    btcoexist->stop_coex_dm ||
2939	    btcoexist->bt_info.bt_disabled)
2940		return;
2941
2942	if (BTC_MEDIA_CONNECT == type)
2943		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2944			"[BTCoex], MEDIA connect notify\n");
2945	else
2946		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2947			"[BTCoex], MEDIA disconnect notify\n");
2948
2949	/* only 2.4G we need to inform bt the chnl mask */
2950	btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
2951			   &wifi_center_chnl);
2952	if ((BTC_MEDIA_CONNECT == type) &&
2953	    (wifi_center_chnl <= 14)) {
2954		h2c_parameter[0] = 0x1;
2955		h2c_parameter[1] = wifi_center_chnl;
2956		btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2957		if (BTC_WIFI_BW_HT40 == wifi_bw)
2958			h2c_parameter[2] = 0x30;
2959		else
2960			h2c_parameter[2] = 0x20;
2961	}
2962
2963	coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
2964	coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
2965	coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
2966
2967	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2968		"[BTCoex], FW write 0x66 = 0x%x\n",
2969		h2c_parameter[0] << 16 | h2c_parameter[1] << 8 |
2970		h2c_parameter[2]);
2971
2972	btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
2973}
2974
2975void ex_btc8192e2ant_special_packet_notify(struct btc_coexist *btcoexist,
2976					   u8 type)
2977{
2978	struct rtl_priv *rtlpriv = btcoexist->adapter;
2979
2980	if (type == BTC_PACKET_DHCP)
2981		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2982			"[BTCoex], DHCP Packet notify\n");
2983}
2984
2985void ex_btc8192e2ant_bt_info_notify(struct btc_coexist *btcoexist,
2986				    u8 *tmp_buf, u8 length)
2987{
2988	struct rtl_priv *rtlpriv = btcoexist->adapter;
2989	u8 bt_info = 0;
2990	u8 i, rsp_source = 0;
2991	bool bt_busy = false, limited_dig = false;
2992	bool wifi_connected = false;
2993
2994	coex_sta->c2h_bt_info_req_sent = false;
2995
2996	rsp_source = tmp_buf[0] & 0xf;
2997	if (rsp_source >= BT_INFO_SRC_8192E_2ANT_MAX)
2998		rsp_source = BT_INFO_SRC_8192E_2ANT_WIFI_FW;
2999	coex_sta->bt_info_c2h_cnt[rsp_source]++;
3000
3001	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3002		"[BTCoex], Bt info[%d], length=%d, hex data = [",
3003		rsp_source, length);
3004	for (i = 0; i < length; i++) {
3005		coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
3006		if (i == 1)
3007			bt_info = tmp_buf[i];
3008		if (i == length-1)
3009			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3010				"0x%02x]\n", tmp_buf[i]);
3011		else
3012			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3013				"0x%02x, ", tmp_buf[i]);
3014	}
3015
3016	if (BT_INFO_SRC_8192E_2ANT_WIFI_FW != rsp_source) {
3017		/* [3:0] */
3018		coex_sta->bt_retry_cnt =
3019			coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
3020
3021		coex_sta->bt_rssi =
3022			coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;
3023
3024		coex_sta->bt_info_ext =
3025			coex_sta->bt_info_c2h[rsp_source][4];
3026
3027		/* Here we need to resend some wifi info to BT
3028		 * because bt is reset and loss of the info.
3029		 */
3030		if ((coex_sta->bt_info_ext & BIT1)) {
3031			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3032				"bit1, send wifi BW&Chnl to BT!!\n");
3033			btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3034					   &wifi_connected);
3035			if (wifi_connected)
3036				ex_btc8192e2ant_media_status_notify(
3037							btcoexist,
3038							BTC_MEDIA_CONNECT);
3039			else
3040				ex_btc8192e2ant_media_status_notify(
3041							btcoexist,
3042							BTC_MEDIA_DISCONNECT);
3043		}
3044
3045		if ((coex_sta->bt_info_ext & BIT3)) {
3046			if (!btcoexist->manual_control &&
3047			    !btcoexist->stop_coex_dm) {
3048				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3049					"bit3, BT NOT ignore Wlan active!\n");
3050				btc8192e2ant_ignore_wlan_act(btcoexist,
3051							     FORCE_EXEC,
3052							     false);
3053			}
3054		} else {
3055			/* BT already NOT ignore Wlan active,
3056			 * do nothing here.
3057			 */
3058		}
3059
3060		if (!btcoexist->auto_report_2ant) {
3061			if (!(coex_sta->bt_info_ext & BIT4))
3062				btc8192e2ant_bt_auto_report(btcoexist,
3063							    FORCE_EXEC,
3064							    true);
3065		}
3066	}
3067
3068	/* check BIT2 first ==> check if bt is under inquiry or page scan */
3069	if (bt_info & BT_INFO_8192E_2ANT_B_INQ_PAGE)
3070		coex_sta->c2h_bt_inquiry_page = true;
3071	else
3072		coex_sta->c2h_bt_inquiry_page = false;
3073
3074	/* set link exist status */
3075	if (!(bt_info&BT_INFO_8192E_2ANT_B_CONNECTION)) {
3076		coex_sta->bt_link_exist = false;
3077		coex_sta->pan_exist = false;
3078		coex_sta->a2dp_exist = false;
3079		coex_sta->hid_exist = false;
3080		coex_sta->sco_exist = false;
3081	} else {/* connection exists */
3082		coex_sta->bt_link_exist = true;
3083		if (bt_info & BT_INFO_8192E_2ANT_B_FTP)
3084			coex_sta->pan_exist = true;
3085		else
3086			coex_sta->pan_exist = false;
3087		if (bt_info & BT_INFO_8192E_2ANT_B_A2DP)
3088			coex_sta->a2dp_exist = true;
3089		else
3090			coex_sta->a2dp_exist = false;
3091		if (bt_info & BT_INFO_8192E_2ANT_B_HID)
3092			coex_sta->hid_exist = true;
3093		else
3094			coex_sta->hid_exist = false;
3095		if (bt_info & BT_INFO_8192E_2ANT_B_SCO_ESCO)
3096			coex_sta->sco_exist = true;
3097		else
3098			coex_sta->sco_exist = false;
3099	}
3100
3101	btc8192e2ant_update_bt_link_info(btcoexist);
3102
3103	if (!(bt_info & BT_INFO_8192E_2ANT_B_CONNECTION)) {
3104		coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE;
3105		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3106			"[BTCoex], BT Non-Connected idle!!!\n");
3107	} else if (bt_info == BT_INFO_8192E_2ANT_B_CONNECTION) {
3108		coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE;
3109		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3110			"[BTCoex], bt_infoNotify(), BT Connected-idle!!!\n");
3111	} else if ((bt_info & BT_INFO_8192E_2ANT_B_SCO_ESCO) ||
3112		   (bt_info & BT_INFO_8192E_2ANT_B_SCO_BUSY)) {
3113		coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_SCO_BUSY;
3114		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3115			"[BTCoex], bt_infoNotify(), BT SCO busy!!!\n");
3116	} else if (bt_info & BT_INFO_8192E_2ANT_B_ACL_BUSY) {
3117		coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_ACL_BUSY;
3118		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3119			"[BTCoex], bt_infoNotify(), BT ACL busy!!!\n");
3120	} else {
3121		coex_dm->bt_status = BT_8192E_2ANT_BT_STATUS_MAX;
3122		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3123			"[BTCoex]bt_infoNotify(), BT Non-Defined state!!!\n");
3124	}
3125
3126	if ((BT_8192E_2ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
3127	    (BT_8192E_2ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
3128	    (BT_8192E_2ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) {
3129		bt_busy = true;
3130		limited_dig = true;
3131	} else {
3132		bt_busy = false;
3133		limited_dig = false;
3134	}
3135
3136	btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
3137
3138	coex_dm->limited_dig = limited_dig;
3139	btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig);
3140
3141	btc8192e2ant_run_coexist_mechanism(btcoexist);
3142}
3143
3144void ex_btc8192e2ant_halt_notify(struct btc_coexist *btcoexist)
3145{
3146	struct rtl_priv *rtlpriv = btcoexist->adapter;
3147
3148	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Halt notify\n");
3149
3150	btc8192e2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
3151	ex_btc8192e2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
3152}
3153
3154void ex_btc8192e2ant_periodical(struct btc_coexist *btcoexist)
3155{
3156	struct rtl_priv *rtlpriv = btcoexist->adapter;
3157	static u8 dis_ver_info_cnt;
3158	u32 fw_ver = 0, bt_patch_ver = 0;
3159	struct btc_board_info *board_info = &btcoexist->board_info;
3160	struct btc_stack_info *stack_info = &btcoexist->stack_info;
3161
3162	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3163		"=======================Periodical=======================\n");
3164	if (dis_ver_info_cnt <= 5) {
3165		dis_ver_info_cnt += 1;
3166		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3167			"************************************************\n");
3168		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3169			"Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n",
3170			board_info->pg_ant_num, board_info->btdm_ant_num,
3171			board_info->btdm_ant_pos);
3172		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3173			"BT stack/ hci ext ver = %s / %d\n",
3174			((stack_info->profile_notified) ? "Yes" : "No"),
3175			stack_info->hci_version);
3176		btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
3177				   &bt_patch_ver);
3178		btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3179		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3180			"CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n",
3181			glcoex_ver_date_8192e_2ant, glcoex_ver_8192e_2ant,
3182			fw_ver, bt_patch_ver, bt_patch_ver);
3183		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3184			"************************************************\n");
3185	}
3186
3187	if (!btcoexist->auto_report_2ant) {
3188		btc8192e2ant_query_bt_info(btcoexist);
3189		btc8192e2ant_monitor_bt_ctr(btcoexist);
3190		btc8192e2ant_monitor_bt_enable_disable(btcoexist);
3191	} else {
3192		if (btc8192e2ant_is_wifi_status_changed(btcoexist) ||
3193		    coex_dm->auto_tdma_adjust)
3194			btc8192e2ant_run_coexist_mechanism(btcoexist);
3195	}
3196}
~/ Read-only file preview.