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