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