1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2012  Realtek Corporation.*/
3 
4 /************************************************************
5  * Description:
6  *
7  * This file is for RTL8821A Co-exist mechanism
8  *
9  * History
10  * 2012/08/22 Cosa first check in.
11  * 2012/11/14 Cosa Revise for 8821A 2Ant out sourcing.
12  *
13  ************************************************************/
14 
15 /************************************************************
16  * include files
17  ************************************************************/
18 #include "halbt_precomp.h"
19 /************************************************************
20  * Global variables, these are static variables
21  ************************************************************/
22 static struct coex_dm_8821a_2ant glcoex_dm_8821a_2ant;
23 static struct coex_dm_8821a_2ant *coex_dm = &glcoex_dm_8821a_2ant;
24 static struct coex_sta_8821a_2ant glcoex_sta_8821a_2ant;
25 static struct coex_sta_8821a_2ant *coex_sta = &glcoex_sta_8821a_2ant;
26 
27 static const char *const glbt_info_src_8821a_2ant[] = {
28 	"BT Info[wifi fw]",
29 	"BT Info[bt rsp]",
30 	"BT Info[bt auto report]",
31 };
32 
33 static u32 glcoex_ver_date_8821a_2ant = 20130618;
34 static u32 glcoex_ver_8821a_2ant = 0x5050;
35 
36 /************************************************************
37  * local function proto type if needed
38  *
39  * local function start with btc8821a2ant_
40  ************************************************************/
btc8821a2ant_bt_rssi_state(struct btc_coexist * btcoexist,u8 level_num,u8 rssi_thresh,u8 rssi_thresh1)41 static u8 btc8821a2ant_bt_rssi_state(struct btc_coexist *btcoexist,
42 				     u8 level_num, u8 rssi_thresh,
43 				     u8 rssi_thresh1)
44 {
45 	struct rtl_priv *rtlpriv = btcoexist->adapter;
46 	long bt_rssi = 0;
47 	u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;
48 
49 	bt_rssi = coex_sta->bt_rssi;
50 
51 	if (level_num == 2) {
52 		if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
53 		    (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
54 			if (bt_rssi >=
55 			    rssi_thresh + BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT) {
56 				bt_rssi_state = BTC_RSSI_STATE_HIGH;
57 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
58 					"[BTCoex], BT Rssi state switch to High\n");
59 			} else {
60 				bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
61 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
62 					"[BTCoex], BT Rssi state stay at Low\n");
63 			}
64 		} else {
65 			if (bt_rssi < rssi_thresh) {
66 				bt_rssi_state = BTC_RSSI_STATE_LOW;
67 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
68 					"[BTCoex], BT Rssi state switch to Low\n");
69 			} else {
70 				bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
71 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
72 					"[BTCoex], BT Rssi state stay at High\n");
73 			}
74 		}
75 	} else if (level_num == 3) {
76 		if (rssi_thresh > rssi_thresh1) {
77 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
78 				"[BTCoex], BT Rssi thresh error!!\n");
79 			return coex_sta->pre_bt_rssi_state;
80 		}
81 
82 		if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
83 		    (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
84 			if (bt_rssi >=
85 			    (rssi_thresh +
86 			     BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {
87 				bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
88 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
89 					"[BTCoex], BT Rssi state switch to Medium\n");
90 			} else {
91 				bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
92 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
93 					"[BTCoex], BT Rssi state stay at Low\n");
94 			}
95 		} else if ((coex_sta->pre_bt_rssi_state ==
96 			   BTC_RSSI_STATE_MEDIUM) ||
97 			   (coex_sta->pre_bt_rssi_state ==
98 			    BTC_RSSI_STATE_STAY_MEDIUM)) {
99 			if (bt_rssi >=
100 			    (rssi_thresh1 +
101 			     BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {
102 				bt_rssi_state = BTC_RSSI_STATE_HIGH;
103 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
104 					"[BTCoex], BT Rssi state switch to High\n");
105 			} else if (bt_rssi < rssi_thresh) {
106 				bt_rssi_state = BTC_RSSI_STATE_LOW;
107 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
108 					"[BTCoex], BT Rssi state switch to Low\n");
109 			} else {
110 				bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
111 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
112 					"[BTCoex], BT Rssi state stay at Medium\n");
113 			}
114 		} else {
115 			if (bt_rssi < rssi_thresh1) {
116 				bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
117 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
118 					"[BTCoex], BT Rssi state switch to Medium\n");
119 			} else {
120 				bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
121 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
122 					"[BTCoex], BT Rssi state stay at High\n");
123 			}
124 		}
125 	}
126 
127 	coex_sta->pre_bt_rssi_state = bt_rssi_state;
128 
129 	return bt_rssi_state;
130 }
131 
btc8821a2ant_wifi_rssi_state(struct btc_coexist * btcoexist,u8 index,u8 level_num,u8 rssi_thresh,u8 rssi_thresh1)132 static u8 btc8821a2ant_wifi_rssi_state(struct btc_coexist *btcoexist,
133 				       u8 index, u8 level_num,
134 				       u8 rssi_thresh, u8 rssi_thresh1)
135 {
136 	struct rtl_priv *rtlpriv = btcoexist->adapter;
137 	long wifi_rssi = 0;
138 	u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
139 
140 	btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
141 
142 	if (level_num == 2) {
143 		if ((coex_sta->pre_wifi_rssi_state[index] ==
144 		     BTC_RSSI_STATE_LOW) ||
145 		    (coex_sta->pre_wifi_rssi_state[index] ==
146 		     BTC_RSSI_STATE_STAY_LOW)) {
147 			if (wifi_rssi >=
148 			    (rssi_thresh+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {
149 				wifi_rssi_state = BTC_RSSI_STATE_HIGH;
150 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
151 					"[BTCoex], wifi RSSI state switch to High\n");
152 			} else {
153 				wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
154 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
155 					"[BTCoex], wifi RSSI state stay at Low\n");
156 			}
157 		} else {
158 			if (wifi_rssi < rssi_thresh) {
159 				wifi_rssi_state = BTC_RSSI_STATE_LOW;
160 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
161 					"[BTCoex], wifi RSSI state switch to Low\n");
162 			} else {
163 				wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
164 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
165 					"[BTCoex], wifi RSSI state stay at High\n");
166 			}
167 		}
168 	} else if (level_num == 3) {
169 		if (rssi_thresh > rssi_thresh1) {
170 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
171 				"[BTCoex], wifi RSSI thresh error!!\n");
172 			return coex_sta->pre_wifi_rssi_state[index];
173 		}
174 
175 		if ((coex_sta->pre_wifi_rssi_state[index] ==
176 		    BTC_RSSI_STATE_LOW) ||
177 		    (coex_sta->pre_wifi_rssi_state[index] ==
178 		     BTC_RSSI_STATE_STAY_LOW)) {
179 			if (wifi_rssi >=
180 			    (rssi_thresh +
181 			     BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {
182 				wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
183 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
184 					"[BTCoex], wifi RSSI state switch to Medium\n");
185 			} else {
186 				wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
187 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
188 					"[BTCoex], wifi RSSI state stay at Low\n");
189 			}
190 		} else if ((coex_sta->pre_wifi_rssi_state[index] ==
191 			   BTC_RSSI_STATE_MEDIUM) ||
192 			   (coex_sta->pre_wifi_rssi_state[index] ==
193 			    BTC_RSSI_STATE_STAY_MEDIUM)) {
194 			if (wifi_rssi >= (rssi_thresh1 +
195 			    BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT)) {
196 				wifi_rssi_state = BTC_RSSI_STATE_HIGH;
197 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
198 					"[BTCoex], wifi RSSI state switch to High\n");
199 			} else if (wifi_rssi < rssi_thresh) {
200 				wifi_rssi_state = BTC_RSSI_STATE_LOW;
201 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
202 					"[BTCoex], wifi RSSI state switch to Low\n");
203 			} else {
204 				wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
205 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
206 					"[BTCoex], wifi RSSI state stay at Medium\n");
207 			}
208 		} else {
209 			if (wifi_rssi < rssi_thresh1) {
210 				wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
211 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
212 					"[BTCoex], wifi RSSI state switch to Medium\n");
213 			} else {
214 				wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
215 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
216 					"[BTCoex], wifi RSSI state stay at High\n");
217 			}
218 		}
219 	}
220 	coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
221 
222 	return wifi_rssi_state;
223 }
224 
225 static
btc8821a2ant_limited_rx(struct btc_coexist * btcoexist,bool force_exec,bool rej_ap_agg_pkt,bool bt_ctrl_agg_buf_size,u8 agg_buf_size)226 void btc8821a2ant_limited_rx(struct btc_coexist *btcoexist, bool force_exec,
227 			     bool rej_ap_agg_pkt, bool bt_ctrl_agg_buf_size,
228 			     u8 agg_buf_size)
229 {
230 	bool reject_rx_agg = rej_ap_agg_pkt;
231 	bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
232 	u8 rx_agg_size = agg_buf_size;
233 
234 	/* Rx Aggregation related setting */
235 	btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
236 			   &reject_rx_agg);
237 	/* decide BT control aggregation buf size or not */
238 	btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
239 			   &bt_ctrl_rx_agg_size);
240 	/* aggregation buf size, works when BT control Rx aggregation size */
241 	btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
242 	/* real update aggregation setting */
243 	btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
244 }
245 
btc8821a2ant_monitor_bt_ctr(struct btc_coexist * btcoexist)246 static void btc8821a2ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
247 {
248 	struct rtl_priv *rtlpriv = btcoexist->adapter;
249 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
250 	u32 reg_hp_txrx, reg_lp_txrx, u4tmp;
251 	u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
252 
253 	reg_hp_txrx = 0x770;
254 	reg_lp_txrx = 0x774;
255 
256 	u4tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
257 	reg_hp_tx = u4tmp & MASKLWORD;
258 	reg_hp_rx = (u4tmp & MASKHWORD) >> 16;
259 
260 	u4tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
261 	reg_lp_tx = u4tmp & MASKLWORD;
262 	reg_lp_rx = (u4tmp & MASKHWORD) >> 16;
263 
264 	coex_sta->high_priority_tx = reg_hp_tx;
265 	coex_sta->high_priority_rx = reg_hp_rx;
266 	coex_sta->low_priority_tx = reg_lp_tx;
267 	coex_sta->low_priority_rx = reg_lp_rx;
268 
269 	if ((coex_sta->low_priority_rx >= 950) &&
270 	    (coex_sta->low_priority_rx >= coex_sta->low_priority_tx) &&
271 	    (!coex_sta->under_ips))
272 		bt_link_info->slave_role = true;
273 	else
274 		bt_link_info->slave_role = false;
275 
276 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
277 		"[BTCoex], High Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",
278 		reg_hp_txrx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);
279 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
280 		"[BTCoex], Low Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",
281 		reg_lp_txrx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx);
282 
283 	/* reset counter */
284 	btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
285 }
286 
btc8821a2ant_monitor_wifi_ctr(struct btc_coexist * btcoexist)287 static void btc8821a2ant_monitor_wifi_ctr(struct btc_coexist *btcoexist)
288 {
289 	if (coex_sta->under_ips) {
290 		coex_sta->crc_ok_cck = 0;
291 		coex_sta->crc_ok_11g = 0;
292 		coex_sta->crc_ok_11n = 0;
293 		coex_sta->crc_ok_11n_agg = 0;
294 
295 		coex_sta->crc_err_cck = 0;
296 		coex_sta->crc_err_11g = 0;
297 		coex_sta->crc_err_11n = 0;
298 		coex_sta->crc_err_11n_agg = 0;
299 	} else {
300 		coex_sta->crc_ok_cck =
301 			btcoexist->btc_read_4byte(btcoexist, 0xf88);
302 		coex_sta->crc_ok_11g =
303 			btcoexist->btc_read_2byte(btcoexist, 0xf94);
304 		coex_sta->crc_ok_11n =
305 			btcoexist->btc_read_2byte(btcoexist, 0xf90);
306 		coex_sta->crc_ok_11n_agg =
307 			btcoexist->btc_read_2byte(btcoexist, 0xfb8);
308 
309 		coex_sta->crc_err_cck =
310 			btcoexist->btc_read_4byte(btcoexist, 0xf84);
311 		coex_sta->crc_err_11g =
312 			btcoexist->btc_read_2byte(btcoexist, 0xf96);
313 		coex_sta->crc_err_11n =
314 			btcoexist->btc_read_2byte(btcoexist, 0xf92);
315 		coex_sta->crc_err_11n_agg =
316 			btcoexist->btc_read_2byte(btcoexist, 0xfba);
317 	}
318 
319 	/* reset counter */
320 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x1);
321 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x0);
322 }
323 
btc8821a2ant_query_bt_info(struct btc_coexist * btcoexist)324 static void btc8821a2ant_query_bt_info(struct btc_coexist *btcoexist)
325 {
326 	struct rtl_priv *rtlpriv = btcoexist->adapter;
327 	u8 h2c_parameter[1] = {0};
328 
329 	coex_sta->c2h_bt_info_req_sent = true;
330 
331 	h2c_parameter[0] |= BIT0; /* trigger */
332 
333 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
334 		"[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n",
335 		h2c_parameter[0]);
336 
337 	btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
338 }
339 
btc8821a2ant_is_wifi_status_changed(struct btc_coexist * btcoexist)340 static bool btc8821a2ant_is_wifi_status_changed(struct btc_coexist *btcoexist)
341 {
342 	static bool pre_wifi_busy = true;
343 	static bool pre_under_4way = true;
344 	static bool pre_bt_hs_on = true;
345 	bool wifi_busy = false, under_4way = false, bt_hs_on = false;
346 	bool wifi_connected = false;
347 	u8 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
348 
349 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
350 			   &wifi_connected);
351 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
352 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
353 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
354 			   &under_4way);
355 
356 	if (wifi_connected) {
357 		if (wifi_busy != pre_wifi_busy) {
358 			pre_wifi_busy = wifi_busy;
359 			return true;
360 		}
361 		if (under_4way != pre_under_4way) {
362 			pre_under_4way = under_4way;
363 			return true;
364 		}
365 		if (bt_hs_on != pre_bt_hs_on) {
366 			pre_bt_hs_on = bt_hs_on;
367 			return true;
368 		}
369 
370 		wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 3, 2,
371 				BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
372 
373 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
374 		    (wifi_rssi_state == BTC_RSSI_STATE_LOW))
375 			return true;
376 	}
377 
378 	return false;
379 }
380 
btc8821a2ant_update_bt_link_info(struct btc_coexist * btcoexist)381 static void btc8821a2ant_update_bt_link_info(struct btc_coexist *btcoexist)
382 {
383 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
384 	bool bt_hs_on = false;
385 
386 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
387 
388 	bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
389 	bt_link_info->sco_exist = coex_sta->sco_exist;
390 	bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
391 	bt_link_info->pan_exist = coex_sta->pan_exist;
392 	bt_link_info->hid_exist = coex_sta->hid_exist;
393 
394 	/* work around for HS mode. */
395 	if (bt_hs_on) {
396 		bt_link_info->pan_exist = true;
397 		bt_link_info->bt_link_exist = true;
398 	}
399 
400 	/* check if Sco only */
401 	if (bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
402 	    !bt_link_info->pan_exist && !bt_link_info->hid_exist)
403 		bt_link_info->sco_only = true;
404 	else
405 		bt_link_info->sco_only = false;
406 
407 	/* check if A2dp only */
408 	if (!bt_link_info->sco_exist && bt_link_info->a2dp_exist &&
409 	    !bt_link_info->pan_exist && !bt_link_info->hid_exist)
410 		bt_link_info->a2dp_only = true;
411 	else
412 		bt_link_info->a2dp_only = false;
413 
414 	/* check if Pan only */
415 	if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
416 	    bt_link_info->pan_exist && !bt_link_info->hid_exist)
417 		bt_link_info->pan_only = true;
418 	else
419 		bt_link_info->pan_only = false;
420 
421 	/* check if Hid only */
422 	if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
423 	    !bt_link_info->pan_exist && bt_link_info->hid_exist)
424 		bt_link_info->hid_only = true;
425 	else
426 		bt_link_info->hid_only = false;
427 }
428 
btc8821a2ant_action_algorithm(struct btc_coexist * btcoexist)429 static u8 btc8821a2ant_action_algorithm(struct btc_coexist *btcoexist)
430 {
431 	struct rtl_priv *rtlpriv = btcoexist->adapter;
432 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
433 	bool bt_hs_on = false;
434 	u8 algorithm = BT_8821A_2ANT_COEX_ALGO_UNDEFINED;
435 	u8 num_of_diff_profile = 0;
436 
437 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
438 
439 	if (!bt_link_info->bt_link_exist) {
440 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
441 			"[BTCoex], No BT link exists!!!\n");
442 		return algorithm;
443 	}
444 
445 	if (bt_link_info->sco_exist)
446 		num_of_diff_profile++;
447 	if (bt_link_info->hid_exist)
448 		num_of_diff_profile++;
449 	if (bt_link_info->pan_exist)
450 		num_of_diff_profile++;
451 	if (bt_link_info->a2dp_exist)
452 		num_of_diff_profile++;
453 
454 	if (num_of_diff_profile == 1) {
455 		if (bt_link_info->sco_exist) {
456 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
457 				"[BTCoex], SCO only\n");
458 			algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
459 		} else {
460 			if (bt_link_info->hid_exist) {
461 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
462 					"[BTCoex], HID only\n");
463 				algorithm = BT_8821A_2ANT_COEX_ALGO_HID;
464 			} else if (bt_link_info->a2dp_exist) {
465 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
466 					"[BTCoex], A2DP only\n");
467 				algorithm = BT_8821A_2ANT_COEX_ALGO_A2DP;
468 			} else if (bt_link_info->pan_exist) {
469 				if (bt_hs_on) {
470 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
471 						DBG_LOUD,
472 						"[BTCoex], PAN(HS) only\n");
473 					algorithm = BT_8821A_2ANT_COEX_ALGO_PANHS;
474 				} else {
475 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
476 						DBG_LOUD,
477 						"[BTCoex], PAN(EDR) only\n");
478 					algorithm = BT_8821A_2ANT_COEX_ALGO_PANEDR;
479 				}
480 			}
481 		}
482 	} else if (num_of_diff_profile == 2) {
483 		if (bt_link_info->sco_exist) {
484 			if (bt_link_info->hid_exist) {
485 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
486 					"[BTCoex], SCO + HID\n");
487 				algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
488 			} else if (bt_link_info->a2dp_exist) {
489 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
490 					"[BTCoex], SCO + A2DP ==> SCO\n");
491 				algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
492 			} else if (bt_link_info->pan_exist) {
493 				if (bt_hs_on) {
494 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
495 						DBG_LOUD,
496 						"[BTCoex], SCO + PAN(HS)\n");
497 					algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
498 				} else {
499 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
500 						DBG_LOUD,
501 						"[BTCoex], SCO + PAN(EDR)\n");
502 					algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
503 				}
504 			}
505 		} else {
506 			if (bt_link_info->hid_exist &&
507 			    bt_link_info->a2dp_exist) {
508 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
509 					"[BTCoex], HID + A2DP\n");
510 				algorithm = BT_8821A_2ANT_COEX_ALGO_HID_A2DP;
511 			} else if (bt_link_info->hid_exist &&
512 				bt_link_info->pan_exist) {
513 				if (bt_hs_on) {
514 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
515 						DBG_LOUD,
516 						"[BTCoex], HID + PAN(HS)\n");
517 					algorithm = BT_8821A_2ANT_COEX_ALGO_HID;
518 				} else {
519 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
520 						DBG_LOUD,
521 						"[BTCoex], HID + PAN(EDR)\n");
522 					algorithm =
523 					    BT_8821A_2ANT_COEX_ALGO_PANEDR_HID;
524 				}
525 			} else if (bt_link_info->pan_exist &&
526 				bt_link_info->a2dp_exist) {
527 				if (bt_hs_on) {
528 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
529 						DBG_LOUD,
530 						"[BTCoex], A2DP + PAN(HS)\n");
531 					algorithm =
532 					    BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS;
533 				} else {
534 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
535 						DBG_LOUD,
536 						"[BTCoex], A2DP + PAN(EDR)\n");
537 					algorithm =
538 					    BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP;
539 				}
540 			}
541 		}
542 	} else if (num_of_diff_profile == 3) {
543 		if (bt_link_info->sco_exist) {
544 			if (bt_link_info->hid_exist &&
545 			    bt_link_info->a2dp_exist) {
546 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
547 					"[BTCoex], SCO + HID + A2DP ==> HID\n");
548 				algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
549 			} else if (bt_link_info->hid_exist &&
550 				bt_link_info->pan_exist) {
551 				if (bt_hs_on) {
552 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
553 						DBG_LOUD,
554 						"[BTCoex], SCO + HID + PAN(HS)\n");
555 					algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
556 				} else {
557 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
558 						DBG_LOUD,
559 						"[BTCoex], SCO + HID + PAN(EDR)\n");
560 					algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
561 				}
562 			} else if (bt_link_info->pan_exist &&
563 				   bt_link_info->a2dp_exist) {
564 				if (bt_hs_on) {
565 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
566 						DBG_LOUD,
567 						"[BTCoex], SCO + A2DP + PAN(HS)\n");
568 					algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
569 				} else {
570 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
571 						DBG_LOUD,
572 						"[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n");
573 					algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
574 				}
575 			}
576 		} else {
577 			if (bt_link_info->hid_exist &&
578 			    bt_link_info->pan_exist &&
579 			    bt_link_info->a2dp_exist) {
580 				if (bt_hs_on) {
581 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
582 						DBG_LOUD,
583 						"[BTCoex], HID + A2DP + PAN(HS)\n");
584 					algorithm =
585 					    BT_8821A_2ANT_COEX_ALGO_HID_A2DP;
586 				} else {
587 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
588 						DBG_LOUD,
589 						"[BTCoex], HID + A2DP + PAN(EDR)\n");
590 					algorithm =
591 					BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
592 				}
593 			}
594 		}
595 	} else if (num_of_diff_profile >= 3) {
596 		if (bt_link_info->sco_exist) {
597 			if (bt_link_info->hid_exist &&
598 			    bt_link_info->pan_exist &&
599 			    bt_link_info->a2dp_exist) {
600 				if (bt_hs_on) {
601 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
602 						DBG_LOUD,
603 						"[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n");
604 
605 				} else {
606 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
607 						DBG_LOUD,
608 						"[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");
609 					algorithm = BT_8821A_2ANT_COEX_ALGO_SCO;
610 				}
611 			}
612 		}
613 	}
614 	return algorithm;
615 }
616 
btc8821a2ant_set_fw_dac_swing_lvl(struct btc_coexist * btcoexist,u8 dac_swing_lvl)617 static void btc8821a2ant_set_fw_dac_swing_lvl(struct btc_coexist *btcoexist,
618 					      u8 dac_swing_lvl)
619 {
620 	struct rtl_priv *rtlpriv = btcoexist->adapter;
621 	u8 h2c_parameter[1] = {0};
622 
623 	/* There are several type of dacswing
624 	 * 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6
625 	 */
626 	h2c_parameter[0] = dac_swing_lvl;
627 
628 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
629 		"[BTCoex], Set Dac Swing Level = 0x%x\n", dac_swing_lvl);
630 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
631 		"[BTCoex], FW write 0x64 = 0x%x\n", h2c_parameter[0]);
632 
633 	btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);
634 }
635 
btc8821a2ant_set_fw_dec_bt_pwr(struct btc_coexist * btcoexist,u8 dec_bt_pwr_lvl)636 static void btc8821a2ant_set_fw_dec_bt_pwr(struct btc_coexist *btcoexist,
637 					   u8 dec_bt_pwr_lvl)
638 {
639 	struct rtl_priv *rtlpriv = btcoexist->adapter;
640 	u8 h2c_parameter[1] = {0};
641 
642 	h2c_parameter[0] = dec_bt_pwr_lvl;
643 
644 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
645 		"[BTCoex], decrease Bt Power Level : %u, FW write 0x62 = 0x%x\n",
646 		dec_bt_pwr_lvl, h2c_parameter[0]);
647 
648 	btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter);
649 }
650 
btc8821a2ant_dec_bt_pwr(struct btc_coexist * btcoexist,bool force_exec,u8 dec_bt_pwr_lvl)651 static void btc8821a2ant_dec_bt_pwr(struct btc_coexist *btcoexist,
652 				    bool force_exec, u8 dec_bt_pwr_lvl)
653 {
654 	struct rtl_priv *rtlpriv = btcoexist->adapter;
655 
656 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
657 		"[BTCoex], %s Dec BT power level = %u\n",
658 		(force_exec ? "force to" : ""), dec_bt_pwr_lvl);
659 	coex_dm->cur_dec_bt_pwr_lvl = dec_bt_pwr_lvl;
660 
661 	if (!force_exec) {
662 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
663 			"[BTCoex], pre_dec_bt_pwr_lvl = %d, cur_dec_bt_pwr_lvl = %d\n",
664 			coex_dm->pre_dec_bt_pwr_lvl,
665 			    coex_dm->cur_dec_bt_pwr_lvl);
666 
667 		if (coex_dm->pre_dec_bt_pwr_lvl == coex_dm->cur_dec_bt_pwr_lvl)
668 			return;
669 	}
670 	btc8821a2ant_set_fw_dec_bt_pwr(btcoexist, coex_dm->cur_dec_bt_pwr_lvl);
671 
672 	coex_dm->pre_dec_bt_pwr_lvl = coex_dm->cur_dec_bt_pwr_lvl;
673 }
674 
btc8821a2ant_fw_dac_swing_lvl(struct btc_coexist * btcoexist,bool force_exec,u8 fw_dac_swing_lvl)675 static void btc8821a2ant_fw_dac_swing_lvl(struct btc_coexist *btcoexist,
676 					  bool force_exec, u8 fw_dac_swing_lvl)
677 {
678 	struct rtl_priv *rtlpriv = btcoexist->adapter;
679 
680 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
681 		"[BTCoex], %s set FW Dac Swing level = %d\n",
682 		(force_exec ? "force to" : ""), fw_dac_swing_lvl);
683 	coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl;
684 
685 	if (!force_exec) {
686 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
687 			"[BTCoex], pre_fw_dac_swing_lvl = %d, cur_fw_dac_swing_lvl = %d\n",
688 			coex_dm->pre_fw_dac_swing_lvl,
689 			coex_dm->cur_fw_dac_swing_lvl);
690 
691 		if (coex_dm->pre_fw_dac_swing_lvl ==
692 		    coex_dm->cur_fw_dac_swing_lvl)
693 			return;
694 	}
695 
696 	btc8821a2ant_set_fw_dac_swing_lvl(btcoexist,
697 					  coex_dm->cur_fw_dac_swing_lvl);
698 
699 	coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;
700 }
701 
btc8821a2ant_set_sw_penalty_tx_rate_adaptive(struct btc_coexist * btcoexist,bool low_penalty_ra)702 static void btc8821a2ant_set_sw_penalty_tx_rate_adaptive(
703 		struct btc_coexist *btcoexist, bool low_penalty_ra)
704 {
705 	struct rtl_priv *rtlpriv = btcoexist->adapter;
706 	u8 h2c_parameter[6] = {0};
707 
708 	h2c_parameter[0] = 0x6;	/* opCode, 0x6 = Retry_Penalty */
709 
710 	if (low_penalty_ra) {
711 		h2c_parameter[1] |= BIT0;
712 		/* normal rate except MCS7/6/5, OFDM54/48/36 */
713 		h2c_parameter[2] = 0x00;
714 		/* MCS7 or OFDM54 */
715 		h2c_parameter[3] = 0xf5;
716 		/* MCS6 or OFDM48 */
717 		h2c_parameter[4] = 0xa0;
718 		/* MCS5 or OFDM36 */
719 		h2c_parameter[5] = 0xa0;
720 	}
721 
722 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
723 		"[BTCoex], set WiFi Low-Penalty Retry: %s",
724 		(low_penalty_ra ? "ON!!" : "OFF!!"));
725 
726 	btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
727 }
728 
btc8821a2ant_low_penalty_ra(struct btc_coexist * btcoexist,bool force_exec,bool low_penalty_ra)729 static void btc8821a2ant_low_penalty_ra(struct btc_coexist *btcoexist,
730 					bool force_exec, bool low_penalty_ra)
731 {
732 	struct rtl_priv *rtlpriv = btcoexist->adapter;
733 
734 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
735 		"[BTCoex], %s turn LowPenaltyRA = %s\n",
736 		(force_exec ? "force to" : ""),
737 		((low_penalty_ra) ? "ON" : "OFF"));
738 	coex_dm->cur_low_penalty_ra = low_penalty_ra;
739 
740 	if (!force_exec) {
741 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
742 			"[BTCoex], pre_low_penalty_ra = %d, cur_low_penalty_ra = %d\n",
743 			coex_dm->pre_low_penalty_ra,
744 			coex_dm->cur_low_penalty_ra);
745 
746 		if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
747 			return;
748 	}
749 	btc8821a2ant_set_sw_penalty_tx_rate_adaptive(btcoexist,
750 					 coex_dm->cur_low_penalty_ra);
751 
752 	coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
753 }
754 
btc8821a2ant_set_dac_swing_reg(struct btc_coexist * btcoexist,u32 level)755 static void btc8821a2ant_set_dac_swing_reg(struct btc_coexist *btcoexist,
756 					   u32 level)
757 {
758 	struct rtl_priv *rtlpriv = btcoexist->adapter;
759 	u8 val = (u8)level;
760 
761 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
762 		"[BTCoex], Write SwDacSwing = 0x%x\n", level);
763 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0xc5b, 0x3e, val);
764 }
765 
btc8821a2ant_set_sw_full_dac_swing(struct btc_coexist * btcoexist,bool sw_dac_swing_on,u32 sw_dac_swing_lvl)766 static void btc8821a2ant_set_sw_full_dac_swing(struct btc_coexist *btcoexist,
767 					       bool sw_dac_swing_on,
768 					       u32 sw_dac_swing_lvl)
769 {
770 	if (sw_dac_swing_on)
771 		btc8821a2ant_set_dac_swing_reg(btcoexist, sw_dac_swing_lvl);
772 	else
773 		btc8821a2ant_set_dac_swing_reg(btcoexist, 0x18);
774 }
775 
btc8821a2ant_dac_swing(struct btc_coexist * btcoexist,bool force_exec,bool dac_swing_on,u32 dac_swing_lvl)776 static void btc8821a2ant_dac_swing(struct btc_coexist *btcoexist,
777 				   bool force_exec, bool dac_swing_on,
778 				   u32 dac_swing_lvl)
779 {
780 	struct rtl_priv *rtlpriv = btcoexist->adapter;
781 
782 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
783 		"[BTCoex], %s turn DacSwing = %s, dac_swing_lvl = 0x%x\n",
784 		(force_exec ? "force to" : ""),
785 		((dac_swing_on) ? "ON" : "OFF"),
786 		dac_swing_lvl);
787 	coex_dm->cur_dac_swing_on = dac_swing_on;
788 	coex_dm->cur_dac_swing_lvl = dac_swing_lvl;
789 
790 	if (!force_exec) {
791 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
792 			"[BTCoex], pre_dac_swing_on = %d, pre_dac_swing_lvl = 0x%x, cur_dac_swing_on = %d, cur_dac_swing_lvl = 0x%x\n",
793 			coex_dm->pre_dac_swing_on,
794 			coex_dm->pre_dac_swing_lvl,
795 			coex_dm->cur_dac_swing_on,
796 			coex_dm->cur_dac_swing_lvl);
797 
798 		if ((coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) &&
799 		    (coex_dm->pre_dac_swing_lvl ==
800 		     coex_dm->cur_dac_swing_lvl))
801 			return;
802 	}
803 	mdelay(30);
804 	btc8821a2ant_set_sw_full_dac_swing(btcoexist, dac_swing_on,
805 					   dac_swing_lvl);
806 
807 	coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on;
808 	coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl;
809 }
810 
btc8821a2ant_set_coex_table(struct btc_coexist * btcoexist,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)811 static void btc8821a2ant_set_coex_table(struct btc_coexist *btcoexist,
812 					u32 val0x6c0, u32 val0x6c4,
813 					u32 val0x6c8, u8 val0x6cc)
814 {
815 	struct rtl_priv *rtlpriv = btcoexist->adapter;
816 
817 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
818 		"[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0);
819 	btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
820 
821 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
822 		"[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4);
823 	btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
824 
825 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
826 		"[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8);
827 	btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
828 
829 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
830 		"[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc);
831 	btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
832 }
833 
btc8821a2ant_coex_table(struct btc_coexist * btcoexist,bool force_exec,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)834 static void btc8821a2ant_coex_table(struct btc_coexist *btcoexist,
835 				    bool force_exec, u32 val0x6c0,
836 				    u32 val0x6c4, u32 val0x6c8, u8 val0x6cc)
837 {
838 	struct rtl_priv *rtlpriv = btcoexist->adapter;
839 
840 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
841 		"[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6c8 = 0x%x, 0x6cc = 0x%x\n",
842 		(force_exec ? "force to" : ""),
843 		val0x6c0, val0x6c4, val0x6c8, val0x6cc);
844 	coex_dm->cur_val0x6c0 = val0x6c0;
845 	coex_dm->cur_val0x6c4 = val0x6c4;
846 	coex_dm->cur_val0x6c8 = val0x6c8;
847 	coex_dm->cur_val0x6cc = val0x6cc;
848 
849 	if (!force_exec) {
850 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
851 			"[BTCoex], pre_val0x6c0 = 0x%x, pre_val0x6c4 = 0x%x, pre_val0x6c8 = 0x%x, pre_val0x6cc = 0x%x !!\n",
852 			coex_dm->pre_val0x6c0,
853 			coex_dm->pre_val0x6c4,
854 			coex_dm->pre_val0x6c8,
855 			coex_dm->pre_val0x6cc);
856 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
857 			"[BTCoex], cur_val0x6c0 = 0x%x, cur_val0x6c4 = 0x%x, cur_val0x6c8 = 0x%x, cur_val0x6cc = 0x%x !!\n",
858 			coex_dm->cur_val0x6c0,
859 			coex_dm->cur_val0x6c4,
860 			coex_dm->cur_val0x6c8,
861 			coex_dm->cur_val0x6cc);
862 
863 		if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
864 		    (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
865 		    (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
866 		    (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
867 			return;
868 	}
869 	btc8821a2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8,
870 				    val0x6cc);
871 
872 	coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
873 	coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
874 	coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
875 	coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
876 }
877 
btc8821a2ant_coex_table_with_type(struct btc_coexist * btcoexist,bool force_exec,u8 type)878 static void btc8821a2ant_coex_table_with_type(struct btc_coexist *btcoexist,
879 					      bool force_exec, u8 type)
880 {
881 	coex_sta->coex_table_type = type;
882 
883 	switch (type) {
884 	case 0:
885 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x55555555,
886 					0x55555555, 0xffffff, 0x3);
887 		break;
888 	case 1:
889 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x55555555,
890 					0x5afa5afa, 0xffffff, 0x3);
891 		break;
892 	case 2:
893 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x5ada5ada,
894 					0x5ada5ada, 0xffffff, 0x3);
895 		break;
896 	case 3:
897 		btc8821a2ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,
898 					0xaaaaaaaa, 0xffffff, 0x3);
899 		break;
900 	case 4:
901 		btc8821a2ant_coex_table(btcoexist, force_exec, 0xffffffff,
902 					0xffffffff, 0xffffff, 0x3);
903 		break;
904 	case 5:
905 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
906 					0x5fff5fff, 0xffffff, 0x3);
907 		break;
908 	case 6:
909 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
910 					0x5a5a5a5a, 0xffffff, 0x3);
911 		break;
912 	case 7:
913 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
914 					0x5ada5ada, 0xffffff, 0x3);
915 		break;
916 	case 8:
917 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
918 					0x5ada5ada, 0xffffff, 0x3);
919 		break;
920 	case 9:
921 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
922 					0x5ada5ada, 0xffffff, 0x3);
923 		break;
924 	case 10:
925 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
926 					0x5ada5ada, 0xffffff, 0x3);
927 		break;
928 	case 11:
929 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
930 					0x5ada5ada, 0xffffff, 0x3);
931 		break;
932 	case 12:
933 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
934 					0x5ada5ada, 0xffffff, 0x3);
935 		break;
936 	case 13:
937 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
938 					0xaaaaaaaa, 0xffffff, 0x3);
939 		break;
940 	case 14:
941 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
942 					0x5ada5ada, 0xffffff, 0x3);
943 		break;
944 	case 15:
945 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
946 					0xaaaaaaaa, 0xffffff, 0x3);
947 		break;
948 	case 16:
949 		btc8821a2ant_coex_table(btcoexist, force_exec, 0x5fdf5fdf,
950 					0x5fdb5fdb, 0xffffff, 0x3);
951 		break;
952 	case 17:
953 		btc8821a2ant_coex_table(btcoexist, force_exec, 0xfafafafa,
954 					0xfafafafa, 0xffffff, 0x3);
955 		break;
956 	default:
957 		break;
958 	}
959 }
960 
btc8821a2ant_set_fw_ignore_wlan_act(struct btc_coexist * btcoex,bool enable)961 static void btc8821a2ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoex,
962 						bool enable)
963 {
964 	struct rtl_priv *rtlpriv = btcoex->adapter;
965 	u8 h2c_parameter[1] = {0};
966 
967 	if (enable)
968 		h2c_parameter[0] |= BIT0; /* function enable */
969 
970 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
971 		"[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
972 		h2c_parameter[0]);
973 
974 	btcoex->btc_fill_h2c(btcoex, 0x63, 1, h2c_parameter);
975 }
976 
btc8821a2ant_set_lps_rpwm(struct btc_coexist * btcoexist,u8 lps_val,u8 rpwm_val)977 static void btc8821a2ant_set_lps_rpwm(struct btc_coexist *btcoexist, u8 lps_val,
978 				      u8 rpwm_val)
979 {
980 	u8 lps = lps_val;
981 	u8 rpwm = rpwm_val;
982 
983 	btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
984 	btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
985 }
986 
btc8821a2ant_lps_rpwm(struct btc_coexist * btcoexist,bool force_exec,u8 lps_val,u8 rpwm_val)987 static void btc8821a2ant_lps_rpwm(struct btc_coexist *btcoexist,
988 				  bool force_exec, u8 lps_val, u8 rpwm_val)
989 {
990 	coex_dm->cur_lps = lps_val;
991 	coex_dm->cur_rpwm = rpwm_val;
992 
993 	if (!force_exec) {
994 		if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
995 		    (coex_dm->pre_rpwm == coex_dm->cur_rpwm))
996 			return;
997 	}
998 	btc8821a2ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
999 
1000 	coex_dm->pre_lps = coex_dm->cur_lps;
1001 	coex_dm->pre_rpwm = coex_dm->cur_rpwm;
1002 }
1003 
btc8821a2ant_ignore_wlan_act(struct btc_coexist * btcoexist,bool force_exec,bool enable)1004 static void btc8821a2ant_ignore_wlan_act(struct btc_coexist *btcoexist,
1005 					 bool force_exec, bool enable)
1006 {
1007 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1008 
1009 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1010 		"[BTCoex], %s turn Ignore WlanAct %s\n",
1011 		(force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
1012 	coex_dm->cur_ignore_wlan_act = enable;
1013 
1014 	if (!force_exec) {
1015 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1016 			"[BTCoex], pre_ignore_wlan_act = %d, cur_ignore_wlan_act = %d!!\n",
1017 			coex_dm->pre_ignore_wlan_act,
1018 			 coex_dm->cur_ignore_wlan_act);
1019 
1020 		if (coex_dm->pre_ignore_wlan_act ==
1021 		    coex_dm->cur_ignore_wlan_act)
1022 			return;
1023 	}
1024 	btc8821a2ant_set_fw_ignore_wlan_act(btcoexist, enable);
1025 
1026 	coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
1027 }
1028 
btc8821a2ant_set_fw_ps_tdma(struct btc_coexist * btcoexist,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 byte5)1029 static void btc8821a2ant_set_fw_ps_tdma(struct btc_coexist *btcoexist,
1030 					u8 byte1, u8 byte2, u8 byte3,
1031 					u8 byte4, u8 byte5)
1032 {
1033 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1034 	u8 h2c_parameter[5];
1035 
1036 	h2c_parameter[0] = byte1;
1037 	h2c_parameter[1] = byte2;
1038 	h2c_parameter[2] = byte3;
1039 	h2c_parameter[3] = byte4;
1040 	h2c_parameter[4] = byte5;
1041 
1042 	coex_dm->ps_tdma_para[0] = byte1;
1043 	coex_dm->ps_tdma_para[1] = byte2;
1044 	coex_dm->ps_tdma_para[2] = byte3;
1045 	coex_dm->ps_tdma_para[3] = byte4;
1046 	coex_dm->ps_tdma_para[4] = byte5;
1047 
1048 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1049 		"[BTCoex], FW write 0x60(5bytes) = 0x%x%08x\n",
1050 		h2c_parameter[0],
1051 		h2c_parameter[1] << 24 |
1052 		h2c_parameter[2] << 16 |
1053 		h2c_parameter[3] << 8 |
1054 		h2c_parameter[4]);
1055 
1056 	btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1057 }
1058 
btc8821a2ant_sw_mechanism1(struct btc_coexist * btcoexist,bool shrink_rx_lpf,bool low_penalty_ra,bool limited_dig,bool bt_lna_constrain)1059 static void btc8821a2ant_sw_mechanism1(struct btc_coexist *btcoexist,
1060 				       bool shrink_rx_lpf, bool low_penalty_ra,
1061 				       bool limited_dig, bool bt_lna_constrain)
1062 {
1063 	btc8821a2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
1064 }
1065 
btc8821a2ant_sw_mechanism2(struct btc_coexist * btcoexist,bool agc_table_shift,bool adc_back_off,bool sw_dac_swing,u32 dac_swing_lvl)1066 static void btc8821a2ant_sw_mechanism2(struct btc_coexist *btcoexist,
1067 				       bool agc_table_shift, bool adc_back_off,
1068 				       bool sw_dac_swing, u32 dac_swing_lvl)
1069 {
1070 	btc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, sw_dac_swing,
1071 			       dac_swing_lvl);
1072 }
1073 
btc8821a2ant_set_ant_path(struct btc_coexist * btcoexist,u8 ant_pos_type,bool init_hw_cfg,bool wifi_off)1074 static void btc8821a2ant_set_ant_path(struct btc_coexist *btcoexist,
1075 				      u8 ant_pos_type, bool init_hw_cfg,
1076 				      bool wifi_off)
1077 {
1078 	struct btc_board_info *board_info = &btcoexist->board_info;
1079 	u32 u4tmp = 0;
1080 	u8 h2c_parameter[2] = {0};
1081 
1082 	if (init_hw_cfg) {
1083 		/*  0x4c[23] = 0, 0x4c[24] = 1  Antenna control by WL/BT */
1084 		u4tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
1085 		u4tmp &= ~BIT23;
1086 		u4tmp |= BIT24;
1087 		btcoexist->btc_write_4byte(btcoexist, 0x4c, u4tmp);
1088 
1089 		btcoexist->btc_write_4byte(btcoexist, 0x974, 0x3ff);
1090 
1091 		if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {
1092 			/* tell firmware "antenna inverse"  ==> WRONG firmware
1093 			 * antenna control code ==>need fw to fix
1094 			 */
1095 			h2c_parameter[0] = 1;
1096 			h2c_parameter[1] = 1;
1097 			btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
1098 						h2c_parameter);
1099 		} else {
1100 			/* tell firmware "no antenna inverse" ==> WRONG firmware
1101 			 * antenna control code ==>need fw to fix
1102 			 */
1103 			h2c_parameter[0] = 0;
1104 			h2c_parameter[1] = 1;
1105 			btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
1106 						h2c_parameter);
1107 		}
1108 	}
1109 
1110 	/* ext switch setting */
1111 	switch (ant_pos_type) {
1112 	case BTC_ANT_WIFI_AT_MAIN:
1113 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7, 0x30, 0x1);
1114 		break;
1115 	case BTC_ANT_WIFI_AT_AUX:
1116 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7, 0x30, 0x2);
1117 		break;
1118 	}
1119 }
1120 
btc8821a2ant_ps_tdma(struct btc_coexist * btcoexist,bool force_exec,bool turn_on,u8 type)1121 static void btc8821a2ant_ps_tdma(struct btc_coexist *btcoexist,
1122 				 bool force_exec, bool turn_on, u8 type)
1123 {
1124 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1125 
1126 	u8 wifi_rssi_state, bt_rssi_state;
1127 
1128 	wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
1129 				BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
1130 	bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist, 2,
1131 				BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
1132 
1133 	if (!(BTC_RSSI_HIGH(wifi_rssi_state) &&
1134 	      BTC_RSSI_HIGH(bt_rssi_state)) &&
1135 	    turn_on) {
1136 		/* for WiFi RSSI low or BT RSSI low */
1137 		type = type + 100;
1138 	}
1139 
1140 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1141 		"[BTCoex], %s turn %s PS TDMA, type = %d\n",
1142 		(force_exec ? "force to" : ""), (turn_on ? "ON" : "OFF"),
1143 		type);
1144 	coex_dm->cur_ps_tdma_on = turn_on;
1145 	coex_dm->cur_ps_tdma = type;
1146 
1147 	if (!force_exec) {
1148 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1149 			"[BTCoex], pre_ps_tdma_on = %d, cur_ps_tdma_on = %d!!\n",
1150 			coex_dm->pre_ps_tdma_on, coex_dm->cur_ps_tdma_on);
1151 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1152 			"[BTCoex], pre_ps_tdma = %d, cur_ps_tdma = %d!!\n",
1153 			coex_dm->pre_ps_tdma, coex_dm->cur_ps_tdma);
1154 
1155 		if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1156 		    (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1157 			return;
1158 	}
1159 	if (turn_on) {
1160 		switch (type) {
1161 		case 1:
1162 		default:
1163 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1164 						    0x03, 0xf1, 0x90);
1165 			break;
1166 		case 2:
1167 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x2d,
1168 						    0x03, 0xf1, 0x90);
1169 			break;
1170 		case 3:
1171 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1172 						    0x3, 0xf1, 0x90);
1173 			break;
1174 		case 4:
1175 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
1176 						    0x03, 0xf1, 0x90);
1177 			break;
1178 		case 5:
1179 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1180 						    0x3, 0x70, 0x90);
1181 			break;
1182 		case 6:
1183 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x2d,
1184 						    0x3, 0x70, 0x90);
1185 			break;
1186 		case 7:
1187 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1188 						    0x3, 0x70, 0x90);
1189 			break;
1190 		case 8:
1191 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x10,
1192 						    0x3, 0x70, 0x90);
1193 			break;
1194 		case 9:
1195 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1196 						    0x03, 0xf1, 0x90);
1197 			break;
1198 		case 10:
1199 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x2d,
1200 						    0x03, 0xf1, 0x90);
1201 			break;
1202 		case 11:
1203 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1204 						    0x3, 0xf1, 0x90);
1205 			break;
1206 		case 12:
1207 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
1208 						    0x3, 0xf1, 0x90);
1209 			break;
1210 		case 13:
1211 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1212 						    0x3, 0x70, 0x90);
1213 			break;
1214 		case 14:
1215 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x2d,
1216 						    0x3, 0x70, 0x90);
1217 			break;
1218 		case 15:
1219 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1220 						    0x3, 0x70, 0x90);
1221 			break;
1222 		case 16:
1223 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
1224 						    0x3, 0x70, 0x90);
1225 			break;
1226 		case 17:
1227 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x2f,
1228 						    0x2f, 0x60, 0x90);
1229 			break;
1230 		case 18:
1231 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5, 0x5,
1232 						    0xe1, 0x90);
1233 			break;
1234 		case 19:
1235 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1236 						    0x25, 0xe1, 0x90);
1237 			break;
1238 		case 20:
1239 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1240 						    0x25, 0x60, 0x90);
1241 			break;
1242 		case 21:
1243 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1244 						    0x03, 0x70, 0x90);
1245 			break;
1246 		case 23:
1247 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1e,
1248 						    0x03, 0xf0, 0x14);
1249 			break;
1250 		case 24:
1251 		case 124:
1252 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x3c,
1253 						    0x03, 0x70, 0x50);
1254 			break;
1255 		case 25:
1256 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x14,
1257 						    0x03, 0xf1, 0x90);
1258 			break;
1259 		case 26:
1260 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x30,
1261 						    0x03, 0xf1, 0x90);
1262 			break;
1263 		case 71:
1264 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1265 						    0x03, 0xf1, 0x90);
1266 			break;
1267 		case 101:
1268 		case 105:
1269 		case 171:
1270 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x3a,
1271 						    0x03, 0x70, 0x50);
1272 			break;
1273 		case 102:
1274 		case 106:
1275 		case 110:
1276 		case 114:
1277 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x2d,
1278 						    0x03, 0x70, 0x50);
1279 			break;
1280 		case 103:
1281 		case 107:
1282 		case 111:
1283 		case 115:
1284 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1c,
1285 						    0x03, 0x70, 0x50);
1286 			break;
1287 		case 104:
1288 		case 108:
1289 		case 112:
1290 		case 116:
1291 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x10,
1292 						    0x03, 0x70, 0x50);
1293 			break;
1294 		case 109:
1295 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1296 						    0x03, 0xf1, 0x90);
1297 			break;
1298 		case 113:
1299 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1300 						    0x03, 0x70, 0x90);
1301 			break;
1302 		case 121:
1303 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1304 						    0x03, 0x70, 0x90);
1305 			break;
1306 		case 22:
1307 		case 122:
1308 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x35,
1309 						    0x03, 0x71, 0x11);
1310 			break;
1311 		case 123:
1312 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1c,
1313 						    0x03, 0x70, 0x54);
1314 			break;
1315 		case 125:
1316 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x14,
1317 						    0x03, 0x70, 0x50);
1318 			break;
1319 		case 126:
1320 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x30,
1321 						    0x03, 0x70, 0x50);
1322 			break;
1323 		}
1324 	} else {
1325 		/* disable PS tdma */
1326 		switch (type) {
1327 		case 0:
1328 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1329 						    0x40, 0x0);
1330 			break;
1331 		case 1:
1332 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1333 						    0x48, 0x0);
1334 			break;
1335 		default:
1336 			btc8821a2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1337 						    0x40, 0x0);
1338 			break;
1339 		}
1340 	}
1341 
1342 	/* update pre state */
1343 	coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1344 	coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1345 }
1346 
1347 static void
btc8821a2ant_ps_tdma_check_for_power_save_state(struct btc_coexist * btcoexist,bool new_ps_state)1348 btc8821a2ant_ps_tdma_check_for_power_save_state(struct btc_coexist *btcoexist,
1349 						bool new_ps_state)
1350 {
1351 	u8 lps_mode = 0x0;
1352 
1353 	btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1354 
1355 	if (lps_mode) {
1356 		/* already under LPS state */
1357 		if (new_ps_state) {
1358 			/* keep state under LPS, do nothing */
1359 		} else {
1360 			/* will leave LPS state, turn off psTdma first */
1361 			btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1362 		}
1363 	} else {
1364 		/* NO PS state */
1365 		if (new_ps_state) {
1366 			/* will enter LPS state, turn off psTdma first */
1367 			btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1368 		} else {
1369 			/* keep state under NO PS state, do nothing */
1370 		}
1371 	}
1372 }
1373 
btc8821a2ant_power_save_state(struct btc_coexist * btcoexist,u8 ps_type,u8 lps_val,u8 rpwm_val)1374 static void btc8821a2ant_power_save_state(struct btc_coexist *btcoexist,
1375 					  u8 ps_type, u8 lps_val, u8 rpwm_val)
1376 {
1377 	bool low_pwr_disable = false;
1378 
1379 	switch (ps_type) {
1380 	case BTC_PS_WIFI_NATIVE:
1381 		/* recover to original 32k low power setting */
1382 		low_pwr_disable = false;
1383 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1384 				   &low_pwr_disable);
1385 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
1386 		coex_sta->force_lps_on = false;
1387 		break;
1388 	case BTC_PS_LPS_ON:
1389 		btc8821a2ant_ps_tdma_check_for_power_save_state(btcoexist,
1390 								true);
1391 		btc8821a2ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,
1392 				      rpwm_val);
1393 		/* when coex force to enter LPS, do not enter 32k low power */
1394 		low_pwr_disable = true;
1395 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1396 				   &low_pwr_disable);
1397 		/* power save must executed before psTdma */
1398 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
1399 		coex_sta->force_lps_on = true;
1400 		break;
1401 	case BTC_PS_LPS_OFF:
1402 		btc8821a2ant_ps_tdma_check_for_power_save_state(btcoexist,
1403 								false);
1404 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
1405 		coex_sta->force_lps_on = false;
1406 		break;
1407 	default:
1408 		break;
1409 	}
1410 }
1411 
btc8821a2ant_coex_all_off(struct btc_coexist * btcoexist)1412 static void btc8821a2ant_coex_all_off(struct btc_coexist *btcoexist)
1413 {
1414 	/* fw all off */
1415 	btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1416 	btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1417 	btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1418 	btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1419 
1420 	/* sw all off */
1421 	btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
1422 	btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1423 
1424 	/* hw all off */
1425 	btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1426 }
1427 
btc8821a2ant_coex_under_5g(struct btc_coexist * btcoexist)1428 static void btc8821a2ant_coex_under_5g(struct btc_coexist *btcoexist)
1429 {
1430 	btc8821a2ant_coex_all_off(btcoexist);
1431 	btc8821a2ant_ignore_wlan_act(btcoexist, NORMAL_EXEC, true);
1432 }
1433 
btc8821a2ant_init_coex_dm(struct btc_coexist * btcoexist)1434 static void btc8821a2ant_init_coex_dm(struct btc_coexist *btcoexist)
1435 {
1436 	/* force to reset coex mechanism */
1437 	btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1438 
1439 	btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1440 	btc8821a2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1);
1441 	btc8821a2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
1442 	btc8821a2ant_dec_bt_pwr(btcoexist, FORCE_EXEC, 0);
1443 
1444 	btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
1445 	btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1446 }
1447 
btc8821a2ant_action_bt_inquiry(struct btc_coexist * btcoexist)1448 static void btc8821a2ant_action_bt_inquiry(struct btc_coexist *btcoexist)
1449 {
1450 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1451 	u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
1452 	bool wifi_connected = false;
1453 	bool low_pwr_disable = true;
1454 	bool scan = false, link = false, roam = false;
1455 
1456 	wifi_rssi_state =
1457 		btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
1458 	wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
1459 				BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
1460 	bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
1461 		2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
1462 
1463 	btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1464 			   &low_pwr_disable);
1465 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1466 			   &wifi_connected);
1467 
1468 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
1469 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
1470 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
1471 
1472 	btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1473 
1474 	if (scan || link || roam) {
1475 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1476 			"[BTCoex], Wifi link process + BT Inq/Page!!\n");
1477 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);
1478 		btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1479 	} else if (wifi_connected) {
1480 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1481 			"[BTCoex], Wifi connected + BT Inq/Page!!\n");
1482 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);
1483 		btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1484 	} else {
1485 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1486 			"[BTCoex], Wifi no-link + BT Inq/Page!!\n");
1487 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1488 		btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1489 	}
1490 
1491 	btc8821a2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
1492 	btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1493 
1494 	btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
1495 	btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1496 }
1497 
btc8821a2ant_action_wifi_link_process(struct btc_coexist * btcoexist)1498 static void btc8821a2ant_action_wifi_link_process(struct btc_coexist *btcoexist)
1499 {
1500 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1501 	u8 u8tmpa, u8tmpb;
1502 
1503 	btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);
1504 	btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1505 
1506 	btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
1507 	btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
1508 
1509 	u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
1510 	u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x76e);
1511 
1512 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1513 		"[BTCoex], 0x765=0x%x, 0x76e=0x%x\n", u8tmpa, u8tmpb);
1514 }
1515 
btc8821a2ant_action_wifi_idle_process(struct btc_coexist * btcoexist)1516 static bool btc8821a2ant_action_wifi_idle_process(struct btc_coexist *btcoexist)
1517 {
1518 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1519 	u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
1520 	u8 ap_num = 0;
1521 
1522 	wifi_rssi_state =
1523 		btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
1524 	wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
1525 			BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES - 20, 0);
1526 	bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
1527 			2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
1528 
1529 	btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
1530 
1531 	/* define the office environment */
1532 	if (BTC_RSSI_HIGH(wifi_rssi_state1) && (coex_sta->hid_exist) &&
1533 	    (coex_sta->a2dp_exist)) {
1534 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1535 			"[BTCoex], Wifi  idle process for BT HID+A2DP exist!!\n");
1536 
1537 		btc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x6);
1538 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1539 
1540 		/* sw all off */
1541 		btc8821a2ant_sw_mechanism1(btcoexist, false, false, false,
1542 					   false);
1543 		btc8821a2ant_sw_mechanism2(btcoexist, false, false, false,
1544 					   0x18);
1545 
1546 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1547 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1548 					      0x0, 0x0);
1549 		btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1550 
1551 		return true;
1552 	} else if (coex_sta->pan_exist) {
1553 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1554 			"[BTCoex], Wifi  idle process for BT PAN exist!!\n");
1555 
1556 		btc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x6);
1557 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1558 
1559 		/* sw all off */
1560 		btc8821a2ant_sw_mechanism1(btcoexist, false, false, false,
1561 					   false);
1562 		btc8821a2ant_sw_mechanism2(btcoexist, false, false, false,
1563 					   0x18);
1564 
1565 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1566 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1567 					      0x0, 0x0);
1568 		btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1569 
1570 		return true;
1571 	}
1572 	btc8821a2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x18);
1573 	return false;
1574 }
1575 
btc8821a2ant_is_common_action(struct btc_coexist * btcoexist)1576 static bool btc8821a2ant_is_common_action(struct btc_coexist *btcoexist)
1577 {
1578 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1579 	bool common = false, wifi_connected = false, wifi_busy = false;
1580 	bool low_pwr_disable = false;
1581 	bool bt_hs_on = false;
1582 
1583 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
1584 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1585 			   &wifi_connected);
1586 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1587 
1588 	if (!wifi_connected) {
1589 		low_pwr_disable = false;
1590 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1591 				   &low_pwr_disable);
1592 		btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
1593 					0x8);
1594 
1595 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1596 			"[BTCoex], Wifi non-connected idle!!\n");
1597 
1598 		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
1599 					  0x0);
1600 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1601 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1602 					      0x0, 0x0);
1603 		btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1604 		btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1605 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1606 
1607 		btc8821a2ant_sw_mechanism1(btcoexist, false, false, false,
1608 					   false);
1609 		btc8821a2ant_sw_mechanism2(btcoexist, false, false, false,
1610 					   0x18);
1611 
1612 		common = true;
1613 	} else {
1614 		if (BT_8821A_2ANT_BT_STATUS_IDLE ==
1615 		    coex_dm->bt_status) {
1616 			low_pwr_disable = false;
1617 			btcoexist->btc_set(btcoexist,
1618 					   BTC_SET_ACT_DISABLE_LOW_POWER,
1619 					   &low_pwr_disable);
1620 			btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC,
1621 						false, false, 0x8);
1622 
1623 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1624 				"[BTCoex], Wifi connected + BT non connected-idle!!\n");
1625 
1626 			btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
1627 						  0xfffff, 0x0);
1628 			btc8821a2ant_coex_table_with_type(btcoexist,
1629 							  NORMAL_EXEC, 0);
1630 
1631 			btc8821a2ant_power_save_state(
1632 				btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1633 			btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1634 			btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
1635 						      0xb);
1636 			btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1637 
1638 			btc8821a2ant_sw_mechanism1(btcoexist, false, false,
1639 						   false, false);
1640 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
1641 						   false, 0x18);
1642 
1643 			common = true;
1644 		} else if (BT_8821A_2ANT_BT_STATUS_CON_IDLE ==
1645 			   coex_dm->bt_status) {
1646 			low_pwr_disable = true;
1647 			btcoexist->btc_set(btcoexist,
1648 					   BTC_SET_ACT_DISABLE_LOW_POWER,
1649 					   &low_pwr_disable);
1650 
1651 			if (bt_hs_on)
1652 				return false;
1653 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1654 				"[BTCoex], Wifi connected + BT connected-idle!!\n");
1655 			btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC,
1656 						false, false, 0x8);
1657 
1658 			btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
1659 						  0xfffff, 0x0);
1660 			btc8821a2ant_coex_table_with_type(btcoexist,
1661 							  NORMAL_EXEC, 0);
1662 
1663 			btc8821a2ant_power_save_state(
1664 				btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1665 			btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1666 			btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
1667 						      0xb);
1668 			btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1669 
1670 			btc8821a2ant_sw_mechanism1(btcoexist, true, false,
1671 						   false, false);
1672 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
1673 						   false, 0x18);
1674 			common = true;
1675 		} else {
1676 			low_pwr_disable = true;
1677 			btcoexist->btc_set(btcoexist,
1678 					   BTC_SET_ACT_DISABLE_LOW_POWER,
1679 					   &low_pwr_disable);
1680 
1681 			if (wifi_busy) {
1682 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1683 					"[BTCoex], Wifi Connected-Busy + BT Busy!!\n");
1684 				common = false;
1685 			} else {
1686 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1687 					"[BTCoex], Wifi Connected-Idle + BT Busy!!\n");
1688 				common =
1689 				    btc8821a2ant_action_wifi_idle_process(
1690 					     btcoexist);
1691 			}
1692 		}
1693 	}
1694 	return common;
1695 }
1696 
btc8821a2ant_tdma_duration_adjust(struct btc_coexist * btcoexist,bool sco_hid,bool tx_pause,u8 max_interval)1697 static void btc8821a2ant_tdma_duration_adjust(struct btc_coexist *btcoexist,
1698 					      bool sco_hid, bool tx_pause,
1699 					      u8 max_interval)
1700 {
1701 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1702 	static long up, dn, m, n, wait_count;
1703 	 /* 0 : no change
1704 	  * +1: increase WiFi duration
1705 	  * -1: decrease WiFi duration
1706 	  */
1707 	int result;
1708 	u8 retry_count = 0;
1709 
1710 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1711 		"[BTCoex], TdmaDurationAdjust()\n");
1712 
1713 	if (coex_dm->auto_tdma_adjust) {
1714 		coex_dm->auto_tdma_adjust = false;
1715 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1716 			"[BTCoex], first run TdmaDurationAdjust()!!\n");
1717 		if (sco_hid) {
1718 			if (tx_pause) {
1719 				if (max_interval == 1) {
1720 					btc8821a2ant_ps_tdma(btcoexist,
1721 							NORMAL_EXEC, true, 13);
1722 					coex_dm->ps_tdma_du_adj_type = 13;
1723 				} else if (max_interval == 2) {
1724 					btc8821a2ant_ps_tdma(btcoexist,
1725 							NORMAL_EXEC, true, 14);
1726 					coex_dm->ps_tdma_du_adj_type = 14;
1727 				} else if (max_interval == 3) {
1728 					btc8821a2ant_ps_tdma(btcoexist,
1729 							NORMAL_EXEC, true, 15);
1730 					coex_dm->ps_tdma_du_adj_type = 15;
1731 				} else {
1732 					btc8821a2ant_ps_tdma(btcoexist,
1733 							NORMAL_EXEC, true, 15);
1734 					coex_dm->ps_tdma_du_adj_type = 15;
1735 				}
1736 			} else {
1737 				if (max_interval == 1) {
1738 					btc8821a2ant_ps_tdma(btcoexist,
1739 							NORMAL_EXEC, true, 9);
1740 					coex_dm->ps_tdma_du_adj_type = 9;
1741 				} else if (max_interval == 2) {
1742 					btc8821a2ant_ps_tdma(btcoexist,
1743 							NORMAL_EXEC, true, 10);
1744 					coex_dm->ps_tdma_du_adj_type = 10;
1745 				} else if (max_interval == 3) {
1746 					btc8821a2ant_ps_tdma(btcoexist,
1747 							NORMAL_EXEC, true, 11);
1748 					coex_dm->ps_tdma_du_adj_type = 11;
1749 				} else {
1750 					btc8821a2ant_ps_tdma(btcoexist,
1751 							NORMAL_EXEC, true, 11);
1752 					coex_dm->ps_tdma_du_adj_type = 11;
1753 				}
1754 			}
1755 		} else {
1756 			if (tx_pause) {
1757 				if (max_interval == 1) {
1758 					btc8821a2ant_ps_tdma(btcoexist,
1759 							NORMAL_EXEC, true, 5);
1760 					coex_dm->ps_tdma_du_adj_type = 5;
1761 				} else if (max_interval == 2) {
1762 					btc8821a2ant_ps_tdma(btcoexist,
1763 							NORMAL_EXEC, true, 6);
1764 					coex_dm->ps_tdma_du_adj_type = 6;
1765 				} else if (max_interval == 3) {
1766 					btc8821a2ant_ps_tdma(btcoexist,
1767 							NORMAL_EXEC, true, 7);
1768 					coex_dm->ps_tdma_du_adj_type = 7;
1769 				} else {
1770 					btc8821a2ant_ps_tdma(btcoexist,
1771 							NORMAL_EXEC, true, 7);
1772 					coex_dm->ps_tdma_du_adj_type = 7;
1773 				}
1774 			} else {
1775 				if (max_interval == 1) {
1776 					btc8821a2ant_ps_tdma(btcoexist,
1777 							NORMAL_EXEC, true, 1);
1778 					coex_dm->ps_tdma_du_adj_type = 1;
1779 				} else if (max_interval == 2) {
1780 					btc8821a2ant_ps_tdma(btcoexist,
1781 							NORMAL_EXEC, true, 2);
1782 					coex_dm->ps_tdma_du_adj_type = 2;
1783 				} else if (max_interval == 3) {
1784 					btc8821a2ant_ps_tdma(btcoexist,
1785 							NORMAL_EXEC, true, 3);
1786 					coex_dm->ps_tdma_du_adj_type = 3;
1787 				} else {
1788 					btc8821a2ant_ps_tdma(btcoexist,
1789 							NORMAL_EXEC, true, 3);
1790 					coex_dm->ps_tdma_du_adj_type = 3;
1791 				}
1792 			}
1793 		}
1794 
1795 		up = 0;
1796 		dn = 0;
1797 		m = 1;
1798 		n = 3;
1799 		result = 0;
1800 		wait_count = 0;
1801 	} else {
1802 		/* accquire the BT TRx retry count from BT_Info byte2 */
1803 		retry_count = coex_sta->bt_retry_cnt;
1804 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1805 			"[BTCoex], retry_count = %d\n", retry_count);
1806 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1807 			"[BTCoex], up = %d, dn = %d, m = %d, n = %d, wait_count = %d\n",
1808 			(int)up, (int)dn, (int)m, (int)n, (int)wait_count);
1809 		result = 0;
1810 		wait_count++;
1811 
1812 		if (retry_count == 0) {
1813 			/* no retry in the last 2-second duration */
1814 			up++;
1815 			dn--;
1816 
1817 			if (dn <= 0)
1818 				dn = 0;
1819 
1820 			if (up >= n) {
1821 				/* if (retry count == 0) for 2*n seconds,
1822 				 * make WiFi duration wider
1823 				 */
1824 				wait_count = 0;
1825 				n = 3;
1826 				up = 0;
1827 				dn = 0;
1828 				result = 1;
1829 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1830 					"[BTCoex], Increase wifi duration!!\n");
1831 			}
1832 		} else if (retry_count <= 3) {
1833 			/* <=3 retry in the last 2-second duration */
1834 			up--;
1835 			dn++;
1836 
1837 			if (up <= 0)
1838 				up = 0;
1839 
1840 			if (dn == 2) {
1841 				/* if retry count < 3 for 2*2 seconds,
1842 				 * shrink wifi duration
1843 				 */
1844 				if (wait_count <= 2)
1845 					m++; /* avoid bounce in two levels */
1846 				else
1847 					m = 1;
1848 				/* m max value is 20, max time is 120 second,
1849 				 * recheck if adjust WiFi duration.
1850 				 */
1851 				if (m >= 20)
1852 					m = 20;
1853 
1854 				n = 3 * m;
1855 				up = 0;
1856 				dn = 0;
1857 				wait_count = 0;
1858 				result = -1;
1859 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1860 					"[BTCoex], Decrease wifi duration for retryCounter<3!!\n");
1861 			}
1862 		} else {
1863 			/* retry count > 3, if retry count > 3 happens once,
1864 			 * shrink WiFi duration
1865 			 */
1866 			if (wait_count == 1)
1867 				m++; /* avoid bounce in two levels */
1868 			else
1869 				m = 1;
1870 			/* m max value is 20, max time is 120 second,
1871 			 * recheck if adjust WiFi duration.
1872 			 */
1873 			if (m >= 20)
1874 				m = 20;
1875 
1876 			n = 3 * m;
1877 			up = 0;
1878 			dn = 0;
1879 			wait_count = 0;
1880 			result = -1;
1881 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1882 				"[BTCoex], Decrease wifi duration for retryCounter>3!!\n");
1883 		}
1884 
1885 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1886 			"[BTCoex], max Interval = %d\n", max_interval);
1887 
1888 		if (max_interval == 1) {
1889 			if (tx_pause) {
1890 				if (coex_dm->cur_ps_tdma == 71) {
1891 					btc8821a2ant_ps_tdma(btcoexist,
1892 							NORMAL_EXEC, true, 5);
1893 					coex_dm->ps_tdma_du_adj_type = 5;
1894 				} else if (coex_dm->cur_ps_tdma == 1) {
1895 					btc8821a2ant_ps_tdma(btcoexist,
1896 							NORMAL_EXEC, true, 5);
1897 					coex_dm->ps_tdma_du_adj_type = 5;
1898 				} else if (coex_dm->cur_ps_tdma == 2) {
1899 					btc8821a2ant_ps_tdma(btcoexist,
1900 							NORMAL_EXEC, true, 6);
1901 					coex_dm->ps_tdma_du_adj_type = 6;
1902 				} else if (coex_dm->cur_ps_tdma == 3) {
1903 					btc8821a2ant_ps_tdma(btcoexist,
1904 							NORMAL_EXEC, true, 7);
1905 					coex_dm->ps_tdma_du_adj_type = 7;
1906 				} else if (coex_dm->cur_ps_tdma == 4) {
1907 					btc8821a2ant_ps_tdma(btcoexist,
1908 							NORMAL_EXEC, true, 8);
1909 					coex_dm->ps_tdma_du_adj_type = 8;
1910 				}
1911 				if (coex_dm->cur_ps_tdma == 9) {
1912 					btc8821a2ant_ps_tdma(btcoexist,
1913 							NORMAL_EXEC, true, 13);
1914 					coex_dm->ps_tdma_du_adj_type = 13;
1915 				} else if (coex_dm->cur_ps_tdma == 10) {
1916 					btc8821a2ant_ps_tdma(btcoexist,
1917 							NORMAL_EXEC, true, 14);
1918 					coex_dm->ps_tdma_du_adj_type = 14;
1919 				} else if (coex_dm->cur_ps_tdma == 11) {
1920 					btc8821a2ant_ps_tdma(btcoexist,
1921 							NORMAL_EXEC, true, 15);
1922 					coex_dm->ps_tdma_du_adj_type = 15;
1923 				} else if (coex_dm->cur_ps_tdma == 12) {
1924 					btc8821a2ant_ps_tdma(btcoexist,
1925 							NORMAL_EXEC, true, 16);
1926 					coex_dm->ps_tdma_du_adj_type = 16;
1927 				}
1928 
1929 				if (result == -1) {
1930 					if (coex_dm->cur_ps_tdma == 5) {
1931 						btc8821a2ant_ps_tdma(
1932 							btcoexist, NORMAL_EXEC,
1933 							true, 6);
1934 						coex_dm->ps_tdma_du_adj_type =
1935 							6;
1936 					} else if (coex_dm->cur_ps_tdma == 6) {
1937 						btc8821a2ant_ps_tdma(
1938 							btcoexist, NORMAL_EXEC,
1939 							true, 7);
1940 						coex_dm->ps_tdma_du_adj_type =
1941 							7;
1942 					} else if (coex_dm->cur_ps_tdma == 7) {
1943 						btc8821a2ant_ps_tdma(
1944 							btcoexist, NORMAL_EXEC,
1945 							true, 8);
1946 						coex_dm->ps_tdma_du_adj_type =
1947 							8;
1948 					} else if (coex_dm->cur_ps_tdma == 13) {
1949 						btc8821a2ant_ps_tdma(
1950 							btcoexist, NORMAL_EXEC,
1951 							true, 14);
1952 						coex_dm->ps_tdma_du_adj_type =
1953 							14;
1954 					} else if (coex_dm->cur_ps_tdma == 14) {
1955 						btc8821a2ant_ps_tdma(
1956 							btcoexist, NORMAL_EXEC,
1957 							true, 15);
1958 						coex_dm->ps_tdma_du_adj_type =
1959 							15;
1960 					} else if (coex_dm->cur_ps_tdma == 15) {
1961 						btc8821a2ant_ps_tdma(
1962 							btcoexist, NORMAL_EXEC,
1963 							true, 16);
1964 						coex_dm->ps_tdma_du_adj_type =
1965 							16;
1966 					}
1967 				} else if (result == 1) {
1968 					if (coex_dm->cur_ps_tdma == 8) {
1969 						btc8821a2ant_ps_tdma(
1970 							btcoexist, NORMAL_EXEC,
1971 							true, 7);
1972 						coex_dm->ps_tdma_du_adj_type =
1973 							7;
1974 					} else if (coex_dm->cur_ps_tdma == 7) {
1975 						btc8821a2ant_ps_tdma(
1976 							btcoexist, NORMAL_EXEC,
1977 							true, 6);
1978 						coex_dm->ps_tdma_du_adj_type =
1979 							6;
1980 					} else if (coex_dm->cur_ps_tdma == 6) {
1981 						btc8821a2ant_ps_tdma(
1982 							btcoexist, NORMAL_EXEC,
1983 							true, 5);
1984 						coex_dm->ps_tdma_du_adj_type =
1985 							5;
1986 					} else if (coex_dm->cur_ps_tdma == 16) {
1987 						btc8821a2ant_ps_tdma(
1988 							btcoexist, NORMAL_EXEC,
1989 							true, 15);
1990 						coex_dm->ps_tdma_du_adj_type =
1991 							15;
1992 					} else if (coex_dm->cur_ps_tdma == 15) {
1993 						btc8821a2ant_ps_tdma(
1994 							btcoexist, NORMAL_EXEC,
1995 							true, 14);
1996 						coex_dm->ps_tdma_du_adj_type =
1997 							14;
1998 					} else if (coex_dm->cur_ps_tdma == 14) {
1999 						btc8821a2ant_ps_tdma(
2000 							btcoexist, NORMAL_EXEC,
2001 							true, 13);
2002 						coex_dm->ps_tdma_du_adj_type =
2003 							13;
2004 					}
2005 				}
2006 			} else {
2007 				if (coex_dm->cur_ps_tdma == 5) {
2008 					btc8821a2ant_ps_tdma(btcoexist,
2009 							NORMAL_EXEC, true, 71);
2010 					coex_dm->ps_tdma_du_adj_type = 71;
2011 				} else if (coex_dm->cur_ps_tdma == 6) {
2012 					btc8821a2ant_ps_tdma(btcoexist,
2013 							NORMAL_EXEC, true, 2);
2014 					coex_dm->ps_tdma_du_adj_type = 2;
2015 				} else if (coex_dm->cur_ps_tdma == 7) {
2016 					btc8821a2ant_ps_tdma(btcoexist,
2017 							NORMAL_EXEC, true, 3);
2018 					coex_dm->ps_tdma_du_adj_type = 3;
2019 				} else if (coex_dm->cur_ps_tdma == 8) {
2020 					btc8821a2ant_ps_tdma(btcoexist,
2021 							NORMAL_EXEC, true, 4);
2022 					coex_dm->ps_tdma_du_adj_type = 4;
2023 				}
2024 				if (coex_dm->cur_ps_tdma == 13) {
2025 					btc8821a2ant_ps_tdma(btcoexist,
2026 							NORMAL_EXEC, true, 9);
2027 					coex_dm->ps_tdma_du_adj_type = 9;
2028 				} else if (coex_dm->cur_ps_tdma == 14) {
2029 					btc8821a2ant_ps_tdma(btcoexist,
2030 							NORMAL_EXEC, true, 10);
2031 					coex_dm->ps_tdma_du_adj_type = 10;
2032 				} else if (coex_dm->cur_ps_tdma == 15) {
2033 					btc8821a2ant_ps_tdma(btcoexist,
2034 							NORMAL_EXEC, true, 11);
2035 					coex_dm->ps_tdma_du_adj_type = 11;
2036 				} else if (coex_dm->cur_ps_tdma == 16) {
2037 					btc8821a2ant_ps_tdma(btcoexist,
2038 							NORMAL_EXEC, true, 12);
2039 					coex_dm->ps_tdma_du_adj_type = 12;
2040 				}
2041 
2042 				if (result == -1) {
2043 					if (coex_dm->cur_ps_tdma == 71) {
2044 						btc8821a2ant_ps_tdma(
2045 							btcoexist, NORMAL_EXEC,
2046 							true, 1);
2047 						coex_dm->ps_tdma_du_adj_type =
2048 							1;
2049 					} else if (coex_dm->cur_ps_tdma == 1) {
2050 						btc8821a2ant_ps_tdma(
2051 							btcoexist, NORMAL_EXEC,
2052 							true, 2);
2053 						coex_dm->ps_tdma_du_adj_type =
2054 							2;
2055 					} else if (coex_dm->cur_ps_tdma == 2) {
2056 						btc8821a2ant_ps_tdma(
2057 							btcoexist, NORMAL_EXEC,
2058 							true, 3);
2059 						coex_dm->ps_tdma_du_adj_type =
2060 							3;
2061 					} else if (coex_dm->cur_ps_tdma == 3) {
2062 						btc8821a2ant_ps_tdma(
2063 							btcoexist, NORMAL_EXEC,
2064 							true, 4);
2065 						coex_dm->ps_tdma_du_adj_type =
2066 							4;
2067 					} else if (coex_dm->cur_ps_tdma == 9) {
2068 						btc8821a2ant_ps_tdma(
2069 							btcoexist, NORMAL_EXEC,
2070 							true, 10);
2071 						coex_dm->ps_tdma_du_adj_type =
2072 							10;
2073 					} else if (coex_dm->cur_ps_tdma == 10) {
2074 						btc8821a2ant_ps_tdma(
2075 							btcoexist, NORMAL_EXEC,
2076 							true, 11);
2077 						coex_dm->ps_tdma_du_adj_type =
2078 							11;
2079 					} else if (coex_dm->cur_ps_tdma == 11) {
2080 						btc8821a2ant_ps_tdma(
2081 							btcoexist, NORMAL_EXEC,
2082 							true, 12);
2083 						coex_dm->ps_tdma_du_adj_type =
2084 							12;
2085 					}
2086 				} else if (result == 1) {
2087 					if (coex_dm->cur_ps_tdma == 4) {
2088 						btc8821a2ant_ps_tdma(
2089 							btcoexist, NORMAL_EXEC,
2090 							true, 3);
2091 						coex_dm->ps_tdma_du_adj_type =
2092 							3;
2093 					} else if (coex_dm->cur_ps_tdma == 3) {
2094 						btc8821a2ant_ps_tdma(
2095 							btcoexist, NORMAL_EXEC,
2096 							true, 2);
2097 						coex_dm->ps_tdma_du_adj_type =
2098 							2;
2099 					} else if (coex_dm->cur_ps_tdma == 2) {
2100 						btc8821a2ant_ps_tdma(
2101 							btcoexist, NORMAL_EXEC,
2102 							true, 1);
2103 						coex_dm->ps_tdma_du_adj_type =
2104 							1;
2105 					} else if (coex_dm->cur_ps_tdma == 1) {
2106 						btc8821a2ant_ps_tdma(
2107 							btcoexist, NORMAL_EXEC,
2108 							true, 71);
2109 						coex_dm->ps_tdma_du_adj_type =
2110 							71;
2111 					} else if (coex_dm->cur_ps_tdma == 12) {
2112 						btc8821a2ant_ps_tdma(
2113 							btcoexist, NORMAL_EXEC,
2114 							true, 11);
2115 						coex_dm->ps_tdma_du_adj_type =
2116 							11;
2117 					} else if (coex_dm->cur_ps_tdma == 11) {
2118 						btc8821a2ant_ps_tdma(
2119 							btcoexist, NORMAL_EXEC,
2120 							true, 10);
2121 						coex_dm->ps_tdma_du_adj_type =
2122 							10;
2123 					} else if (coex_dm->cur_ps_tdma == 10) {
2124 						btc8821a2ant_ps_tdma(
2125 							btcoexist, NORMAL_EXEC,
2126 							true, 9);
2127 						coex_dm->ps_tdma_du_adj_type =
2128 							9;
2129 					}
2130 				}
2131 			}
2132 		} else if (max_interval == 2) {
2133 			if (tx_pause) {
2134 				if (coex_dm->cur_ps_tdma == 1) {
2135 					btc8821a2ant_ps_tdma(btcoexist,
2136 							NORMAL_EXEC, true, 6);
2137 					coex_dm->ps_tdma_du_adj_type = 6;
2138 				} else if (coex_dm->cur_ps_tdma == 2) {
2139 					btc8821a2ant_ps_tdma(btcoexist,
2140 							NORMAL_EXEC, true, 6);
2141 					coex_dm->ps_tdma_du_adj_type = 6;
2142 				} else if (coex_dm->cur_ps_tdma == 3) {
2143 					btc8821a2ant_ps_tdma(btcoexist,
2144 							NORMAL_EXEC, true, 7);
2145 					coex_dm->ps_tdma_du_adj_type = 7;
2146 				} else if (coex_dm->cur_ps_tdma == 4) {
2147 					btc8821a2ant_ps_tdma(btcoexist,
2148 							NORMAL_EXEC, true, 8);
2149 					coex_dm->ps_tdma_du_adj_type = 8;
2150 				}
2151 				if (coex_dm->cur_ps_tdma == 9) {
2152 					btc8821a2ant_ps_tdma(btcoexist,
2153 							NORMAL_EXEC, true, 14);
2154 					coex_dm->ps_tdma_du_adj_type = 14;
2155 				} else if (coex_dm->cur_ps_tdma == 10) {
2156 					btc8821a2ant_ps_tdma(btcoexist,
2157 							NORMAL_EXEC, true, 14);
2158 					coex_dm->ps_tdma_du_adj_type = 14;
2159 				} else if (coex_dm->cur_ps_tdma == 11) {
2160 					btc8821a2ant_ps_tdma(btcoexist,
2161 							NORMAL_EXEC, true, 15);
2162 					coex_dm->ps_tdma_du_adj_type = 15;
2163 				} else if (coex_dm->cur_ps_tdma == 12) {
2164 					btc8821a2ant_ps_tdma(btcoexist,
2165 							NORMAL_EXEC, true, 16);
2166 					coex_dm->ps_tdma_du_adj_type = 16;
2167 				}
2168 				if (result == -1) {
2169 					if (coex_dm->cur_ps_tdma == 5) {
2170 						btc8821a2ant_ps_tdma(
2171 							btcoexist, NORMAL_EXEC,
2172 							true, 6);
2173 						coex_dm->ps_tdma_du_adj_type =
2174 							6;
2175 					} else if (coex_dm->cur_ps_tdma == 6) {
2176 						btc8821a2ant_ps_tdma(
2177 							btcoexist, NORMAL_EXEC,
2178 							true, 7);
2179 						coex_dm->ps_tdma_du_adj_type =
2180 							7;
2181 					} else if (coex_dm->cur_ps_tdma == 7) {
2182 						btc8821a2ant_ps_tdma(
2183 							btcoexist, NORMAL_EXEC,
2184 							true, 8);
2185 						coex_dm->ps_tdma_du_adj_type =
2186 							8;
2187 					} else if (coex_dm->cur_ps_tdma == 13) {
2188 						btc8821a2ant_ps_tdma(
2189 							btcoexist, NORMAL_EXEC,
2190 							true, 14);
2191 						coex_dm->ps_tdma_du_adj_type =
2192 							14;
2193 					} else if (coex_dm->cur_ps_tdma == 14) {
2194 						btc8821a2ant_ps_tdma(
2195 							btcoexist, NORMAL_EXEC,
2196 							true, 15);
2197 						coex_dm->ps_tdma_du_adj_type =
2198 							15;
2199 					} else if (coex_dm->cur_ps_tdma == 15) {
2200 						btc8821a2ant_ps_tdma(
2201 							btcoexist, NORMAL_EXEC,
2202 							true, 16);
2203 						coex_dm->ps_tdma_du_adj_type =
2204 							16;
2205 					}
2206 				} else if (result == 1) {
2207 					if (coex_dm->cur_ps_tdma == 8) {
2208 						btc8821a2ant_ps_tdma(
2209 							btcoexist, NORMAL_EXEC,
2210 							true, 7);
2211 						coex_dm->ps_tdma_du_adj_type =
2212 							7;
2213 					} else if (coex_dm->cur_ps_tdma == 7) {
2214 						btc8821a2ant_ps_tdma(
2215 							btcoexist, NORMAL_EXEC,
2216 							true, 6);
2217 						coex_dm->ps_tdma_du_adj_type =
2218 							6;
2219 					} else if (coex_dm->cur_ps_tdma == 6) {
2220 						btc8821a2ant_ps_tdma(
2221 							btcoexist, NORMAL_EXEC,
2222 							true, 6);
2223 						coex_dm->ps_tdma_du_adj_type =
2224 							6;
2225 					} else if (coex_dm->cur_ps_tdma == 16) {
2226 						btc8821a2ant_ps_tdma(
2227 							btcoexist, NORMAL_EXEC,
2228 							true, 15);
2229 						coex_dm->ps_tdma_du_adj_type =
2230 							15;
2231 					} else if (coex_dm->cur_ps_tdma == 15) {
2232 						btc8821a2ant_ps_tdma(
2233 							btcoexist, NORMAL_EXEC,
2234 							true, 14);
2235 						coex_dm->ps_tdma_du_adj_type =
2236 							14;
2237 					} else if (coex_dm->cur_ps_tdma == 14) {
2238 						btc8821a2ant_ps_tdma(
2239 							btcoexist, NORMAL_EXEC,
2240 							true, 14);
2241 						coex_dm->ps_tdma_du_adj_type =
2242 							14;
2243 					}
2244 				}
2245 			} else {
2246 				if (coex_dm->cur_ps_tdma == 5) {
2247 					btc8821a2ant_ps_tdma(btcoexist,
2248 							NORMAL_EXEC, true, 2);
2249 					coex_dm->ps_tdma_du_adj_type = 2;
2250 				} else if (coex_dm->cur_ps_tdma == 6) {
2251 					btc8821a2ant_ps_tdma(btcoexist,
2252 							NORMAL_EXEC, true, 2);
2253 					coex_dm->ps_tdma_du_adj_type = 2;
2254 				} else if (coex_dm->cur_ps_tdma == 7) {
2255 					btc8821a2ant_ps_tdma(btcoexist,
2256 							NORMAL_EXEC, true, 3);
2257 					coex_dm->ps_tdma_du_adj_type = 3;
2258 				} else if (coex_dm->cur_ps_tdma == 8) {
2259 					btc8821a2ant_ps_tdma(btcoexist,
2260 							NORMAL_EXEC, true, 4);
2261 					coex_dm->ps_tdma_du_adj_type = 4;
2262 				}
2263 				if (coex_dm->cur_ps_tdma == 13) {
2264 					btc8821a2ant_ps_tdma(btcoexist,
2265 							NORMAL_EXEC, true, 10);
2266 					coex_dm->ps_tdma_du_adj_type = 10;
2267 				} else if (coex_dm->cur_ps_tdma == 14) {
2268 					btc8821a2ant_ps_tdma(btcoexist,
2269 							NORMAL_EXEC, true, 10);
2270 					coex_dm->ps_tdma_du_adj_type = 10;
2271 				} else if (coex_dm->cur_ps_tdma == 15) {
2272 					btc8821a2ant_ps_tdma(btcoexist,
2273 							NORMAL_EXEC, true, 11);
2274 					coex_dm->ps_tdma_du_adj_type = 11;
2275 				} else if (coex_dm->cur_ps_tdma == 16) {
2276 					btc8821a2ant_ps_tdma(btcoexist,
2277 							NORMAL_EXEC, true, 12);
2278 					coex_dm->ps_tdma_du_adj_type = 12;
2279 				}
2280 				if (result == -1) {
2281 					if (coex_dm->cur_ps_tdma == 1) {
2282 						btc8821a2ant_ps_tdma(
2283 							btcoexist, NORMAL_EXEC,
2284 							true, 2);
2285 						coex_dm->ps_tdma_du_adj_type =
2286 							2;
2287 					} else if (coex_dm->cur_ps_tdma == 2) {
2288 						btc8821a2ant_ps_tdma(
2289 							btcoexist, NORMAL_EXEC,
2290 							true, 3);
2291 						coex_dm->ps_tdma_du_adj_type =
2292 							3;
2293 					} else if (coex_dm->cur_ps_tdma == 3) {
2294 						btc8821a2ant_ps_tdma(
2295 							btcoexist, NORMAL_EXEC,
2296 							true, 4);
2297 						coex_dm->ps_tdma_du_adj_type =
2298 							4;
2299 					} else if (coex_dm->cur_ps_tdma == 9) {
2300 						btc8821a2ant_ps_tdma(
2301 							btcoexist, NORMAL_EXEC,
2302 							true, 10);
2303 						coex_dm->ps_tdma_du_adj_type =
2304 							10;
2305 					} else if (coex_dm->cur_ps_tdma == 10) {
2306 						btc8821a2ant_ps_tdma(
2307 							btcoexist, NORMAL_EXEC,
2308 							true, 11);
2309 						coex_dm->ps_tdma_du_adj_type =
2310 							11;
2311 					} else if (coex_dm->cur_ps_tdma == 11) {
2312 						btc8821a2ant_ps_tdma(
2313 							btcoexist, NORMAL_EXEC,
2314 							true, 12);
2315 						coex_dm->ps_tdma_du_adj_type =
2316 							12;
2317 					}
2318 				} else if (result == 1) {
2319 					if (coex_dm->cur_ps_tdma == 4) {
2320 						btc8821a2ant_ps_tdma(
2321 							btcoexist, NORMAL_EXEC,
2322 							true, 3);
2323 						coex_dm->ps_tdma_du_adj_type =
2324 							3;
2325 					} else if (coex_dm->cur_ps_tdma == 3) {
2326 						btc8821a2ant_ps_tdma(
2327 							btcoexist, NORMAL_EXEC,
2328 							true, 2);
2329 						coex_dm->ps_tdma_du_adj_type =
2330 							2;
2331 					} else if (coex_dm->cur_ps_tdma == 2) {
2332 						btc8821a2ant_ps_tdma(
2333 							btcoexist, NORMAL_EXEC,
2334 							true, 2);
2335 						coex_dm->ps_tdma_du_adj_type =
2336 							2;
2337 					} else if (coex_dm->cur_ps_tdma == 12) {
2338 						btc8821a2ant_ps_tdma(
2339 							btcoexist, NORMAL_EXEC,
2340 							true, 11);
2341 						coex_dm->ps_tdma_du_adj_type =
2342 							11;
2343 					} else if (coex_dm->cur_ps_tdma == 11) {
2344 						btc8821a2ant_ps_tdma(
2345 							btcoexist, NORMAL_EXEC,
2346 							true, 10);
2347 						coex_dm->ps_tdma_du_adj_type =
2348 							10;
2349 					} else if (coex_dm->cur_ps_tdma == 10) {
2350 						btc8821a2ant_ps_tdma(
2351 							btcoexist, NORMAL_EXEC,
2352 							true, 10);
2353 						coex_dm->ps_tdma_du_adj_type =
2354 							10;
2355 					}
2356 				}
2357 			}
2358 		} else if (max_interval == 3) {
2359 			if (tx_pause) {
2360 				if (coex_dm->cur_ps_tdma == 1) {
2361 					btc8821a2ant_ps_tdma(btcoexist,
2362 							NORMAL_EXEC, true, 7);
2363 					coex_dm->ps_tdma_du_adj_type = 7;
2364 				} else if (coex_dm->cur_ps_tdma == 2) {
2365 					btc8821a2ant_ps_tdma(btcoexist,
2366 							NORMAL_EXEC, true, 7);
2367 					coex_dm->ps_tdma_du_adj_type = 7;
2368 				} else if (coex_dm->cur_ps_tdma == 3) {
2369 					btc8821a2ant_ps_tdma(btcoexist,
2370 							NORMAL_EXEC, true, 7);
2371 					coex_dm->ps_tdma_du_adj_type = 7;
2372 				} else if (coex_dm->cur_ps_tdma == 4) {
2373 					btc8821a2ant_ps_tdma(btcoexist,
2374 							NORMAL_EXEC, true, 8);
2375 					coex_dm->ps_tdma_du_adj_type = 8;
2376 				}
2377 				if (coex_dm->cur_ps_tdma == 9) {
2378 					btc8821a2ant_ps_tdma(btcoexist,
2379 							NORMAL_EXEC, true, 15);
2380 					coex_dm->ps_tdma_du_adj_type = 15;
2381 				} else if (coex_dm->cur_ps_tdma == 10) {
2382 					btc8821a2ant_ps_tdma(btcoexist,
2383 							NORMAL_EXEC, true, 15);
2384 					coex_dm->ps_tdma_du_adj_type = 15;
2385 				} else if (coex_dm->cur_ps_tdma == 11) {
2386 					btc8821a2ant_ps_tdma(btcoexist,
2387 							NORMAL_EXEC, true, 15);
2388 					coex_dm->ps_tdma_du_adj_type = 15;
2389 				} else if (coex_dm->cur_ps_tdma == 12) {
2390 					btc8821a2ant_ps_tdma(btcoexist,
2391 							NORMAL_EXEC, true, 16);
2392 					coex_dm->ps_tdma_du_adj_type = 16;
2393 				}
2394 				if (result == -1) {
2395 					if (coex_dm->cur_ps_tdma == 5) {
2396 						btc8821a2ant_ps_tdma(
2397 							btcoexist, NORMAL_EXEC,
2398 							true, 7);
2399 						coex_dm->ps_tdma_du_adj_type =
2400 							7;
2401 					} else if (coex_dm->cur_ps_tdma == 6) {
2402 						btc8821a2ant_ps_tdma(
2403 							btcoexist, NORMAL_EXEC,
2404 							true, 7);
2405 						coex_dm->ps_tdma_du_adj_type =
2406 							7;
2407 					} else if (coex_dm->cur_ps_tdma == 7) {
2408 						btc8821a2ant_ps_tdma(
2409 							btcoexist, NORMAL_EXEC,
2410 							true, 8);
2411 						coex_dm->ps_tdma_du_adj_type =
2412 							8;
2413 					} else if (coex_dm->cur_ps_tdma == 13) {
2414 						btc8821a2ant_ps_tdma(
2415 							btcoexist, NORMAL_EXEC,
2416 							true, 15);
2417 						coex_dm->ps_tdma_du_adj_type =
2418 							15;
2419 					} else if (coex_dm->cur_ps_tdma == 14) {
2420 						btc8821a2ant_ps_tdma(
2421 							btcoexist, NORMAL_EXEC,
2422 							true, 15);
2423 						coex_dm->ps_tdma_du_adj_type =
2424 							15;
2425 					} else if (coex_dm->cur_ps_tdma == 15) {
2426 						btc8821a2ant_ps_tdma(
2427 							btcoexist, NORMAL_EXEC,
2428 							true, 16);
2429 						coex_dm->ps_tdma_du_adj_type =
2430 							16;
2431 					}
2432 				} else if (result == 1) {
2433 					if (coex_dm->cur_ps_tdma == 8) {
2434 						btc8821a2ant_ps_tdma(
2435 							btcoexist, NORMAL_EXEC,
2436 							true, 7);
2437 						coex_dm->ps_tdma_du_adj_type =
2438 							7;
2439 					} else if (coex_dm->cur_ps_tdma == 7) {
2440 						btc8821a2ant_ps_tdma(
2441 							btcoexist, NORMAL_EXEC,
2442 							true, 7);
2443 						coex_dm->ps_tdma_du_adj_type =
2444 							7;
2445 					} else if (coex_dm->cur_ps_tdma == 6) {
2446 						btc8821a2ant_ps_tdma(
2447 							btcoexist, NORMAL_EXEC,
2448 							true, 7);
2449 						coex_dm->ps_tdma_du_adj_type =
2450 							7;
2451 					} else if (coex_dm->cur_ps_tdma == 16) {
2452 						btc8821a2ant_ps_tdma(
2453 							btcoexist, NORMAL_EXEC,
2454 							true, 15);
2455 						coex_dm->ps_tdma_du_adj_type =
2456 							15;
2457 					} else if (coex_dm->cur_ps_tdma == 15) {
2458 						btc8821a2ant_ps_tdma(
2459 							btcoexist, NORMAL_EXEC,
2460 							true, 15);
2461 						coex_dm->ps_tdma_du_adj_type =
2462 							15;
2463 					} else if (coex_dm->cur_ps_tdma == 14) {
2464 						btc8821a2ant_ps_tdma(
2465 							btcoexist, NORMAL_EXEC,
2466 							true, 15);
2467 						coex_dm->ps_tdma_du_adj_type =
2468 							15;
2469 					}
2470 				}
2471 			} else {
2472 				if (coex_dm->cur_ps_tdma == 5) {
2473 					btc8821a2ant_ps_tdma(btcoexist,
2474 							NORMAL_EXEC, true, 3);
2475 					coex_dm->ps_tdma_du_adj_type = 3;
2476 				} else if (coex_dm->cur_ps_tdma == 6) {
2477 					btc8821a2ant_ps_tdma(btcoexist,
2478 							NORMAL_EXEC, true, 3);
2479 					coex_dm->ps_tdma_du_adj_type = 3;
2480 				} else if (coex_dm->cur_ps_tdma == 7) {
2481 					btc8821a2ant_ps_tdma(btcoexist,
2482 							NORMAL_EXEC, true, 3);
2483 					coex_dm->ps_tdma_du_adj_type = 3;
2484 				} else if (coex_dm->cur_ps_tdma == 8) {
2485 					btc8821a2ant_ps_tdma(btcoexist,
2486 							NORMAL_EXEC, true, 4);
2487 					coex_dm->ps_tdma_du_adj_type = 4;
2488 				}
2489 				if (coex_dm->cur_ps_tdma == 13) {
2490 					btc8821a2ant_ps_tdma(btcoexist,
2491 							NORMAL_EXEC, true, 11);
2492 					coex_dm->ps_tdma_du_adj_type = 11;
2493 				} else if (coex_dm->cur_ps_tdma == 14) {
2494 					btc8821a2ant_ps_tdma(btcoexist,
2495 							NORMAL_EXEC, true, 11);
2496 					coex_dm->ps_tdma_du_adj_type = 11;
2497 				} else if (coex_dm->cur_ps_tdma == 15) {
2498 					btc8821a2ant_ps_tdma(btcoexist,
2499 							NORMAL_EXEC, true, 11);
2500 					coex_dm->ps_tdma_du_adj_type = 11;
2501 				} else if (coex_dm->cur_ps_tdma == 16) {
2502 					btc8821a2ant_ps_tdma(btcoexist,
2503 							NORMAL_EXEC, true, 12);
2504 					coex_dm->ps_tdma_du_adj_type = 12;
2505 				}
2506 				if (result == -1) {
2507 					if (coex_dm->cur_ps_tdma == 1) {
2508 						btc8821a2ant_ps_tdma(
2509 							btcoexist, NORMAL_EXEC,
2510 							true, 3);
2511 						coex_dm->ps_tdma_du_adj_type =
2512 							3;
2513 					} else if (coex_dm->cur_ps_tdma == 2) {
2514 						btc8821a2ant_ps_tdma(
2515 							btcoexist, NORMAL_EXEC,
2516 							true, 3);
2517 						coex_dm->ps_tdma_du_adj_type =
2518 							3;
2519 					} else if (coex_dm->cur_ps_tdma == 3) {
2520 						btc8821a2ant_ps_tdma(
2521 							btcoexist, NORMAL_EXEC,
2522 							true, 4);
2523 						coex_dm->ps_tdma_du_adj_type =
2524 							4;
2525 					} else if (coex_dm->cur_ps_tdma == 9) {
2526 						btc8821a2ant_ps_tdma(
2527 							btcoexist, NORMAL_EXEC,
2528 							true, 11);
2529 						coex_dm->ps_tdma_du_adj_type =
2530 							11;
2531 					} else if (coex_dm->cur_ps_tdma == 10) {
2532 						btc8821a2ant_ps_tdma(
2533 							btcoexist, NORMAL_EXEC,
2534 							true, 11);
2535 						coex_dm->ps_tdma_du_adj_type =
2536 							11;
2537 					} else if (coex_dm->cur_ps_tdma == 11) {
2538 						btc8821a2ant_ps_tdma(
2539 							btcoexist, NORMAL_EXEC,
2540 							true, 12);
2541 						coex_dm->ps_tdma_du_adj_type =
2542 							12;
2543 					}
2544 				} else if (result == 1) {
2545 					if (coex_dm->cur_ps_tdma == 4) {
2546 						btc8821a2ant_ps_tdma(
2547 							btcoexist, NORMAL_EXEC,
2548 							true, 3);
2549 						coex_dm->ps_tdma_du_adj_type =
2550 							3;
2551 					} else if (coex_dm->cur_ps_tdma == 3) {
2552 						btc8821a2ant_ps_tdma(
2553 							btcoexist, NORMAL_EXEC,
2554 							true, 3);
2555 						coex_dm->ps_tdma_du_adj_type =
2556 							3;
2557 					} else if (coex_dm->cur_ps_tdma == 2) {
2558 						btc8821a2ant_ps_tdma(
2559 							btcoexist, NORMAL_EXEC,
2560 							true, 3);
2561 						coex_dm->ps_tdma_du_adj_type =
2562 							3;
2563 					} else if (coex_dm->cur_ps_tdma == 12) {
2564 						btc8821a2ant_ps_tdma(
2565 							btcoexist, NORMAL_EXEC,
2566 							true, 11);
2567 						coex_dm->ps_tdma_du_adj_type =
2568 							11;
2569 					} else if (coex_dm->cur_ps_tdma == 11) {
2570 						btc8821a2ant_ps_tdma(
2571 							btcoexist, NORMAL_EXEC,
2572 							true, 11);
2573 						coex_dm->ps_tdma_du_adj_type =
2574 							11;
2575 					} else if (coex_dm->cur_ps_tdma == 10) {
2576 						btc8821a2ant_ps_tdma(
2577 							btcoexist, NORMAL_EXEC,
2578 							true, 11);
2579 						coex_dm->ps_tdma_du_adj_type =
2580 							11;
2581 					}
2582 				}
2583 			}
2584 		}
2585 	}
2586 
2587 	/* if current PsTdma not match with the recorded one
2588 	 * (when scan, dhcp...), then we have to adjust it back to
2589 	 * the previous recorded one.
2590 	 */
2591 	if (coex_dm->cur_ps_tdma != coex_dm->ps_tdma_du_adj_type) {
2592 		bool scan = false, link = false, roam = false;
2593 
2594 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2595 			"[BTCoex], PsTdma type mismatch!!!, cur_ps_tdma = %d, recordPsTdma = %d\n",
2596 			coex_dm->cur_ps_tdma, coex_dm->ps_tdma_du_adj_type);
2597 
2598 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2599 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2600 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2601 
2602 		if (!scan && !link && !roam) {
2603 			btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2604 					     coex_dm->ps_tdma_du_adj_type);
2605 		} else {
2606 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2607 				"[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n");
2608 		}
2609 	}
2610 }
2611 
2612 /* SCO only or SCO+PAN(HS)*/
btc8821a2ant_action_sco(struct btc_coexist * btcoexist)2613 static void btc8821a2ant_action_sco(struct btc_coexist *btcoexist)
2614 {
2615 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2616 	u8 wifi_rssi_state, bt_rssi_state;
2617 	u32 wifi_bw;
2618 
2619 	wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2620 	bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist, 2, 35, 0);
2621 
2622 	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2623 
2624 	btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2625 	btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 4);
2626 
2627 	if (BTC_RSSI_HIGH(bt_rssi_state))
2628 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
2629 	else
2630 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2631 
2632 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2633 
2634 	if (wifi_bw == BTC_WIFI_BW_LEGACY) {
2635 		/* for SCO quality at 11b/g mode */
2636 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2637 	} else {
2638 		/* for SCO quality & wifi performance balance at 11n mode */
2639 		if (wifi_bw == BTC_WIFI_BW_HT40) {
2640 			btc8821a2ant_coex_table_with_type(btcoexist,
2641 							  NORMAL_EXEC, 8);
2642 		} else {
2643 			if (bt_link_info->sco_only)
2644 				btc8821a2ant_coex_table_with_type(
2645 					btcoexist, NORMAL_EXEC, 17);
2646 			else
2647 				btc8821a2ant_coex_table_with_type(
2648 					btcoexist, NORMAL_EXEC, 12);
2649 		}
2650 	}
2651 
2652 	btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2653 	/* for voice quality */
2654 	btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2655 
2656 	/* sw mechanism */
2657 	if (wifi_bw == BTC_WIFI_BW_HT40) {
2658 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2659 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2660 			btc8821a2ant_sw_mechanism1(btcoexist, true, true,
2661 						   false, false);
2662 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2663 						   true, 0x18);
2664 		} else {
2665 			btc8821a2ant_sw_mechanism1(btcoexist, true, true,
2666 						   false, false);
2667 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2668 						   true, 0x18);
2669 		}
2670 	} else {
2671 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2672 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2673 			btc8821a2ant_sw_mechanism1(btcoexist, false, true,
2674 						   false, false);
2675 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2676 						   true, 0x18);
2677 		} else {
2678 			btc8821a2ant_sw_mechanism1(btcoexist, false, true,
2679 						   false, false);
2680 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2681 						   true, 0x18);
2682 		}
2683 	}
2684 }
2685 
btc8821a2ant_action_hid(struct btc_coexist * btcoexist)2686 static void btc8821a2ant_action_hid(struct btc_coexist *btcoexist)
2687 {
2688 	u8 wifi_rssi_state, bt_rssi_state;
2689 	u32 wifi_bw;
2690 
2691 	wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2692 	bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
2693 		2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
2694 
2695 	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2696 
2697 	btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2698 	btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2699 
2700 	if (BTC_RSSI_HIGH(bt_rssi_state))
2701 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
2702 	else
2703 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2704 
2705 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2706 
2707 	if (wifi_bw == BTC_WIFI_BW_LEGACY) {
2708 		/* for HID at 11b/g mode */
2709 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2710 	} else {
2711 		/* for HID quality & wifi performance balance at 11n mode */
2712 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2713 	}
2714 
2715 	btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2716 	btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 24);
2717 
2718 	if (wifi_bw == BTC_WIFI_BW_HT40) {
2719 		/* sw mechanism */
2720 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2721 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2722 			btc8821a2ant_sw_mechanism1(btcoexist, true, true,
2723 						   false, false);
2724 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2725 						   false, 0x18);
2726 		} else {
2727 			btc8821a2ant_sw_mechanism1(btcoexist, true, true,
2728 						   false, false);
2729 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2730 						   false, 0x18);
2731 		}
2732 	} else {
2733 		/* sw mechanism */
2734 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2735 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2736 			btc8821a2ant_sw_mechanism1(btcoexist, false, true,
2737 						   false, false);
2738 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2739 						   false, 0x18);
2740 		} else {
2741 			btc8821a2ant_sw_mechanism1(btcoexist, false, true,
2742 						   false, false);
2743 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2744 						   false, 0x18);
2745 		}
2746 	}
2747 }
2748 
2749 /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
btc8821a2ant_action_a2dp(struct btc_coexist * btcoexist)2750 static void btc8821a2ant_action_a2dp(struct btc_coexist *btcoexist)
2751 {
2752 	u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
2753 	u8 ap_num = 0;
2754 	u32 wifi_bw;
2755 
2756 	wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2757 	wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
2758 				BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
2759 	bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
2760 		2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
2761 
2762 	if ((ap_num >= 10) && BTC_RSSI_HIGH(wifi_rssi_state1) &&
2763 	    BTC_RSSI_HIGH(bt_rssi_state)) {
2764 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2765 					      0x0, 0x0);
2766 
2767 		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
2768 					  0x0);
2769 		btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
2770 					0x8);
2771 		btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2772 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2773 
2774 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2775 
2776 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2777 					      0x0, 0x0);
2778 		btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
2779 
2780 		/* sw mechanism */
2781 		btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2782 		if (wifi_bw == BTC_WIFI_BW_HT40) {
2783 			btc8821a2ant_sw_mechanism1(btcoexist, true, false,
2784 						   false, false);
2785 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2786 						   true, 0x6);
2787 		} else {
2788 			btc8821a2ant_sw_mechanism1(btcoexist, false, false,
2789 						   false, false);
2790 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2791 						   true, 0x6);
2792 		}
2793 		return;
2794 	}
2795 
2796 	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2797 	btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2798 
2799 	btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2800 
2801 	if (BTC_RSSI_HIGH(bt_rssi_state))
2802 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2803 	else
2804 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2805 
2806 	if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
2807 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2808 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2809 					      0x0, 0x0);
2810 	} else {
2811 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
2812 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
2813 					      0x4);
2814 	}
2815 
2816 	if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2817 	    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2818 		btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
2819 	} else {
2820 		btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
2821 	}
2822 
2823 	/* sw mechanism */
2824 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2825 	if (wifi_bw == BTC_WIFI_BW_HT40) {
2826 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2827 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2828 			btc8821a2ant_sw_mechanism1(btcoexist, true, false,
2829 						   false, false);
2830 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2831 						   false, 0x18);
2832 		} else {
2833 			btc8821a2ant_sw_mechanism1(btcoexist, true, false,
2834 						   false, false);
2835 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2836 						   false, 0x18);
2837 		}
2838 	} else {
2839 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2840 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2841 			btc8821a2ant_sw_mechanism1(btcoexist, false, false,
2842 						   false, false);
2843 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2844 						   false, 0x18);
2845 		} else {
2846 			btc8821a2ant_sw_mechanism1(btcoexist, false, false,
2847 						   false, false);
2848 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2849 						   false, 0x18);
2850 		}
2851 	}
2852 }
2853 
btc8821a2ant_action_a2dp_pan_hs(struct btc_coexist * btcoexist)2854 static void btc8821a2ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)
2855 {
2856 	u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
2857 	u32 wifi_bw;
2858 
2859 	wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2860 	wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
2861 				BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
2862 	bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
2863 		2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
2864 
2865 	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2866 
2867 	btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2868 	btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2869 
2870 	if (BTC_RSSI_HIGH(bt_rssi_state))
2871 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2872 	else
2873 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2874 
2875 	if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
2876 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2877 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2878 					      0x0, 0x0);
2879 	} else {
2880 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
2881 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
2882 					      0x4);
2883 	}
2884 
2885 	btc8821a2ant_tdma_duration_adjust(btcoexist, false, true, 2);
2886 
2887 	/* sw mechanism */
2888 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2889 	if (wifi_bw == BTC_WIFI_BW_HT40) {
2890 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2891 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2892 			btc8821a2ant_sw_mechanism1(btcoexist, true, false,
2893 						   false, false);
2894 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2895 						   false, 0x18);
2896 		} else {
2897 			btc8821a2ant_sw_mechanism1(btcoexist, true, false,
2898 						   false, false);
2899 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2900 						   false, 0x18);
2901 		}
2902 	} else {
2903 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2904 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2905 			btc8821a2ant_sw_mechanism1(btcoexist, false, false,
2906 						   false, false);
2907 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2908 						   false, 0x18);
2909 		} else {
2910 			btc8821a2ant_sw_mechanism1(btcoexist, false, false,
2911 						   false, false);
2912 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2913 						   false, 0x18);
2914 		}
2915 	}
2916 }
2917 
btc8821a2ant_action_pan_edr(struct btc_coexist * btcoexist)2918 static void btc8821a2ant_action_pan_edr(struct btc_coexist *btcoexist)
2919 {
2920 	u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
2921 	u32 wifi_bw;
2922 
2923 	wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2924 	wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
2925 				BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
2926 	bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
2927 				2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
2928 
2929 	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2930 
2931 	btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2932 
2933 	btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2934 
2935 	if (BTC_RSSI_HIGH(bt_rssi_state))
2936 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
2937 	else
2938 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2939 
2940 	if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
2941 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 10);
2942 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2943 					      0x0, 0x0);
2944 	} else {
2945 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
2946 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
2947 					      0x4);
2948 	}
2949 
2950 	if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2951 	    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
2952 		btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 26);
2953 	else
2954 		btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 26);
2955 
2956 	/* sw mechanism */
2957 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2958 	if (wifi_bw == BTC_WIFI_BW_HT40) {
2959 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2960 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2961 			btc8821a2ant_sw_mechanism1(btcoexist, true, false,
2962 						   false, false);
2963 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2964 						   false, 0x18);
2965 		} else {
2966 			btc8821a2ant_sw_mechanism1(btcoexist, true, false,
2967 						   false, false);
2968 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2969 						   false, 0x18);
2970 		}
2971 	} else {
2972 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2973 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
2974 			btc8821a2ant_sw_mechanism1(btcoexist, false, false,
2975 						   false, false);
2976 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
2977 						   false, 0x18);
2978 		} else {
2979 			btc8821a2ant_sw_mechanism1(btcoexist, false, false,
2980 						   false, false);
2981 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
2982 						   false, 0x18);
2983 		}
2984 	}
2985 }
2986 
2987 /* PAN(HS) only */
btc8821a2ant_action_pan_hs(struct btc_coexist * btcoexist)2988 static void btc8821a2ant_action_pan_hs(struct btc_coexist *btcoexist)
2989 {
2990 	u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
2991 	u32 wifi_bw;
2992 
2993 	wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2994 	wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
2995 				BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
2996 	bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
2997 				2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
2998 
2999 	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3000 
3001 	btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3002 	btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3003 
3004 	if (BTC_RSSI_HIGH(bt_rssi_state))
3005 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3006 	else
3007 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3008 
3009 	btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3010 	btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
3011 	btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3012 
3013 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3014 	if (wifi_bw == BTC_WIFI_BW_HT40) {
3015 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3016 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3017 			btc8821a2ant_sw_mechanism1(btcoexist, true, false,
3018 						   false, false);
3019 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3020 						   false, 0x18);
3021 		} else {
3022 			btc8821a2ant_sw_mechanism1(btcoexist, true, false,
3023 						   false, false);
3024 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3025 						   false, 0x18);
3026 		}
3027 	} else {
3028 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3029 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3030 			btc8821a2ant_sw_mechanism1(btcoexist, false, false,
3031 						   false, false);
3032 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3033 						   false, 0x18);
3034 		} else {
3035 			btc8821a2ant_sw_mechanism1(btcoexist, false, false,
3036 						   false, false);
3037 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3038 						   false, 0x18);
3039 		}
3040 	}
3041 }
3042 
3043 /* PAN(EDR)+A2DP */
btc8821a2ant_action_pan_edr_a2dp(struct btc_coexist * btcoexist)3044 static void btc8821a2ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)
3045 {
3046 	u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
3047 	u32 wifi_bw;
3048 
3049 	wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3050 	wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
3051 				BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
3052 	bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
3053 				2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
3054 
3055 	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3056 
3057 	btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3058 
3059 	btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3060 
3061 	if (BTC_RSSI_HIGH(bt_rssi_state))
3062 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3063 	else
3064 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3065 
3066 	if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state))
3067 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3068 					      0x0, 0x0);
3069 	else
3070 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3071 					      0x4);
3072 
3073 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3074 
3075 	if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3076 	    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3077 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 12);
3078 
3079 		if (wifi_bw == BTC_WIFI_BW_HT40)
3080 			btc8821a2ant_tdma_duration_adjust(btcoexist, false,
3081 							  true, 3);
3082 		else
3083 			btc8821a2ant_tdma_duration_adjust(btcoexist, false,
3084 							  false, 3);
3085 	} else {
3086 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
3087 		btc8821a2ant_tdma_duration_adjust(btcoexist, false, true, 3);
3088 	}
3089 
3090 	/* sw mechanism	 */
3091 	if (wifi_bw == BTC_WIFI_BW_HT40) {
3092 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3093 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3094 			btc8821a2ant_sw_mechanism1(btcoexist, true, false,
3095 						   false, false);
3096 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3097 						   false, 0x18);
3098 		} else {
3099 			btc8821a2ant_sw_mechanism1(btcoexist, true, false,
3100 						   false, false);
3101 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3102 						   false, 0x18);
3103 		}
3104 	} else {
3105 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3106 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3107 			btc8821a2ant_sw_mechanism1(btcoexist, false, false,
3108 						   false, false);
3109 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3110 						   false, 0x18);
3111 		} else {
3112 			btc8821a2ant_sw_mechanism1(btcoexist, false, false,
3113 						   false, false);
3114 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3115 						   false, 0x18);
3116 		}
3117 	}
3118 }
3119 
btc8821a2ant_action_pan_edr_hid(struct btc_coexist * btcoexist)3120 static void btc8821a2ant_action_pan_edr_hid(struct btc_coexist *btcoexist)
3121 {
3122 	u8 wifi_rssi_state, bt_rssi_state;
3123 	u32 wifi_bw;
3124 
3125 	wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3126 	bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
3127 				2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
3128 
3129 	btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3130 
3131 	if (BTC_RSSI_HIGH(bt_rssi_state))
3132 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
3133 	else
3134 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
3135 
3136 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3137 
3138 	if (wifi_bw == BTC_WIFI_BW_LEGACY) {
3139 		/* for HID at 11b/g mode */
3140 		btc8821a2ant_coex_table(btcoexist, NORMAL_EXEC, 0x55ff55ff,
3141 					0x5a5f5a5f, 0xffff, 0x3);
3142 	} else {
3143 		/* for HID quality & wifi performance balance at 11n mode */
3144 		btc8821a2ant_coex_table(btcoexist, NORMAL_EXEC, 0x55ff55ff,
3145 					0x5a5f5a5f, 0xffff, 0x3);
3146 	}
3147 
3148 	if (wifi_bw == BTC_WIFI_BW_HT40) {
3149 		btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 3);
3150 		/* fw mechanism */
3151 		if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3152 		    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3153 			btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC,
3154 					     true, 10);
3155 		} else {
3156 			btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
3157 		}
3158 
3159 		/* sw mechanism */
3160 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3161 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3162 			btc8821a2ant_sw_mechanism1(btcoexist, true, true,
3163 						   false, false);
3164 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3165 						   false, 0x18);
3166 		} else {
3167 			btc8821a2ant_sw_mechanism1(btcoexist, true, true,
3168 						   false, false);
3169 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3170 						   false, 0x18);
3171 		}
3172 	} else {
3173 		btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3174 		/* fw mechanism */
3175 		if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3176 		    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3177 			btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10);
3178 		} else {
3179 			btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
3180 		}
3181 
3182 		/* sw mechanism */
3183 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3184 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3185 			btc8821a2ant_sw_mechanism1(btcoexist, false, true,
3186 						   false, false);
3187 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3188 						   false, 0x18);
3189 		} else {
3190 			btc8821a2ant_sw_mechanism1(btcoexist, false, true,
3191 						   false, false);
3192 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3193 						   false, 0x18);
3194 		}
3195 	}
3196 }
3197 
3198 /* HID+A2DP+PAN(EDR) */
btc8821a2ant_act_hid_a2dp_pan_edr(struct btc_coexist * btcoexist)3199 static void btc8821a2ant_act_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)
3200 {
3201 	u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
3202 	u32 wifi_bw;
3203 
3204 	wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3205 	wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
3206 				BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
3207 	bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
3208 				2, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 0);
3209 
3210 	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3211 
3212 	btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3213 	btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3214 
3215 	if (BTC_RSSI_HIGH(bt_rssi_state))
3216 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3217 	else
3218 		btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3219 
3220 	if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
3221 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3222 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3223 					      0x0, 0x0);
3224 	} else {
3225 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 14);
3226 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3227 					      0x4);
3228 	}
3229 
3230 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3231 
3232 	if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3233 	    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3234 		if (wifi_bw == BTC_WIFI_BW_HT40)
3235 			btc8821a2ant_tdma_duration_adjust(btcoexist, true,
3236 							  true, 3);
3237 		else
3238 			btc8821a2ant_tdma_duration_adjust(btcoexist, true,
3239 							  false, 3);
3240 	} else {
3241 		btc8821a2ant_tdma_duration_adjust(btcoexist, true, true, 3);
3242 	}
3243 
3244 	/* sw mechanism */
3245 	if (wifi_bw == BTC_WIFI_BW_HT40) {
3246 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3247 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3248 			btc8821a2ant_sw_mechanism1(btcoexist, true, true,
3249 						   false, false);
3250 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3251 						   false, 0x18);
3252 		} else {
3253 			btc8821a2ant_sw_mechanism1(btcoexist, true, true,
3254 						   false, false);
3255 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3256 						   false, 0x18);
3257 		}
3258 	} else {
3259 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3260 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3261 			btc8821a2ant_sw_mechanism1(btcoexist, false, true,
3262 						   false, false);
3263 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3264 						   false, 0x18);
3265 		} else {
3266 			btc8821a2ant_sw_mechanism1(btcoexist, false, true,
3267 						   false, false);
3268 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3269 						   false, 0x18);
3270 		}
3271 	}
3272 }
3273 
btc8821a2ant_action_hid_a2dp(struct btc_coexist * btcoexist)3274 static void btc8821a2ant_action_hid_a2dp(struct btc_coexist *btcoexist)
3275 {
3276 	u32 wifi_bw;
3277 	u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
3278 	u8 ap_num = 0;
3279 
3280 	wifi_rssi_state = btc8821a2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3281 	wifi_rssi_state1 = btc8821a2ant_wifi_rssi_state(btcoexist, 1, 2,
3282 				BT_8821A_2ANT_WIFI_RSSI_COEXSWITCH_THRES, 0);
3283 	bt_rssi_state = btc8821a2ant_bt_rssi_state(btcoexist,
3284 				3, BT_8821A_2ANT_BT_RSSI_COEXSWITCH_THRES, 37);
3285 
3286 	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3287 
3288 	btc8821a2ant_limited_rx(btcoexist, NORMAL_EXEC, false, true, 0x5);
3289 	btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3290 
3291 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3292 	if (wifi_bw == BTC_WIFI_BW_LEGACY) {
3293 		if (BTC_RSSI_HIGH(bt_rssi_state))
3294 			btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3295 		else if (BTC_RSSI_MEDIUM(bt_rssi_state))
3296 			btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3297 		else
3298 			btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3299 	} else {
3300 		/* only 802.11N mode we have to dec bt power to 4 degree */
3301 		if (BTC_RSSI_HIGH(bt_rssi_state)) {
3302 			btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
3303 					   &ap_num);
3304 			if (ap_num < 10)
3305 				btc8821a2ant_dec_bt_pwr(btcoexist,
3306 							NORMAL_EXEC, 4);
3307 			else
3308 				btc8821a2ant_dec_bt_pwr(btcoexist,
3309 							NORMAL_EXEC, 2);
3310 		} else if (BTC_RSSI_MEDIUM(bt_rssi_state)) {
3311 			btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3312 		} else {
3313 			btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3314 		}
3315 	}
3316 
3317 	if (wifi_bw == BTC_WIFI_BW_LEGACY) {
3318 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3319 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3320 					      0x0, 0x0);
3321 	} else {
3322 		btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 14);
3323 		btc8821a2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3324 					      0x4);
3325 	}
3326 
3327 	if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3328 	    (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3329 		btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
3330 	} else {
3331 		btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
3332 	}
3333 
3334 	/* sw mechanism */
3335 	if (wifi_bw == BTC_WIFI_BW_HT40) {
3336 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3337 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3338 			btc8821a2ant_sw_mechanism1(btcoexist, true, true,
3339 						   false, false);
3340 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3341 						   false, 0x18);
3342 		} else {
3343 			btc8821a2ant_sw_mechanism1(btcoexist, true, true,
3344 						   false, false);
3345 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3346 						   false, 0x18);
3347 		}
3348 	} else {
3349 		if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
3350 		    (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3351 			btc8821a2ant_sw_mechanism1(btcoexist, false, true,
3352 						   false, false);
3353 			btc8821a2ant_sw_mechanism2(btcoexist, true, false,
3354 						   false, 0x18);
3355 		} else {
3356 			btc8821a2ant_sw_mechanism1(btcoexist, false, true,
3357 						   false, false);
3358 			btc8821a2ant_sw_mechanism2(btcoexist, false, false,
3359 						   false, 0x18);
3360 		}
3361 	}
3362 }
3363 
btc8821a2ant_action_wifi_multi_port(struct btc_coexist * btcoexist)3364 static void btc8821a2ant_action_wifi_multi_port(struct btc_coexist *btcoexist)
3365 {
3366 	btc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3367 	btc8821a2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3368 
3369 	/* sw all off */
3370 	btc8821a2ant_sw_mechanism1(btcoexist, false, false, false, false);
3371 	btc8821a2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
3372 
3373 	/* hw all off */
3374 	btc8821a2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3375 
3376 	btc8821a2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
3377 	btc8821a2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3378 }
3379 
btc8821a2ant_run_coexist_mechanism(struct btc_coexist * btcoexist)3380 static void btc8821a2ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
3381 {
3382 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3383 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3384 	bool wifi_under_5g = false;
3385 	u8 algorithm = 0;
3386 	u32 num_of_wifi_link = 0;
3387 	u32 wifi_link_status = 0;
3388 	bool miracast_plus_bt = false;
3389 	bool scan = false, link = false, roam = false;
3390 
3391 	if (btcoexist->manual_control) {
3392 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3393 			"[BTCoex], Manual control!!!\n");
3394 		return;
3395 	}
3396 
3397 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3398 
3399 	if (wifi_under_5g) {
3400 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3401 			"[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n");
3402 		btc8821a2ant_coex_under_5g(btcoexist);
3403 		return;
3404 	}
3405 
3406 	if (coex_sta->under_ips) {
3407 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3408 			"[BTCoex], wifi is under IPS !!!\n");
3409 		return;
3410 	}
3411 
3412 	algorithm = btc8821a2ant_action_algorithm(btcoexist);
3413 	if (coex_sta->c2h_bt_inquiry_page &&
3414 	    (BT_8821A_2ANT_COEX_ALGO_PANHS != algorithm)) {
3415 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3416 			"[BTCoex], BT is under inquiry/page scan !!\n");
3417 		btc8821a2ant_action_bt_inquiry(btcoexist);
3418 		return;
3419 	}
3420 
3421 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3422 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3423 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3424 
3425 	if (scan || link || roam) {
3426 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3427 			"[BTCoex], WiFi is under Link Process !!\n");
3428 		btc8821a2ant_action_wifi_link_process(btcoexist);
3429 		return;
3430 	}
3431 
3432 	/* for P2P */
3433 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3434 			   &wifi_link_status);
3435 	num_of_wifi_link = wifi_link_status >> 16;
3436 
3437 	if ((num_of_wifi_link >= 2) ||
3438 	    (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {
3439 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3440 			"############# [BTCoex],  Multi-Port num_of_wifi_link = %d, wifi_link_status = 0x%x\n",
3441 			num_of_wifi_link, wifi_link_status);
3442 
3443 		if (bt_link_info->bt_link_exist)
3444 			miracast_plus_bt = true;
3445 		else
3446 			miracast_plus_bt = false;
3447 
3448 		btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3449 				   &miracast_plus_bt);
3450 		btc8821a2ant_action_wifi_multi_port(btcoexist);
3451 
3452 		return;
3453 	}
3454 
3455 	miracast_plus_bt = false;
3456 	btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3457 			   &miracast_plus_bt);
3458 
3459 	coex_dm->cur_algorithm = algorithm;
3460 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3461 		"[BTCoex], Algorithm = %d\n", coex_dm->cur_algorithm);
3462 
3463 	if (btc8821a2ant_is_common_action(btcoexist)) {
3464 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3465 			"[BTCoex], Action 2-Ant common\n");
3466 		coex_dm->auto_tdma_adjust = true;
3467 	} else {
3468 		if (coex_dm->cur_algorithm != coex_dm->pre_algorithm) {
3469 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3470 				"[BTCoex], pre_algorithm = %d, cur_algorithm = %d\n",
3471 				coex_dm->pre_algorithm,
3472 				coex_dm->cur_algorithm);
3473 			coex_dm->auto_tdma_adjust = false;
3474 		}
3475 		switch (coex_dm->cur_algorithm) {
3476 		case BT_8821A_2ANT_COEX_ALGO_SCO:
3477 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3478 				"[BTCoex], Action 2-Ant, algorithm = SCO\n");
3479 			btc8821a2ant_action_sco(btcoexist);
3480 			break;
3481 		case BT_8821A_2ANT_COEX_ALGO_HID:
3482 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3483 				"[BTCoex], Action 2-Ant, algorithm = HID\n");
3484 			btc8821a2ant_action_hid(btcoexist);
3485 			break;
3486 		case BT_8821A_2ANT_COEX_ALGO_A2DP:
3487 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3488 				"[BTCoex], Action 2-Ant, algorithm = A2DP\n");
3489 			btc8821a2ant_action_a2dp(btcoexist);
3490 			break;
3491 		case BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS:
3492 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3493 				"[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS)\n");
3494 			btc8821a2ant_action_a2dp_pan_hs(btcoexist);
3495 			break;
3496 		case BT_8821A_2ANT_COEX_ALGO_PANEDR:
3497 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3498 				"[BTCoex], Action 2-Ant, algorithm = PAN(EDR)\n");
3499 			btc8821a2ant_action_pan_edr(btcoexist);
3500 			break;
3501 		case BT_8821A_2ANT_COEX_ALGO_PANHS:
3502 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3503 				"[BTCoex], Action 2-Ant, algorithm = HS mode\n");
3504 			btc8821a2ant_action_pan_hs(btcoexist);
3505 			break;
3506 		case BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP:
3507 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3508 				"[BTCoex], Action 2-Ant, algorithm = PAN+A2DP\n");
3509 			btc8821a2ant_action_pan_edr_a2dp(btcoexist);
3510 			break;
3511 		case BT_8821A_2ANT_COEX_ALGO_PANEDR_HID:
3512 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3513 				"[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID\n");
3514 			btc8821a2ant_action_pan_edr_hid(btcoexist);
3515 			break;
3516 		case BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
3517 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3518 				"[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN\n");
3519 			btc8821a2ant_act_hid_a2dp_pan_edr(btcoexist);
3520 			break;
3521 		case BT_8821A_2ANT_COEX_ALGO_HID_A2DP:
3522 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3523 				"[BTCoex], Action 2-Ant, algorithm = HID+A2DP\n");
3524 			btc8821a2ant_action_hid_a2dp(btcoexist);
3525 			break;
3526 		default:
3527 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3528 				"[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n");
3529 			btc8821a2ant_coex_all_off(btcoexist);
3530 			break;
3531 		}
3532 		coex_dm->pre_algorithm = coex_dm->cur_algorithm;
3533 	}
3534 }
3535 
btc8821a2ant_wifi_off_hw_cfg(struct btc_coexist * btcoexist)3536 static void btc8821a2ant_wifi_off_hw_cfg(struct btc_coexist *btcoexist)
3537 {
3538 	u8 h2c_parameter[2] = {0};
3539 	u32 fw_ver = 0;
3540 
3541 	/* set wlan_act to low */
3542 	btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
3543 
3544 	/* WiFi goto standby while GNT_BT 0-->1 */
3545 	btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);
3546 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3547 	if (fw_ver >= 0x180000) {
3548 		/* Use H2C to set GNT_BT to HIGH */
3549 		h2c_parameter[0] = 1;
3550 		btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1, h2c_parameter);
3551 	} else {
3552 		btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
3553 	}
3554 }
3555 
3556 /**************************************************************
3557  * extern function start with ex_btc8821a2ant_
3558  **************************************************************/
ex_btc8821a2ant_init_hwconfig(struct btc_coexist * btcoexist)3559 void ex_btc8821a2ant_init_hwconfig(struct btc_coexist *btcoexist)
3560 {
3561 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3562 	u8 u1tmp = 0;
3563 
3564 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3565 		"[BTCoex], 2Ant Init HW Config!!\n");
3566 
3567 	/* backup rf 0x1e value */
3568 	coex_dm->bt_rf0x1e_backup =
3569 		btcoexist->btc_get_rf_reg(btcoexist, BTC_RF_A, 0x1e, 0xfffff);
3570 
3571 	/* 0x790[5:0] = 0x5 */
3572 	u1tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
3573 	u1tmp &= 0xc0;
3574 	u1tmp |= 0x5;
3575 	btcoexist->btc_write_1byte(btcoexist, 0x790, u1tmp);
3576 
3577 	/* Antenna config */
3578 	btc8821a2ant_set_ant_path(btcoexist, BTC_ANT_WIFI_AT_MAIN, true, false);
3579 	coex_sta->dis_ver_info_cnt = 0;
3580 
3581 	/* PTA parameter */
3582 	btc8821a2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
3583 
3584 	/* Enable counter statistics */
3585 	/* 0x76e[3] = 1, WLAN_Act control by PTA */
3586 	btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
3587 	btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
3588 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
3589 }
3590 
ex_btc8821a2ant_pre_load_firmware(struct btc_coexist * btcoexist)3591 void ex_btc8821a2ant_pre_load_firmware(struct btc_coexist *btcoexist)
3592 {
3593 	struct btc_board_info *board_info = &btcoexist->board_info;
3594 	u8 u8tmp = 0x4; /* Set BIT2 by default since it's 2ant case */
3595 
3596 	/**
3597 	 * S0 or S1 setting and Local register setting(By the setting fw can get
3598 	 * ant number, S0/S1, ... info)
3599 	 *
3600 	 * Local setting bit define
3601 	 *	BIT0: "0" for no antenna inverse; "1" for antenna inverse
3602 	 *	BIT1: "0" for internal switch; "1" for external switch
3603 	 *	BIT2: "0" for one antenna; "1" for two antenna
3604 	 * NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and
3605 	 * BIT2=0
3606 	 */
3607 	if (btcoexist->chip_interface == BTC_INTF_USB) {
3608 		/* fixed at S0 for USB interface */
3609 		u8tmp |= 0x1; /* antenna inverse */
3610 		btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
3611 	} else {
3612 		/* for PCIE and SDIO interface, we check efuse 0xc3[6] */
3613 		if (board_info->single_ant_path == 0) {
3614 		} else if (board_info->single_ant_path == 1) {
3615 			/* set to S0 */
3616 			u8tmp |= 0x1; /* antenna inverse */
3617 		}
3618 
3619 		if (btcoexist->chip_interface == BTC_INTF_PCI)
3620 			btcoexist->btc_write_local_reg_1byte(btcoexist, 0x384,
3621 							     u8tmp);
3622 		else if (btcoexist->chip_interface == BTC_INTF_SDIO)
3623 			btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60,
3624 							     u8tmp);
3625 	}
3626 }
3627 
ex_btc8821a2ant_init_coex_dm(struct btc_coexist * btcoexist)3628 void ex_btc8821a2ant_init_coex_dm(struct btc_coexist *btcoexist)
3629 {
3630 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3631 
3632 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3633 		"[BTCoex], Coex Mechanism Init!!\n");
3634 
3635 	btc8821a2ant_init_coex_dm(btcoexist);
3636 }
3637 
ex_btc8821a2ant_display_coex_info(struct btc_coexist * btcoexist,struct seq_file * m)3638 void ex_btc8821a2ant_display_coex_info(struct btc_coexist *btcoexist,
3639 				       struct seq_file *m)
3640 {
3641 	struct btc_board_info *board_info = &btcoexist->board_info;
3642 	struct btc_stack_info *stack_info = &btcoexist->stack_info;
3643 	u8 u1tmp[4], i, bt_info_ext, ps_tdma_case = 0;
3644 	u32 u4tmp[4];
3645 	bool roam = false, scan = false, link = false, wifi_under_5g = false;
3646 	bool bt_hs_on = false, wifi_busy = false;
3647 	long wifi_rssi = 0, bt_hs_rssi = 0;
3648 	u32 wifi_bw, wifi_traffic_dir;
3649 	u8 wifi_dot_11_chnl, wifi_hs_chnl;
3650 	u32 fw_ver = 0, bt_patch_ver = 0;
3651 
3652 	seq_puts(m, "\n ============[BT Coexist info]============");
3653 
3654 	seq_printf(m, "\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:",
3655 		   board_info->pg_ant_num, board_info->btdm_ant_num);
3656 
3657 	if (btcoexist->manual_control) {
3658 		seq_printf(m, "\n %-35s", "[Action Manual control]!!");
3659 	}
3660 
3661 	seq_printf(m, "\n %-35s = %s / %d", "BT stack/ hci ext ver",
3662 		   ((stack_info->profile_notified) ? "Yes" : "No"),
3663 		   stack_info->hci_version);
3664 
3665 	btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
3666 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3667 	seq_printf(m, "\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)",
3668 		   "CoexVer/ FwVer/ PatchVer",
3669 		   glcoex_ver_date_8821a_2ant, glcoex_ver_8821a_2ant,
3670 		   fw_ver, bt_patch_ver, bt_patch_ver);
3671 
3672 	btcoexist->btc_get(btcoexist,
3673 		BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3674 	btcoexist->btc_get(btcoexist,
3675 		BTC_GET_U1_WIFI_DOT11_CHNL, &wifi_dot_11_chnl);
3676 	btcoexist->btc_get(btcoexist,
3677 		BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);
3678 	seq_printf(m, "\n %-35s = %d / %d(%d)",
3679 		   "Dot11 channel / HsMode(HsChnl)",
3680 		   wifi_dot_11_chnl, bt_hs_on, wifi_hs_chnl);
3681 
3682 	seq_printf(m, "\n %-35s = %3ph ",
3683 		   "H2C Wifi inform bt chnl Info",
3684 		   coex_dm->wifi_chnl_info);
3685 
3686 	btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
3687 	btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
3688 	seq_printf(m, "\n %-35s = %ld/ %ld", "Wifi rssi/ HS rssi",
3689 		   wifi_rssi, bt_hs_rssi);
3690 
3691 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3692 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3693 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3694 	seq_printf(m, "\n %-35s = %d/ %d/ %d ", "Wifi link/ roam/ scan",
3695 		   link, roam, scan);
3696 
3697 	btcoexist->btc_get(btcoexist,
3698 		BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3699 	btcoexist->btc_get(btcoexist,
3700 		BTC_GET_U4_WIFI_BW, &wifi_bw);
3701 	btcoexist->btc_get(btcoexist,
3702 		BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3703 	btcoexist->btc_get(btcoexist,
3704 		BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifi_traffic_dir);
3705 	seq_printf(m, "\n %-35s = %s / %s/ %s ", "Wifi status",
3706 		   (wifi_under_5g ? "5G" : "2.4G"),
3707 		   ((BTC_WIFI_BW_LEGACY == wifi_bw) ? "Legacy" :
3708 		    (((BTC_WIFI_BW_HT40 == wifi_bw) ? "HT40" : "HT20"))),
3709 		   ((!wifi_busy) ? "idle" :
3710 		    ((BTC_WIFI_TRAFFIC_TX == wifi_traffic_dir) ?
3711 		     "uplink" : "downlink")));
3712 
3713 	if (stack_info->profile_notified) {
3714 		seq_printf(m, "\n %-35s = %d / %d / %d / %d",
3715 			   "SCO/HID/PAN/A2DP",
3716 			   stack_info->sco_exist, stack_info->hid_exist,
3717 			   stack_info->pan_exist, stack_info->a2dp_exist);
3718 
3719 		btcoexist->btc_disp_dbg_msg(btcoexist,
3720 					    BTC_DBG_DISP_BT_LINK_INFO,
3721 					    m);
3722 	}
3723 
3724 	bt_info_ext = coex_sta->bt_info_ext;
3725 	seq_printf(m, "\n %-35s = %s", "BT Info A2DP rate",
3726 		   (bt_info_ext&BIT0) ? "Basic rate" : "EDR rate");
3727 
3728 	for (i = 0; i < BT_INFO_SRC_8821A_2ANT_MAX; i++) {
3729 		if (coex_sta->bt_info_c2h_cnt[i]) {
3730 			seq_printf(m, "\n %-35s = %7ph(%d)",
3731 				   glbt_info_src_8821a_2ant[i],
3732 				   coex_sta->bt_info_c2h[i],
3733 				   coex_sta->bt_info_c2h_cnt[i]);
3734 		}
3735 	}
3736 
3737 	seq_printf(m, "\n %-35s = %s/%s",
3738 		   "PS state, IPS/LPS",
3739 		   ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
3740 		   ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")));
3741 	btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);
3742 
3743 	/* Sw mechanism*/
3744 	seq_printf(m, "\n %-35s",
3745 		   "============[Sw mechanism]============");
3746 	seq_printf(m, "\n %-35s = %d/ %d/ %d(0x%x) ",
3747 		   "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]",
3748 		   coex_dm->cur_agc_table_en, coex_dm->cur_adc_back_off,
3749 		   coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl);
3750 
3751 	/* Fw mechanism*/
3752 	seq_printf(m, "\n %-35s",
3753 		   "============[Fw mechanism]============");
3754 
3755 	if (!btcoexist->manual_control) {
3756 		ps_tdma_case = coex_dm->cur_ps_tdma;
3757 		seq_printf(m, "\n %-35s = %5ph case-%d",
3758 			   "PS TDMA",
3759 			   coex_dm->ps_tdma_para, ps_tdma_case);
3760 
3761 		seq_printf(m, "\n %-35s = %d/ %d ", "DecBtPwr/ IgnWlanAct",
3762 			   coex_dm->cur_dec_bt_pwr_lvl,
3763 			   coex_dm->cur_ignore_wlan_act);
3764 	}
3765 
3766 	/* Hw setting*/
3767 	seq_printf(m, "\n %-35s", "============[Hw setting]============");
3768 
3769 	seq_printf(m, "\n %-35s = 0x%x", "RF-A, 0x1e initVal",
3770 		   coex_dm->bt_rf0x1e_backup);
3771 
3772 	u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
3773 	u1tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
3774 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x ",
3775 		   "0x778 (W_Act)/ 0x6cc (CoTab Sel)",
3776 		   u1tmp[0], u1tmp[1]);
3777 
3778 	u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x8db);
3779 	u1tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xc5b);
3780 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3781 		   "0x8db(ADC)/0xc5b[29:25](DAC)",
3782 		   ((u1tmp[0] & 0x60) >> 5), ((u1tmp[1] & 0x3e) >> 1));
3783 
3784 	u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
3785 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3786 		   "0xcb4[7:0](ctrl)/ 0xcb4[29:28](val)",
3787 		   u4tmp[0] & 0xff, ((u4tmp[0] & 0x30000000) >> 28));
3788 
3789 	u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40);
3790 	u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
3791 	u4tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x974);
3792 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
3793 		   "0x40/ 0x4c[24:23]/ 0x974",
3794 		   u1tmp[0], ((u4tmp[0] & 0x01800000) >> 23), u4tmp[1]);
3795 
3796 	u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
3797 	u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
3798 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3799 		   "0x550(bcn ctrl)/0x522",
3800 		   u4tmp[0], u1tmp[0]);
3801 
3802 	u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
3803 	u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa0a);
3804 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3805 		   "0xc50(DIG)/0xa0a(CCK-TH)",
3806 		   u4tmp[0], u1tmp[0]);
3807 
3808 	u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xf48);
3809 	u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);
3810 	u1tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
3811 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3812 		   "OFDM-FA/ CCK-FA",
3813 		   u4tmp[0], (u1tmp[0] << 8) + u1tmp[1]);
3814 
3815 	u4tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
3816 	u4tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
3817 	u4tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
3818 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
3819 		   "0x6c0/0x6c4/0x6c8",
3820 		   u4tmp[0], u4tmp[1], u4tmp[2]);
3821 
3822 	seq_printf(m, "\n %-35s = %d/ %d",
3823 		   "0x770 (hi-pri Rx/Tx)",
3824 		   coex_sta->high_priority_rx, coex_sta->high_priority_tx);
3825 	seq_printf(m, "\n %-35s = %d/ %d",
3826 		   "0x774(low-pri Rx/Tx)",
3827 		   coex_sta->low_priority_rx, coex_sta->low_priority_tx);
3828 
3829 	/* Tx mgnt queue hang or not, 0x41b should = 0xf, ex: 0xd ==>hang*/
3830 	u1tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x41b);
3831 	seq_printf(m, "\n %-35s = 0x%x",
3832 		   "0x41b (mgntQ hang chk == 0xf)",
3833 		   u1tmp[0]);
3834 
3835 	btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);
3836 }
3837 
ex_btc8821a2ant_ips_notify(struct btc_coexist * btcoexist,u8 type)3838 void ex_btc8821a2ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
3839 {
3840 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3841 
3842 	if (BTC_IPS_ENTER == type) {
3843 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3844 			"[BTCoex], IPS ENTER notify\n");
3845 		coex_sta->under_ips = true;
3846 		btc8821a2ant_wifi_off_hw_cfg(btcoexist);
3847 		btc8821a2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
3848 		btc8821a2ant_coex_all_off(btcoexist);
3849 	} else if (BTC_IPS_LEAVE == type) {
3850 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3851 			"[BTCoex], IPS LEAVE notify\n");
3852 		coex_sta->under_ips = false;
3853 		ex_btc8821a2ant_init_hwconfig(btcoexist);
3854 		btc8821a2ant_init_coex_dm(btcoexist);
3855 		btc8821a2ant_query_bt_info(btcoexist);
3856 	}
3857 }
3858 
ex_btc8821a2ant_lps_notify(struct btc_coexist * btcoexist,u8 type)3859 void ex_btc8821a2ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
3860 {
3861 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3862 
3863 	if (BTC_LPS_ENABLE == type) {
3864 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3865 			"[BTCoex], LPS ENABLE notify\n");
3866 		coex_sta->under_lps = true;
3867 	} else if (BTC_LPS_DISABLE == type) {
3868 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3869 			"[BTCoex], LPS DISABLE notify\n");
3870 		coex_sta->under_lps = false;
3871 	}
3872 }
3873 
ex_btc8821a2ant_scan_notify(struct btc_coexist * btcoexist,u8 type)3874 void ex_btc8821a2ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
3875 {
3876 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3877 
3878 	if (BTC_SCAN_START == type) {
3879 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3880 			"[BTCoex], SCAN START notify\n");
3881 	} else if (BTC_SCAN_FINISH == type) {
3882 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3883 			"[BTCoex], SCAN FINISH notify\n");
3884 	}
3885 }
3886 
ex_btc8821a2ant_connect_notify(struct btc_coexist * btcoexist,u8 type)3887 void ex_btc8821a2ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
3888 {
3889 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3890 
3891 	if (BTC_ASSOCIATE_START == type) {
3892 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3893 			"[BTCoex], CONNECT START notify\n");
3894 	} else if (BTC_ASSOCIATE_FINISH == type) {
3895 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3896 			"[BTCoex], CONNECT FINISH notify\n");
3897 	}
3898 }
3899 
ex_btc8821a2ant_media_status_notify(struct btc_coexist * btcoexist,u8 type)3900 void ex_btc8821a2ant_media_status_notify(struct btc_coexist *btcoexist,
3901 					 u8 type)
3902 {
3903 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3904 	u8 h2c_parameter[3] = {0};
3905 	u32 wifi_bw;
3906 	u8 wifi_central_chnl;
3907 	u8 ap_num = 0;
3908 
3909 	if (BTC_MEDIA_CONNECT == type) {
3910 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3911 			"[BTCoex], MEDIA connect notify\n");
3912 	} else {
3913 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3914 			"[BTCoex], MEDIA disconnect notify\n");
3915 	}
3916 
3917 	/* only 2.4G we need to inform bt the chnl mask */
3918 	btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
3919 			   &wifi_central_chnl);
3920 	if ((BTC_MEDIA_CONNECT == type) &&
3921 	    (wifi_central_chnl <= 14)) {
3922 		h2c_parameter[0] = 0x1;
3923 		h2c_parameter[1] = wifi_central_chnl;
3924 		btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3925 		if (wifi_bw == BTC_WIFI_BW_HT40) {
3926 			h2c_parameter[2] = 0x30;
3927 		} else {
3928 			h2c_parameter[2] = 0x20;
3929 			if (ap_num < 10)
3930 				h2c_parameter[2] = 0x30;
3931 			else
3932 				h2c_parameter[2] = 0x20;
3933 		}
3934 	}
3935 
3936 	coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
3937 	coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
3938 	coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
3939 
3940 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3941 		"[BTCoex], FW write 0x66 = 0x%x\n",
3942 		h2c_parameter[0] << 16 |
3943 		h2c_parameter[1] << 8 |
3944 		h2c_parameter[2]);
3945 
3946 	btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
3947 }
3948 
ex_btc8821a2ant_special_packet_notify(struct btc_coexist * btcoexist,u8 type)3949 void ex_btc8821a2ant_special_packet_notify(struct btc_coexist *btcoexist,
3950 					   u8 type)
3951 {
3952 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3953 
3954 	if (type == BTC_PACKET_DHCP) {
3955 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3956 			"[BTCoex], DHCP Packet notify\n");
3957 	}
3958 }
3959 
ex_btc8821a2ant_bt_info_notify(struct btc_coexist * btcoexist,u8 * tmp_buf,u8 length)3960 void ex_btc8821a2ant_bt_info_notify(struct btc_coexist *btcoexist,
3961 				    u8 *tmp_buf, u8 length)
3962 {
3963 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3964 	u8 bt_info = 0;
3965 	u8 i, rsp_source = 0;
3966 	bool bt_busy = false, limited_dig = false;
3967 	bool wifi_connected = false, wifi_under_5g = false;
3968 
3969 	coex_sta->c2h_bt_info_req_sent = false;
3970 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3971 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3972 			   &wifi_connected);
3973 
3974 	rsp_source = tmp_buf[0] & 0xf;
3975 	if (rsp_source >= BT_INFO_SRC_8821A_2ANT_MAX)
3976 		rsp_source = BT_INFO_SRC_8821A_2ANT_WIFI_FW;
3977 	coex_sta->bt_info_c2h_cnt[rsp_source]++;
3978 
3979 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3980 		"[BTCoex], Bt info[%d], length = %d, hex data = [",
3981 		rsp_source, length);
3982 	for (i = 0; i < length; i++) {
3983 		coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
3984 		if (i == 1)
3985 			bt_info = tmp_buf[i];
3986 		if (i == length - 1) {
3987 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3988 				"0x%02x]\n", tmp_buf[i]);
3989 		} else {
3990 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3991 				"0x%02x, ", tmp_buf[i]);
3992 		}
3993 	}
3994 
3995 	if (btcoexist->manual_control) {
3996 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3997 			"[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n");
3998 		return;
3999 	}
4000 
4001 	if (BT_INFO_SRC_8821A_2ANT_WIFI_FW != rsp_source) {
4002 		/* [3:0] */
4003 		coex_sta->bt_retry_cnt =
4004 			coex_sta->bt_info_c2h[rsp_source][2]&0xf;
4005 
4006 		coex_sta->bt_rssi =
4007 			coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;
4008 
4009 		coex_sta->bt_info_ext = coex_sta->bt_info_c2h[rsp_source][4];
4010 
4011 		coex_sta->bt_tx_rx_mask =
4012 			(coex_sta->bt_info_c2h[rsp_source][2] & 0x40);
4013 		btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK,
4014 				   &coex_sta->bt_tx_rx_mask);
4015 		if (coex_sta->bt_tx_rx_mask) {
4016 			/* BT into is responded by BT FW and BT RF REG 0x3C !=
4017 			 * 0x01 => Need to switch BT TRx Mask
4018 			 */
4019 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4020 				"[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\n");
4021 			btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
4022 						  0x3c, 0x01);
4023 		}
4024 
4025 		/* Here we need to resend some wifi info to BT
4026 		 * because bt is reset and loss of the info
4027 		 */
4028 		if ((coex_sta->bt_info_ext & BIT1)) {
4029 			btcoexist->btc_get(btcoexist,
4030 				BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
4031 			if (wifi_connected) {
4032 				ex_btc8821a2ant_media_status_notify(btcoexist,
4033 					BTC_MEDIA_CONNECT);
4034 			} else {
4035 				ex_btc8821a2ant_media_status_notify(btcoexist,
4036 					BTC_MEDIA_DISCONNECT);
4037 			}
4038 
4039 		}
4040 
4041 		if (!btcoexist->manual_control && !wifi_under_5g) {
4042 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4043 				"[BTCoex], BT ext info = 0x%x!!\n",
4044 				coex_sta->bt_info_ext);
4045 			if ((coex_sta->bt_info_ext & BIT(3))) {
4046 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4047 					"[BTCoex], BT ext info bit3=1, wifi_connected=%d\n",
4048 					wifi_connected);
4049 				if (wifi_connected) {
4050 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
4051 						DBG_LOUD,
4052 						"[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
4053 					btc8821a2ant_ignore_wlan_act(btcoexist,
4054 								     FORCE_EXEC,
4055 								     false);
4056 				}
4057 			} else {
4058 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4059 					"[BTCoex], BT ext info bit3=0, wifi_connected=%d\n",
4060 					wifi_connected);
4061 				/* BT already NOT ignore Wlan active, do nothing
4062 				 * here.
4063 				 */
4064 				if (!wifi_connected) {
4065 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
4066 						DBG_LOUD,
4067 						"[BTCoex], BT ext info bit3 check, set BT to ignore Wlan active!!\n");
4068 					btc8821a2ant_ignore_wlan_act(
4069 						btcoexist, FORCE_EXEC, true);
4070 				}
4071 			}
4072 		}
4073 	}
4074 
4075 	/* check BIT2 first ==> check if bt is under inquiry or page scan*/
4076 	if (bt_info & BT_INFO_8821A_2ANT_B_INQ_PAGE) {
4077 		coex_sta->c2h_bt_inquiry_page = true;
4078 	} else {
4079 		coex_sta->c2h_bt_inquiry_page = false;
4080 	}
4081 	/* set link exist status */
4082 	if (!(bt_info & BT_INFO_8821A_2ANT_B_CONNECTION)) {
4083 		coex_sta->bt_link_exist = false;
4084 		coex_sta->pan_exist = false;
4085 		coex_sta->a2dp_exist = false;
4086 		coex_sta->hid_exist = false;
4087 		coex_sta->sco_exist = false;
4088 	} else { /* connection exists */
4089 		coex_sta->bt_link_exist = true;
4090 		if (bt_info & BT_INFO_8821A_2ANT_B_FTP)
4091 			coex_sta->pan_exist = true;
4092 		else
4093 			coex_sta->pan_exist = false;
4094 		if (bt_info & BT_INFO_8821A_2ANT_B_A2DP)
4095 			coex_sta->a2dp_exist = true;
4096 		else
4097 			coex_sta->a2dp_exist = false;
4098 		if (bt_info & BT_INFO_8821A_2ANT_B_HID)
4099 			coex_sta->hid_exist = true;
4100 		else
4101 			coex_sta->hid_exist = false;
4102 		if (bt_info & BT_INFO_8821A_2ANT_B_SCO_ESCO)
4103 			coex_sta->sco_exist = true;
4104 		else
4105 			coex_sta->sco_exist = false;
4106 
4107 		if ((!coex_sta->hid_exist) &&
4108 		    (!coex_sta->c2h_bt_inquiry_page) &&
4109 		    (!coex_sta->sco_exist)) {
4110 			if (coex_sta->high_priority_tx +
4111 				    coex_sta->high_priority_rx >= 160)
4112 				coex_sta->hid_exist = true;
4113 		}
4114 	}
4115 
4116 	btc8821a2ant_update_bt_link_info(btcoexist);
4117 
4118 	if (!(bt_info & BT_INFO_8821A_2ANT_B_CONNECTION)) {
4119 		coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_IDLE;
4120 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4121 			"[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
4122 	} else if (bt_info == BT_INFO_8821A_2ANT_B_CONNECTION) {
4123 		/* connection exists but no busy */
4124 		coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_CON_IDLE;
4125 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4126 			"[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
4127 	} else if ((bt_info & BT_INFO_8821A_2ANT_B_SCO_ESCO) ||
4128 		   (bt_info & BT_INFO_8821A_2ANT_B_SCO_BUSY)) {
4129 		coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_SCO_BUSY;
4130 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4131 			"[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
4132 	} else if (bt_info & BT_INFO_8821A_2ANT_B_ACL_BUSY) {
4133 		coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_ACL_BUSY;
4134 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4135 			"[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
4136 	} else {
4137 		coex_dm->bt_status = BT_8821A_2ANT_BT_STATUS_MAX;
4138 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4139 			"[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
4140 	}
4141 
4142 	if ((coex_dm->bt_status == BT_8821A_2ANT_BT_STATUS_ACL_BUSY) ||
4143 	    (coex_dm->bt_status == BT_8821A_2ANT_BT_STATUS_SCO_BUSY) ||
4144 	    (coex_dm->bt_status == BT_8821A_2ANT_BT_STATUS_ACL_SCO_BUSY)) {
4145 		bt_busy = true;
4146 		limited_dig = true;
4147 	} else {
4148 		bt_busy = false;
4149 		limited_dig = false;
4150 	}
4151 
4152 	btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
4153 
4154 	coex_dm->limited_dig = limited_dig;
4155 	btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig);
4156 
4157 	btc8821a2ant_run_coexist_mechanism(btcoexist);
4158 }
4159 
ex_btc8821a2ant_halt_notify(struct btc_coexist * btcoexist)4160 void ex_btc8821a2ant_halt_notify(struct btc_coexist *btcoexist)
4161 {
4162 	struct rtl_priv *rtlpriv = btcoexist->adapter;
4163 
4164 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4165 		"[BTCoex], Halt notify\n");
4166 
4167 	btc8821a2ant_wifi_off_hw_cfg(btcoexist);
4168 	btc8821a2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
4169 	ex_btc8821a2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
4170 }
4171 
ex_btc8821a2ant_pnp_notify(struct btc_coexist * btcoexist,u8 pnp_state)4172 void ex_btc8821a2ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
4173 {
4174 	struct rtl_priv *rtlpriv = btcoexist->adapter;
4175 
4176 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Pnp notify\n");
4177 
4178 	if (pnp_state == BTC_WIFI_PNP_SLEEP) {
4179 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4180 			"[BTCoex], Pnp notify to SLEEP\n");
4181 	} else if (pnp_state == BTC_WIFI_PNP_WAKE_UP) {
4182 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4183 			"[BTCoex], Pnp notify to WAKE UP\n");
4184 		ex_btc8821a2ant_init_hwconfig(btcoexist);
4185 		btc8821a2ant_init_coex_dm(btcoexist);
4186 		btc8821a2ant_query_bt_info(btcoexist);
4187 	}
4188 }
4189 
ex_btc8821a2ant_periodical(struct btc_coexist * btcoexist)4190 void ex_btc8821a2ant_periodical(struct btc_coexist *btcoexist)
4191 {
4192 	struct rtl_priv *rtlpriv = btcoexist->adapter;
4193 
4194 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4195 		"[BTCoex], ==========================Periodical===========================\n");
4196 
4197 	if (coex_sta->dis_ver_info_cnt <= 5) {
4198 		coex_sta->dis_ver_info_cnt += 1;
4199 		if (coex_sta->dis_ver_info_cnt == 3) {
4200 			/* Antenna config to set 0x765 = 0x0 (GNT_BT control by
4201 			 * PTA) after initial
4202 			 */
4203 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4204 				"[BTCoex], Set GNT_BT control by PTA\n");
4205 			btc8821a2ant_set_ant_path(btcoexist,
4206 					BTC_ANT_WIFI_AT_MAIN, false, false);
4207 		}
4208 	}
4209 
4210 	if (btcoexist->auto_report_2ant) {
4211 		btc8821a2ant_query_bt_info(btcoexist);
4212 	} else {
4213 		btc8821a2ant_monitor_bt_ctr(btcoexist);
4214 		btc8821a2ant_monitor_wifi_ctr(btcoexist);
4215 
4216 		if (btc8821a2ant_is_wifi_status_changed(btcoexist) ||
4217 		    coex_dm->auto_tdma_adjust)
4218 			btc8821a2ant_run_coexist_mechanism(btcoexist);
4219 	}
4220 }
4221