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