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}
3197