xref: /openbmc/linux/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b1ant.c (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
18c086312SLarry Finger // SPDX-License-Identifier: GPL-2.0
28c086312SLarry Finger /* Copyright(c) 2012  Realtek Corporation.*/
3f1d2b4d3SLarry Finger 
4f1d2b4d3SLarry Finger /***************************************************************
5f1d2b4d3SLarry Finger  * Description:
6f1d2b4d3SLarry Finger  *
7f1d2b4d3SLarry Finger  * This file is for RTL8723B Co-exist mechanism
8f1d2b4d3SLarry Finger  *
9f1d2b4d3SLarry Finger  * History
10f1d2b4d3SLarry Finger  * 2012/11/15 Cosa first check in.
11f1d2b4d3SLarry Finger  *
12f1d2b4d3SLarry Finger  ***************************************************************/
13f1d2b4d3SLarry Finger 
14f1d2b4d3SLarry Finger /***************************************************************
15f1d2b4d3SLarry Finger  * include files
16f1d2b4d3SLarry Finger  ***************************************************************/
17f1d2b4d3SLarry Finger #include "halbt_precomp.h"
18f1d2b4d3SLarry Finger /***************************************************************
19f1d2b4d3SLarry Finger  * Global variables, these are static variables
20f1d2b4d3SLarry Finger  ***************************************************************/
21f1d2b4d3SLarry Finger static struct coex_dm_8723b_1ant glcoex_dm_8723b_1ant;
22f1d2b4d3SLarry Finger static struct coex_dm_8723b_1ant *coex_dm = &glcoex_dm_8723b_1ant;
23f1d2b4d3SLarry Finger static struct coex_sta_8723b_1ant glcoex_sta_8723b_1ant;
24f1d2b4d3SLarry Finger static struct coex_sta_8723b_1ant *coex_sta = &glcoex_sta_8723b_1ant;
25f1d2b4d3SLarry Finger 
26c6821613SYan-Hsuan Chuang static const char *const glbt_info_src_8723b_1ant[] = {
27f1d2b4d3SLarry Finger 	"BT Info[wifi fw]",
28f1d2b4d3SLarry Finger 	"BT Info[bt rsp]",
29f1d2b4d3SLarry Finger 	"BT Info[bt auto report]",
30f1d2b4d3SLarry Finger };
31f1d2b4d3SLarry Finger 
32f1d2b4d3SLarry Finger static u32 glcoex_ver_date_8723b_1ant = 20130918;
33f1d2b4d3SLarry Finger static u32 glcoex_ver_8723b_1ant = 0x47;
34f1d2b4d3SLarry Finger 
35f1d2b4d3SLarry Finger /***************************************************************
36f1d2b4d3SLarry Finger  * local function proto type if needed
37f1d2b4d3SLarry Finger  ***************************************************************/
38f1d2b4d3SLarry Finger /***************************************************************
39f1d2b4d3SLarry Finger  * local function start with halbtc8723b1ant_
40f1d2b4d3SLarry Finger  ***************************************************************/
41f1d2b4d3SLarry Finger 
halbtc8723b1ant_updatera_mask(struct btc_coexist * btcoexist,bool force_exec,u32 dis_rate_mask)42f1d2b4d3SLarry Finger static void halbtc8723b1ant_updatera_mask(struct btc_coexist *btcoexist,
43f1d2b4d3SLarry Finger 					  bool force_exec, u32 dis_rate_mask)
44f1d2b4d3SLarry Finger {
45f1d2b4d3SLarry Finger 	coex_dm->curra_mask = dis_rate_mask;
46f1d2b4d3SLarry Finger 
47f1d2b4d3SLarry Finger 	if (force_exec || (coex_dm->prera_mask != coex_dm->curra_mask))
48c6821613SYan-Hsuan Chuang 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_RAMASK,
49f1d2b4d3SLarry Finger 				   &coex_dm->curra_mask);
50f1d2b4d3SLarry Finger 
51f1d2b4d3SLarry Finger 	coex_dm->prera_mask = coex_dm->curra_mask;
52f1d2b4d3SLarry Finger }
53f1d2b4d3SLarry Finger 
btc8723b1ant_auto_rate_fb_retry(struct btc_coexist * btcoexist,bool force_exec,u8 type)54f1d2b4d3SLarry Finger static void btc8723b1ant_auto_rate_fb_retry(struct btc_coexist *btcoexist,
55f1d2b4d3SLarry Finger 					    bool force_exec, u8 type)
56f1d2b4d3SLarry Finger {
57f1d2b4d3SLarry Finger 	bool wifi_under_bmode = false;
58f1d2b4d3SLarry Finger 
59f1d2b4d3SLarry Finger 	coex_dm->cur_arfr_type = type;
60f1d2b4d3SLarry Finger 
61f1d2b4d3SLarry Finger 	if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {
62f1d2b4d3SLarry Finger 		switch (coex_dm->cur_arfr_type) {
63f1d2b4d3SLarry Finger 		case 0:	/* normal mode */
64f1d2b4d3SLarry Finger 			btcoexist->btc_write_4byte(btcoexist, 0x430,
65f1d2b4d3SLarry Finger 						   coex_dm->backup_arfr_cnt1);
66f1d2b4d3SLarry Finger 			btcoexist->btc_write_4byte(btcoexist, 0x434,
67f1d2b4d3SLarry Finger 						   coex_dm->backup_arfr_cnt2);
68f1d2b4d3SLarry Finger 			break;
69f1d2b4d3SLarry Finger 		case 1:
70f1d2b4d3SLarry Finger 			btcoexist->btc_get(btcoexist,
71f1d2b4d3SLarry Finger 					   BTC_GET_BL_WIFI_UNDER_B_MODE,
72f1d2b4d3SLarry Finger 					   &wifi_under_bmode);
73f1d2b4d3SLarry Finger 			if (wifi_under_bmode) {
74f1d2b4d3SLarry Finger 				btcoexist->btc_write_4byte(btcoexist,
75f1d2b4d3SLarry Finger 							   0x430, 0x0);
76f1d2b4d3SLarry Finger 				btcoexist->btc_write_4byte(btcoexist,
77f1d2b4d3SLarry Finger 							   0x434, 0x01010101);
78f1d2b4d3SLarry Finger 			} else {
79f1d2b4d3SLarry Finger 				btcoexist->btc_write_4byte(btcoexist,
80f1d2b4d3SLarry Finger 							   0x430, 0x0);
81f1d2b4d3SLarry Finger 				btcoexist->btc_write_4byte(btcoexist,
82f1d2b4d3SLarry Finger 							   0x434, 0x04030201);
83f1d2b4d3SLarry Finger 			}
84f1d2b4d3SLarry Finger 			break;
85f1d2b4d3SLarry Finger 		default:
86f1d2b4d3SLarry Finger 			break;
87f1d2b4d3SLarry Finger 		}
88f1d2b4d3SLarry Finger 	}
89f1d2b4d3SLarry Finger 
90f1d2b4d3SLarry Finger 	coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;
91f1d2b4d3SLarry Finger }
92f1d2b4d3SLarry Finger 
halbtc8723b1ant_retry_limit(struct btc_coexist * btcoexist,bool force_exec,u8 type)93f1d2b4d3SLarry Finger static void halbtc8723b1ant_retry_limit(struct btc_coexist *btcoexist,
94f1d2b4d3SLarry Finger 					bool force_exec, u8 type)
95f1d2b4d3SLarry Finger {
96f1d2b4d3SLarry Finger 	coex_dm->cur_retry_limit_type = type;
97f1d2b4d3SLarry Finger 
98f1d2b4d3SLarry Finger 	if (force_exec || (coex_dm->pre_retry_limit_type !=
99f1d2b4d3SLarry Finger 			   coex_dm->cur_retry_limit_type)) {
100f1d2b4d3SLarry Finger 		switch (coex_dm->cur_retry_limit_type) {
101f1d2b4d3SLarry Finger 		case 0:	/* normal mode */
102f1d2b4d3SLarry Finger 			btcoexist->btc_write_2byte(btcoexist, 0x42a,
103f1d2b4d3SLarry Finger 						   coex_dm->backup_retry_limit);
104f1d2b4d3SLarry Finger 			break;
105f1d2b4d3SLarry Finger 		case 1:	/* retry limit = 8 */
106f1d2b4d3SLarry Finger 			btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);
107f1d2b4d3SLarry Finger 			break;
108f1d2b4d3SLarry Finger 		default:
109f1d2b4d3SLarry Finger 			break;
110f1d2b4d3SLarry Finger 		}
111f1d2b4d3SLarry Finger 	}
112f1d2b4d3SLarry Finger 
113f1d2b4d3SLarry Finger 	coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;
114f1d2b4d3SLarry Finger }
115f1d2b4d3SLarry Finger 
halbtc8723b1ant_ampdu_maxtime(struct btc_coexist * btcoexist,bool force_exec,u8 type)116f1d2b4d3SLarry Finger static void halbtc8723b1ant_ampdu_maxtime(struct btc_coexist *btcoexist,
117f1d2b4d3SLarry Finger 					  bool force_exec, u8 type)
118f1d2b4d3SLarry Finger {
119f1d2b4d3SLarry Finger 	coex_dm->cur_ampdu_time_type = type;
120f1d2b4d3SLarry Finger 
121f1d2b4d3SLarry Finger 	if (force_exec || (coex_dm->pre_ampdu_time_type !=
122f1d2b4d3SLarry Finger 		coex_dm->cur_ampdu_time_type)) {
123f1d2b4d3SLarry Finger 		switch (coex_dm->cur_ampdu_time_type) {
124f1d2b4d3SLarry Finger 		case 0:	/* normal mode */
125f1d2b4d3SLarry Finger 			btcoexist->btc_write_1byte(btcoexist, 0x456,
126f1d2b4d3SLarry Finger 					coex_dm->backup_ampdu_max_time);
127f1d2b4d3SLarry Finger 			break;
128f1d2b4d3SLarry Finger 		case 1:	/* AMPDU timw = 0x38 * 32us */
129c6821613SYan-Hsuan Chuang 			btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);
130f1d2b4d3SLarry Finger 			break;
131f1d2b4d3SLarry Finger 		default:
132f1d2b4d3SLarry Finger 			break;
133f1d2b4d3SLarry Finger 		}
134f1d2b4d3SLarry Finger 	}
135f1d2b4d3SLarry Finger 
136f1d2b4d3SLarry Finger 	coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;
137f1d2b4d3SLarry Finger }
138f1d2b4d3SLarry Finger 
halbtc8723b1ant_limited_tx(struct btc_coexist * btcoexist,bool force_exec,u8 ra_masktype,u8 arfr_type,u8 retry_limit_type,u8 ampdu_time_type)139f1d2b4d3SLarry Finger static void halbtc8723b1ant_limited_tx(struct btc_coexist *btcoexist,
140f1d2b4d3SLarry Finger 				       bool force_exec, u8 ra_masktype,
141f1d2b4d3SLarry Finger 				       u8 arfr_type, u8 retry_limit_type,
142f1d2b4d3SLarry Finger 				       u8 ampdu_time_type)
143f1d2b4d3SLarry Finger {
144f1d2b4d3SLarry Finger 	switch (ra_masktype) {
145f1d2b4d3SLarry Finger 	case 0:	/* normal mode */
146f1d2b4d3SLarry Finger 		halbtc8723b1ant_updatera_mask(btcoexist, force_exec, 0x0);
147f1d2b4d3SLarry Finger 		break;
148f1d2b4d3SLarry Finger 	case 1:	/* disable cck 1/2 */
149f1d2b4d3SLarry Finger 		halbtc8723b1ant_updatera_mask(btcoexist, force_exec,
150f1d2b4d3SLarry Finger 					      0x00000003);
151f1d2b4d3SLarry Finger 		break;
152f1d2b4d3SLarry Finger 	/* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
153f1d2b4d3SLarry Finger 	case 2:
154f1d2b4d3SLarry Finger 		halbtc8723b1ant_updatera_mask(btcoexist, force_exec,
155f1d2b4d3SLarry Finger 					      0x0001f1f7);
156f1d2b4d3SLarry Finger 		break;
157f1d2b4d3SLarry Finger 	default:
158f1d2b4d3SLarry Finger 		break;
159f1d2b4d3SLarry Finger 	}
160f1d2b4d3SLarry Finger 
161f1d2b4d3SLarry Finger 	btc8723b1ant_auto_rate_fb_retry(btcoexist, force_exec, arfr_type);
162f1d2b4d3SLarry Finger 	halbtc8723b1ant_retry_limit(btcoexist, force_exec, retry_limit_type);
163f1d2b4d3SLarry Finger 	halbtc8723b1ant_ampdu_maxtime(btcoexist, force_exec, ampdu_time_type);
164f1d2b4d3SLarry Finger }
165f1d2b4d3SLarry Finger 
halbtc8723b1ant_limited_rx(struct btc_coexist * btcoexist,bool force_exec,bool rej_ap_agg_pkt,bool bt_ctrl_agg_buf_size,u8 agg_buf_size)166f1d2b4d3SLarry Finger static void halbtc8723b1ant_limited_rx(struct btc_coexist *btcoexist,
167f1d2b4d3SLarry Finger 				       bool force_exec, bool rej_ap_agg_pkt,
168f1d2b4d3SLarry Finger 				       bool bt_ctrl_agg_buf_size,
169f1d2b4d3SLarry Finger 				       u8 agg_buf_size)
170f1d2b4d3SLarry Finger {
171f1d2b4d3SLarry Finger 	bool reject_rx_agg = rej_ap_agg_pkt;
172f1d2b4d3SLarry Finger 	bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
173f1d2b4d3SLarry Finger 	u8 rxaggsize = agg_buf_size;
174f1d2b4d3SLarry Finger 
175f1d2b4d3SLarry Finger 	/**********************************************
176f1d2b4d3SLarry Finger 	 *	Rx Aggregation related setting
177f1d2b4d3SLarry Finger 	 **********************************************/
178f1d2b4d3SLarry Finger 	btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
179f1d2b4d3SLarry Finger 			   &reject_rx_agg);
180f1d2b4d3SLarry Finger 	/* decide BT control aggregation buf size or not  */
181f1d2b4d3SLarry Finger 	btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
182f1d2b4d3SLarry Finger 			   &bt_ctrl_rx_agg_size);
183f1d2b4d3SLarry Finger 	/* aggregation buf size, only work
184f1d2b4d3SLarry Finger 	 * when BT control Rx aggregation size.
185f1d2b4d3SLarry Finger 	 */
186f1d2b4d3SLarry Finger 	btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxaggsize);
187f1d2b4d3SLarry Finger 	/* real update aggregation setting  */
188f1d2b4d3SLarry Finger 	btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
189f1d2b4d3SLarry Finger }
190f1d2b4d3SLarry Finger 
halbtc8723b1ant_query_bt_info(struct btc_coexist * btcoexist)19137a5be0cSPing-Ke Shih static void halbtc8723b1ant_query_bt_info(struct btc_coexist *btcoexist)
19237a5be0cSPing-Ke Shih {
19337a5be0cSPing-Ke Shih 	u8 h2c_parameter[1] = {0};
19437a5be0cSPing-Ke Shih 
19537a5be0cSPing-Ke Shih 	coex_sta->c2h_bt_info_req_sent = true;
19637a5be0cSPing-Ke Shih 
19737a5be0cSPing-Ke Shih 	/* trigger */
19837a5be0cSPing-Ke Shih 	h2c_parameter[0] |= BIT(0);
19937a5be0cSPing-Ke Shih 
20037a5be0cSPing-Ke Shih 	btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
20137a5be0cSPing-Ke Shih }
20237a5be0cSPing-Ke Shih 
halbtc8723b1ant_monitor_bt_ctr(struct btc_coexist * btcoexist)203f1d2b4d3SLarry Finger static void halbtc8723b1ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
204f1d2b4d3SLarry Finger {
205f1d2b4d3SLarry Finger 	u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
206f1d2b4d3SLarry Finger 	u32 reg_hp_tx = 0, reg_hp_rx = 0;
207f1d2b4d3SLarry Finger 	u32 reg_lp_tx = 0, reg_lp_rx = 0;
20837a5be0cSPing-Ke Shih 	static u32 num_of_bt_counter_chk;
209f1d2b4d3SLarry Finger 
210f1d2b4d3SLarry Finger 	reg_hp_txrx = 0x770;
211f1d2b4d3SLarry Finger 	reg_lp_txrx = 0x774;
212f1d2b4d3SLarry Finger 
213f1d2b4d3SLarry Finger 	u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
214f1d2b4d3SLarry Finger 	reg_hp_tx = u32tmp & MASKLWORD;
215f1d2b4d3SLarry Finger 	reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
216f1d2b4d3SLarry Finger 
217f1d2b4d3SLarry Finger 	u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
218f1d2b4d3SLarry Finger 	reg_lp_tx = u32tmp & MASKLWORD;
219f1d2b4d3SLarry Finger 	reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
220f1d2b4d3SLarry Finger 
221f1d2b4d3SLarry Finger 	coex_sta->high_priority_tx = reg_hp_tx;
222f1d2b4d3SLarry Finger 	coex_sta->high_priority_rx = reg_hp_rx;
223f1d2b4d3SLarry Finger 	coex_sta->low_priority_tx = reg_lp_tx;
224f1d2b4d3SLarry Finger 	coex_sta->low_priority_rx = reg_lp_rx;
225f1d2b4d3SLarry Finger 
22637a5be0cSPing-Ke Shih 	if ((coex_sta->low_priority_tx > 1050) &&
22737a5be0cSPing-Ke Shih 	    (!coex_sta->c2h_bt_inquiry_page))
22837a5be0cSPing-Ke Shih 		coex_sta->pop_event_cnt++;
22937a5be0cSPing-Ke Shih 
230f1d2b4d3SLarry Finger 	/* reset counter */
231f1d2b4d3SLarry Finger 	btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
23237a5be0cSPing-Ke Shih 
23337a5be0cSPing-Ke Shih 	/* This part is for wifi FW and driver to update BT's status as
23437a5be0cSPing-Ke Shih 	 * disabled.
23537a5be0cSPing-Ke Shih 	 *
23637a5be0cSPing-Ke Shih 	 * The flow is as the following
23737a5be0cSPing-Ke Shih 	 * 1. disable BT
23837a5be0cSPing-Ke Shih 	 * 2. if all BT Tx/Rx counter = 0, after 6 sec we query bt info
23937a5be0cSPing-Ke Shih 	 * 3. Because BT will not rsp from mailbox, so wifi fw will know BT is
24037a5be0cSPing-Ke Shih 	 * disabled
24137a5be0cSPing-Ke Shih 	 *
24237a5be0cSPing-Ke Shih 	 * 4. FW will rsp c2h for BT that driver will know BT is disabled.
24337a5be0cSPing-Ke Shih 	 */
24437a5be0cSPing-Ke Shih 	if ((reg_hp_tx == 0) && (reg_hp_rx == 0) && (reg_lp_tx == 0) &&
24537a5be0cSPing-Ke Shih 	    (reg_lp_rx == 0)) {
24637a5be0cSPing-Ke Shih 		num_of_bt_counter_chk++;
24737a5be0cSPing-Ke Shih 		if (num_of_bt_counter_chk == 3)
24837a5be0cSPing-Ke Shih 			halbtc8723b1ant_query_bt_info(btcoexist);
24937a5be0cSPing-Ke Shih 	} else {
25037a5be0cSPing-Ke Shih 		num_of_bt_counter_chk = 0;
25137a5be0cSPing-Ke Shih 	}
252f1d2b4d3SLarry Finger }
253f1d2b4d3SLarry Finger 
halbtc8723b1ant_monitor_wifi_ctr(struct btc_coexist * btcoexist)25437a5be0cSPing-Ke Shih static void halbtc8723b1ant_monitor_wifi_ctr(struct btc_coexist *btcoexist)
255f1d2b4d3SLarry Finger {
25637a5be0cSPing-Ke Shih 	s32 wifi_rssi = 0;
25737a5be0cSPing-Ke Shih 	bool wifi_busy = false, wifi_under_b_mode = false;
25837a5be0cSPing-Ke Shih 	static u8 cck_lock_counter;
25937a5be0cSPing-Ke Shih 	u32 total_cnt;
260f1d2b4d3SLarry Finger 
26137a5be0cSPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
26237a5be0cSPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
26337a5be0cSPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
26437a5be0cSPing-Ke Shih 			   &wifi_under_b_mode);
265f1d2b4d3SLarry Finger 
26637a5be0cSPing-Ke Shih 	if (coex_sta->under_ips) {
26737a5be0cSPing-Ke Shih 		coex_sta->crc_ok_cck = 0;
26837a5be0cSPing-Ke Shih 		coex_sta->crc_ok_11g = 0;
26937a5be0cSPing-Ke Shih 		coex_sta->crc_ok_11n = 0;
27037a5be0cSPing-Ke Shih 		coex_sta->crc_ok_11n_agg = 0;
271f1d2b4d3SLarry Finger 
27237a5be0cSPing-Ke Shih 		coex_sta->crc_err_cck = 0;
27337a5be0cSPing-Ke Shih 		coex_sta->crc_err_11g = 0;
27437a5be0cSPing-Ke Shih 		coex_sta->crc_err_11n = 0;
27537a5be0cSPing-Ke Shih 		coex_sta->crc_err_11n_agg = 0;
27637a5be0cSPing-Ke Shih 	} else {
27737a5be0cSPing-Ke Shih 		coex_sta->crc_ok_cck =
27837a5be0cSPing-Ke Shih 			btcoexist->btc_read_4byte(btcoexist, 0xf88);
27937a5be0cSPing-Ke Shih 		coex_sta->crc_ok_11g =
28037a5be0cSPing-Ke Shih 			btcoexist->btc_read_2byte(btcoexist, 0xf94);
28137a5be0cSPing-Ke Shih 		coex_sta->crc_ok_11n =
28237a5be0cSPing-Ke Shih 			btcoexist->btc_read_2byte(btcoexist, 0xf90);
28337a5be0cSPing-Ke Shih 		coex_sta->crc_ok_11n_agg =
28437a5be0cSPing-Ke Shih 			btcoexist->btc_read_2byte(btcoexist, 0xfb8);
285f1d2b4d3SLarry Finger 
28637a5be0cSPing-Ke Shih 		coex_sta->crc_err_cck =
28737a5be0cSPing-Ke Shih 			btcoexist->btc_read_4byte(btcoexist, 0xf84);
28837a5be0cSPing-Ke Shih 		coex_sta->crc_err_11g =
28937a5be0cSPing-Ke Shih 			btcoexist->btc_read_2byte(btcoexist, 0xf96);
29037a5be0cSPing-Ke Shih 		coex_sta->crc_err_11n =
29137a5be0cSPing-Ke Shih 			btcoexist->btc_read_2byte(btcoexist, 0xf92);
29237a5be0cSPing-Ke Shih 		coex_sta->crc_err_11n_agg =
29337a5be0cSPing-Ke Shih 			btcoexist->btc_read_2byte(btcoexist, 0xfba);
29437a5be0cSPing-Ke Shih 	}
29537a5be0cSPing-Ke Shih 
29637a5be0cSPing-Ke Shih 	/* reset counter */
29737a5be0cSPing-Ke Shih 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x1);
29837a5be0cSPing-Ke Shih 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x0);
29937a5be0cSPing-Ke Shih 
30037a5be0cSPing-Ke Shih 	if ((wifi_busy) && (wifi_rssi >= 30) && (!wifi_under_b_mode)) {
30137a5be0cSPing-Ke Shih 		total_cnt = coex_sta->crc_ok_cck + coex_sta->crc_ok_11g +
30237a5be0cSPing-Ke Shih 			    coex_sta->crc_ok_11n + coex_sta->crc_ok_11n_agg;
30337a5be0cSPing-Ke Shih 
30437a5be0cSPing-Ke Shih 		if ((coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) ||
30537a5be0cSPing-Ke Shih 		    (coex_dm->bt_status ==
30637a5be0cSPing-Ke Shih 		     BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) ||
30737a5be0cSPing-Ke Shih 		    (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY)) {
30837a5be0cSPing-Ke Shih 			if (coex_sta->crc_ok_cck >
30937a5be0cSPing-Ke Shih 			    (total_cnt - coex_sta->crc_ok_cck)) {
31037a5be0cSPing-Ke Shih 				if (cck_lock_counter < 3)
31137a5be0cSPing-Ke Shih 					cck_lock_counter++;
31237a5be0cSPing-Ke Shih 			} else {
31337a5be0cSPing-Ke Shih 				if (cck_lock_counter > 0)
31437a5be0cSPing-Ke Shih 					cck_lock_counter--;
31537a5be0cSPing-Ke Shih 			}
31637a5be0cSPing-Ke Shih 
31737a5be0cSPing-Ke Shih 		} else {
31837a5be0cSPing-Ke Shih 			if (cck_lock_counter > 0)
31937a5be0cSPing-Ke Shih 				cck_lock_counter--;
32037a5be0cSPing-Ke Shih 		}
32137a5be0cSPing-Ke Shih 	} else {
32237a5be0cSPing-Ke Shih 		if (cck_lock_counter > 0)
32337a5be0cSPing-Ke Shih 			cck_lock_counter--;
32437a5be0cSPing-Ke Shih 	}
32537a5be0cSPing-Ke Shih 
32637a5be0cSPing-Ke Shih 	if (!coex_sta->pre_ccklock) {
32737a5be0cSPing-Ke Shih 		if (cck_lock_counter >= 3)
32837a5be0cSPing-Ke Shih 			coex_sta->cck_lock = true;
32937a5be0cSPing-Ke Shih 		else
33037a5be0cSPing-Ke Shih 			coex_sta->cck_lock = false;
33137a5be0cSPing-Ke Shih 	} else {
33237a5be0cSPing-Ke Shih 		if (cck_lock_counter == 0)
33337a5be0cSPing-Ke Shih 			coex_sta->cck_lock = false;
33437a5be0cSPing-Ke Shih 		else
33537a5be0cSPing-Ke Shih 			coex_sta->cck_lock = true;
33637a5be0cSPing-Ke Shih 	}
33737a5be0cSPing-Ke Shih 
33837a5be0cSPing-Ke Shih 	if (coex_sta->cck_lock)
33937a5be0cSPing-Ke Shih 		coex_sta->cck_ever_lock = true;
34037a5be0cSPing-Ke Shih 
34137a5be0cSPing-Ke Shih 	coex_sta->pre_ccklock = coex_sta->cck_lock;
342f1d2b4d3SLarry Finger }
343f1d2b4d3SLarry Finger 
btc8723b1ant_is_wifi_status_changed(struct btc_coexist * btcoexist)344f1d2b4d3SLarry Finger static bool btc8723b1ant_is_wifi_status_changed(struct btc_coexist *btcoexist)
345f1d2b4d3SLarry Finger {
346f1d2b4d3SLarry Finger 	static bool pre_wifi_busy;
347f1d2b4d3SLarry Finger 	static bool pre_under_4way, pre_bt_hs_on;
348f1d2b4d3SLarry Finger 	bool wifi_busy = false, under_4way = false, bt_hs_on = false;
349f1d2b4d3SLarry Finger 	bool wifi_connected = false;
350f1d2b4d3SLarry Finger 
351f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
352f1d2b4d3SLarry Finger 			   &wifi_connected);
353f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
354f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
355f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
356f1d2b4d3SLarry Finger 			   &under_4way);
357f1d2b4d3SLarry Finger 
358f1d2b4d3SLarry Finger 	if (wifi_connected) {
359f1d2b4d3SLarry Finger 		if (wifi_busy != pre_wifi_busy) {
360f1d2b4d3SLarry Finger 			pre_wifi_busy = wifi_busy;
361f1d2b4d3SLarry Finger 			return true;
362f1d2b4d3SLarry Finger 		}
363f1d2b4d3SLarry Finger 		if (under_4way != pre_under_4way) {
364f1d2b4d3SLarry Finger 			pre_under_4way = under_4way;
365f1d2b4d3SLarry Finger 			return true;
366f1d2b4d3SLarry Finger 		}
367f1d2b4d3SLarry Finger 		if (bt_hs_on != pre_bt_hs_on) {
368f1d2b4d3SLarry Finger 			pre_bt_hs_on = bt_hs_on;
369f1d2b4d3SLarry Finger 			return true;
370f1d2b4d3SLarry Finger 		}
371f1d2b4d3SLarry Finger 	}
372f1d2b4d3SLarry Finger 
373f1d2b4d3SLarry Finger 	return false;
374f1d2b4d3SLarry Finger }
375f1d2b4d3SLarry Finger 
halbtc8723b1ant_update_bt_link_info(struct btc_coexist * btcoexist)376f1d2b4d3SLarry Finger static void halbtc8723b1ant_update_bt_link_info(struct btc_coexist *btcoexist)
377f1d2b4d3SLarry Finger {
378f1d2b4d3SLarry Finger 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
379f1d2b4d3SLarry Finger 	bool bt_hs_on = false;
380f1d2b4d3SLarry Finger 
381f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
382f1d2b4d3SLarry Finger 
383f1d2b4d3SLarry Finger 	bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
384f1d2b4d3SLarry Finger 	bt_link_info->sco_exist = coex_sta->sco_exist;
385f1d2b4d3SLarry Finger 	bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
386f1d2b4d3SLarry Finger 	bt_link_info->pan_exist = coex_sta->pan_exist;
387f1d2b4d3SLarry Finger 	bt_link_info->hid_exist = coex_sta->hid_exist;
38875717802SPing-Ke Shih 	bt_link_info->bt_hi_pri_link_exist = coex_sta->bt_hi_pri_link_exist;
389f1d2b4d3SLarry Finger 
390f1d2b4d3SLarry Finger 	/* work around for HS mode. */
391f1d2b4d3SLarry Finger 	if (bt_hs_on) {
392f1d2b4d3SLarry Finger 		bt_link_info->pan_exist = true;
393f1d2b4d3SLarry Finger 		bt_link_info->bt_link_exist = true;
394f1d2b4d3SLarry Finger 	}
395f1d2b4d3SLarry Finger 
396f1d2b4d3SLarry Finger 	/* check if Sco only */
397f1d2b4d3SLarry Finger 	if (bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
398f1d2b4d3SLarry Finger 	    !bt_link_info->pan_exist && !bt_link_info->hid_exist)
399f1d2b4d3SLarry Finger 		bt_link_info->sco_only = true;
400f1d2b4d3SLarry Finger 	else
401f1d2b4d3SLarry Finger 		bt_link_info->sco_only = false;
402f1d2b4d3SLarry Finger 
403f1d2b4d3SLarry Finger 	/* check if A2dp only */
404f1d2b4d3SLarry Finger 	if (!bt_link_info->sco_exist && bt_link_info->a2dp_exist &&
405f1d2b4d3SLarry Finger 	    !bt_link_info->pan_exist && !bt_link_info->hid_exist)
406f1d2b4d3SLarry Finger 		bt_link_info->a2dp_only = true;
407f1d2b4d3SLarry Finger 	else
408f1d2b4d3SLarry Finger 		bt_link_info->a2dp_only = false;
409f1d2b4d3SLarry Finger 
410f1d2b4d3SLarry Finger 	/* check if Pan only */
411f1d2b4d3SLarry Finger 	if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
412f1d2b4d3SLarry Finger 	    bt_link_info->pan_exist && !bt_link_info->hid_exist)
413f1d2b4d3SLarry Finger 		bt_link_info->pan_only = true;
414f1d2b4d3SLarry Finger 	else
415f1d2b4d3SLarry Finger 		bt_link_info->pan_only = false;
416f1d2b4d3SLarry Finger 
417f1d2b4d3SLarry Finger 	/* check if Hid only */
418f1d2b4d3SLarry Finger 	if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
419f1d2b4d3SLarry Finger 	    !bt_link_info->pan_exist && bt_link_info->hid_exist)
420f1d2b4d3SLarry Finger 		bt_link_info->hid_only = true;
421f1d2b4d3SLarry Finger 	else
422f1d2b4d3SLarry Finger 		bt_link_info->hid_only = false;
423f1d2b4d3SLarry Finger }
424f1d2b4d3SLarry Finger 
halbtc8723b1ant_set_bt_auto_report(struct btc_coexist * btcoexist,bool enable_auto_report)425f66509e3SLarry Finger static void halbtc8723b1ant_set_bt_auto_report(struct btc_coexist *btcoexist,
426f66509e3SLarry Finger 					       bool enable_auto_report)
427f66509e3SLarry Finger {
428f66509e3SLarry Finger 	u8 h2c_parameter[1] = {0};
429f66509e3SLarry Finger 
430f66509e3SLarry Finger 	h2c_parameter[0] = 0;
431f66509e3SLarry Finger 
432f66509e3SLarry Finger 	if (enable_auto_report)
433f66509e3SLarry Finger 		h2c_parameter[0] |= BIT(0);
434f66509e3SLarry Finger 
435f66509e3SLarry Finger 	btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
436f66509e3SLarry Finger }
437f66509e3SLarry Finger 
halbtc8723b1ant_bt_auto_report(struct btc_coexist * btcoexist,bool force_exec,bool enable_auto_report)438f66509e3SLarry Finger static void halbtc8723b1ant_bt_auto_report(struct btc_coexist *btcoexist,
439f66509e3SLarry Finger 					   bool force_exec,
440f66509e3SLarry Finger 					   bool enable_auto_report)
441f66509e3SLarry Finger {
442f66509e3SLarry Finger 	coex_dm->cur_bt_auto_report = enable_auto_report;
443f66509e3SLarry Finger 
444f66509e3SLarry Finger 	if (!force_exec) {
445f66509e3SLarry Finger 		if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
446f66509e3SLarry Finger 			return;
447f66509e3SLarry Finger 	}
448f66509e3SLarry Finger 	halbtc8723b1ant_set_bt_auto_report(btcoexist,
449f66509e3SLarry Finger 					   coex_dm->cur_bt_auto_report);
450f66509e3SLarry Finger 
451f66509e3SLarry Finger 	coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
452f66509e3SLarry Finger }
453f66509e3SLarry Finger 
btc8723b1ant_set_sw_pen_tx_rate_adapt(struct btc_coexist * btcoexist,bool low_penalty_ra)454f1d2b4d3SLarry Finger static void btc8723b1ant_set_sw_pen_tx_rate_adapt(struct btc_coexist *btcoexist,
455f1d2b4d3SLarry Finger 						  bool low_penalty_ra)
456f1d2b4d3SLarry Finger {
457dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
458f1d2b4d3SLarry Finger 	u8 h2c_parameter[6] = {0};
459f1d2b4d3SLarry Finger 
460f1d2b4d3SLarry Finger 	h2c_parameter[0] = 0x6;	/* opCode, 0x6= Retry_Penalty */
461f1d2b4d3SLarry Finger 
462f1d2b4d3SLarry Finger 	if (low_penalty_ra) {
463f1d2b4d3SLarry Finger 		h2c_parameter[1] |= BIT0;
464f1d2b4d3SLarry Finger 		/* normal rate except MCS7/6/5, OFDM54/48/36 */
465f1d2b4d3SLarry Finger 		h2c_parameter[2] = 0x00;
466f1d2b4d3SLarry Finger 		h2c_parameter[3] = 0xf7;  /* MCS7 or OFDM54 */
467f1d2b4d3SLarry Finger 		h2c_parameter[4] = 0xf8;  /* MCS6 or OFDM48 */
468f1d2b4d3SLarry Finger 		h2c_parameter[5] = 0xf9;  /* MCS5 or OFDM36 */
469f1d2b4d3SLarry Finger 	}
470f1d2b4d3SLarry Finger 
471c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
472f1d2b4d3SLarry Finger 		"[BTCoex], set WiFi Low-Penalty Retry: %s",
473f1d2b4d3SLarry Finger 		(low_penalty_ra ? "ON!!" : "OFF!!"));
474f1d2b4d3SLarry Finger 
475f1d2b4d3SLarry Finger 	btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
476f1d2b4d3SLarry Finger }
477f1d2b4d3SLarry Finger 
halbtc8723b1ant_low_penalty_ra(struct btc_coexist * btcoexist,bool force_exec,bool low_penalty_ra)478f1d2b4d3SLarry Finger static void halbtc8723b1ant_low_penalty_ra(struct btc_coexist *btcoexist,
479f1d2b4d3SLarry Finger 					   bool force_exec, bool low_penalty_ra)
480f1d2b4d3SLarry Finger {
481f1d2b4d3SLarry Finger 	coex_dm->cur_low_penalty_ra = low_penalty_ra;
482f1d2b4d3SLarry Finger 
483f1d2b4d3SLarry Finger 	if (!force_exec) {
484f1d2b4d3SLarry Finger 		if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
485f1d2b4d3SLarry Finger 			return;
486f1d2b4d3SLarry Finger 	}
487f1d2b4d3SLarry Finger 	btc8723b1ant_set_sw_pen_tx_rate_adapt(btcoexist,
488f1d2b4d3SLarry Finger 					      coex_dm->cur_low_penalty_ra);
489f1d2b4d3SLarry Finger 
490f1d2b4d3SLarry Finger 	coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
491f1d2b4d3SLarry Finger }
492f1d2b4d3SLarry Finger 
halbtc8723b1ant_set_coex_table(struct btc_coexist * btcoexist,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)493f1d2b4d3SLarry Finger static void halbtc8723b1ant_set_coex_table(struct btc_coexist *btcoexist,
494f1d2b4d3SLarry Finger 					   u32 val0x6c0, u32 val0x6c4,
495f1d2b4d3SLarry Finger 					   u32 val0x6c8, u8 val0x6cc)
496f1d2b4d3SLarry Finger {
497dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
498dd192494SLarry Finger 
499c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
500f1d2b4d3SLarry Finger 		"[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0);
501f1d2b4d3SLarry Finger 	btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
502f1d2b4d3SLarry Finger 
503c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
504f1d2b4d3SLarry Finger 		"[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4);
505f1d2b4d3SLarry Finger 	btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
506f1d2b4d3SLarry Finger 
507c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
508f1d2b4d3SLarry Finger 		"[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8);
509f1d2b4d3SLarry Finger 	btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
510f1d2b4d3SLarry Finger 
511c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
512f1d2b4d3SLarry Finger 		"[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc);
513f1d2b4d3SLarry Finger 	btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
514f1d2b4d3SLarry Finger }
515f1d2b4d3SLarry Finger 
halbtc8723b1ant_coex_table(struct btc_coexist * btcoexist,bool force_exec,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)516f1d2b4d3SLarry Finger static void halbtc8723b1ant_coex_table(struct btc_coexist *btcoexist,
517f1d2b4d3SLarry Finger 				       bool force_exec, u32 val0x6c0,
518f1d2b4d3SLarry Finger 				       u32 val0x6c4, u32 val0x6c8,
519f1d2b4d3SLarry Finger 				       u8 val0x6cc)
520f1d2b4d3SLarry Finger {
521dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
522dd192494SLarry Finger 
523c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
524f1d2b4d3SLarry Finger 		"[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6cc = 0x%x\n",
525f1d2b4d3SLarry Finger 		 (force_exec ? "force to" : ""),
526f1d2b4d3SLarry Finger 		 val0x6c0, val0x6c4, val0x6cc);
527f1d2b4d3SLarry Finger 	coex_dm->cur_val0x6c0 = val0x6c0;
528f1d2b4d3SLarry Finger 	coex_dm->cur_val0x6c4 = val0x6c4;
529f1d2b4d3SLarry Finger 	coex_dm->cur_val0x6c8 = val0x6c8;
530f1d2b4d3SLarry Finger 	coex_dm->cur_val0x6cc = val0x6cc;
531f1d2b4d3SLarry Finger 
532f1d2b4d3SLarry Finger 	if (!force_exec) {
533f1d2b4d3SLarry Finger 		if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
534f1d2b4d3SLarry Finger 		    (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
535f1d2b4d3SLarry Finger 		    (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
536f1d2b4d3SLarry Finger 		    (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
537f1d2b4d3SLarry Finger 			return;
538f1d2b4d3SLarry Finger 	}
539f1d2b4d3SLarry Finger 	halbtc8723b1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,
540f1d2b4d3SLarry Finger 				       val0x6c8, val0x6cc);
541f1d2b4d3SLarry Finger 
542f1d2b4d3SLarry Finger 	coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
543f1d2b4d3SLarry Finger 	coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
544f1d2b4d3SLarry Finger 	coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
545f1d2b4d3SLarry Finger 	coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
546f1d2b4d3SLarry Finger }
547f1d2b4d3SLarry Finger 
halbtc8723b1ant_coex_table_with_type(struct btc_coexist * btcoexist,bool force_exec,u8 type)548f1d2b4d3SLarry Finger static void halbtc8723b1ant_coex_table_with_type(struct btc_coexist *btcoexist,
549f1d2b4d3SLarry Finger 						 bool force_exec, u8 type)
550f1d2b4d3SLarry Finger {
55146b5689cSPing-Ke Shih 	coex_sta->coex_table_type = type;
55246b5689cSPing-Ke Shih 
553f1d2b4d3SLarry Finger 	switch (type) {
554f1d2b4d3SLarry Finger 	case 0:
555f1d2b4d3SLarry Finger 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
556f1d2b4d3SLarry Finger 					   0x55555555, 0xffffff, 0x3);
557f1d2b4d3SLarry Finger 		break;
558f1d2b4d3SLarry Finger 	case 1:
559f1d2b4d3SLarry Finger 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
560f1d2b4d3SLarry Finger 					   0x5a5a5a5a, 0xffffff, 0x3);
561f1d2b4d3SLarry Finger 		break;
562f1d2b4d3SLarry Finger 	case 2:
563f1d2b4d3SLarry Finger 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
564f1d2b4d3SLarry Finger 					   0x5a5a5a5a, 0xffffff, 0x3);
565f1d2b4d3SLarry Finger 		break;
566f1d2b4d3SLarry Finger 	case 3:
567f1d2b4d3SLarry Finger 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
568056faad2SPing-Ke Shih 					   0x5a5a5a5a, 0xffffff, 0x3);
569f1d2b4d3SLarry Finger 		break;
570f1d2b4d3SLarry Finger 	case 4:
571056faad2SPing-Ke Shih 		if ((coex_sta->cck_ever_lock) && (coex_sta->scan_ap_num <= 5))
572056faad2SPing-Ke Shih 			halbtc8723b1ant_coex_table(btcoexist, force_exec,
573056faad2SPing-Ke Shih 						   0x55555555, 0xaaaa5a5a,
574056faad2SPing-Ke Shih 						   0xffffff, 0x3);
575056faad2SPing-Ke Shih 		else
576056faad2SPing-Ke Shih 			halbtc8723b1ant_coex_table(btcoexist, force_exec,
577056faad2SPing-Ke Shih 						   0x55555555, 0x5a5a5a5a,
578056faad2SPing-Ke Shih 						   0xffffff, 0x3);
579f1d2b4d3SLarry Finger 		break;
580f1d2b4d3SLarry Finger 	case 5:
58114cc696cSGustavo A. R. Silva 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
58214cc696cSGustavo A. R. Silva 					   0x5aaa5a5a, 0xffffff, 0x3);
583f1d2b4d3SLarry Finger 		break;
584f1d2b4d3SLarry Finger 	case 6:
585f1d2b4d3SLarry Finger 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55555555,
586056faad2SPing-Ke Shih 					   0xaaaaaaaa, 0xffffff, 0x3);
587f1d2b4d3SLarry Finger 		break;
588f1d2b4d3SLarry Finger 	case 7:
589f1d2b4d3SLarry Finger 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,
590f1d2b4d3SLarry Finger 					   0xaaaaaaaa, 0xffffff, 0x3);
591f1d2b4d3SLarry Finger 		break;
592056faad2SPing-Ke Shih 	case 8:
593056faad2SPing-Ke Shih 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
594056faad2SPing-Ke Shih 					   0x5ada5ada, 0xffffff, 0x3);
595056faad2SPing-Ke Shih 		break;
596056faad2SPing-Ke Shih 	case 9:
597056faad2SPing-Ke Shih 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
598056faad2SPing-Ke Shih 					   0x5ada5ada, 0xffffff, 0x3);
599056faad2SPing-Ke Shih 		break;
600056faad2SPing-Ke Shih 	case 10:
601056faad2SPing-Ke Shih 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
602056faad2SPing-Ke Shih 					   0x5ada5ada, 0xffffff, 0x3);
603056faad2SPing-Ke Shih 		break;
604056faad2SPing-Ke Shih 	case 11:
605056faad2SPing-Ke Shih 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
606056faad2SPing-Ke Shih 					   0x5ada5ada, 0xffffff, 0x3);
607056faad2SPing-Ke Shih 		break;
608056faad2SPing-Ke Shih 	case 12:
609056faad2SPing-Ke Shih 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
610056faad2SPing-Ke Shih 					   0x5ada5ada, 0xffffff, 0x3);
611056faad2SPing-Ke Shih 		break;
612056faad2SPing-Ke Shih 	case 13:
613056faad2SPing-Ke Shih 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
614056faad2SPing-Ke Shih 					   0xaaaaaaaa, 0xffffff, 0x3);
615056faad2SPing-Ke Shih 		break;
616056faad2SPing-Ke Shih 	case 14:
617056faad2SPing-Ke Shih 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
618056faad2SPing-Ke Shih 					   0x5ada5ada, 0xffffff, 0x3);
619056faad2SPing-Ke Shih 		break;
620056faad2SPing-Ke Shih 	case 15:
621056faad2SPing-Ke Shih 		halbtc8723b1ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
622056faad2SPing-Ke Shih 					   0xaaaaaaaa, 0xffffff, 0x3);
623056faad2SPing-Ke Shih 		break;
624f1d2b4d3SLarry Finger 	default:
625f1d2b4d3SLarry Finger 		break;
626f1d2b4d3SLarry Finger 	}
627f1d2b4d3SLarry Finger }
628f1d2b4d3SLarry Finger 
629c6821613SYan-Hsuan Chuang static void
halbtc8723b1ant_set_fw_ignore_wlan_act(struct btc_coexist * btcoexist,bool enable)630c6821613SYan-Hsuan Chuang halbtc8723b1ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,
631f1d2b4d3SLarry Finger 				       bool enable)
632f1d2b4d3SLarry Finger {
633dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
634f1d2b4d3SLarry Finger 	u8 h2c_parameter[1] = {0};
635f1d2b4d3SLarry Finger 
636f1d2b4d3SLarry Finger 	if (enable)
637f1d2b4d3SLarry Finger 		h2c_parameter[0] |= BIT0;	/* function enable */
638f1d2b4d3SLarry Finger 
639c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
640f1d2b4d3SLarry Finger 		"[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
641f1d2b4d3SLarry Finger 		h2c_parameter[0]);
642f1d2b4d3SLarry Finger 
643f1d2b4d3SLarry Finger 	btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
644f1d2b4d3SLarry Finger }
645f1d2b4d3SLarry Finger 
halbtc8723b1ant_ignore_wlan_act(struct btc_coexist * btcoexist,bool force_exec,bool enable)646f1d2b4d3SLarry Finger static void halbtc8723b1ant_ignore_wlan_act(struct btc_coexist *btcoexist,
647f1d2b4d3SLarry Finger 					    bool force_exec, bool enable)
648f1d2b4d3SLarry Finger {
649dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
650dd192494SLarry Finger 
651c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
652f1d2b4d3SLarry Finger 		"[BTCoex], %s turn Ignore WlanAct %s\n",
653f1d2b4d3SLarry Finger 		(force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
654f1d2b4d3SLarry Finger 	coex_dm->cur_ignore_wlan_act = enable;
655f1d2b4d3SLarry Finger 
656f1d2b4d3SLarry Finger 	if (!force_exec) {
657c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
658f1d2b4d3SLarry Finger 			"[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n",
659f1d2b4d3SLarry Finger 			coex_dm->pre_ignore_wlan_act,
660f1d2b4d3SLarry Finger 			 coex_dm->cur_ignore_wlan_act);
661f1d2b4d3SLarry Finger 
662f1d2b4d3SLarry Finger 		if (coex_dm->pre_ignore_wlan_act ==
663f1d2b4d3SLarry Finger 		    coex_dm->cur_ignore_wlan_act)
664f1d2b4d3SLarry Finger 			return;
665f1d2b4d3SLarry Finger 	}
666c6821613SYan-Hsuan Chuang 	halbtc8723b1ant_set_fw_ignore_wlan_act(btcoexist, enable);
667f1d2b4d3SLarry Finger 
668f1d2b4d3SLarry Finger 	coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
669f1d2b4d3SLarry Finger }
670f1d2b4d3SLarry Finger 
halbtc8723b1ant_set_fw_ps_tdma(struct btc_coexist * btcoexist,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 byte5)671f1d2b4d3SLarry Finger static void halbtc8723b1ant_set_fw_ps_tdma(struct btc_coexist *btcoexist,
672f1d2b4d3SLarry Finger 					   u8 byte1, u8 byte2, u8 byte3,
673f1d2b4d3SLarry Finger 					   u8 byte4, u8 byte5)
674f1d2b4d3SLarry Finger {
675dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
676f1d2b4d3SLarry Finger 	u8 h2c_parameter[5] = {0};
677f1d2b4d3SLarry Finger 	u8 real_byte1 = byte1, real_byte5 = byte5;
678f1d2b4d3SLarry Finger 	bool ap_enable = false;
679f1d2b4d3SLarry Finger 
680f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
681f1d2b4d3SLarry Finger 			   &ap_enable);
682f1d2b4d3SLarry Finger 
683f1d2b4d3SLarry Finger 	if (ap_enable) {
684f1d2b4d3SLarry Finger 		if ((byte1 & BIT4) && !(byte1 & BIT5)) {
685c8159c3fSLarry Finger 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
686f1d2b4d3SLarry Finger 				"[BTCoex], FW for 1Ant AP mode\n");
687f1d2b4d3SLarry Finger 			real_byte1 &= ~BIT4;
688f1d2b4d3SLarry Finger 			real_byte1 |= BIT5;
689f1d2b4d3SLarry Finger 
690f1d2b4d3SLarry Finger 			real_byte5 |= BIT5;
691f1d2b4d3SLarry Finger 			real_byte5 &= ~BIT6;
692f1d2b4d3SLarry Finger 		}
693f1d2b4d3SLarry Finger 	}
694f1d2b4d3SLarry Finger 
695f1d2b4d3SLarry Finger 	h2c_parameter[0] = real_byte1;
696f1d2b4d3SLarry Finger 	h2c_parameter[1] = byte2;
697f1d2b4d3SLarry Finger 	h2c_parameter[2] = byte3;
698f1d2b4d3SLarry Finger 	h2c_parameter[3] = byte4;
699f1d2b4d3SLarry Finger 	h2c_parameter[4] = real_byte5;
700f1d2b4d3SLarry Finger 
701f1d2b4d3SLarry Finger 	coex_dm->ps_tdma_para[0] = real_byte1;
702f1d2b4d3SLarry Finger 	coex_dm->ps_tdma_para[1] = byte2;
703f1d2b4d3SLarry Finger 	coex_dm->ps_tdma_para[2] = byte3;
704f1d2b4d3SLarry Finger 	coex_dm->ps_tdma_para[3] = byte4;
705f1d2b4d3SLarry Finger 	coex_dm->ps_tdma_para[4] = real_byte5;
706f1d2b4d3SLarry Finger 
707c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
708f1d2b4d3SLarry Finger 		"[BTCoex], PS-TDMA H2C cmd =0x%x%08x\n",
709f1d2b4d3SLarry Finger 		h2c_parameter[0],
710f1d2b4d3SLarry Finger 		h2c_parameter[1] << 24 |
711f1d2b4d3SLarry Finger 		h2c_parameter[2] << 16 |
712f1d2b4d3SLarry Finger 		h2c_parameter[3] << 8 |
713f1d2b4d3SLarry Finger 		h2c_parameter[4]);
714f1d2b4d3SLarry Finger 
715f1d2b4d3SLarry Finger 	btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
716f1d2b4d3SLarry Finger }
717f1d2b4d3SLarry Finger 
halbtc8723b1ant_set_lps_rpwm(struct btc_coexist * btcoexist,u8 lps_val,u8 rpwm_val)718f1d2b4d3SLarry Finger static void halbtc8723b1ant_set_lps_rpwm(struct btc_coexist *btcoexist,
719f1d2b4d3SLarry Finger 					 u8 lps_val, u8 rpwm_val)
720f1d2b4d3SLarry Finger {
721f1d2b4d3SLarry Finger 	u8 lps = lps_val;
722f1d2b4d3SLarry Finger 	u8 rpwm = rpwm_val;
723f1d2b4d3SLarry Finger 
724f1d2b4d3SLarry Finger 	btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
725f1d2b4d3SLarry Finger 	btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
726f1d2b4d3SLarry Finger }
727f1d2b4d3SLarry Finger 
halbtc8723b1ant_lps_rpwm(struct btc_coexist * btcoexist,bool force_exec,u8 lps_val,u8 rpwm_val)728c6821613SYan-Hsuan Chuang static void halbtc8723b1ant_lps_rpwm(struct btc_coexist *btcoexist,
729f1d2b4d3SLarry Finger 				     bool force_exec,
730f1d2b4d3SLarry Finger 				     u8 lps_val, u8 rpwm_val)
731f1d2b4d3SLarry Finger {
732dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
733dd192494SLarry Finger 
734c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
735f1d2b4d3SLarry Finger 		"[BTCoex], %s set lps/rpwm = 0x%x/0x%x\n",
736f1d2b4d3SLarry Finger 		(force_exec ? "force to" : ""), lps_val, rpwm_val);
737f1d2b4d3SLarry Finger 	coex_dm->cur_lps = lps_val;
738f1d2b4d3SLarry Finger 	coex_dm->cur_rpwm = rpwm_val;
739f1d2b4d3SLarry Finger 
740f1d2b4d3SLarry Finger 	if (!force_exec) {
741c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
742f1d2b4d3SLarry Finger 			"[BTCoex], LPS-RxBeaconMode = 0x%x , LPS-RPWM = 0x%x!!\n",
743f1d2b4d3SLarry Finger 			coex_dm->cur_lps, coex_dm->cur_rpwm);
744f1d2b4d3SLarry Finger 
745f1d2b4d3SLarry Finger 		if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
746f1d2b4d3SLarry Finger 		    (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) {
747c8159c3fSLarry Finger 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
748f1d2b4d3SLarry Finger 				"[BTCoex], LPS-RPWM_Last = 0x%x , LPS-RPWM_Now = 0x%x!!\n",
749f1d2b4d3SLarry Finger 				coex_dm->pre_rpwm, coex_dm->cur_rpwm);
750f1d2b4d3SLarry Finger 
751f1d2b4d3SLarry Finger 			return;
752f1d2b4d3SLarry Finger 		}
753f1d2b4d3SLarry Finger 	}
754f1d2b4d3SLarry Finger 	halbtc8723b1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
755f1d2b4d3SLarry Finger 
756f1d2b4d3SLarry Finger 	coex_dm->pre_lps = coex_dm->cur_lps;
757f1d2b4d3SLarry Finger 	coex_dm->pre_rpwm = coex_dm->cur_rpwm;
758f1d2b4d3SLarry Finger }
759f1d2b4d3SLarry Finger 
halbtc8723b1ant_sw_mechanism(struct btc_coexist * btcoexist,bool low_penalty_ra)760f1d2b4d3SLarry Finger static void halbtc8723b1ant_sw_mechanism(struct btc_coexist *btcoexist,
761f1d2b4d3SLarry Finger 					 bool low_penalty_ra)
762f1d2b4d3SLarry Finger {
763dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
764dd192494SLarry Finger 
765c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
766f1d2b4d3SLarry Finger 		"[BTCoex], SM[LpRA] = %d\n", low_penalty_ra);
767f1d2b4d3SLarry Finger 
768f1d2b4d3SLarry Finger 	halbtc8723b1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
769f1d2b4d3SLarry Finger }
770f1d2b4d3SLarry Finger 
halbtc8723b1ant_set_ant_path(struct btc_coexist * btcoexist,u8 ant_pos_type,bool force_exec,bool init_hw_cfg,bool wifi_off)771c6821613SYan-Hsuan Chuang static void halbtc8723b1ant_set_ant_path(struct btc_coexist *btcoexist,
77296e3baadSPing-Ke Shih 					 u8 ant_pos_type, bool force_exec,
77396e3baadSPing-Ke Shih 					 bool init_hw_cfg, bool wifi_off)
774f1d2b4d3SLarry Finger {
77596e3baadSPing-Ke Shih 	struct rtl_priv *rtlpriv = btcoexist->adapter;
776f1d2b4d3SLarry Finger 	struct btc_board_info *board_info = &btcoexist->board_info;
77796e3baadSPing-Ke Shih 	u32 fw_ver = 0, u32tmp = 0, cnt_bt_cal_chk = 0;
778f1d2b4d3SLarry Finger 	bool pg_ext_switch = false;
779f1d2b4d3SLarry Finger 	bool use_ext_switch = false;
78096e3baadSPing-Ke Shih 	bool is_in_mp_mode = false;
78196e3baadSPing-Ke Shih 	u8 h2c_parameter[2] = {0}, u8tmp = 0;
78296e3baadSPing-Ke Shih 
78396e3baadSPing-Ke Shih 	coex_dm->cur_ant_pos_type = ant_pos_type;
784f1d2b4d3SLarry Finger 
785f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_EXT_SWITCH, &pg_ext_switch);
786f1d2b4d3SLarry Finger 	/* [31:16] = fw ver, [15:0] = fw sub ver */
787f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
788f1d2b4d3SLarry Finger 
789f1d2b4d3SLarry Finger 	if ((fw_ver < 0xc0000) || pg_ext_switch)
790f1d2b4d3SLarry Finger 		use_ext_switch = true;
791f1d2b4d3SLarry Finger 
792f1d2b4d3SLarry Finger 	if (init_hw_cfg) {
79396e3baadSPing-Ke Shih 		/* WiFi TRx Mask on */
79496e3baadSPing-Ke Shih 		btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
79596e3baadSPing-Ke Shih 					  0x780);
79696e3baadSPing-Ke Shih 		/* remove due to interrupt is disabled that polling c2h will
79796e3baadSPing-Ke Shih 		 * fail and delay 100ms.
79896e3baadSPing-Ke Shih 		 */
799f1d2b4d3SLarry Finger 
80096e3baadSPing-Ke Shih 		if (fw_ver >= 0x180000) {
80196e3baadSPing-Ke Shih 			/* Use H2C to set GNT_BT to HIGH */
80296e3baadSPing-Ke Shih 			h2c_parameter[0] = 1;
80396e3baadSPing-Ke Shih 			btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
80496e3baadSPing-Ke Shih 						h2c_parameter);
80596e3baadSPing-Ke Shih 		} else {
80696e3baadSPing-Ke Shih 			/* set grant_bt to high */
80796e3baadSPing-Ke Shih 			btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
80896e3baadSPing-Ke Shih 		}
80996e3baadSPing-Ke Shih 		/* set wlan_act control by PTA */
81096e3baadSPing-Ke Shih 		btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
81196e3baadSPing-Ke Shih 
812f1d2b4d3SLarry Finger 		/* BT select s0/s1 is controlled by BT */
813f1d2b4d3SLarry Finger 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x0);
81496e3baadSPing-Ke Shih 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x39, 0x8, 0x1);
81596e3baadSPing-Ke Shih 		btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
81696e3baadSPing-Ke Shih 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x944, 0x3, 0x3);
81796e3baadSPing-Ke Shih 		btcoexist->btc_write_1byte(btcoexist, 0x930, 0x77);
81896e3baadSPing-Ke Shih 	} else if (wifi_off) {
81996e3baadSPing-Ke Shih 		if (fw_ver >= 0x180000) {
82096e3baadSPing-Ke Shih 			/* Use H2C to set GNT_BT to HIGH */
82196e3baadSPing-Ke Shih 			h2c_parameter[0] = 1;
82296e3baadSPing-Ke Shih 			btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
82396e3baadSPing-Ke Shih 						h2c_parameter);
82496e3baadSPing-Ke Shih 		} else {
82596e3baadSPing-Ke Shih 			/* set grant_bt to high */
82696e3baadSPing-Ke Shih 			btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
82796e3baadSPing-Ke Shih 		}
82896e3baadSPing-Ke Shih 		/* set wlan_act to always low */
82996e3baadSPing-Ke Shih 		btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
83096e3baadSPing-Ke Shih 
83196e3baadSPing-Ke Shih 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE,
83296e3baadSPing-Ke Shih 				   &is_in_mp_mode);
83396e3baadSPing-Ke Shih 		if (!is_in_mp_mode)
83496e3baadSPing-Ke Shih 			/* BT select s0/s1 is controlled by BT */
83596e3baadSPing-Ke Shih 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67,
83696e3baadSPing-Ke Shih 							   0x20, 0x0);
83796e3baadSPing-Ke Shih 		else
83896e3baadSPing-Ke Shih 			/* BT select s0/s1 is controlled by WiFi */
83996e3baadSPing-Ke Shih 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67,
84096e3baadSPing-Ke Shih 							   0x20, 0x1);
841f1d2b4d3SLarry Finger 
842f1d2b4d3SLarry Finger 		/* 0x4c[24:23]=00, Set Antenna control by BT_RFE_CTRL
843f1d2b4d3SLarry Finger 		 * BT Vendor 0xac=0xf002
844f1d2b4d3SLarry Finger 		 */
845f1d2b4d3SLarry Finger 		u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
846f1d2b4d3SLarry Finger 		u32tmp &= ~BIT23;
847f1d2b4d3SLarry Finger 		u32tmp &= ~BIT24;
848f1d2b4d3SLarry Finger 		btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
84996e3baadSPing-Ke Shih 	} else {
85096e3baadSPing-Ke Shih 		/* Use H2C to set GNT_BT to LOW */
85196e3baadSPing-Ke Shih 		if (fw_ver >= 0x180000) {
85296e3baadSPing-Ke Shih 			if (btcoexist->btc_read_1byte(btcoexist, 0x765) != 0) {
85396e3baadSPing-Ke Shih 				h2c_parameter[0] = 0;
85496e3baadSPing-Ke Shih 				btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
85596e3baadSPing-Ke Shih 							h2c_parameter);
85696e3baadSPing-Ke Shih 			}
85796e3baadSPing-Ke Shih 		} else {
85896e3baadSPing-Ke Shih 			/* BT calibration check */
85996e3baadSPing-Ke Shih 			while (cnt_bt_cal_chk <= 20) {
86096e3baadSPing-Ke Shih 				u8tmp = btcoexist->btc_read_1byte(btcoexist,
86196e3baadSPing-Ke Shih 								  0x49d);
86296e3baadSPing-Ke Shih 				cnt_bt_cal_chk++;
86396e3baadSPing-Ke Shih 				if (u8tmp & BIT(0)) {
864c8159c3fSLarry Finger 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
86596e3baadSPing-Ke Shih 						DBG_LOUD,
86696e3baadSPing-Ke Shih 						"[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n",
86796e3baadSPing-Ke Shih 						cnt_bt_cal_chk);
86896e3baadSPing-Ke Shih 					mdelay(50);
86996e3baadSPing-Ke Shih 				} else {
870c8159c3fSLarry Finger 					rtl_dbg(rtlpriv, COMP_BT_COEXIST,
87196e3baadSPing-Ke Shih 						DBG_LOUD,
87296e3baadSPing-Ke Shih 						"[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n",
87396e3baadSPing-Ke Shih 						cnt_bt_cal_chk);
87496e3baadSPing-Ke Shih 					break;
87596e3baadSPing-Ke Shih 				}
87696e3baadSPing-Ke Shih 			}
87796e3baadSPing-Ke Shih 
87896e3baadSPing-Ke Shih 			/* set grant_bt to PTA */
87996e3baadSPing-Ke Shih 			btcoexist->btc_write_1byte(btcoexist, 0x765, 0x0);
88096e3baadSPing-Ke Shih 		}
88196e3baadSPing-Ke Shih 
88296e3baadSPing-Ke Shih 		if (btcoexist->btc_read_1byte(btcoexist, 0x76e) != 0xc) {
88396e3baadSPing-Ke Shih 			/* set wlan_act control by PTA */
88496e3baadSPing-Ke Shih 			btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
88596e3baadSPing-Ke Shih 		}
88696e3baadSPing-Ke Shih 
88796e3baadSPing-Ke Shih 		btcoexist->btc_write_1byte_bitmask(
88896e3baadSPing-Ke Shih 			btcoexist, 0x67, 0x20,
88996e3baadSPing-Ke Shih 			0x1); /* BT select s0/s1 is controlled by WiFi */
890f1d2b4d3SLarry Finger 	}
891f1d2b4d3SLarry Finger 
892f1d2b4d3SLarry Finger 	if (use_ext_switch) {
893f1d2b4d3SLarry Finger 		if (init_hw_cfg) {
894f1d2b4d3SLarry Finger 			/* 0x4c[23] = 0, 0x4c[24] = 1
895f1d2b4d3SLarry Finger 			 * Antenna control by WL/BT
896f1d2b4d3SLarry Finger 			 */
897f1d2b4d3SLarry Finger 			u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
898f1d2b4d3SLarry Finger 			u32tmp &= ~BIT23;
899f1d2b4d3SLarry Finger 			u32tmp |= BIT24;
900f1d2b4d3SLarry Finger 			btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
901f1d2b4d3SLarry Finger 
90296e3baadSPing-Ke Shih 			/* fixed internal switch S1->WiFi, S0->BT */
90396e3baadSPing-Ke Shih 			btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
90496e3baadSPing-Ke Shih 
905f1d2b4d3SLarry Finger 			if (board_info->btdm_ant_pos ==
906f1d2b4d3SLarry Finger 			    BTC_ANTENNA_AT_MAIN_PORT) {
907f1d2b4d3SLarry Finger 				/* tell firmware "no antenna inverse" */
908f1d2b4d3SLarry Finger 				h2c_parameter[0] = 0;
90996e3baadSPing-Ke Shih 				/* ext switch type */
91096e3baadSPing-Ke Shih 				h2c_parameter[1] = 1;
911f1d2b4d3SLarry Finger 				btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
912f1d2b4d3SLarry Finger 							h2c_parameter);
913f1d2b4d3SLarry Finger 			} else {
914f1d2b4d3SLarry Finger 				/* tell firmware "antenna inverse" */
915f1d2b4d3SLarry Finger 				h2c_parameter[0] = 1;
91696e3baadSPing-Ke Shih 				/* ext switch type */
91796e3baadSPing-Ke Shih 				h2c_parameter[1] = 1;
918f1d2b4d3SLarry Finger 				btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
919f1d2b4d3SLarry Finger 							h2c_parameter);
920f1d2b4d3SLarry Finger 			}
921f1d2b4d3SLarry Finger 		}
922f1d2b4d3SLarry Finger 
92396e3baadSPing-Ke Shih 		if (force_exec ||
92496e3baadSPing-Ke Shih 		    (coex_dm->cur_ant_pos_type != coex_dm->pre_ant_pos_type)) {
925f1d2b4d3SLarry Finger 			/* ext switch setting */
926f1d2b4d3SLarry Finger 			switch (ant_pos_type) {
927f1d2b4d3SLarry Finger 			case BTC_ANT_PATH_WIFI:
928f1d2b4d3SLarry Finger 				if (board_info->btdm_ant_pos ==
929f1d2b4d3SLarry Finger 				    BTC_ANTENNA_AT_MAIN_PORT)
93096e3baadSPing-Ke Shih 					btcoexist->btc_write_1byte_bitmask(
93196e3baadSPing-Ke Shih 						btcoexist, 0x92c, 0x3, 0x1);
932f1d2b4d3SLarry Finger 				else
93396e3baadSPing-Ke Shih 					btcoexist->btc_write_1byte_bitmask(
93496e3baadSPing-Ke Shih 						btcoexist, 0x92c, 0x3, 0x2);
935f1d2b4d3SLarry Finger 				break;
936f1d2b4d3SLarry Finger 			case BTC_ANT_PATH_BT:
937f1d2b4d3SLarry Finger 				if (board_info->btdm_ant_pos ==
938f1d2b4d3SLarry Finger 				    BTC_ANTENNA_AT_MAIN_PORT)
93996e3baadSPing-Ke Shih 					btcoexist->btc_write_1byte_bitmask(
94096e3baadSPing-Ke Shih 						btcoexist, 0x92c, 0x3, 0x2);
941f1d2b4d3SLarry Finger 				else
94296e3baadSPing-Ke Shih 					btcoexist->btc_write_1byte_bitmask(
94396e3baadSPing-Ke Shih 						btcoexist, 0x92c, 0x3, 0x1);
944f1d2b4d3SLarry Finger 				break;
945f1d2b4d3SLarry Finger 			default:
946f1d2b4d3SLarry Finger 			case BTC_ANT_PATH_PTA:
947f1d2b4d3SLarry Finger 				if (board_info->btdm_ant_pos ==
948f1d2b4d3SLarry Finger 				    BTC_ANTENNA_AT_MAIN_PORT)
94996e3baadSPing-Ke Shih 					btcoexist->btc_write_1byte_bitmask(
95096e3baadSPing-Ke Shih 						btcoexist, 0x92c, 0x3, 0x1);
951f1d2b4d3SLarry Finger 				else
95296e3baadSPing-Ke Shih 					btcoexist->btc_write_1byte_bitmask(
95396e3baadSPing-Ke Shih 						btcoexist, 0x92c, 0x3, 0x2);
954f1d2b4d3SLarry Finger 				break;
955f1d2b4d3SLarry Finger 			}
95696e3baadSPing-Ke Shih 		}
957f1d2b4d3SLarry Finger 	} else {
958f1d2b4d3SLarry Finger 		if (init_hw_cfg) {
95996e3baadSPing-Ke Shih 			/* 0x4c[23] = 1, 0x4c[24] = 0,
96096e3baadSPing-Ke Shih 			 * Antenna control by 0x64
96196e3baadSPing-Ke Shih 			 */
962f1d2b4d3SLarry Finger 			u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
963f1d2b4d3SLarry Finger 			u32tmp |= BIT23;
964f1d2b4d3SLarry Finger 			u32tmp &= ~BIT24;
965f1d2b4d3SLarry Finger 			btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
966f1d2b4d3SLarry Finger 
96796e3baadSPing-Ke Shih 			/* Fix Ext switch Main->S1, Aux->S0 */
96896e3baadSPing-Ke Shih 			btcoexist->btc_write_1byte_bitmask(btcoexist, 0x64, 0x1,
969f1d2b4d3SLarry Finger 							   0x0);
970f1d2b4d3SLarry Finger 
97196e3baadSPing-Ke Shih 			if (board_info->btdm_ant_pos ==
97296e3baadSPing-Ke Shih 			    BTC_ANTENNA_AT_MAIN_PORT) {
973f1d2b4d3SLarry Finger 				/* tell firmware "no antenna inverse" */
974f1d2b4d3SLarry Finger 				h2c_parameter[0] = 0;
97596e3baadSPing-Ke Shih 				/* internal switch type */
97696e3baadSPing-Ke Shih 				h2c_parameter[1] = 0;
977f1d2b4d3SLarry Finger 				btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
978f1d2b4d3SLarry Finger 							h2c_parameter);
979f1d2b4d3SLarry Finger 			} else {
980f1d2b4d3SLarry Finger 				/* tell firmware "antenna inverse" */
981f1d2b4d3SLarry Finger 				h2c_parameter[0] = 1;
98296e3baadSPing-Ke Shih 				/* internal switch type */
98396e3baadSPing-Ke Shih 				h2c_parameter[1] = 0;
984f1d2b4d3SLarry Finger 				btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
985f1d2b4d3SLarry Finger 							h2c_parameter);
986f1d2b4d3SLarry Finger 			}
987f1d2b4d3SLarry Finger 		}
988f1d2b4d3SLarry Finger 
98996e3baadSPing-Ke Shih 		if (force_exec ||
99096e3baadSPing-Ke Shih 		    (coex_dm->cur_ant_pos_type != coex_dm->pre_ant_pos_type)) {
991f1d2b4d3SLarry Finger 			/* internal switch setting */
992f1d2b4d3SLarry Finger 			switch (ant_pos_type) {
993f1d2b4d3SLarry Finger 			case BTC_ANT_PATH_WIFI:
994f1d2b4d3SLarry Finger 				if (board_info->btdm_ant_pos ==
995f1d2b4d3SLarry Finger 				    BTC_ANTENNA_AT_MAIN_PORT)
99696e3baadSPing-Ke Shih 					btcoexist->btc_write_4byte(btcoexist,
99796e3baadSPing-Ke Shih 							0x948, 0x0);
998f1d2b4d3SLarry Finger 				else
99996e3baadSPing-Ke Shih 					btcoexist->btc_write_4byte(btcoexist,
100096e3baadSPing-Ke Shih 							0x948, 0x280);
1001f1d2b4d3SLarry Finger 				break;
1002f1d2b4d3SLarry Finger 			case BTC_ANT_PATH_BT:
1003f1d2b4d3SLarry Finger 				if (board_info->btdm_ant_pos ==
1004f1d2b4d3SLarry Finger 				    BTC_ANTENNA_AT_MAIN_PORT)
100596e3baadSPing-Ke Shih 					btcoexist->btc_write_4byte(btcoexist,
100696e3baadSPing-Ke Shih 							0x948, 0x280);
1007f1d2b4d3SLarry Finger 				else
100896e3baadSPing-Ke Shih 					btcoexist->btc_write_4byte(btcoexist,
100996e3baadSPing-Ke Shih 							0x948, 0x0);
1010f1d2b4d3SLarry Finger 				break;
1011f1d2b4d3SLarry Finger 			default:
1012f1d2b4d3SLarry Finger 			case BTC_ANT_PATH_PTA:
1013f1d2b4d3SLarry Finger 				if (board_info->btdm_ant_pos ==
1014f1d2b4d3SLarry Finger 				    BTC_ANTENNA_AT_MAIN_PORT)
101596e3baadSPing-Ke Shih 					btcoexist->btc_write_4byte(btcoexist,
101696e3baadSPing-Ke Shih 							0x948, 0x200);
1017f1d2b4d3SLarry Finger 				else
101896e3baadSPing-Ke Shih 					btcoexist->btc_write_4byte(btcoexist,
101996e3baadSPing-Ke Shih 							0x948, 0x80);
1020f1d2b4d3SLarry Finger 				break;
1021f1d2b4d3SLarry Finger 			}
1022f1d2b4d3SLarry Finger 		}
1023f1d2b4d3SLarry Finger 	}
1024f1d2b4d3SLarry Finger 
102596e3baadSPing-Ke Shih 	coex_dm->pre_ant_pos_type = coex_dm->cur_ant_pos_type;
102696e3baadSPing-Ke Shih }
102796e3baadSPing-Ke Shih 
halbtc8723b1ant_ps_tdma(struct btc_coexist * btcoexist,bool force_exec,bool turn_on,u8 type)1028f1d2b4d3SLarry Finger static void halbtc8723b1ant_ps_tdma(struct btc_coexist *btcoexist,
1029f1d2b4d3SLarry Finger 				    bool force_exec, bool turn_on, u8 type)
1030f1d2b4d3SLarry Finger {
10310d4ae142SPing-Ke Shih 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1032f1d2b4d3SLarry Finger 	bool wifi_busy = false;
1033f1d2b4d3SLarry Finger 	u8 rssi_adjust_val = 0;
10340d4ae142SPing-Ke Shih 	u8 ps_tdma_byte0_val = 0x51;
10350d4ae142SPing-Ke Shih 	u8 ps_tdma_byte3_val = 0x10;
10360d4ae142SPing-Ke Shih 	u8 ps_tdma_byte4_val = 0x50;
10370d4ae142SPing-Ke Shih 	s8 wifi_duration_adjust = 0x0;
10380d4ae142SPing-Ke Shih 	static bool pre_wifi_busy;
1039f1d2b4d3SLarry Finger 
1040f1d2b4d3SLarry Finger 	coex_dm->cur_ps_tdma_on = turn_on;
1041f1d2b4d3SLarry Finger 	coex_dm->cur_ps_tdma = type;
1042f1d2b4d3SLarry Finger 
1043f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1044f1d2b4d3SLarry Finger 
10450d4ae142SPing-Ke Shih 	if (wifi_busy != pre_wifi_busy) {
10460d4ae142SPing-Ke Shih 		force_exec = true;
10470d4ae142SPing-Ke Shih 		pre_wifi_busy = wifi_busy;
10480d4ae142SPing-Ke Shih 	}
1049f1d2b4d3SLarry Finger 
10500d4ae142SPing-Ke Shih 	if (!force_exec) {
1051f1d2b4d3SLarry Finger 		if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1052f1d2b4d3SLarry Finger 		    (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1053f1d2b4d3SLarry Finger 			return;
1054f1d2b4d3SLarry Finger 	}
10550d4ae142SPing-Ke Shih 
10560d4ae142SPing-Ke Shih 	if (coex_sta->scan_ap_num <= 5) {
10570d4ae142SPing-Ke Shih 		wifi_duration_adjust = 5;
10580d4ae142SPing-Ke Shih 
10590d4ae142SPing-Ke Shih 		if (coex_sta->a2dp_bit_pool >= 35)
10600d4ae142SPing-Ke Shih 			wifi_duration_adjust = -10;
10610d4ae142SPing-Ke Shih 		else if (coex_sta->a2dp_bit_pool >= 45)
10620d4ae142SPing-Ke Shih 			wifi_duration_adjust = -15;
10630d4ae142SPing-Ke Shih 	} else if (coex_sta->scan_ap_num >= 40) {
10640d4ae142SPing-Ke Shih 		wifi_duration_adjust = -15;
10650d4ae142SPing-Ke Shih 
10660d4ae142SPing-Ke Shih 		if (coex_sta->a2dp_bit_pool < 35)
10670d4ae142SPing-Ke Shih 			wifi_duration_adjust = -5;
10680d4ae142SPing-Ke Shih 		else if (coex_sta->a2dp_bit_pool < 45)
10690d4ae142SPing-Ke Shih 			wifi_duration_adjust = -10;
10700d4ae142SPing-Ke Shih 	} else if (coex_sta->scan_ap_num >= 20) {
10710d4ae142SPing-Ke Shih 		wifi_duration_adjust = -10;
10720d4ae142SPing-Ke Shih 
10730d4ae142SPing-Ke Shih 		if (coex_sta->a2dp_bit_pool >= 45)
10740d4ae142SPing-Ke Shih 			wifi_duration_adjust = -15;
10750d4ae142SPing-Ke Shih 	} else {
10760d4ae142SPing-Ke Shih 		wifi_duration_adjust = 0;
10770d4ae142SPing-Ke Shih 
10780d4ae142SPing-Ke Shih 		if (coex_sta->a2dp_bit_pool >= 35)
10790d4ae142SPing-Ke Shih 			wifi_duration_adjust = -10;
10800d4ae142SPing-Ke Shih 		else if (coex_sta->a2dp_bit_pool >= 45)
10810d4ae142SPing-Ke Shih 			wifi_duration_adjust = -15;
10820d4ae142SPing-Ke Shih 	}
10830d4ae142SPing-Ke Shih 
10840d4ae142SPing-Ke Shih 	if ((type == 1) || (type == 2) || (type == 9) || (type == 11) ||
1085e28adf9aSPing-Ke Shih 	    (type == 101) || (type == 102) || (type == 109) || (type == 111)) {
10860d4ae142SPing-Ke Shih 		if (!coex_sta->force_lps_on) {
10870d4ae142SPing-Ke Shih 			/* Native power save TDMA, only for A2DP-only case
10880d4ae142SPing-Ke Shih 			 * 1/2/9/11 while wifi noisy threshold > 30
10890d4ae142SPing-Ke Shih 			 */
10900d4ae142SPing-Ke Shih 
10910d4ae142SPing-Ke Shih 			/* no null-pkt */
10920d4ae142SPing-Ke Shih 			ps_tdma_byte0_val = 0x61;
10930d4ae142SPing-Ke Shih 			/* no tx-pause at BT-slot */
10940d4ae142SPing-Ke Shih 			ps_tdma_byte3_val = 0x11;
10950d4ae142SPing-Ke Shih 			/* 0x778 = d/1 toggle, no dynamic slot */
10960d4ae142SPing-Ke Shih 			ps_tdma_byte4_val = 0x10;
10970d4ae142SPing-Ke Shih 		} else {
10980d4ae142SPing-Ke Shih 			/* null-pkt */
10990d4ae142SPing-Ke Shih 			ps_tdma_byte0_val = 0x51;
11000d4ae142SPing-Ke Shih 			/* tx-pause at BT-slot */
11010d4ae142SPing-Ke Shih 			ps_tdma_byte3_val = 0x10;
11020d4ae142SPing-Ke Shih 			/* 0x778 = d/1 toggle, dynamic slot */
11030d4ae142SPing-Ke Shih 			ps_tdma_byte4_val = 0x50;
11040d4ae142SPing-Ke Shih 		}
11050d4ae142SPing-Ke Shih 	} else if ((type == 3) || (type == 13) || (type == 14) ||
11060d4ae142SPing-Ke Shih 		   (type == 103) || (type == 113) || (type == 114)) {
11070d4ae142SPing-Ke Shih 		/* null-pkt */
11080d4ae142SPing-Ke Shih 		ps_tdma_byte0_val = 0x51;
11090d4ae142SPing-Ke Shih 		/* tx-pause at BT-slot */
11100d4ae142SPing-Ke Shih 		ps_tdma_byte3_val = 0x10;
11110d4ae142SPing-Ke Shih 		/* 0x778 = d/1 toggle, no dynamic slot */
11120d4ae142SPing-Ke Shih 		ps_tdma_byte4_val = 0x10;
11130d4ae142SPing-Ke Shih 	} else { /* native power save case */
11140d4ae142SPing-Ke Shih 		/* no null-pkt */
11150d4ae142SPing-Ke Shih 		ps_tdma_byte0_val = 0x61;
11160d4ae142SPing-Ke Shih 		/* no tx-pause at BT-slot */
11170d4ae142SPing-Ke Shih 		ps_tdma_byte3_val = 0x11;
11180d4ae142SPing-Ke Shih 		/* 0x778 = d/1 toggle, no dynamic slot */
11190d4ae142SPing-Ke Shih 		ps_tdma_byte4_val = 0x11;
11200d4ae142SPing-Ke Shih 		/* psTdmaByte4Va is not define for 0x778 = d/1, 1/1 case */
11210d4ae142SPing-Ke Shih 	}
11220d4ae142SPing-Ke Shih 
11230d4ae142SPing-Ke Shih 	/* if (bt_link_info->slave_role) */
11240d4ae142SPing-Ke Shih 	if ((bt_link_info->slave_role) && (bt_link_info->a2dp_exist))
11250d4ae142SPing-Ke Shih 		/* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
11260d4ae142SPing-Ke Shih 		ps_tdma_byte4_val = ps_tdma_byte4_val | 0x1;
11270d4ae142SPing-Ke Shih 
11280d4ae142SPing-Ke Shih 	if (type > 100) {
11290d4ae142SPing-Ke Shih 		/* set antenna control by SW	 */
11300d4ae142SPing-Ke Shih 		ps_tdma_byte0_val = ps_tdma_byte0_val | 0x82;
11310d4ae142SPing-Ke Shih 		/* set antenna no toggle, control by antenna diversity */
11320d4ae142SPing-Ke Shih 		ps_tdma_byte3_val = ps_tdma_byte3_val | 0x60;
11330d4ae142SPing-Ke Shih 	}
11340d4ae142SPing-Ke Shih 
1135f1d2b4d3SLarry Finger 	if (turn_on) {
1136f1d2b4d3SLarry Finger 		switch (type) {
1137f1d2b4d3SLarry Finger 		default:
1138f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1a,
11390d4ae142SPing-Ke Shih 						      0x1a, 0x0,
11400d4ae142SPing-Ke Shih 						      ps_tdma_byte4_val);
1141f1d2b4d3SLarry Finger 			break;
1142f1d2b4d3SLarry Finger 		case 1:
11430d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
11440d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val,
11450d4ae142SPing-Ke Shih 				0x3a + wifi_duration_adjust, 0x03,
11460d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, ps_tdma_byte4_val);
1147f1d2b4d3SLarry Finger 
1148f1d2b4d3SLarry Finger 			rssi_adjust_val = 11;
1149f1d2b4d3SLarry Finger 			break;
1150f1d2b4d3SLarry Finger 		case 2:
11510d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
11520d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val,
11530d4ae142SPing-Ke Shih 				0x2d + wifi_duration_adjust, 0x03,
11540d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, ps_tdma_byte4_val);
1155f1d2b4d3SLarry Finger 			break;
1156f1d2b4d3SLarry Finger 		case 3:
11570d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
11580d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x30, 0x03,
11590d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, ps_tdma_byte4_val);
1160f1d2b4d3SLarry Finger 			break;
1161f1d2b4d3SLarry Finger 		case 4:
1162f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1163f1d2b4d3SLarry Finger 						      0x3, 0x14, 0x0);
1164f1d2b4d3SLarry Finger 			break;
1165f1d2b4d3SLarry Finger 		case 5:
11660d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
11670d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x1f, 0x3,
11680d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, 0x11);
1169f1d2b4d3SLarry Finger 			break;
1170f1d2b4d3SLarry Finger 		case 6:
11710d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
11720d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x20, 0x3,
11730d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, 0x11);
1174f1d2b4d3SLarry Finger 			break;
1175f1d2b4d3SLarry Finger 		case 7:
1176f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xc,
1177f1d2b4d3SLarry Finger 						       0x5, 0x0, 0x0);
1178f1d2b4d3SLarry Finger 			break;
1179f1d2b4d3SLarry Finger 		case 8:
1180f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1181f1d2b4d3SLarry Finger 						      0x3, 0x10, 0x0);
1182f1d2b4d3SLarry Finger 			break;
1183f1d2b4d3SLarry Finger 		case 9:
11840d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
11850d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
11860d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, ps_tdma_byte4_val);
1187f1d2b4d3SLarry Finger 			break;
1188f1d2b4d3SLarry Finger 		case 10:
1189f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1190f1d2b4d3SLarry Finger 						       0xa, 0x0, 0x40);
1191f1d2b4d3SLarry Finger 			break;
1192f1d2b4d3SLarry Finger 		case 11:
11930d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
11940d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x21, 0x03,
11950d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, ps_tdma_byte4_val);
1196f1d2b4d3SLarry Finger 			break;
1197f1d2b4d3SLarry Finger 		case 12:
1198f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x0a,
1199f1d2b4d3SLarry Finger 						      0x0a, 0x0, 0x50);
1200f1d2b4d3SLarry Finger 			break;
1201f1d2b4d3SLarry Finger 		case 13:
12020d4ae142SPing-Ke Shih 			if (coex_sta->scan_ap_num <= 3)
12030d4ae142SPing-Ke Shih 				halbtc8723b1ant_set_fw_ps_tdma(
12040d4ae142SPing-Ke Shih 					btcoexist, ps_tdma_byte0_val, 0x40, 0x3,
12050d4ae142SPing-Ke Shih 					ps_tdma_byte3_val, ps_tdma_byte4_val);
12060d4ae142SPing-Ke Shih 			else
12070d4ae142SPing-Ke Shih 				halbtc8723b1ant_set_fw_ps_tdma(
12080d4ae142SPing-Ke Shih 					btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
12090d4ae142SPing-Ke Shih 					ps_tdma_byte3_val, ps_tdma_byte4_val);
1210f1d2b4d3SLarry Finger 			break;
1211f1d2b4d3SLarry Finger 		case 14:
12120d4ae142SPing-Ke Shih 			if (coex_sta->scan_ap_num <= 3)
12130d4ae142SPing-Ke Shih 				halbtc8723b1ant_set_fw_ps_tdma(
12140d4ae142SPing-Ke Shih 					btcoexist, 0x51, 0x30, 0x3, 0x10, 0x50);
12150d4ae142SPing-Ke Shih 			else
12160d4ae142SPing-Ke Shih 				halbtc8723b1ant_set_fw_ps_tdma(
12170d4ae142SPing-Ke Shih 					btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
12180d4ae142SPing-Ke Shih 					ps_tdma_byte3_val, ps_tdma_byte4_val);
1219f1d2b4d3SLarry Finger 			break;
1220f1d2b4d3SLarry Finger 		case 15:
1221f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
1222f1d2b4d3SLarry Finger 						       0x3, 0x8, 0x0);
1223f1d2b4d3SLarry Finger 			break;
1224f1d2b4d3SLarry Finger 		case 16:
1225f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
1226f1d2b4d3SLarry Finger 						      0x3, 0x10, 0x0);
1227f1d2b4d3SLarry Finger 			break;
1228f1d2b4d3SLarry Finger 		case 18:
1229f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
1230f1d2b4d3SLarry Finger 						      0x3, 0x10, 0x0);
1231f1d2b4d3SLarry Finger 			break;
1232f1d2b4d3SLarry Finger 		case 20:
12330d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
12340d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x3f, 0x03,
12350d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, 0x10);
1236f1d2b4d3SLarry Finger 			break;
1237f1d2b4d3SLarry Finger 		case 21:
1238f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,
1239f1d2b4d3SLarry Finger 						      0x03, 0x11, 0x11);
1240f1d2b4d3SLarry Finger 			break;
1241f1d2b4d3SLarry Finger 		case 22:
12420d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
12430d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
12440d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, 0x10);
1245f1d2b4d3SLarry Finger 			break;
1246f1d2b4d3SLarry Finger 		case 23:
1247f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1248f1d2b4d3SLarry Finger 						      0x3, 0x31, 0x18);
1249f1d2b4d3SLarry Finger 			break;
1250f1d2b4d3SLarry Finger 		case 24:
1251f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1252f1d2b4d3SLarry Finger 						      0x3, 0x31, 0x18);
1253f1d2b4d3SLarry Finger 			break;
1254f1d2b4d3SLarry Finger 		case 25:
1255f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1256f1d2b4d3SLarry Finger 						       0x3, 0x31, 0x18);
1257f1d2b4d3SLarry Finger 			break;
1258f1d2b4d3SLarry Finger 		case 26:
1259f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
1260f1d2b4d3SLarry Finger 						       0x3, 0x31, 0x18);
1261f1d2b4d3SLarry Finger 			break;
1262f1d2b4d3SLarry Finger 		case 27:
1263f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1264f1d2b4d3SLarry Finger 						      0x3, 0x31, 0x98);
1265f1d2b4d3SLarry Finger 			break;
1266f1d2b4d3SLarry Finger 		case 28:
1267f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x69, 0x25,
1268f1d2b4d3SLarry Finger 						      0x3, 0x31, 0x0);
1269f1d2b4d3SLarry Finger 			break;
1270f1d2b4d3SLarry Finger 		case 29:
1271f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xab, 0x1a,
1272f1d2b4d3SLarry Finger 						      0x1a, 0x1, 0x10);
1273f1d2b4d3SLarry Finger 			break;
1274f1d2b4d3SLarry Finger 		case 30:
12750d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x30,
12760d4ae142SPing-Ke Shih 						       0x3, 0x10, 0x10);
1277f1d2b4d3SLarry Finger 			break;
1278f1d2b4d3SLarry Finger 		case 31:
1279f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1a,
1280f1d2b4d3SLarry Finger 						      0x1a, 0, 0x58);
1281f1d2b4d3SLarry Finger 			break;
1282f1d2b4d3SLarry Finger 		case 32:
12830d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
12840d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x35, 0x3,
12850d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, ps_tdma_byte4_val);
1286f1d2b4d3SLarry Finger 			break;
1287f1d2b4d3SLarry Finger 		case 33:
12880d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
12890d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x35, 0x3,
12900d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, 0x10);
1291f1d2b4d3SLarry Finger 			break;
1292f1d2b4d3SLarry Finger 		case 34:
1293f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x53, 0x1a,
1294f1d2b4d3SLarry Finger 						      0x1a, 0x0, 0x10);
1295f1d2b4d3SLarry Finger 			break;
1296f1d2b4d3SLarry Finger 		case 35:
1297f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x63, 0x1a,
1298f1d2b4d3SLarry Finger 						      0x1a, 0x0, 0x10);
1299f1d2b4d3SLarry Finger 			break;
1300f1d2b4d3SLarry Finger 		case 36:
1301f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x12,
1302f1d2b4d3SLarry Finger 						      0x3, 0x14, 0x50);
1303f1d2b4d3SLarry Finger 			break;
1304f1d2b4d3SLarry Finger 		case 40:
13050d4ae142SPing-Ke Shih 			/* SoftAP only with no sta associated,BT disable ,TDMA
13060d4ae142SPing-Ke Shih 			 * mode for power saving
13070d4ae142SPing-Ke Shih 			 *
13080d4ae142SPing-Ke Shih 			 * here softap mode screen off will cost 70-80mA for
13090d4ae142SPing-Ke Shih 			 * phone
13100d4ae142SPing-Ke Shih 			 */
1311f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x23, 0x18,
1312f1d2b4d3SLarry Finger 						      0x00, 0x10, 0x24);
1313f1d2b4d3SLarry Finger 			break;
13140d4ae142SPing-Ke Shih 
13150d4ae142SPing-Ke Shih 		case 101:
13160d4ae142SPing-Ke Shih 			/* for 1-Ant translate to 2-Ant	 */
13170d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
13180d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val,
13190d4ae142SPing-Ke Shih 				0x3a + wifi_duration_adjust, 0x03,
13200d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, ps_tdma_byte4_val);
13210d4ae142SPing-Ke Shih 			break;
13220d4ae142SPing-Ke Shih 		case 102:
13230d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
13240d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val,
13250d4ae142SPing-Ke Shih 				0x2d + wifi_duration_adjust, 0x03,
13260d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, ps_tdma_byte4_val);
13270d4ae142SPing-Ke Shih 			break;
13280d4ae142SPing-Ke Shih 		case 103:
13290d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
13300d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x3a, 0x03,
13310d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, ps_tdma_byte4_val);
13320d4ae142SPing-Ke Shih 			break;
13330d4ae142SPing-Ke Shih 		case 105:
13340d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
13350d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x15, 0x3,
13360d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, 0x11);
13370d4ae142SPing-Ke Shih 			break;
13380d4ae142SPing-Ke Shih 		case 106:
13390d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
13400d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x20, 0x3,
13410d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, 0x11);
13420d4ae142SPing-Ke Shih 			break;
13430d4ae142SPing-Ke Shih 		case 109:
13440d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
13450d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
13460d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, ps_tdma_byte4_val);
13470d4ae142SPing-Ke Shih 			break;
13480d4ae142SPing-Ke Shih 		case 111:
13490d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
13500d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x21, 0x03,
13510d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, ps_tdma_byte4_val);
13520d4ae142SPing-Ke Shih 			break;
13530d4ae142SPing-Ke Shih 		case 113:
13540d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
13550d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
13560d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, ps_tdma_byte4_val);
13570d4ae142SPing-Ke Shih 			break;
13580d4ae142SPing-Ke Shih 		case 114:
13590d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
13600d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
13610d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, ps_tdma_byte4_val);
13620d4ae142SPing-Ke Shih 			break;
13630d4ae142SPing-Ke Shih 		case 120:
13640d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
13650d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x3f, 0x03,
13660d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, 0x10);
13670d4ae142SPing-Ke Shih 			break;
13680d4ae142SPing-Ke Shih 		case 122:
13690d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
13700d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
13710d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, 0x10);
13720d4ae142SPing-Ke Shih 			break;
13730d4ae142SPing-Ke Shih 		case 132:
13740d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
13750d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
13760d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, ps_tdma_byte4_val);
13770d4ae142SPing-Ke Shih 			break;
13780d4ae142SPing-Ke Shih 		case 133:
13790d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(
13800d4ae142SPing-Ke Shih 				btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
13810d4ae142SPing-Ke Shih 				ps_tdma_byte3_val, 0x11);
13820d4ae142SPing-Ke Shih 			break;
1383f1d2b4d3SLarry Finger 		}
1384f1d2b4d3SLarry Finger 	} else {
13850d4ae142SPing-Ke Shih 		/* disable PS tdma */
1386f1d2b4d3SLarry Finger 		switch (type) {
1387f1d2b4d3SLarry Finger 		case 8: /* PTA Control */
1388f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x8, 0x0,
1389f1d2b4d3SLarry Finger 						       0x0, 0x0, 0x0);
1390c6821613SYan-Hsuan Chuang 			halbtc8723b1ant_set_ant_path(btcoexist,
1391c6821613SYan-Hsuan Chuang 						     BTC_ANT_PATH_PTA,
139296e3baadSPing-Ke Shih 						     FORCE_EXEC,
1393f1d2b4d3SLarry Finger 						     false, false);
1394f1d2b4d3SLarry Finger 			break;
1395f1d2b4d3SLarry Finger 		case 0:
1396c6821613SYan-Hsuan Chuang 		default:
1397c6821613SYan-Hsuan Chuang 			/* Software control, Antenna at BT side */
1398f1d2b4d3SLarry Finger 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0,
1399f1d2b4d3SLarry Finger 						       0x0, 0x0, 0x0);
1400f1d2b4d3SLarry Finger 			break;
14010d4ae142SPing-Ke Shih 		case 1: /* 2-Ant, 0x778=3, antenna control by ant diversity */
14020d4ae142SPing-Ke Shih 			halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
14030d4ae142SPing-Ke Shih 						       0x48, 0x0);
1404f1d2b4d3SLarry Finger 			break;
1405f1d2b4d3SLarry Finger 		}
1406f1d2b4d3SLarry Finger 	}
1407f1d2b4d3SLarry Finger 	rssi_adjust_val = 0;
1408f1d2b4d3SLarry Finger 	btcoexist->btc_set(btcoexist,
1409f1d2b4d3SLarry Finger 			   BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE,
1410f1d2b4d3SLarry Finger 			   &rssi_adjust_val);
1411f1d2b4d3SLarry Finger 
1412f1d2b4d3SLarry Finger 	/* update pre state */
1413f1d2b4d3SLarry Finger 	coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1414f1d2b4d3SLarry Finger 	coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1415f1d2b4d3SLarry Finger }
1416f1d2b4d3SLarry Finger 
141791b9e684SPing-Ke Shih static
btc8723b1ant_tdma_dur_adj_for_acl(struct btc_coexist * btcoexist,u8 wifi_status)1418158707f9SLarry Finger void btc8723b1ant_tdma_dur_adj_for_acl(struct btc_coexist *btcoexist,
1419158707f9SLarry Finger 				       u8 wifi_status)
1420158707f9SLarry Finger {
1421158707f9SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1422158707f9SLarry Finger 	static s32 up, dn, m, n, wait_count;
1423158707f9SLarry Finger 	/*  0: no change, +1: increase WiFi duration,
1424158707f9SLarry Finger 	 * -1: decrease WiFi duration
1425158707f9SLarry Finger 	 */
1426158707f9SLarry Finger 	s32 result;
1427aab7541aSzhengbin 	u8 retry_count = 0;
1428158707f9SLarry Finger 
1429c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1430158707f9SLarry Finger 		"[BTCoex], TdmaDurationAdjustForAcl()\n");
1431158707f9SLarry Finger 
1432158707f9SLarry Finger 	if ((wifi_status ==
1433158707f9SLarry Finger 	     BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN) ||
1434158707f9SLarry Finger 	    (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN) ||
1435158707f9SLarry Finger 	    (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT)) {
1436158707f9SLarry Finger 		if (coex_dm->cur_ps_tdma != 1 && coex_dm->cur_ps_tdma != 2 &&
1437158707f9SLarry Finger 		    coex_dm->cur_ps_tdma != 3 && coex_dm->cur_ps_tdma != 9) {
1438158707f9SLarry Finger 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1439158707f9SLarry Finger 						true, 9);
14402d446a56SPing-Ke Shih 			coex_dm->ps_tdma_du_adj_type = 9;
1441158707f9SLarry Finger 
1442158707f9SLarry Finger 			up = 0;
1443158707f9SLarry Finger 			dn = 0;
1444158707f9SLarry Finger 			m = 1;
1445158707f9SLarry Finger 			n = 3;
1446158707f9SLarry Finger 			result = 0;
1447158707f9SLarry Finger 			wait_count = 0;
1448158707f9SLarry Finger 		}
1449158707f9SLarry Finger 		return;
1450158707f9SLarry Finger 	}
1451158707f9SLarry Finger 
1452158707f9SLarry Finger 	if (!coex_dm->auto_tdma_adjust) {
1453158707f9SLarry Finger 		coex_dm->auto_tdma_adjust = true;
1454c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1455158707f9SLarry Finger 			"[BTCoex], first run TdmaDurationAdjust()!!\n");
1456158707f9SLarry Finger 
1457158707f9SLarry Finger 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2);
14582d446a56SPing-Ke Shih 		coex_dm->ps_tdma_du_adj_type = 2;
1459158707f9SLarry Finger 
1460158707f9SLarry Finger 		up = 0;
1461158707f9SLarry Finger 		dn = 0;
1462158707f9SLarry Finger 		m = 1;
1463158707f9SLarry Finger 		n = 3;
1464158707f9SLarry Finger 		result = 0;
1465158707f9SLarry Finger 		wait_count = 0;
1466158707f9SLarry Finger 	} else {
1467158707f9SLarry Finger 		/* acquire the BT TRx retry count from BT_Info byte2 */
1468158707f9SLarry Finger 		retry_count = coex_sta->bt_retry_cnt;
14692622d7d8SPing-Ke Shih 
14702622d7d8SPing-Ke Shih 		if ((coex_sta->low_priority_tx) > 1050 ||
14712622d7d8SPing-Ke Shih 		    (coex_sta->low_priority_rx) > 1250)
14722622d7d8SPing-Ke Shih 			retry_count++;
14732622d7d8SPing-Ke Shih 
1474158707f9SLarry Finger 		result = 0;
1475158707f9SLarry Finger 		wait_count++;
1476158707f9SLarry Finger 		/* no retry in the last 2-second duration */
1477158707f9SLarry Finger 		if (retry_count == 0) {
1478158707f9SLarry Finger 			up++;
1479158707f9SLarry Finger 			dn--;
1480158707f9SLarry Finger 
1481158707f9SLarry Finger 			if (dn <= 0)
1482158707f9SLarry Finger 				dn = 0;
1483158707f9SLarry Finger 
1484158707f9SLarry Finger 			if (up >= n) {
14852622d7d8SPing-Ke Shih 				/* if retry count during continuous n*2 seconds
14862622d7d8SPing-Ke Shih 				 * is 0, enlarge WiFi duration
14872622d7d8SPing-Ke Shih 				 */
1488158707f9SLarry Finger 				wait_count = 0;
1489158707f9SLarry Finger 				n = 3;
1490158707f9SLarry Finger 				up = 0;
1491158707f9SLarry Finger 				dn = 0;
1492158707f9SLarry Finger 				result = 1;
1493c8159c3fSLarry Finger 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1494158707f9SLarry Finger 					"[BTCoex], Increase wifi duration!!\n");
1495158707f9SLarry Finger 			}
1496158707f9SLarry Finger 		} else if (retry_count <= 3) {
14972622d7d8SPing-Ke Shih 			/* <=3 retry in the last 2-second duration */
1498158707f9SLarry Finger 			up--;
1499158707f9SLarry Finger 			dn++;
1500158707f9SLarry Finger 
1501158707f9SLarry Finger 			if (up <= 0)
1502158707f9SLarry Finger 				up = 0;
1503158707f9SLarry Finger 
1504158707f9SLarry Finger 			if (dn == 2) {
15052622d7d8SPing-Ke Shih 				/* if continuous 2 retry count(every 2 seconds)
15062622d7d8SPing-Ke Shih 				 * >0 and < 3, reduce WiFi duration
15072622d7d8SPing-Ke Shih 				 */
1508158707f9SLarry Finger 				if (wait_count <= 2)
15092622d7d8SPing-Ke Shih 					/* avoid loop between the two levels */
1510158707f9SLarry Finger 					m++;
1511158707f9SLarry Finger 				else
1512158707f9SLarry Finger 					m = 1;
1513158707f9SLarry Finger 
1514158707f9SLarry Finger 				if (m >= 20)
15152622d7d8SPing-Ke Shih 					/* maximum of m = 20 ' will recheck if
15162622d7d8SPing-Ke Shih 					 * need to adjust wifi duration in
15172622d7d8SPing-Ke Shih 					 * maximum time interval 120 seconds
15182622d7d8SPing-Ke Shih 					 */
1519158707f9SLarry Finger 					m = 20;
1520158707f9SLarry Finger 
1521158707f9SLarry Finger 				n = 3 * m;
1522158707f9SLarry Finger 				up = 0;
1523158707f9SLarry Finger 				dn = 0;
1524158707f9SLarry Finger 				wait_count = 0;
1525158707f9SLarry Finger 				result = -1;
1526c8159c3fSLarry Finger 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1527158707f9SLarry Finger 					"[BTCoex], Decrease wifi duration for retryCounter<3!!\n");
1528158707f9SLarry Finger 			}
1529158707f9SLarry Finger 		} else {
15302622d7d8SPing-Ke Shih 			/* retry count > 3, once retry count > 3, to reduce
15312622d7d8SPing-Ke Shih 			 * WiFi duration
15322622d7d8SPing-Ke Shih 			 */
1533158707f9SLarry Finger 			if (wait_count == 1)
15342622d7d8SPing-Ke Shih 				/* to avoid loop between the two levels */
1535158707f9SLarry Finger 				m++;
1536158707f9SLarry Finger 			else
1537158707f9SLarry Finger 				m = 1;
1538158707f9SLarry Finger 
1539158707f9SLarry Finger 			if (m >= 20)
15402622d7d8SPing-Ke Shih 				/* maximum of m = 20 ' will recheck if need to
15412622d7d8SPing-Ke Shih 				 * adjust wifi duration in maximum time interval
15422622d7d8SPing-Ke Shih 				 * 120 seconds
15432622d7d8SPing-Ke Shih 				 */
1544158707f9SLarry Finger 				m = 20;
1545158707f9SLarry Finger 
1546158707f9SLarry Finger 			n = 3 * m;
1547158707f9SLarry Finger 			up = 0;
1548158707f9SLarry Finger 			dn = 0;
1549158707f9SLarry Finger 			wait_count = 0;
1550158707f9SLarry Finger 			result = -1;
1551c8159c3fSLarry Finger 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1552158707f9SLarry Finger 				"[BTCoex], Decrease wifi duration for retryCounter>3!!\n");
1553158707f9SLarry Finger 		}
1554158707f9SLarry Finger 
1555158707f9SLarry Finger 		if (result == -1) {
15562622d7d8SPing-Ke Shih 			if (coex_dm->cur_ps_tdma == 1) {
1557158707f9SLarry Finger 				halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1558158707f9SLarry Finger 							true, 2);
15592d446a56SPing-Ke Shih 				coex_dm->ps_tdma_du_adj_type = 2;
1560158707f9SLarry Finger 			} else if (coex_dm->cur_ps_tdma == 2) {
1561158707f9SLarry Finger 				halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1562158707f9SLarry Finger 							true, 9);
15632d446a56SPing-Ke Shih 				coex_dm->ps_tdma_du_adj_type = 9;
1564158707f9SLarry Finger 			} else if (coex_dm->cur_ps_tdma == 9) {
1565158707f9SLarry Finger 				halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1566158707f9SLarry Finger 							true, 11);
15672d446a56SPing-Ke Shih 				coex_dm->ps_tdma_du_adj_type = 11;
1568158707f9SLarry Finger 			}
1569158707f9SLarry Finger 		} else if (result == 1) {
15702622d7d8SPing-Ke Shih 			if (coex_dm->cur_ps_tdma == 11) {
1571158707f9SLarry Finger 				halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1572158707f9SLarry Finger 							true, 9);
15732d446a56SPing-Ke Shih 				coex_dm->ps_tdma_du_adj_type = 9;
1574158707f9SLarry Finger 			} else if (coex_dm->cur_ps_tdma == 9) {
1575158707f9SLarry Finger 				halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1576158707f9SLarry Finger 							true, 2);
15772d446a56SPing-Ke Shih 				coex_dm->ps_tdma_du_adj_type = 2;
1578158707f9SLarry Finger 			} else if (coex_dm->cur_ps_tdma == 2) {
1579158707f9SLarry Finger 				halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1580158707f9SLarry Finger 							true, 1);
15812d446a56SPing-Ke Shih 				coex_dm->ps_tdma_du_adj_type = 1;
1582158707f9SLarry Finger 			}
1583158707f9SLarry Finger 		}
1584158707f9SLarry Finger 
1585158707f9SLarry Finger 		if (coex_dm->cur_ps_tdma != 1 && coex_dm->cur_ps_tdma != 2 &&
1586158707f9SLarry Finger 		    coex_dm->cur_ps_tdma != 9 && coex_dm->cur_ps_tdma != 11) {
1587158707f9SLarry Finger 			/* recover to previous adjust type */
1588158707f9SLarry Finger 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
15892d446a56SPing-Ke Shih 						coex_dm->ps_tdma_du_adj_type);
1590158707f9SLarry Finger 		}
1591158707f9SLarry Finger 	}
1592158707f9SLarry Finger }
1593158707f9SLarry Finger 
halbtc8723b1ant_ps_tdma_chk_pwr_save(struct btc_coexist * btcoexist,bool new_ps_state)1594c6821613SYan-Hsuan Chuang static void halbtc8723b1ant_ps_tdma_chk_pwr_save(struct btc_coexist *btcoexist,
1595f1d2b4d3SLarry Finger 					  bool new_ps_state)
1596f1d2b4d3SLarry Finger {
1597f1d2b4d3SLarry Finger 	u8 lps_mode = 0x0;
1598f1d2b4d3SLarry Finger 
1599f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1600f1d2b4d3SLarry Finger 
1601c6821613SYan-Hsuan Chuang 	if (lps_mode) {
1602c6821613SYan-Hsuan Chuang 		/* already under LPS state */
1603f1d2b4d3SLarry Finger 		if (new_ps_state) {
1604f1d2b4d3SLarry Finger 			/* keep state under LPS, do nothing. */
1605f1d2b4d3SLarry Finger 		} else {
1606f1d2b4d3SLarry Finger 			/* will leave LPS state, turn off psTdma first */
1607f1d2b4d3SLarry Finger 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1608f1d2b4d3SLarry Finger 						false, 0);
1609f1d2b4d3SLarry Finger 		}
1610c6821613SYan-Hsuan Chuang 	} else {
1611c6821613SYan-Hsuan Chuang 		/* NO PS state */
1612f1d2b4d3SLarry Finger 		if (new_ps_state) {
1613f1d2b4d3SLarry Finger 			/* will enter LPS state, turn off psTdma first */
1614f1d2b4d3SLarry Finger 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1615f1d2b4d3SLarry Finger 						false, 0);
1616f1d2b4d3SLarry Finger 		} else {
1617f1d2b4d3SLarry Finger 			/* keep state under NO PS state, do nothing. */
1618f1d2b4d3SLarry Finger 		}
1619f1d2b4d3SLarry Finger 	}
1620f1d2b4d3SLarry Finger }
1621f1d2b4d3SLarry Finger 
halbtc8723b1ant_power_save_state(struct btc_coexist * btcoexist,u8 ps_type,u8 lps_val,u8 rpwm_val)1622f1d2b4d3SLarry Finger static void halbtc8723b1ant_power_save_state(struct btc_coexist *btcoexist,
1623f1d2b4d3SLarry Finger 					     u8 ps_type, u8 lps_val,
1624f1d2b4d3SLarry Finger 					     u8 rpwm_val)
1625f1d2b4d3SLarry Finger {
1626f1d2b4d3SLarry Finger 	bool low_pwr_disable = false;
1627f1d2b4d3SLarry Finger 
1628f1d2b4d3SLarry Finger 	switch (ps_type) {
1629f1d2b4d3SLarry Finger 	case BTC_PS_WIFI_NATIVE:
1630f1d2b4d3SLarry Finger 		/* recover to original 32k low power setting */
1631f1d2b4d3SLarry Finger 		low_pwr_disable = false;
1632f1d2b4d3SLarry Finger 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1633f1d2b4d3SLarry Finger 				   &low_pwr_disable);
1634f1d2b4d3SLarry Finger 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
163512515a08SPing-Ke Shih 		coex_sta->force_lps_on = false;
1636f1d2b4d3SLarry Finger 		break;
1637f1d2b4d3SLarry Finger 	case BTC_PS_LPS_ON:
1638c6821613SYan-Hsuan Chuang 		halbtc8723b1ant_ps_tdma_chk_pwr_save(btcoexist, true);
1639c6821613SYan-Hsuan Chuang 		halbtc8723b1ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,
1640f1d2b4d3SLarry Finger 					 rpwm_val);
1641c6821613SYan-Hsuan Chuang 		/* when coex force to enter LPS, do not enter 32k low power */
1642f1d2b4d3SLarry Finger 		low_pwr_disable = true;
1643f1d2b4d3SLarry Finger 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1644f1d2b4d3SLarry Finger 				   &low_pwr_disable);
1645c6821613SYan-Hsuan Chuang 		/* power save must executed before psTdma */
1646f1d2b4d3SLarry Finger 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
164712515a08SPing-Ke Shih 		coex_sta->force_lps_on = true;
1648f1d2b4d3SLarry Finger 		break;
1649f1d2b4d3SLarry Finger 	case BTC_PS_LPS_OFF:
1650c6821613SYan-Hsuan Chuang 		halbtc8723b1ant_ps_tdma_chk_pwr_save(btcoexist, false);
1651f1d2b4d3SLarry Finger 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
165212515a08SPing-Ke Shih 		coex_sta->force_lps_on = false;
1653f1d2b4d3SLarry Finger 		break;
1654f1d2b4d3SLarry Finger 	default:
1655f1d2b4d3SLarry Finger 		break;
1656f1d2b4d3SLarry Finger 	}
1657f1d2b4d3SLarry Finger }
1658f1d2b4d3SLarry Finger 
halbtc8723b1ant_action_wifi_only(struct btc_coexist * btcoexist)1659f66509e3SLarry Finger static void halbtc8723b1ant_action_wifi_only(struct btc_coexist *btcoexist)
1660f66509e3SLarry Finger {
1661f66509e3SLarry Finger 	halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
1662f66509e3SLarry Finger 	halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
166396e3baadSPing-Ke Shih 	halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
166496e3baadSPing-Ke Shih 				     FORCE_EXEC, false, false);
1665f66509e3SLarry Finger }
1666f66509e3SLarry Finger 
1667f66509e3SLarry Finger /* check if BT is disabled */
halbtc8723b1ant_monitor_bt_enable_disable(struct btc_coexist * btcoexist)1668f66509e3SLarry Finger static void halbtc8723b1ant_monitor_bt_enable_disable(struct btc_coexist
1669f66509e3SLarry Finger 						      *btcoexist)
1670f66509e3SLarry Finger {
1671f66509e3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1672f66509e3SLarry Finger 	static u32 bt_disable_cnt;
1673e5786189SDan Carpenter 	bool bt_active = true, bt_disabled = false;
1674f66509e3SLarry Finger 
1675f66509e3SLarry Finger 	if (coex_sta->high_priority_tx == 0 &&
1676f66509e3SLarry Finger 	    coex_sta->high_priority_rx == 0 && coex_sta->low_priority_tx == 0 &&
1677f66509e3SLarry Finger 	    coex_sta->low_priority_rx == 0)
1678f66509e3SLarry Finger 		bt_active = false;
1679f66509e3SLarry Finger 	if (coex_sta->high_priority_tx == 0xffff &&
1680f66509e3SLarry Finger 	    coex_sta->high_priority_rx == 0xffff &&
1681f66509e3SLarry Finger 	    coex_sta->low_priority_tx == 0xffff &&
1682f66509e3SLarry Finger 	    coex_sta->low_priority_rx == 0xffff)
1683f66509e3SLarry Finger 		bt_active = false;
1684f66509e3SLarry Finger 	if (bt_active) {
1685f66509e3SLarry Finger 		bt_disable_cnt = 0;
1686f66509e3SLarry Finger 		bt_disabled = false;
1687f66509e3SLarry Finger 	} else {
1688f66509e3SLarry Finger 		bt_disable_cnt++;
1689f66509e3SLarry Finger 		if (bt_disable_cnt >= 2)
1690f66509e3SLarry Finger 			bt_disabled = true;
1691f66509e3SLarry Finger 	}
1692f66509e3SLarry Finger 	if (coex_sta->bt_disabled != bt_disabled) {
1693c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1694f66509e3SLarry Finger 			"[BTCoex], BT is from %s to %s!!\n",
1695f66509e3SLarry Finger 			(coex_sta->bt_disabled ? "disabled" : "enabled"),
1696f66509e3SLarry Finger 			(bt_disabled ? "disabled" : "enabled"));
1697f66509e3SLarry Finger 
1698f66509e3SLarry Finger 		coex_sta->bt_disabled = bt_disabled;
1699f66509e3SLarry Finger 		btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
1700f66509e3SLarry Finger 				   &bt_disabled);
1701f66509e3SLarry Finger 		if (bt_disabled) {
1702f66509e3SLarry Finger 			halbtc8723b1ant_action_wifi_only(btcoexist);
1703f66509e3SLarry Finger 			btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS,
1704f66509e3SLarry Finger 					   NULL);
1705f66509e3SLarry Finger 			btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS,
1706f66509e3SLarry Finger 					   NULL);
1707f66509e3SLarry Finger 		}
1708f66509e3SLarry Finger 	}
1709f66509e3SLarry Finger }
1710f66509e3SLarry Finger 
1711f1d2b4d3SLarry Finger /*****************************************************
1712f1d2b4d3SLarry Finger  *
1713f1d2b4d3SLarry Finger  *	Non-Software Coex Mechanism start
1714f1d2b4d3SLarry Finger  *
1715f1d2b4d3SLarry Finger  *****************************************************/
171653e18bcfSPing-Ke Shih 
halbtc8723b1ant_action_bt_whck_test(struct btc_coexist * btcoexist)171753e18bcfSPing-Ke Shih static void halbtc8723b1ant_action_bt_whck_test(struct btc_coexist *btcoexist)
171853e18bcfSPing-Ke Shih {
171953e18bcfSPing-Ke Shih 	halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0,
172053e18bcfSPing-Ke Shih 					 0x0);
172153e18bcfSPing-Ke Shih 
172253e18bcfSPing-Ke Shih 	halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
172353e18bcfSPing-Ke Shih 	halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
172453e18bcfSPing-Ke Shih 				     false, false);
172553e18bcfSPing-Ke Shih 	halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
172653e18bcfSPing-Ke Shih }
172753e18bcfSPing-Ke Shih 
halbtc8723b1ant_action_wifi_multiport(struct btc_coexist * btcoexist)1728f1d2b4d3SLarry Finger static void halbtc8723b1ant_action_wifi_multiport(struct btc_coexist *btcoexist)
1729f1d2b4d3SLarry Finger {
1730f1d2b4d3SLarry Finger 	halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1731f1d2b4d3SLarry Finger 					 0x0, 0x0);
1732f1d2b4d3SLarry Finger 
1733f1d2b4d3SLarry Finger 	halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
173486aeb825SYan-Hsuan Chuang 	halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
173586aeb825SYan-Hsuan Chuang 				     false, false);
1736f1d2b4d3SLarry Finger 	halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1737f1d2b4d3SLarry Finger }
1738f1d2b4d3SLarry Finger 
halbtc8723b1ant_action_hs(struct btc_coexist * btcoexist)1739f1d2b4d3SLarry Finger static void halbtc8723b1ant_action_hs(struct btc_coexist *btcoexist)
1740f1d2b4d3SLarry Finger {
1741f1d2b4d3SLarry Finger 	halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1742f1d2b4d3SLarry Finger 	halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1743f1d2b4d3SLarry Finger }
1744f1d2b4d3SLarry Finger 
halbtc8723b1ant_action_bt_inquiry(struct btc_coexist * btcoexist)1745f1d2b4d3SLarry Finger static void halbtc8723b1ant_action_bt_inquiry(struct btc_coexist *btcoexist)
1746f1d2b4d3SLarry Finger {
1747f1d2b4d3SLarry Finger 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1748f1d2b4d3SLarry Finger 	bool wifi_connected = false, ap_enable = false;
17495ae40d99SPing-Ke Shih 	bool wifi_busy = false, bt_busy = false;
1750f1d2b4d3SLarry Finger 
1751f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
1752f1d2b4d3SLarry Finger 			   &ap_enable);
1753f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1754f1d2b4d3SLarry Finger 			   &wifi_connected);
17555ae40d99SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
17565ae40d99SPing-Ke Shih 	btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
1757f1d2b4d3SLarry Finger 
17585ae40d99SPing-Ke Shih 	if (coex_sta->bt_abnormal_scan) {
17595ae40d99SPing-Ke Shih 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);
17605ae40d99SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
17615ae40d99SPing-Ke Shih 	} else if (!wifi_connected && !coex_sta->wifi_is_high_pri_task) {
1762f1d2b4d3SLarry Finger 		halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1763f1d2b4d3SLarry Finger 						 0x0, 0x0);
17645ae40d99SPing-Ke Shih 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
17655ae40d99SPing-Ke Shih 		halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
17665ae40d99SPing-Ke Shih 					     NORMAL_EXEC, false, false);
17675ae40d99SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
17685ae40d99SPing-Ke Shih 	} else if (bt_link_info->sco_exist || bt_link_info->hid_exist ||
17695ae40d99SPing-Ke Shih 		   bt_link_info->a2dp_exist) {
17705ae40d99SPing-Ke Shih 		/* SCO/HID/A2DP busy */
17715ae40d99SPing-Ke Shih 		halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1772f1d2b4d3SLarry Finger 						 0x0, 0x0);
17735ae40d99SPing-Ke Shih 		if (coex_sta->c2h_bt_remote_name_req)
17745ae40d99SPing-Ke Shih 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
17755ae40d99SPing-Ke Shih 						33);
1776f1d2b4d3SLarry Finger 		else
17775ae40d99SPing-Ke Shih 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
17785ae40d99SPing-Ke Shih 						32);
1779f1d2b4d3SLarry Finger 
17805ae40d99SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
17815ae40d99SPing-Ke Shih 	} else if (bt_link_info->pan_exist || wifi_busy) {
17825ae40d99SPing-Ke Shih 		halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
17835ae40d99SPing-Ke Shih 						 0x0, 0x0);
17845ae40d99SPing-Ke Shih 		if (coex_sta->c2h_bt_remote_name_req)
17855ae40d99SPing-Ke Shih 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
17865ae40d99SPing-Ke Shih 						33);
17875ae40d99SPing-Ke Shih 		else
17885ae40d99SPing-Ke Shih 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
17895ae40d99SPing-Ke Shih 						32);
17905ae40d99SPing-Ke Shih 
17915ae40d99SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
17925ae40d99SPing-Ke Shih 	} else {
17935ae40d99SPing-Ke Shih 		halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
17945ae40d99SPing-Ke Shih 						 0x0, 0x0);
17955ae40d99SPing-Ke Shih 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
17965ae40d99SPing-Ke Shih 		halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
17975ae40d99SPing-Ke Shih 					     NORMAL_EXEC, false, false);
17985ae40d99SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
1799f1d2b4d3SLarry Finger 	}
1800f1d2b4d3SLarry Finger }
1801f1d2b4d3SLarry Finger 
btc8723b1ant_act_bt_sco_hid_only_busy(struct btc_coexist * btcoexist,u8 wifi_status)1802f1d2b4d3SLarry Finger static void btc8723b1ant_act_bt_sco_hid_only_busy(struct btc_coexist *btcoexist,
1803f1d2b4d3SLarry Finger 						  u8 wifi_status)
1804f1d2b4d3SLarry Finger {
1805f1d2b4d3SLarry Finger 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1806f1d2b4d3SLarry Finger 	bool wifi_connected = false;
1807f1d2b4d3SLarry Finger 
1808f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1809f1d2b4d3SLarry Finger 			   &wifi_connected);
1810f1d2b4d3SLarry Finger 
1811f1d2b4d3SLarry Finger 	/* tdma and coex table */
1812f1d2b4d3SLarry Finger 	if (bt_link_info->sco_exist) {
1813f1d2b4d3SLarry Finger 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1814f9cbb5b4SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
1815c6821613SYan-Hsuan Chuang 	} else {
1816c6821613SYan-Hsuan Chuang 		/* HID */
1817f1d2b4d3SLarry Finger 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 6);
1818f1d2b4d3SLarry Finger 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
1819f1d2b4d3SLarry Finger 	}
1820f1d2b4d3SLarry Finger }
1821f1d2b4d3SLarry Finger 
halbtc8723b1ant_action_wifi_connected_bt_acl_busy(struct btc_coexist * btcoexist,u8 wifi_status)1822f1d2b4d3SLarry Finger static void halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
1823f1d2b4d3SLarry Finger 					struct btc_coexist *btcoexist,
1824f1d2b4d3SLarry Finger 					u8 wifi_status)
1825f1d2b4d3SLarry Finger {
1826f1d2b4d3SLarry Finger 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1827f1d2b4d3SLarry Finger 
18280d4ae142SPing-Ke Shih 	if ((coex_sta->low_priority_rx >= 950) && (!coex_sta->under_ips))
18290d4ae142SPing-Ke Shih 		bt_link_info->slave_role = true;
18300d4ae142SPing-Ke Shih 	else
18310d4ae142SPing-Ke Shih 		bt_link_info->slave_role = false;
1832f1d2b4d3SLarry Finger 
1833f1d2b4d3SLarry Finger 	if (bt_link_info->hid_only) { /* HID */
1834f1d2b4d3SLarry Finger 		btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist, wifi_status);
1835f1d2b4d3SLarry Finger 		coex_dm->auto_tdma_adjust = false;
1836f1d2b4d3SLarry Finger 		return;
1837f1d2b4d3SLarry Finger 	} else if (bt_link_info->a2dp_only) { /* A2DP */
1838c6821613SYan-Hsuan Chuang 		if (wifi_status == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE) {
1839f1d2b4d3SLarry Finger 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
18401ecdc436SPing-Ke Shih 						true, 32);
1841f1d2b4d3SLarry Finger 			halbtc8723b1ant_coex_table_with_type(btcoexist,
18421ecdc436SPing-Ke Shih 							     NORMAL_EXEC, 4);
1843f1d2b4d3SLarry Finger 			coex_dm->auto_tdma_adjust = false;
18442622d7d8SPing-Ke Shih 		} else {
18452622d7d8SPing-Ke Shih 			btc8723b1ant_tdma_dur_adj_for_acl(btcoexist,
18462622d7d8SPing-Ke Shih 							  wifi_status);
1847f1d2b4d3SLarry Finger 			halbtc8723b1ant_coex_table_with_type(btcoexist,
1848f1d2b4d3SLarry Finger 							     NORMAL_EXEC, 1);
18492622d7d8SPing-Ke Shih 			coex_dm->auto_tdma_adjust = true;
1850f1d2b4d3SLarry Finger 		}
18511ecdc436SPing-Ke Shih 	} else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) ||
18521ecdc436SPing-Ke Shih 		   (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&
18531ecdc436SPing-Ke Shih 		    bt_link_info->pan_exist)) {
18541ecdc436SPing-Ke Shih 		/* A2DP + PAN(OPP,FTP), HID + A2DP + PAN(OPP,FTP) */
18551ecdc436SPing-Ke Shih 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
18561ecdc436SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
18571ecdc436SPing-Ke Shih 		coex_dm->auto_tdma_adjust = false;
18581ecdc436SPing-Ke Shih 	} else if (bt_link_info->hid_exist && bt_link_info->a2dp_exist) {
18591ecdc436SPing-Ke Shih 		/* HID + A2DP */
1860b686784dSLarry Finger 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,	true, 14);
1861f1d2b4d3SLarry Finger 		coex_dm->auto_tdma_adjust = false;
1862f1d2b4d3SLarry Finger 
18631ecdc436SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1864f1d2b4d3SLarry Finger 	} else if (bt_link_info->pan_only ||
1865f1d2b4d3SLarry Finger 			(bt_link_info->hid_exist && bt_link_info->pan_exist)) {
18661ecdc436SPing-Ke Shih 		/* PAN(OPP,FTP), HID + PAN(OPP,FTP) */
1867f1d2b4d3SLarry Finger 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
18681ecdc436SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1869f1d2b4d3SLarry Finger 		coex_dm->auto_tdma_adjust = false;
1870f1d2b4d3SLarry Finger 	} else {
18711ecdc436SPing-Ke Shih 		/* BT no-profile busy (0x9) */
18721ecdc436SPing-Ke Shih 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 33);
18731ecdc436SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
1874f1d2b4d3SLarry Finger 		coex_dm->auto_tdma_adjust = false;
1875f1d2b4d3SLarry Finger 	}
1876f1d2b4d3SLarry Finger }
1877f1d2b4d3SLarry Finger 
btc8723b1ant_action_wifi_not_conn(struct btc_coexist * btcoexist)1878f1d2b4d3SLarry Finger static void btc8723b1ant_action_wifi_not_conn(struct btc_coexist *btcoexist)
1879f1d2b4d3SLarry Finger {
1880f1d2b4d3SLarry Finger 	/* power save state */
1881f1d2b4d3SLarry Finger 	halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1882f1d2b4d3SLarry Finger 					 0x0, 0x0);
1883f1d2b4d3SLarry Finger 
1884f1d2b4d3SLarry Finger 	/* tdma and coex table */
188540ca1882SPing-Ke Shih 	halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
188640ca1882SPing-Ke Shih 	halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, NORMAL_EXEC,
188740ca1882SPing-Ke Shih 				     false, false);
1888f1d2b4d3SLarry Finger 	halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1889f1d2b4d3SLarry Finger }
1890f1d2b4d3SLarry Finger 
1891c6821613SYan-Hsuan Chuang static void
btc8723b1ant_action_wifi_not_conn_scan(struct btc_coexist * btcoexist)1892c6821613SYan-Hsuan Chuang btc8723b1ant_action_wifi_not_conn_scan(struct btc_coexist *btcoexist)
1893f1d2b4d3SLarry Finger {
1894c6821613SYan-Hsuan Chuang 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1895f1d2b4d3SLarry Finger 
1896c6821613SYan-Hsuan Chuang 	halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1897f1d2b4d3SLarry Finger 					 0x0, 0x0);
1898f1d2b4d3SLarry Finger 
1899f1d2b4d3SLarry Finger 	/* tdma and coex table */
19002d446a56SPing-Ke Shih 	if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
190140ca1882SPing-Ke Shih 		if (bt_link_info->a2dp_exist) {
190240ca1882SPing-Ke Shih 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
190340ca1882SPing-Ke Shih 						true, 32);
190440ca1882SPing-Ke Shih 			halbtc8723b1ant_coex_table_with_type(btcoexist,
190540ca1882SPing-Ke Shih 							     NORMAL_EXEC, 4);
1906*e48c4531SPeter Kosyh 		} else if (bt_link_info->pan_exist) {
1907c6821613SYan-Hsuan Chuang 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1908f1d2b4d3SLarry Finger 						true, 22);
1909c6821613SYan-Hsuan Chuang 			halbtc8723b1ant_coex_table_with_type(btcoexist,
191040ca1882SPing-Ke Shih 							     NORMAL_EXEC, 4);
1911f1d2b4d3SLarry Finger 		} else {
1912c6821613SYan-Hsuan Chuang 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1913f1d2b4d3SLarry Finger 						true, 20);
1914c6821613SYan-Hsuan Chuang 			halbtc8723b1ant_coex_table_with_type(btcoexist,
1915f1d2b4d3SLarry Finger 							     NORMAL_EXEC, 1);
1916f1d2b4d3SLarry Finger 		}
19172d446a56SPing-Ke Shih 	} else if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
19182d446a56SPing-Ke Shih 		   coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY){
1919c6821613SYan-Hsuan Chuang 		btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
1920f1d2b4d3SLarry Finger 				BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1921f1d2b4d3SLarry Finger 	} else {
1922c6821613SYan-Hsuan Chuang 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
192340ca1882SPing-Ke Shih 		halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
192440ca1882SPing-Ke Shih 					     NORMAL_EXEC, false, false);
1925c6821613SYan-Hsuan Chuang 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1926f1d2b4d3SLarry Finger 	}
1927f1d2b4d3SLarry Finger }
1928f1d2b4d3SLarry Finger 
1929c6821613SYan-Hsuan Chuang static void
btc8723b1ant_act_wifi_not_conn_asso_auth(struct btc_coexist * btcoexist)1930c6821613SYan-Hsuan Chuang btc8723b1ant_act_wifi_not_conn_asso_auth(struct btc_coexist *btcoexist)
1931f1d2b4d3SLarry Finger {
1932c6821613SYan-Hsuan Chuang 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1933f1d2b4d3SLarry Finger 
1934c6821613SYan-Hsuan Chuang 	halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1935f1d2b4d3SLarry Finger 					 0x0, 0x0);
1936f1d2b4d3SLarry Finger 
193740ca1882SPing-Ke Shih 	/* tdma and coex table */
193840ca1882SPing-Ke Shih 	if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist) ||
193940ca1882SPing-Ke Shih 	    (bt_link_info->a2dp_exist)) {
194040ca1882SPing-Ke Shih 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
194140ca1882SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);
194240ca1882SPing-Ke Shih 	} else if (bt_link_info->pan_exist) {
1943c6821613SYan-Hsuan Chuang 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
194440ca1882SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 4);
194540ca1882SPing-Ke Shih 	} else {
194640ca1882SPing-Ke Shih 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
194740ca1882SPing-Ke Shih 		halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
194840ca1882SPing-Ke Shih 					     NORMAL_EXEC, false, false);
194940ca1882SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2);
1950f1d2b4d3SLarry Finger 	}
1951f1d2b4d3SLarry Finger }
1952f1d2b4d3SLarry Finger 
btc8723b1ant_action_wifi_conn_scan(struct btc_coexist * btcoexist)1953f1d2b4d3SLarry Finger static void btc8723b1ant_action_wifi_conn_scan(struct btc_coexist *btcoexist)
1954f1d2b4d3SLarry Finger {
1955f1d2b4d3SLarry Finger 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1956f1d2b4d3SLarry Finger 
1957f1d2b4d3SLarry Finger 	halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1958f1d2b4d3SLarry Finger 					 0x0, 0x0);
1959f1d2b4d3SLarry Finger 
1960f1d2b4d3SLarry Finger 	/* tdma and coex table */
19612d446a56SPing-Ke Shih 	if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
19621ecdc436SPing-Ke Shih 		if (bt_link_info->a2dp_exist) {
19631ecdc436SPing-Ke Shih 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
19641ecdc436SPing-Ke Shih 						true, 32);
19651ecdc436SPing-Ke Shih 			halbtc8723b1ant_coex_table_with_type(btcoexist,
19661ecdc436SPing-Ke Shih 							     NORMAL_EXEC, 4);
1967*e48c4531SPeter Kosyh 		} else if (bt_link_info->pan_exist) {
1968f1d2b4d3SLarry Finger 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1969f1d2b4d3SLarry Finger 						true, 22);
1970f1d2b4d3SLarry Finger 			halbtc8723b1ant_coex_table_with_type(btcoexist,
19711ecdc436SPing-Ke Shih 							     NORMAL_EXEC, 4);
1972f1d2b4d3SLarry Finger 		} else {
1973f1d2b4d3SLarry Finger 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1974f1d2b4d3SLarry Finger 						true, 20);
1975f1d2b4d3SLarry Finger 			halbtc8723b1ant_coex_table_with_type(btcoexist,
19761ecdc436SPing-Ke Shih 							     NORMAL_EXEC, 4);
1977f1d2b4d3SLarry Finger 		}
19782d446a56SPing-Ke Shih 	} else if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
19792d446a56SPing-Ke Shih 		   coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {
1980f1d2b4d3SLarry Finger 		btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
1981f1d2b4d3SLarry Finger 				BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1982f1d2b4d3SLarry Finger 	} else {
1983f1d2b4d3SLarry Finger 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
19841ecdc436SPing-Ke Shih 		halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
19851ecdc436SPing-Ke Shih 					     NORMAL_EXEC, false, false);
1986f1d2b4d3SLarry Finger 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1987f1d2b4d3SLarry Finger 	}
1988f1d2b4d3SLarry Finger }
1989f1d2b4d3SLarry Finger 
halbtc8723b1ant_action_wifi_connected_special_packet(struct btc_coexist * btcoexist)1990f1d2b4d3SLarry Finger static void halbtc8723b1ant_action_wifi_connected_special_packet(
1991f1d2b4d3SLarry Finger 						struct btc_coexist *btcoexist)
1992f1d2b4d3SLarry Finger {
1993f1d2b4d3SLarry Finger 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
19941ecdc436SPing-Ke Shih 	bool wifi_busy = false;
1995f1d2b4d3SLarry Finger 
19961ecdc436SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
19971ecdc436SPing-Ke Shih 
19981ecdc436SPing-Ke Shih 	/* no special packet process for both WiFi and BT very busy */
19991ecdc436SPing-Ke Shih 	if ((wifi_busy) &&
20001ecdc436SPing-Ke Shih 	    ((bt_link_info->pan_exist) || (coex_sta->num_of_profile >= 2)))
20011ecdc436SPing-Ke Shih 		return;
2002f1d2b4d3SLarry Finger 
2003f1d2b4d3SLarry Finger 	halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2004f1d2b4d3SLarry Finger 					 0x0, 0x0);
2005f1d2b4d3SLarry Finger 
2006f1d2b4d3SLarry Finger 	/* tdma and coex table */
20071ecdc436SPing-Ke Shih 	if ((bt_link_info->sco_exist) || (bt_link_info->hid_exist)) {
20081ecdc436SPing-Ke Shih 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
20091ecdc436SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
20101ecdc436SPing-Ke Shih 	} else if (bt_link_info->a2dp_exist) {
20111ecdc436SPing-Ke Shih 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
20121ecdc436SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
20131ecdc436SPing-Ke Shih 	} else if (bt_link_info->pan_exist) {
2014f1d2b4d3SLarry Finger 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
20151ecdc436SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
20161ecdc436SPing-Ke Shih 	} else {
20171ecdc436SPing-Ke Shih 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
20181ecdc436SPing-Ke Shih 		halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
20191ecdc436SPing-Ke Shih 					     NORMAL_EXEC, false, false);
20201ecdc436SPing-Ke Shih 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2021f1d2b4d3SLarry Finger 	}
2022f1d2b4d3SLarry Finger }
2023f1d2b4d3SLarry Finger 
halbtc8723b1ant_action_wifi_connected(struct btc_coexist * btcoexist)2024f1d2b4d3SLarry Finger static void halbtc8723b1ant_action_wifi_connected(struct btc_coexist *btcoexist)
2025f1d2b4d3SLarry Finger {
2026dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2027f1d2b4d3SLarry Finger 	bool wifi_busy = false;
2028f1d2b4d3SLarry Finger 	bool scan = false, link = false, roam = false;
2029f1d2b4d3SLarry Finger 	bool under_4way = false, ap_enable = false;
2030f1d2b4d3SLarry Finger 
2031c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2032f1d2b4d3SLarry Finger 		"[BTCoex], CoexForWifiConnect()===>\n");
2033f1d2b4d3SLarry Finger 
2034f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
2035f1d2b4d3SLarry Finger 			   &under_4way);
2036f1d2b4d3SLarry Finger 	if (under_4way) {
2037f1d2b4d3SLarry Finger 		halbtc8723b1ant_action_wifi_connected_special_packet(btcoexist);
2038c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2039f1d2b4d3SLarry Finger 			"[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n");
2040f1d2b4d3SLarry Finger 		return;
2041f1d2b4d3SLarry Finger 	}
2042f1d2b4d3SLarry Finger 
2043f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2044f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2045f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2046f1d2b4d3SLarry Finger 
2047f1d2b4d3SLarry Finger 	if (scan || link || roam) {
2048f1d2b4d3SLarry Finger 		if (scan)
2049f1d2b4d3SLarry Finger 			btc8723b1ant_action_wifi_conn_scan(btcoexist);
2050f1d2b4d3SLarry Finger 		else
2051f1d2b4d3SLarry Finger 			halbtc8723b1ant_action_wifi_connected_special_packet(
2052f1d2b4d3SLarry Finger 								     btcoexist);
2053c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2054f1d2b4d3SLarry Finger 			"[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n");
2055f1d2b4d3SLarry Finger 		return;
2056f1d2b4d3SLarry Finger 	}
2057f1d2b4d3SLarry Finger 
2058f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
2059f1d2b4d3SLarry Finger 			   &ap_enable);
2060f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2061f1d2b4d3SLarry Finger 	/* power save state */
2062f1d2b4d3SLarry Finger 	if (!ap_enable &&
20632d446a56SPing-Ke Shih 	    coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY &&
2064f1d2b4d3SLarry Finger 	    !btcoexist->bt_link_info.hid_only) {
20651ecdc436SPing-Ke Shih 		if (btcoexist->bt_link_info.a2dp_only) {
20661ecdc436SPing-Ke Shih 			if (!wifi_busy) {
2067f1d2b4d3SLarry Finger 				halbtc8723b1ant_power_save_state(btcoexist,
2068f1d2b4d3SLarry Finger 							 BTC_PS_WIFI_NATIVE,
2069f1d2b4d3SLarry Finger 							 0x0, 0x0);
20701ecdc436SPing-Ke Shih 			} else { /* busy */
20711ecdc436SPing-Ke Shih 				if (coex_sta->scan_ap_num >=
20721ecdc436SPing-Ke Shih 				    BT_8723B_1ANT_WIFI_NOISY_THRESH)
20731ecdc436SPing-Ke Shih 					/* no force LPS, no PS-TDMA,
20741ecdc436SPing-Ke Shih 					 * use pure TDMA
20751ecdc436SPing-Ke Shih 					 */
20761ecdc436SPing-Ke Shih 					halbtc8723b1ant_power_save_state(
20771ecdc436SPing-Ke Shih 						btcoexist, BTC_PS_WIFI_NATIVE,
20781ecdc436SPing-Ke Shih 						0x0, 0x0);
20791ecdc436SPing-Ke Shih 				else
20801ecdc436SPing-Ke Shih 					halbtc8723b1ant_power_save_state(
20811ecdc436SPing-Ke Shih 						btcoexist, BTC_PS_LPS_ON, 0x50,
20821ecdc436SPing-Ke Shih 						0x4);
20831ecdc436SPing-Ke Shih 			}
20841ecdc436SPing-Ke Shih 		} else if ((!coex_sta->pan_exist) && (!coex_sta->a2dp_exist) &&
20851ecdc436SPing-Ke Shih 			   (!coex_sta->hid_exist))
20861ecdc436SPing-Ke Shih 			halbtc8723b1ant_power_save_state(
20871ecdc436SPing-Ke Shih 				btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2088f1d2b4d3SLarry Finger 		else
2089f1d2b4d3SLarry Finger 			halbtc8723b1ant_power_save_state(btcoexist,
2090f1d2b4d3SLarry Finger 							 BTC_PS_LPS_ON,
2091f1d2b4d3SLarry Finger 							 0x50, 0x4);
2092f1d2b4d3SLarry Finger 	} else {
2093f1d2b4d3SLarry Finger 		halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2094f1d2b4d3SLarry Finger 						 0x0, 0x0);
2095f1d2b4d3SLarry Finger 	}
2096f1d2b4d3SLarry Finger 	/* tdma and coex table */
2097f1d2b4d3SLarry Finger 	if (!wifi_busy) {
20982d446a56SPing-Ke Shih 		if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
20992d446a56SPing-Ke Shih 			halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
21002d446a56SPing-Ke Shih 				btcoexist,
2101f1d2b4d3SLarry Finger 				BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
21022d446a56SPing-Ke Shih 		} else if (coex_dm->bt_status ==
21032d446a56SPing-Ke Shih 				BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
21042d446a56SPing-Ke Shih 			   coex_dm->bt_status ==
21052d446a56SPing-Ke Shih 				BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {
2106f1d2b4d3SLarry Finger 			btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
2107f1d2b4d3SLarry Finger 				     BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
2108f1d2b4d3SLarry Finger 		} else {
2109f1d2b4d3SLarry Finger 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
2110f1d2b4d3SLarry Finger 						false, 8);
21111ecdc436SPing-Ke Shih 			halbtc8723b1ant_set_ant_path(btcoexist,
21121ecdc436SPing-Ke Shih 						     BTC_ANT_PATH_PTA,
21131ecdc436SPing-Ke Shih 						     NORMAL_EXEC, false, false);
2114f1d2b4d3SLarry Finger 			halbtc8723b1ant_coex_table_with_type(btcoexist,
2115f1d2b4d3SLarry Finger 							     NORMAL_EXEC, 2);
2116f1d2b4d3SLarry Finger 		}
2117f1d2b4d3SLarry Finger 	} else {
21182d446a56SPing-Ke Shih 		if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
21192d446a56SPing-Ke Shih 			halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
21202d446a56SPing-Ke Shih 				btcoexist,
2121f1d2b4d3SLarry Finger 				BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
21222d446a56SPing-Ke Shih 		} else if (coex_dm->bt_status ==
21232d446a56SPing-Ke Shih 				BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
21242d446a56SPing-Ke Shih 			   coex_dm->bt_status ==
21252d446a56SPing-Ke Shih 				BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) {
2126f1d2b4d3SLarry Finger 			btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist,
2127f1d2b4d3SLarry Finger 				    BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY);
2128f1d2b4d3SLarry Finger 		} else {
2129f1d2b4d3SLarry Finger 			halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC,
21301ecdc436SPing-Ke Shih 						true, 32);
21311ecdc436SPing-Ke Shih 			halbtc8723b1ant_set_ant_path(btcoexist,
21321ecdc436SPing-Ke Shih 						     BTC_ANT_PATH_PTA,
21331ecdc436SPing-Ke Shih 						     NORMAL_EXEC, false, false);
2134f1d2b4d3SLarry Finger 			halbtc8723b1ant_coex_table_with_type(btcoexist,
21351ecdc436SPing-Ke Shih 							     NORMAL_EXEC, 4);
2136f1d2b4d3SLarry Finger 		}
2137f1d2b4d3SLarry Finger 	}
2138f1d2b4d3SLarry Finger }
2139f1d2b4d3SLarry Finger 
halbtc8723b1ant_run_coexist_mechanism(struct btc_coexist * btcoexist)2140f1d2b4d3SLarry Finger static void halbtc8723b1ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
2141f1d2b4d3SLarry Finger {
2142dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2143f1d2b4d3SLarry Finger 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
214486aeb825SYan-Hsuan Chuang 	bool wifi_connected = false, bt_hs_on = false, wifi_busy = false;
2145f1d2b4d3SLarry Finger 	bool increase_scan_dev_num = false;
2146f1d2b4d3SLarry Finger 	bool bt_ctrl_agg_buf_size = false;
214786aeb825SYan-Hsuan Chuang 	bool miracast_plus_bt = false;
2148f1d2b4d3SLarry Finger 	u8 agg_buf_size = 5;
214986aeb825SYan-Hsuan Chuang 	u8 iot_peer = BTC_IOT_PEER_UNKNOWN;
2150f1d2b4d3SLarry Finger 	u32 wifi_link_status = 0;
2151f1d2b4d3SLarry Finger 	u32 num_of_wifi_link = 0;
215286aeb825SYan-Hsuan Chuang 	u32 wifi_bw;
2153f1d2b4d3SLarry Finger 
2154c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2155f1d2b4d3SLarry Finger 		"[BTCoex], RunCoexistMechanism()===>\n");
2156f1d2b4d3SLarry Finger 
2157f1d2b4d3SLarry Finger 	if (btcoexist->manual_control) {
2158c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2159f1d2b4d3SLarry Finger 			"[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
2160f1d2b4d3SLarry Finger 		return;
2161f1d2b4d3SLarry Finger 	}
2162f1d2b4d3SLarry Finger 
2163f1d2b4d3SLarry Finger 	if (btcoexist->stop_coex_dm) {
2164c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2165f1d2b4d3SLarry Finger 			"[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");
2166f1d2b4d3SLarry Finger 		return;
2167f1d2b4d3SLarry Finger 	}
2168f1d2b4d3SLarry Finger 
2169f1d2b4d3SLarry Finger 	if (coex_sta->under_ips) {
2170c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2171f1d2b4d3SLarry Finger 			"[BTCoex], wifi is under IPS !!!\n");
2172f1d2b4d3SLarry Finger 		return;
2173f1d2b4d3SLarry Finger 	}
2174f1d2b4d3SLarry Finger 
217553e18bcfSPing-Ke Shih 	if (coex_sta->bt_whck_test) {
2176c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
217753e18bcfSPing-Ke Shih 			"[BTCoex], wifi is under IPS !!!\n");
217853e18bcfSPing-Ke Shih 		halbtc8723b1ant_action_bt_whck_test(btcoexist);
217953e18bcfSPing-Ke Shih 		return;
218053e18bcfSPing-Ke Shih 	}
218153e18bcfSPing-Ke Shih 
21822d446a56SPing-Ke Shih 	if (coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_BUSY ||
21832d446a56SPing-Ke Shih 	    coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_SCO_BUSY ||
21842d446a56SPing-Ke Shih 	    coex_dm->bt_status == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY)
2185f1d2b4d3SLarry Finger 		increase_scan_dev_num = true;
2186f1d2b4d3SLarry Finger 
2187f1d2b4d3SLarry Finger 	btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM,
2188f1d2b4d3SLarry Finger 			   &increase_scan_dev_num);
2189f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2190f1d2b4d3SLarry Finger 			   &wifi_connected);
219186aeb825SYan-Hsuan Chuang 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2192f1d2b4d3SLarry Finger 
2193f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2194f1d2b4d3SLarry Finger 			   &wifi_link_status);
2195f1d2b4d3SLarry Finger 	num_of_wifi_link = wifi_link_status >> 16;
2196f1d2b4d3SLarry Finger 
219786aeb825SYan-Hsuan Chuang 	if (num_of_wifi_link >= 2 ||
219886aeb825SYan-Hsuan Chuang 	    wifi_link_status & WIFI_P2P_GO_CONNECTED) {
219986aeb825SYan-Hsuan Chuang 		if (bt_link_info->bt_link_exist) {
220086aeb825SYan-Hsuan Chuang 			halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1,
220186aeb825SYan-Hsuan Chuang 						   0, 1);
220286aeb825SYan-Hsuan Chuang 			miracast_plus_bt = true;
2203f1d2b4d3SLarry Finger 		} else {
220486aeb825SYan-Hsuan Chuang 			halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0,
220586aeb825SYan-Hsuan Chuang 						   0, 0);
220686aeb825SYan-Hsuan Chuang 			miracast_plus_bt = false;
2207f1d2b4d3SLarry Finger 		}
220886aeb825SYan-Hsuan Chuang 		btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
220986aeb825SYan-Hsuan Chuang 				   &miracast_plus_bt);
2210f1d2b4d3SLarry Finger 		halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2211f1d2b4d3SLarry Finger 					   bt_ctrl_agg_buf_size, agg_buf_size);
2212f1d2b4d3SLarry Finger 
221386aeb825SYan-Hsuan Chuang 		if ((bt_link_info->a2dp_exist || wifi_busy) &&
221486aeb825SYan-Hsuan Chuang 		    (coex_sta->c2h_bt_inquiry_page))
221586aeb825SYan-Hsuan Chuang 			halbtc8723b1ant_action_bt_inquiry(btcoexist);
221686aeb825SYan-Hsuan Chuang 		else
221786aeb825SYan-Hsuan Chuang 			halbtc8723b1ant_action_wifi_multiport(btcoexist);
221886aeb825SYan-Hsuan Chuang 
221986aeb825SYan-Hsuan Chuang 		return;
222086aeb825SYan-Hsuan Chuang 	}
222186aeb825SYan-Hsuan Chuang 
222286aeb825SYan-Hsuan Chuang 	miracast_plus_bt = false;
222386aeb825SYan-Hsuan Chuang 	btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
222486aeb825SYan-Hsuan Chuang 			   &miracast_plus_bt);
222586aeb825SYan-Hsuan Chuang 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
222686aeb825SYan-Hsuan Chuang 
222786aeb825SYan-Hsuan Chuang 	if (bt_link_info->bt_link_exist && wifi_connected) {
222886aeb825SYan-Hsuan Chuang 		halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 1, 1, 0, 1);
222986aeb825SYan-Hsuan Chuang 
223086aeb825SYan-Hsuan Chuang 		btcoexist->btc_get(btcoexist, BTC_GET_U1_IOT_PEER, &iot_peer);
223186aeb825SYan-Hsuan Chuang 
223286aeb825SYan-Hsuan Chuang 		if (iot_peer != BTC_IOT_PEER_CISCO &&
223386aeb825SYan-Hsuan Chuang 		    iot_peer != BTC_IOT_PEER_BROADCOM) {
22340f61953dSLarry Finger 			bool sco_exist = bt_link_info->sco_exist;
22350f61953dSLarry Finger 
223686aeb825SYan-Hsuan Chuang 			halbtc8723b1ant_limited_rx(btcoexist,
22370f61953dSLarry Finger 						   NORMAL_EXEC, sco_exist,
223886aeb825SYan-Hsuan Chuang 						   false, 0x5);
223986aeb825SYan-Hsuan Chuang 		} else {
224086aeb825SYan-Hsuan Chuang 			if (bt_link_info->sco_exist) {
224186aeb825SYan-Hsuan Chuang 				halbtc8723b1ant_limited_rx(btcoexist,
224286aeb825SYan-Hsuan Chuang 							   NORMAL_EXEC, true,
224386aeb825SYan-Hsuan Chuang 							   false, 0x5);
224486aeb825SYan-Hsuan Chuang 			} else {
224586aeb825SYan-Hsuan Chuang 				if (wifi_bw == BTC_WIFI_BW_HT40)
224686aeb825SYan-Hsuan Chuang 					halbtc8723b1ant_limited_rx(
224786aeb825SYan-Hsuan Chuang 						btcoexist, NORMAL_EXEC, false,
224886aeb825SYan-Hsuan Chuang 						true, 0x10);
224986aeb825SYan-Hsuan Chuang 				else
225086aeb825SYan-Hsuan Chuang 					halbtc8723b1ant_limited_rx(
225186aeb825SYan-Hsuan Chuang 						btcoexist, NORMAL_EXEC, false,
225286aeb825SYan-Hsuan Chuang 						true, 0x8);
225386aeb825SYan-Hsuan Chuang 			}
225486aeb825SYan-Hsuan Chuang 		}
225586aeb825SYan-Hsuan Chuang 
225686aeb825SYan-Hsuan Chuang 		halbtc8723b1ant_sw_mechanism(btcoexist, true);
225786aeb825SYan-Hsuan Chuang 	} else {
225886aeb825SYan-Hsuan Chuang 		halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
225986aeb825SYan-Hsuan Chuang 
226086aeb825SYan-Hsuan Chuang 		halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false,
226186aeb825SYan-Hsuan Chuang 					   0x5);
226286aeb825SYan-Hsuan Chuang 
226386aeb825SYan-Hsuan Chuang 		halbtc8723b1ant_sw_mechanism(btcoexist, false);
226486aeb825SYan-Hsuan Chuang 	}
2265f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2266f1d2b4d3SLarry Finger 
2267f1d2b4d3SLarry Finger 	if (coex_sta->c2h_bt_inquiry_page) {
2268f1d2b4d3SLarry Finger 		halbtc8723b1ant_action_bt_inquiry(btcoexist);
2269f1d2b4d3SLarry Finger 		return;
2270f1d2b4d3SLarry Finger 	} else if (bt_hs_on) {
2271f1d2b4d3SLarry Finger 		halbtc8723b1ant_action_hs(btcoexist);
2272f1d2b4d3SLarry Finger 		return;
2273f1d2b4d3SLarry Finger 	}
2274f1d2b4d3SLarry Finger 
2275f1d2b4d3SLarry Finger 	if (!wifi_connected) {
2276f1d2b4d3SLarry Finger 		bool scan = false, link = false, roam = false;
2277f1d2b4d3SLarry Finger 
2278c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2279f1d2b4d3SLarry Finger 			"[BTCoex], wifi is non connected-idle !!!\n");
2280f1d2b4d3SLarry Finger 
2281f1d2b4d3SLarry Finger 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2282f1d2b4d3SLarry Finger 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2283f1d2b4d3SLarry Finger 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2284f1d2b4d3SLarry Finger 
2285f1d2b4d3SLarry Finger 		if (scan || link || roam) {
2286f1d2b4d3SLarry Finger 			if (scan)
2287f1d2b4d3SLarry Finger 				btc8723b1ant_action_wifi_not_conn_scan(
2288f1d2b4d3SLarry Finger 								     btcoexist);
2289f1d2b4d3SLarry Finger 			else
2290f1d2b4d3SLarry Finger 				btc8723b1ant_act_wifi_not_conn_asso_auth(
2291f1d2b4d3SLarry Finger 								     btcoexist);
2292f1d2b4d3SLarry Finger 		} else {
2293f1d2b4d3SLarry Finger 			btc8723b1ant_action_wifi_not_conn(btcoexist);
2294f1d2b4d3SLarry Finger 		}
2295f1d2b4d3SLarry Finger 	} else { /* wifi LPS/Busy */
2296f1d2b4d3SLarry Finger 		halbtc8723b1ant_action_wifi_connected(btcoexist);
2297f1d2b4d3SLarry Finger 	}
2298f1d2b4d3SLarry Finger }
2299f1d2b4d3SLarry Finger 
230037a5be0cSPing-Ke Shih /* force coex mechanism to reset */
halbtc8723b1ant_init_coex_dm(struct btc_coexist * btcoexist)2301f1d2b4d3SLarry Finger static void halbtc8723b1ant_init_coex_dm(struct btc_coexist *btcoexist)
2302f1d2b4d3SLarry Finger {
2303f1d2b4d3SLarry Finger 	/* sw all off */
2304f1d2b4d3SLarry Finger 	halbtc8723b1ant_sw_mechanism(btcoexist, false);
2305f1d2b4d3SLarry Finger 
230637a5be0cSPing-Ke Shih 	coex_sta->pop_event_cnt = 0;
2307f1d2b4d3SLarry Finger }
2308f1d2b4d3SLarry Finger 
halbtc8723b1ant_init_hw_config(struct btc_coexist * btcoexist,bool backup,bool wifi_only)2309f1d2b4d3SLarry Finger static void halbtc8723b1ant_init_hw_config(struct btc_coexist *btcoexist,
23108ffb5b69SPing-Ke Shih 					   bool backup, bool wifi_only)
2311f1d2b4d3SLarry Finger {
2312dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2313f1d2b4d3SLarry Finger 	u32 u32tmp = 0;
23148ffb5b69SPing-Ke Shih 	u8 u8tmpa = 0, u8tmpb = 0;
2315f1d2b4d3SLarry Finger 
2316c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2317f1d2b4d3SLarry Finger 		"[BTCoex], 1Ant Init HW Config!!\n");
2318f1d2b4d3SLarry Finger 
23198ffb5b69SPing-Ke Shih 	/* 0xf0[15:12] --> Chip Cut information */
23208ffb5b69SPing-Ke Shih 	coex_sta->cut_version =
23218ffb5b69SPing-Ke Shih 		(btcoexist->btc_read_1byte(btcoexist, 0xf1) & 0xf0) >> 4;
23228ffb5b69SPing-Ke Shih 	/* enable TBTT interrupt */
23238ffb5b69SPing-Ke Shih 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8, 0x1);
2324f1d2b4d3SLarry Finger 
2325f1d2b4d3SLarry Finger 	/* 0x790[5:0] = 0x5 */
23268ffb5b69SPing-Ke Shih 	btcoexist->btc_write_1byte(btcoexist, 0x790, 0x5);
2327f1d2b4d3SLarry Finger 
2328f1d2b4d3SLarry Finger 	/* Enable counter statistics */
2329f1d2b4d3SLarry Finger 	btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1);
2330f1d2b4d3SLarry Finger 	btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
2331f1d2b4d3SLarry Finger 
23328ffb5b69SPing-Ke Shih 	halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
23338ffb5b69SPing-Ke Shih 
2334f1d2b4d3SLarry Finger 	/* Antenna config */
23358ffb5b69SPing-Ke Shih 	if (wifi_only)
23368ffb5b69SPing-Ke Shih 		halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI,
23378ffb5b69SPing-Ke Shih 					     FORCE_EXEC, true, false);
23388ffb5b69SPing-Ke Shih 	else
23398ffb5b69SPing-Ke Shih 		halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
23408ffb5b69SPing-Ke Shih 					     FORCE_EXEC, true, false);
23418ffb5b69SPing-Ke Shih 
2342f1d2b4d3SLarry Finger 	/* PTA parameter */
2343f1d2b4d3SLarry Finger 	halbtc8723b1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
23448ffb5b69SPing-Ke Shih 
23458ffb5b69SPing-Ke Shih 	u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
23468ffb5b69SPing-Ke Shih 	u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
23478ffb5b69SPing-Ke Shih 	u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
23488ffb5b69SPing-Ke Shih 
2349c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
23508ffb5b69SPing-Ke Shih 		"############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",
23518ffb5b69SPing-Ke Shih 		u32tmp, u8tmpa, u8tmpb);
2352f1d2b4d3SLarry Finger }
2353f1d2b4d3SLarry Finger 
2354f1d2b4d3SLarry Finger /**************************************************************
2355753c953bSYan-Hsuan Chuang  * extern function start with ex_btc8723b1ant_
2356f1d2b4d3SLarry Finger  **************************************************************/
ex_btc8723b1ant_power_on_setting(struct btc_coexist * btcoexist)2357753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_power_on_setting(struct btc_coexist *btcoexist)
2358f9c6ede7SPing-Ke Shih {
2359f9c6ede7SPing-Ke Shih 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2360f9c6ede7SPing-Ke Shih 	struct btc_board_info *board_info = &btcoexist->board_info;
2361f9c6ede7SPing-Ke Shih 	u8 u8tmp = 0x0;
2362f9c6ede7SPing-Ke Shih 	u16 u16tmp = 0x0;
2363f9c6ede7SPing-Ke Shih 	u32 value;
2364f9c6ede7SPing-Ke Shih 
2365c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2366f9c6ede7SPing-Ke Shih 		"xxxxxxxxxxxxxxxx Execute 8723b 1-Ant PowerOn Setting xxxxxxxxxxxxxxxx!!\n");
2367f9c6ede7SPing-Ke Shih 
2368f9c6ede7SPing-Ke Shih 	btcoexist->stop_coex_dm = true;
2369f9c6ede7SPing-Ke Shih 
2370f9c6ede7SPing-Ke Shih 	btcoexist->btc_write_1byte(btcoexist, 0x67, 0x20);
2371f9c6ede7SPing-Ke Shih 
2372f9c6ede7SPing-Ke Shih 	/* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. */
2373f9c6ede7SPing-Ke Shih 	u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2);
2374f9c6ede7SPing-Ke Shih 	btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT0 | BIT1);
2375f9c6ede7SPing-Ke Shih 
2376f9c6ede7SPing-Ke Shih 	/* set GRAN_BT = 1 */
2377f9c6ede7SPing-Ke Shih 	btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
2378f9c6ede7SPing-Ke Shih 	/* set WLAN_ACT = 0 */
2379f9c6ede7SPing-Ke Shih 	btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
2380f9c6ede7SPing-Ke Shih 
2381f9c6ede7SPing-Ke Shih 	/* S0 or S1 setting and Local register setting(By the setting fw can get
2382f9c6ede7SPing-Ke Shih 	 * ant number, S0/S1, ... info)
2383f9c6ede7SPing-Ke Shih 	 *
2384f9c6ede7SPing-Ke Shih 	 * Local setting bit define
2385f9c6ede7SPing-Ke Shih 	 *	BIT0: "0" for no antenna inverse; "1" for antenna inverse
2386f9c6ede7SPing-Ke Shih 	 *	BIT1: "0" for internal switch; "1" for external switch
2387f9c6ede7SPing-Ke Shih 	 *	BIT2: "0" for one antenna; "1" for two antenna
2388f9c6ede7SPing-Ke Shih 	 * NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and
2389f9c6ede7SPing-Ke Shih 	 * BIT2 = 0
2390f9c6ede7SPing-Ke Shih 	 */
2391f9c6ede7SPing-Ke Shih 	if (btcoexist->chip_interface == BTC_INTF_USB) {
2392f9c6ede7SPing-Ke Shih 		/* fixed at S0 for USB interface */
2393f9c6ede7SPing-Ke Shih 		btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
2394f9c6ede7SPing-Ke Shih 
2395f9c6ede7SPing-Ke Shih 		u8tmp |= 0x1; /* antenna inverse */
2396f9c6ede7SPing-Ke Shih 		btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
2397f9c6ede7SPing-Ke Shih 
2398f9c6ede7SPing-Ke Shih 		board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
2399f9c6ede7SPing-Ke Shih 	} else {
2400f9c6ede7SPing-Ke Shih 		/* for PCIE and SDIO interface, we check efuse 0xc3[6] */
2401f9c6ede7SPing-Ke Shih 		if (board_info->single_ant_path == 0) {
2402f9c6ede7SPing-Ke Shih 			/* set to S1 */
2403f9c6ede7SPing-Ke Shih 			btcoexist->btc_write_4byte(btcoexist, 0x948, 0x280);
2404f9c6ede7SPing-Ke Shih 			board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
2405f9c6ede7SPing-Ke Shih 			value = 1;
2406f9c6ede7SPing-Ke Shih 		} else if (board_info->single_ant_path == 1) {
2407f9c6ede7SPing-Ke Shih 			/* set to S0 */
2408f9c6ede7SPing-Ke Shih 			btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
2409f9c6ede7SPing-Ke Shih 			u8tmp |= 0x1; /* antenna inverse */
2410f9c6ede7SPing-Ke Shih 			board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
2411f9c6ede7SPing-Ke Shih 			value = 0;
2412f9c6ede7SPing-Ke Shih 		}
2413f9c6ede7SPing-Ke Shih 
2414f9c6ede7SPing-Ke Shih 		btcoexist->btc_set(btcoexist, BTC_SET_ACT_ANTPOSREGRISTRY_CTRL,
2415f9c6ede7SPing-Ke Shih 				   &value);
2416f9c6ede7SPing-Ke Shih 
2417f9c6ede7SPing-Ke Shih 		if (btcoexist->chip_interface == BTC_INTF_PCI)
2418f9c6ede7SPing-Ke Shih 			btcoexist->btc_write_local_reg_1byte(btcoexist, 0x384,
2419f9c6ede7SPing-Ke Shih 							     u8tmp);
2420f9c6ede7SPing-Ke Shih 		else if (btcoexist->chip_interface == BTC_INTF_SDIO)
2421f9c6ede7SPing-Ke Shih 			btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60,
2422f9c6ede7SPing-Ke Shih 							     u8tmp);
2423f9c6ede7SPing-Ke Shih 	}
2424f9c6ede7SPing-Ke Shih }
2425f9c6ede7SPing-Ke Shih 
2426f1d2b4d3SLarry Finger 
ex_btc8723b1ant_init_hwconfig(struct btc_coexist * btcoexist,bool wifi_only)2427753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_init_hwconfig(struct btc_coexist *btcoexist,
24288ffb5b69SPing-Ke Shih 				   bool wifi_only)
2429f1d2b4d3SLarry Finger {
24308ffb5b69SPing-Ke Shih 	halbtc8723b1ant_init_hw_config(btcoexist, true, wifi_only);
24318ffb5b69SPing-Ke Shih 	btcoexist->stop_coex_dm = false;
2432f1d2b4d3SLarry Finger }
2433f1d2b4d3SLarry Finger 
ex_btc8723b1ant_init_coex_dm(struct btc_coexist * btcoexist)2434753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_init_coex_dm(struct btc_coexist *btcoexist)
2435f1d2b4d3SLarry Finger {
2436dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2437dd192494SLarry Finger 
2438c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2439f1d2b4d3SLarry Finger 		"[BTCoex], Coex Mechanism Init!!\n");
2440f1d2b4d3SLarry Finger 
2441f1d2b4d3SLarry Finger 	btcoexist->stop_coex_dm = false;
2442f1d2b4d3SLarry Finger 
2443f1d2b4d3SLarry Finger 	halbtc8723b1ant_init_coex_dm(btcoexist);
2444f1d2b4d3SLarry Finger 
2445f1d2b4d3SLarry Finger 	halbtc8723b1ant_query_bt_info(btcoexist);
2446f1d2b4d3SLarry Finger }
2447f1d2b4d3SLarry Finger 
ex_btc8723b1ant_display_coex_info(struct btc_coexist * btcoexist,struct seq_file * m)244808431b62SPing-Ke Shih void ex_btc8723b1ant_display_coex_info(struct btc_coexist *btcoexist,
244908431b62SPing-Ke Shih 				       struct seq_file *m)
2450f1d2b4d3SLarry Finger {
2451f1d2b4d3SLarry Finger 	struct btc_board_info *board_info = &btcoexist->board_info;
2452f1d2b4d3SLarry Finger 	struct btc_stack_info *stack_info = &btcoexist->stack_info;
2453f1d2b4d3SLarry Finger 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2454f1d2b4d3SLarry Finger 	u8 u8tmp[4], i, bt_info_ext, pstdmacase = 0;
2455f1d2b4d3SLarry Finger 	u16 u16tmp[4];
2456f1d2b4d3SLarry Finger 	u32 u32tmp[4];
2457f1d2b4d3SLarry Finger 	bool roam = false, scan = false;
2458f1d2b4d3SLarry Finger 	bool link = false, wifi_under_5g = false;
2459f1d2b4d3SLarry Finger 	bool bt_hs_on = false, wifi_busy = false;
2460f1d2b4d3SLarry Finger 	s32 wifi_rssi = 0, bt_hs_rssi = 0;
2461f1d2b4d3SLarry Finger 	u32 wifi_bw, wifi_traffic_dir, fa_ofdm, fa_cck, wifi_link_status;
2462f1d2b4d3SLarry Finger 	u8 wifi_dot11_chnl, wifi_hs_chnl;
2463f1d2b4d3SLarry Finger 	u32 fw_ver = 0, bt_patch_ver = 0;
2464f1d2b4d3SLarry Finger 
246508431b62SPing-Ke Shih 	seq_puts(m, "\n ============[BT Coexist info]============");
2466f1d2b4d3SLarry Finger 
2467f1d2b4d3SLarry Finger 	if (btcoexist->manual_control) {
246808431b62SPing-Ke Shih 		seq_puts(m, "\n ============[Under Manual Control]==========");
246908431b62SPing-Ke Shih 		seq_puts(m, "\n ==========================================");
2470f1d2b4d3SLarry Finger 	}
2471f1d2b4d3SLarry Finger 	if (btcoexist->stop_coex_dm) {
247208431b62SPing-Ke Shih 		seq_puts(m, "\n ============[Coex is STOPPED]============");
247308431b62SPing-Ke Shih 		seq_puts(m, "\n ==========================================");
2474f1d2b4d3SLarry Finger 	}
2475f1d2b4d3SLarry Finger 
247608431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %d/ %d/ %d",
2477f1d2b4d3SLarry Finger 		   "Ant PG Num/ Ant Mech/ Ant Pos:",
2478f1d2b4d3SLarry Finger 		   board_info->pg_ant_num, board_info->btdm_ant_num,
2479f1d2b4d3SLarry Finger 		   board_info->btdm_ant_pos);
2480f1d2b4d3SLarry Finger 
248108431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %s / %d",
2482f1d2b4d3SLarry Finger 		   "BT stack/ hci ext ver",
2483f1d2b4d3SLarry Finger 		   ((stack_info->profile_notified) ? "Yes" : "No"),
2484f1d2b4d3SLarry Finger 		   stack_info->hci_version);
2485f1d2b4d3SLarry Finger 
2486f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
2487f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
248808431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
2489f1d2b4d3SLarry Finger 		   "CoexVer/ FwVer/ PatchVer",
2490f1d2b4d3SLarry Finger 		   glcoex_ver_date_8723b_1ant, glcoex_ver_8723b_1ant,
2491f1d2b4d3SLarry Finger 		   fw_ver, bt_patch_ver, bt_patch_ver);
2492f1d2b4d3SLarry Finger 
2493f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2494f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
2495f1d2b4d3SLarry Finger 			   &wifi_dot11_chnl);
2496f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);
249708431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %d / %d(%d)",
2498f1d2b4d3SLarry Finger 		   "Dot11 channel / HsChnl(HsMode)",
2499f1d2b4d3SLarry Finger 		   wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);
2500f1d2b4d3SLarry Finger 
250108431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %3ph ",
2502f1d2b4d3SLarry Finger 		   "H2C Wifi inform bt chnl Info",
250368ec5810SAndy Shevchenko 		   coex_dm->wifi_chnl_info);
2504f1d2b4d3SLarry Finger 
2505f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
2506f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
250708431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %d/ %d",
2508f1d2b4d3SLarry Finger 		   "Wifi rssi/ HS rssi", wifi_rssi, bt_hs_rssi);
2509f1d2b4d3SLarry Finger 
2510f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2511f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2512f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
251308431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %d/ %d/ %d ",
2514f1d2b4d3SLarry Finger 		   "Wifi link/ roam/ scan", link, roam, scan);
2515f1d2b4d3SLarry Finger 
2516f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist , BTC_GET_BL_WIFI_UNDER_5G,
2517f1d2b4d3SLarry Finger 			   &wifi_under_5g);
2518f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2519f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2520f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
2521f1d2b4d3SLarry Finger 			   &wifi_traffic_dir);
2522f1d2b4d3SLarry Finger 
252308431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %s / %s/ %s ",
2524f1d2b4d3SLarry Finger 		   "Wifi status", (wifi_under_5g ? "5G" : "2.4G"),
2525dd192494SLarry Finger 		   ((wifi_bw == BTC_WIFI_BW_LEGACY) ? "Legacy" :
2526dd192494SLarry Finger 		    ((wifi_bw == BTC_WIFI_BW_HT40) ? "HT40" : "HT20")),
2527f1d2b4d3SLarry Finger 		    ((!wifi_busy) ? "idle" :
2528dd192494SLarry Finger 		     ((wifi_traffic_dir == BTC_WIFI_TRAFFIC_TX) ?
2529f1d2b4d3SLarry Finger 		     "uplink" : "downlink")));
2530f1d2b4d3SLarry Finger 
2531f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2532f1d2b4d3SLarry Finger 			   &wifi_link_status);
253308431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %d/ %d/ %d/ %d/ %d",
2534f1d2b4d3SLarry Finger 		   "sta/vwifi/hs/p2pGo/p2pGc",
2535f1d2b4d3SLarry Finger 		   ((wifi_link_status & WIFI_STA_CONNECTED) ? 1 : 0),
2536f1d2b4d3SLarry Finger 		   ((wifi_link_status & WIFI_AP_CONNECTED) ? 1 : 0),
2537f1d2b4d3SLarry Finger 		   ((wifi_link_status & WIFI_HS_CONNECTED) ? 1 : 0),
2538f1d2b4d3SLarry Finger 		   ((wifi_link_status & WIFI_P2P_GO_CONNECTED) ? 1 : 0),
2539f1d2b4d3SLarry Finger 		   ((wifi_link_status & WIFI_P2P_GC_CONNECTED) ? 1 : 0));
2540f1d2b4d3SLarry Finger 
254108431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = [%s/ %d/ %d] ",
2542f1d2b4d3SLarry Finger 		   "BT [status/ rssi/ retryCnt]",
254312e87c09SPing-Ke Shih 		   ((coex_sta->bt_disabled) ? ("disabled") :
2544f1d2b4d3SLarry Finger 		    ((coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan") :
2545f1d2b4d3SLarry Finger 		     ((BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
2546f1d2b4d3SLarry Finger 		       coex_dm->bt_status) ?
2547f1d2b4d3SLarry Finger 		      "non-connected idle" :
2548f1d2b4d3SLarry Finger 		      ((BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE ==
2549f1d2b4d3SLarry Finger 			coex_dm->bt_status) ?
2550f1d2b4d3SLarry Finger 		       "connected-idle" : "busy")))),
2551f1d2b4d3SLarry Finger 		       coex_sta->bt_rssi, coex_sta->bt_retry_cnt);
2552f1d2b4d3SLarry Finger 
255308431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %d / %d / %d / %d",
2554f1d2b4d3SLarry Finger 		   "SCO/HID/PAN/A2DP", bt_link_info->sco_exist,
2555f1d2b4d3SLarry Finger 		   bt_link_info->hid_exist, bt_link_info->pan_exist,
2556f1d2b4d3SLarry Finger 		   bt_link_info->a2dp_exist);
255708431b62SPing-Ke Shih 	btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO, m);
2558f1d2b4d3SLarry Finger 
2559f1d2b4d3SLarry Finger 	bt_info_ext = coex_sta->bt_info_ext;
256008431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %s",
2561f1d2b4d3SLarry Finger 		   "BT Info A2DP rate",
2562f1d2b4d3SLarry Finger 		   (bt_info_ext & BIT0) ? "Basic rate" : "EDR rate");
2563f1d2b4d3SLarry Finger 
2564f1d2b4d3SLarry Finger 	for (i = 0; i < BT_INFO_SRC_8723B_1ANT_MAX; i++) {
2565f1d2b4d3SLarry Finger 		if (coex_sta->bt_info_c2h_cnt[i]) {
256608431b62SPing-Ke Shih 			seq_printf(m, "\n %-35s = %7ph(%d)",
2567c6821613SYan-Hsuan Chuang 				   glbt_info_src_8723b_1ant[i],
256868ec5810SAndy Shevchenko 				   coex_sta->bt_info_c2h[i],
2569f1d2b4d3SLarry Finger 				   coex_sta->bt_info_c2h_cnt[i]);
2570f1d2b4d3SLarry Finger 		}
2571f1d2b4d3SLarry Finger 	}
257208431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %s/%s, (0x%x/0x%x)",
2573f1d2b4d3SLarry Finger 		   "PS state, IPS/LPS, (lps/rpwm)",
2574f1d2b4d3SLarry Finger 		   ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
2575f1d2b4d3SLarry Finger 		   ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")),
2576f1d2b4d3SLarry Finger 		   btcoexist->bt_info.lps_val,
2577f1d2b4d3SLarry Finger 		   btcoexist->bt_info.rpwm_val);
257808431b62SPing-Ke Shih 	btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);
2579f1d2b4d3SLarry Finger 
2580f1d2b4d3SLarry Finger 	if (!btcoexist->manual_control) {
2581f1d2b4d3SLarry Finger 		/* Sw mechanism	*/
258208431b62SPing-Ke Shih 		seq_printf(m, "\n %-35s",
2583f1d2b4d3SLarry Finger 			   "============[Sw mechanism]============");
2584f1d2b4d3SLarry Finger 
258508431b62SPing-Ke Shih 		seq_printf(m, "\n %-35s = %d/",
2586f1d2b4d3SLarry Finger 			   "SM[LowPenaltyRA]", coex_dm->cur_low_penalty_ra);
2587f1d2b4d3SLarry Finger 
258808431b62SPing-Ke Shih 		seq_printf(m, "\n %-35s = %s/ %s/ %d ",
2589f1d2b4d3SLarry Finger 			   "DelBA/ BtCtrlAgg/ AggSize",
2590f1d2b4d3SLarry Finger 			   (btcoexist->bt_info.reject_agg_pkt ? "Yes" : "No"),
2591f1d2b4d3SLarry Finger 			   (btcoexist->bt_info.bt_ctrl_buf_size ? "Yes" : "No"),
2592f1d2b4d3SLarry Finger 			   btcoexist->bt_info.agg_buf_size);
2593f1d2b4d3SLarry Finger 
259408431b62SPing-Ke Shih 		seq_printf(m, "\n %-35s = 0x%x ",
2595f1d2b4d3SLarry Finger 			   "Rate Mask", btcoexist->bt_info.ra_mask);
2596f1d2b4d3SLarry Finger 
2597f1d2b4d3SLarry Finger 		/* Fw mechanism	*/
259808431b62SPing-Ke Shih 		seq_printf(m, "\n %-35s",
2599f1d2b4d3SLarry Finger 			   "============[Fw mechanism]============");
2600f1d2b4d3SLarry Finger 
2601f1d2b4d3SLarry Finger 		pstdmacase = coex_dm->cur_ps_tdma;
260208431b62SPing-Ke Shih 		seq_printf(m, "\n %-35s = %5ph case-%d (auto:%d)",
260368ec5810SAndy Shevchenko 			   "PS TDMA", coex_dm->ps_tdma_para,
2604f1d2b4d3SLarry Finger 			   pstdmacase, coex_dm->auto_tdma_adjust);
2605f1d2b4d3SLarry Finger 
260608431b62SPing-Ke Shih 		seq_printf(m, "\n %-35s = %d ",
2607f1d2b4d3SLarry Finger 			   "IgnWlanAct", coex_dm->cur_ignore_wlan_act);
2608f1d2b4d3SLarry Finger 
260908431b62SPing-Ke Shih 		seq_printf(m, "\n %-35s = 0x%x ",
2610f1d2b4d3SLarry Finger 			   "Latest error condition(should be 0)",
2611f1d2b4d3SLarry Finger 			   coex_dm->error_condition);
2612f1d2b4d3SLarry Finger 	}
2613f1d2b4d3SLarry Finger 
261408431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %d",
261546b5689cSPing-Ke Shih 		   "Coex Table Type", coex_sta->coex_table_type);
261646b5689cSPing-Ke Shih 
2617f1d2b4d3SLarry Finger 	/* Hw setting */
261808431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s",
2619f1d2b4d3SLarry Finger 		   "============[Hw setting]============");
2620f1d2b4d3SLarry Finger 
262108431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2622f1d2b4d3SLarry Finger 		   "backup ARFR1/ARFR2/RL/AMaxTime", coex_dm->backup_arfr_cnt1,
2623f1d2b4d3SLarry Finger 		   coex_dm->backup_arfr_cnt2, coex_dm->backup_retry_limit,
2624f1d2b4d3SLarry Finger 		   coex_dm->backup_ampdu_max_time);
2625f1d2b4d3SLarry Finger 
2626f1d2b4d3SLarry Finger 	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
2627f1d2b4d3SLarry Finger 	u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
2628f1d2b4d3SLarry Finger 	u16tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
2629f1d2b4d3SLarry Finger 	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
263008431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2631f1d2b4d3SLarry Finger 		   "0x430/0x434/0x42a/0x456",
2632f1d2b4d3SLarry Finger 		   u32tmp[0], u32tmp[1], u16tmp[0], u8tmp[0]);
2633f1d2b4d3SLarry Finger 
2634f1d2b4d3SLarry Finger 	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
2635f1d2b4d3SLarry Finger 	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6cc);
2636f1d2b4d3SLarry Finger 	u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x880);
263708431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2638f1d2b4d3SLarry Finger 		   "0x778/0x6cc/0x880[29:25]", u8tmp[0], u32tmp[0],
2639f1d2b4d3SLarry Finger 		   (u32tmp[1] & 0x3e000000) >> 25);
2640f1d2b4d3SLarry Finger 
2641f1d2b4d3SLarry Finger 	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x948);
2642f1d2b4d3SLarry Finger 	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x67);
2643f1d2b4d3SLarry Finger 	u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x765);
264408431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2645f1d2b4d3SLarry Finger 		   "0x948/ 0x67[5] / 0x765",
2646f1d2b4d3SLarry Finger 		   u32tmp[0], ((u8tmp[0] & 0x20) >> 5), u8tmp[1]);
2647f1d2b4d3SLarry Finger 
2648f1d2b4d3SLarry Finger 	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x92c);
2649f1d2b4d3SLarry Finger 	u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x930);
2650f1d2b4d3SLarry Finger 	u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x944);
265108431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2652f1d2b4d3SLarry Finger 		   "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]",
2653f1d2b4d3SLarry Finger 		   u32tmp[0] & 0x3, u32tmp[1] & 0xff, u32tmp[2] & 0x3);
2654f1d2b4d3SLarry Finger 
2655f1d2b4d3SLarry Finger 	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x39);
2656f1d2b4d3SLarry Finger 	u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
2657f1d2b4d3SLarry Finger 	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
2658f1d2b4d3SLarry Finger 	u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64);
265908431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
2660f1d2b4d3SLarry Finger 		   "0x38[11]/0x40/0x4c[24:23]/0x64[0]",
2661f1d2b4d3SLarry Finger 		   ((u8tmp[0] & 0x8) >> 3), u8tmp[1],
2662f1d2b4d3SLarry Finger 		    ((u32tmp[0] & 0x01800000) >> 23), u8tmp[2] & 0x1);
2663f1d2b4d3SLarry Finger 
2664f1d2b4d3SLarry Finger 	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
2665f1d2b4d3SLarry Finger 	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
266608431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
2667f1d2b4d3SLarry Finger 		   "0x550(bcn ctrl)/0x522", u32tmp[0], u8tmp[0]);
2668f1d2b4d3SLarry Finger 
2669f1d2b4d3SLarry Finger 	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
2670f1d2b4d3SLarry Finger 	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x49c);
267108431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
2672f1d2b4d3SLarry Finger 		   "0xc50(dig)/0x49c(null-drop)", u32tmp[0] & 0xff, u8tmp[0]);
2673f1d2b4d3SLarry Finger 
2674f1d2b4d3SLarry Finger 	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xda0);
2675f1d2b4d3SLarry Finger 	u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xda4);
2676f1d2b4d3SLarry Finger 	u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0xda8);
2677f1d2b4d3SLarry Finger 	u32tmp[3] = btcoexist->btc_read_4byte(btcoexist, 0xcf0);
2678f1d2b4d3SLarry Finger 
2679f1d2b4d3SLarry Finger 	u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);
2680f1d2b4d3SLarry Finger 	u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
2681f1d2b4d3SLarry Finger 
2682f1d2b4d3SLarry Finger 	fa_ofdm = ((u32tmp[0] & 0xffff0000) >> 16) +
2683f1d2b4d3SLarry Finger 		  ((u32tmp[1] & 0xffff0000) >> 16) +
2684f1d2b4d3SLarry Finger 		   (u32tmp[1] & 0xffff) +
2685f1d2b4d3SLarry Finger 		   (u32tmp[2] & 0xffff) +
2686f1d2b4d3SLarry Finger 		  ((u32tmp[3] & 0xffff0000) >> 16) +
2687f1d2b4d3SLarry Finger 		   (u32tmp[3] & 0xffff);
2688f1d2b4d3SLarry Finger 	fa_cck = (u8tmp[0] << 8) + u8tmp[1];
2689f1d2b4d3SLarry Finger 
269008431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2691f1d2b4d3SLarry Finger 		   "OFDM-CCA/OFDM-FA/CCK-FA",
2692f1d2b4d3SLarry Finger 		 u32tmp[0] & 0xffff, fa_ofdm, fa_cck);
2693f1d2b4d3SLarry Finger 
2694f1d2b4d3SLarry Finger 	u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
2695f1d2b4d3SLarry Finger 	u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
2696f1d2b4d3SLarry Finger 	u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
269708431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2698f1d2b4d3SLarry Finger 		   "0x6c0/0x6c4/0x6c8(coexTable)",
2699f1d2b4d3SLarry Finger 		   u32tmp[0], u32tmp[1], u32tmp[2]);
2700f1d2b4d3SLarry Finger 
270108431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %d/ %d",
2702f1d2b4d3SLarry Finger 		   "0x770(high-pri rx/tx)", coex_sta->high_priority_rx,
2703f1d2b4d3SLarry Finger 		   coex_sta->high_priority_tx);
270408431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %d/ %d",
2705f1d2b4d3SLarry Finger 		   "0x774(low-pri rx/tx)", coex_sta->low_priority_rx,
2706f1d2b4d3SLarry Finger 		   coex_sta->low_priority_tx);
2707f66509e3SLarry Finger 	if (btcoexist->auto_report_1ant)
2708f1d2b4d3SLarry Finger 		halbtc8723b1ant_monitor_bt_ctr(btcoexist);
270908431b62SPing-Ke Shih 	btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);
2710f1d2b4d3SLarry Finger }
2711f1d2b4d3SLarry Finger 
ex_btc8723b1ant_ips_notify(struct btc_coexist * btcoexist,u8 type)2712753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
2713f1d2b4d3SLarry Finger {
2714dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2715dd192494SLarry Finger 
2716f1d2b4d3SLarry Finger 	if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2717f1d2b4d3SLarry Finger 		return;
2718f1d2b4d3SLarry Finger 
2719f1d2b4d3SLarry Finger 	if (BTC_IPS_ENTER == type) {
2720c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2721f1d2b4d3SLarry Finger 			"[BTCoex], IPS ENTER notify\n");
2722f1d2b4d3SLarry Finger 		coex_sta->under_ips = true;
2723f1d2b4d3SLarry Finger 
2724c6821613SYan-Hsuan Chuang 		halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
272596e3baadSPing-Ke Shih 					     FORCE_EXEC, false, true);
2726f1d2b4d3SLarry Finger 		/* set PTA control */
2727f1d2b4d3SLarry Finger 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2728f1d2b4d3SLarry Finger 		halbtc8723b1ant_coex_table_with_type(btcoexist,
2729f1d2b4d3SLarry Finger 						     NORMAL_EXEC, 0);
2730f1d2b4d3SLarry Finger 	} else if (BTC_IPS_LEAVE == type) {
2731c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2732f1d2b4d3SLarry Finger 			"[BTCoex], IPS LEAVE notify\n");
2733f1d2b4d3SLarry Finger 		coex_sta->under_ips = false;
2734f1d2b4d3SLarry Finger 
27358ffb5b69SPing-Ke Shih 		halbtc8723b1ant_init_hw_config(btcoexist, false, false);
2736f1d2b4d3SLarry Finger 		halbtc8723b1ant_init_coex_dm(btcoexist);
2737f1d2b4d3SLarry Finger 		halbtc8723b1ant_query_bt_info(btcoexist);
2738f1d2b4d3SLarry Finger 	}
2739f1d2b4d3SLarry Finger }
2740f1d2b4d3SLarry Finger 
ex_btc8723b1ant_lps_notify(struct btc_coexist * btcoexist,u8 type)2741753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
2742f1d2b4d3SLarry Finger {
2743dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2744dd192494SLarry Finger 
2745f1d2b4d3SLarry Finger 	if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2746f1d2b4d3SLarry Finger 		return;
2747f1d2b4d3SLarry Finger 
2748f1d2b4d3SLarry Finger 	if (BTC_LPS_ENABLE == type) {
2749c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2750f1d2b4d3SLarry Finger 			"[BTCoex], LPS ENABLE notify\n");
2751f1d2b4d3SLarry Finger 		coex_sta->under_lps = true;
2752f1d2b4d3SLarry Finger 	} else if (BTC_LPS_DISABLE == type) {
2753c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2754f1d2b4d3SLarry Finger 			"[BTCoex], LPS DISABLE notify\n");
2755f1d2b4d3SLarry Finger 		coex_sta->under_lps = false;
2756f1d2b4d3SLarry Finger 	}
2757f1d2b4d3SLarry Finger }
2758f1d2b4d3SLarry Finger 
ex_btc8723b1ant_scan_notify(struct btc_coexist * btcoexist,u8 type)2759753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
2760f1d2b4d3SLarry Finger {
2761dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2762f1d2b4d3SLarry Finger 	bool wifi_connected = false, bt_hs_on = false;
2763c01fd117SPing-Ke Shih 	u8 u8tmpa, u8tmpb;
2764c01fd117SPing-Ke Shih 	u32 u32tmp;
2765f1d2b4d3SLarry Finger 	u32 wifi_link_status = 0;
2766f1d2b4d3SLarry Finger 	u32 num_of_wifi_link = 0;
2767f1d2b4d3SLarry Finger 	bool bt_ctrl_agg_buf_size = false;
2768f1d2b4d3SLarry Finger 	u8 agg_buf_size = 5;
2769f1d2b4d3SLarry Finger 
2770c01fd117SPing-Ke Shih 	if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2771c01fd117SPing-Ke Shih 		return;
2772c01fd117SPing-Ke Shih 
2773c01fd117SPing-Ke Shih 	if (type == BTC_SCAN_START) {
2774c34e42aaSPing-Ke Shih 		coex_sta->wifi_is_high_pri_task = true;
2775c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2776c01fd117SPing-Ke Shih 			"[BTCoex], SCAN START notify\n");
2777c01fd117SPing-Ke Shih 		/* Force antenna setup for no scan result issue */
2778c01fd117SPing-Ke Shih 		halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2779c01fd117SPing-Ke Shih 		halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2780c01fd117SPing-Ke Shih 					     FORCE_EXEC, false, false);
2781c01fd117SPing-Ke Shih 		u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
2782c01fd117SPing-Ke Shih 		u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
2783c01fd117SPing-Ke Shih 		u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
2784c01fd117SPing-Ke Shih 
2785c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2786c01fd117SPing-Ke Shih 			"[BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x\n",
2787c01fd117SPing-Ke Shih 			u32tmp, u8tmpa, u8tmpb);
2788c01fd117SPing-Ke Shih 	} else {
2789c34e42aaSPing-Ke Shih 		coex_sta->wifi_is_high_pri_task = false;
2790c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2791c01fd117SPing-Ke Shih 			"[BTCoex], SCAN FINISH notify\n");
2792c01fd117SPing-Ke Shih 
2793c01fd117SPing-Ke Shih 		btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
2794c01fd117SPing-Ke Shih 				   &coex_sta->scan_ap_num);
2795c01fd117SPing-Ke Shih 	}
2796c01fd117SPing-Ke Shih 
2797c01fd117SPing-Ke Shih 	if (coex_sta->bt_disabled)
2798f1d2b4d3SLarry Finger 		return;
2799f1d2b4d3SLarry Finger 
2800f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2801f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2802f1d2b4d3SLarry Finger 			   &wifi_connected);
2803f1d2b4d3SLarry Finger 
2804f1d2b4d3SLarry Finger 	halbtc8723b1ant_query_bt_info(btcoexist);
2805f1d2b4d3SLarry Finger 
2806f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2807f1d2b4d3SLarry Finger 			   &wifi_link_status);
2808f1d2b4d3SLarry Finger 	num_of_wifi_link = wifi_link_status >> 16;
2809f1d2b4d3SLarry Finger 	if (num_of_wifi_link >= 2) {
2810f1d2b4d3SLarry Finger 		halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2811f1d2b4d3SLarry Finger 		halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2812f1d2b4d3SLarry Finger 					   bt_ctrl_agg_buf_size, agg_buf_size);
2813f1d2b4d3SLarry Finger 		halbtc8723b1ant_action_wifi_multiport(btcoexist);
2814f1d2b4d3SLarry Finger 		return;
2815f1d2b4d3SLarry Finger 	}
2816f1d2b4d3SLarry Finger 
2817f1d2b4d3SLarry Finger 	if (coex_sta->c2h_bt_inquiry_page) {
2818f1d2b4d3SLarry Finger 		halbtc8723b1ant_action_bt_inquiry(btcoexist);
2819f1d2b4d3SLarry Finger 		return;
2820f1d2b4d3SLarry Finger 	} else if (bt_hs_on) {
2821f1d2b4d3SLarry Finger 		halbtc8723b1ant_action_hs(btcoexist);
2822f1d2b4d3SLarry Finger 		return;
2823f1d2b4d3SLarry Finger 	}
2824f1d2b4d3SLarry Finger 
2825f1d2b4d3SLarry Finger 	if (BTC_SCAN_START == type) {
2826c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2827f1d2b4d3SLarry Finger 			"[BTCoex], SCAN START notify\n");
2828c6821613SYan-Hsuan Chuang 		if (!wifi_connected)
2829c6821613SYan-Hsuan Chuang 			/* non-connected scan */
2830f1d2b4d3SLarry Finger 			btc8723b1ant_action_wifi_not_conn_scan(btcoexist);
2831c6821613SYan-Hsuan Chuang 		else
2832c6821613SYan-Hsuan Chuang 			/* wifi is connected */
2833f1d2b4d3SLarry Finger 			btc8723b1ant_action_wifi_conn_scan(btcoexist);
2834f1d2b4d3SLarry Finger 	} else if (BTC_SCAN_FINISH == type) {
2835c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2836f1d2b4d3SLarry Finger 			"[BTCoex], SCAN FINISH notify\n");
2837c6821613SYan-Hsuan Chuang 		if (!wifi_connected)
2838c6821613SYan-Hsuan Chuang 			/* non-connected scan */
2839f1d2b4d3SLarry Finger 			btc8723b1ant_action_wifi_not_conn(btcoexist);
2840f1d2b4d3SLarry Finger 		else
2841f1d2b4d3SLarry Finger 			halbtc8723b1ant_action_wifi_connected(btcoexist);
2842f1d2b4d3SLarry Finger 	}
2843f1d2b4d3SLarry Finger }
2844f1d2b4d3SLarry Finger 
ex_btc8723b1ant_connect_notify(struct btc_coexist * btcoexist,u8 type)2845753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
2846f1d2b4d3SLarry Finger {
2847dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2848f1d2b4d3SLarry Finger 	bool wifi_connected = false, bt_hs_on = false;
2849f1d2b4d3SLarry Finger 	u32 wifi_link_status = 0;
2850f1d2b4d3SLarry Finger 	u32 num_of_wifi_link = 0;
2851f9af7af4SPing-Ke Shih 	bool bt_ctrl_agg_buf_size = false, under_4way = false;
2852f1d2b4d3SLarry Finger 	u8 agg_buf_size = 5;
2853f1d2b4d3SLarry Finger 
2854f9af7af4SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
2855f9af7af4SPing-Ke Shih 			   &under_4way);
2856f9af7af4SPing-Ke Shih 
2857f1d2b4d3SLarry Finger 	if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
285812e87c09SPing-Ke Shih 	    coex_sta->bt_disabled)
2859f1d2b4d3SLarry Finger 		return;
2860f1d2b4d3SLarry Finger 
2861f9af7af4SPing-Ke Shih 	if (type == BTC_ASSOCIATE_START) {
2862c34e42aaSPing-Ke Shih 		coex_sta->wifi_is_high_pri_task = true;
2863c34e42aaSPing-Ke Shih 
2864f9af7af4SPing-Ke Shih 		/* Force antenna setup for no scan result issue */
2865f9af7af4SPing-Ke Shih 		halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
2866f9af7af4SPing-Ke Shih 		halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2867f9af7af4SPing-Ke Shih 					     FORCE_EXEC, false, false);
2868c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2869f9af7af4SPing-Ke Shih 			"[BTCoex], CONNECT START notify\n");
2870fa73a1ebSPing-Ke Shih 		coex_dm->arp_cnt = 0;
2871f9af7af4SPing-Ke Shih 	} else {
2872c34e42aaSPing-Ke Shih 		coex_sta->wifi_is_high_pri_task = false;
2873c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2874f9af7af4SPing-Ke Shih 			"[BTCoex], CONNECT FINISH notify\n");
2875f9af7af4SPing-Ke Shih 	}
2876f9af7af4SPing-Ke Shih 
2877f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
2878f1d2b4d3SLarry Finger 			   &wifi_link_status);
2879f1d2b4d3SLarry Finger 	num_of_wifi_link = wifi_link_status>>16;
2880f1d2b4d3SLarry Finger 	if (num_of_wifi_link >= 2) {
2881f1d2b4d3SLarry Finger 		halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
2882f1d2b4d3SLarry Finger 		halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
2883f1d2b4d3SLarry Finger 					   bt_ctrl_agg_buf_size, agg_buf_size);
2884f1d2b4d3SLarry Finger 		halbtc8723b1ant_action_wifi_multiport(btcoexist);
2885f1d2b4d3SLarry Finger 		return;
2886f1d2b4d3SLarry Finger 	}
2887f1d2b4d3SLarry Finger 
2888f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2889f1d2b4d3SLarry Finger 	if (coex_sta->c2h_bt_inquiry_page) {
2890f1d2b4d3SLarry Finger 		halbtc8723b1ant_action_bt_inquiry(btcoexist);
2891f1d2b4d3SLarry Finger 		return;
2892f1d2b4d3SLarry Finger 	} else if (bt_hs_on) {
2893f1d2b4d3SLarry Finger 		halbtc8723b1ant_action_hs(btcoexist);
2894f1d2b4d3SLarry Finger 		return;
2895f1d2b4d3SLarry Finger 	}
2896f1d2b4d3SLarry Finger 
2897f1d2b4d3SLarry Finger 	if (BTC_ASSOCIATE_START == type) {
2898c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2899f1d2b4d3SLarry Finger 			"[BTCoex], CONNECT START notify\n");
2900f1d2b4d3SLarry Finger 		btc8723b1ant_act_wifi_not_conn_asso_auth(btcoexist);
2901f1d2b4d3SLarry Finger 	} else if (BTC_ASSOCIATE_FINISH == type) {
2902c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2903f1d2b4d3SLarry Finger 			"[BTCoex], CONNECT FINISH notify\n");
2904f1d2b4d3SLarry Finger 
2905f1d2b4d3SLarry Finger 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2906f1d2b4d3SLarry Finger 				   &wifi_connected);
2907c6821613SYan-Hsuan Chuang 		if (!wifi_connected)
2908c6821613SYan-Hsuan Chuang 			/* non-connected scan */
2909f1d2b4d3SLarry Finger 			btc8723b1ant_action_wifi_not_conn(btcoexist);
2910f1d2b4d3SLarry Finger 		else
2911f1d2b4d3SLarry Finger 			halbtc8723b1ant_action_wifi_connected(btcoexist);
2912f1d2b4d3SLarry Finger 	}
2913f1d2b4d3SLarry Finger }
2914f1d2b4d3SLarry Finger 
ex_btc8723b1ant_media_status_notify(struct btc_coexist * btcoexist,u8 type)2915753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_media_status_notify(struct btc_coexist *btcoexist,
2916f1d2b4d3SLarry Finger 					 u8 type)
2917f1d2b4d3SLarry Finger {
2918dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
2919f1d2b4d3SLarry Finger 	u8 h2c_parameter[3] = {0};
2920f1d2b4d3SLarry Finger 	u32 wifi_bw;
29212d446a56SPing-Ke Shih 	u8 wifi_central_chnl;
292229c1de91SPing-Ke Shih 	bool wifi_under_b_mode = false;
2923f1d2b4d3SLarry Finger 
2924f1d2b4d3SLarry Finger 	if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
292512e87c09SPing-Ke Shih 	    coex_sta->bt_disabled)
2926f1d2b4d3SLarry Finger 		return;
2927f1d2b4d3SLarry Finger 
292829c1de91SPing-Ke Shih 	if (type == BTC_MEDIA_CONNECT) {
2929c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2930f1d2b4d3SLarry Finger 			"[BTCoex], MEDIA connect notify\n");
293129c1de91SPing-Ke Shih 		/* Force antenna setup for no scan result issue */
293229c1de91SPing-Ke Shih 		halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
293329c1de91SPing-Ke Shih 		halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
293429c1de91SPing-Ke Shih 					     FORCE_EXEC, false, false);
293529c1de91SPing-Ke Shih 		btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
293629c1de91SPing-Ke Shih 				   &wifi_under_b_mode);
293729c1de91SPing-Ke Shih 
293829c1de91SPing-Ke Shih 		/* Set CCK Tx/Rx high Pri except 11b mode */
293929c1de91SPing-Ke Shih 		if (wifi_under_b_mode) {
294029c1de91SPing-Ke Shih 			btcoexist->btc_write_1byte(btcoexist, 0x6cd,
294129c1de91SPing-Ke Shih 						   0x00); /* CCK Tx */
294229c1de91SPing-Ke Shih 			btcoexist->btc_write_1byte(btcoexist, 0x6cf,
294329c1de91SPing-Ke Shih 						   0x00); /* CCK Rx */
294429c1de91SPing-Ke Shih 		} else {
294529c1de91SPing-Ke Shih 			btcoexist->btc_write_1byte(btcoexist, 0x6cd,
294629c1de91SPing-Ke Shih 						   0x00); /* CCK Tx */
294729c1de91SPing-Ke Shih 			btcoexist->btc_write_1byte(btcoexist, 0x6cf,
294829c1de91SPing-Ke Shih 						   0x10); /* CCK Rx */
294929c1de91SPing-Ke Shih 		}
295029c1de91SPing-Ke Shih 
295129c1de91SPing-Ke Shih 		coex_dm->backup_arfr_cnt1 =
295229c1de91SPing-Ke Shih 			btcoexist->btc_read_4byte(btcoexist, 0x430);
295329c1de91SPing-Ke Shih 		coex_dm->backup_arfr_cnt2 =
295429c1de91SPing-Ke Shih 			btcoexist->btc_read_4byte(btcoexist, 0x434);
295529c1de91SPing-Ke Shih 		coex_dm->backup_retry_limit =
295629c1de91SPing-Ke Shih 			btcoexist->btc_read_2byte(btcoexist, 0x42a);
295729c1de91SPing-Ke Shih 		coex_dm->backup_ampdu_max_time =
295829c1de91SPing-Ke Shih 			btcoexist->btc_read_1byte(btcoexist, 0x456);
295929c1de91SPing-Ke Shih 	} else {
2960c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2961f1d2b4d3SLarry Finger 			"[BTCoex], MEDIA disconnect notify\n");
2962fa73a1ebSPing-Ke Shih 		coex_dm->arp_cnt = 0;
2963f1d2b4d3SLarry Finger 
296429c1de91SPing-Ke Shih 		btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x0); /* CCK Tx */
296529c1de91SPing-Ke Shih 		btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x0); /* CCK Rx */
296629c1de91SPing-Ke Shih 
296729c1de91SPing-Ke Shih 		coex_sta->cck_ever_lock = false;
296829c1de91SPing-Ke Shih 	}
296929c1de91SPing-Ke Shih 
2970f1d2b4d3SLarry Finger 	/* only 2.4G we need to inform bt the chnl mask */
2971f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
29722d446a56SPing-Ke Shih 			   &wifi_central_chnl);
2973f1d2b4d3SLarry Finger 
29742d446a56SPing-Ke Shih 	if (type == BTC_MEDIA_CONNECT && wifi_central_chnl <= 14) {
2975f1d2b4d3SLarry Finger 		h2c_parameter[0] = 0x0;
29762d446a56SPing-Ke Shih 		h2c_parameter[1] = wifi_central_chnl;
2977f1d2b4d3SLarry Finger 		btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2978f1d2b4d3SLarry Finger 		if (BTC_WIFI_BW_HT40 == wifi_bw)
2979f1d2b4d3SLarry Finger 			h2c_parameter[2] = 0x30;
2980f1d2b4d3SLarry Finger 		else
2981f1d2b4d3SLarry Finger 			h2c_parameter[2] = 0x20;
2982f1d2b4d3SLarry Finger 	}
2983f1d2b4d3SLarry Finger 
2984f1d2b4d3SLarry Finger 	coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
2985f1d2b4d3SLarry Finger 	coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
2986f1d2b4d3SLarry Finger 	coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
2987f1d2b4d3SLarry Finger 
2988c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2989f1d2b4d3SLarry Finger 		"[BTCoex], FW write 0x66 = 0x%x\n",
2990f1d2b4d3SLarry Finger 		h2c_parameter[0] << 16 | h2c_parameter[1] << 8 |
2991f1d2b4d3SLarry Finger 		h2c_parameter[2]);
2992f1d2b4d3SLarry Finger 
2993f1d2b4d3SLarry Finger 	btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
2994f1d2b4d3SLarry Finger }
2995f1d2b4d3SLarry Finger 
ex_btc8723b1ant_special_packet_notify(struct btc_coexist * btcoexist,u8 type)2996753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_special_packet_notify(struct btc_coexist *btcoexist,
2997f1d2b4d3SLarry Finger 					   u8 type)
2998f1d2b4d3SLarry Finger {
2999dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3000f1d2b4d3SLarry Finger 	bool bt_hs_on = false;
3001f1d2b4d3SLarry Finger 	u32 wifi_link_status = 0;
3002f1d2b4d3SLarry Finger 	u32 num_of_wifi_link = 0;
3003fa73a1ebSPing-Ke Shih 	bool bt_ctrl_agg_buf_size = false, under_4way = false;
3004f1d2b4d3SLarry Finger 	u8 agg_buf_size = 5;
3005f1d2b4d3SLarry Finger 
3006fa73a1ebSPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
3007fa73a1ebSPing-Ke Shih 			   &under_4way);
3008fa73a1ebSPing-Ke Shih 
3009f1d2b4d3SLarry Finger 	if (btcoexist->manual_control || btcoexist->stop_coex_dm ||
301012e87c09SPing-Ke Shih 	    coex_sta->bt_disabled)
3011f1d2b4d3SLarry Finger 		return;
3012f1d2b4d3SLarry Finger 
3013fa73a1ebSPing-Ke Shih 	if (type == BTC_PACKET_DHCP || type == BTC_PACKET_EAPOL ||
3014fa73a1ebSPing-Ke Shih 	    type == BTC_PACKET_ARP) {
3015fa73a1ebSPing-Ke Shih 		if (type == BTC_PACKET_ARP) {
3016c8159c3fSLarry Finger 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3017fa73a1ebSPing-Ke Shih 				"[BTCoex], special Packet ARP notify\n");
3018fa73a1ebSPing-Ke Shih 
3019fa73a1ebSPing-Ke Shih 			coex_dm->arp_cnt++;
3020c8159c3fSLarry Finger 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3021fa73a1ebSPing-Ke Shih 				"[BTCoex], ARP Packet Count = %d\n",
3022fa73a1ebSPing-Ke Shih 				 coex_dm->arp_cnt);
3023c34e42aaSPing-Ke Shih 
3024c34e42aaSPing-Ke Shih 			if ((coex_dm->arp_cnt >= 10) && (!under_4way))
3025c34e42aaSPing-Ke Shih 				/* if APR PKT > 10 after connect, do not go to
3026c34e42aaSPing-Ke Shih 				 * ActionWifiConnectedSpecificPacket(btcoexist)
3027c34e42aaSPing-Ke Shih 				 */
3028c34e42aaSPing-Ke Shih 				coex_sta->wifi_is_high_pri_task = false;
3029c34e42aaSPing-Ke Shih 			else
3030c34e42aaSPing-Ke Shih 				coex_sta->wifi_is_high_pri_task = true;
3031fa73a1ebSPing-Ke Shih 		} else {
3032c34e42aaSPing-Ke Shih 			coex_sta->wifi_is_high_pri_task = true;
3033c8159c3fSLarry Finger 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3034fa73a1ebSPing-Ke Shih 				"[BTCoex], special Packet DHCP or EAPOL notify\n");
3035fa73a1ebSPing-Ke Shih 		}
3036fa73a1ebSPing-Ke Shih 	} else {
3037c34e42aaSPing-Ke Shih 		coex_sta->wifi_is_high_pri_task = false;
3038c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3039fa73a1ebSPing-Ke Shih 			"[BTCoex], special Packet [Type = %d] notify\n",
3040fa73a1ebSPing-Ke Shih 			 type);
3041fa73a1ebSPing-Ke Shih 	}
3042fa73a1ebSPing-Ke Shih 
3043f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3044f1d2b4d3SLarry Finger 		&wifi_link_status);
3045f1d2b4d3SLarry Finger 	num_of_wifi_link = wifi_link_status >> 16;
3046f1d2b4d3SLarry Finger 	if (num_of_wifi_link >= 2) {
3047f1d2b4d3SLarry Finger 		halbtc8723b1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
3048f1d2b4d3SLarry Finger 		halbtc8723b1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
3049f1d2b4d3SLarry Finger 					   bt_ctrl_agg_buf_size, agg_buf_size);
3050f1d2b4d3SLarry Finger 		halbtc8723b1ant_action_wifi_multiport(btcoexist);
3051f1d2b4d3SLarry Finger 		return;
3052f1d2b4d3SLarry Finger 	}
3053f1d2b4d3SLarry Finger 
3054f1d2b4d3SLarry Finger 	coex_sta->special_pkt_period_cnt = 0;
3055f1d2b4d3SLarry Finger 
3056f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3057f1d2b4d3SLarry Finger 	if (coex_sta->c2h_bt_inquiry_page) {
3058f1d2b4d3SLarry Finger 		halbtc8723b1ant_action_bt_inquiry(btcoexist);
3059f1d2b4d3SLarry Finger 		return;
3060f1d2b4d3SLarry Finger 	} else if (bt_hs_on) {
3061f1d2b4d3SLarry Finger 		halbtc8723b1ant_action_hs(btcoexist);
3062f1d2b4d3SLarry Finger 		return;
3063f1d2b4d3SLarry Finger 	}
3064f1d2b4d3SLarry Finger 
3065f1d2b4d3SLarry Finger 	if (BTC_PACKET_DHCP == type ||
3066f1d2b4d3SLarry Finger 	    BTC_PACKET_EAPOL == type) {
3067c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3068f1d2b4d3SLarry Finger 			"[BTCoex], special Packet(%d) notify\n", type);
3069f1d2b4d3SLarry Finger 		halbtc8723b1ant_action_wifi_connected_special_packet(btcoexist);
3070f1d2b4d3SLarry Finger 	}
3071f1d2b4d3SLarry Finger }
3072f1d2b4d3SLarry Finger 
ex_btc8723b1ant_bt_info_notify(struct btc_coexist * btcoexist,u8 * tmp_buf,u8 length)3073753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_bt_info_notify(struct btc_coexist *btcoexist,
3074f1d2b4d3SLarry Finger 				    u8 *tmp_buf, u8 length)
3075f1d2b4d3SLarry Finger {
3076dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3077f1d2b4d3SLarry Finger 	u8 bt_info = 0;
3078f1d2b4d3SLarry Finger 	u8 i, rsp_source = 0;
3079f1d2b4d3SLarry Finger 	bool wifi_connected = false;
3080f1d2b4d3SLarry Finger 	bool bt_busy = false;
3081f1d2b4d3SLarry Finger 
3082f1d2b4d3SLarry Finger 	coex_sta->c2h_bt_info_req_sent = false;
3083f1d2b4d3SLarry Finger 
3084f1d2b4d3SLarry Finger 	rsp_source = tmp_buf[0] & 0xf;
3085f1d2b4d3SLarry Finger 	if (rsp_source >= BT_INFO_SRC_8723B_1ANT_MAX)
3086f1d2b4d3SLarry Finger 		rsp_source = BT_INFO_SRC_8723B_1ANT_WIFI_FW;
3087f1d2b4d3SLarry Finger 	coex_sta->bt_info_c2h_cnt[rsp_source]++;
3088f1d2b4d3SLarry Finger 
3089c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3090f1d2b4d3SLarry Finger 		"[BTCoex], Bt info[%d], length=%d, hex data = [",
3091f1d2b4d3SLarry Finger 		 rsp_source, length);
3092f1d2b4d3SLarry Finger 	for (i = 0; i < length; i++) {
3093f1d2b4d3SLarry Finger 		coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
3094f1d2b4d3SLarry Finger 		if (i == 1)
3095f1d2b4d3SLarry Finger 			bt_info = tmp_buf[i];
3096f1d2b4d3SLarry Finger 		if (i == length - 1)
3097c8159c3fSLarry Finger 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3098f1d2b4d3SLarry Finger 				"0x%02x]\n", tmp_buf[i]);
3099f1d2b4d3SLarry Finger 		else
3100c8159c3fSLarry Finger 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3101f1d2b4d3SLarry Finger 				"0x%02x, ", tmp_buf[i]);
3102f1d2b4d3SLarry Finger 	}
3103f1d2b4d3SLarry Finger 
310453e18bcfSPing-Ke Shih 	/* if 0xff, it means BT is under WHCK test */
310553e18bcfSPing-Ke Shih 	if (bt_info == 0xff)
310653e18bcfSPing-Ke Shih 		coex_sta->bt_whck_test = true;
310753e18bcfSPing-Ke Shih 	else
310853e18bcfSPing-Ke Shih 		coex_sta->bt_whck_test = false;
310953e18bcfSPing-Ke Shih 
31102d446a56SPing-Ke Shih 	if (rsp_source != BT_INFO_SRC_8723B_1ANT_WIFI_FW) {
3111f1d2b4d3SLarry Finger 		coex_sta->bt_retry_cnt = /* [3:0] */
3112f1d2b4d3SLarry Finger 			coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
3113f1d2b4d3SLarry Finger 
31147d0d2c14SPing-Ke Shih 		if (coex_sta->bt_retry_cnt >= 1)
31157d0d2c14SPing-Ke Shih 			coex_sta->pop_event_cnt++;
31167d0d2c14SPing-Ke Shih 
31177d0d2c14SPing-Ke Shih 		if (coex_sta->bt_info_c2h[rsp_source][2] & 0x20)
31187d0d2c14SPing-Ke Shih 			coex_sta->c2h_bt_remote_name_req = true;
31197d0d2c14SPing-Ke Shih 		else
31207d0d2c14SPing-Ke Shih 			coex_sta->c2h_bt_remote_name_req = false;
31217d0d2c14SPing-Ke Shih 
3122f1d2b4d3SLarry Finger 		coex_sta->bt_rssi =
31237d0d2c14SPing-Ke Shih 			coex_sta->bt_info_c2h[rsp_source][3] * 2 - 90;
3124f1d2b4d3SLarry Finger 
3125f1d2b4d3SLarry Finger 		coex_sta->bt_info_ext =
3126f1d2b4d3SLarry Finger 			coex_sta->bt_info_c2h[rsp_source][4];
3127f1d2b4d3SLarry Finger 
31287d0d2c14SPing-Ke Shih 		if (coex_sta->bt_info_c2h[rsp_source][1] == 0x49) {
31297d0d2c14SPing-Ke Shih 			coex_sta->a2dp_bit_pool =
31307d0d2c14SPing-Ke Shih 				coex_sta->bt_info_c2h[rsp_source][6];
31317d0d2c14SPing-Ke Shih 		} else {
31327d0d2c14SPing-Ke Shih 			coex_sta->a2dp_bit_pool = 0;
31337d0d2c14SPing-Ke Shih 		}
31347d0d2c14SPing-Ke Shih 
31357d0d2c14SPing-Ke Shih 		coex_sta->bt_tx_rx_mask =
31367d0d2c14SPing-Ke Shih 			(coex_sta->bt_info_c2h[rsp_source][2] & 0x40);
31377d0d2c14SPing-Ke Shih 		btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TX_RX_MASK,
31387d0d2c14SPing-Ke Shih 				   &coex_sta->bt_tx_rx_mask);
31397d0d2c14SPing-Ke Shih 
31407d0d2c14SPing-Ke Shih 		if (!coex_sta->bt_tx_rx_mask) {
31417d0d2c14SPing-Ke Shih 			/* BT into is responded by BT FW and BT RF REG
31427d0d2c14SPing-Ke Shih 			 * 0x3C != 0x15 => Need to switch BT TRx Mask
31437d0d2c14SPing-Ke Shih 			 */
3144c8159c3fSLarry Finger 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
31457d0d2c14SPing-Ke Shih 				"[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x15\n");
31467d0d2c14SPing-Ke Shih 			btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
31477d0d2c14SPing-Ke Shih 						  0x3c, 0x15);
31487d0d2c14SPing-Ke Shih 
31497d0d2c14SPing-Ke Shih 			/* BT TRx Mask lock 0x2c[0], 0x30[0] = 0 */
31507d0d2c14SPing-Ke Shih 			btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
31517d0d2c14SPing-Ke Shih 						  0x2c, 0x7c44);
31527d0d2c14SPing-Ke Shih 			btcoexist->btc_set_bt_reg(btcoexist, BTC_BT_REG_RF,
31537d0d2c14SPing-Ke Shih 						  0x30, 0x7c44);
31547d0d2c14SPing-Ke Shih 		}
31557d0d2c14SPing-Ke Shih 
3156f1d2b4d3SLarry Finger 		/* Here we need to resend some wifi info to BT
3157f1d2b4d3SLarry Finger 		 * because bt is reset and loss of the info.
3158f1d2b4d3SLarry Finger 		 */
3159f1d2b4d3SLarry Finger 		if (coex_sta->bt_info_ext & BIT1) {
3160c8159c3fSLarry Finger 			rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3161f1d2b4d3SLarry Finger 				"[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
3162f1d2b4d3SLarry Finger 			btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
3163f1d2b4d3SLarry Finger 					   &wifi_connected);
3164f1d2b4d3SLarry Finger 			if (wifi_connected)
3165753c953bSYan-Hsuan Chuang 				ex_btc8723b1ant_media_status_notify(btcoexist,
3166f1d2b4d3SLarry Finger 						BTC_MEDIA_CONNECT);
3167f1d2b4d3SLarry Finger 			else
3168753c953bSYan-Hsuan Chuang 				ex_btc8723b1ant_media_status_notify(btcoexist,
3169f1d2b4d3SLarry Finger 						BTC_MEDIA_DISCONNECT);
3170f1d2b4d3SLarry Finger 		}
3171f1d2b4d3SLarry Finger 
3172f1d2b4d3SLarry Finger 		if (coex_sta->bt_info_ext & BIT3) {
3173f1d2b4d3SLarry Finger 			if (!btcoexist->manual_control &&
3174f1d2b4d3SLarry Finger 			    !btcoexist->stop_coex_dm) {
3175c8159c3fSLarry Finger 				rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3176f1d2b4d3SLarry Finger 					"[BTCoex], BT ext info bit3 check, set BT NOT ignore Wlan active!!\n");
3177f1d2b4d3SLarry Finger 				halbtc8723b1ant_ignore_wlan_act(btcoexist,
3178f1d2b4d3SLarry Finger 								FORCE_EXEC,
3179f1d2b4d3SLarry Finger 								false);
3180f1d2b4d3SLarry Finger 			}
3181f1d2b4d3SLarry Finger 		} else {
3182f1d2b4d3SLarry Finger 			/* BT already NOT ignore Wlan active, do nothing here.*/
3183f1d2b4d3SLarry Finger 		}
3184f66509e3SLarry Finger 		if (!btcoexist->auto_report_1ant) {
3185f1d2b4d3SLarry Finger 			if (coex_sta->bt_info_ext & BIT4) {
3186f1d2b4d3SLarry Finger 				/* BT auto report already enabled, do nothing */
3187f1d2b4d3SLarry Finger 			} else {
3188f66509e3SLarry Finger 				halbtc8723b1ant_bt_auto_report(btcoexist,
3189f66509e3SLarry Finger 							       FORCE_EXEC,
3190f1d2b4d3SLarry Finger 							       true);
3191f1d2b4d3SLarry Finger 			}
3192f66509e3SLarry Finger 		}
3193f1d2b4d3SLarry Finger 	}
3194f1d2b4d3SLarry Finger 
3195f1d2b4d3SLarry Finger 	/* check BIT2 first ==> check if bt is under inquiry or page scan */
3196f1d2b4d3SLarry Finger 	if (bt_info & BT_INFO_8723B_1ANT_B_INQ_PAGE)
3197f1d2b4d3SLarry Finger 		coex_sta->c2h_bt_inquiry_page = true;
3198f1d2b4d3SLarry Finger 	else
3199f1d2b4d3SLarry Finger 		coex_sta->c2h_bt_inquiry_page = false;
3200f1d2b4d3SLarry Finger 
32017d0d2c14SPing-Ke Shih 	coex_sta->num_of_profile = 0;
32027d0d2c14SPing-Ke Shih 
3203f1d2b4d3SLarry Finger 	/* set link exist status */
3204f1d2b4d3SLarry Finger 	if (!(bt_info & BT_INFO_8723B_1ANT_B_CONNECTION)) {
3205f1d2b4d3SLarry Finger 		coex_sta->bt_link_exist = false;
3206f1d2b4d3SLarry Finger 		coex_sta->pan_exist = false;
3207f1d2b4d3SLarry Finger 		coex_sta->a2dp_exist = false;
3208f1d2b4d3SLarry Finger 		coex_sta->hid_exist = false;
3209f1d2b4d3SLarry Finger 		coex_sta->sco_exist = false;
321075717802SPing-Ke Shih 
321175717802SPing-Ke Shih 		coex_sta->bt_hi_pri_link_exist = false;
3212c6821613SYan-Hsuan Chuang 	} else {
3213c6821613SYan-Hsuan Chuang 		/* connection exists */
3214f1d2b4d3SLarry Finger 		coex_sta->bt_link_exist = true;
32157d0d2c14SPing-Ke Shih 		if (bt_info & BT_INFO_8723B_1ANT_B_FTP) {
3216f1d2b4d3SLarry Finger 			coex_sta->pan_exist = true;
32177d0d2c14SPing-Ke Shih 			coex_sta->num_of_profile++;
32187d0d2c14SPing-Ke Shih 		} else {
3219f1d2b4d3SLarry Finger 			coex_sta->pan_exist = false;
32207d0d2c14SPing-Ke Shih 		}
32217d0d2c14SPing-Ke Shih 		if (bt_info & BT_INFO_8723B_1ANT_B_A2DP) {
3222f1d2b4d3SLarry Finger 			coex_sta->a2dp_exist = true;
32237d0d2c14SPing-Ke Shih 			coex_sta->num_of_profile++;
32247d0d2c14SPing-Ke Shih 		} else {
3225f1d2b4d3SLarry Finger 			coex_sta->a2dp_exist = false;
32267d0d2c14SPing-Ke Shih 		}
32277d0d2c14SPing-Ke Shih 		if (bt_info & BT_INFO_8723B_1ANT_B_HID) {
3228f1d2b4d3SLarry Finger 			coex_sta->hid_exist = true;
32297d0d2c14SPing-Ke Shih 			coex_sta->num_of_profile++;
32307d0d2c14SPing-Ke Shih 		} else {
3231f1d2b4d3SLarry Finger 			coex_sta->hid_exist = false;
32327d0d2c14SPing-Ke Shih 		}
32337d0d2c14SPing-Ke Shih 		if (bt_info & BT_INFO_8723B_1ANT_B_SCO_ESCO) {
3234f1d2b4d3SLarry Finger 			coex_sta->sco_exist = true;
32357d0d2c14SPing-Ke Shih 			coex_sta->num_of_profile++;
32367d0d2c14SPing-Ke Shih 		} else {
3237f1d2b4d3SLarry Finger 			coex_sta->sco_exist = false;
32387d0d2c14SPing-Ke Shih 		}
32397d0d2c14SPing-Ke Shih 
32407d0d2c14SPing-Ke Shih 		if ((!coex_sta->hid_exist) &&
32417d0d2c14SPing-Ke Shih 		    (!coex_sta->c2h_bt_inquiry_page) &&
32427d0d2c14SPing-Ke Shih 		    (!coex_sta->sco_exist)) {
32437d0d2c14SPing-Ke Shih 			if (coex_sta->high_priority_tx +
32447d0d2c14SPing-Ke Shih 				    coex_sta->high_priority_rx >=
32457d0d2c14SPing-Ke Shih 			    160) {
32467d0d2c14SPing-Ke Shih 				coex_sta->hid_exist = true;
32477d0d2c14SPing-Ke Shih 				coex_sta->wrong_profile_notification++;
32487d0d2c14SPing-Ke Shih 				coex_sta->num_of_profile++;
32497d0d2c14SPing-Ke Shih 				bt_info = bt_info | 0x28;
32507d0d2c14SPing-Ke Shih 			}
32517d0d2c14SPing-Ke Shih 		}
325275717802SPing-Ke Shih 
325375717802SPing-Ke Shih 		/* Add Hi-Pri Tx/Rx counter to avoid false detection */
325475717802SPing-Ke Shih 		if (((coex_sta->hid_exist) || (coex_sta->sco_exist)) &&
325575717802SPing-Ke Shih 		    (coex_sta->high_priority_tx + coex_sta->high_priority_rx >=
325675717802SPing-Ke Shih 		     160) &&
325775717802SPing-Ke Shih 		    (!coex_sta->c2h_bt_inquiry_page))
325875717802SPing-Ke Shih 			coex_sta->bt_hi_pri_link_exist = true;
325975717802SPing-Ke Shih 
32607d0d2c14SPing-Ke Shih 		if ((bt_info & BT_INFO_8723B_1ANT_B_ACL_BUSY) &&
32617d0d2c14SPing-Ke Shih 		    (coex_sta->num_of_profile == 0)) {
32627d0d2c14SPing-Ke Shih 			if (coex_sta->low_priority_tx +
32637d0d2c14SPing-Ke Shih 				    coex_sta->low_priority_rx >=
32647d0d2c14SPing-Ke Shih 			    160) {
32657d0d2c14SPing-Ke Shih 				coex_sta->pan_exist = true;
32667d0d2c14SPing-Ke Shih 				coex_sta->num_of_profile++;
32677d0d2c14SPing-Ke Shih 				coex_sta->wrong_profile_notification++;
32687d0d2c14SPing-Ke Shih 				bt_info = bt_info | 0x88;
32697d0d2c14SPing-Ke Shih 			}
32707d0d2c14SPing-Ke Shih 		}
3271f1d2b4d3SLarry Finger 	}
3272f1d2b4d3SLarry Finger 
3273f1d2b4d3SLarry Finger 	halbtc8723b1ant_update_bt_link_info(btcoexist);
3274f1d2b4d3SLarry Finger 
32757d0d2c14SPing-Ke Shih 	/* mask profile bit for connect-ilde identification
32767d0d2c14SPing-Ke Shih 	 * ( for CSR case: A2DP idle --> 0x41)
32777d0d2c14SPing-Ke Shih 	 */
32787d0d2c14SPing-Ke Shih 	bt_info = bt_info & 0x1f;
32797d0d2c14SPing-Ke Shih 
3280f1d2b4d3SLarry Finger 	if (!(bt_info & BT_INFO_8723B_1ANT_B_CONNECTION)) {
3281f1d2b4d3SLarry Finger 		coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
3282c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3283f1d2b4d3SLarry Finger 			"[BTCoex], BtInfoNotify(), BT Non-Connected idle!\n");
3284f1d2b4d3SLarry Finger 	/* connection exists but no busy */
3285f1d2b4d3SLarry Finger 	} else if (bt_info == BT_INFO_8723B_1ANT_B_CONNECTION) {
3286f1d2b4d3SLarry Finger 		coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE;
3287c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3288f1d2b4d3SLarry Finger 			"[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
3289f1d2b4d3SLarry Finger 	} else if ((bt_info & BT_INFO_8723B_1ANT_B_SCO_ESCO) ||
3290f1d2b4d3SLarry Finger 		(bt_info & BT_INFO_8723B_1ANT_B_SCO_BUSY)) {
3291f1d2b4d3SLarry Finger 		coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_SCO_BUSY;
3292c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3293f1d2b4d3SLarry Finger 			"[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
3294f1d2b4d3SLarry Finger 	} else if (bt_info & BT_INFO_8723B_1ANT_B_ACL_BUSY) {
3295f1d2b4d3SLarry Finger 		if (BT_8723B_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)
3296f1d2b4d3SLarry Finger 			coex_dm->auto_tdma_adjust = false;
3297f1d2b4d3SLarry Finger 
3298f1d2b4d3SLarry Finger 		coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_ACL_BUSY;
3299c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3300f1d2b4d3SLarry Finger 			"[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
3301f1d2b4d3SLarry Finger 	} else {
33027d0d2c14SPing-Ke Shih 		coex_dm->bt_status = BT_8723B_1ANT_BT_STATUS_MAX;
3303c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3304f1d2b4d3SLarry Finger 			"[BTCoex], BtInfoNotify(), BT Non-Defined state!!\n");
3305f1d2b4d3SLarry Finger 	}
3306f1d2b4d3SLarry Finger 
3307f1d2b4d3SLarry Finger 	if ((BT_8723B_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
3308f1d2b4d3SLarry Finger 	    (BT_8723B_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
3309f1d2b4d3SLarry Finger 	    (BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
3310f1d2b4d3SLarry Finger 		bt_busy = true;
3311f1d2b4d3SLarry Finger 	else
3312f1d2b4d3SLarry Finger 		bt_busy = false;
3313f1d2b4d3SLarry Finger 	btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
3314f1d2b4d3SLarry Finger 
3315f1d2b4d3SLarry Finger 	halbtc8723b1ant_run_coexist_mechanism(btcoexist);
3316f1d2b4d3SLarry Finger }
3317f1d2b4d3SLarry Finger 
ex_btc8723b1ant_rf_status_notify(struct btc_coexist * btcoexist,u8 type)3318753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_rf_status_notify(struct btc_coexist *btcoexist, u8 type)
33193ceac0a7SPing-Ke Shih {
33203ceac0a7SPing-Ke Shih 	struct rtl_priv *rtlpriv = btcoexist->adapter;
33213ceac0a7SPing-Ke Shih 	u32 u32tmp;
33223ceac0a7SPing-Ke Shih 	u8 u8tmpa, u8tmpb, u8tmpc;
33233ceac0a7SPing-Ke Shih 
3324c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
33253ceac0a7SPing-Ke Shih 		"[BTCoex], RF Status notify\n");
33263ceac0a7SPing-Ke Shih 
33273ceac0a7SPing-Ke Shih 	if (type == BTC_RF_ON) {
3328c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
33293ceac0a7SPing-Ke Shih 			"[BTCoex], RF is turned ON!!\n");
33303ceac0a7SPing-Ke Shih 		btcoexist->stop_coex_dm = false;
33313ceac0a7SPing-Ke Shih 	} else if (type == BTC_RF_OFF) {
3332c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
33333ceac0a7SPing-Ke Shih 			"[BTCoex], RF is turned OFF!!\n");
33343ceac0a7SPing-Ke Shih 
33353ceac0a7SPing-Ke Shih 		halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
33363ceac0a7SPing-Ke Shih 						 0x0, 0x0);
33373ceac0a7SPing-Ke Shih 		halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
33383ceac0a7SPing-Ke Shih 		halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
33393ceac0a7SPing-Ke Shih 					     FORCE_EXEC, false, true);
33403ceac0a7SPing-Ke Shih 
33413ceac0a7SPing-Ke Shih 		halbtc8723b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
33423ceac0a7SPing-Ke Shih 		btcoexist->stop_coex_dm = true;
33433ceac0a7SPing-Ke Shih 
33443ceac0a7SPing-Ke Shih 		u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
33453ceac0a7SPing-Ke Shih 		u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
33463ceac0a7SPing-Ke Shih 		u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x67);
33473ceac0a7SPing-Ke Shih 		u8tmpc = btcoexist->btc_read_1byte(btcoexist, 0x76e);
33483ceac0a7SPing-Ke Shih 
3349c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
33503ceac0a7SPing-Ke Shih 			"############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x67=0x%x, 0x76e=0x%x\n",
33513ceac0a7SPing-Ke Shih 			u32tmp, u8tmpa, u8tmpb, u8tmpc);
33523ceac0a7SPing-Ke Shih 	}
33533ceac0a7SPing-Ke Shih }
33543ceac0a7SPing-Ke Shih 
ex_btc8723b1ant_halt_notify(struct btc_coexist * btcoexist)3355753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_halt_notify(struct btc_coexist *btcoexist)
3356f1d2b4d3SLarry Finger {
3357dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3358dd192494SLarry Finger 
3359c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Halt notify\n");
3360f1d2b4d3SLarry Finger 
3361f1d2b4d3SLarry Finger 	btcoexist->stop_coex_dm = true;
3362f1d2b4d3SLarry Finger 
336396e3baadSPing-Ke Shih 	halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, FORCE_EXEC,
336496e3baadSPing-Ke Shih 				     false, true);
3365f1d2b4d3SLarry Finger 
3366f1d2b4d3SLarry Finger 	halbtc8723b1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
3367f1d2b4d3SLarry Finger 
3368f1d2b4d3SLarry Finger 	halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3369f1d2b4d3SLarry Finger 					 0x0, 0x0);
3370f1d2b4d3SLarry Finger 	halbtc8723b1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
3371f1d2b4d3SLarry Finger 
3372753c953bSYan-Hsuan Chuang 	ex_btc8723b1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
33738ffb5b69SPing-Ke Shih 
33748ffb5b69SPing-Ke Shih 	btcoexist->stop_coex_dm = true;
3375f1d2b4d3SLarry Finger }
3376f1d2b4d3SLarry Finger 
ex_btc8723b1ant_pnp_notify(struct btc_coexist * btcoexist,u8 pnp_state)3377753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
3378f1d2b4d3SLarry Finger {
3379dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3380dd192494SLarry Finger 
3381c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Pnp notify\n");
3382f1d2b4d3SLarry Finger 
3383f1d2b4d3SLarry Finger 	if (BTC_WIFI_PNP_SLEEP == pnp_state) {
3384c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3385f1d2b4d3SLarry Finger 			"[BTCoex], Pnp notify to SLEEP\n");
338696e3baadSPing-Ke Shih 		halbtc8723b1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
338796e3baadSPing-Ke Shih 					     FORCE_EXEC, false, true);
3388f1d2b4d3SLarry Finger 		halbtc8723b1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3389f1d2b4d3SLarry Finger 						 0x0, 0x0);
3390f1d2b4d3SLarry Finger 		halbtc8723b1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
3391f1d2b4d3SLarry Finger 		halbtc8723b1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
33928ffb5b69SPing-Ke Shih 
33938ffb5b69SPing-Ke Shih 		/* Driver do not leave IPS/LPS when driver is going to sleep, so
33948ffb5b69SPing-Ke Shih 		 * BTCoexistence think wifi is still under IPS/LPS
33958ffb5b69SPing-Ke Shih 		 *
33968ffb5b69SPing-Ke Shih 		 * BT should clear UnderIPS/UnderLPS state to avoid mismatch
33978ffb5b69SPing-Ke Shih 		 * state after wakeup.
33988ffb5b69SPing-Ke Shih 		 */
33998ffb5b69SPing-Ke Shih 		coex_sta->under_ips = false;
34008ffb5b69SPing-Ke Shih 		coex_sta->under_lps = false;
34018ffb5b69SPing-Ke Shih 		btcoexist->stop_coex_dm = true;
3402f1d2b4d3SLarry Finger 	} else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
3403c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3404f1d2b4d3SLarry Finger 			"[BTCoex], Pnp notify to WAKE UP\n");
3405f1d2b4d3SLarry Finger 		btcoexist->stop_coex_dm = false;
34068ffb5b69SPing-Ke Shih 		halbtc8723b1ant_init_hw_config(btcoexist, false, false);
3407f1d2b4d3SLarry Finger 		halbtc8723b1ant_init_coex_dm(btcoexist);
3408f1d2b4d3SLarry Finger 		halbtc8723b1ant_query_bt_info(btcoexist);
3409f1d2b4d3SLarry Finger 	}
3410f1d2b4d3SLarry Finger }
3411f1d2b4d3SLarry Finger 
ex_btc8723b1ant_coex_dm_reset(struct btc_coexist * btcoexist)3412753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_coex_dm_reset(struct btc_coexist *btcoexist)
3413f1d2b4d3SLarry Finger {
3414dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
3415dd192494SLarry Finger 
3416c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3417f1d2b4d3SLarry Finger 		"[BTCoex], *****************Coex DM Reset****************\n");
3418f1d2b4d3SLarry Finger 
34198ffb5b69SPing-Ke Shih 	halbtc8723b1ant_init_hw_config(btcoexist, false, false);
3420f1d2b4d3SLarry Finger 	halbtc8723b1ant_init_coex_dm(btcoexist);
3421f1d2b4d3SLarry Finger }
3422f1d2b4d3SLarry Finger 
ex_btc8723b1ant_periodical(struct btc_coexist * btcoexist)3423753c953bSYan-Hsuan Chuang void ex_btc8723b1ant_periodical(struct btc_coexist *btcoexist)
3424f1d2b4d3SLarry Finger {
3425dd192494SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
342637a5be0cSPing-Ke Shih 	struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3427f1d2b4d3SLarry Finger 
3428c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3429f1d2b4d3SLarry Finger 		"[BTCoex], ==========================Periodical===========================\n");
3430f1d2b4d3SLarry Finger 
3431f66509e3SLarry Finger 	if (!btcoexist->auto_report_1ant) {
3432f1d2b4d3SLarry Finger 		halbtc8723b1ant_query_bt_info(btcoexist);
3433f1d2b4d3SLarry Finger 		halbtc8723b1ant_monitor_bt_enable_disable(btcoexist);
3434f66509e3SLarry Finger 	} else {
343537a5be0cSPing-Ke Shih 		halbtc8723b1ant_monitor_bt_ctr(btcoexist);
343637a5be0cSPing-Ke Shih 		halbtc8723b1ant_monitor_wifi_ctr(btcoexist);
343737a5be0cSPing-Ke Shih 
343837a5be0cSPing-Ke Shih 		if ((coex_sta->high_priority_tx + coex_sta->high_priority_rx < 50) &&
343937a5be0cSPing-Ke Shih 		    bt_link_info->hid_exist)
344037a5be0cSPing-Ke Shih 			bt_link_info->hid_exist = false;
344137a5be0cSPing-Ke Shih 
3442f1d2b4d3SLarry Finger 		if (btc8723b1ant_is_wifi_status_changed(btcoexist) ||
3443f1d2b4d3SLarry Finger 		    coex_dm->auto_tdma_adjust) {
3444f1d2b4d3SLarry Finger 			halbtc8723b1ant_run_coexist_mechanism(btcoexist);
3445f1d2b4d3SLarry Finger 		}
3446f1d2b4d3SLarry Finger 		coex_sta->special_pkt_period_cnt++;
3447f66509e3SLarry Finger 	}
3448f1d2b4d3SLarry Finger }
3449