1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2016  Realtek Corporation.
5  *
6  * Contact Information:
7  * wlanfae <wlanfae@realtek.com>
8  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
9  * Hsinchu 300, Taiwan.
10  *
11  * Larry Finger <Larry.Finger@lwfinger.net>
12  *
13  *****************************************************************************/
14 /* ************************************************************
15  * Description:
16  *
17  * This file is for RTL8822B Co-exist mechanism
18  *
19  * History
20  * 2012/11/15 Cosa first check in.
21  *
22  * *************************************************************/
23 
24 /* ************************************************************
25  * include files
26  * *************************************************************/
27 /*only for rf4ce*/
28 #include "halbt_precomp.h"
29 
30 /* ************************************************************
31  * Global variables, these are static variables
32  * *************************************************************/
33 static struct coex_dm_8822b_1ant glcoex_dm_8822b_1ant;
34 static struct coex_dm_8822b_1ant *coex_dm = &glcoex_dm_8822b_1ant;
35 static struct coex_sta_8822b_1ant glcoex_sta_8822b_1ant;
36 static struct coex_sta_8822b_1ant *coex_sta = &glcoex_sta_8822b_1ant;
37 static struct psdscan_sta_8822b_1ant gl_psd_scan_8822b_1ant;
38 static struct psdscan_sta_8822b_1ant *psd_scan = &gl_psd_scan_8822b_1ant;
39 static struct rfe_type_8822b_1ant gl_rfe_type_8822b_1ant;
40 static struct rfe_type_8822b_1ant *rfe_type = &gl_rfe_type_8822b_1ant;
41 
42 static const char *const glbt_info_src_8822b_1ant[] = {
43 	"BT Info[wifi fw]", "BT Info[bt rsp]", "BT Info[bt auto report]",
44 };
45 
46 static u32 glcoex_ver_date_8822b_1ant = 20170327;
47 static u32 glcoex_ver_8822b_1ant = 0x44;
48 static u32 glcoex_ver_btdesired_8822b_1ant = 0x42;
49 
50 /* ************************************************************
51  * local function proto type if needed
52  * ************************************************************
53  * ************************************************************
54  * local function start with halbtc8822b1ant_
55  * *************************************************************/
56 
halbtc8822b1ant_wifi_rssi_state(struct btc_coexist * btcoexist,u8 index,u8 level_num,u8 rssi_thresh,u8 rssi_thresh1)57 static u8 halbtc8822b1ant_wifi_rssi_state(struct btc_coexist *btcoexist,
58 					  u8 index, u8 level_num,
59 					  u8 rssi_thresh, u8 rssi_thresh1)
60 {
61 	struct rtl_priv *rtlpriv = btcoexist->adapter;
62 	s32 wifi_rssi = 0;
63 	u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
64 
65 	btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
66 
67 	if (level_num == 2) {
68 		if ((coex_sta->pre_wifi_rssi_state[index] ==
69 		     BTC_RSSI_STATE_LOW) ||
70 		    (coex_sta->pre_wifi_rssi_state[index] ==
71 		     BTC_RSSI_STATE_STAY_LOW)) {
72 			if (wifi_rssi >=
73 			    (rssi_thresh + BTC_RSSI_COEX_THRESH_TOL_8822B_1ANT))
74 				wifi_rssi_state = BTC_RSSI_STATE_HIGH;
75 			else
76 				wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
77 		} else {
78 			if (wifi_rssi < rssi_thresh)
79 				wifi_rssi_state = BTC_RSSI_STATE_LOW;
80 			else
81 				wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
82 		}
83 	} else if (level_num == 3) {
84 		if (rssi_thresh > rssi_thresh1) {
85 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
86 				 "[BTCoex], wifi RSSI thresh error!!\n");
87 			return coex_sta->pre_wifi_rssi_state[index];
88 		}
89 
90 		if ((coex_sta->pre_wifi_rssi_state[index] ==
91 		     BTC_RSSI_STATE_LOW) ||
92 		    (coex_sta->pre_wifi_rssi_state[index] ==
93 		     BTC_RSSI_STATE_STAY_LOW)) {
94 			if (wifi_rssi >=
95 			    (rssi_thresh + BTC_RSSI_COEX_THRESH_TOL_8822B_1ANT))
96 				wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
97 			else
98 				wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
99 		} else if ((coex_sta->pre_wifi_rssi_state[index] ==
100 			    BTC_RSSI_STATE_MEDIUM) ||
101 			   (coex_sta->pre_wifi_rssi_state[index] ==
102 			    BTC_RSSI_STATE_STAY_MEDIUM)) {
103 			if (wifi_rssi >= (rssi_thresh1 +
104 					  BTC_RSSI_COEX_THRESH_TOL_8822B_1ANT))
105 				wifi_rssi_state = BTC_RSSI_STATE_HIGH;
106 			else if (wifi_rssi < rssi_thresh)
107 				wifi_rssi_state = BTC_RSSI_STATE_LOW;
108 			else
109 				wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
110 		} else {
111 			if (wifi_rssi < rssi_thresh1)
112 				wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
113 			else
114 				wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
115 		}
116 	}
117 
118 	coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
119 
120 	return wifi_rssi_state;
121 }
122 
halbtc8822b1ant_update_ra_mask(struct btc_coexist * btcoexist,bool force_exec,u32 dis_rate_mask)123 static void halbtc8822b1ant_update_ra_mask(struct btc_coexist *btcoexist,
124 					   bool force_exec, u32 dis_rate_mask)
125 {
126 	coex_dm->cur_ra_mask = dis_rate_mask;
127 
128 	if (force_exec || (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask))
129 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK,
130 				   &coex_dm->cur_ra_mask);
131 	coex_dm->pre_ra_mask = coex_dm->cur_ra_mask;
132 }
133 
134 static void
halbtc8822b1ant_auto_rate_fallback_retry(struct btc_coexist * btcoexist,bool force_exec,u8 type)135 halbtc8822b1ant_auto_rate_fallback_retry(struct btc_coexist *btcoexist,
136 					 bool force_exec, u8 type)
137 {
138 	bool wifi_under_b_mode = false;
139 
140 	coex_dm->cur_arfr_type = type;
141 
142 	if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {
143 		switch (coex_dm->cur_arfr_type) {
144 		case 0: /* normal mode */
145 			btcoexist->btc_write_4byte(btcoexist, 0x430,
146 						   coex_dm->backup_arfr_cnt1);
147 			btcoexist->btc_write_4byte(btcoexist, 0x434,
148 						   coex_dm->backup_arfr_cnt2);
149 			break;
150 		case 1:
151 			btcoexist->btc_get(btcoexist,
152 					   BTC_GET_BL_WIFI_UNDER_B_MODE,
153 					   &wifi_under_b_mode);
154 			if (wifi_under_b_mode) {
155 				btcoexist->btc_write_4byte(btcoexist, 0x430,
156 							   0x0);
157 				btcoexist->btc_write_4byte(btcoexist, 0x434,
158 							   0x01010101);
159 			} else {
160 				btcoexist->btc_write_4byte(btcoexist, 0x430,
161 							   0x0);
162 				btcoexist->btc_write_4byte(btcoexist, 0x434,
163 							   0x04030201);
164 			}
165 			break;
166 		default:
167 			break;
168 		}
169 	}
170 
171 	coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;
172 }
173 
halbtc8822b1ant_retry_limit(struct btc_coexist * btcoexist,bool force_exec,u8 type)174 static void halbtc8822b1ant_retry_limit(struct btc_coexist *btcoexist,
175 					bool force_exec, u8 type)
176 {
177 	coex_dm->cur_retry_limit_type = type;
178 
179 	if (force_exec ||
180 	    (coex_dm->pre_retry_limit_type != coex_dm->cur_retry_limit_type)) {
181 		switch (coex_dm->cur_retry_limit_type) {
182 		case 0: /* normal mode */
183 			btcoexist->btc_write_2byte(btcoexist, 0x42a,
184 						   coex_dm->backup_retry_limit);
185 			break;
186 		case 1: /* retry limit=8 */
187 			btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);
188 			break;
189 		default:
190 			break;
191 		}
192 	}
193 
194 	coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;
195 }
196 
halbtc8822b1ant_ampdu_max_time(struct btc_coexist * btcoexist,bool force_exec,u8 type)197 static void halbtc8822b1ant_ampdu_max_time(struct btc_coexist *btcoexist,
198 					   bool force_exec, u8 type)
199 {
200 	coex_dm->cur_ampdu_time_type = type;
201 
202 	if (force_exec ||
203 	    (coex_dm->pre_ampdu_time_type != coex_dm->cur_ampdu_time_type)) {
204 		switch (coex_dm->cur_ampdu_time_type) {
205 		case 0: /* normal mode */
206 			btcoexist->btc_write_1byte(
207 				btcoexist, 0x456,
208 				coex_dm->backup_ampdu_max_time);
209 			break;
210 		case 1: /* AMPDU timw = 0x38 * 32us */
211 			btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);
212 			break;
213 		default:
214 			break;
215 		}
216 	}
217 
218 	coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;
219 }
220 
halbtc8822b1ant_limited_tx(struct btc_coexist * btcoexist,bool force_exec,u8 ra_mask_type,u8 arfr_type,u8 retry_limit_type,u8 ampdu_time_type)221 static void halbtc8822b1ant_limited_tx(struct btc_coexist *btcoexist,
222 				       bool force_exec, u8 ra_mask_type,
223 				       u8 arfr_type, u8 retry_limit_type,
224 				       u8 ampdu_time_type)
225 {
226 	switch (ra_mask_type) {
227 	case 0: /* normal mode */
228 		halbtc8822b1ant_update_ra_mask(btcoexist, force_exec, 0x0);
229 		break;
230 	case 1: /* disable cck 1/2 */
231 		halbtc8822b1ant_update_ra_mask(btcoexist, force_exec,
232 					       0x00000003);
233 		break;
234 	case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
235 		halbtc8822b1ant_update_ra_mask(btcoexist, force_exec,
236 					       0x0001f1f7);
237 		break;
238 	default:
239 		break;
240 	}
241 
242 	halbtc8822b1ant_auto_rate_fallback_retry(btcoexist, force_exec,
243 						 arfr_type);
244 	halbtc8822b1ant_retry_limit(btcoexist, force_exec, retry_limit_type);
245 	halbtc8822b1ant_ampdu_max_time(btcoexist, force_exec, ampdu_time_type);
246 }
247 
248 /*
249  * rx agg size setting :
250  * 1:      true / don't care / don't care
251  * max: false / false / don't care
252  * 7:     false / true / 7
253  */
254 
halbtc8822b1ant_limited_rx(struct btc_coexist * btcoexist,bool force_exec,bool rej_ap_agg_pkt,bool bt_ctrl_agg_buf_size,u8 agg_buf_size)255 static void halbtc8822b1ant_limited_rx(struct btc_coexist *btcoexist,
256 				       bool force_exec, bool rej_ap_agg_pkt,
257 				       bool bt_ctrl_agg_buf_size,
258 				       u8 agg_buf_size)
259 {
260 	bool reject_rx_agg = rej_ap_agg_pkt;
261 	bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
262 	u8 rx_agg_size = agg_buf_size;
263 
264 	/* ============================================ */
265 	/*	Rx Aggregation related setting */
266 	/* ============================================ */
267 	btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
268 			   &reject_rx_agg);
269 	/* decide BT control aggregation buf size or not */
270 	btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
271 			   &bt_ctrl_rx_agg_size);
272 	/* aggregation buf size, only work when BT control Rx aggregation size*/
273 	btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
274 	/* real update aggregation setting */
275 	btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
276 }
277 
halbtc8822b1ant_query_bt_info(struct btc_coexist * btcoexist)278 static void halbtc8822b1ant_query_bt_info(struct btc_coexist *btcoexist)
279 {
280 	struct rtl_priv *rtlpriv = btcoexist->adapter;
281 	u8 h2c_parameter[1] = {0};
282 
283 	if (coex_sta->bt_disabled) {
284 		RT_TRACE(
285 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
286 			"[BTCoex], No query BT info because BT is disabled!\n");
287 		return;
288 	}
289 
290 	h2c_parameter[0] |= BIT(0); /* trigger */
291 
292 	btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
293 
294 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
295 		 "[BTCoex], WL query BT info!!\n");
296 }
297 
halbtc8822b1ant_monitor_bt_ctr(struct btc_coexist * btcoexist)298 static void halbtc8822b1ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
299 {
300 	struct rtl_priv *rtlpriv = btcoexist->adapter;
301 	u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
302 	u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
303 	static u8 num_of_bt_counter_chk, cnt_slave, cnt_autoslot_hang;
304 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
305 
306 	reg_hp_txrx = 0x770;
307 	reg_lp_txrx = 0x774;
308 
309 	u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
310 	reg_hp_tx = u32tmp & MASKLWORD;
311 	reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
312 
313 	u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
314 	reg_lp_tx = u32tmp & MASKLWORD;
315 	reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
316 
317 	coex_sta->high_priority_tx = reg_hp_tx;
318 	coex_sta->high_priority_rx = reg_hp_rx;
319 	coex_sta->low_priority_tx = reg_lp_tx;
320 	coex_sta->low_priority_rx = reg_lp_rx;
321 
322 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
323 		 "[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n",
324 		 reg_hp_rx, reg_hp_tx, reg_lp_rx, reg_lp_tx);
325 
326 	/* reset counter */
327 	btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
328 
329 	if ((coex_sta->low_priority_tx > 1150) &&
330 	    (!coex_sta->c2h_bt_inquiry_page))
331 		coex_sta->pop_event_cnt++;
332 
333 	if ((coex_sta->low_priority_rx >= 1150) &&
334 	    (coex_sta->low_priority_rx >= coex_sta->low_priority_tx) &&
335 	    (!coex_sta->under_ips) && (!coex_sta->c2h_bt_inquiry_page) &&
336 	    (coex_sta->bt_link_exist)) {
337 		if (cnt_slave >= 3) {
338 			bt_link_info->slave_role = true;
339 			cnt_slave = 3;
340 		} else {
341 			cnt_slave++;
342 		}
343 	} else {
344 		if (cnt_slave == 0) {
345 			bt_link_info->slave_role = false;
346 			cnt_slave = 0;
347 		} else {
348 			cnt_slave--;
349 		}
350 	}
351 
352 	if (coex_sta->is_tdma_btautoslot) {
353 		if ((coex_sta->low_priority_tx >= 1300) &&
354 		    (coex_sta->low_priority_rx <= 150)) {
355 			if (cnt_autoslot_hang >= 2) {
356 				coex_sta->is_tdma_btautoslot_hang = true;
357 				cnt_autoslot_hang = 2;
358 			} else {
359 				cnt_autoslot_hang++;
360 			}
361 		} else {
362 			if (cnt_autoslot_hang == 0) {
363 				coex_sta->is_tdma_btautoslot_hang = false;
364 				cnt_autoslot_hang = 0;
365 			} else {
366 				cnt_autoslot_hang--;
367 			}
368 		}
369 	}
370 
371 	if (bt_link_info->hid_only) {
372 		if (coex_sta->low_priority_rx > 50)
373 			coex_sta->is_hid_low_pri_tx_overhead = true;
374 		else
375 			coex_sta->is_hid_low_pri_tx_overhead = false;
376 	}
377 
378 	if ((coex_sta->high_priority_tx == 0) &&
379 	    (coex_sta->high_priority_rx == 0) &&
380 	    (coex_sta->low_priority_tx == 0) &&
381 	    (coex_sta->low_priority_rx == 0)) {
382 		num_of_bt_counter_chk++;
383 
384 		if (num_of_bt_counter_chk >= 3) {
385 			halbtc8822b1ant_query_bt_info(btcoexist);
386 			num_of_bt_counter_chk = 0;
387 		}
388 	}
389 }
390 
halbtc8822b1ant_monitor_wifi_ctr(struct btc_coexist * btcoexist)391 static void halbtc8822b1ant_monitor_wifi_ctr(struct btc_coexist *btcoexist)
392 {
393 	s32 wifi_rssi = 0;
394 	bool wifi_busy = false, wifi_under_b_mode = false, wifi_scan = false;
395 	static u8 cck_lock_counter, wl_noisy_count0, wl_noisy_count1 = 3,
396 						     wl_noisy_count2;
397 	u32 total_cnt, cck_cnt;
398 
399 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
400 	btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
401 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
402 			   &wifi_under_b_mode);
403 
404 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &wifi_scan);
405 
406 	coex_sta->crc_ok_cck = btcoexist->btc_phydm_query_phy_counter(
407 		btcoexist, "PHYDM_INFO_CRC32_OK_CCK");
408 	coex_sta->crc_ok_11g = btcoexist->btc_phydm_query_phy_counter(
409 		btcoexist, "PHYDM_INFO_CRC32_OK_LEGACY");
410 	coex_sta->crc_ok_11n = btcoexist->btc_phydm_query_phy_counter(
411 		btcoexist, "PHYDM_INFO_CRC32_OK_HT");
412 	coex_sta->crc_ok_11n_vht = btcoexist->btc_phydm_query_phy_counter(
413 		btcoexist, "PHYDM_INFO_CRC32_OK_VHT");
414 
415 	coex_sta->crc_err_cck = btcoexist->btc_phydm_query_phy_counter(
416 		btcoexist, "PHYDM_INFO_CRC32_ERROR_CCK");
417 	coex_sta->crc_err_11g = btcoexist->btc_phydm_query_phy_counter(
418 		btcoexist, "PHYDM_INFO_CRC32_ERROR_LEGACY");
419 	coex_sta->crc_err_11n = btcoexist->btc_phydm_query_phy_counter(
420 		btcoexist, "PHYDM_INFO_CRC32_ERROR_HT");
421 	coex_sta->crc_err_11n_vht = btcoexist->btc_phydm_query_phy_counter(
422 		btcoexist, "PHYDM_INFO_CRC32_ERROR_VHT");
423 
424 	cck_cnt = coex_sta->crc_ok_cck + coex_sta->crc_err_cck;
425 
426 	if (cck_cnt > 250) {
427 		if (wl_noisy_count2 < 3)
428 			wl_noisy_count2++;
429 
430 		if (wl_noisy_count2 == 3) {
431 			wl_noisy_count0 = 0;
432 			wl_noisy_count1 = 0;
433 		}
434 
435 	} else if (cck_cnt < 50) {
436 		if (wl_noisy_count0 < 3)
437 			wl_noisy_count0++;
438 
439 		if (wl_noisy_count0 == 3) {
440 			wl_noisy_count1 = 0;
441 			wl_noisy_count2 = 0;
442 		}
443 
444 	} else {
445 		if (wl_noisy_count1 < 3)
446 			wl_noisy_count1++;
447 
448 		if (wl_noisy_count1 == 3) {
449 			wl_noisy_count0 = 0;
450 			wl_noisy_count2 = 0;
451 		}
452 	}
453 
454 	if (wl_noisy_count2 == 3)
455 		coex_sta->wl_noisy_level = 2;
456 	else if (wl_noisy_count1 == 3)
457 		coex_sta->wl_noisy_level = 1;
458 	else
459 		coex_sta->wl_noisy_level = 0;
460 
461 	if ((wifi_busy) && (wifi_rssi >= 30) && (!wifi_under_b_mode)) {
462 		total_cnt = coex_sta->crc_ok_cck + coex_sta->crc_ok_11g +
463 			    coex_sta->crc_ok_11n + coex_sta->crc_ok_11n_vht;
464 
465 		if ((coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_ACL_BUSY) ||
466 		    (coex_dm->bt_status ==
467 		     BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY) ||
468 		    (coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_SCO_BUSY)) {
469 			if (coex_sta->crc_ok_cck >
470 			    (total_cnt - coex_sta->crc_ok_cck)) {
471 				if (cck_lock_counter < 3)
472 					cck_lock_counter++;
473 			} else {
474 				if (cck_lock_counter > 0)
475 					cck_lock_counter--;
476 			}
477 
478 		} else {
479 			if (cck_lock_counter > 0)
480 				cck_lock_counter--;
481 		}
482 	} else {
483 		if (cck_lock_counter > 0)
484 			cck_lock_counter--;
485 	}
486 
487 	if (!coex_sta->pre_ccklock) {
488 		if (cck_lock_counter >= 3)
489 			coex_sta->cck_lock = true;
490 		else
491 			coex_sta->cck_lock = false;
492 	} else {
493 		if (cck_lock_counter == 0)
494 			coex_sta->cck_lock = false;
495 		else
496 			coex_sta->cck_lock = true;
497 	}
498 
499 	if (coex_sta->cck_lock)
500 		coex_sta->cck_ever_lock = true;
501 
502 	coex_sta->pre_ccklock = coex_sta->cck_lock;
503 }
504 
505 static bool
halbtc8822b1ant_is_wifi_status_changed(struct btc_coexist * btcoexist)506 halbtc8822b1ant_is_wifi_status_changed(struct btc_coexist *btcoexist)
507 {
508 	struct rtl_priv *rtlpriv = btcoexist->adapter;
509 	static bool pre_wifi_busy, pre_under_4way, pre_bt_hs_on,
510 		pre_rf4ce_enabled, pre_bt_off, pre_bt_slave,
511 		pre_hid_low_pri_tx_overhead, pre_wifi_under_lps,
512 		pre_bt_setup_link;
513 	static u8 pre_hid_busy_num, pre_wl_noisy_level;
514 	bool wifi_busy = false, under_4way = false, bt_hs_on = false,
515 	     rf4ce_enabled = false;
516 	bool wifi_connected = false;
517 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
518 
519 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
520 			   &wifi_connected);
521 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
522 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
523 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
524 			   &under_4way);
525 
526 	if (coex_sta->bt_disabled != pre_bt_off) {
527 		pre_bt_off = coex_sta->bt_disabled;
528 
529 		if (coex_sta->bt_disabled)
530 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
531 				 "[BTCoex], BT is disabled !!\n");
532 		else
533 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
534 				 "[BTCoex], BT is enabled !!\n");
535 
536 		coex_sta->bt_coex_supported_feature = 0;
537 		coex_sta->bt_coex_supported_version = 0;
538 		return true;
539 	}
540 	btcoexist->btc_get(btcoexist, BTC_GET_BL_RF4CE_CONNECTED,
541 			   &rf4ce_enabled);
542 
543 	if (rf4ce_enabled != pre_rf4ce_enabled) {
544 		pre_rf4ce_enabled = rf4ce_enabled;
545 
546 		if (rf4ce_enabled)
547 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
548 				 "[BTCoex], rf4ce is enabled !!\n");
549 		else
550 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
551 				 "[BTCoex], rf4ce is disabled !!\n");
552 
553 		return true;
554 	}
555 
556 	if (wifi_connected) {
557 		if (wifi_busy != pre_wifi_busy) {
558 			pre_wifi_busy = wifi_busy;
559 			return true;
560 		}
561 		if (under_4way != pre_under_4way) {
562 			pre_under_4way = under_4way;
563 			return true;
564 		}
565 		if (bt_hs_on != pre_bt_hs_on) {
566 			pre_bt_hs_on = bt_hs_on;
567 			return true;
568 		}
569 		if (coex_sta->wl_noisy_level != pre_wl_noisy_level) {
570 			pre_wl_noisy_level = coex_sta->wl_noisy_level;
571 			return true;
572 		}
573 		if (coex_sta->under_lps != pre_wifi_under_lps) {
574 			pre_wifi_under_lps = coex_sta->under_lps;
575 			if (coex_sta->under_lps)
576 				return true;
577 		}
578 	}
579 
580 	if (!coex_sta->bt_disabled) {
581 		if (coex_sta->hid_busy_num != pre_hid_busy_num) {
582 			pre_hid_busy_num = coex_sta->hid_busy_num;
583 			return true;
584 		}
585 
586 		if (bt_link_info->slave_role != pre_bt_slave) {
587 			pre_bt_slave = bt_link_info->slave_role;
588 			return true;
589 		}
590 
591 		if (pre_hid_low_pri_tx_overhead !=
592 		    coex_sta->is_hid_low_pri_tx_overhead) {
593 			pre_hid_low_pri_tx_overhead =
594 				coex_sta->is_hid_low_pri_tx_overhead;
595 			return true;
596 		}
597 
598 		if (pre_bt_setup_link != coex_sta->is_setup_link) {
599 			pre_bt_setup_link = coex_sta->is_setup_link;
600 			return true;
601 		}
602 	}
603 
604 	return false;
605 }
606 
halbtc8822b1ant_update_bt_link_info(struct btc_coexist * btcoexist)607 static void halbtc8822b1ant_update_bt_link_info(struct btc_coexist *btcoexist)
608 {
609 	struct rtl_priv *rtlpriv = btcoexist->adapter;
610 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
611 	bool bt_hs_on = false;
612 	bool bt_busy = false;
613 
614 	coex_sta->num_of_profile = 0;
615 
616 	/* set link exist status */
617 	if (!(coex_sta->bt_info & BT_INFO_8822B_1ANT_B_CONNECTION)) {
618 		coex_sta->bt_link_exist = false;
619 		coex_sta->pan_exist = false;
620 		coex_sta->a2dp_exist = false;
621 		coex_sta->hid_exist = false;
622 		coex_sta->sco_exist = false;
623 	} else { /* connection exists */
624 		coex_sta->bt_link_exist = true;
625 		if (coex_sta->bt_info & BT_INFO_8822B_1ANT_B_FTP) {
626 			coex_sta->pan_exist = true;
627 			coex_sta->num_of_profile++;
628 		} else {
629 			coex_sta->pan_exist = false;
630 		}
631 
632 		if (coex_sta->bt_info & BT_INFO_8822B_1ANT_B_A2DP) {
633 			coex_sta->a2dp_exist = true;
634 			coex_sta->num_of_profile++;
635 		} else {
636 			coex_sta->a2dp_exist = false;
637 		}
638 
639 		if (coex_sta->bt_info & BT_INFO_8822B_1ANT_B_HID) {
640 			coex_sta->hid_exist = true;
641 			coex_sta->num_of_profile++;
642 		} else {
643 			coex_sta->hid_exist = false;
644 		}
645 
646 		if (coex_sta->bt_info & BT_INFO_8822B_1ANT_B_SCO_ESCO) {
647 			coex_sta->sco_exist = true;
648 			coex_sta->num_of_profile++;
649 		} else {
650 			coex_sta->sco_exist = false;
651 		}
652 	}
653 
654 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
655 
656 	bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
657 	bt_link_info->sco_exist = coex_sta->sco_exist;
658 	bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
659 	bt_link_info->pan_exist = coex_sta->pan_exist;
660 	bt_link_info->hid_exist = coex_sta->hid_exist;
661 	bt_link_info->acl_busy = coex_sta->acl_busy;
662 
663 	/* work around for HS mode. */
664 	if (bt_hs_on) {
665 		bt_link_info->pan_exist = true;
666 		bt_link_info->bt_link_exist = true;
667 	}
668 
669 	/* check if Sco only */
670 	if (bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
671 	    !bt_link_info->pan_exist && !bt_link_info->hid_exist)
672 		bt_link_info->sco_only = true;
673 	else
674 		bt_link_info->sco_only = false;
675 
676 	/* check if A2dp only */
677 	if (!bt_link_info->sco_exist && bt_link_info->a2dp_exist &&
678 	    !bt_link_info->pan_exist && !bt_link_info->hid_exist)
679 		bt_link_info->a2dp_only = true;
680 	else
681 		bt_link_info->a2dp_only = false;
682 
683 	/* check if Pan only */
684 	if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
685 	    bt_link_info->pan_exist && !bt_link_info->hid_exist)
686 		bt_link_info->pan_only = true;
687 	else
688 		bt_link_info->pan_only = false;
689 
690 	/* check if Hid only */
691 	if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
692 	    !bt_link_info->pan_exist && bt_link_info->hid_exist)
693 		bt_link_info->hid_only = true;
694 	else
695 		bt_link_info->hid_only = false;
696 
697 	if (coex_sta->bt_info & BT_INFO_8822B_1ANT_B_INQ_PAGE) {
698 		coex_dm->bt_status = BT_8822B_1ANT_BT_STATUS_INQ_PAGE;
699 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
700 			 "[BTCoex], BtInfoNotify(), BT Inq/page!!!\n");
701 	} else if (!(coex_sta->bt_info & BT_INFO_8822B_1ANT_B_CONNECTION)) {
702 		coex_dm->bt_status = BT_8822B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
703 		RT_TRACE(
704 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
705 			"[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
706 	} else if (coex_sta->bt_info == BT_INFO_8822B_1ANT_B_CONNECTION) {
707 		/* connection exists but no busy */
708 		coex_dm->bt_status = BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE;
709 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
710 			 "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
711 	} else if (((coex_sta->bt_info & BT_INFO_8822B_1ANT_B_SCO_ESCO) ||
712 		    (coex_sta->bt_info & BT_INFO_8822B_1ANT_B_SCO_BUSY)) &&
713 		   (coex_sta->bt_info & BT_INFO_8822B_1ANT_B_ACL_BUSY)) {
714 		coex_dm->bt_status = BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY;
715 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
716 			 "[BTCoex], BtInfoNotify(), BT ACL SCO busy!!!\n");
717 	} else if ((coex_sta->bt_info & BT_INFO_8822B_1ANT_B_SCO_ESCO) ||
718 		   (coex_sta->bt_info & BT_INFO_8822B_1ANT_B_SCO_BUSY)) {
719 		coex_dm->bt_status = BT_8822B_1ANT_BT_STATUS_SCO_BUSY;
720 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
721 			 "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
722 	} else if (coex_sta->bt_info & BT_INFO_8822B_1ANT_B_ACL_BUSY) {
723 		coex_dm->bt_status = BT_8822B_1ANT_BT_STATUS_ACL_BUSY;
724 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
725 			 "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
726 	} else {
727 		coex_dm->bt_status = BT_8822B_1ANT_BT_STATUS_MAX;
728 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
729 			 "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
730 	}
731 
732 	if ((coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_ACL_BUSY) ||
733 	    (coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_SCO_BUSY) ||
734 	    (coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY))
735 		bt_busy = true;
736 	else
737 		bt_busy = false;
738 
739 	btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
740 }
741 
halbtc8822b1ant_update_wifi_ch_info(struct btc_coexist * btcoexist,u8 type)742 static void halbtc8822b1ant_update_wifi_ch_info(struct btc_coexist *btcoexist,
743 						u8 type)
744 {
745 	u8 h2c_parameter[3] = {0};
746 	u32 wifi_bw;
747 	u8 wifi_central_chnl;
748 
749 	/* only 2.4G we need to inform bt the chnl mask */
750 	btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
751 			   &wifi_central_chnl);
752 	if ((type == BTC_MEDIA_CONNECT) && (wifi_central_chnl <= 14)) {
753 		/* enable BT AFH skip WL channel for 8822b
754 		 * because BT Rx LO interference
755 		 */
756 		h2c_parameter[0] = 0x1;
757 		h2c_parameter[1] = wifi_central_chnl;
758 
759 		btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
760 
761 		if (wifi_bw == BTC_WIFI_BW_HT40)
762 			h2c_parameter[2] = 0x30;
763 		else
764 			h2c_parameter[2] = 0x20;
765 	}
766 
767 	coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
768 	coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
769 	coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
770 
771 	btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
772 }
773 
halbtc8822b1ant_action_algorithm(struct btc_coexist * btcoexist)774 static u8 halbtc8822b1ant_action_algorithm(struct btc_coexist *btcoexist)
775 {
776 	struct rtl_priv *rtlpriv = btcoexist->adapter;
777 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
778 	bool bt_hs_on = false;
779 	u8 algorithm = BT_8822B_1ANT_COEX_ALGO_UNDEFINED;
780 	u8 num_of_diff_profile = 0;
781 
782 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
783 
784 	if (!bt_link_info->bt_link_exist) {
785 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
786 			 "[BTCoex], No BT link exists!!!\n");
787 		return algorithm;
788 	}
789 
790 	if (bt_link_info->sco_exist)
791 		num_of_diff_profile++;
792 	if (bt_link_info->hid_exist)
793 		num_of_diff_profile++;
794 	if (bt_link_info->pan_exist)
795 		num_of_diff_profile++;
796 	if (bt_link_info->a2dp_exist)
797 		num_of_diff_profile++;
798 
799 	if (num_of_diff_profile == 1) {
800 		if (bt_link_info->sco_exist) {
801 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
802 				 "[BTCoex], BT Profile = SCO only\n");
803 			algorithm = BT_8822B_1ANT_COEX_ALGO_SCO;
804 		} else {
805 			if (bt_link_info->hid_exist) {
806 				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
807 					 "[BTCoex], BT Profile = HID only\n");
808 				algorithm = BT_8822B_1ANT_COEX_ALGO_HID;
809 			} else if (bt_link_info->a2dp_exist) {
810 				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
811 					 "[BTCoex], BT Profile = A2DP only\n");
812 				algorithm = BT_8822B_1ANT_COEX_ALGO_A2DP;
813 			} else if (bt_link_info->pan_exist) {
814 				if (bt_hs_on) {
815 					RT_TRACE(
816 						rtlpriv, COMP_BT_COEXIST,
817 						DBG_LOUD,
818 						"[BTCoex], BT Profile = PAN(HS) only\n");
819 					algorithm =
820 						BT_8822B_1ANT_COEX_ALGO_PANHS;
821 				} else {
822 					RT_TRACE(
823 						rtlpriv, COMP_BT_COEXIST,
824 						DBG_LOUD,
825 						"[BTCoex], BT Profile = PAN(EDR) only\n");
826 					algorithm =
827 						BT_8822B_1ANT_COEX_ALGO_PANEDR;
828 				}
829 			}
830 		}
831 	} else if (num_of_diff_profile == 2) {
832 		if (bt_link_info->sco_exist) {
833 			if (bt_link_info->hid_exist) {
834 				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
835 					 "[BTCoex], BT Profile = SCO + HID\n");
836 				algorithm = BT_8822B_1ANT_COEX_ALGO_HID;
837 			} else if (bt_link_info->a2dp_exist) {
838 				RT_TRACE(
839 					rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
840 					"[BTCoex], BT Profile = SCO + A2DP ==> SCO\n");
841 				algorithm = BT_8822B_1ANT_COEX_ALGO_SCO;
842 			} else if (bt_link_info->pan_exist) {
843 				if (bt_hs_on) {
844 					RT_TRACE(
845 						rtlpriv, COMP_BT_COEXIST,
846 						DBG_LOUD,
847 						"[BTCoex], BT Profile = SCO + PAN(HS)\n");
848 					algorithm = BT_8822B_1ANT_COEX_ALGO_SCO;
849 				} else {
850 					RT_TRACE(
851 						rtlpriv, COMP_BT_COEXIST,
852 						DBG_LOUD,
853 						"[BTCoex], BT Profile = SCO + PAN(EDR)\n");
854 					algorithm =
855 					    BT_8822B_1ANT_COEX_ALGO_PANEDR_HID;
856 				}
857 			}
858 		} else {
859 			if (bt_link_info->hid_exist &&
860 			    bt_link_info->a2dp_exist) {
861 				RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
862 					 "[BTCoex], BT Profile = HID + A2DP\n");
863 				algorithm = BT_8822B_1ANT_COEX_ALGO_HID_A2DP;
864 			} else if (bt_link_info->hid_exist &&
865 				   bt_link_info->pan_exist) {
866 				if (bt_hs_on) {
867 					RT_TRACE(
868 						rtlpriv, COMP_BT_COEXIST,
869 						DBG_LOUD,
870 						"[BTCoex], BT Profile = HID + PAN(HS)\n");
871 					algorithm =
872 					    BT_8822B_1ANT_COEX_ALGO_HID_A2DP;
873 				} else {
874 					RT_TRACE(
875 						rtlpriv, COMP_BT_COEXIST,
876 						DBG_LOUD,
877 						"[BTCoex], BT Profile = HID + PAN(EDR)\n");
878 					algorithm =
879 					    BT_8822B_1ANT_COEX_ALGO_PANEDR_HID;
880 				}
881 			} else if (bt_link_info->pan_exist &&
882 				   bt_link_info->a2dp_exist) {
883 				if (bt_hs_on) {
884 					RT_TRACE(
885 						rtlpriv, COMP_BT_COEXIST,
886 						DBG_LOUD,
887 						"[BTCoex], BT Profile = A2DP + PAN(HS)\n");
888 					algorithm =
889 					    BT_8822B_1ANT_COEX_ALGO_A2DP_PANHS;
890 				} else {
891 					RT_TRACE(
892 						rtlpriv, COMP_BT_COEXIST,
893 						DBG_LOUD,
894 						"[BTCoex], BT Profile = A2DP + PAN(EDR)\n");
895 					algorithm =
896 					    BT_8822B_1ANT_COEX_ALGO_PANEDR_A2DP;
897 				}
898 			}
899 		}
900 	} else if (num_of_diff_profile == 3) {
901 		if (bt_link_info->sco_exist) {
902 			if (bt_link_info->hid_exist &&
903 			    bt_link_info->a2dp_exist) {
904 				RT_TRACE(
905 					rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
906 					"[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n");
907 				algorithm = BT_8822B_1ANT_COEX_ALGO_HID;
908 			} else if (bt_link_info->hid_exist &&
909 				   bt_link_info->pan_exist) {
910 				if (bt_hs_on) {
911 					RT_TRACE(
912 						rtlpriv, COMP_BT_COEXIST,
913 						DBG_LOUD,
914 						"[BTCoex], BT Profile = SCO + HID + PAN(HS)\n");
915 					algorithm =
916 					    BT_8822B_1ANT_COEX_ALGO_HID_A2DP;
917 				} else {
918 					RT_TRACE(
919 						rtlpriv, COMP_BT_COEXIST,
920 						DBG_LOUD,
921 						"[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n");
922 					algorithm =
923 					    BT_8822B_1ANT_COEX_ALGO_PANEDR_HID;
924 				}
925 			} else if (bt_link_info->pan_exist &&
926 				   bt_link_info->a2dp_exist) {
927 				if (bt_hs_on) {
928 					RT_TRACE(
929 						rtlpriv, COMP_BT_COEXIST,
930 						DBG_LOUD,
931 						"[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n");
932 					algorithm = BT_8822B_1ANT_COEX_ALGO_SCO;
933 				} else {
934 					RT_TRACE(
935 						rtlpriv, COMP_BT_COEXIST,
936 						DBG_LOUD,
937 						"[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n");
938 					algorithm =
939 					    BT_8822B_1ANT_COEX_ALGO_PANEDR_HID;
940 				}
941 			}
942 		} else {
943 			if (bt_link_info->hid_exist &&
944 			    bt_link_info->pan_exist &&
945 			    bt_link_info->a2dp_exist) {
946 				if (bt_hs_on) {
947 					RT_TRACE(
948 						rtlpriv, COMP_BT_COEXIST,
949 						DBG_LOUD,
950 						"[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n");
951 					algorithm =
952 					    BT_8822B_1ANT_COEX_ALGO_HID_A2DP;
953 				} else {
954 					RT_TRACE(
955 						rtlpriv, COMP_BT_COEXIST,
956 						DBG_LOUD,
957 						"[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n");
958 					algorithm =
959 					BT_8822B_1ANT_COEX_ALGO_HID_A2DP_PANEDR;
960 				}
961 			}
962 		}
963 	} else if (num_of_diff_profile >= 3) {
964 		if (bt_link_info->sco_exist) {
965 			if (bt_link_info->hid_exist &&
966 			    bt_link_info->pan_exist &&
967 			    bt_link_info->a2dp_exist) {
968 				if (bt_hs_on) {
969 					RT_TRACE(
970 						rtlpriv, COMP_BT_COEXIST,
971 						DBG_LOUD,
972 						"[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n");
973 
974 				} else {
975 					RT_TRACE(
976 						rtlpriv, COMP_BT_COEXIST,
977 						DBG_LOUD,
978 						"[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");
979 					algorithm =
980 					    BT_8822B_1ANT_COEX_ALGO_PANEDR_HID;
981 				}
982 			}
983 		}
984 	}
985 
986 	return algorithm;
987 }
988 
halbtc8822b1ant_low_penalty_ra(struct btc_coexist * btcoexist,bool force_exec,bool low_penalty_ra)989 static void halbtc8822b1ant_low_penalty_ra(struct btc_coexist *btcoexist,
990 					   bool force_exec, bool low_penalty_ra)
991 {
992 	coex_dm->cur_low_penalty_ra = low_penalty_ra;
993 
994 	if (!force_exec) {
995 		if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
996 			return;
997 	}
998 
999 	if (low_penalty_ra)
1000 		btcoexist->btc_phydm_modify_ra_pcr_threshold(btcoexist, 0, 25);
1001 	else
1002 		btcoexist->btc_phydm_modify_ra_pcr_threshold(btcoexist, 0, 0);
1003 
1004 	coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
1005 }
1006 
halbtc8822b1ant_write_score_board(struct btc_coexist * btcoexist,u16 bitpos,bool state)1007 static void halbtc8822b1ant_write_score_board(struct btc_coexist *btcoexist,
1008 					      u16 bitpos, bool state)
1009 {
1010 	static u16 originalval = 0x8002;
1011 
1012 	if (state)
1013 		originalval = originalval | bitpos;
1014 	else
1015 		originalval = originalval & (~bitpos);
1016 
1017 	btcoexist->btc_write_2byte(btcoexist, 0xaa, originalval);
1018 }
1019 
halbtc8822b1ant_read_score_board(struct btc_coexist * btcoexist,u16 * score_board_val)1020 static void halbtc8822b1ant_read_score_board(struct btc_coexist *btcoexist,
1021 					     u16 *score_board_val)
1022 {
1023 	*score_board_val =
1024 		(btcoexist->btc_read_2byte(btcoexist, 0xaa)) & 0x7fff;
1025 }
1026 
halbtc8822b1ant_post_state_to_bt(struct btc_coexist * btcoexist,u16 type,bool state)1027 static void halbtc8822b1ant_post_state_to_bt(struct btc_coexist *btcoexist,
1028 					     u16 type, bool state)
1029 {
1030 	halbtc8822b1ant_write_score_board(btcoexist, (u16)type, state);
1031 }
1032 
1033 static void
halbtc8822b1ant_monitor_bt_enable_disable(struct btc_coexist * btcoexist)1034 halbtc8822b1ant_monitor_bt_enable_disable(struct btc_coexist *btcoexist)
1035 {
1036 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1037 	static u32 bt_disable_cnt;
1038 	bool bt_active = true, bt_disabled = false, wifi_under_5g = false;
1039 	u16 u16tmp;
1040 
1041 	/* This function check if bt is disabled */
1042 
1043 	/* Read BT on/off status from scoreboard[1],
1044 	 * enable this only if BT patch support this feature
1045 	 */
1046 	halbtc8822b1ant_read_score_board(btcoexist, &u16tmp);
1047 
1048 	bt_active = u16tmp & BIT(1);
1049 
1050 	if (bt_active) {
1051 		bt_disable_cnt = 0;
1052 		bt_disabled = false;
1053 		btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
1054 				   &bt_disabled);
1055 	} else {
1056 		bt_disable_cnt++;
1057 		if (bt_disable_cnt >= 2) {
1058 			bt_disabled = true;
1059 			bt_disable_cnt = 2;
1060 		}
1061 
1062 		btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
1063 				   &bt_disabled);
1064 	}
1065 
1066 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
1067 
1068 	if ((wifi_under_5g) || (bt_disabled))
1069 		halbtc8822b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, false);
1070 	else
1071 		halbtc8822b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, true);
1072 
1073 	if (coex_sta->bt_disabled != bt_disabled) {
1074 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1075 			 "[BTCoex], BT is from %s to %s!!\n",
1076 			 (coex_sta->bt_disabled ? "disabled" : "enabled"),
1077 			 (bt_disabled ? "disabled" : "enabled"));
1078 		coex_sta->bt_disabled = bt_disabled;
1079 	}
1080 }
1081 
halbtc8822b1ant_enable_gnt_to_gpio(struct btc_coexist * btcoexist,bool isenable)1082 static void halbtc8822b1ant_enable_gnt_to_gpio(struct btc_coexist *btcoexist,
1083 					       bool isenable)
1084 {
1085 	static u8 bit_val[5] = {0, 0, 0, 0, 0};
1086 	static bool state;
1087 
1088 	if (!btcoexist->dbg_mode_1ant)
1089 		return;
1090 
1091 	if (state == isenable)
1092 		return;
1093 
1094 	state = isenable;
1095 
1096 	if (isenable) {
1097 		/* enable GNT_WL, GNT_BT to GPIO for debug */
1098 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x8, 0x1);
1099 
1100 		/* store original value */
1101 		bit_val[0] =
1102 			(btcoexist->btc_read_1byte(btcoexist, 0x66) & BIT(4)) >>
1103 			4; /*0x66[4] */
1104 		bit_val[1] = (btcoexist->btc_read_1byte(btcoexist, 0x67) &
1105 			      BIT(0)); /*0x66[8] */
1106 		bit_val[2] =
1107 			(btcoexist->btc_read_1byte(btcoexist, 0x42) & BIT(3)) >>
1108 			3; /*0x40[19] */
1109 		bit_val[3] =
1110 			(btcoexist->btc_read_1byte(btcoexist, 0x65) & BIT(7)) >>
1111 			7; /*0x64[15] */
1112 		bit_val[4] =
1113 			(btcoexist->btc_read_1byte(btcoexist, 0x72) & BIT(2)) >>
1114 			2; /*0x70[18] */
1115 
1116 		/*  switch GPIO Mux */
1117 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x66, BIT(4),
1118 						   0x0); /*0x66[4] = 0 */
1119 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, BIT(0),
1120 						   0x0); /*0x66[8] = 0 */
1121 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x42, BIT(3),
1122 						   0x0); /*0x40[19] = 0 */
1123 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x65, BIT(7),
1124 						   0x0); /*0x64[15] = 0 */
1125 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x72, BIT(2),
1126 						   0x0); /*0x70[18] = 0 */
1127 
1128 	} else {
1129 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x8, 0x0);
1130 
1131 		/*  Restore original value  */
1132 		/*  switch GPIO Mux */
1133 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x66, BIT(4),
1134 						   bit_val[0]); /*0x66[4] = 0 */
1135 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, BIT(0),
1136 						   bit_val[1]); /*0x66[8] = 0 */
1137 		btcoexist->btc_write_1byte_bitmask(
1138 			btcoexist, 0x42, BIT(3), bit_val[2]); /*0x40[19] = 0 */
1139 		btcoexist->btc_write_1byte_bitmask(
1140 			btcoexist, 0x65, BIT(7), bit_val[3]); /*0x64[15] = 0 */
1141 		btcoexist->btc_write_1byte_bitmask(
1142 			btcoexist, 0x72, BIT(2), bit_val[4]); /*0x70[18] = 0 */
1143 	}
1144 }
1145 
1146 static u32
halbtc8822b1ant_ltecoex_indirect_read_reg(struct btc_coexist * btcoexist,u16 reg_addr)1147 halbtc8822b1ant_ltecoex_indirect_read_reg(struct btc_coexist *btcoexist,
1148 					  u16 reg_addr)
1149 {
1150 	u32 delay_count = 0;
1151 
1152 	/* wait for ready bit before access 0x1700 */
1153 	while (1) {
1154 		if ((btcoexist->btc_read_1byte(btcoexist, 0x1703) & BIT(5)) ==
1155 		    0) {
1156 			mdelay(50);
1157 			delay_count++;
1158 			if (delay_count >= 10) {
1159 				delay_count = 0;
1160 				break;
1161 			}
1162 		} else {
1163 			break;
1164 		}
1165 	}
1166 
1167 	btcoexist->btc_write_4byte(btcoexist, 0x1700, 0x800F0000 | reg_addr);
1168 
1169 	return btcoexist->btc_read_4byte(btcoexist, 0x1708); /* get read data */
1170 }
1171 
1172 static void
halbtc8822b1ant_ltecoex_indirect_write_reg(struct btc_coexist * btcoexist,u16 reg_addr,u32 bit_mask,u32 reg_value)1173 halbtc8822b1ant_ltecoex_indirect_write_reg(struct btc_coexist *btcoexist,
1174 					   u16 reg_addr, u32 bit_mask,
1175 					   u32 reg_value)
1176 {
1177 	u32 val, i = 0, bitpos = 0, delay_count = 0;
1178 
1179 	if (bit_mask == 0x0)
1180 		return;
1181 
1182 	if (bit_mask == 0xffffffff) {
1183 		/* wait for ready bit before access 0x1700/0x1704 */
1184 		while (1) {
1185 			if ((btcoexist->btc_read_1byte(btcoexist, 0x1703) &
1186 			     BIT(5)) == 0) {
1187 				mdelay(50);
1188 				delay_count++;
1189 				if (delay_count >= 10) {
1190 					delay_count = 0;
1191 					break;
1192 				}
1193 			} else {
1194 				break;
1195 			}
1196 		}
1197 
1198 		btcoexist->btc_write_4byte(btcoexist, 0x1704,
1199 					   reg_value); /* put write data */
1200 
1201 		btcoexist->btc_write_4byte(btcoexist, 0x1700,
1202 					   0xc00F0000 | reg_addr);
1203 	} else {
1204 		for (i = 0; i <= 31; i++) {
1205 			if (((bit_mask >> i) & 0x1) == 0x1) {
1206 				bitpos = i;
1207 				break;
1208 			}
1209 		}
1210 
1211 		/* read back register value before write */
1212 		val = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
1213 								reg_addr);
1214 		val = (val & (~bit_mask)) | (reg_value << bitpos);
1215 
1216 		/* wait for ready bit before access 0x1700/0x1704 */
1217 		while (1) {
1218 			if ((btcoexist->btc_read_1byte(btcoexist, 0x1703) &
1219 			     BIT(5)) == 0) {
1220 				mdelay(50);
1221 				delay_count++;
1222 				if (delay_count >= 10) {
1223 					delay_count = 0;
1224 					break;
1225 				}
1226 			} else {
1227 				break;
1228 			}
1229 		}
1230 
1231 		btcoexist->btc_write_4byte(btcoexist, 0x1704,
1232 					   val); /* put write data */
1233 
1234 		btcoexist->btc_write_4byte(btcoexist, 0x1700,
1235 					   0xc00F0000 | reg_addr);
1236 	}
1237 }
1238 
halbtc8822b1ant_ltecoex_enable(struct btc_coexist * btcoexist,bool enable)1239 static void halbtc8822b1ant_ltecoex_enable(struct btc_coexist *btcoexist,
1240 					   bool enable)
1241 {
1242 	u8 val;
1243 
1244 	val = (enable) ? 1 : 0;
1245 	/* 0x38[7] */
1246 	halbtc8822b1ant_ltecoex_indirect_write_reg(btcoexist, 0x38, 0x80, val);
1247 }
1248 
1249 static void
halbtc8822b1ant_ltecoex_pathcontrol_owner(struct btc_coexist * btcoexist,bool wifi_control)1250 halbtc8822b1ant_ltecoex_pathcontrol_owner(struct btc_coexist *btcoexist,
1251 					  bool wifi_control)
1252 {
1253 	u8 val;
1254 
1255 	val = (wifi_control) ? 1 : 0;
1256 	/* 0x70[26] */
1257 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x4, val);
1258 }
1259 
halbtc8822b1ant_ltecoex_set_gnt_bt(struct btc_coexist * btcoexist,u8 control_block,bool sw_control,u8 state)1260 static void halbtc8822b1ant_ltecoex_set_gnt_bt(struct btc_coexist *btcoexist,
1261 					       u8 control_block,
1262 					       bool sw_control, u8 state)
1263 {
1264 	u32 val = 0, bit_mask;
1265 
1266 	state = state & 0x1;
1267 	/*LTE indirect 0x38=0xccxx (sw : gnt_wl=1,sw gnt_bt=1)
1268 	 *0x38=0xddxx (sw : gnt_bt=1 , sw gnt_wl=0)
1269 	 *0x38=0x55xx(hw pta :gnt_wl /gnt_bt )
1270 	 */
1271 	val = (sw_control) ? ((state << 1) | 0x1) : 0;
1272 
1273 	switch (control_block) {
1274 	case BT_8822B_1ANT_GNT_BLOCK_RFC_BB:
1275 	default:
1276 		bit_mask = 0xc000;
1277 		halbtc8822b1ant_ltecoex_indirect_write_reg(
1278 			btcoexist, 0x38, bit_mask, val); /* 0x38[15:14] */
1279 		bit_mask = 0x0c00;
1280 		halbtc8822b1ant_ltecoex_indirect_write_reg(
1281 			btcoexist, 0x38, bit_mask, val); /* 0x38[11:10] */
1282 		break;
1283 	case BT_8822B_1ANT_GNT_BLOCK_RFC:
1284 		bit_mask = 0xc000;
1285 		halbtc8822b1ant_ltecoex_indirect_write_reg(
1286 			btcoexist, 0x38, bit_mask, val); /* 0x38[15:14] */
1287 		break;
1288 	case BT_8822B_1ANT_GNT_BLOCK_BB:
1289 		bit_mask = 0x0c00;
1290 		halbtc8822b1ant_ltecoex_indirect_write_reg(
1291 			btcoexist, 0x38, bit_mask, val); /* 0x38[11:10] */
1292 		break;
1293 	}
1294 }
1295 
halbtc8822b1ant_ltecoex_set_gnt_wl(struct btc_coexist * btcoexist,u8 control_block,bool sw_control,u8 state)1296 static void halbtc8822b1ant_ltecoex_set_gnt_wl(struct btc_coexist *btcoexist,
1297 					       u8 control_block,
1298 					       bool sw_control, u8 state)
1299 {
1300 	u32 val = 0, bit_mask;
1301 	/*LTE indirect 0x38=0xccxx (sw : gnt_wl=1,sw gnt_bt=1)
1302 	 *0x38=0xddxx (sw : gnt_bt=1 , sw gnt_wl=0)
1303 	 *0x38=0x55xx(hw pta :gnt_wl /gnt_bt )
1304 	 */
1305 
1306 	state = state & 0x1;
1307 	val = (sw_control) ? ((state << 1) | 0x1) : 0;
1308 
1309 	switch (control_block) {
1310 	case BT_8822B_1ANT_GNT_BLOCK_RFC_BB:
1311 	default:
1312 		bit_mask = 0x3000;
1313 		halbtc8822b1ant_ltecoex_indirect_write_reg(
1314 			btcoexist, 0x38, bit_mask, val); /* 0x38[13:12] */
1315 		bit_mask = 0x0300;
1316 		halbtc8822b1ant_ltecoex_indirect_write_reg(
1317 			btcoexist, 0x38, bit_mask, val); /* 0x38[9:8] */
1318 		break;
1319 	case BT_8822B_1ANT_GNT_BLOCK_RFC:
1320 		bit_mask = 0x3000;
1321 		halbtc8822b1ant_ltecoex_indirect_write_reg(
1322 			btcoexist, 0x38, bit_mask, val); /* 0x38[13:12] */
1323 		break;
1324 	case BT_8822B_1ANT_GNT_BLOCK_BB:
1325 		bit_mask = 0x0300;
1326 		halbtc8822b1ant_ltecoex_indirect_write_reg(
1327 			btcoexist, 0x38, bit_mask, val); /* 0x38[9:8] */
1328 		break;
1329 	}
1330 }
1331 
1332 static void
halbtc8822b1ant_ltecoex_set_coex_table(struct btc_coexist * btcoexist,u8 table_type,u16 table_content)1333 halbtc8822b1ant_ltecoex_set_coex_table(struct btc_coexist *btcoexist,
1334 				       u8 table_type, u16 table_content)
1335 {
1336 	u16 reg_addr = 0x0000;
1337 
1338 	switch (table_type) {
1339 	case BT_8822B_1ANT_CTT_WL_VS_LTE:
1340 		reg_addr = 0xa0;
1341 		break;
1342 	case BT_8822B_1ANT_CTT_BT_VS_LTE:
1343 		reg_addr = 0xa4;
1344 		break;
1345 	}
1346 
1347 	if (reg_addr != 0x0000)
1348 		halbtc8822b1ant_ltecoex_indirect_write_reg(
1349 			btcoexist, reg_addr, 0xffff,
1350 			table_content); /* 0xa0[15:0] or 0xa4[15:0] */
1351 }
1352 
halbtc8822b1ant_set_wltoggle_coex_table(struct btc_coexist * btcoexist,bool force_exec,u8 interval,u8 val0x6c4_b0,u8 val0x6c4_b1,u8 val0x6c4_b2,u8 val0x6c4_b3)1353 static void halbtc8822b1ant_set_wltoggle_coex_table(
1354 	struct btc_coexist *btcoexist, bool force_exec, u8 interval,
1355 	u8 val0x6c4_b0, u8 val0x6c4_b1, u8 val0x6c4_b2, u8 val0x6c4_b3)
1356 {
1357 	static u8 pre_h2c_parameter[6] = {0};
1358 	u8 cur_h2c_parameter[6] = {0};
1359 	u8 i, match_cnt = 0;
1360 
1361 	cur_h2c_parameter[0] = 0x7; /* op_code, 0x7= wlan toggle slot*/
1362 
1363 	cur_h2c_parameter[1] = interval;
1364 	cur_h2c_parameter[2] = val0x6c4_b0;
1365 	cur_h2c_parameter[3] = val0x6c4_b1;
1366 	cur_h2c_parameter[4] = val0x6c4_b2;
1367 	cur_h2c_parameter[5] = val0x6c4_b3;
1368 
1369 	if (!force_exec) {
1370 		for (i = 1; i <= 5; i++) {
1371 			if (cur_h2c_parameter[i] != pre_h2c_parameter[i])
1372 				break;
1373 
1374 			match_cnt++;
1375 		}
1376 
1377 		if (match_cnt == 5)
1378 			return;
1379 	}
1380 
1381 	for (i = 1; i <= 5; i++)
1382 		pre_h2c_parameter[i] = cur_h2c_parameter[i];
1383 
1384 	btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, cur_h2c_parameter);
1385 }
1386 
halbtc8822b1ant_set_coex_table(struct btc_coexist * btcoexist,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)1387 static void halbtc8822b1ant_set_coex_table(struct btc_coexist *btcoexist,
1388 					   u32 val0x6c0, u32 val0x6c4,
1389 					   u32 val0x6c8, u8 val0x6cc)
1390 {
1391 	btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
1392 
1393 	btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
1394 
1395 	btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
1396 
1397 	btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
1398 }
1399 
halbtc8822b1ant_coex_table(struct btc_coexist * btcoexist,bool force_exec,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)1400 static void halbtc8822b1ant_coex_table(struct btc_coexist *btcoexist,
1401 				       bool force_exec, u32 val0x6c0,
1402 				       u32 val0x6c4, u32 val0x6c8, u8 val0x6cc)
1403 {
1404 	coex_dm->cur_val0x6c0 = val0x6c0;
1405 	coex_dm->cur_val0x6c4 = val0x6c4;
1406 	coex_dm->cur_val0x6c8 = val0x6c8;
1407 	coex_dm->cur_val0x6cc = val0x6cc;
1408 
1409 	if (!force_exec) {
1410 		if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
1411 		    (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
1412 		    (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
1413 		    (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
1414 			return;
1415 	}
1416 	halbtc8822b1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8,
1417 				       val0x6cc);
1418 
1419 	coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
1420 	coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
1421 	coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
1422 	coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
1423 }
1424 
halbtc8822b1ant_coex_table_with_type(struct btc_coexist * btcoexist,bool force_exec,u8 type)1425 static void halbtc8822b1ant_coex_table_with_type(struct btc_coexist *btcoexist,
1426 						 bool force_exec, u8 type)
1427 {
1428 	u32 break_table;
1429 	u8 select_table;
1430 
1431 	coex_sta->coex_table_type = type;
1432 
1433 	if (coex_sta->concurrent_rx_mode_on) {
1434 		break_table = 0xf0ffffff; /* set WL hi-pri can break BT */
1435 		select_table = 0x3; /* set Tx response = Hi-Pri
1436 				     * (ex: Transmitting ACK,BA,CTS)
1437 				     */
1438 	} else {
1439 		break_table = 0xffffff;
1440 		select_table = 0x3;
1441 	}
1442 
1443 	switch (type) {
1444 	case 0:
1445 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0x55555555,
1446 					   0x55555555, break_table,
1447 					   select_table);
1448 		break;
1449 	case 1:
1450 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0x55555555,
1451 					   0x5a5a5a5a, break_table,
1452 					   select_table);
1453 		break;
1454 	case 2:
1455 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0xaa5a5a5a,
1456 					   0xaa5a5a5a, break_table,
1457 					   select_table);
1458 		break;
1459 	case 3:
1460 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0x55555555,
1461 					   0xaa5a5a5a, break_table,
1462 					   select_table);
1463 		break;
1464 	case 4:
1465 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0xaa555555,
1466 					   0xaa5a5a5a, break_table,
1467 					   select_table);
1468 		break;
1469 	case 5:
1470 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
1471 					   0x5a5a5a5a, break_table,
1472 					   select_table);
1473 		break;
1474 	case 6:
1475 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0x55555555,
1476 					   0xaaaaaaaa, break_table,
1477 					   select_table);
1478 		break;
1479 	case 7:
1480 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,
1481 					   0xaaaaaaaa, break_table,
1482 					   select_table);
1483 		break;
1484 	case 8:
1485 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0xffffffff,
1486 					   0xffffffff, break_table,
1487 					   select_table);
1488 		break;
1489 	case 9:
1490 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0x5a5a5555,
1491 					   0xaaaa5a5a, break_table,
1492 					   select_table);
1493 		break;
1494 	case 10:
1495 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0xaaaa5aaa,
1496 					   0xaaaa5aaa, break_table,
1497 					   select_table);
1498 		break;
1499 	case 11:
1500 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0xaaaaa5aa,
1501 					   0xaaaaaaaa, break_table,
1502 					   select_table);
1503 		break;
1504 	case 12:
1505 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0xaaaaa5aa,
1506 					   0xaaaaa5aa, break_table,
1507 					   select_table);
1508 		break;
1509 	case 13:
1510 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0x55555555,
1511 					   0xaaaa5a5a, break_table,
1512 					   select_table);
1513 		break;
1514 	case 14:
1515 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0x5a5a555a,
1516 					   0xaaaa5a5a, break_table,
1517 					   select_table);
1518 		break;
1519 	case 15:
1520 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0x55555555,
1521 					   0xaaaa55aa, break_table,
1522 					   select_table);
1523 		break;
1524 	case 16:
1525 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0x5a5a555a,
1526 					   0x5a5a555a, break_table,
1527 					   select_table);
1528 		break;
1529 	case 17:
1530 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0xaaaa55aa,
1531 					   0xaaaa55aa, break_table,
1532 					   select_table);
1533 		break;
1534 	case 18:
1535 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0x55555555,
1536 					   0x5aaa5a5a, break_table,
1537 					   select_table);
1538 		break;
1539 	case 19:
1540 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0xa5555555,
1541 					   0xaaaa5aaa, break_table,
1542 					   select_table);
1543 		break;
1544 	case 20:
1545 		halbtc8822b1ant_coex_table(btcoexist, force_exec, 0x55555555,
1546 					   0xaaaa5aaa, break_table,
1547 					   select_table);
1548 		break;
1549 	default:
1550 		break;
1551 	}
1552 }
1553 
1554 static void
halbtc8822b1ant_set_fw_ignore_wlan_act(struct btc_coexist * btcoexist,bool enable)1555 halbtc8822b1ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,
1556 				       bool enable)
1557 {
1558 	u8 h2c_parameter[1] = {0};
1559 
1560 	if (enable)
1561 		h2c_parameter[0] |= BIT(0); /* function enable */
1562 
1563 	btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
1564 }
1565 
halbtc8822b1ant_ignore_wlan_act(struct btc_coexist * btcoexist,bool force_exec,bool enable)1566 static void halbtc8822b1ant_ignore_wlan_act(struct btc_coexist *btcoexist,
1567 					    bool force_exec, bool enable)
1568 {
1569 	coex_dm->cur_ignore_wlan_act = enable;
1570 
1571 	if (!force_exec) {
1572 		if (coex_dm->pre_ignore_wlan_act ==
1573 		    coex_dm->cur_ignore_wlan_act) {
1574 			coex_dm->pre_ignore_wlan_act =
1575 				coex_dm->cur_ignore_wlan_act;
1576 			return;
1577 		}
1578 	}
1579 
1580 	halbtc8822b1ant_set_fw_ignore_wlan_act(btcoexist, enable);
1581 
1582 	coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
1583 }
1584 
halbtc8822b1ant_set_lps_rpwm(struct btc_coexist * btcoexist,u8 lps_val,u8 rpwm_val)1585 static void halbtc8822b1ant_set_lps_rpwm(struct btc_coexist *btcoexist,
1586 					 u8 lps_val, u8 rpwm_val)
1587 {
1588 	u8 lps = lps_val;
1589 	u8 rpwm = rpwm_val;
1590 
1591 	btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
1592 	btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
1593 }
1594 
halbtc8822b1ant_lps_rpwm(struct btc_coexist * btcoexist,bool force_exec,u8 lps_val,u8 rpwm_val)1595 static void halbtc8822b1ant_lps_rpwm(struct btc_coexist *btcoexist,
1596 				     bool force_exec, u8 lps_val, u8 rpwm_val)
1597 {
1598 	coex_dm->cur_lps = lps_val;
1599 	coex_dm->cur_rpwm = rpwm_val;
1600 
1601 	if (!force_exec) {
1602 		if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
1603 		    (coex_dm->pre_rpwm == coex_dm->cur_rpwm))
1604 			return;
1605 	}
1606 	halbtc8822b1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
1607 
1608 	coex_dm->pre_lps = coex_dm->cur_lps;
1609 	coex_dm->pre_rpwm = coex_dm->cur_rpwm;
1610 }
1611 
halbtc8822b1ant_ps_tdma_check_for_power_save_state(struct btc_coexist * btcoexist,bool new_ps_state)1612 static void halbtc8822b1ant_ps_tdma_check_for_power_save_state(
1613 	struct btc_coexist *btcoexist, bool new_ps_state)
1614 {
1615 	u8 lps_mode = 0x0;
1616 	u8 h2c_parameter[5] = {0x8, 0, 0, 0, 0};
1617 
1618 	btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1619 
1620 	if (lps_mode) { /* already under LPS state */
1621 		if (new_ps_state) {
1622 			/* keep state under LPS, do nothing. */
1623 		} else {
1624 			/* will leave LPS state, turn off psTdma first */
1625 
1626 			btcoexist->btc_fill_h2c(btcoexist, 0x60, 5,
1627 						h2c_parameter);
1628 		}
1629 	} else { /* NO PS state */
1630 		if (new_ps_state) {
1631 			/* will enter LPS state, turn off psTdma first */
1632 
1633 			btcoexist->btc_fill_h2c(btcoexist, 0x60, 5,
1634 						h2c_parameter);
1635 		} else {
1636 			/* keep state under NO PS state, do nothing. */
1637 		}
1638 	}
1639 }
1640 
halbtc8822b1ant_power_save_state(struct btc_coexist * btcoexist,u8 ps_type,u8 lps_val,u8 rpwm_val)1641 static bool halbtc8822b1ant_power_save_state(struct btc_coexist *btcoexist,
1642 					     u8 ps_type, u8 lps_val,
1643 					     u8 rpwm_val)
1644 {
1645 	bool low_pwr_disable = false, result = true;
1646 
1647 	switch (ps_type) {
1648 	case BTC_PS_WIFI_NATIVE:
1649 		/* recover to original 32k low power setting */
1650 		coex_sta->force_lps_ctrl = false;
1651 		low_pwr_disable = false;
1652 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1653 				   &low_pwr_disable);
1654 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
1655 		break;
1656 	case BTC_PS_LPS_ON:
1657 
1658 		coex_sta->force_lps_ctrl = true;
1659 		halbtc8822b1ant_ps_tdma_check_for_power_save_state(btcoexist,
1660 								   true);
1661 		halbtc8822b1ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,
1662 					 rpwm_val);
1663 		/* when coex force to enter LPS, do not enter 32k low power. */
1664 		low_pwr_disable = true;
1665 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1666 				   &low_pwr_disable);
1667 		/* power save must executed before psTdma. */
1668 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
1669 
1670 		break;
1671 	case BTC_PS_LPS_OFF:
1672 
1673 		coex_sta->force_lps_ctrl = true;
1674 		halbtc8822b1ant_ps_tdma_check_for_power_save_state(btcoexist,
1675 								   false);
1676 		result = btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS,
1677 					    NULL);
1678 
1679 		break;
1680 	default:
1681 		break;
1682 	}
1683 
1684 	return result;
1685 }
1686 
halbtc8822b1ant_set_fw_pstdma(struct btc_coexist * btcoexist,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 byte5)1687 static void halbtc8822b1ant_set_fw_pstdma(struct btc_coexist *btcoexist,
1688 					  u8 byte1, u8 byte2, u8 byte3,
1689 					  u8 byte4, u8 byte5)
1690 {
1691 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1692 	u8 h2c_parameter[5] = {0};
1693 	u8 real_byte1 = byte1, real_byte5 = byte5;
1694 	bool ap_enable = false, result = false;
1695 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1696 
1697 	if (byte5 & BIT(2))
1698 		coex_sta->is_tdma_btautoslot = true;
1699 	else
1700 		coex_sta->is_tdma_btautoslot = false;
1701 
1702 	/* release bt-auto slot for auto-slot hang is detected!! */
1703 	if (coex_sta->is_tdma_btautoslot)
1704 		if ((coex_sta->is_tdma_btautoslot_hang) ||
1705 		    (bt_link_info->slave_role))
1706 			byte5 = byte5 & 0xfb;
1707 
1708 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1709 			   &ap_enable);
1710 
1711 	if ((ap_enable) && (byte1 & BIT(4) && !(byte1 & BIT(5)))) {
1712 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1713 			 "[BTCoex], %s == FW for 1Ant AP mode\n", __func__);
1714 
1715 		real_byte1 &= ~BIT(4);
1716 		real_byte1 |= BIT(5);
1717 
1718 		real_byte5 |= BIT(5);
1719 		real_byte5 &= ~BIT(6);
1720 
1721 		halbtc8822b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1722 						 0x0, 0x0);
1723 
1724 	} else if (byte1 & BIT(4) && !(byte1 & BIT(5))) {
1725 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1726 			 "[BTCoex], %s == Force LPS (byte1 = 0x%x)\n",
1727 			 __func__, byte1);
1728 		if (!halbtc8822b1ant_power_save_state(btcoexist, BTC_PS_LPS_OFF,
1729 						      0x50, 0x4))
1730 			result = true;
1731 	} else {
1732 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1733 			 "[BTCoex], %s == native power save (byte1 = 0x%x)\n",
1734 			 __func__, byte1);
1735 		halbtc8822b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1736 						 0x0, 0x0);
1737 	}
1738 
1739 	coex_sta->is_set_ps_state_fail = result;
1740 
1741 	if (!coex_sta->is_set_ps_state_fail) {
1742 		h2c_parameter[0] = real_byte1;
1743 		h2c_parameter[1] = byte2;
1744 		h2c_parameter[2] = byte3;
1745 		h2c_parameter[3] = byte4;
1746 		h2c_parameter[4] = real_byte5;
1747 
1748 		coex_dm->ps_tdma_para[0] = real_byte1;
1749 		coex_dm->ps_tdma_para[1] = byte2;
1750 		coex_dm->ps_tdma_para[2] = byte3;
1751 		coex_dm->ps_tdma_para[3] = byte4;
1752 		coex_dm->ps_tdma_para[4] = real_byte5;
1753 
1754 		btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1755 
1756 	} else {
1757 		coex_sta->cnt_set_ps_state_fail++;
1758 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1759 			 "[BTCoex], %s == Force Leave LPS Fail (cnt = %d)\n",
1760 			 __func__, coex_sta->cnt_set_ps_state_fail);
1761 	}
1762 }
1763 
halbtc8822b1ant_ps_tdma(struct btc_coexist * btcoexist,bool force_exec,bool turn_on,u8 type)1764 static void halbtc8822b1ant_ps_tdma(struct btc_coexist *btcoexist,
1765 				    bool force_exec, bool turn_on, u8 type)
1766 {
1767 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1768 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1769 	bool wifi_busy = false;
1770 	static u8 ps_tdma_byte4_modify, pre_ps_tdma_byte4_modify;
1771 	static bool pre_wifi_busy;
1772 
1773 	coex_dm->cur_ps_tdma_on = turn_on;
1774 	coex_dm->cur_ps_tdma = type;
1775 
1776 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1777 
1778 	if (wifi_busy != pre_wifi_busy) {
1779 		force_exec = true;
1780 		pre_wifi_busy = wifi_busy;
1781 	}
1782 
1783 	/* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
1784 	if (bt_link_info->slave_role)
1785 		ps_tdma_byte4_modify = 0x1;
1786 	else
1787 		ps_tdma_byte4_modify = 0x0;
1788 
1789 	if (pre_ps_tdma_byte4_modify != ps_tdma_byte4_modify) {
1790 		force_exec = true;
1791 		pre_ps_tdma_byte4_modify = ps_tdma_byte4_modify;
1792 	}
1793 
1794 	if (!force_exec) {
1795 		if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1796 		    (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma)) {
1797 			RT_TRACE(
1798 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1799 				"[BTCoex], Skip TDMA because no change TDMA(%s, %d)\n",
1800 				(coex_dm->cur_ps_tdma_on ? "on" : "off"),
1801 				coex_dm->cur_ps_tdma);
1802 			return;
1803 		}
1804 	}
1805 
1806 	if (coex_dm->cur_ps_tdma_on) {
1807 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1808 			 "[BTCoex], ********** TDMA(on, %d) **********\n",
1809 			 coex_dm->cur_ps_tdma);
1810 
1811 		btcoexist->btc_write_1byte_bitmask(
1812 			btcoexist, 0x550, 0x8, 0x1); /* enable TBTT nterrupt */
1813 	} else {
1814 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1815 			 "[BTCoex], ********** TDMA(off, %d) **********\n",
1816 			 coex_dm->cur_ps_tdma);
1817 	}
1818 
1819 	if (turn_on) {
1820 		/* enable TBTT nterrupt */
1821 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8, 0x1);
1822 
1823 		switch (type) {
1824 		default:
1825 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x61, 0x35,
1826 						      0x03, 0x11, 0x11);
1827 			break;
1828 		case 1:
1829 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x61, 0x3a,
1830 						      0x03, 0x11, 0x10);
1831 			break;
1832 		case 3:
1833 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x51, 0x30,
1834 						      0x03, 0x10, 0x50);
1835 			break;
1836 		case 4:
1837 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x51, 0x21,
1838 						      0x03, 0x10, 0x50);
1839 			break;
1840 		case 5:
1841 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x61, 0x15,
1842 						      0x3, 0x11, 0x11);
1843 			break;
1844 		case 6:
1845 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x61, 0x20,
1846 						      0x3, 0x11, 0x10);
1847 			break;
1848 		case 7:
1849 			halbtc8822b1ant_set_fw_pstdma(
1850 				btcoexist, 0x51, 0x10, 0x03, 0x10,
1851 				0x54 | ps_tdma_byte4_modify);
1852 			break;
1853 		case 8:
1854 			halbtc8822b1ant_set_fw_pstdma(
1855 				btcoexist, 0x51, 0x10, 0x03, 0x10,
1856 				0x14 | ps_tdma_byte4_modify);
1857 			break;
1858 		case 11:
1859 			halbtc8822b1ant_set_fw_pstdma(
1860 				btcoexist, 0x61, 0x25, 0x03, 0x11,
1861 				0x10 | ps_tdma_byte4_modify);
1862 			break;
1863 		case 12:
1864 			halbtc8822b1ant_set_fw_pstdma(
1865 				btcoexist, 0x51, 0x30, 0x03, 0x10,
1866 				0x50 | ps_tdma_byte4_modify);
1867 			break;
1868 		case 13:
1869 			halbtc8822b1ant_set_fw_pstdma(
1870 				btcoexist, 0x51, 0x10, 0x07, 0x10,
1871 				0x54 | ps_tdma_byte4_modify);
1872 			break;
1873 		case 14:
1874 			halbtc8822b1ant_set_fw_pstdma(
1875 				btcoexist, 0x51, 0x15, 0x03, 0x10,
1876 				0x50 | ps_tdma_byte4_modify);
1877 			break;
1878 		case 15:
1879 			halbtc8822b1ant_set_fw_pstdma(
1880 				btcoexist, 0x51, 0x20, 0x03, 0x10,
1881 				0x10 | ps_tdma_byte4_modify);
1882 			break;
1883 		case 17:
1884 			halbtc8822b1ant_set_fw_pstdma(
1885 				btcoexist, 0x61, 0x10, 0x03, 0x11,
1886 				0x14 | ps_tdma_byte4_modify);
1887 			break;
1888 		case 18:
1889 			halbtc8822b1ant_set_fw_pstdma(
1890 				btcoexist, 0x51, 0x10, 0x03, 0x10,
1891 				0x50 | ps_tdma_byte4_modify);
1892 			break;
1893 
1894 		case 20:
1895 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x61, 0x30,
1896 						      0x03, 0x11, 0x10);
1897 			break;
1898 		case 22:
1899 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x61, 0x25,
1900 						      0x03, 0x11, 0x10);
1901 			break;
1902 		case 27:
1903 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x61, 0x10,
1904 						      0x03, 0x11, 0x15);
1905 			break;
1906 		case 32:
1907 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x61, 0x35,
1908 						      0x3, 0x11, 0x11);
1909 			break;
1910 		case 33:
1911 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x61, 0x35,
1912 						      0x03, 0x11, 0x10);
1913 			break;
1914 		case 41:
1915 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x51, 0x45,
1916 						      0x3, 0x11, 0x11);
1917 			break;
1918 		case 42:
1919 			halbtc8822b1ant_set_fw_pstdma(
1920 				btcoexist, 0x51, 0x1e, 0x3, 0x10,
1921 				0x14 | ps_tdma_byte4_modify);
1922 			break;
1923 		case 43:
1924 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x51, 0x45,
1925 						      0x3, 0x10, 0x14);
1926 			break;
1927 		case 44:
1928 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x51, 0x25,
1929 						      0x3, 0x10, 0x10);
1930 			break;
1931 		case 45:
1932 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x51, 0x29,
1933 						      0x3, 0x10, 0x10);
1934 			break;
1935 		case 46:
1936 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x51, 0x1a,
1937 						      0x3, 0x10, 0x10);
1938 			break;
1939 		case 47:
1940 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x51, 0x32,
1941 						      0x3, 0x10, 0x10);
1942 			break;
1943 		case 48:
1944 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x51, 0x29,
1945 						      0x3, 0x10, 0x10);
1946 			break;
1947 		case 49:
1948 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x55, 0x10,
1949 						      0x3, 0x10, 0x54);
1950 			break;
1951 		case 50:
1952 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x51, 0x4a,
1953 						      0x3, 0x10, 0x10);
1954 			break;
1955 		case 51:
1956 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x61, 0x35,
1957 						      0x3, 0x10, 0x11);
1958 			break;
1959 		}
1960 	} else {
1961 		switch (type) {
1962 		case 0:
1963 		default: /* Software control, Antenna at BT side */
1964 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x0, 0x0, 0x0,
1965 						      0x0, 0x0);
1966 			break;
1967 		case 8: /* PTA Control */
1968 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x8, 0x0, 0x0,
1969 						      0x0, 0x0);
1970 			break;
1971 		case 9: /* Software control, Antenna at WiFi side */
1972 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x0, 0x0, 0x0,
1973 						      0x0, 0x0);
1974 			break;
1975 		case 10: /* under 5G , 0x778=1*/
1976 			halbtc8822b1ant_set_fw_pstdma(btcoexist, 0x0, 0x0, 0x0,
1977 						      0x0, 0x0);
1978 
1979 			break;
1980 		}
1981 	}
1982 
1983 	if (!coex_sta->is_set_ps_state_fail) {
1984 		/* update pre state */
1985 		coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1986 		coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1987 	}
1988 }
1989 
halbtc8822b1ant_sw_mechanism(struct btc_coexist * btcoexist,bool low_penalty_ra)1990 static void halbtc8822b1ant_sw_mechanism(struct btc_coexist *btcoexist,
1991 					 bool low_penalty_ra)
1992 {
1993 	halbtc8822b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
1994 }
1995 
1996 /* rf4 type by efuse, and for ant at main aux inverse use,
1997  * because is 2x2, and control types are the same, does not need
1998  */
1999 
halbtc8822b1ant_set_rfe_type(struct btc_coexist * btcoexist)2000 static void halbtc8822b1ant_set_rfe_type(struct btc_coexist *btcoexist)
2001 {
2002 	struct btc_board_info *board_info = &btcoexist->board_info;
2003 
2004 	/* Ext switch buffer mux */
2005 	btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
2006 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991, 0x3, 0x0);
2007 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe, 0x8, 0x0);
2008 
2009 	/* the following setup should be got from Efuse in the future */
2010 	rfe_type->rfe_module_type = board_info->rfe_type;
2011 
2012 	rfe_type->ext_ant_switch_ctrl_polarity = 0;
2013 
2014 	switch (rfe_type->rfe_module_type) {
2015 	case 0:
2016 	default:
2017 		rfe_type->ext_ant_switch_exist = true;
2018 		rfe_type->ext_ant_switch_type =
2019 			BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SPDT;
2020 		break;
2021 	case 1:
2022 		rfe_type->ext_ant_switch_exist = true;
2023 		rfe_type->ext_ant_switch_type =
2024 			BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SPDT;
2025 		break;
2026 	case 2:
2027 		rfe_type->ext_ant_switch_exist = true;
2028 		rfe_type->ext_ant_switch_type =
2029 			BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SPDT;
2030 		break;
2031 	case 3:
2032 		rfe_type->ext_ant_switch_exist = true;
2033 		rfe_type->ext_ant_switch_type =
2034 			BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SPDT;
2035 		break;
2036 	case 4:
2037 		rfe_type->ext_ant_switch_exist = true;
2038 		rfe_type->ext_ant_switch_type =
2039 			BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SPDT;
2040 		break;
2041 	case 5:
2042 		rfe_type->ext_ant_switch_exist = true;
2043 		rfe_type->ext_ant_switch_type =
2044 			BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SPDT;
2045 		break;
2046 	case 6:
2047 		rfe_type->ext_ant_switch_exist = true;
2048 		rfe_type->ext_ant_switch_type =
2049 			BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SPDT;
2050 		break;
2051 	case 7:
2052 		rfe_type->ext_ant_switch_exist = true;
2053 		rfe_type->ext_ant_switch_type =
2054 			BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SPDT;
2055 		break;
2056 	}
2057 }
2058 
2059 /*anttenna control by bb mac bt antdiv pta to write 0x4c 0xcb4,0xcbd*/
2060 
halbtc8822b1ant_set_ext_ant_switch(struct btc_coexist * btcoexist,bool force_exec,u8 ctrl_type,u8 pos_type)2061 static void halbtc8822b1ant_set_ext_ant_switch(struct btc_coexist *btcoexist,
2062 					       bool force_exec, u8 ctrl_type,
2063 					       u8 pos_type)
2064 {
2065 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2066 	bool switch_polatiry_inverse = false;
2067 	u8 regval_0xcbd = 0, regval_0x64;
2068 	u32 u32tmp1 = 0, u32tmp2 = 0, u32tmp3 = 0;
2069 
2070 	/* Ext switch buffer mux */
2071 	btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
2072 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991, 0x3, 0x0);
2073 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe, 0x8, 0x0);
2074 
2075 	if (!rfe_type->ext_ant_switch_exist)
2076 		return;
2077 
2078 	coex_dm->cur_ext_ant_switch_status = (ctrl_type << 8) + pos_type;
2079 
2080 	if (!force_exec) {
2081 		if (coex_dm->pre_ext_ant_switch_status ==
2082 		    coex_dm->cur_ext_ant_switch_status)
2083 			return;
2084 	}
2085 
2086 	coex_dm->pre_ext_ant_switch_status = coex_dm->cur_ext_ant_switch_status;
2087 
2088 	/* swap control polarity if use different switch control polarity*/
2089 	/* Normal switch polarity for SPDT,
2090 	 * 0xcbd[1:0] = 2b'01 => Ant to BTG,
2091 	 * 0xcbd[1:0] = 2b'10 => Ant to WLG
2092 	 */
2093 	switch_polatiry_inverse = rfe_type->ext_ant_switch_ctrl_polarity == 1;
2094 
2095 	switch (pos_type) {
2096 	default:
2097 	case BT_8822B_1ANT_EXT_ANT_SWITCH_TO_BT:
2098 	case BT_8822B_1ANT_EXT_ANT_SWITCH_TO_NOCARE:
2099 
2100 		break;
2101 	case BT_8822B_1ANT_EXT_ANT_SWITCH_TO_WLG:
2102 		break;
2103 	case BT_8822B_1ANT_EXT_ANT_SWITCH_TO_WLA:
2104 		break;
2105 	}
2106 
2107 	if (rfe_type->ext_ant_switch_type ==
2108 	    BT_8822B_1ANT_EXT_ANT_SWITCH_USE_SPDT) {
2109 		switch (ctrl_type) {
2110 		default:
2111 		case BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_BBSW:
2112 			/*  0x4c[23] = 0 */
2113 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
2114 							   0x80, 0x0);
2115 			/* 0x4c[24] = 1 */
2116 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
2117 							   0x01, 0x1);
2118 			/* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin*/
2119 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb4,
2120 							   0xff, 0x77);
2121 
2122 			/* 0xcbd[1:0] = 2b'01 for no switch_polatiry_inverse,
2123 			 * ANTSWB =1, ANTSW =0
2124 			 */
2125 			regval_0xcbd = (!switch_polatiry_inverse ? 0x1 : 0x2);
2126 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
2127 							   0x3, regval_0xcbd);
2128 
2129 			break;
2130 		case BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_PTA:
2131 			/* 0x4c[23] = 0 */
2132 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
2133 							   0x80, 0x0);
2134 			/* 0x4c[24] = 1 */
2135 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
2136 							   0x01, 0x1);
2137 			/* PTA,  DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */
2138 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb4,
2139 							   0xff, 0x66);
2140 
2141 			/* 0xcbd[1:0] = 2b'10 for no switch_polatiry_inverse,
2142 			 * ANTSWB =1, ANTSW =0  @ GNT_BT=1
2143 			 */
2144 			regval_0xcbd = (!switch_polatiry_inverse ? 0x2 : 0x1);
2145 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
2146 							   0x3, regval_0xcbd);
2147 
2148 			break;
2149 		case BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_ANTDIV:
2150 			/* 0x4c[23] = 0 */
2151 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
2152 							   0x80, 0x0);
2153 			/* 0x4c[24] = 1 */
2154 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
2155 							   0x01, 0x1);
2156 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb4,
2157 							   0xff, 0x88);
2158 
2159 			/* no regval_0xcbd setup required, because
2160 			 * antenna switch control value by antenna diversity
2161 			 */
2162 
2163 			break;
2164 		case BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_MAC:
2165 			/*  0x4c[23] = 1 */
2166 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
2167 							   0x80, 0x1);
2168 
2169 			/* 0x64[0] = 1b'0 for no switch_polatiry_inverse,
2170 			 * DPDT_SEL_N =1, DPDT_SEL_P =0
2171 			 */
2172 			regval_0x64 = (!switch_polatiry_inverse ? 0x0 : 0x1);
2173 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x64, 0x1,
2174 							   regval_0x64);
2175 			break;
2176 		case BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_BT:
2177 			/* 0x4c[23] = 0 */
2178 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
2179 							   0x80, 0x0);
2180 			/* 0x4c[24] = 0 */
2181 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
2182 							   0x01, 0x0);
2183 
2184 			/* no setup required, because antenna switch control
2185 			 * value by BT vendor 0xac[1:0]
2186 			 */
2187 			break;
2188 		}
2189 	}
2190 
2191 	u32tmp1 = btcoexist->btc_read_4byte(btcoexist, 0xcbc);
2192 	u32tmp2 = btcoexist->btc_read_4byte(btcoexist, 0x4c);
2193 	u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0x64) & 0xff;
2194 
2195 	RT_TRACE(
2196 		rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2197 		"[BTCoex], ********** (After Ext Ant switch setup) 0xcbc = 0x%08x, 0x4c = 0x%08x, 0x64= 0x%02x**********\n",
2198 		u32tmp1, u32tmp2, u32tmp3);
2199 }
2200 
2201 /* set gnt_wl gnt_bt control by sw high low, or
2202  * hwpta while in power on, ini, wlan off, wlan only, wl2g non-currrent,
2203  * wl2g current, wl5g
2204  */
2205 
halbtc8822b1ant_set_ant_path(struct btc_coexist * btcoexist,u8 ant_pos_type,bool force_exec,u8 phase)2206 static void halbtc8822b1ant_set_ant_path(struct btc_coexist *btcoexist,
2207 					 u8 ant_pos_type, bool force_exec,
2208 					 u8 phase)
2209 
2210 {
2211 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2212 	u8 u8tmp = 0;
2213 	u32 u32tmp1 = 0;
2214 	u32 u32tmp2 = 0, u32tmp3 = 0;
2215 
2216 	u32tmp1 = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
2217 
2218 	/* To avoid indirect access fail  */
2219 	if (((u32tmp1 & 0xf000) >> 12) != ((u32tmp1 & 0x0f00) >> 8)) {
2220 		force_exec = true;
2221 		coex_sta->gnt_error_cnt++;
2222 
2223 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2224 			 "[BTCoex],(Before Ant Setup) 0x38= 0x%x\n", u32tmp1);
2225 	}
2226 
2227 	/* Ext switch buffer mux */
2228 	btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
2229 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991, 0x3, 0x0);
2230 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe, 0x8, 0x0);
2231 
2232 	coex_dm->cur_ant_pos_type = (ant_pos_type << 8) + phase;
2233 
2234 	if (!force_exec) {
2235 		if (coex_dm->cur_ant_pos_type == coex_dm->pre_ant_pos_type)
2236 			return;
2237 	}
2238 
2239 	coex_dm->pre_ant_pos_type = coex_dm->cur_ant_pos_type;
2240 
2241 	if (btcoexist->dbg_mode_1ant) {
2242 		u32tmp1 = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
2243 								    0x38);
2244 		u32tmp2 = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
2245 								    0x54);
2246 		u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
2247 
2248 		u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x73);
2249 
2250 		RT_TRACE(
2251 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2252 			"[BTCoex], ********** (Before Ant Setup) 0xcb4 = 0x%x, 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n",
2253 			u32tmp3, u8tmp, u32tmp1, u32tmp2);
2254 	}
2255 
2256 	switch (phase) {
2257 	case BT_8822B_1ANT_PHASE_COEX_INIT:
2258 		RT_TRACE(
2259 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2260 			"[BTCoex], ********** (set_ant_path - 1ANT_PHASE_COEX_INIT) **********\n");
2261 
2262 		/* Disable LTE Coex Function in WiFi side
2263 		 * (this should be on if LTE coex is required)
2264 		 */
2265 		halbtc8822b1ant_ltecoex_enable(btcoexist, 0x0);
2266 
2267 		/* GNT_WL_LTE always = 1
2268 		 * (this should be config if LTE coex is required)
2269 		 */
2270 		halbtc8822b1ant_ltecoex_set_coex_table(
2271 			btcoexist, BT_8822B_1ANT_CTT_WL_VS_LTE, 0xffff);
2272 
2273 		/* GNT_BT_LTE always = 1
2274 		 * (this should be config if LTE coex is required)
2275 		 */
2276 		halbtc8822b1ant_ltecoex_set_coex_table(
2277 			btcoexist, BT_8822B_1ANT_CTT_BT_VS_LTE, 0xffff);
2278 
2279 		/* set GNT_BT to SW high */
2280 		halbtc8822b1ant_ltecoex_set_gnt_bt(
2281 			btcoexist, BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2282 			BT_8822B_1ANT_GNT_CTRL_BY_SW,
2283 			BT_8822B_1ANT_SIG_STA_SET_TO_HIGH);
2284 
2285 		/* set GNT_WL to SW low */
2286 		halbtc8822b1ant_ltecoex_set_gnt_wl(
2287 			btcoexist, BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2288 			BT_8822B_1ANT_GNT_CTRL_BY_SW,
2289 			BT_8822B_1ANT_SIG_STA_SET_TO_LOW);
2290 
2291 		/* set Path control owner to WL at initial step */
2292 		halbtc8822b1ant_ltecoex_pathcontrol_owner(
2293 			btcoexist, BT_8822B_1ANT_PCO_WLSIDE);
2294 
2295 		coex_sta->run_time_state = false;
2296 
2297 		/* Ext switch buffer mux */
2298 		btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
2299 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991, 0x3, 0x0);
2300 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe, 0x8, 0x0);
2301 
2302 		if (ant_pos_type == BTC_ANT_PATH_AUTO)
2303 			ant_pos_type = BTC_ANT_PATH_BT;
2304 
2305 		break;
2306 	case BT_8822B_1ANT_PHASE_WLANONLY_INIT:
2307 		RT_TRACE(
2308 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2309 			"[BTCoex], ********** (set_ant_path - 1ANT_PHASE_WLANONLY_INIT) **********\n");
2310 
2311 		/* Disable LTE Coex Function in WiFi side
2312 		 * (this should be on if LTE coex is required)
2313 		 */
2314 		halbtc8822b1ant_ltecoex_enable(btcoexist, 0x0);
2315 
2316 		/* GNT_WL_LTE always = 1
2317 		 * (this should be config if LTE coex is required)
2318 		 */
2319 		halbtc8822b1ant_ltecoex_set_coex_table(
2320 			btcoexist, BT_8822B_1ANT_CTT_WL_VS_LTE, 0xffff);
2321 
2322 		/* GNT_BT_LTE always = 1
2323 		 * (this should be config if LTE coex is required)
2324 		 */
2325 		halbtc8822b1ant_ltecoex_set_coex_table(
2326 			btcoexist, BT_8822B_1ANT_CTT_BT_VS_LTE, 0xffff);
2327 
2328 		/* set GNT_BT to SW Low */
2329 		halbtc8822b1ant_ltecoex_set_gnt_bt(
2330 			btcoexist, BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2331 			BT_8822B_1ANT_GNT_CTRL_BY_SW,
2332 			BT_8822B_1ANT_SIG_STA_SET_TO_LOW);
2333 
2334 		/* Set GNT_WL to SW high */
2335 		halbtc8822b1ant_ltecoex_set_gnt_wl(
2336 			btcoexist, BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2337 			BT_8822B_1ANT_GNT_CTRL_BY_SW,
2338 			BT_8822B_1ANT_SIG_STA_SET_TO_HIGH);
2339 
2340 		/* set Path control owner to WL at initial step */
2341 		halbtc8822b1ant_ltecoex_pathcontrol_owner(
2342 			btcoexist, BT_8822B_1ANT_PCO_WLSIDE);
2343 
2344 		coex_sta->run_time_state = false;
2345 
2346 		/* Ext switch buffer mux */
2347 		btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
2348 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x1991, 0x3, 0x0);
2349 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbe, 0x8, 0x0);
2350 
2351 		if (ant_pos_type == BTC_ANT_PATH_AUTO)
2352 			ant_pos_type = BTC_ANT_PATH_WIFI;
2353 
2354 		break;
2355 	case BT_8822B_1ANT_PHASE_WLAN_OFF:
2356 		RT_TRACE(
2357 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2358 			"[BTCoex], ********** (set_ant_path - 1ANT_PHASE_WLAN_OFF) **********\n");
2359 
2360 		/* Disable LTE Coex Function in WiFi side */
2361 		halbtc8822b1ant_ltecoex_enable(btcoexist, 0x0);
2362 
2363 		/* set Path control owner to BT */
2364 		halbtc8822b1ant_ltecoex_pathcontrol_owner(
2365 			btcoexist, BT_8822B_1ANT_PCO_BTSIDE);
2366 
2367 		/* Set Ext Ant Switch to BT control at wifi off step */
2368 		halbtc8822b1ant_set_ext_ant_switch(
2369 			btcoexist, FORCE_EXEC,
2370 			BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_BT,
2371 			BT_8822B_1ANT_EXT_ANT_SWITCH_TO_NOCARE);
2372 
2373 		coex_sta->run_time_state = false;
2374 
2375 		break;
2376 	case BT_8822B_1ANT_PHASE_2G_RUNTIME:
2377 		RT_TRACE(
2378 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2379 			"[BTCoex], ********** (set_ant_path - 1ANT_PHASE_2G_RUNTIME) **********\n");
2380 
2381 		/* set GNT_BT to PTA */
2382 		halbtc8822b1ant_ltecoex_set_gnt_bt(
2383 			btcoexist, BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2384 			BT_8822B_1ANT_GNT_CTRL_BY_PTA,
2385 			BT_8822B_1ANT_SIG_STA_SET_BY_HW);
2386 
2387 		/* Set GNT_WL to PTA */
2388 		halbtc8822b1ant_ltecoex_set_gnt_wl(
2389 			btcoexist, BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2390 			BT_8822B_1ANT_GNT_CTRL_BY_PTA,
2391 			BT_8822B_1ANT_SIG_STA_SET_BY_HW);
2392 
2393 		/* set Path control owner to WL at runtime step */
2394 		halbtc8822b1ant_ltecoex_pathcontrol_owner(
2395 			btcoexist, BT_8822B_1ANT_PCO_WLSIDE);
2396 
2397 		coex_sta->run_time_state = true;
2398 
2399 		if (ant_pos_type == BTC_ANT_PATH_AUTO)
2400 			ant_pos_type = BTC_ANT_PATH_PTA;
2401 
2402 		break;
2403 	case BT_8822B_1ANT_PHASE_5G_RUNTIME:
2404 		RT_TRACE(
2405 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2406 			"[BTCoex], ********** (set_ant_path - 1ANT_PHASE_5G_RUNTIME) **********\n");
2407 
2408 		/* set GNT_BT to SW Hi */
2409 		halbtc8822b1ant_ltecoex_set_gnt_bt(
2410 			btcoexist, BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2411 			BT_8822B_1ANT_GNT_CTRL_BY_SW,
2412 			BT_8822B_1ANT_SIG_STA_SET_TO_HIGH);
2413 
2414 		/* Set GNT_WL to SW Hi */
2415 		halbtc8822b1ant_ltecoex_set_gnt_wl(
2416 			btcoexist, BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2417 			BT_8822B_1ANT_GNT_CTRL_BY_SW,
2418 			BT_8822B_1ANT_SIG_STA_SET_TO_HIGH);
2419 
2420 		/* set Path control owner to WL at runtime step */
2421 		halbtc8822b1ant_ltecoex_pathcontrol_owner(
2422 			btcoexist, BT_8822B_1ANT_PCO_WLSIDE);
2423 
2424 		coex_sta->run_time_state = true;
2425 
2426 		if (ant_pos_type == BTC_ANT_PATH_AUTO)
2427 			ant_pos_type = BTC_ANT_PATH_WIFI5G;
2428 
2429 		break;
2430 	case BT_8822B_1ANT_PHASE_BTMPMODE:
2431 		RT_TRACE(
2432 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2433 			"[BTCoex], ********** (set_ant_path - 1ANT_PHASE_BTMPMODE) **********\n");
2434 
2435 		/* Disable LTE Coex Function in WiFi side */
2436 		halbtc8822b1ant_ltecoex_enable(btcoexist, 0x0);
2437 
2438 		/* set GNT_BT to SW Hi */
2439 		halbtc8822b1ant_ltecoex_set_gnt_bt(
2440 			btcoexist, BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2441 			BT_8822B_1ANT_GNT_CTRL_BY_SW,
2442 			BT_8822B_1ANT_SIG_STA_SET_TO_HIGH);
2443 
2444 		/* Set GNT_WL to SW Lo */
2445 		halbtc8822b1ant_ltecoex_set_gnt_wl(
2446 			btcoexist, BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
2447 			BT_8822B_1ANT_GNT_CTRL_BY_SW,
2448 			BT_8822B_1ANT_SIG_STA_SET_TO_LOW);
2449 
2450 		/* set Path control owner to WL */
2451 		halbtc8822b1ant_ltecoex_pathcontrol_owner(
2452 			btcoexist, BT_8822B_1ANT_PCO_WLSIDE);
2453 
2454 		coex_sta->run_time_state = false;
2455 
2456 		/* Set Ext Ant Switch to BT side at BT MP mode */
2457 		if (ant_pos_type == BTC_ANT_PATH_AUTO)
2458 			ant_pos_type = BTC_ANT_PATH_BT;
2459 
2460 		break;
2461 	}
2462 
2463 	if (phase != BT_8822B_1ANT_PHASE_WLAN_OFF) {
2464 		switch (ant_pos_type) {
2465 		case BTC_ANT_PATH_WIFI:
2466 			halbtc8822b1ant_set_ext_ant_switch(
2467 				btcoexist, force_exec,
2468 				BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_BBSW,
2469 				BT_8822B_1ANT_EXT_ANT_SWITCH_TO_WLG);
2470 			break;
2471 		case BTC_ANT_PATH_WIFI5G:
2472 			halbtc8822b1ant_set_ext_ant_switch(
2473 				btcoexist, force_exec,
2474 				BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_BBSW,
2475 				BT_8822B_1ANT_EXT_ANT_SWITCH_TO_WLA);
2476 			break;
2477 		case BTC_ANT_PATH_BT:
2478 			halbtc8822b1ant_set_ext_ant_switch(
2479 				btcoexist, force_exec,
2480 				BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_BBSW,
2481 				BT_8822B_1ANT_EXT_ANT_SWITCH_TO_BT);
2482 			break;
2483 		default:
2484 		case BTC_ANT_PATH_PTA:
2485 			halbtc8822b1ant_set_ext_ant_switch(
2486 				btcoexist, force_exec,
2487 				BT_8822B_1ANT_EXT_ANT_SWITCH_CTRL_BY_PTA,
2488 				BT_8822B_1ANT_EXT_ANT_SWITCH_TO_NOCARE);
2489 			break;
2490 		}
2491 	}
2492 
2493 	if (btcoexist->dbg_mode_1ant) {
2494 		u32tmp1 = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
2495 								    0x38);
2496 		u32tmp2 = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
2497 								    0x54);
2498 		u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
2499 
2500 		u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x73);
2501 
2502 		RT_TRACE(
2503 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2504 			"[BTCoex], ********** (After Ant Setup) 0xcb4 = 0x%x, 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n",
2505 			u32tmp3, u8tmp, u32tmp1, u32tmp2);
2506 	}
2507 }
2508 
halbtc8822b1ant_is_common_action(struct btc_coexist * btcoexist)2509 static bool halbtc8822b1ant_is_common_action(struct btc_coexist *btcoexist)
2510 {
2511 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2512 	bool common = false, wifi_connected = false, wifi_busy = false;
2513 
2514 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2515 			   &wifi_connected);
2516 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2517 
2518 	if (!wifi_connected &&
2519 	    coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_NON_CONNECTED_IDLE) {
2520 		RT_TRACE(
2521 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2522 			"[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n");
2523 
2524 		/* halbtc8822b1ant_sw_mechanism(btcoexist, false); */
2525 
2526 		common = true;
2527 	} else if (wifi_connected &&
2528 		   (coex_dm->bt_status ==
2529 		    BT_8822B_1ANT_BT_STATUS_NON_CONNECTED_IDLE)) {
2530 		RT_TRACE(
2531 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2532 			"[BTCoex], Wifi connected + BT non connected-idle!!\n");
2533 
2534 		/* halbtc8822b1ant_sw_mechanism(btcoexist, false); */
2535 
2536 		common = true;
2537 	} else if (!wifi_connected && (BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE ==
2538 				       coex_dm->bt_status)) {
2539 		RT_TRACE(
2540 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2541 			"[BTCoex], Wifi non connected-idle + BT connected-idle!!\n");
2542 
2543 		/* halbtc8822b1ant_sw_mechanism(btcoexist, false); */
2544 
2545 		common = true;
2546 	} else if (wifi_connected && (BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE ==
2547 				      coex_dm->bt_status)) {
2548 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2549 			 "[BTCoex], Wifi connected + BT connected-idle!!\n");
2550 
2551 		/* halbtc8822b1ant_sw_mechanism(btcoexist, false); */
2552 
2553 		common = true;
2554 	} else if (!wifi_connected && (BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE !=
2555 				       coex_dm->bt_status)) {
2556 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2557 			 "[BTCoex], Wifi non connected-idle + BT Busy!!\n");
2558 
2559 		/* halbtc8822b1ant_sw_mechanism(btcoexist, false); */
2560 
2561 		common = true;
2562 	} else {
2563 		if (wifi_busy) {
2564 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2565 				 "[BTCoex], Wifi Connected-Busy + BT Busy!!\n");
2566 		} else {
2567 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2568 				 "[BTCoex], Wifi Connected-Idle + BT Busy!!\n");
2569 		}
2570 
2571 		common = false;
2572 	}
2573 
2574 	return common;
2575 }
2576 
halbtc8822b1ant_action_wifi_under5g(struct btc_coexist * btcoexist)2577 static void halbtc8822b1ant_action_wifi_under5g(struct btc_coexist *btcoexist)
2578 {
2579 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2580 
2581 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2582 		 "[BTCoex], under 5g start\n");
2583 	/* for test : s3 bt disappear , fail rate 1/600*/
2584 	/*set sw gnt wl bt  high*/
2585 	halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, FORCE_EXEC,
2586 				     BT_8822B_1ANT_PHASE_5G_RUNTIME);
2587 
2588 	halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2589 	halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2590 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd, 0x3, 1);
2591 }
2592 
halbtc8822b1ant_action_wifi_only(struct btc_coexist * btcoexist)2593 static void halbtc8822b1ant_action_wifi_only(struct btc_coexist *btcoexist)
2594 {
2595 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2596 	bool wifi_under_5g = false, rf4ce_enabled = false;
2597 
2598 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2599 	if (wifi_under_5g) {
2600 		halbtc8822b1ant_action_wifi_under5g(btcoexist);
2601 
2602 		RT_TRACE(
2603 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2604 			"[BTCoex], ********** (wlan only -- under 5g ) **********\n");
2605 		return;
2606 	}
2607 
2608 	if (rf4ce_enabled) {
2609 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x45e, 0x8, 0x1);
2610 
2611 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 50);
2612 
2613 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
2614 		return;
2615 	}
2616 	halbtc8822b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
2617 	halbtc8822b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2618 
2619 	halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, FORCE_EXEC,
2620 				     BT_8822B_1ANT_PHASE_2G_RUNTIME);
2621 
2622 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2623 		 "[BTCoex], ********** (wlan only -- under 2g ) **********\n");
2624 }
2625 
2626 static void
halbtc8822b1ant_action_wifi_native_lps(struct btc_coexist * btcoexist)2627 halbtc8822b1ant_action_wifi_native_lps(struct btc_coexist *btcoexist)
2628 {
2629 	halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
2630 
2631 	halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2632 }
2633 
2634 /* *********************************************
2635  *
2636  *	Non-Software Coex Mechanism start
2637  *
2638  * **********************************************/
2639 
halbtc8822b1ant_action_bt_whck_test(struct btc_coexist * btcoexist)2640 static void halbtc8822b1ant_action_bt_whck_test(struct btc_coexist *btcoexist)
2641 {
2642 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2643 
2644 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2645 		 "[BTCoex],action_bt_whck_test\n");
2646 
2647 	halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2648 
2649 	halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
2650 				     BT_8822B_1ANT_PHASE_2G_RUNTIME);
2651 
2652 	halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2653 }
2654 
2655 static void
halbtc8822b1ant_action_wifi_multi_port(struct btc_coexist * btcoexist)2656 halbtc8822b1ant_action_wifi_multi_port(struct btc_coexist *btcoexist)
2657 {
2658 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2659 
2660 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2661 		 "[BTCoex],action_wifi_multi_port\n");
2662 
2663 	halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2664 
2665 	halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
2666 				     BT_8822B_1ANT_PHASE_2G_RUNTIME);
2667 
2668 	halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2669 }
2670 
halbtc8822b1ant_action_hs(struct btc_coexist * btcoexist)2671 static void halbtc8822b1ant_action_hs(struct btc_coexist *btcoexist)
2672 {
2673 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2674 
2675 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], action_hs\n");
2676 
2677 	halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
2678 
2679 	halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
2680 				     BT_8822B_1ANT_PHASE_2G_RUNTIME);
2681 
2682 	halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
2683 }
2684 
halbtc8822b1ant_action_bt_relink(struct btc_coexist * btcoexist)2685 static void halbtc8822b1ant_action_bt_relink(struct btc_coexist *btcoexist)
2686 {
2687 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2688 
2689 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2690 		 "[BTCoex], run bt multi link function\n");
2691 
2692 	if (coex_sta->is_bt_multi_link)
2693 		return;
2694 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2695 		 "[BTCoex], run bt_re-link function\n");
2696 
2697 	halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2698 	halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2699 }
2700 
2701 /*"""bt inquiry"""" + wifi any + bt any*/
2702 
halbtc8822b1ant_action_bt_inquiry(struct btc_coexist * btcoexist)2703 static void halbtc8822b1ant_action_bt_inquiry(struct btc_coexist *btcoexist)
2704 {
2705 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2706 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2707 	bool wifi_connected = false, ap_enable = false, wifi_busy = false,
2708 	     bt_busy = false, rf4ce_enabled = false;
2709 
2710 	bool wifi_scan = false, link = false, roam = false;
2711 
2712 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2713 		 "[BTCoex], ********** (bt inquiry) **********\n");
2714 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
2715 			   &ap_enable);
2716 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2717 			   &wifi_connected);
2718 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2719 	btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
2720 
2721 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &wifi_scan);
2722 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2723 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2724 
2725 	RT_TRACE(
2726 		rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2727 		"[BTCoex], ********** scan = %d,  link =%d, roam = %d**********\n",
2728 		wifi_scan, link, roam);
2729 
2730 	if ((link) || (roam) || (coex_sta->wifi_is_high_pri_task)) {
2731 		RT_TRACE(
2732 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2733 			"[BTCoex], ********** (bt inquiry wifi  connect or scan ) **********\n");
2734 
2735 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1);
2736 
2737 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
2738 
2739 	} else if ((wifi_scan) && (coex_sta->bt_create_connection)) {
2740 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
2741 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
2742 
2743 	} else if ((!wifi_connected) && (!wifi_scan)) {
2744 		RT_TRACE(
2745 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2746 			"[BTCoex], ********** (bt inquiry wifi non connect) **********\n");
2747 
2748 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2749 
2750 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2751 
2752 	} else if ((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) {
2753 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
2754 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2755 	} else if (bt_link_info->a2dp_exist) {
2756 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
2757 
2758 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3);
2759 	} else if (wifi_scan) {
2760 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
2761 
2762 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2763 	} else if (wifi_busy) {
2764 		/* for BT inquiry/page fail after S4 resume */
2765 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
2766 		/*aaaa->55aa for bt connect while wl busy*/
2767 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
2768 						     15);
2769 		if (rf4ce_enabled) {
2770 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x45e,
2771 							   0x8, 0x1);
2772 
2773 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2774 						50);
2775 
2776 			halbtc8822b1ant_coex_table_with_type(btcoexist,
2777 							     NORMAL_EXEC, 0);
2778 		}
2779 	} else {
2780 		RT_TRACE(
2781 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2782 			"[BTCoex], ********** (bt inquiry wifi connect) **********\n");
2783 
2784 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
2785 
2786 		halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
2787 					     NORMAL_EXEC,
2788 					     BT_8822B_1ANT_PHASE_2G_RUNTIME);
2789 
2790 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2791 	}
2792 }
2793 
2794 static void
halbtc8822b1ant_action_bt_sco_hid_only_busy(struct btc_coexist * btcoexist)2795 halbtc8822b1ant_action_bt_sco_hid_only_busy(struct btc_coexist *btcoexist)
2796 {
2797 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2798 	bool wifi_connected = false, wifi_busy = false;
2799 	u32 wifi_bw = 1;
2800 
2801 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2802 			   &wifi_connected);
2803 
2804 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2805 
2806 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2807 
2808 	if (bt_link_info->sco_exist) {
2809 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
2810 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
2811 	} else {
2812 		if (coex_sta->is_hid_low_pri_tx_overhead) {
2813 			halbtc8822b1ant_coex_table_with_type(btcoexist,
2814 							     NORMAL_EXEC, 6);
2815 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2816 						18);
2817 		} else if (wifi_bw == 0) { /* if 11bg mode */
2818 
2819 			if (coex_sta->is_bt_multi_link) {
2820 				halbtc8822b1ant_coex_table_with_type(
2821 					btcoexist, NORMAL_EXEC, 11);
2822 				halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2823 							true, 11);
2824 			} else {
2825 				halbtc8822b1ant_coex_table_with_type(
2826 					btcoexist, NORMAL_EXEC, 6);
2827 				halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2828 							true, 11);
2829 			}
2830 		} else {
2831 			halbtc8822b1ant_coex_table_with_type(btcoexist,
2832 							     NORMAL_EXEC, 6);
2833 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2834 						11);
2835 		}
2836 	}
2837 }
2838 
2839 static void
halbtc8822b1ant_action_wifi_connected_bt_acl_busy(struct btc_coexist * btcoexist)2840 halbtc8822b1ant_action_wifi_connected_bt_acl_busy(struct btc_coexist *btcoexist)
2841 {
2842 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2843 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2844 	bool wifi_busy = false, wifi_turbo = false;
2845 	u32 wifi_bw = 1;
2846 
2847 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2848 
2849 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2850 	btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
2851 			   &coex_sta->scan_ap_num);
2852 	RT_TRACE(
2853 		rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2854 		"############# [BTCoex],  scan_ap_num = %d, wl_noisy_level = %d\n",
2855 		coex_sta->scan_ap_num, coex_sta->wl_noisy_level);
2856 
2857 	if ((wifi_busy) && (coex_sta->wl_noisy_level == 0))
2858 		wifi_turbo = true;
2859 
2860 	if ((coex_sta->bt_relink_downcount != 0) &&
2861 	    (!bt_link_info->pan_exist) && (wifi_busy)) {
2862 		RT_TRACE(
2863 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2864 			"############# [BTCoex],  BT Re-Link + A2DP + WL busy\n");
2865 
2866 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2867 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2868 
2869 	} else if ((bt_link_info->a2dp_exist) && (coex_sta->is_bt_a2dp_sink)) {
2870 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 12);
2871 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
2872 	} else if (bt_link_info->a2dp_only) { /* A2DP		 */
2873 
2874 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 7);
2875 
2876 		if (wifi_turbo)
2877 			halbtc8822b1ant_coex_table_with_type(btcoexist,
2878 							     NORMAL_EXEC, 19);
2879 		else
2880 			halbtc8822b1ant_coex_table_with_type(btcoexist,
2881 							     NORMAL_EXEC, 4);
2882 	} else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) ||
2883 		   (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&
2884 		    bt_link_info->pan_exist)) {
2885 		/* A2DP+PAN(OPP,FTP), HID+A2DP+PAN(OPP,FTP) */
2886 
2887 		if (wifi_busy)
2888 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2889 						13);
2890 		else
2891 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2892 						14);
2893 
2894 		if (bt_link_info->hid_exist)
2895 			halbtc8822b1ant_coex_table_with_type(btcoexist,
2896 							     NORMAL_EXEC, 1);
2897 		else if (wifi_turbo)
2898 			halbtc8822b1ant_coex_table_with_type(btcoexist,
2899 							     NORMAL_EXEC, 19);
2900 		else
2901 			halbtc8822b1ant_coex_table_with_type(btcoexist,
2902 							     NORMAL_EXEC, 4);
2903 	} else if (bt_link_info->hid_exist &&
2904 		   bt_link_info->a2dp_exist) { /* HID+A2DP */
2905 
2906 		if (wifi_bw == 0) { /* if 11bg mode */
2907 			halbtc8822b1ant_coex_table_with_type(btcoexist,
2908 							     NORMAL_EXEC, 1);
2909 			halbtc8822b1ant_set_wltoggle_coex_table(
2910 				btcoexist, NORMAL_EXEC, 1, 0xaa, 0x5a, 0xaa,
2911 				0xaa);
2912 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2913 						49);
2914 		} else {
2915 			halbtc8822b1ant_coex_table_with_type(btcoexist,
2916 							     NORMAL_EXEC, 1);
2917 			halbtc8822b1ant_limited_rx(btcoexist, NORMAL_EXEC,
2918 						   false, true, 8);
2919 			halbtc8822b1ant_set_wltoggle_coex_table(
2920 				btcoexist, NORMAL_EXEC, 1, 0xaa, 0x5a, 0xaa,
2921 				0xaa);
2922 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2923 						49);
2924 		}
2925 		/* PAN(OPP,FTP), HID+PAN(OPP,FTP) */
2926 
2927 	} else if ((bt_link_info->pan_only) ||
2928 		   (bt_link_info->hid_exist && bt_link_info->pan_exist)) {
2929 		if (!wifi_busy)
2930 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2931 						4);
2932 		else
2933 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2934 						3);
2935 
2936 		if (bt_link_info->hid_exist)
2937 			halbtc8822b1ant_coex_table_with_type(btcoexist,
2938 							     NORMAL_EXEC, 1);
2939 		else if (wifi_turbo)
2940 			halbtc8822b1ant_coex_table_with_type(btcoexist,
2941 							     NORMAL_EXEC, 19);
2942 		else
2943 			halbtc8822b1ant_coex_table_with_type(btcoexist,
2944 							     NORMAL_EXEC, 4);
2945 	} else {
2946 		/* BT no-profile busy (0x9) */
2947 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);
2948 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
2949 	}
2950 }
2951 
2952 /*wifi not connected + bt action*/
2953 
2954 static void
halbtc8822b1ant_action_wifi_not_connected(struct btc_coexist * btcoexist)2955 halbtc8822b1ant_action_wifi_not_connected(struct btc_coexist *btcoexist)
2956 {
2957 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2958 	bool rf4ce_enabled = false;
2959 
2960 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2961 		 "[BTCoex], ********** (wifi not connect) **********\n");
2962 
2963 	/* tdma and coex table */
2964 	if (rf4ce_enabled) {
2965 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x45e, 0x8, 0x1);
2966 
2967 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 50);
2968 
2969 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
2970 		return;
2971 	}
2972 	halbtc8822b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2973 
2974 	halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
2975 				     BT_8822B_1ANT_PHASE_2G_RUNTIME);
2976 
2977 	halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2978 }
2979 
2980 /*""""wl not connected scan"""" + bt action*/
2981 static void
halbtc8822b1ant_action_wifi_not_connected_scan(struct btc_coexist * btcoexist)2982 halbtc8822b1ant_action_wifi_not_connected_scan(struct btc_coexist *btcoexist)
2983 {
2984 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2985 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2986 	bool bt_hs_on = false;
2987 	u32 wifi_link_status = 0;
2988 	u32 num_of_wifi_link = 0;
2989 	bool bt_ctrl_agg_buf_size = false;
2990 	u8 agg_buf_size = 5;
2991 
2992 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2993 		 "[BTCoex], ********** (wifi non connect scan) **********\n");
2994 
2995 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2996 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2997 			   &wifi_link_status);
2998 
2999 	num_of_wifi_link = wifi_link_status >> 16;
3000 
3001 	if (num_of_wifi_link >= 2) {
3002 		halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3003 		halbtc8822b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3004 					   bt_ctrl_agg_buf_size, agg_buf_size);
3005 
3006 		if (coex_sta->c2h_bt_inquiry_page) {
3007 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3008 				 "############# [BTCoex],  BT Is Inquirying\n");
3009 			halbtc8822b1ant_action_bt_inquiry(btcoexist);
3010 		} else {
3011 			halbtc8822b1ant_action_wifi_multi_port(btcoexist);
3012 		}
3013 		return;
3014 	}
3015 
3016 	if (coex_sta->c2h_bt_inquiry_page) {
3017 		halbtc8822b1ant_action_bt_inquiry(btcoexist);
3018 		return;
3019 	} else if (bt_hs_on) {
3020 		halbtc8822b1ant_action_hs(btcoexist);
3021 		return;
3022 	}
3023 
3024 	/* tdma and coex table */
3025 	if (coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_ACL_BUSY) {
3026 		if (bt_link_info->a2dp_exist) {
3027 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3028 						32);
3029 			halbtc8822b1ant_coex_table_with_type(btcoexist,
3030 							     NORMAL_EXEC, 1);
3031 		} else if (bt_link_info->a2dp_exist &&
3032 			   bt_link_info->pan_exist) {
3033 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3034 						22);
3035 			halbtc8822b1ant_coex_table_with_type(btcoexist,
3036 							     NORMAL_EXEC, 1);
3037 		} else {
3038 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3039 						20);
3040 			halbtc8822b1ant_coex_table_with_type(btcoexist,
3041 							     NORMAL_EXEC, 1);
3042 		}
3043 	} else if ((coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_SCO_BUSY) ||
3044 		   (BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
3045 		    coex_dm->bt_status)) {
3046 		halbtc8822b1ant_action_bt_sco_hid_only_busy(btcoexist);
3047 	} else {
3048 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
3049 
3050 		halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3051 					     NORMAL_EXEC,
3052 					     BT_8822B_1ANT_PHASE_2G_RUNTIME);
3053 
3054 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
3055 	}
3056 }
3057 
3058 /*""""wl not connected asso"""" + bt action*/
3059 
halbtc8822b1ant_action_wifi_not_connected_asso_auth(struct btc_coexist * btcoexist)3060 static void halbtc8822b1ant_action_wifi_not_connected_asso_auth(
3061 	struct btc_coexist *btcoexist)
3062 {
3063 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3064 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3065 	bool bt_hs_on = false;
3066 	u32 wifi_link_status = 0;
3067 	u32 num_of_wifi_link = 0;
3068 	bool bt_ctrl_agg_buf_size = false;
3069 	u8 agg_buf_size = 5;
3070 
3071 	RT_TRACE(
3072 		rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3073 		"[BTCoex], ********** (wifi non connect asso_auth) **********\n");
3074 
3075 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3076 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3077 			   &wifi_link_status);
3078 
3079 	num_of_wifi_link = wifi_link_status >> 16;
3080 
3081 	if (num_of_wifi_link >= 2) {
3082 		halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3083 		halbtc8822b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3084 					   bt_ctrl_agg_buf_size, agg_buf_size);
3085 
3086 		if (coex_sta->c2h_bt_inquiry_page) {
3087 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3088 				 "############# [BTCoex],  BT Is Inquirying\n");
3089 			halbtc8822b1ant_action_bt_inquiry(btcoexist);
3090 		} else {
3091 			halbtc8822b1ant_action_wifi_multi_port(btcoexist);
3092 		}
3093 		return;
3094 	}
3095 
3096 	if (coex_sta->c2h_bt_inquiry_page) {
3097 		halbtc8822b1ant_action_bt_inquiry(btcoexist);
3098 		return;
3099 	} else if (bt_hs_on) {
3100 		halbtc8822b1ant_action_hs(btcoexist);
3101 		return;
3102 	}
3103 
3104 	/* tdma and coex table */
3105 	if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) ||
3106 	    (bt_link_info->a2dp_exist)) {
3107 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
3108 		halbtc8822b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);
3109 	} else if (bt_link_info->pan_exist) {
3110 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
3111 		halbtc8822b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);
3112 	} else {
3113 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
3114 
3115 		halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3116 					     NORMAL_EXEC,
3117 					     BT_8822B_1ANT_PHASE_2G_RUNTIME);
3118 
3119 		halbtc8822b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2);
3120 	}
3121 }
3122 
3123 /*""""wl  connected scan"""" + bt action*/
3124 
3125 static void
halbtc8822b1ant_action_wifi_connected_scan(struct btc_coexist * btcoexist)3126 halbtc8822b1ant_action_wifi_connected_scan(struct btc_coexist *btcoexist)
3127 {
3128 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3129 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3130 	bool bt_hs_on = false;
3131 	u32 wifi_link_status = 0;
3132 	u32 num_of_wifi_link = 0;
3133 	bool bt_ctrl_agg_buf_size = false;
3134 	u8 agg_buf_size = 5;
3135 
3136 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3137 		 "[BTCoex], ********** (wifi connect scan) **********\n");
3138 
3139 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3140 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3141 			   &wifi_link_status);
3142 
3143 	num_of_wifi_link = wifi_link_status >> 16;
3144 
3145 	if (num_of_wifi_link >= 2) {
3146 		halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3147 		halbtc8822b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3148 					   bt_ctrl_agg_buf_size, agg_buf_size);
3149 
3150 		if (coex_sta->c2h_bt_inquiry_page) {
3151 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3152 				 "############# [BTCoex],  BT Is Inquirying\n");
3153 			halbtc8822b1ant_action_bt_inquiry(btcoexist);
3154 		} else {
3155 			halbtc8822b1ant_action_wifi_multi_port(btcoexist);
3156 		}
3157 		return;
3158 	}
3159 
3160 	if (coex_sta->c2h_bt_inquiry_page) {
3161 		halbtc8822b1ant_action_bt_inquiry(btcoexist);
3162 		return;
3163 	} else if (bt_hs_on) {
3164 		halbtc8822b1ant_action_hs(btcoexist);
3165 		return;
3166 	}
3167 
3168 	/* tdma and coex table */
3169 	if (coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_ACL_BUSY) {
3170 		if (bt_link_info->a2dp_exist) {
3171 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3172 						32);
3173 			halbtc8822b1ant_coex_table_with_type(btcoexist,
3174 							     NORMAL_EXEC, 1);
3175 		} else if (bt_link_info->a2dp_exist &&
3176 			   bt_link_info->pan_exist) {
3177 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3178 						22);
3179 			halbtc8822b1ant_coex_table_with_type(btcoexist,
3180 							     NORMAL_EXEC, 1);
3181 		} else {
3182 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
3183 						20);
3184 			halbtc8822b1ant_coex_table_with_type(btcoexist,
3185 							     NORMAL_EXEC, 1);
3186 		}
3187 	} else if ((coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_SCO_BUSY) ||
3188 		   (BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
3189 		    coex_dm->bt_status)) {
3190 		halbtc8822b1ant_action_bt_sco_hid_only_busy(btcoexist);
3191 	} else {
3192 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
3193 
3194 		halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3195 					     NORMAL_EXEC,
3196 					     BT_8822B_1ANT_PHASE_2G_RUNTIME);
3197 
3198 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 6);
3199 	}
3200 }
3201 
3202 /*""""wl  connected specific packet"""" + bt action*/
3203 
halbtc8822b1ant_action_wifi_connected_specific_packet(struct btc_coexist * btcoexist)3204 static void halbtc8822b1ant_action_wifi_connected_specific_packet(
3205 	struct btc_coexist *btcoexist)
3206 {
3207 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3208 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3209 	bool bt_hs_on = false;
3210 	u32 wifi_link_status = 0;
3211 	u32 num_of_wifi_link = 0;
3212 	bool bt_ctrl_agg_buf_size = false;
3213 	u8 agg_buf_size = 5;
3214 	bool wifi_busy = false;
3215 
3216 	RT_TRACE(
3217 		rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3218 		"[BTCoex], ********** (wifi connect specific packet) **********\n");
3219 
3220 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3221 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3222 			   &wifi_link_status);
3223 
3224 	num_of_wifi_link = wifi_link_status >> 16;
3225 
3226 	if (num_of_wifi_link >= 2) {
3227 		halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3228 		halbtc8822b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3229 					   bt_ctrl_agg_buf_size, agg_buf_size);
3230 
3231 		if (coex_sta->c2h_bt_inquiry_page) {
3232 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3233 				 "############# [BTCoex],  BT Is Inquirying\n");
3234 			halbtc8822b1ant_action_bt_inquiry(btcoexist);
3235 		} else {
3236 			halbtc8822b1ant_action_wifi_multi_port(btcoexist);
3237 		}
3238 		return;
3239 	}
3240 
3241 	if (coex_sta->c2h_bt_inquiry_page) {
3242 		halbtc8822b1ant_action_bt_inquiry(btcoexist);
3243 		return;
3244 	} else if (bt_hs_on) {
3245 		halbtc8822b1ant_action_hs(btcoexist);
3246 		return;
3247 	}
3248 
3249 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3250 
3251 	/* no specific packet process for both WiFi and BT very busy */
3252 	if ((wifi_busy) &&
3253 	    ((bt_link_info->pan_exist) || (coex_sta->num_of_profile >= 2)))
3254 		return;
3255 
3256 	/* tdma and coex table */
3257 	if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) {
3258 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
3259 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
3260 	} else if (bt_link_info->a2dp_exist) {
3261 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
3262 		/*for a2dp glitch,change from 1 to 15*/
3263 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
3264 						     15);
3265 	} else if (bt_link_info->pan_exist) {
3266 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
3267 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
3268 	} else {
3269 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
3270 
3271 		halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3272 					     NORMAL_EXEC,
3273 					     BT_8822B_1ANT_PHASE_2G_RUNTIME);
3274 
3275 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
3276 	}
3277 }
3278 
3279 /* wifi connected input point:
3280  * to set different ps and tdma case (+bt different case)
3281  */
3282 
halbtc8822b1ant_action_wifi_connected(struct btc_coexist * btcoexist)3283 static void halbtc8822b1ant_action_wifi_connected(struct btc_coexist *btcoexist)
3284 {
3285 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3286 	bool wifi_busy = false, rf4ce_enabled = false;
3287 	bool scan = false, link = false, roam = false;
3288 	bool under_4way = false, ap_enable = false, wifi_under_5g = false;
3289 	u8 wifi_rssi_state;
3290 
3291 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3292 		 "[BTCoex], CoexForWifiConnect()===>\n");
3293 
3294 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3295 
3296 	if (wifi_under_5g) {
3297 		RT_TRACE(
3298 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3299 			"[BTCoex], CoexForWifiConnect(), return for wifi is under 5g<===\n");
3300 
3301 		halbtc8822b1ant_action_wifi_under5g(btcoexist);
3302 
3303 		return;
3304 	}
3305 
3306 	RT_TRACE(
3307 		rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3308 		"[BTCoex], CoexForWifiConnect(), return for wifi is under 2g<===\n");
3309 
3310 	halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
3311 				     BT_8822B_1ANT_PHASE_2G_RUNTIME);
3312 
3313 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
3314 			   &under_4way);
3315 
3316 	if (under_4way) {
3317 		halbtc8822b1ant_action_wifi_connected_specific_packet(
3318 			btcoexist);
3319 		RT_TRACE(
3320 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3321 			"[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n");
3322 		return;
3323 	}
3324 
3325 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3326 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3327 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3328 	if (scan || link || roam) {
3329 		if (scan)
3330 			halbtc8822b1ant_action_wifi_connected_scan(btcoexist);
3331 		else
3332 			halbtc8822b1ant_action_wifi_connected_specific_packet(
3333 				btcoexist);
3334 		RT_TRACE(
3335 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3336 			"[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n");
3337 		return;
3338 	}
3339 
3340 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
3341 			   &ap_enable);
3342 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3343 
3344 	/* tdma and coex table */
3345 	if (!wifi_busy) {
3346 		if (coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_ACL_BUSY) {
3347 			halbtc8822b1ant_action_wifi_connected_bt_acl_busy(
3348 				btcoexist);
3349 		} else if ((BT_8822B_1ANT_BT_STATUS_SCO_BUSY ==
3350 			    coex_dm->bt_status) ||
3351 			   (BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
3352 			    coex_dm->bt_status)) {
3353 			halbtc8822b1ant_action_bt_sco_hid_only_busy(btcoexist);
3354 		} else {
3355 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
3356 						8);
3357 
3358 			halbtc8822b1ant_set_ant_path(
3359 				btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
3360 				BT_8822B_1ANT_PHASE_2G_RUNTIME);
3361 
3362 			if ((coex_sta->high_priority_tx) +
3363 				    (coex_sta->high_priority_rx) <=
3364 			    60)
3365 				/*sy modify case16 -> case17*/
3366 				halbtc8822b1ant_coex_table_with_type(
3367 					btcoexist, NORMAL_EXEC, 1);
3368 			else
3369 				halbtc8822b1ant_coex_table_with_type(
3370 					btcoexist, NORMAL_EXEC, 1);
3371 		}
3372 	} else {
3373 		if (coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_ACL_BUSY) {
3374 			halbtc8822b1ant_action_wifi_connected_bt_acl_busy(
3375 				btcoexist);
3376 		} else if ((BT_8822B_1ANT_BT_STATUS_SCO_BUSY ==
3377 			    coex_dm->bt_status) ||
3378 			   (BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY ==
3379 			    coex_dm->bt_status)) {
3380 			halbtc8822b1ant_action_bt_sco_hid_only_busy(btcoexist);
3381 		} else {
3382 			if (rf4ce_enabled) {
3383 				btcoexist->btc_write_1byte_bitmask(
3384 					btcoexist, 0x45e, 0x8, 0x1);
3385 
3386 				halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
3387 							true, 50);
3388 
3389 				halbtc8822b1ant_coex_table_with_type(
3390 					btcoexist, NORMAL_EXEC, 1);
3391 				return;
3392 			}
3393 
3394 			halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false,
3395 						8);
3396 
3397 			halbtc8822b1ant_set_ant_path(
3398 				btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
3399 				BT_8822B_1ANT_PHASE_2G_RUNTIME);
3400 
3401 			wifi_rssi_state = halbtc8822b1ant_wifi_rssi_state(
3402 				btcoexist, 1, 2, 25, 0);
3403 
3404 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3405 				 "[BTCoex], ********** before  **********\n");
3406 			if (BT_8822B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
3407 			    coex_dm->bt_status) {
3408 				if (rf4ce_enabled) {
3409 					btcoexist->btc_write_1byte_bitmask(
3410 						btcoexist, 0x45e, 0x8, 0x1);
3411 
3412 					halbtc8822b1ant_ps_tdma(btcoexist,
3413 								NORMAL_EXEC,
3414 								true, 50);
3415 
3416 					halbtc8822b1ant_coex_table_with_type(
3417 						btcoexist, NORMAL_EXEC, 1);
3418 					return;
3419 				}
3420 
3421 				halbtc8822b1ant_coex_table_with_type(
3422 					btcoexist, NORMAL_EXEC, 1);
3423 			} else {
3424 				halbtc8822b1ant_coex_table_with_type(
3425 					btcoexist, NORMAL_EXEC, 1);
3426 			}
3427 		}
3428 	}
3429 }
3430 
3431 static void
halbtc8822b1ant_run_sw_coexist_mechanism(struct btc_coexist * btcoexist)3432 halbtc8822b1ant_run_sw_coexist_mechanism(struct btc_coexist *btcoexist)
3433 {
3434 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3435 	u8 algorithm = 0;
3436 
3437 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3438 		 "[BTCoex], ********** (run sw coexmech) **********\n");
3439 	algorithm = halbtc8822b1ant_action_algorithm(btcoexist);
3440 	coex_dm->cur_algorithm = algorithm;
3441 
3442 	if (halbtc8822b1ant_is_common_action(btcoexist)) {
3443 	} else {
3444 		switch (coex_dm->cur_algorithm) {
3445 		case BT_8822B_1ANT_COEX_ALGO_SCO:
3446 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3447 				 "[BTCoex], Action algorithm = SCO.\n");
3448 			break;
3449 		case BT_8822B_1ANT_COEX_ALGO_HID:
3450 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3451 				 "[BTCoex], Action algorithm = HID.\n");
3452 			break;
3453 		case BT_8822B_1ANT_COEX_ALGO_A2DP:
3454 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3455 				 "[BTCoex], Action algorithm = A2DP.\n");
3456 			break;
3457 		case BT_8822B_1ANT_COEX_ALGO_A2DP_PANHS:
3458 			RT_TRACE(
3459 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3460 				"[BTCoex], Action algorithm = A2DP+PAN(HS).\n");
3461 			break;
3462 		case BT_8822B_1ANT_COEX_ALGO_PANEDR:
3463 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3464 				 "[BTCoex], Action algorithm = PAN(EDR).\n");
3465 			break;
3466 		case BT_8822B_1ANT_COEX_ALGO_PANHS:
3467 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3468 				 "[BTCoex], Action algorithm = HS mode.\n");
3469 			break;
3470 		case BT_8822B_1ANT_COEX_ALGO_PANEDR_A2DP:
3471 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3472 				 "[BTCoex], Action algorithm = PAN+A2DP.\n");
3473 			break;
3474 		case BT_8822B_1ANT_COEX_ALGO_PANEDR_HID:
3475 			RT_TRACE(
3476 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3477 				"[BTCoex], Action algorithm = PAN(EDR)+HID.\n");
3478 			break;
3479 		case BT_8822B_1ANT_COEX_ALGO_HID_A2DP_PANEDR:
3480 			RT_TRACE(
3481 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3482 				"[BTCoex], Action algorithm = HID+A2DP+PAN.\n");
3483 			break;
3484 		case BT_8822B_1ANT_COEX_ALGO_HID_A2DP:
3485 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3486 				 "[BTCoex], Action algorithm = HID+A2DP.\n");
3487 			break;
3488 		default:
3489 			RT_TRACE(
3490 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3491 				"[BTCoex], Action algorithm = coexist All Off!!\n");
3492 			break;
3493 		}
3494 		coex_dm->pre_algorithm = coex_dm->cur_algorithm;
3495 	}
3496 }
3497 
halbtc8822b1ant_run_coexist_mechanism(struct btc_coexist * btcoexist)3498 static void halbtc8822b1ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
3499 {
3500 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3501 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3502 	bool wifi_connected = false, bt_hs_on = false;
3503 	bool increase_scan_dev_num = false;
3504 	bool bt_ctrl_agg_buf_size = false;
3505 	bool miracast_plus_bt = false;
3506 	u8 agg_buf_size = 5;
3507 	u32 wifi_link_status = 0;
3508 	u32 num_of_wifi_link = 0, wifi_bw;
3509 	u8 iot_peer = BTC_IOT_PEER_UNKNOWN;
3510 	bool wifi_under_5g = false;
3511 
3512 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3513 		 "[BTCoex], RunCoexistMechanism()===>\n");
3514 
3515 	if (btcoexist->manual_control) {
3516 		RT_TRACE(
3517 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3518 			"[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
3519 		return;
3520 	}
3521 
3522 	if (btcoexist->stop_coex_dm) {
3523 		RT_TRACE(
3524 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3525 			"[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");
3526 		return;
3527 	}
3528 
3529 	if (coex_sta->under_ips) {
3530 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3531 			 "[BTCoex], wifi is under IPS !!!\n");
3532 		return;
3533 	}
3534 
3535 	if ((coex_sta->under_lps) &&
3536 	    (coex_dm->bt_status != BT_8822B_1ANT_BT_STATUS_ACL_BUSY)) {
3537 		RT_TRACE(
3538 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3539 			"[BTCoex], RunCoexistMechanism(), wifi is under LPS !!!\n");
3540 		halbtc8822b1ant_action_wifi_native_lps(btcoexist);
3541 		return;
3542 	}
3543 
3544 	if (!coex_sta->run_time_state) {
3545 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3546 			 "[BTCoex], return for run_time_state = false !!!\n");
3547 		return;
3548 	}
3549 
3550 	if (coex_sta->freeze_coexrun_by_btinfo) {
3551 		RT_TRACE(
3552 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3553 			"[BTCoex], BtInfoNotify(), return for freeze_coexrun_by_btinfo\n");
3554 		return;
3555 	}
3556 
3557 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3558 	if (wifi_under_5g) {
3559 		halbtc8822b1ant_action_wifi_under5g(btcoexist);
3560 
3561 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3562 			 "[BTCoex], WiFi is under 5G!!!\n");
3563 		return;
3564 	}
3565 
3566 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3567 		 "[BTCoex], WiFi is under 2G!!!\n");
3568 
3569 	halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
3570 				     BT_8822B_1ANT_PHASE_2G_RUNTIME);
3571 
3572 	if (coex_sta->bt_whck_test) {
3573 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3574 			 "[BTCoex], BT is under WHCK TEST!!!\n");
3575 		halbtc8822b1ant_action_bt_whck_test(btcoexist);
3576 		return;
3577 	}
3578 
3579 	if (coex_sta->bt_disabled) {
3580 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3581 			 "[BTCoex], BT is disabled !!!\n");
3582 		halbtc8822b1ant_action_wifi_only(btcoexist);
3583 		return;
3584 	}
3585 
3586 	if (coex_sta->is_setup_link) {
3587 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3588 			 "[BTCoex], BT is re-link !!!\n");
3589 		halbtc8822b1ant_action_bt_relink(btcoexist);
3590 		return;
3591 	}
3592 
3593 	if ((coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_ACL_BUSY) ||
3594 	    (coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_SCO_BUSY) ||
3595 	    (coex_dm->bt_status == BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY))
3596 		increase_scan_dev_num = true;
3597 
3598 	btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM,
3599 			   &increase_scan_dev_num);
3600 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3601 			   &wifi_connected);
3602 
3603 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3604 			   &wifi_link_status);
3605 	num_of_wifi_link = wifi_link_status >> 16;
3606 
3607 	if ((num_of_wifi_link >= 2) ||
3608 	    (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {
3609 		RT_TRACE(
3610 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3611 			"############# [BTCoex],  Multi-Port num_of_wifi_link = %d, wifi_link_status = 0x%x\n",
3612 			num_of_wifi_link, wifi_link_status);
3613 
3614 		if (bt_link_info->bt_link_exist) {
3615 			halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1,
3616 						   0, 1);
3617 			miracast_plus_bt = true;
3618 		} else {
3619 			halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0,
3620 						   0, 0);
3621 			miracast_plus_bt = false;
3622 		}
3623 		btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3624 				   &miracast_plus_bt);
3625 		halbtc8822b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3626 					   bt_ctrl_agg_buf_size, agg_buf_size);
3627 
3628 		if ((bt_link_info->a2dp_exist) &&
3629 		    (coex_sta->c2h_bt_inquiry_page)) {
3630 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3631 				 "############# [BTCoex],  BT Is Inquirying\n");
3632 			halbtc8822b1ant_action_bt_inquiry(btcoexist);
3633 		} else {
3634 			halbtc8822b1ant_action_wifi_multi_port(btcoexist);
3635 		}
3636 
3637 		return;
3638 	}
3639 
3640 	miracast_plus_bt = false;
3641 	btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3642 			   &miracast_plus_bt);
3643 
3644 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3645 
3646 	if ((bt_link_info->bt_link_exist) && (wifi_connected)) {
3647 		halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1, 0, 1);
3648 
3649 		btcoexist->btc_get(btcoexist, BTC_GET_U1_IOT_PEER, &iot_peer);
3650 
3651 		if (iot_peer != BTC_IOT_PEER_CISCO) {
3652 			if (bt_link_info->sco_exist)
3653 				halbtc8822b1ant_limited_rx(btcoexist,
3654 							   NORMAL_EXEC, true,
3655 							   false, 0x5);
3656 			else
3657 				halbtc8822b1ant_limited_rx(btcoexist,
3658 							   NORMAL_EXEC, false,
3659 							   false, 0x5);
3660 		} else {
3661 			if (bt_link_info->sco_exist) {
3662 				halbtc8822b1ant_limited_rx(btcoexist,
3663 							   NORMAL_EXEC, true,
3664 							   false, 0x5);
3665 			} else {
3666 				if (wifi_bw == BTC_WIFI_BW_HT40)
3667 					halbtc8822b1ant_limited_rx(
3668 						btcoexist, NORMAL_EXEC, false,
3669 						true, 0x10);
3670 				else
3671 					halbtc8822b1ant_limited_rx(
3672 						btcoexist, NORMAL_EXEC, false,
3673 						true, 0x8);
3674 			}
3675 		}
3676 
3677 		halbtc8822b1ant_sw_mechanism(btcoexist, true);
3678 		halbtc8822b1ant_run_sw_coexist_mechanism(
3679 			btcoexist); /* just print debug message */
3680 	} else {
3681 		halbtc8822b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3682 
3683 		halbtc8822b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
3684 					   0x5);
3685 
3686 		halbtc8822b1ant_sw_mechanism(btcoexist, false);
3687 		halbtc8822b1ant_run_sw_coexist_mechanism(
3688 			btcoexist); /* just print debug message */
3689 	}
3690 
3691 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3692 	if (coex_sta->c2h_bt_inquiry_page) {
3693 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3694 			 "############# [BTCoex],  BT Is Inquirying\n");
3695 		halbtc8822b1ant_action_bt_inquiry(btcoexist);
3696 		return;
3697 	} else if (bt_hs_on) {
3698 		halbtc8822b1ant_action_hs(btcoexist);
3699 		return;
3700 	}
3701 
3702 	if (!wifi_connected) {
3703 		bool scan = false, link = false, roam = false;
3704 
3705 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3706 			 "[BTCoex], wifi is non connected-idle !!!\n");
3707 
3708 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3709 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3710 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3711 
3712 		if (scan)
3713 			halbtc8822b1ant_action_wifi_not_connected_scan(
3714 				btcoexist);
3715 		else if (link || roam)
3716 			halbtc8822b1ant_action_wifi_not_connected_asso_auth(
3717 				btcoexist);
3718 		else
3719 			halbtc8822b1ant_action_wifi_not_connected(btcoexist);
3720 	} else { /* wifi LPS/Busy */
3721 		halbtc8822b1ant_action_wifi_connected(btcoexist);
3722 	}
3723 }
3724 
halbtc8822b1ant_init_coex_dm(struct btc_coexist * btcoexist)3725 static void halbtc8822b1ant_init_coex_dm(struct btc_coexist *btcoexist)
3726 {
3727 	/* force to reset coex mechanism */
3728 
3729 	halbtc8822b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, false);
3730 
3731 	/* sw all off */
3732 	halbtc8822b1ant_sw_mechanism(btcoexist, false);
3733 
3734 	coex_sta->pop_event_cnt = 0;
3735 }
3736 
halbtc8822b1ant_init_hw_config(struct btc_coexist * btcoexist,bool back_up,bool wifi_only)3737 static void halbtc8822b1ant_init_hw_config(struct btc_coexist *btcoexist,
3738 					   bool back_up, bool wifi_only)
3739 {
3740 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3741 	u8 u8tmp = 0, i = 0;
3742 	u32 u32tmp1 = 0, u32tmp2 = 0, u32tmp3 = 0;
3743 
3744 	u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
3745 	u32tmp1 = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
3746 	u32tmp2 = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x54);
3747 
3748 	RT_TRACE(
3749 		rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3750 		"[BTCoex], ********** (Before Init HW config) 0xcb4 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n",
3751 		u32tmp3, u32tmp1, u32tmp2);
3752 
3753 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3754 		 "[BTCoex], 1Ant Init HW Config!!\n");
3755 
3756 	coex_sta->bt_coex_supported_feature = 0;
3757 	coex_sta->bt_coex_supported_version = 0;
3758 	coex_sta->bt_ble_scan_type = 0;
3759 	coex_sta->bt_ble_scan_para[0] = 0;
3760 	coex_sta->bt_ble_scan_para[1] = 0;
3761 	coex_sta->bt_ble_scan_para[2] = 0;
3762 	coex_sta->bt_reg_vendor_ac = 0xffff;
3763 	coex_sta->bt_reg_vendor_ae = 0xffff;
3764 	coex_sta->isolation_btween_wb = BT_8822B_1ANT_DEFAULT_ISOLATION;
3765 	coex_sta->gnt_error_cnt = 0;
3766 	coex_sta->bt_relink_downcount = 0;
3767 	coex_sta->is_set_ps_state_fail = false;
3768 	coex_sta->cnt_set_ps_state_fail = 0;
3769 
3770 	for (i = 0; i <= 9; i++)
3771 		coex_sta->bt_afh_map[i] = 0;
3772 
3773 	/* Setup RF front end type */
3774 	halbtc8822b1ant_set_rfe_type(btcoexist);
3775 
3776 	/* 0xf0[15:12] --> Chip Cut information */
3777 	coex_sta->cut_version =
3778 		(btcoexist->btc_read_1byte(btcoexist, 0xf1) & 0xf0) >> 4;
3779 
3780 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8,
3781 					   0x1); /* enable TBTT nterrupt */
3782 
3783 	/* BT report packet sample rate	 */
3784 	/* 0x790[5:0]=0x5 */
3785 	u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
3786 	u8tmp &= 0xc0;
3787 	u8tmp |= 0x5;
3788 	btcoexist->btc_write_1byte(btcoexist, 0x790, u8tmp);
3789 
3790 	/* Enable BT counter statistics */
3791 	btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1);
3792 
3793 	/* Enable PTA (3-wire function form BT side) */
3794 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
3795 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x41, 0x02, 0x1);
3796 
3797 	/* Enable PTA (tx/rx signal form WiFi side) */
3798 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4c6, 0x10, 0x1);
3799 	/*GNT_BT=1 while select both */
3800 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x763, 0x10, 0x1);
3801 
3802 	/* enable GNT_WL */
3803 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e, 0x40, 0x0);
3804 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x1, 0x0);
3805 
3806 	if (btcoexist->btc_read_1byte(btcoexist, 0x80) == 0xc6)
3807 		halbtc8822b1ant_post_state_to_bt(
3808 			btcoexist, BT_8822B_1ANT_SCOREBOARD_ONOFF, true);
3809 
3810 	/* Antenna config */
3811 	if (coex_sta->is_rf_state_off) {
3812 		halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3813 					     FORCE_EXEC,
3814 					     BT_8822B_1ANT_PHASE_WLAN_OFF);
3815 
3816 		btcoexist->stop_coex_dm = true;
3817 
3818 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3819 			 "[BTCoex], **********  %s (RF Off)**********\n",
3820 			 __func__);
3821 	} else if (wifi_only) {
3822 		coex_sta->concurrent_rx_mode_on = false;
3823 		halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI,
3824 					     FORCE_EXEC,
3825 					     BT_8822B_1ANT_PHASE_WLANONLY_INIT);
3826 	} else {
3827 		coex_sta->concurrent_rx_mode_on = true;
3828 
3829 		halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
3830 					     FORCE_EXEC,
3831 					     BT_8822B_1ANT_PHASE_COEX_INIT);
3832 	}
3833 
3834 	/* PTA parameter */
3835 	halbtc8822b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
3836 
3837 	halbtc8822b1ant_enable_gnt_to_gpio(btcoexist, true);
3838 }
3839 
ex_btc8822b1ant_power_on_setting(struct btc_coexist * btcoexist)3840 void ex_btc8822b1ant_power_on_setting(struct btc_coexist *btcoexist)
3841 {
3842 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3843 	struct btc_board_info *board_info = &btcoexist->board_info;
3844 	u8 u8tmp = 0x0;
3845 	u16 u16tmp = 0x0;
3846 
3847 	RT_TRACE(
3848 		rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3849 		"xxxxxxxxxxxxxxxx Execute 8822b 1-Ant PowerOn Setting!! xxxxxxxxxxxxxxxx\n");
3850 
3851 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3852 		 "Ant Det Finish = %s, Ant Det Number  = %d\n",
3853 		 board_info->btdm_ant_det_finish ? "Yes" : "No",
3854 		 board_info->btdm_ant_num_by_ant_det);
3855 
3856 	btcoexist->dbg_mode_1ant = false;
3857 	btcoexist->stop_coex_dm = true;
3858 
3859 	/* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. */
3860 	u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2);
3861 	btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT(0) | BIT(1));
3862 
3863 	/* set Path control owner to WiFi */
3864 	halbtc8822b1ant_ltecoex_pathcontrol_owner(btcoexist,
3865 						  BT_8822B_1ANT_PCO_WLSIDE);
3866 
3867 	/* set GNT_BT to high */
3868 	halbtc8822b1ant_ltecoex_set_gnt_bt(btcoexist,
3869 					   BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
3870 					   BT_8822B_1ANT_GNT_CTRL_BY_SW,
3871 					   BT_8822B_1ANT_SIG_STA_SET_TO_HIGH);
3872 	/* Set GNT_WL to low */
3873 	halbtc8822b1ant_ltecoex_set_gnt_wl(
3874 		btcoexist, BT_8822B_1ANT_GNT_BLOCK_RFC_BB,
3875 		BT_8822B_1ANT_GNT_CTRL_BY_SW, BT_8822B_1ANT_SIG_STA_SET_TO_LOW);
3876 
3877 	/* set WLAN_ACT = 0 */
3878 	/* btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4); */
3879 
3880 	/* SD1 Chunchu red x issue */
3881 	btcoexist->btc_write_1byte(btcoexist, 0xff1a, 0x0);
3882 
3883 	halbtc8822b1ant_enable_gnt_to_gpio(btcoexist, true);
3884 
3885 	/* */
3886 	/* S0 or S1 setting and Local register setting
3887 	 * (By the setting fw can get ant number, S0/S1, ... info)
3888 	 */
3889 	/* Local setting bit define */
3890 	/*	BIT0: "0" for no antenna inverse; "1" for antenna inverse  */
3891 	/*	BIT1: "0" for internal switch; "1" for external switch */
3892 	/*	BIT2: "0" for one antenna; "1" for two antenna */
3893 	/* NOTE: here default all internal switch and 1-antenna ==>
3894 	 *       BIT1=0 and BIT2=0
3895 	 */
3896 
3897 	u8tmp = 0;
3898 	board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
3899 
3900 	if (btcoexist->chip_interface == BTC_INTF_USB)
3901 		btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
3902 	else if (btcoexist->chip_interface == BTC_INTF_SDIO)
3903 		btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60, u8tmp);
3904 }
3905 
ex_btc8822b1ant_pre_load_firmware(struct btc_coexist * btcoexist)3906 void ex_btc8822b1ant_pre_load_firmware(struct btc_coexist *btcoexist) {}
3907 
ex_btc8822b1ant_init_hw_config(struct btc_coexist * btcoexist,bool wifi_only)3908 void ex_btc8822b1ant_init_hw_config(struct btc_coexist *btcoexist,
3909 				    bool wifi_only)
3910 {
3911 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3912 
3913 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3914 		 "[BTCoex], ********** (ini hw config) **********\n");
3915 
3916 	halbtc8822b1ant_init_hw_config(btcoexist, true, wifi_only);
3917 	btcoexist->stop_coex_dm = false;
3918 	btcoexist->auto_report_1ant = true;
3919 }
3920 
ex_btc8822b1ant_init_coex_dm(struct btc_coexist * btcoexist)3921 void ex_btc8822b1ant_init_coex_dm(struct btc_coexist *btcoexist)
3922 {
3923 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3924 
3925 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3926 		 "[BTCoex], Coex Mechanism Init!!\n");
3927 
3928 	btcoexist->stop_coex_dm = false;
3929 
3930 	halbtc8822b1ant_init_coex_dm(btcoexist);
3931 
3932 	halbtc8822b1ant_query_bt_info(btcoexist);
3933 }
3934 
ex_btc8822b1ant_display_coex_info(struct btc_coexist * btcoexist,struct seq_file * m)3935 void ex_btc8822b1ant_display_coex_info(struct btc_coexist *btcoexist,
3936 				       struct seq_file *m)
3937 {
3938 	struct btc_board_info *board_info = &btcoexist->board_info;
3939 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3940 
3941 	u8 u8tmp[4], i, ps_tdma_case = 0;
3942 	u16 u16tmp[4];
3943 	u32 u32tmp[4];
3944 	u32 fa_ofdm, fa_cck, cca_ofdm, cca_cck;
3945 	u32 fw_ver = 0, bt_patch_ver = 0, bt_coex_ver = 0;
3946 	static u8 pop_report_in_10s;
3947 	u32 phyver = 0;
3948 	bool lte_coex_on = false;
3949 	static u8 cnt;
3950 
3951 	seq_puts(m, "\r\n ============[BT Coexist info]============");
3952 
3953 	if (btcoexist->manual_control) {
3954 		seq_puts(m,
3955 			 "\r\n ============[Under Manual Control]============");
3956 		seq_puts(m, "\r\n ==========================================");
3957 	}
3958 	if (btcoexist->stop_coex_dm) {
3959 		seq_puts(m, "\r\n ============[Coex is STOPPED]============");
3960 		seq_puts(m, "\r\n ==========================================");
3961 	}
3962 
3963 	if (!coex_sta->bt_disabled) {
3964 		if (coex_sta->bt_coex_supported_feature == 0)
3965 			btcoexist->btc_get(
3966 				btcoexist, BTC_GET_U4_SUPPORTED_FEATURE,
3967 				&coex_sta->bt_coex_supported_feature);
3968 
3969 		if ((coex_sta->bt_coex_supported_version == 0) ||
3970 		    (coex_sta->bt_coex_supported_version == 0xffff))
3971 			btcoexist->btc_get(
3972 				btcoexist, BTC_GET_U4_SUPPORTED_VERSION,
3973 				&coex_sta->bt_coex_supported_version);
3974 
3975 		if (coex_sta->bt_reg_vendor_ac == 0xffff)
3976 			coex_sta->bt_reg_vendor_ac = (u16)(
3977 				btcoexist->btc_get_bt_reg(btcoexist, 3, 0xac) &
3978 				0xffff);
3979 
3980 		if (coex_sta->bt_reg_vendor_ae == 0xffff)
3981 			coex_sta->bt_reg_vendor_ae = (u16)(
3982 				btcoexist->btc_get_bt_reg(btcoexist, 3, 0xae) &
3983 				0xffff);
3984 
3985 		btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
3986 				   &bt_patch_ver);
3987 		btcoexist->bt_info.bt_get_fw_ver = bt_patch_ver;
3988 
3989 		if (coex_sta->num_of_profile > 0) {
3990 			cnt++;
3991 
3992 			if (cnt >= 3) {
3993 				btcoexist->btc_get_bt_afh_map_from_bt(
3994 					btcoexist, 0, &coex_sta->bt_afh_map[0]);
3995 				cnt = 0;
3996 			}
3997 		}
3998 	}
3999 
4000 	if (psd_scan->ant_det_try_count == 0) {
4001 		seq_printf(
4002 			m, "\r\n %-35s = %d/ %d/ %s / %d",
4003 			"Ant PG Num/ Mech/ Pos/ RFE", board_info->pg_ant_num,
4004 			board_info->btdm_ant_num,
4005 			(board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT ?
4006 				 "Main" :
4007 				 "Aux"),
4008 			rfe_type->rfe_module_type);
4009 	} else {
4010 		seq_printf(
4011 			m, "\r\n %-35s = %d/ %d/ %s/ %d  (%d/%d/%d)",
4012 			"Ant PG Num/ Mech(Ant_Det)/ Pos/ RFE",
4013 			board_info->pg_ant_num,
4014 			board_info->btdm_ant_num_by_ant_det,
4015 			(board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT ?
4016 				 "Main" :
4017 				 "Aux"),
4018 			rfe_type->rfe_module_type, psd_scan->ant_det_try_count,
4019 			psd_scan->ant_det_fail_count, psd_scan->ant_det_result);
4020 
4021 		if (board_info->btdm_ant_det_finish) {
4022 			if (psd_scan->ant_det_result != 12)
4023 				seq_printf(m, "\r\n %-35s = %s",
4024 					   "Ant Det PSD Value",
4025 					   psd_scan->ant_det_peak_val);
4026 			else
4027 				seq_printf(m, "\r\n %-35s = %d",
4028 					   "Ant Det PSD Value",
4029 					   psd_scan->ant_det_psd_scan_peak_val /
4030 						   100);
4031 		}
4032 	}
4033 
4034 	bt_patch_ver = btcoexist->bt_info.bt_get_fw_ver;
4035 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
4036 	phyver = btcoexist->btc_get_bt_phydm_version(btcoexist);
4037 
4038 	bt_coex_ver = ((coex_sta->bt_coex_supported_version & 0xff00) >> 8);
4039 
4040 	seq_printf(
4041 		m, "\r\n %-35s = %d_%02x/ 0x%02x/ 0x%02x (%s)",
4042 		"CoexVer WL/  BT_Desired/ BT_Report",
4043 		glcoex_ver_date_8822b_1ant, glcoex_ver_8822b_1ant,
4044 		glcoex_ver_btdesired_8822b_1ant, bt_coex_ver,
4045 		(bt_coex_ver == 0xff ?
4046 			 "Unknown" :
4047 			 (coex_sta->bt_disabled ?  "BT-disable" :
4048 			  (bt_coex_ver >= glcoex_ver_btdesired_8822b_1ant ?
4049 				   "Match" :
4050 				   "Mis-Match"))));
4051 
4052 	seq_printf(m, "\r\n %-35s = 0x%x/ 0x%x/ v%d/ %c", "W_FW/ B_FW/ Phy/ Kt",
4053 		   fw_ver, bt_patch_ver, phyver, coex_sta->cut_version + 65);
4054 
4055 	seq_printf(m, "\r\n %-35s = %02x %02x %02x ", "AFH Map to BT",
4056 		   coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1],
4057 		   coex_dm->wifi_chnl_info[2]);
4058 
4059 	/* wifi status */
4060 	seq_printf(m, "\r\n %-35s", "============[Wifi Status]============");
4061 	btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_WIFI_STATUS, m);
4062 
4063 	seq_printf(m, "\r\n %-35s", "============[BT Status]============");
4064 
4065 	pop_report_in_10s++;
4066 	seq_printf(
4067 		m, "\r\n %-35s = [%s/ %d dBm/ %d/ %d] ",
4068 		"BT [status/ rssi/ retryCnt/ popCnt]",
4069 		((coex_sta->bt_disabled) ?
4070 			 ("disabled") :
4071 			 ((coex_sta->c2h_bt_inquiry_page) ?  ("inquiry/page") :
4072 			  ((BT_8822B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
4073 			    coex_dm->bt_status) ?
4074 				   "non-connected idle" :
4075 				   ((coex_dm->bt_status ==
4076 				     BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE) ?
4077 					    "connected-idle" :
4078 					    "busy")))),
4079 		coex_sta->bt_rssi - 100, coex_sta->bt_retry_cnt,
4080 		coex_sta->pop_event_cnt);
4081 
4082 	if (pop_report_in_10s >= 5) {
4083 		coex_sta->pop_event_cnt = 0;
4084 		pop_report_in_10s = 0;
4085 	}
4086 
4087 	if (coex_sta->num_of_profile != 0)
4088 		seq_printf(
4089 			m, "\r\n %-35s = %s%s%s%s%s", "Profiles",
4090 			((bt_link_info->a2dp_exist) ?
4091 				 ((coex_sta->is_bt_a2dp_sink) ? "A2DP sink," :
4092 								"A2DP,") :
4093 				 ""),
4094 			((bt_link_info->sco_exist) ? "HFP," : ""),
4095 			((bt_link_info->hid_exist) ?
4096 				 ((coex_sta->hid_busy_num >= 2) ?
4097 					  "HID(4/18)," :
4098 					  "HID(2/18),") :
4099 				 ""),
4100 			((bt_link_info->pan_exist) ? "PAN," : ""),
4101 			((coex_sta->voice_over_HOGP) ? "Voice" : ""));
4102 	else
4103 		seq_printf(m, "\r\n %-35s = None", "Profiles");
4104 
4105 	if (bt_link_info->a2dp_exist) {
4106 		seq_printf(m, "\r\n %-35s = %s/ %d/ %s",
4107 			   "A2DP Rate/Bitpool/Auto_Slot",
4108 			   ((coex_sta->is_A2DP_3M) ? "3M" : "No_3M"),
4109 			   coex_sta->a2dp_bit_pool,
4110 			   ((coex_sta->is_autoslot) ? "On" : "Off"));
4111 	}
4112 
4113 	if (bt_link_info->hid_exist) {
4114 		seq_printf(m, "\r\n %-35s = %d/ %d", "HID PairNum/Forbid_Slot",
4115 			   coex_sta->hid_pair_cnt, coex_sta->forbidden_slot);
4116 	}
4117 
4118 	seq_printf(m, "\r\n %-35s = %s/ %d/ %s/ 0x%x",
4119 		   "Role/RoleSwCnt/IgnWlact/Feature",
4120 		   ((bt_link_info->slave_role) ? "Slave" : "Master"),
4121 		   coex_sta->cnt_role_switch,
4122 		   ((coex_dm->cur_ignore_wlan_act) ? "Yes" : "No"),
4123 		   coex_sta->bt_coex_supported_feature);
4124 
4125 	if ((coex_sta->bt_ble_scan_type & 0x7) != 0x0) {
4126 		seq_printf(m, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
4127 			   "BLEScan Type/TV/Init/Ble",
4128 			   coex_sta->bt_ble_scan_type,
4129 			   (coex_sta->bt_ble_scan_type & 0x1 ?
4130 				    coex_sta->bt_ble_scan_para[0] :
4131 				    0x0),
4132 			   (coex_sta->bt_ble_scan_type & 0x2 ?
4133 				    coex_sta->bt_ble_scan_para[1] :
4134 				    0x0),
4135 			   (coex_sta->bt_ble_scan_type & 0x4 ?
4136 				    coex_sta->bt_ble_scan_para[2] :
4137 				    0x0));
4138 	}
4139 
4140 	seq_printf(m, "\r\n %-35s = %d/ %d/ %d/ %d/ %d",
4141 		   "ReInit/ReLink/IgnWlact/Page/NameReq", coex_sta->cnt_reinit,
4142 		   coex_sta->cnt_setup_link, coex_sta->cnt_ign_wlan_act,
4143 		   coex_sta->cnt_page, coex_sta->cnt_remote_name_req);
4144 
4145 	halbtc8822b1ant_read_score_board(btcoexist, &u16tmp[0]);
4146 
4147 	if ((coex_sta->bt_reg_vendor_ae == 0xffff) ||
4148 	    (coex_sta->bt_reg_vendor_ac == 0xffff))
4149 		seq_printf(m, "\r\n %-35s = x/ x/ %04x",
4150 			   "0xae[4]/0xac[1:0]/Scoreboard", u16tmp[0]);
4151 	else
4152 		seq_printf(m, "\r\n %-35s = 0x%x/ 0x%x/ %04x",
4153 			   "0xae[4]/0xac[1:0]/Scoreboard",
4154 			   (int)((coex_sta->bt_reg_vendor_ae & BIT(4)) >> 4),
4155 			   coex_sta->bt_reg_vendor_ac & 0x3, u16tmp[0]);
4156 
4157 	if (coex_sta->num_of_profile > 0) {
4158 		seq_printf(
4159 			m,
4160 			"\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
4161 			"AFH MAP", coex_sta->bt_afh_map[0],
4162 			coex_sta->bt_afh_map[1], coex_sta->bt_afh_map[2],
4163 			coex_sta->bt_afh_map[3], coex_sta->bt_afh_map[4],
4164 			coex_sta->bt_afh_map[5], coex_sta->bt_afh_map[6],
4165 			coex_sta->bt_afh_map[7], coex_sta->bt_afh_map[8],
4166 			coex_sta->bt_afh_map[9]);
4167 	}
4168 
4169 	for (i = 0; i < BT_INFO_SRC_8822B_1ANT_MAX; i++) {
4170 		if (coex_sta->bt_info_c2h_cnt[i]) {
4171 			seq_printf(
4172 				m,
4173 				"\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)",
4174 				glbt_info_src_8822b_1ant[i],
4175 				coex_sta->bt_info_c2h[i][0],
4176 				coex_sta->bt_info_c2h[i][1],
4177 				coex_sta->bt_info_c2h[i][2],
4178 				coex_sta->bt_info_c2h[i][3],
4179 				coex_sta->bt_info_c2h[i][4],
4180 				coex_sta->bt_info_c2h[i][5],
4181 				coex_sta->bt_info_c2h[i][6],
4182 				coex_sta->bt_info_c2h_cnt[i]);
4183 		}
4184 	}
4185 
4186 	if (btcoexist->manual_control)
4187 		seq_printf(
4188 			m, "\r\n %-35s",
4189 			"============[mechanisms] (before Manual)============");
4190 	else
4191 		seq_printf(m, "\r\n %-35s",
4192 			   "============[Mechanisms]============");
4193 
4194 	ps_tdma_case = coex_dm->cur_ps_tdma;
4195 	seq_printf(m, "\r\n %-35s = %02x %02x %02x %02x %02x (case-%d, %s)",
4196 		   "TDMA", coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1],
4197 		   coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3],
4198 		   coex_dm->ps_tdma_para[4], ps_tdma_case,
4199 		   (coex_dm->cur_ps_tdma_on ? "TDMA On" : "TDMA Off"));
4200 
4201 	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
4202 	u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
4203 	u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
4204 	seq_printf(m, "\r\n %-35s = %d/ 0x%x/ 0x%x/ 0x%x",
4205 		   "Table/0x6c0/0x6c4/0x6c8", coex_sta->coex_table_type,
4206 		   u32tmp[0], u32tmp[1], u32tmp[2]);
4207 
4208 	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
4209 	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6cc);
4210 	seq_printf(m, "\r\n %-35s = 0x%x/ 0x%x", "0x778/0x6cc", u8tmp[0],
4211 		   u32tmp[0]);
4212 
4213 	seq_printf(m, "\r\n %-35s = %s/ %s/ %s/ %d",
4214 		   "AntDiv/BtCtrlLPS/LPRA/PsFail",
4215 		   ((board_info->ant_div_cfg) ? "On" : "Off"),
4216 		   ((coex_sta->force_lps_ctrl) ? "On" : "Off"),
4217 		   ((coex_dm->cur_low_penalty_ra) ? "On" : "Off"),
4218 		   coex_sta->cnt_set_ps_state_fail);
4219 
4220 	u32tmp[0] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
4221 	lte_coex_on = ((u32tmp[0] & BIT(7)) >> 7) ? true : false;
4222 
4223 	if (lte_coex_on) {
4224 		u32tmp[0] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
4225 								      0xa0);
4226 		u32tmp[1] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
4227 								      0xa4);
4228 
4229 		seq_printf(m, "\r\n %-35s = 0x%x/ 0x%x",
4230 			   "LTE Coex Table W_L/B_L", u32tmp[0] & 0xffff,
4231 			   u32tmp[1] & 0xffff);
4232 
4233 		u32tmp[0] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
4234 								      0xa8);
4235 		u32tmp[1] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
4236 								      0xac);
4237 		u32tmp[2] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
4238 								      0xb0);
4239 		u32tmp[3] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist,
4240 								      0xb4);
4241 
4242 		seq_printf(m, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
4243 			   "LTE Break Table W_L/B_L/L_W/L_B",
4244 			   u32tmp[0] & 0xffff, u32tmp[1] & 0xffff,
4245 			   u32tmp[2] & 0xffff, u32tmp[3] & 0xffff);
4246 	}
4247 
4248 	/* Hw setting		 */
4249 	seq_printf(m, "\r\n %-35s", "============[Hw setting]============");
4250 
4251 	u32tmp[0] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
4252 	u32tmp[1] = halbtc8822b1ant_ltecoex_indirect_read_reg(btcoexist, 0x54);
4253 	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x73);
4254 
4255 	seq_printf(m, "\r\n %-35s = %s/ %s", "LTE Coex/Path Owner",
4256 		   ((lte_coex_on) ? "On" : "Off"),
4257 		   ((u8tmp[0] & BIT(2)) ? "WL" : "BT"));
4258 
4259 	if (lte_coex_on) {
4260 		seq_printf(m, "\r\n %-35s = %d/ %d/ %d/ %d",
4261 			   "LTE 3Wire/OPMode/UART/UARTMode",
4262 			   (int)((u32tmp[0] & BIT(6)) >> 6),
4263 			   (int)((u32tmp[0] & (BIT(5) | BIT(4))) >> 4),
4264 			   (int)((u32tmp[0] & BIT(3)) >> 3),
4265 			   (int)(u32tmp[0] & (BIT(2) | BIT(1) | BIT(0))));
4266 
4267 		seq_printf(m, "\r\n %-35s = %d/ %d", "LTE_Busy/UART_Busy",
4268 			   (int)((u32tmp[1] & BIT(1)) >> 1),
4269 			   (int)(u32tmp[1] & BIT(0)));
4270 	}
4271 	seq_printf(m, "\r\n %-35s = %s (BB:%s)/ %s (BB:%s)/ %s %d",
4272 		   "GNT_WL_Ctrl/GNT_BT_Ctrl/Dbg",
4273 		   ((u32tmp[0] & BIT(12)) ? "SW" : "HW"),
4274 		   ((u32tmp[0] & BIT(8)) ? "SW" : "HW"),
4275 		   ((u32tmp[0] & BIT(14)) ? "SW" : "HW"),
4276 		   ((u32tmp[0] & BIT(10)) ? "SW" : "HW"),
4277 		   ((u8tmp[0] & BIT(3)) ? "On" : "Off"),
4278 		   coex_sta->gnt_error_cnt);
4279 
4280 	seq_printf(m, "\r\n %-35s = %d/ %d", "GNT_WL/GNT_BT",
4281 		   (int)((u32tmp[1] & BIT(2)) >> 2),
4282 		   (int)((u32tmp[1] & BIT(3)) >> 3));
4283 
4284 	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xcb0);
4285 	u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
4286 	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xcba);
4287 
4288 	seq_printf(m, "\r\n %-35s = 0x%04x/ 0x%04x/ 0x%02x %s",
4289 		   "0xcb0/0xcb4/0xcb8[23:16]", u32tmp[0], u32tmp[1], u8tmp[0],
4290 		   ((u8tmp[0] & 0x1) == 0x1 ? "(BTG)" : "(WL_A+G)"));
4291 
4292 	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
4293 	u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64);
4294 	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x4c6);
4295 	u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
4296 
4297 	seq_printf(m, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
4298 		   "4c[24:23]/64[0]/4c6[4]/40[5]",
4299 		   (int)((u32tmp[0] & (BIT(24) | BIT(23))) >> 23),
4300 		   u8tmp[2] & 0x1, (int)((u8tmp[0] & BIT(4)) >> 4),
4301 		   (int)((u8tmp[1] & BIT(5)) >> 5));
4302 
4303 	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
4304 	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
4305 	u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x953);
4306 	u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0xc50);
4307 
4308 	seq_printf(m, "\r\n %-35s = 0x%x/ 0x%x/ %s/ 0x%x",
4309 		   "0x550/0x522/4-RxAGC/0xc50", u32tmp[0], u8tmp[0],
4310 		   (u8tmp[1] & 0x2) ? "On" : "Off", u8tmp[2]);
4311 
4312 	fa_ofdm = btcoexist->btc_phydm_query_phy_counter(btcoexist,
4313 							 "PHYDM_INFO_FA_OFDM");
4314 	fa_cck = btcoexist->btc_phydm_query_phy_counter(btcoexist,
4315 							"PHYDM_INFO_FA_CCK");
4316 	cca_ofdm = btcoexist->btc_phydm_query_phy_counter(
4317 		btcoexist, "PHYDM_INFO_CCA_OFDM");
4318 	cca_cck = btcoexist->btc_phydm_query_phy_counter(btcoexist,
4319 							 "PHYDM_INFO_CCA_CCK");
4320 
4321 	seq_printf(m, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
4322 		   "CCK-CCA/CCK-FA/OFDM-CCA/OFDM-FA", cca_cck, fa_cck, cca_ofdm,
4323 		   fa_ofdm);
4324 
4325 	seq_printf(m, "\r\n %-35s = %d/ %d/ %d/ %d", "CRC_OK CCK/11g/11n/11ac",
4326 		   coex_sta->crc_ok_cck, coex_sta->crc_ok_11g,
4327 		   coex_sta->crc_ok_11n, coex_sta->crc_ok_11n_vht);
4328 
4329 	seq_printf(m, "\r\n %-35s = %d/ %d/ %d/ %d", "CRC_Err CCK/11g/11n/11ac",
4330 		   coex_sta->crc_err_cck, coex_sta->crc_err_11g,
4331 		   coex_sta->crc_err_11n, coex_sta->crc_err_11n_vht);
4332 
4333 	seq_printf(m, "\r\n %-35s = %s/ %s/ %s/ %d",
4334 		   "WlHiPri/ Locking/ Locked/ Noisy",
4335 		   (coex_sta->wifi_is_high_pri_task ? "Yes" : "No"),
4336 		   (coex_sta->cck_lock ? "Yes" : "No"),
4337 		   (coex_sta->cck_ever_lock ? "Yes" : "No"),
4338 		   coex_sta->wl_noisy_level);
4339 
4340 	seq_printf(m, "\r\n %-35s = %d/ %d", "0x770(Hi-pri rx/tx)",
4341 		   coex_sta->high_priority_rx, coex_sta->high_priority_tx);
4342 
4343 	seq_printf(m, "\r\n %-35s = %d/ %d %s", "0x774(Lo-pri rx/tx)",
4344 		   coex_sta->low_priority_rx, coex_sta->low_priority_tx,
4345 		   (bt_link_info->slave_role ?
4346 			    "(Slave!!)" :
4347 			    (coex_sta->is_tdma_btautoslot_hang ?
4348 				     "(auto-slot hang!!)" :
4349 				     "")));
4350 
4351 	btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);
4352 }
4353 
ex_btc8822b1ant_ips_notify(struct btc_coexist * btcoexist,u8 type)4354 void ex_btc8822b1ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
4355 {
4356 	struct rtl_priv *rtlpriv = btcoexist->adapter;
4357 
4358 	if (btcoexist->manual_control || btcoexist->stop_coex_dm)
4359 		return;
4360 
4361 	if (type == BTC_IPS_ENTER) {
4362 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4363 			 "[BTCoex], IPS ENTER notify\n");
4364 		coex_sta->under_ips = true;
4365 
4366 		/* Write WL "Active" in Score-board for LPS off */
4367 		halbtc8822b1ant_post_state_to_bt(
4368 			btcoexist, BT_8822B_1ANT_SCOREBOARD_ACTIVE, false);
4369 
4370 		halbtc8822b1ant_post_state_to_bt(
4371 			btcoexist, BT_8822B_1ANT_SCOREBOARD_ONOFF, false);
4372 
4373 		halbtc8822b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
4374 
4375 		halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
4376 					     FORCE_EXEC,
4377 					     BT_8822B_1ANT_PHASE_WLAN_OFF);
4378 
4379 		halbtc8822b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
4380 	} else if (type == BTC_IPS_LEAVE) {
4381 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4382 			 "[BTCoex], IPS LEAVE notify\n");
4383 		halbtc8822b1ant_post_state_to_bt(
4384 			btcoexist, BT_8822B_1ANT_SCOREBOARD_ACTIVE, true);
4385 
4386 		halbtc8822b1ant_post_state_to_bt(
4387 			btcoexist, BT_8822B_1ANT_SCOREBOARD_ONOFF, true);
4388 
4389 		/*leave IPS : run ini hw config (exclude wifi only)*/
4390 		halbtc8822b1ant_init_hw_config(btcoexist, false, false);
4391 		/*sw all off*/
4392 		halbtc8822b1ant_init_coex_dm(btcoexist);
4393 		/*leave IPS : Query bt info*/
4394 		halbtc8822b1ant_query_bt_info(btcoexist);
4395 
4396 		coex_sta->under_ips = false;
4397 	}
4398 }
4399 
ex_btc8822b1ant_lps_notify(struct btc_coexist * btcoexist,u8 type)4400 void ex_btc8822b1ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
4401 {
4402 	struct rtl_priv *rtlpriv = btcoexist->adapter;
4403 	static bool pre_force_lps_on;
4404 
4405 	if (btcoexist->manual_control || btcoexist->stop_coex_dm)
4406 		return;
4407 
4408 	if (type == BTC_LPS_ENABLE) {
4409 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4410 			 "[BTCoex], LPS ENABLE notify\n");
4411 		coex_sta->under_lps = true;
4412 
4413 		if (coex_sta->force_lps_ctrl) { /* LPS No-32K */
4414 			/* Write WL "Active" in Score-board for PS-TDMA */
4415 			pre_force_lps_on = true;
4416 			halbtc8822b1ant_post_state_to_bt(
4417 				btcoexist, BT_8822B_1ANT_SCOREBOARD_ACTIVE,
4418 				true);
4419 		} else {
4420 			/* LPS-32K, need check if this h2c 0x71 can work??
4421 			 * (2015/08/28)
4422 			 */
4423 			/* Write WL "Non-Active" in Score-board for Native-PS */
4424 			pre_force_lps_on = false;
4425 			halbtc8822b1ant_post_state_to_bt(
4426 				btcoexist, BT_8822B_1ANT_SCOREBOARD_ACTIVE,
4427 				false);
4428 		}
4429 	} else if (type == BTC_LPS_DISABLE) {
4430 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4431 			 "[BTCoex], LPS DISABLE notify\n");
4432 		coex_sta->under_lps = false;
4433 
4434 		/* Write WL "Active" in Score-board for LPS off */
4435 		halbtc8822b1ant_post_state_to_bt(
4436 			btcoexist, BT_8822B_1ANT_SCOREBOARD_ACTIVE, true);
4437 
4438 		if ((!pre_force_lps_on) && (!coex_sta->force_lps_ctrl))
4439 			halbtc8822b1ant_query_bt_info(btcoexist);
4440 	}
4441 }
4442 
ex_btc8822b1ant_scan_notify(struct btc_coexist * btcoexist,u8 type)4443 void ex_btc8822b1ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
4444 {
4445 	struct rtl_priv *rtlpriv = btcoexist->adapter;
4446 	bool wifi_connected = false;
4447 	bool wifi_under_5g = false;
4448 
4449 	if (btcoexist->manual_control || btcoexist->stop_coex_dm)
4450 		return;
4451 
4452 	coex_sta->freeze_coexrun_by_btinfo = false;
4453 
4454 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
4455 			   &wifi_connected);
4456 
4457 	if (wifi_connected)
4458 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4459 			 "[BTCoex], ********** WL connected before SCAN\n");
4460 	else
4461 		RT_TRACE(
4462 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4463 			"[BTCoex], **********  WL is not connected before SCAN\n");
4464 
4465 	halbtc8822b1ant_query_bt_info(btcoexist);
4466 
4467 	/*2.4 g 1*/
4468 	if (type == BTC_SCAN_START) {
4469 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G,
4470 				   &wifi_under_5g);
4471 		/*5 g 1*/
4472 
4473 		if (wifi_under_5g) {
4474 			RT_TRACE(
4475 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4476 				"[BTCoex], ********** (scan_notify_5g_scan_start) **********\n");
4477 			halbtc8822b1ant_action_wifi_under5g(btcoexist);
4478 			return;
4479 		}
4480 
4481 		/* 2.4G.2.3*/
4482 		coex_sta->wifi_is_high_pri_task = true;
4483 
4484 		RT_TRACE(
4485 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4486 			"[BTCoex], ********** (scan_notify_2g_scan_start) **********\n");
4487 
4488 		if (!wifi_connected) { /* non-connected scan */
4489 			RT_TRACE(
4490 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4491 				"[BTCoex], ********** wifi is not connected scan **********\n");
4492 			halbtc8822b1ant_action_wifi_not_connected_scan(
4493 				btcoexist);
4494 		} else { /* wifi is connected */
4495 			RT_TRACE(
4496 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4497 				"[BTCoex], ********** wifi is connected scan **********\n");
4498 			halbtc8822b1ant_action_wifi_connected_scan(btcoexist);
4499 		}
4500 
4501 		return;
4502 	}
4503 
4504 	if (type == BTC_SCAN_START_2G) {
4505 		coex_sta->wifi_is_high_pri_task = true;
4506 
4507 		RT_TRACE(
4508 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4509 			"[BTCoex], ********** (scan_notify_2g_sacn_start_for_switch_band_used) **********\n");
4510 
4511 		if (!wifi_connected) { /* non-connected scan */
4512 			RT_TRACE(
4513 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4514 				"[BTCoex], ********** wifi is not connected **********\n");
4515 
4516 			halbtc8822b1ant_action_wifi_not_connected_scan(
4517 				btcoexist);
4518 		} else { /* wifi is connected */
4519 			RT_TRACE(
4520 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4521 				"[BTCoex], ********** wifi is connected **********\n");
4522 			halbtc8822b1ant_action_wifi_connected_scan(btcoexist);
4523 		}
4524 	} else {
4525 		coex_sta->wifi_is_high_pri_task = false;
4526 
4527 		/* 2.4G 5 WL scan finish, then get and update sacn ap numbers */
4528 		/*5 g 4*/
4529 		btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
4530 				   &coex_sta->scan_ap_num);
4531 
4532 		RT_TRACE(
4533 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4534 			"[BTCoex], ********** (scan_finish_notify) **********\n");
4535 
4536 		if (!wifi_connected) { /* non-connected scan */
4537 			halbtc8822b1ant_action_wifi_not_connected(btcoexist);
4538 		} else {
4539 			RT_TRACE(
4540 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4541 				"[BTCoex], ********** scan_finish_notify wifi is connected **********\n");
4542 			halbtc8822b1ant_action_wifi_connected(btcoexist);
4543 		}
4544 	}
4545 }
4546 
ex_btc8822b1ant_scan_notify_without_bt(struct btc_coexist * btcoexist,u8 type)4547 void ex_btc8822b1ant_scan_notify_without_bt(struct btc_coexist *btcoexist,
4548 					    u8 type)
4549 {
4550 	bool wifi_under_5g = false;
4551 
4552 	if (type == BTC_SCAN_START) {
4553 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G,
4554 				   &wifi_under_5g);
4555 
4556 		if (wifi_under_5g) {
4557 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
4558 							   0x3, 1);
4559 			return;
4560 		}
4561 
4562 		/* under 2.4G */
4563 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd, 0x3, 2);
4564 		return;
4565 	}
4566 	if (type == BTC_SCAN_START_2G)
4567 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd, 0x3, 2);
4568 }
4569 
ex_btc8822b1ant_switchband_notify(struct btc_coexist * btcoexist,u8 type)4570 void ex_btc8822b1ant_switchband_notify(struct btc_coexist *btcoexist, u8 type)
4571 {
4572 	struct rtl_priv *rtlpriv = btcoexist->adapter;
4573 
4574 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4575 		 "[BTCoex], ********** (switchband_notify) **********\n");
4576 
4577 	if (btcoexist->manual_control || btcoexist->stop_coex_dm)
4578 		return;
4579 
4580 	coex_sta->switch_band_notify_to = type;
4581 	/*2.4g 4.*/ /*5 g 2*/
4582 	if (type == BTC_SWITCH_TO_5G) {
4583 		RT_TRACE(
4584 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4585 			"[BTCoex], ********** (switchband_notify BTC_SWITCH_TO_5G) **********\n");
4586 
4587 		halbtc8822b1ant_action_wifi_under5g(btcoexist);
4588 		return;
4589 	} else if (type == BTC_SWITCH_TO_24G_NOFORSCAN) {
4590 		RT_TRACE(
4591 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4592 			"[BTCoex], ********** (switchband_notify BTC_SWITCH_TO_2G (no for scan)) **********\n");
4593 
4594 		halbtc8822b1ant_run_coexist_mechanism(btcoexist);
4595 		/*5 g 3*/
4596 
4597 	} else {
4598 		RT_TRACE(
4599 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4600 			"[BTCoex], ********** (switchband_notify BTC_SWITCH_TO_2G) **********\n");
4601 
4602 		ex_btc8822b1ant_scan_notify(btcoexist, BTC_SCAN_START_2G);
4603 	}
4604 	coex_sta->switch_band_notify_to = BTC_NOT_SWITCH;
4605 }
4606 
ex_btc8822b1ant_switchband_notify_without_bt(struct btc_coexist * btcoexist,u8 type)4607 void ex_btc8822b1ant_switchband_notify_without_bt(struct btc_coexist *btcoexist,
4608 						  u8 type)
4609 {
4610 	bool wifi_under_5g = false;
4611 
4612 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
4613 
4614 	if (type == BTC_SWITCH_TO_5G) {
4615 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd, 0x3, 1);
4616 		return;
4617 	} else if (type == BTC_SWITCH_TO_24G_NOFORSCAN) {
4618 		if (wifi_under_5g)
4619 
4620 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
4621 							   0x3, 1);
4622 
4623 		else
4624 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcbd,
4625 							   0x3, 2);
4626 	} else {
4627 		ex_btc8822b1ant_scan_notify_without_bt(btcoexist,
4628 						       BTC_SCAN_START_2G);
4629 	}
4630 }
4631 
ex_btc8822b1ant_connect_notify(struct btc_coexist * btcoexist,u8 type)4632 void ex_btc8822b1ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
4633 {
4634 	struct rtl_priv *rtlpriv = btcoexist->adapter;
4635 	bool wifi_connected = false;
4636 
4637 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4638 		 "[BTCoex], ********** (connect notify) **********\n");
4639 
4640 	halbtc8822b1ant_post_state_to_bt(btcoexist,
4641 					 BT_8822B_1ANT_SCOREBOARD_SCAN, true);
4642 
4643 	if (btcoexist->manual_control || btcoexist->stop_coex_dm)
4644 		return;
4645 
4646 	if ((type == BTC_ASSOCIATE_5G_START) ||
4647 	    (type == BTC_ASSOCIATE_5G_FINISH)) {
4648 		if (type == BTC_ASSOCIATE_5G_START) {
4649 			RT_TRACE(
4650 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4651 				"[BTCoex], ********** (5G associate start notify) **********\n");
4652 
4653 			halbtc8822b1ant_action_wifi_under5g(btcoexist);
4654 
4655 		} else if (type == BTC_ASSOCIATE_5G_FINISH) {
4656 			RT_TRACE(
4657 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4658 				"[BTCoex], ********** (5G associate finish notify) **********\n");
4659 		}
4660 
4661 		return;
4662 	}
4663 
4664 	if (type == BTC_ASSOCIATE_START) {
4665 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4666 			 "[BTCoex], 2G CONNECT START notify\n");
4667 
4668 		coex_sta->wifi_is_high_pri_task = true;
4669 
4670 		halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
4671 					     FORCE_EXEC,
4672 					     BT_8822B_1ANT_PHASE_2G_RUNTIME);
4673 
4674 		coex_dm->arp_cnt = 0;
4675 
4676 		halbtc8822b1ant_action_wifi_not_connected_asso_auth(btcoexist);
4677 
4678 		coex_sta->freeze_coexrun_by_btinfo = true;
4679 
4680 	} else {
4681 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4682 			 "[BTCoex], 2G CONNECT Finish notify\n");
4683 		coex_sta->wifi_is_high_pri_task = false;
4684 		coex_sta->freeze_coexrun_by_btinfo = false;
4685 
4686 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
4687 				   &wifi_connected);
4688 
4689 		if (!wifi_connected) /* non-connected scan */
4690 			halbtc8822b1ant_action_wifi_not_connected(btcoexist);
4691 		else
4692 			halbtc8822b1ant_action_wifi_connected(btcoexist);
4693 	}
4694 }
4695 
ex_btc8822b1ant_media_status_notify(struct btc_coexist * btcoexist,u8 type)4696 void ex_btc8822b1ant_media_status_notify(struct btc_coexist *btcoexist, u8 type)
4697 {
4698 	struct rtl_priv *rtlpriv = btcoexist->adapter;
4699 	bool wifi_under_b_mode = false;
4700 	bool wifi_under_5g = false;
4701 
4702 	if (btcoexist->manual_control || btcoexist->stop_coex_dm)
4703 		return;
4704 
4705 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
4706 
4707 	if (type == BTC_MEDIA_CONNECT) {
4708 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4709 			 "[BTCoex], 2g media connect notify");
4710 
4711 		halbtc8822b1ant_post_state_to_bt(
4712 			btcoexist, BT_8822B_1ANT_SCOREBOARD_ACTIVE, true);
4713 
4714 		if (wifi_under_5g) {
4715 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4716 				 "[BTCoex], 5g media notify\n");
4717 
4718 			halbtc8822b1ant_action_wifi_under5g(btcoexist);
4719 			return;
4720 		}
4721 		/* Force antenna setup for no scan result issue */
4722 		halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
4723 					     FORCE_EXEC,
4724 					     BT_8822B_1ANT_PHASE_2G_RUNTIME);
4725 
4726 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
4727 				   &wifi_under_b_mode);
4728 
4729 		/* Set CCK Tx/Rx high Pri except 11b mode */
4730 		if (wifi_under_b_mode) {
4731 			RT_TRACE(
4732 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4733 				"[BTCoex], ********** (media status notity under b mode) **********\n");
4734 			btcoexist->btc_write_1byte(btcoexist, 0x6cd,
4735 						   0x00); /* CCK Tx */
4736 			btcoexist->btc_write_1byte(btcoexist, 0x6cf,
4737 						   0x00); /* CCK Rx */
4738 		} else {
4739 			RT_TRACE(
4740 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4741 				"[BTCoex], ********** (media status notity not under b mode) **********\n");
4742 			btcoexist->btc_write_1byte(btcoexist, 0x6cd,
4743 						   0x00); /* CCK Tx */
4744 			btcoexist->btc_write_1byte(btcoexist, 0x6cf,
4745 						   0x10); /* CCK Rx */
4746 		}
4747 
4748 		coex_dm->backup_arfr_cnt1 =
4749 			btcoexist->btc_read_4byte(btcoexist, 0x430);
4750 		coex_dm->backup_arfr_cnt2 =
4751 			btcoexist->btc_read_4byte(btcoexist, 0x434);
4752 		coex_dm->backup_retry_limit =
4753 			btcoexist->btc_read_2byte(btcoexist, 0x42a);
4754 		coex_dm->backup_ampdu_max_time =
4755 			btcoexist->btc_read_1byte(btcoexist, 0x456);
4756 	} else {
4757 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4758 			 "[BTCoex], 2g media disconnect notify\n");
4759 		coex_dm->arp_cnt = 0;
4760 
4761 		halbtc8822b1ant_post_state_to_bt(
4762 			btcoexist, BT_8822B_1ANT_SCOREBOARD_ACTIVE, false);
4763 
4764 		btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x0); /* CCK Tx */
4765 		btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x0); /* CCK Rx */
4766 
4767 		coex_sta->cck_ever_lock = false;
4768 	}
4769 
4770 	halbtc8822b1ant_update_wifi_ch_info(btcoexist, type);
4771 }
4772 
ex_btc8822b1ant_specific_packet_notify(struct btc_coexist * btcoexist,u8 type)4773 void ex_btc8822b1ant_specific_packet_notify(struct btc_coexist *btcoexist,
4774 					    u8 type)
4775 {
4776 	struct rtl_priv *rtlpriv = btcoexist->adapter;
4777 	bool under_4way = false, wifi_under_5g = false;
4778 
4779 	if (btcoexist->manual_control || btcoexist->stop_coex_dm)
4780 		return;
4781 
4782 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
4783 	if (wifi_under_5g) {
4784 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4785 			 "[BTCoex], 5g special packet notify\n");
4786 
4787 		halbtc8822b1ant_action_wifi_under5g(btcoexist);
4788 		return;
4789 	}
4790 
4791 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
4792 			   &under_4way);
4793 
4794 	if (under_4way) {
4795 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4796 			 "[BTCoex], specific Packet ---- under_4way!!\n");
4797 
4798 		coex_sta->wifi_is_high_pri_task = true;
4799 		coex_sta->specific_pkt_period_cnt = 2;
4800 	} else if (type == BTC_PACKET_ARP) {
4801 		coex_dm->arp_cnt++;
4802 
4803 		if (coex_sta->wifi_is_high_pri_task) {
4804 			RT_TRACE(
4805 				rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4806 				"[BTCoex], specific Packet ARP notify -cnt = %d\n",
4807 				coex_dm->arp_cnt);
4808 		}
4809 
4810 	} else {
4811 		RT_TRACE(
4812 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4813 			"[BTCoex], specific Packet DHCP or EAPOL notify [Type = %d]\n",
4814 			type);
4815 
4816 		coex_sta->wifi_is_high_pri_task = true;
4817 		coex_sta->specific_pkt_period_cnt = 2;
4818 	}
4819 
4820 	if (coex_sta->wifi_is_high_pri_task)
4821 		halbtc8822b1ant_action_wifi_connected_specific_packet(
4822 			btcoexist);
4823 }
4824 
ex_btc8822b1ant_bt_info_notify(struct btc_coexist * btcoexist,u8 * tmp_buf,u8 length)4825 void ex_btc8822b1ant_bt_info_notify(struct btc_coexist *btcoexist, u8 *tmp_buf,
4826 				    u8 length)
4827 {
4828 	struct rtl_priv *rtlpriv = btcoexist->adapter;
4829 	u8 i, rsp_source = 0;
4830 	bool wifi_connected = false;
4831 	bool wifi_scan = false, wifi_link = false, wifi_roam = false,
4832 	     wifi_busy = false;
4833 	static bool is_scoreboard_scan;
4834 
4835 	if (psd_scan->is_ant_det_running) {
4836 		RT_TRACE(
4837 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4838 			"[BTCoex], bt_info_notify return for AntDet is running\n");
4839 		return;
4840 	}
4841 
4842 	rsp_source = tmp_buf[0] & 0xf;
4843 	if (rsp_source >= BT_INFO_SRC_8822B_1ANT_MAX)
4844 		rsp_source = BT_INFO_SRC_8822B_1ANT_WIFI_FW;
4845 	coex_sta->bt_info_c2h_cnt[rsp_source]++;
4846 
4847 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4848 		 "[BTCoex], Bt_info[%d], len=%d, data=[", rsp_source, length);
4849 
4850 	for (i = 0; i < length; i++) {
4851 		coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
4852 
4853 		if (i == length - 1) {
4854 			/* last one */
4855 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4856 				 "0x%02x]\n", tmp_buf[i]);
4857 		} else {
4858 			/* normal */
4859 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "0x%02x, ",
4860 				 tmp_buf[i]);
4861 		}
4862 	}
4863 
4864 	coex_sta->bt_info = coex_sta->bt_info_c2h[rsp_source][1];
4865 	coex_sta->bt_info_ext = coex_sta->bt_info_c2h[rsp_source][4];
4866 	coex_sta->bt_info_ext2 = coex_sta->bt_info_c2h[rsp_source][5];
4867 
4868 	if (rsp_source != BT_INFO_SRC_8822B_1ANT_WIFI_FW) {
4869 		/* if 0xff, it means BT is under WHCK test */
4870 		coex_sta->bt_whck_test =
4871 			((coex_sta->bt_info == 0xff) ? true : false);
4872 
4873 		coex_sta->bt_create_connection =
4874 			((coex_sta->bt_info_c2h[rsp_source][2] & 0x80) ? true :
4875 									 false);
4876 
4877 		/* unit: %, value-100 to translate to unit: dBm */
4878 		coex_sta->bt_rssi =
4879 			coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;
4880 
4881 		coex_sta->c2h_bt_remote_name_req =
4882 			((coex_sta->bt_info_c2h[rsp_source][2] & 0x20) ? true :
4883 									 false);
4884 
4885 		coex_sta->is_A2DP_3M =
4886 			((coex_sta->bt_info_c2h[rsp_source][2] & 0x10) ? true :
4887 									 false);
4888 
4889 		coex_sta->acl_busy =
4890 			((coex_sta->bt_info_c2h[rsp_source][1] & 0x9) ? true :
4891 									false);
4892 
4893 		coex_sta->voice_over_HOGP =
4894 			((coex_sta->bt_info_ext & 0x10) ? true : false);
4895 
4896 		coex_sta->c2h_bt_inquiry_page =
4897 			((coex_sta->bt_info & BT_INFO_8822B_1ANT_B_INQ_PAGE) ?
4898 				 true :
4899 				 false);
4900 
4901 		coex_sta->a2dp_bit_pool =
4902 			(((coex_sta->bt_info_c2h[rsp_source][1] & 0x49) ==
4903 			  0x49) ?
4904 				 (coex_sta->bt_info_c2h[rsp_source][6] & 0x7f) :
4905 				 0);
4906 
4907 		coex_sta->is_bt_a2dp_sink =
4908 			(coex_sta->bt_info_c2h[rsp_source][6] & 0x80) ? true :
4909 									false;
4910 
4911 		coex_sta->bt_retry_cnt =
4912 			coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
4913 
4914 		coex_sta->is_autoslot = coex_sta->bt_info_ext2 & 0x8;
4915 
4916 		coex_sta->forbidden_slot = coex_sta->bt_info_ext2 & 0x7;
4917 
4918 		coex_sta->hid_busy_num = (coex_sta->bt_info_ext2 & 0x30) >> 4;
4919 
4920 		coex_sta->hid_pair_cnt = (coex_sta->bt_info_ext2 & 0xc0) >> 6;
4921 		if (coex_sta->bt_retry_cnt >= 1)
4922 			coex_sta->pop_event_cnt++;
4923 
4924 		if (coex_sta->c2h_bt_remote_name_req)
4925 			coex_sta->cnt_remote_name_req++;
4926 
4927 		if (coex_sta->bt_info_ext & BIT(1))
4928 			coex_sta->cnt_reinit++;
4929 
4930 		if (coex_sta->bt_info_ext & BIT(2)) {
4931 			coex_sta->cnt_setup_link++;
4932 			coex_sta->is_setup_link = true;
4933 			coex_sta->bt_relink_downcount = 2;
4934 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4935 				 "[BTCoex], Re-Link start in BT info!!\n");
4936 		} else {
4937 			coex_sta->is_setup_link = false;
4938 			coex_sta->bt_relink_downcount = 0;
4939 			RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4940 				 "[BTCoex], Re-Link stop in BT info!!\n");
4941 		}
4942 
4943 		if (coex_sta->bt_info_ext & BIT(3))
4944 			coex_sta->cnt_ign_wlan_act++;
4945 
4946 		if (coex_sta->bt_info_ext & BIT(6))
4947 			coex_sta->cnt_role_switch++;
4948 
4949 		if (coex_sta->bt_info_ext & BIT(7))
4950 			coex_sta->is_bt_multi_link = true;
4951 		else
4952 			coex_sta->is_bt_multi_link = false;
4953 
4954 		if (coex_sta->bt_create_connection) {
4955 			coex_sta->cnt_page++;
4956 
4957 			btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY,
4958 					   &wifi_busy);
4959 
4960 			btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN,
4961 					   &wifi_scan);
4962 			btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK,
4963 					   &wifi_link);
4964 			btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM,
4965 					   &wifi_roam);
4966 
4967 			if ((wifi_link) || (wifi_roam) || (wifi_scan) ||
4968 			    (coex_sta->wifi_is_high_pri_task) || (wifi_busy)) {
4969 				is_scoreboard_scan = true;
4970 				halbtc8822b1ant_post_state_to_bt(
4971 					btcoexist,
4972 					BT_8822B_1ANT_SCOREBOARD_SCAN, true);
4973 
4974 			} else {
4975 				halbtc8822b1ant_post_state_to_bt(
4976 					btcoexist,
4977 					BT_8822B_1ANT_SCOREBOARD_SCAN, false);
4978 			}
4979 		} else {
4980 			if (is_scoreboard_scan) {
4981 				halbtc8822b1ant_post_state_to_bt(
4982 					btcoexist,
4983 					BT_8822B_1ANT_SCOREBOARD_SCAN, false);
4984 				is_scoreboard_scan = false;
4985 			}
4986 		}
4987 
4988 		/* Here we need to resend some wifi info to BT */
4989 		/* because bt is reset and loss of the info. */
4990 
4991 		if ((!btcoexist->manual_control) &&
4992 		    (!btcoexist->stop_coex_dm)) {
4993 			btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
4994 					   &wifi_connected);
4995 
4996 			/*  Re-Init */
4997 			if ((coex_sta->bt_info_ext & BIT(1))) {
4998 				RT_TRACE(
4999 					rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
5000 					"[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
5001 				if (wifi_connected)
5002 					halbtc8822b1ant_update_wifi_ch_info(
5003 						btcoexist, BTC_MEDIA_CONNECT);
5004 				else
5005 					halbtc8822b1ant_update_wifi_ch_info(
5006 						btcoexist,
5007 						BTC_MEDIA_DISCONNECT);
5008 			}
5009 
5010 			/*	If Ignore_WLanAct && not SetUp_Link */
5011 			if ((coex_sta->bt_info_ext & BIT(3)) &&
5012 			    (!(coex_sta->bt_info_ext & BIT(2)))) {
5013 				RT_TRACE(
5014 					rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
5015 					"[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
5016 				halbtc8822b1ant_ignore_wlan_act(
5017 					btcoexist, FORCE_EXEC, false);
5018 			}
5019 		}
5020 	}
5021 
5022 	if ((coex_sta->bt_info_ext & BIT(5))) {
5023 		RT_TRACE(
5024 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
5025 			"[BTCoex], BT ext info bit4 check, query BLE Scan type!!\n");
5026 		coex_sta->bt_ble_scan_type =
5027 			btcoexist->btc_get_ble_scan_type_from_bt(btcoexist);
5028 
5029 		if ((coex_sta->bt_ble_scan_type & 0x1) == 0x1)
5030 			coex_sta->bt_ble_scan_para[0] =
5031 				btcoexist->btc_get_ble_scan_para_from_bt(
5032 					btcoexist, 0x1);
5033 		if ((coex_sta->bt_ble_scan_type & 0x2) == 0x2)
5034 			coex_sta->bt_ble_scan_para[1] =
5035 				btcoexist->btc_get_ble_scan_para_from_bt(
5036 					btcoexist, 0x2);
5037 		if ((coex_sta->bt_ble_scan_type & 0x4) == 0x4)
5038 			coex_sta->bt_ble_scan_para[2] =
5039 				btcoexist->btc_get_ble_scan_para_from_bt(
5040 					btcoexist, 0x4);
5041 	}
5042 
5043 	halbtc8822b1ant_update_bt_link_info(btcoexist);
5044 
5045 	halbtc8822b1ant_run_coexist_mechanism(btcoexist);
5046 }
5047 
ex_btc8822b1ant_rf_status_notify(struct btc_coexist * btcoexist,u8 type)5048 void ex_btc8822b1ant_rf_status_notify(struct btc_coexist *btcoexist, u8 type)
5049 {
5050 	struct rtl_priv *rtlpriv = btcoexist->adapter;
5051 
5052 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
5053 		 "[BTCoex], RF Status notify\n");
5054 
5055 	if (type == BTC_RF_ON) {
5056 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
5057 			 "[BTCoex], RF is turned ON!!\n");
5058 		btcoexist->stop_coex_dm = false;
5059 
5060 		halbtc8822b1ant_post_state_to_bt(
5061 			btcoexist, BT_8822B_1ANT_SCOREBOARD_ACTIVE, true);
5062 		halbtc8822b1ant_post_state_to_bt(
5063 			btcoexist, BT_8822B_1ANT_SCOREBOARD_ONOFF, true);
5064 
5065 	} else if (type == BTC_RF_OFF) {
5066 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
5067 			 "[BTCoex], RF is turned OFF!!\n");
5068 
5069 		halbtc8822b1ant_post_state_to_bt(
5070 			btcoexist, BT_8822B_1ANT_SCOREBOARD_ACTIVE, false);
5071 		halbtc8822b1ant_post_state_to_bt(
5072 			btcoexist, BT_8822B_1ANT_SCOREBOARD_ONOFF, false);
5073 		halbtc8822b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
5074 
5075 		halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
5076 					     FORCE_EXEC,
5077 					     BT_8822B_1ANT_PHASE_WLAN_OFF);
5078 		/* for test : s3 bt disppear , fail rate 1/600*/
5079 
5080 		halbtc8822b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
5081 
5082 		btcoexist->stop_coex_dm = true;
5083 	}
5084 }
5085 
ex_btc8822b1ant_halt_notify(struct btc_coexist * btcoexist)5086 void ex_btc8822b1ant_halt_notify(struct btc_coexist *btcoexist)
5087 {
5088 	struct rtl_priv *rtlpriv = btcoexist->adapter;
5089 
5090 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Halt notify\n");
5091 
5092 	halbtc8822b1ant_post_state_to_bt(
5093 		btcoexist, BT_8822B_1ANT_SCOREBOARD_ACTIVE, false);
5094 	halbtc8822b1ant_post_state_to_bt(btcoexist,
5095 					 BT_8822B_1ANT_SCOREBOARD_ONOFF, false);
5096 
5097 	halbtc8822b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
5098 
5099 	halbtc8822b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, FORCE_EXEC,
5100 				     BT_8822B_1ANT_PHASE_WLAN_OFF);
5101 	/* for test : s3 bt disppear , fail rate 1/600*/
5102 
5103 	halbtc8822b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
5104 
5105 	ex_btc8822b1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
5106 	btcoexist->stop_coex_dm = true;
5107 }
5108 
ex_btc8822b1ant_pnp_notify(struct btc_coexist * btcoexist,u8 pnp_state)5109 void ex_btc8822b1ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
5110 {
5111 	struct rtl_priv *rtlpriv = btcoexist->adapter;
5112 	bool wifi_under_5g = false;
5113 
5114 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Pnp notify\n");
5115 
5116 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
5117 
5118 	if ((pnp_state == BTC_WIFI_PNP_SLEEP) ||
5119 	    (pnp_state == BTC_WIFI_PNP_SLEEP_KEEP_ANT)) {
5120 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
5121 			 "[BTCoex], Pnp notify to SLEEP\n");
5122 
5123 		halbtc8822b1ant_post_state_to_bt(
5124 			btcoexist, BT_8822B_1ANT_SCOREBOARD_ACTIVE |
5125 					   BT_8822B_1ANT_SCOREBOARD_ONOFF |
5126 					   BT_8822B_1ANT_SCOREBOARD_SCAN |
5127 					   BT_8822B_1ANT_SCOREBOARD_UNDERTEST,
5128 			false);
5129 
5130 		if (pnp_state == BTC_WIFI_PNP_SLEEP_KEEP_ANT) {
5131 			if (wifi_under_5g)
5132 				halbtc8822b1ant_set_ant_path(
5133 					btcoexist, BTC_ANT_PATH_AUTO,
5134 					FORCE_EXEC,
5135 					BT_8822B_1ANT_PHASE_5G_RUNTIME);
5136 			else
5137 				halbtc8822b1ant_set_ant_path(
5138 					btcoexist, BTC_ANT_PATH_AUTO,
5139 					FORCE_EXEC,
5140 					BT_8822B_1ANT_PHASE_2G_RUNTIME);
5141 		} else {
5142 			halbtc8822b1ant_set_ant_path(
5143 				btcoexist, BTC_ANT_PATH_AUTO, FORCE_EXEC,
5144 				BT_8822B_1ANT_PHASE_WLAN_OFF);
5145 		}
5146 
5147 		btcoexist->stop_coex_dm = true;
5148 	} else if (pnp_state == BTC_WIFI_PNP_WAKE_UP) {
5149 		RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
5150 			 "[BTCoex], Pnp notify to WAKE UP\n");
5151 		btcoexist->stop_coex_dm = false;
5152 	}
5153 }
5154 
ex_btc8822b1ant_coex_dm_reset(struct btc_coexist * btcoexist)5155 void ex_btc8822b1ant_coex_dm_reset(struct btc_coexist *btcoexist)
5156 {
5157 	struct rtl_priv *rtlpriv = btcoexist->adapter;
5158 
5159 	RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
5160 		 "[BTCoex], *****************Coex DM Reset*****************\n");
5161 
5162 	halbtc8822b1ant_init_hw_config(btcoexist, false, false);
5163 	halbtc8822b1ant_init_coex_dm(btcoexist);
5164 }
5165 
ex_btc8822b1ant_periodical(struct btc_coexist * btcoexist)5166 void ex_btc8822b1ant_periodical(struct btc_coexist *btcoexist)
5167 {
5168 	struct rtl_priv *rtlpriv = btcoexist->adapter;
5169 	bool bt_relink_finish = false;
5170 
5171 	RT_TRACE(
5172 		rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
5173 		"[BTCoex], ==========================Periodical===========================\n");
5174 
5175 	if (!btcoexist->auto_report_1ant)
5176 		halbtc8822b1ant_query_bt_info(btcoexist);
5177 
5178 	halbtc8822b1ant_monitor_bt_ctr(btcoexist);
5179 	halbtc8822b1ant_monitor_wifi_ctr(btcoexist);
5180 
5181 	halbtc8822b1ant_monitor_bt_enable_disable(btcoexist);
5182 
5183 	if (coex_sta->bt_relink_downcount != 0) {
5184 		coex_sta->bt_relink_downcount--;
5185 
5186 		if (coex_sta->bt_relink_downcount == 0) {
5187 			coex_sta->is_setup_link = false;
5188 			bt_relink_finish = true;
5189 		}
5190 	}
5191 
5192 	/* for 4-way, DHCP, EAPOL packet */
5193 	if (coex_sta->specific_pkt_period_cnt > 0) {
5194 		coex_sta->specific_pkt_period_cnt--;
5195 
5196 		if ((coex_sta->specific_pkt_period_cnt == 0) &&
5197 		    (coex_sta->wifi_is_high_pri_task))
5198 			coex_sta->wifi_is_high_pri_task = false;
5199 
5200 		RT_TRACE(
5201 			rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
5202 			"[BTCoex], ***************** Hi-Pri Task = %s*****************\n",
5203 			(coex_sta->wifi_is_high_pri_task ? "Yes" : "No"));
5204 	}
5205 
5206 	if (halbtc8822b1ant_is_wifi_status_changed(btcoexist) ||
5207 	    (bt_relink_finish) || (coex_sta->is_set_ps_state_fail))
5208 		halbtc8822b1ant_run_coexist_mechanism(btcoexist);
5209 }
5210 
ex_btc8822b1ant_antenna_detection(struct btc_coexist * btcoexist,u32 cent_freq,u32 offset,u32 span,u32 seconds)5211 void ex_btc8822b1ant_antenna_detection(struct btc_coexist *btcoexist,
5212 				       u32 cent_freq, u32 offset, u32 span,
5213 				       u32 seconds)
5214 {
5215 }
5216 
ex_btc8822b1ant_antenna_isolation(struct btc_coexist * btcoexist,u32 cent_freq,u32 offset,u32 span,u32 seconds)5217 void ex_btc8822b1ant_antenna_isolation(struct btc_coexist *btcoexist,
5218 				       u32 cent_freq, u32 offset, u32 span,
5219 				       u32 seconds)
5220 {
5221 }
5222 
ex_btc8822b1ant_psd_scan(struct btc_coexist * btcoexist,u32 cent_freq,u32 offset,u32 span,u32 seconds)5223 void ex_btc8822b1ant_psd_scan(struct btc_coexist *btcoexist, u32 cent_freq,
5224 			      u32 offset, u32 span, u32 seconds)
5225 {
5226 }
5227 
ex_btc8822b1ant_display_ant_detection(struct btc_coexist * btcoexist)5228 void ex_btc8822b1ant_display_ant_detection(struct btc_coexist *btcoexist) {}
5229 
ex_btc8822b1ant_dbg_control(struct btc_coexist * btcoexist,u8 op_code,u8 op_len,u8 * pdata)5230 void ex_btc8822b1ant_dbg_control(struct btc_coexist *btcoexist, u8 op_code,
5231 				 u8 op_len, u8 *pdata)
5232 {
5233 }
5234