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