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