18c086312SLarry Finger // SPDX-License-Identifier: GPL-2.0
28c086312SLarry Finger /* Copyright(c) 2007-2013  Realtek Corporation.*/
3f1d2b4d3SLarry Finger 
4f1d2b4d3SLarry Finger #include "halbt_precomp.h"
5f1d2b4d3SLarry Finger 
6f1d2b4d3SLarry Finger /***************************************************
7f1d2b4d3SLarry Finger  *		Debug related function
8f1d2b4d3SLarry Finger  ***************************************************/
9c42ea613SYan-Hsuan Chuang 
10f2f6026aSPing-Ke Shih static const char *const gl_btc_wifi_bw_string[] = {
11c42ea613SYan-Hsuan Chuang 	"11bg",
12c42ea613SYan-Hsuan Chuang 	"HT20",
13c42ea613SYan-Hsuan Chuang 	"HT40",
14c42ea613SYan-Hsuan Chuang 	"HT80",
15c42ea613SYan-Hsuan Chuang 	"HT160"
16c42ea613SYan-Hsuan Chuang };
17c42ea613SYan-Hsuan Chuang 
18f2f6026aSPing-Ke Shih static const char *const gl_btc_wifi_freq_string[] = {
19c42ea613SYan-Hsuan Chuang 	"2.4G",
20c42ea613SYan-Hsuan Chuang 	"5G"
21c42ea613SYan-Hsuan Chuang };
22c42ea613SYan-Hsuan Chuang 
halbtc_is_bt_coexist_available(struct btc_coexist * btcoexist)23f1d2b4d3SLarry Finger static bool halbtc_is_bt_coexist_available(struct btc_coexist *btcoexist)
24f1d2b4d3SLarry Finger {
25f1d2b4d3SLarry Finger 	if (!btcoexist->binded || NULL == btcoexist->adapter)
26f1d2b4d3SLarry Finger 		return false;
27f1d2b4d3SLarry Finger 
28f1d2b4d3SLarry Finger 	return true;
29f1d2b4d3SLarry Finger }
30f1d2b4d3SLarry Finger 
halbtc_is_wifi_busy(struct rtl_priv * rtlpriv)31f1d2b4d3SLarry Finger static bool halbtc_is_wifi_busy(struct rtl_priv *rtlpriv)
32f1d2b4d3SLarry Finger {
33f1d2b4d3SLarry Finger 	if (rtlpriv->link_info.busytraffic)
34f1d2b4d3SLarry Finger 		return true;
35f1d2b4d3SLarry Finger 	else
36f1d2b4d3SLarry Finger 		return false;
37f1d2b4d3SLarry Finger }
38f1d2b4d3SLarry Finger 
halbtc_dbg_init(void)39f1d2b4d3SLarry Finger static void halbtc_dbg_init(void)
40f1d2b4d3SLarry Finger {
41c42ea613SYan-Hsuan Chuang }
42f1d2b4d3SLarry Finger 
43c42ea613SYan-Hsuan Chuang /***************************************************
44c42ea613SYan-Hsuan Chuang  *		helper function
45c42ea613SYan-Hsuan Chuang  ***************************************************/
is_any_client_connect_to_ap(struct btc_coexist * btcoexist)46c42ea613SYan-Hsuan Chuang static bool is_any_client_connect_to_ap(struct btc_coexist *btcoexist)
47c42ea613SYan-Hsuan Chuang {
48c42ea613SYan-Hsuan Chuang 	struct rtl_priv *rtlpriv = btcoexist->adapter;
49c42ea613SYan-Hsuan Chuang 	struct rtl_mac *mac = rtl_mac(rtlpriv);
50*317f688bSSebastian Andrzej Siewior 	bool ret = false;
51f1d2b4d3SLarry Finger 
52c42ea613SYan-Hsuan Chuang 	if (mac->opmode == NL80211_IFTYPE_ADHOC ||
53c42ea613SYan-Hsuan Chuang 	    mac->opmode == NL80211_IFTYPE_MESH_POINT ||
54c42ea613SYan-Hsuan Chuang 	    mac->opmode == NL80211_IFTYPE_AP) {
55c42ea613SYan-Hsuan Chuang 		spin_lock_bh(&rtlpriv->locks.entry_list_lock);
56*317f688bSSebastian Andrzej Siewior 		if (!list_empty(&rtlpriv->entry_list))
57*317f688bSSebastian Andrzej Siewior 			ret = true;
58c42ea613SYan-Hsuan Chuang 		spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
59c42ea613SYan-Hsuan Chuang 	}
60*317f688bSSebastian Andrzej Siewior 	return ret;
61f1d2b4d3SLarry Finger }
62f1d2b4d3SLarry Finger 
halbtc_legacy(struct rtl_priv * adapter)63f1d2b4d3SLarry Finger static bool halbtc_legacy(struct rtl_priv *adapter)
64f1d2b4d3SLarry Finger {
65f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = adapter;
66f1d2b4d3SLarry Finger 	struct rtl_mac *mac = rtl_mac(rtlpriv);
67f1d2b4d3SLarry Finger 
68f1d2b4d3SLarry Finger 	bool is_legacy = false;
69f1d2b4d3SLarry Finger 
70f1d2b4d3SLarry Finger 	if ((mac->mode == WIRELESS_MODE_B) || (mac->mode == WIRELESS_MODE_G))
71f1d2b4d3SLarry Finger 		is_legacy = true;
72f1d2b4d3SLarry Finger 
73f1d2b4d3SLarry Finger 	return is_legacy;
74f1d2b4d3SLarry Finger }
75f1d2b4d3SLarry Finger 
halbtc_is_wifi_uplink(struct rtl_priv * adapter)76f1d2b4d3SLarry Finger bool halbtc_is_wifi_uplink(struct rtl_priv *adapter)
77f1d2b4d3SLarry Finger {
78f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = adapter;
79f1d2b4d3SLarry Finger 
80f1d2b4d3SLarry Finger 	if (rtlpriv->link_info.tx_busy_traffic)
81f1d2b4d3SLarry Finger 		return true;
82f1d2b4d3SLarry Finger 	else
83f1d2b4d3SLarry Finger 		return false;
84f1d2b4d3SLarry Finger }
85f1d2b4d3SLarry Finger 
halbtc_get_wifi_bw(struct btc_coexist * btcoexist)86f1d2b4d3SLarry Finger static u32 halbtc_get_wifi_bw(struct btc_coexist *btcoexist)
87f1d2b4d3SLarry Finger {
8866d0f9deSPing-Ke Shih 	struct rtl_priv *rtlpriv = btcoexist->adapter;
8966d0f9deSPing-Ke Shih 	struct rtl_phy *rtlphy = &rtlpriv->phy;
90f1d2b4d3SLarry Finger 	u32 wifi_bw = BTC_WIFI_BW_HT20;
91f1d2b4d3SLarry Finger 
9266d0f9deSPing-Ke Shih 	if (halbtc_legacy(rtlpriv)) {
93f1d2b4d3SLarry Finger 		wifi_bw = BTC_WIFI_BW_LEGACY;
9466d0f9deSPing-Ke Shih 	} else {
9566d0f9deSPing-Ke Shih 		switch (rtlphy->current_chan_bw) {
9666d0f9deSPing-Ke Shih 		case HT_CHANNEL_WIDTH_20:
97f1d2b4d3SLarry Finger 			wifi_bw = BTC_WIFI_BW_HT20;
9866d0f9deSPing-Ke Shih 			break;
9966d0f9deSPing-Ke Shih 		case HT_CHANNEL_WIDTH_20_40:
10066d0f9deSPing-Ke Shih 			wifi_bw = BTC_WIFI_BW_HT40;
10166d0f9deSPing-Ke Shih 			break;
10266d0f9deSPing-Ke Shih 		case HT_CHANNEL_WIDTH_80:
10366d0f9deSPing-Ke Shih 			wifi_bw = BTC_WIFI_BW_HT80;
10466d0f9deSPing-Ke Shih 			break;
105f1d2b4d3SLarry Finger 		}
10666d0f9deSPing-Ke Shih 	}
10766d0f9deSPing-Ke Shih 
108f1d2b4d3SLarry Finger 	return wifi_bw;
109f1d2b4d3SLarry Finger }
110f1d2b4d3SLarry Finger 
halbtc_get_wifi_central_chnl(struct btc_coexist * btcoexist)111f1d2b4d3SLarry Finger static u8 halbtc_get_wifi_central_chnl(struct btc_coexist *btcoexist)
112f1d2b4d3SLarry Finger {
113f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
114f1d2b4d3SLarry Finger 	struct rtl_phy	*rtlphy = &(rtlpriv->phy);
115f1d2b4d3SLarry Finger 	u8 chnl = 1;
116f1d2b4d3SLarry Finger 
117f1d2b4d3SLarry Finger 	if (rtlphy->current_channel != 0)
118f1d2b4d3SLarry Finger 		chnl = rtlphy->current_channel;
119c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
120c8159c3fSLarry Finger 		"%s:%d\n", __func__, chnl);
121f1d2b4d3SLarry Finger 	return chnl;
122f1d2b4d3SLarry Finger }
123f1d2b4d3SLarry Finger 
rtl_get_hwpg_single_ant_path(struct rtl_priv * rtlpriv)124f2f6026aSPing-Ke Shih static u8 rtl_get_hwpg_single_ant_path(struct rtl_priv *rtlpriv)
125db8cb009SPing-Ke Shih {
126db8cb009SPing-Ke Shih 	return rtlpriv->btcoexist.btc_info.single_ant_path;
127db8cb009SPing-Ke Shih }
128db8cb009SPing-Ke Shih 
rtl_get_hwpg_bt_type(struct rtl_priv * rtlpriv)129f2f6026aSPing-Ke Shih static u8 rtl_get_hwpg_bt_type(struct rtl_priv *rtlpriv)
130e0215c14SPing-Ke Shih {
131e0215c14SPing-Ke Shih 	return rtlpriv->btcoexist.btc_info.bt_type;
132e0215c14SPing-Ke Shih }
133e0215c14SPing-Ke Shih 
rtl_get_hwpg_ant_num(struct rtl_priv * rtlpriv)134f2f6026aSPing-Ke Shih static u8 rtl_get_hwpg_ant_num(struct rtl_priv *rtlpriv)
1350de9b5dbSPing-Ke Shih {
1360de9b5dbSPing-Ke Shih 	u8 num;
1370de9b5dbSPing-Ke Shih 
1380de9b5dbSPing-Ke Shih 	if (rtlpriv->btcoexist.btc_info.ant_num == ANT_X2)
1390de9b5dbSPing-Ke Shih 		num = 2;
1400de9b5dbSPing-Ke Shih 	else
1410de9b5dbSPing-Ke Shih 		num = 1;
1420de9b5dbSPing-Ke Shih 
1430de9b5dbSPing-Ke Shih 	return num;
1440de9b5dbSPing-Ke Shih }
1450de9b5dbSPing-Ke Shih 
rtl_get_hwpg_package_type(struct rtl_priv * rtlpriv)146f2f6026aSPing-Ke Shih static u8 rtl_get_hwpg_package_type(struct rtl_priv *rtlpriv)
1477fe1fe75SPing-Ke Shih {
1487fe1fe75SPing-Ke Shih 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1497fe1fe75SPing-Ke Shih 
1507fe1fe75SPing-Ke Shih 	return rtlhal->package_type;
1517fe1fe75SPing-Ke Shih }
1527fe1fe75SPing-Ke Shih 
153b2283dadSPing-Ke Shih static
rtl_get_hwpg_rfe_type(struct rtl_priv * rtlpriv)154188b6b09SPing-Ke Shih u8 rtl_get_hwpg_rfe_type(struct rtl_priv *rtlpriv)
155188b6b09SPing-Ke Shih {
156188b6b09SPing-Ke Shih 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
157188b6b09SPing-Ke Shih 
158188b6b09SPing-Ke Shih 	return rtlhal->rfe_type;
159188b6b09SPing-Ke Shih }
160188b6b09SPing-Ke Shih 
161188b6b09SPing-Ke Shih static
halbtc_is_hw_mailbox_exist(struct btc_coexist * btcoexist)162b2283dadSPing-Ke Shih bool halbtc_is_hw_mailbox_exist(struct btc_coexist *btcoexist)
163b2283dadSPing-Ke Shih {
164b2283dadSPing-Ke Shih 	if (IS_HARDWARE_TYPE_8812(btcoexist->adapter))
165b2283dadSPing-Ke Shih 		return false;
166b2283dadSPing-Ke Shih 	else
167b2283dadSPing-Ke Shih 		return true;
168b2283dadSPing-Ke Shih }
169b2283dadSPing-Ke Shih 
170b2283dadSPing-Ke Shih static
halbtc_send_bt_mp_operation(struct btc_coexist * btcoexist,u8 op_code,u8 * cmd,u32 len,unsigned long wait_ms)171b2283dadSPing-Ke Shih bool halbtc_send_bt_mp_operation(struct btc_coexist *btcoexist, u8 op_code,
172b2283dadSPing-Ke Shih 				 u8 *cmd, u32 len, unsigned long wait_ms)
173b2283dadSPing-Ke Shih {
174b2283dadSPing-Ke Shih 	struct rtl_priv *rtlpriv;
175b2283dadSPing-Ke Shih 	const u8 oper_ver = 0;
176b2283dadSPing-Ke Shih 	u8 req_num;
177b2283dadSPing-Ke Shih 
178b2283dadSPing-Ke Shih 	if (!halbtc_is_hw_mailbox_exist(btcoexist))
179b2283dadSPing-Ke Shih 		return false;
180b2283dadSPing-Ke Shih 
181b2283dadSPing-Ke Shih 	if (wait_ms)	/* before h2c to avoid race condition */
182b2283dadSPing-Ke Shih 		reinit_completion(&btcoexist->bt_mp_comp);
183b2283dadSPing-Ke Shih 
184b2283dadSPing-Ke Shih 	rtlpriv = btcoexist->adapter;
185b2283dadSPing-Ke Shih 
186b2283dadSPing-Ke Shih 	/* fill req_num by op_code, and rtl_btc_btmpinfo_notify() use it
187b2283dadSPing-Ke Shih 	 * to know message type
188b2283dadSPing-Ke Shih 	 */
189b2283dadSPing-Ke Shih 	switch (op_code) {
190b2283dadSPing-Ke Shih 	case BT_OP_GET_BT_VERSION:
191b2283dadSPing-Ke Shih 		req_num = BT_SEQ_GET_BT_VERSION;
192b2283dadSPing-Ke Shih 		break;
193b2283dadSPing-Ke Shih 	case BT_OP_GET_AFH_MAP_L:
194b2283dadSPing-Ke Shih 		req_num = BT_SEQ_GET_AFH_MAP_L;
195b2283dadSPing-Ke Shih 		break;
196b2283dadSPing-Ke Shih 	case BT_OP_GET_AFH_MAP_M:
197b2283dadSPing-Ke Shih 		req_num = BT_SEQ_GET_AFH_MAP_M;
198b2283dadSPing-Ke Shih 		break;
199b2283dadSPing-Ke Shih 	case BT_OP_GET_AFH_MAP_H:
200b2283dadSPing-Ke Shih 		req_num = BT_SEQ_GET_AFH_MAP_H;
201b2283dadSPing-Ke Shih 		break;
202b2283dadSPing-Ke Shih 	case BT_OP_GET_BT_COEX_SUPPORTED_FEATURE:
203b2283dadSPing-Ke Shih 		req_num = BT_SEQ_GET_BT_COEX_SUPPORTED_FEATURE;
204b2283dadSPing-Ke Shih 		break;
205b2283dadSPing-Ke Shih 	case BT_OP_GET_BT_COEX_SUPPORTED_VERSION:
206b2283dadSPing-Ke Shih 		req_num = BT_SEQ_GET_BT_COEX_SUPPORTED_VERSION;
207b2283dadSPing-Ke Shih 		break;
208b2283dadSPing-Ke Shih 	case BT_OP_GET_BT_ANT_DET_VAL:
209b2283dadSPing-Ke Shih 		req_num = BT_SEQ_GET_BT_ANT_DET_VAL;
210b2283dadSPing-Ke Shih 		break;
211b2283dadSPing-Ke Shih 	case BT_OP_GET_BT_BLE_SCAN_PARA:
212b2283dadSPing-Ke Shih 		req_num = BT_SEQ_GET_BT_BLE_SCAN_PARA;
213b2283dadSPing-Ke Shih 		break;
214b2283dadSPing-Ke Shih 	case BT_OP_GET_BT_BLE_SCAN_TYPE:
215b2283dadSPing-Ke Shih 		req_num = BT_SEQ_GET_BT_BLE_SCAN_TYPE;
216b2283dadSPing-Ke Shih 		break;
217b2283dadSPing-Ke Shih 	case BT_OP_GET_BT_DEVICE_INFO:
218b2283dadSPing-Ke Shih 		req_num = BT_SEQ_GET_BT_DEVICE_INFO;
219b2283dadSPing-Ke Shih 		break;
220b2283dadSPing-Ke Shih 	case BT_OP_GET_BT_FORBIDDEN_SLOT_VAL:
221b2283dadSPing-Ke Shih 		req_num = BT_SEQ_GET_BT_FORB_SLOT_VAL;
222b2283dadSPing-Ke Shih 		break;
223b2283dadSPing-Ke Shih 	case BT_OP_WRITE_REG_ADDR:
224b2283dadSPing-Ke Shih 	case BT_OP_WRITE_REG_VALUE:
225b2283dadSPing-Ke Shih 	case BT_OP_READ_REG:
226b2283dadSPing-Ke Shih 	default:
227b2283dadSPing-Ke Shih 		req_num = BT_SEQ_DONT_CARE;
228b2283dadSPing-Ke Shih 		break;
229b2283dadSPing-Ke Shih 	}
230b2283dadSPing-Ke Shih 
231b2283dadSPing-Ke Shih 	cmd[0] |= (oper_ver & 0x0f);		/* Set OperVer */
232b2283dadSPing-Ke Shih 	cmd[0] |= ((req_num << 4) & 0xf0);	/* Set ReqNum */
233b2283dadSPing-Ke Shih 	cmd[1] = op_code;
234b2283dadSPing-Ke Shih 	rtlpriv->cfg->ops->fill_h2c_cmd(rtlpriv->mac80211.hw, 0x67, len, cmd);
235b2283dadSPing-Ke Shih 
236b2283dadSPing-Ke Shih 	/* wait? */
237b2283dadSPing-Ke Shih 	if (!wait_ms)
238b2283dadSPing-Ke Shih 		return true;
239b2283dadSPing-Ke Shih 
240c8159c3fSLarry Finger 	rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
241b2283dadSPing-Ke Shih 		"btmpinfo wait req_num=%d wait=%ld\n", req_num, wait_ms);
242b2283dadSPing-Ke Shih 
243b2283dadSPing-Ke Shih 	if (wait_for_completion_timeout(&btcoexist->bt_mp_comp,
244b2283dadSPing-Ke Shih 					msecs_to_jiffies(wait_ms)) == 0) {
245c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
246b2283dadSPing-Ke Shih 			"btmpinfo wait (req_num=%d) timeout\n", req_num);
247b2283dadSPing-Ke Shih 
248b2283dadSPing-Ke Shih 		return false;	/* timeout */
249b2283dadSPing-Ke Shih 	}
250b2283dadSPing-Ke Shih 
251b2283dadSPing-Ke Shih 	return true;
252b2283dadSPing-Ke Shih }
253b2283dadSPing-Ke Shih 
halbtc_leave_lps(struct btc_coexist * btcoexist)254f1d2b4d3SLarry Finger static void halbtc_leave_lps(struct btc_coexist *btcoexist)
255f1d2b4d3SLarry Finger {
256f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv;
257f1d2b4d3SLarry Finger 	bool ap_enable = false;
258f1d2b4d3SLarry Finger 
259f1d2b4d3SLarry Finger 	rtlpriv = btcoexist->adapter;
260f1d2b4d3SLarry Finger 
261f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
262f1d2b4d3SLarry Finger 			   &ap_enable);
263f1d2b4d3SLarry Finger 
264f1d2b4d3SLarry Finger 	if (ap_enable) {
265c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
266c42ea613SYan-Hsuan Chuang 			"%s()<--dont leave lps under AP mode\n", __func__);
267f1d2b4d3SLarry Finger 		return;
268f1d2b4d3SLarry Finger 	}
269f1d2b4d3SLarry Finger 
270f1d2b4d3SLarry Finger 	btcoexist->bt_info.bt_ctrl_lps = true;
271f1d2b4d3SLarry Finger 	btcoexist->bt_info.bt_lps_on = false;
272920872e0SSebastian Andrzej Siewior 	/* FIXME: Context is unclear. Is it allowed to block? */
273920872e0SSebastian Andrzej Siewior 	rtl_lps_leave(rtlpriv->mac80211.hw, false);
274f1d2b4d3SLarry Finger }
275f1d2b4d3SLarry Finger 
halbtc_enter_lps(struct btc_coexist * btcoexist)276f1d2b4d3SLarry Finger static void halbtc_enter_lps(struct btc_coexist *btcoexist)
277f1d2b4d3SLarry Finger {
278f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv;
279f1d2b4d3SLarry Finger 	bool ap_enable = false;
280f1d2b4d3SLarry Finger 
281f1d2b4d3SLarry Finger 	rtlpriv = btcoexist->adapter;
282f1d2b4d3SLarry Finger 
283f1d2b4d3SLarry Finger 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
284f1d2b4d3SLarry Finger 			   &ap_enable);
285f1d2b4d3SLarry Finger 
286f1d2b4d3SLarry Finger 	if (ap_enable) {
287c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
288c42ea613SYan-Hsuan Chuang 			"%s()<--dont enter lps under AP mode\n", __func__);
289f1d2b4d3SLarry Finger 		return;
290f1d2b4d3SLarry Finger 	}
291f1d2b4d3SLarry Finger 
292f1d2b4d3SLarry Finger 	btcoexist->bt_info.bt_ctrl_lps = true;
29342213f2fSPing-Ke Shih 	btcoexist->bt_info.bt_lps_on = true;
294920872e0SSebastian Andrzej Siewior 	/* FIXME: Context is unclear. Is it allowed to block? */
295920872e0SSebastian Andrzej Siewior 	rtl_lps_enter(rtlpriv->mac80211.hw, false);
296f1d2b4d3SLarry Finger }
297f1d2b4d3SLarry Finger 
halbtc_normal_lps(struct btc_coexist * btcoexist)298f1d2b4d3SLarry Finger static void halbtc_normal_lps(struct btc_coexist *btcoexist)
299f1d2b4d3SLarry Finger {
30042213f2fSPing-Ke Shih 	struct rtl_priv *rtlpriv;
30142213f2fSPing-Ke Shih 
30242213f2fSPing-Ke Shih 	rtlpriv = btcoexist->adapter;
30342213f2fSPing-Ke Shih 
304f1d2b4d3SLarry Finger 	if (btcoexist->bt_info.bt_ctrl_lps) {
305f1d2b4d3SLarry Finger 		btcoexist->bt_info.bt_lps_on = false;
306920872e0SSebastian Andrzej Siewior 		/* FIXME: Context is unclear. Is it allowed to block? */
307920872e0SSebastian Andrzej Siewior 		rtl_lps_leave(rtlpriv->mac80211.hw, false);
308f1d2b4d3SLarry Finger 		btcoexist->bt_info.bt_ctrl_lps = false;
309f1d2b4d3SLarry Finger 	}
310f1d2b4d3SLarry Finger }
311f1d2b4d3SLarry Finger 
halbtc_pre_normal_lps(struct btc_coexist * btcoexist)312c3468950SPing-Ke Shih static void halbtc_pre_normal_lps(struct btc_coexist *btcoexist)
313c3468950SPing-Ke Shih {
314c3468950SPing-Ke Shih 	struct rtl_priv *rtlpriv = btcoexist->adapter;
315c3468950SPing-Ke Shih 
316c3468950SPing-Ke Shih 	if (btcoexist->bt_info.bt_ctrl_lps) {
317c3468950SPing-Ke Shih 		btcoexist->bt_info.bt_lps_on = false;
318920872e0SSebastian Andrzej Siewior 		/* FIXME: Context is unclear. Is it allowed to block? */
319920872e0SSebastian Andrzej Siewior 		rtl_lps_leave(rtlpriv->mac80211.hw, false);
320c3468950SPing-Ke Shih 	}
321c3468950SPing-Ke Shih }
322c3468950SPing-Ke Shih 
halbtc_post_normal_lps(struct btc_coexist * btcoexist)323c3468950SPing-Ke Shih static void halbtc_post_normal_lps(struct btc_coexist *btcoexist)
324c3468950SPing-Ke Shih {
325c3468950SPing-Ke Shih 	if (btcoexist->bt_info.bt_ctrl_lps)
326c3468950SPing-Ke Shih 		btcoexist->bt_info.bt_ctrl_lps = false;
327c3468950SPing-Ke Shih }
328c3468950SPing-Ke Shih 
halbtc_leave_low_power(struct btc_coexist * btcoexist)3297937f02dSYan-Hsuan Chuang static void halbtc_leave_low_power(struct btc_coexist *btcoexist)
330f1d2b4d3SLarry Finger {
331f1d2b4d3SLarry Finger }
332f1d2b4d3SLarry Finger 
halbtc_normal_low_power(struct btc_coexist * btcoexist)3337937f02dSYan-Hsuan Chuang static void halbtc_normal_low_power(struct btc_coexist *btcoexist)
334f1d2b4d3SLarry Finger {
335f1d2b4d3SLarry Finger }
336f1d2b4d3SLarry Finger 
halbtc_disable_low_power(struct btc_coexist * btcoexist,bool low_pwr_disable)337c42ea613SYan-Hsuan Chuang static void halbtc_disable_low_power(struct btc_coexist *btcoexist,
338c42ea613SYan-Hsuan Chuang 				     bool low_pwr_disable)
339f1d2b4d3SLarry Finger {
340c42ea613SYan-Hsuan Chuang 	/* TODO: original/leave 32k low power */
341c42ea613SYan-Hsuan Chuang 	btcoexist->bt_info.bt_disable_low_pwr = low_pwr_disable;
342f1d2b4d3SLarry Finger }
343f1d2b4d3SLarry Finger 
halbtc_aggregation_check(struct btc_coexist * btcoexist)344c42ea613SYan-Hsuan Chuang static void halbtc_aggregation_check(struct btc_coexist *btcoexist)
345f1d2b4d3SLarry Finger {
346c42ea613SYan-Hsuan Chuang 	bool need_to_act = false;
3472635664eSPing-Ke Shih 	static unsigned long pre_time;
3482635664eSPing-Ke Shih 	unsigned long cur_time = 0;
3492635664eSPing-Ke Shih 	struct rtl_priv *rtlpriv = btcoexist->adapter;
350c42ea613SYan-Hsuan Chuang 
351c42ea613SYan-Hsuan Chuang 	/* To void continuous deleteBA=>addBA=>deleteBA=>addBA
352c42ea613SYan-Hsuan Chuang 	 * This function is not allowed to continuous called
353c42ea613SYan-Hsuan Chuang 	 * It can only be called after 8 seconds
354c42ea613SYan-Hsuan Chuang 	 */
355c42ea613SYan-Hsuan Chuang 
3562635664eSPing-Ke Shih 	cur_time = jiffies;
3572635664eSPing-Ke Shih 	if (jiffies_to_msecs(cur_time - pre_time) <= 8000) {
3582635664eSPing-Ke Shih 		/* over 8 seconds you can execute this function again. */
3592635664eSPing-Ke Shih 		return;
3602635664eSPing-Ke Shih 	}
3612635664eSPing-Ke Shih 	pre_time = cur_time;
3622635664eSPing-Ke Shih 
363c42ea613SYan-Hsuan Chuang 	if (btcoexist->bt_info.reject_agg_pkt) {
3642635664eSPing-Ke Shih 		need_to_act = true;
365c42ea613SYan-Hsuan Chuang 		btcoexist->bt_info.pre_reject_agg_pkt =
366c42ea613SYan-Hsuan Chuang 			btcoexist->bt_info.reject_agg_pkt;
367c42ea613SYan-Hsuan Chuang 	} else {
368c42ea613SYan-Hsuan Chuang 		if (btcoexist->bt_info.pre_reject_agg_pkt) {
369c42ea613SYan-Hsuan Chuang 			need_to_act = true;
370c42ea613SYan-Hsuan Chuang 			btcoexist->bt_info.pre_reject_agg_pkt =
371c42ea613SYan-Hsuan Chuang 				btcoexist->bt_info.reject_agg_pkt;
372c42ea613SYan-Hsuan Chuang 		}
373c42ea613SYan-Hsuan Chuang 
374c42ea613SYan-Hsuan Chuang 		if (btcoexist->bt_info.pre_bt_ctrl_agg_buf_size !=
375c42ea613SYan-Hsuan Chuang 		    btcoexist->bt_info.bt_ctrl_agg_buf_size) {
376c42ea613SYan-Hsuan Chuang 			need_to_act = true;
377c42ea613SYan-Hsuan Chuang 			btcoexist->bt_info.pre_bt_ctrl_agg_buf_size =
378c42ea613SYan-Hsuan Chuang 				btcoexist->bt_info.bt_ctrl_agg_buf_size;
379c42ea613SYan-Hsuan Chuang 		}
380c42ea613SYan-Hsuan Chuang 
381c42ea613SYan-Hsuan Chuang 		if (btcoexist->bt_info.bt_ctrl_agg_buf_size) {
382c42ea613SYan-Hsuan Chuang 			if (btcoexist->bt_info.pre_agg_buf_size !=
383c42ea613SYan-Hsuan Chuang 			    btcoexist->bt_info.agg_buf_size) {
384c42ea613SYan-Hsuan Chuang 				need_to_act = true;
385c42ea613SYan-Hsuan Chuang 			}
386c42ea613SYan-Hsuan Chuang 			btcoexist->bt_info.pre_agg_buf_size =
387c42ea613SYan-Hsuan Chuang 				btcoexist->bt_info.agg_buf_size;
388c42ea613SYan-Hsuan Chuang 		}
389c42ea613SYan-Hsuan Chuang 
3902635664eSPing-Ke Shih 		if (need_to_act)
3912635664eSPing-Ke Shih 			rtl_rx_ampdu_apply(rtlpriv);
3922635664eSPing-Ke Shih 	}
393f1d2b4d3SLarry Finger }
394f1d2b4d3SLarry Finger 
halbtc_get_bt_patch_version(struct btc_coexist * btcoexist)395f1d2b4d3SLarry Finger static u32 halbtc_get_bt_patch_version(struct btc_coexist *btcoexist)
396f1d2b4d3SLarry Finger {
3976aad6075SPing-Ke Shih 	u8 cmd_buffer[4] = {0};
3986aad6075SPing-Ke Shih 
3996aad6075SPing-Ke Shih 	if (btcoexist->bt_info.bt_real_fw_ver)
4006aad6075SPing-Ke Shih 		goto label_done;
4016aad6075SPing-Ke Shih 
402b2283dadSPing-Ke Shih 	/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */
403b2283dadSPing-Ke Shih 	halbtc_send_bt_mp_operation(btcoexist, BT_OP_GET_BT_VERSION,
404b2283dadSPing-Ke Shih 				    cmd_buffer, 4, 200);
4056aad6075SPing-Ke Shih 
4066aad6075SPing-Ke Shih label_done:
4076aad6075SPing-Ke Shih 	return btcoexist->bt_info.bt_real_fw_ver;
408f1d2b4d3SLarry Finger }
409f1d2b4d3SLarry Finger 
halbtc_get_bt_coex_supported_feature(void * btc_context)410b2283dadSPing-Ke Shih static u32 halbtc_get_bt_coex_supported_feature(void *btc_context)
411b2283dadSPing-Ke Shih {
412b2283dadSPing-Ke Shih 	struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context;
413b2283dadSPing-Ke Shih 	u8 cmd_buffer[4] = {0};
414b2283dadSPing-Ke Shih 
415b2283dadSPing-Ke Shih 	if (btcoexist->bt_info.bt_supported_feature)
416b2283dadSPing-Ke Shih 		goto label_done;
417b2283dadSPing-Ke Shih 
418b2283dadSPing-Ke Shih 	/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */
419b2283dadSPing-Ke Shih 	halbtc_send_bt_mp_operation(btcoexist,
420b2283dadSPing-Ke Shih 				    BT_OP_GET_BT_COEX_SUPPORTED_FEATURE,
421b2283dadSPing-Ke Shih 				    cmd_buffer, 4, 200);
422b2283dadSPing-Ke Shih 
423b2283dadSPing-Ke Shih label_done:
424b2283dadSPing-Ke Shih 	return btcoexist->bt_info.bt_supported_feature;
425b2283dadSPing-Ke Shih }
426b2283dadSPing-Ke Shih 
halbtc_get_bt_coex_supported_version(void * btc_context)427b2283dadSPing-Ke Shih static u32 halbtc_get_bt_coex_supported_version(void *btc_context)
428b2283dadSPing-Ke Shih {
429b2283dadSPing-Ke Shih 	struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context;
430b2283dadSPing-Ke Shih 	u8 cmd_buffer[4] = {0};
431b2283dadSPing-Ke Shih 
432b2283dadSPing-Ke Shih 	if (btcoexist->bt_info.bt_supported_version)
433b2283dadSPing-Ke Shih 		goto label_done;
434b2283dadSPing-Ke Shih 
435b2283dadSPing-Ke Shih 	/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */
436b2283dadSPing-Ke Shih 	halbtc_send_bt_mp_operation(btcoexist,
437b2283dadSPing-Ke Shih 				    BT_OP_GET_BT_COEX_SUPPORTED_VERSION,
438b2283dadSPing-Ke Shih 				    cmd_buffer, 4, 200);
439b2283dadSPing-Ke Shih 
440b2283dadSPing-Ke Shih label_done:
441b2283dadSPing-Ke Shih 	return btcoexist->bt_info.bt_supported_version;
442b2283dadSPing-Ke Shih }
443b2283dadSPing-Ke Shih 
halbtc_get_bt_device_info(void * btc_context)444b2283dadSPing-Ke Shih static u32 halbtc_get_bt_device_info(void *btc_context)
445b2283dadSPing-Ke Shih {
446b2283dadSPing-Ke Shih 	struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context;
447b2283dadSPing-Ke Shih 	u8 cmd_buffer[4] = {0};
448b2283dadSPing-Ke Shih 
449b2283dadSPing-Ke Shih 	/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */
450b2283dadSPing-Ke Shih 	halbtc_send_bt_mp_operation(btcoexist,
451b2283dadSPing-Ke Shih 				    BT_OP_GET_BT_DEVICE_INFO,
452b2283dadSPing-Ke Shih 				    cmd_buffer, 4, 200);
453b2283dadSPing-Ke Shih 
454b2283dadSPing-Ke Shih 	return btcoexist->bt_info.bt_device_info;
455b2283dadSPing-Ke Shih }
456b2283dadSPing-Ke Shih 
halbtc_get_bt_forbidden_slot_val(void * btc_context)457b2283dadSPing-Ke Shih static u32 halbtc_get_bt_forbidden_slot_val(void *btc_context)
458b2283dadSPing-Ke Shih {
459b2283dadSPing-Ke Shih 	struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context;
460b2283dadSPing-Ke Shih 	u8 cmd_buffer[4] = {0};
461b2283dadSPing-Ke Shih 
462b2283dadSPing-Ke Shih 	/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */
463b2283dadSPing-Ke Shih 	halbtc_send_bt_mp_operation(btcoexist,
464b2283dadSPing-Ke Shih 				    BT_OP_GET_BT_FORBIDDEN_SLOT_VAL,
465b2283dadSPing-Ke Shih 				    cmd_buffer, 4, 200);
466b2283dadSPing-Ke Shih 
467b2283dadSPing-Ke Shih 	return btcoexist->bt_info.bt_forb_slot_val;
468b2283dadSPing-Ke Shih }
469b2283dadSPing-Ke Shih 
halbtc_get_wifi_link_status(struct btc_coexist * btcoexist)470f2f6026aSPing-Ke Shih static u32 halbtc_get_wifi_link_status(struct btc_coexist *btcoexist)
471f1d2b4d3SLarry Finger {
472c42ea613SYan-Hsuan Chuang 	/* return value:
473c42ea613SYan-Hsuan Chuang 	 * [31:16] => connected port number
474c42ea613SYan-Hsuan Chuang 	 * [15:0]  => port connected bit define
475c42ea613SYan-Hsuan Chuang 	 */
476c42ea613SYan-Hsuan Chuang 	struct rtl_priv *rtlpriv = btcoexist->adapter;
477c42ea613SYan-Hsuan Chuang 	struct rtl_mac *mac = rtl_mac(rtlpriv);
478c42ea613SYan-Hsuan Chuang 	u32 ret_val = 0;
479c42ea613SYan-Hsuan Chuang 	u32 port_connected_status = 0, num_of_connected_port = 0;
480c42ea613SYan-Hsuan Chuang 
481c42ea613SYan-Hsuan Chuang 	if (mac->opmode == NL80211_IFTYPE_STATION &&
482c42ea613SYan-Hsuan Chuang 	    mac->link_state >= MAC80211_LINKED) {
483c42ea613SYan-Hsuan Chuang 		port_connected_status |= WIFI_STA_CONNECTED;
484c42ea613SYan-Hsuan Chuang 		num_of_connected_port++;
485c42ea613SYan-Hsuan Chuang 	}
486c42ea613SYan-Hsuan Chuang 	/* AP & ADHOC & MESH */
487c42ea613SYan-Hsuan Chuang 	if (is_any_client_connect_to_ap(btcoexist)) {
488c42ea613SYan-Hsuan Chuang 		port_connected_status |= WIFI_AP_CONNECTED;
489c42ea613SYan-Hsuan Chuang 		num_of_connected_port++;
490c42ea613SYan-Hsuan Chuang 	}
491c42ea613SYan-Hsuan Chuang 	/* TODO: P2P Connected Status */
492c42ea613SYan-Hsuan Chuang 
493c42ea613SYan-Hsuan Chuang 	ret_val = (num_of_connected_port << 16) | port_connected_status;
494c42ea613SYan-Hsuan Chuang 
495c42ea613SYan-Hsuan Chuang 	return ret_val;
496c42ea613SYan-Hsuan Chuang }
497c42ea613SYan-Hsuan Chuang 
halbtc_get_wifi_rssi(struct rtl_priv * rtlpriv)498c42ea613SYan-Hsuan Chuang static s32 halbtc_get_wifi_rssi(struct rtl_priv *rtlpriv)
499c42ea613SYan-Hsuan Chuang {
5009a29f7d8SHariprasad Kelam 	return rtlpriv->dm.undec_sm_pwdb;
501f1d2b4d3SLarry Finger }
502f1d2b4d3SLarry Finger 
halbtc_get(void * void_btcoexist,u8 get_type,void * out_buf)503f1d2b4d3SLarry Finger static bool halbtc_get(void *void_btcoexist, u8 get_type, void *out_buf)
504f1d2b4d3SLarry Finger {
505f1d2b4d3SLarry Finger 	struct btc_coexist *btcoexist = (struct btc_coexist *)void_btcoexist;
506f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
507f1d2b4d3SLarry Finger 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
508f1d2b4d3SLarry Finger 	struct rtl_mac *mac = rtl_mac(rtlpriv);
509f1d2b4d3SLarry Finger 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
510f1d2b4d3SLarry Finger 	bool *bool_tmp = (bool *)out_buf;
511f1d2b4d3SLarry Finger 	int *s32_tmp = (int *)out_buf;
512f1d2b4d3SLarry Finger 	u32 *u32_tmp = (u32 *)out_buf;
513f1d2b4d3SLarry Finger 	u8 *u8_tmp = (u8 *)out_buf;
514f1d2b4d3SLarry Finger 	bool tmp = false;
515838dd0d3SPing-Ke Shih 	bool ret = true;
516f1d2b4d3SLarry Finger 
517f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
518f1d2b4d3SLarry Finger 		return false;
519f1d2b4d3SLarry Finger 
520f1d2b4d3SLarry Finger 	switch (get_type) {
521f1d2b4d3SLarry Finger 	case BTC_GET_BL_HS_OPERATION:
522f1d2b4d3SLarry Finger 		*bool_tmp = false;
523838dd0d3SPing-Ke Shih 		ret = false;
524f1d2b4d3SLarry Finger 		break;
525f1d2b4d3SLarry Finger 	case BTC_GET_BL_HS_CONNECTING:
526f1d2b4d3SLarry Finger 		*bool_tmp = false;
527838dd0d3SPing-Ke Shih 		ret = false;
528f1d2b4d3SLarry Finger 		break;
529f1d2b4d3SLarry Finger 	case BTC_GET_BL_WIFI_CONNECTED:
530c42ea613SYan-Hsuan Chuang 		if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_STATION &&
531c42ea613SYan-Hsuan Chuang 		    rtlpriv->mac80211.link_state >= MAC80211_LINKED)
532c42ea613SYan-Hsuan Chuang 			tmp = true;
533c42ea613SYan-Hsuan Chuang 		if (is_any_client_connect_to_ap(btcoexist))
534f1d2b4d3SLarry Finger 			tmp = true;
535f1d2b4d3SLarry Finger 		*bool_tmp = tmp;
536f1d2b4d3SLarry Finger 		break;
537123068f2SPing-Ke Shih 	case BTC_GET_BL_WIFI_DUAL_BAND_CONNECTED:
538123068f2SPing-Ke Shih 		*u8_tmp = BTC_MULTIPORT_SCC;
539123068f2SPing-Ke Shih 		break;
540f1d2b4d3SLarry Finger 	case BTC_GET_BL_WIFI_BUSY:
541f1d2b4d3SLarry Finger 		if (halbtc_is_wifi_busy(rtlpriv))
542f1d2b4d3SLarry Finger 			*bool_tmp = true;
543f1d2b4d3SLarry Finger 		else
544f1d2b4d3SLarry Finger 			*bool_tmp = false;
545f1d2b4d3SLarry Finger 		break;
546f1d2b4d3SLarry Finger 	case BTC_GET_BL_WIFI_SCAN:
547f1d2b4d3SLarry Finger 		if (mac->act_scanning)
548f1d2b4d3SLarry Finger 			*bool_tmp = true;
549f1d2b4d3SLarry Finger 		else
550f1d2b4d3SLarry Finger 			*bool_tmp = false;
551f1d2b4d3SLarry Finger 		break;
552f1d2b4d3SLarry Finger 	case BTC_GET_BL_WIFI_LINK:
553f1d2b4d3SLarry Finger 		if (mac->link_state == MAC80211_LINKING)
554f1d2b4d3SLarry Finger 			*bool_tmp = true;
555f1d2b4d3SLarry Finger 		else
556f1d2b4d3SLarry Finger 			*bool_tmp = false;
557f1d2b4d3SLarry Finger 		break;
558c42ea613SYan-Hsuan Chuang 	case BTC_GET_BL_WIFI_ROAM:
559f1d2b4d3SLarry Finger 		if (mac->link_state == MAC80211_LINKING)
560f1d2b4d3SLarry Finger 			*bool_tmp = true;
561f1d2b4d3SLarry Finger 		else
562f1d2b4d3SLarry Finger 			*bool_tmp = false;
563f1d2b4d3SLarry Finger 		break;
564c42ea613SYan-Hsuan Chuang 	case BTC_GET_BL_WIFI_4_WAY_PROGRESS:
56576f146b6SPing-Ke Shih 		*bool_tmp = rtlpriv->btcoexist.btc_info.in_4way;
566f1d2b4d3SLarry Finger 		break;
567f1d2b4d3SLarry Finger 	case BTC_GET_BL_WIFI_UNDER_5G:
568838dd0d3SPing-Ke Shih 		if (rtlhal->current_bandtype == BAND_ON_5G)
569838dd0d3SPing-Ke Shih 			*bool_tmp = true;
570838dd0d3SPing-Ke Shih 		else
571f1d2b4d3SLarry Finger 			*bool_tmp = false;
572f1d2b4d3SLarry Finger 		break;
573f1d2b4d3SLarry Finger 	case BTC_GET_BL_WIFI_AP_MODE_ENABLE:
574838dd0d3SPing-Ke Shih 		if (mac->opmode == NL80211_IFTYPE_AP)
575838dd0d3SPing-Ke Shih 			*bool_tmp = true;
576838dd0d3SPing-Ke Shih 		else
577f1d2b4d3SLarry Finger 			*bool_tmp = false;
578f1d2b4d3SLarry Finger 		break;
579f1d2b4d3SLarry Finger 	case BTC_GET_BL_WIFI_ENABLE_ENCRYPTION:
580f1d2b4d3SLarry Finger 		if (NO_ENCRYPTION == rtlpriv->sec.pairwise_enc_algorithm)
581f1d2b4d3SLarry Finger 			*bool_tmp = false;
582f1d2b4d3SLarry Finger 		else
583f1d2b4d3SLarry Finger 			*bool_tmp = true;
584f1d2b4d3SLarry Finger 		break;
585f1d2b4d3SLarry Finger 	case BTC_GET_BL_WIFI_UNDER_B_MODE:
586c42ea613SYan-Hsuan Chuang 		if (rtlpriv->mac80211.mode == WIRELESS_MODE_B)
587c42ea613SYan-Hsuan Chuang 			*bool_tmp = true;
588c42ea613SYan-Hsuan Chuang 		else
589c42ea613SYan-Hsuan Chuang 			*bool_tmp = false;
590f1d2b4d3SLarry Finger 		break;
591f1d2b4d3SLarry Finger 	case BTC_GET_BL_EXT_SWITCH:
592f1d2b4d3SLarry Finger 		*bool_tmp = false;
593f1d2b4d3SLarry Finger 		break;
594c42ea613SYan-Hsuan Chuang 	case BTC_GET_BL_WIFI_IS_IN_MP_MODE:
595c42ea613SYan-Hsuan Chuang 		*bool_tmp = false;
596c42ea613SYan-Hsuan Chuang 		break;
597c42ea613SYan-Hsuan Chuang 	case BTC_GET_BL_IS_ASUS_8723B:
598c42ea613SYan-Hsuan Chuang 		*bool_tmp = false;
599c42ea613SYan-Hsuan Chuang 		break;
600c3788947SPing-Ke Shih 	case BTC_GET_BL_RF4CE_CONNECTED:
601c3788947SPing-Ke Shih 		*bool_tmp = false;
602c3788947SPing-Ke Shih 		break;
603f1d2b4d3SLarry Finger 	case BTC_GET_S4_WIFI_RSSI:
604f1d2b4d3SLarry Finger 		*s32_tmp = halbtc_get_wifi_rssi(rtlpriv);
605f1d2b4d3SLarry Finger 		break;
606c42ea613SYan-Hsuan Chuang 	case BTC_GET_S4_HS_RSSI:
607838dd0d3SPing-Ke Shih 		*s32_tmp = 0;
608838dd0d3SPing-Ke Shih 		ret = false;
609f1d2b4d3SLarry Finger 		break;
610f1d2b4d3SLarry Finger 	case BTC_GET_U4_WIFI_BW:
611f1d2b4d3SLarry Finger 		*u32_tmp = halbtc_get_wifi_bw(btcoexist);
612f1d2b4d3SLarry Finger 		break;
613f1d2b4d3SLarry Finger 	case BTC_GET_U4_WIFI_TRAFFIC_DIRECTION:
614f1d2b4d3SLarry Finger 		if (halbtc_is_wifi_uplink(rtlpriv))
615f1d2b4d3SLarry Finger 			*u32_tmp = BTC_WIFI_TRAFFIC_TX;
616f1d2b4d3SLarry Finger 		else
617f1d2b4d3SLarry Finger 			*u32_tmp = BTC_WIFI_TRAFFIC_RX;
618f1d2b4d3SLarry Finger 		break;
619f1d2b4d3SLarry Finger 	case BTC_GET_U4_WIFI_FW_VER:
620c42ea613SYan-Hsuan Chuang 		*u32_tmp = (rtlhal->fw_version << 16) | rtlhal->fw_subversion;
621c42ea613SYan-Hsuan Chuang 		break;
622c42ea613SYan-Hsuan Chuang 	case BTC_GET_U4_WIFI_LINK_STATUS:
623c42ea613SYan-Hsuan Chuang 		*u32_tmp = halbtc_get_wifi_link_status(btcoexist);
624f1d2b4d3SLarry Finger 		break;
625f1d2b4d3SLarry Finger 	case BTC_GET_U4_BT_PATCH_VER:
626f1d2b4d3SLarry Finger 		*u32_tmp = halbtc_get_bt_patch_version(btcoexist);
627f1d2b4d3SLarry Finger 		break;
6281a281473SPing-Ke Shih 	case BTC_GET_U4_VENDOR:
6291a281473SPing-Ke Shih 		*u32_tmp = BTC_VENDOR_OTHER;
6301a281473SPing-Ke Shih 		break;
631b2283dadSPing-Ke Shih 	case BTC_GET_U4_SUPPORTED_VERSION:
632b2283dadSPing-Ke Shih 		*u32_tmp = halbtc_get_bt_coex_supported_version(btcoexist);
633b2283dadSPing-Ke Shih 		break;
634b2283dadSPing-Ke Shih 	case BTC_GET_U4_SUPPORTED_FEATURE:
635b2283dadSPing-Ke Shih 		*u32_tmp = halbtc_get_bt_coex_supported_feature(btcoexist);
636b2283dadSPing-Ke Shih 		break;
637b2283dadSPing-Ke Shih 	case BTC_GET_U4_BT_DEVICE_INFO:
638b2283dadSPing-Ke Shih 		*u32_tmp = halbtc_get_bt_device_info(btcoexist);
639b2283dadSPing-Ke Shih 		break;
640b2283dadSPing-Ke Shih 	case BTC_GET_U4_BT_FORBIDDEN_SLOT_VAL:
641b2283dadSPing-Ke Shih 		*u32_tmp = halbtc_get_bt_forbidden_slot_val(btcoexist);
642b2283dadSPing-Ke Shih 		break;
6437fd34dc4SPing-Ke Shih 	case BTC_GET_U4_WIFI_IQK_TOTAL:
6447fd34dc4SPing-Ke Shih 		*u32_tmp =
6457fd34dc4SPing-Ke Shih 			btcoexist->btc_phydm_query_phy_counter(btcoexist,
6467fd34dc4SPing-Ke Shih 							       DM_INFO_IQK_ALL);
6477fd34dc4SPing-Ke Shih 		break;
6487fd34dc4SPing-Ke Shih 	case BTC_GET_U4_WIFI_IQK_OK:
6497fd34dc4SPing-Ke Shih 		*u32_tmp =
6507fd34dc4SPing-Ke Shih 			btcoexist->btc_phydm_query_phy_counter(btcoexist,
6517fd34dc4SPing-Ke Shih 							       DM_INFO_IQK_OK);
6527fd34dc4SPing-Ke Shih 		break;
6537fd34dc4SPing-Ke Shih 	case BTC_GET_U4_WIFI_IQK_FAIL:
6547fd34dc4SPing-Ke Shih 		*u32_tmp =
6557fd34dc4SPing-Ke Shih 			btcoexist->btc_phydm_query_phy_counter(btcoexist,
6567fd34dc4SPing-Ke Shih 							       DM_INFO_IQK_NG);
6577fd34dc4SPing-Ke Shih 		break;
658f1d2b4d3SLarry Finger 	case BTC_GET_U1_WIFI_DOT11_CHNL:
659f1d2b4d3SLarry Finger 		*u8_tmp = rtlphy->current_channel;
660f1d2b4d3SLarry Finger 		break;
661f1d2b4d3SLarry Finger 	case BTC_GET_U1_WIFI_CENTRAL_CHNL:
662f1d2b4d3SLarry Finger 		*u8_tmp = halbtc_get_wifi_central_chnl(btcoexist);
663f1d2b4d3SLarry Finger 		break;
664f1d2b4d3SLarry Finger 	case BTC_GET_U1_WIFI_HS_CHNL:
665838dd0d3SPing-Ke Shih 		*u8_tmp = 0;
666838dd0d3SPing-Ke Shih 		ret = false;
667f1d2b4d3SLarry Finger 		break;
668c42ea613SYan-Hsuan Chuang 	case BTC_GET_U1_AP_NUM:
669f1cb27edSPing-Ke Shih 		*u8_tmp = rtlpriv->btcoexist.btc_info.ap_num;
670c42ea613SYan-Hsuan Chuang 		break;
671c42ea613SYan-Hsuan Chuang 	case BTC_GET_U1_ANT_TYPE:
672c42ea613SYan-Hsuan Chuang 		*u8_tmp = (u8)BTC_ANT_TYPE_0;
673c42ea613SYan-Hsuan Chuang 		break;
674c42ea613SYan-Hsuan Chuang 	case BTC_GET_U1_IOT_PEER:
675c42ea613SYan-Hsuan Chuang 		*u8_tmp = 0;
676f1d2b4d3SLarry Finger 		break;
677f1d2b4d3SLarry Finger 
678f1d2b4d3SLarry Finger 		/************* 1Ant **************/
679f1d2b4d3SLarry Finger 	case BTC_GET_U1_LPS_MODE:
680f1d2b4d3SLarry Finger 		*u8_tmp = btcoexist->pwr_mode_val[0];
681f1d2b4d3SLarry Finger 		break;
682f1d2b4d3SLarry Finger 
683f1d2b4d3SLarry Finger 	default:
684838dd0d3SPing-Ke Shih 		ret = false;
685f1d2b4d3SLarry Finger 		break;
686f1d2b4d3SLarry Finger 	}
687f1d2b4d3SLarry Finger 
688838dd0d3SPing-Ke Shih 	return ret;
689f1d2b4d3SLarry Finger }
690f1d2b4d3SLarry Finger 
halbtc_set(void * void_btcoexist,u8 set_type,void * in_buf)691f1d2b4d3SLarry Finger static bool halbtc_set(void *void_btcoexist, u8 set_type, void *in_buf)
692f1d2b4d3SLarry Finger {
693f1d2b4d3SLarry Finger 	struct btc_coexist *btcoexist = (struct btc_coexist *)void_btcoexist;
694f1d2b4d3SLarry Finger 	bool *bool_tmp = (bool *)in_buf;
695f1d2b4d3SLarry Finger 	u8 *u8_tmp = (u8 *)in_buf;
696f1d2b4d3SLarry Finger 	u32 *u32_tmp = (u32 *)in_buf;
6978488e211SPing-Ke Shih 	bool ret = true;
698f1d2b4d3SLarry Finger 
699f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
700f1d2b4d3SLarry Finger 		return false;
701f1d2b4d3SLarry Finger 
702f1d2b4d3SLarry Finger 	switch (set_type) {
703f1d2b4d3SLarry Finger 	/* set some bool type variables. */
704f1d2b4d3SLarry Finger 	case BTC_SET_BL_BT_DISABLE:
705f1d2b4d3SLarry Finger 		btcoexist->bt_info.bt_disabled = *bool_tmp;
706f1d2b4d3SLarry Finger 		break;
707f1d2b4d3SLarry Finger 	case BTC_SET_BL_BT_TRAFFIC_BUSY:
708f1d2b4d3SLarry Finger 		btcoexist->bt_info.bt_busy = *bool_tmp;
709f1d2b4d3SLarry Finger 		break;
710f1d2b4d3SLarry Finger 	case BTC_SET_BL_BT_LIMITED_DIG:
711f1d2b4d3SLarry Finger 		btcoexist->bt_info.limited_dig = *bool_tmp;
712f1d2b4d3SLarry Finger 		break;
713f1d2b4d3SLarry Finger 	case BTC_SET_BL_FORCE_TO_ROAM:
714f1d2b4d3SLarry Finger 		btcoexist->bt_info.force_to_roam = *bool_tmp;
715f1d2b4d3SLarry Finger 		break;
716f1d2b4d3SLarry Finger 	case BTC_SET_BL_TO_REJ_AP_AGG_PKT:
717f1d2b4d3SLarry Finger 		btcoexist->bt_info.reject_agg_pkt = *bool_tmp;
718f1d2b4d3SLarry Finger 		break;
719f1d2b4d3SLarry Finger 	case BTC_SET_BL_BT_CTRL_AGG_SIZE:
720c42ea613SYan-Hsuan Chuang 		btcoexist->bt_info.bt_ctrl_agg_buf_size = *bool_tmp;
721f1d2b4d3SLarry Finger 		break;
722f1d2b4d3SLarry Finger 	case BTC_SET_BL_INC_SCAN_DEV_NUM:
723f1d2b4d3SLarry Finger 		btcoexist->bt_info.increase_scan_dev_num = *bool_tmp;
724f1d2b4d3SLarry Finger 		break;
725c42ea613SYan-Hsuan Chuang 	case BTC_SET_BL_BT_TX_RX_MASK:
726c42ea613SYan-Hsuan Chuang 		btcoexist->bt_info.bt_tx_rx_mask = *bool_tmp;
727c42ea613SYan-Hsuan Chuang 		break;
728c42ea613SYan-Hsuan Chuang 	case BTC_SET_BL_MIRACAST_PLUS_BT:
729c42ea613SYan-Hsuan Chuang 		btcoexist->bt_info.miracast_plus_bt = *bool_tmp;
730c42ea613SYan-Hsuan Chuang 		break;
731f1d2b4d3SLarry Finger 		/* set some u1Byte type variables. */
732f1d2b4d3SLarry Finger 	case BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON:
733f1d2b4d3SLarry Finger 		btcoexist->bt_info.rssi_adjust_for_agc_table_on = *u8_tmp;
734f1d2b4d3SLarry Finger 		break;
735f1d2b4d3SLarry Finger 	case BTC_SET_U1_AGG_BUF_SIZE:
736f1d2b4d3SLarry Finger 		btcoexist->bt_info.agg_buf_size = *u8_tmp;
737f1d2b4d3SLarry Finger 		break;
738c42ea613SYan-Hsuan Chuang 
739f1d2b4d3SLarry Finger 	/* the following are some action which will be triggered */
740f1d2b4d3SLarry Finger 	case BTC_SET_ACT_GET_BT_RSSI:
7418488e211SPing-Ke Shih 		ret = false;
742f1d2b4d3SLarry Finger 		break;
743f1d2b4d3SLarry Finger 	case BTC_SET_ACT_AGGREGATE_CTRL:
744c42ea613SYan-Hsuan Chuang 		halbtc_aggregation_check(btcoexist);
745f1d2b4d3SLarry Finger 		break;
746f1d2b4d3SLarry Finger 
747f1d2b4d3SLarry Finger 	/* 1Ant */
748f1d2b4d3SLarry Finger 	case BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE:
749f1d2b4d3SLarry Finger 		btcoexist->bt_info.rssi_adjust_for_1ant_coex_type = *u8_tmp;
750f1d2b4d3SLarry Finger 		break;
751f1d2b4d3SLarry Finger 	case BTC_SET_UI_SCAN_SIG_COMPENSATION:
752f1d2b4d3SLarry Finger 		break;
753c42ea613SYan-Hsuan Chuang 	case BTC_SET_U1_LPS_VAL:
754f1d2b4d3SLarry Finger 		btcoexist->bt_info.lps_val = *u8_tmp;
755f1d2b4d3SLarry Finger 		break;
756c42ea613SYan-Hsuan Chuang 	case BTC_SET_U1_RPWM_VAL:
757f1d2b4d3SLarry Finger 		btcoexist->bt_info.rpwm_val = *u8_tmp;
758f1d2b4d3SLarry Finger 		break;
759f1d2b4d3SLarry Finger 	/* the following are some action which will be triggered  */
760f1d2b4d3SLarry Finger 	case BTC_SET_ACT_LEAVE_LPS:
761f1d2b4d3SLarry Finger 		halbtc_leave_lps(btcoexist);
762f1d2b4d3SLarry Finger 		break;
763f1d2b4d3SLarry Finger 	case BTC_SET_ACT_ENTER_LPS:
764f1d2b4d3SLarry Finger 		halbtc_enter_lps(btcoexist);
765f1d2b4d3SLarry Finger 		break;
766f1d2b4d3SLarry Finger 	case BTC_SET_ACT_NORMAL_LPS:
767f1d2b4d3SLarry Finger 		halbtc_normal_lps(btcoexist);
768f1d2b4d3SLarry Finger 		break;
769c3468950SPing-Ke Shih 	case BTC_SET_ACT_PRE_NORMAL_LPS:
770c3468950SPing-Ke Shih 		halbtc_pre_normal_lps(btcoexist);
771c3468950SPing-Ke Shih 		break;
772c3468950SPing-Ke Shih 	case BTC_SET_ACT_POST_NORMAL_LPS:
773c3468950SPing-Ke Shih 		halbtc_post_normal_lps(btcoexist);
774c3468950SPing-Ke Shih 		break;
775f1d2b4d3SLarry Finger 	case BTC_SET_ACT_DISABLE_LOW_POWER:
776c42ea613SYan-Hsuan Chuang 		halbtc_disable_low_power(btcoexist, *bool_tmp);
777f1d2b4d3SLarry Finger 		break;
778c6821613SYan-Hsuan Chuang 	case BTC_SET_ACT_UPDATE_RAMASK:
779f1d2b4d3SLarry Finger 		btcoexist->bt_info.ra_mask = *u32_tmp;
780f1d2b4d3SLarry Finger 		break;
781f1d2b4d3SLarry Finger 	case BTC_SET_ACT_SEND_MIMO_PS:
782f1d2b4d3SLarry Finger 		break;
783f1d2b4d3SLarry Finger 	case BTC_SET_ACT_CTRL_BT_INFO: /*wait for 8812/8821*/
784f1d2b4d3SLarry Finger 		break;
785f1d2b4d3SLarry Finger 	case BTC_SET_ACT_CTRL_BT_COEX:
786f1d2b4d3SLarry Finger 		break;
787c42ea613SYan-Hsuan Chuang 	case BTC_SET_ACT_CTRL_8723B_ANT:
788c42ea613SYan-Hsuan Chuang 		break;
789f1d2b4d3SLarry Finger 	default:
790f1d2b4d3SLarry Finger 		break;
791f1d2b4d3SLarry Finger 	}
792f1d2b4d3SLarry Finger 
7938488e211SPing-Ke Shih 	return ret;
794f1d2b4d3SLarry Finger }
795f1d2b4d3SLarry Finger 
halbtc_display_coex_statistics(struct btc_coexist * btcoexist,struct seq_file * m)79608431b62SPing-Ke Shih static void halbtc_display_coex_statistics(struct btc_coexist *btcoexist,
79708431b62SPing-Ke Shih 					   struct seq_file *m)
79808431b62SPing-Ke Shih {
79908431b62SPing-Ke Shih }
80008431b62SPing-Ke Shih 
halbtc_display_bt_link_info(struct btc_coexist * btcoexist,struct seq_file * m)80108431b62SPing-Ke Shih static void halbtc_display_bt_link_info(struct btc_coexist *btcoexist,
80208431b62SPing-Ke Shih 					struct seq_file *m)
80308431b62SPing-Ke Shih {
80408431b62SPing-Ke Shih }
80508431b62SPing-Ke Shih 
halbtc_display_wifi_status(struct btc_coexist * btcoexist,struct seq_file * m)80608431b62SPing-Ke Shih static void halbtc_display_wifi_status(struct btc_coexist *btcoexist,
80708431b62SPing-Ke Shih 				       struct seq_file *m)
80808431b62SPing-Ke Shih {
80908431b62SPing-Ke Shih 	struct rtl_priv *rtlpriv = btcoexist->adapter;
81008431b62SPing-Ke Shih 	s32 wifi_rssi = 0, bt_hs_rssi = 0;
81108431b62SPing-Ke Shih 	bool scan = false, link = false, roam = false, wifi_busy = false;
81208431b62SPing-Ke Shih 	bool wifi_under_b_mode = false;
81308431b62SPing-Ke Shih 	bool wifi_under_5g = false;
81408431b62SPing-Ke Shih 	u32 wifi_bw = BTC_WIFI_BW_HT20;
81508431b62SPing-Ke Shih 	u32 wifi_traffic_dir = BTC_WIFI_TRAFFIC_TX;
81608431b62SPing-Ke Shih 	u32 wifi_freq = BTC_FREQ_2_4G;
81708431b62SPing-Ke Shih 	u32 wifi_link_status = 0x0;
81808431b62SPing-Ke Shih 	bool bt_hs_on = false, under_ips = false, under_lps = false;
81908431b62SPing-Ke Shih 	bool low_power = false, dc_mode = false;
8207e2c4922SColin Ian King 	u8 wifi_chnl = 0, wifi_hs_chnl = 0;
82108431b62SPing-Ke Shih 	u8 ap_num = 0;
82208431b62SPing-Ke Shih 
82308431b62SPing-Ke Shih 	wifi_link_status = halbtc_get_wifi_link_status(btcoexist);
82408431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %d/ %d/ %d/ %d/ %d",
82508431b62SPing-Ke Shih 		   "STA/vWifi/HS/p2pGo/p2pGc",
82608431b62SPing-Ke Shih 		   ((wifi_link_status & WIFI_STA_CONNECTED) ? 1 : 0),
82708431b62SPing-Ke Shih 		   ((wifi_link_status & WIFI_AP_CONNECTED) ? 1 : 0),
82808431b62SPing-Ke Shih 		   ((wifi_link_status & WIFI_HS_CONNECTED) ? 1 : 0),
82908431b62SPing-Ke Shih 		   ((wifi_link_status & WIFI_P2P_GO_CONNECTED) ? 1 : 0),
83008431b62SPing-Ke Shih 		   ((wifi_link_status & WIFI_P2P_GC_CONNECTED) ? 1 : 0));
83108431b62SPing-Ke Shih 
83208431b62SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
83308431b62SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifi_chnl);
83408431b62SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);
83508431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %d / %d(%d)",
83608431b62SPing-Ke Shih 		   "Dot11 channel / HsChnl(High Speed)",
83708431b62SPing-Ke Shih 		   wifi_chnl, wifi_hs_chnl, bt_hs_on);
83808431b62SPing-Ke Shih 
83908431b62SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
84008431b62SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
84108431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %d/ %d",
84208431b62SPing-Ke Shih 		   "Wifi rssi/ HS rssi",
84308431b62SPing-Ke Shih 		   wifi_rssi - 100, bt_hs_rssi - 100);
84408431b62SPing-Ke Shih 
84508431b62SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
84608431b62SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
84708431b62SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
84808431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %d/ %d/ %d ",
84908431b62SPing-Ke Shih 		   "Wifi link/ roam/ scan",
85008431b62SPing-Ke Shih 		   link, roam, scan);
85108431b62SPing-Ke Shih 
85208431b62SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
85308431b62SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
85408431b62SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
85508431b62SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
85608431b62SPing-Ke Shih 			   &wifi_traffic_dir);
85708431b62SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
85808431b62SPing-Ke Shih 	wifi_freq = (wifi_under_5g ? BTC_FREQ_5G : BTC_FREQ_2_4G);
85908431b62SPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
86008431b62SPing-Ke Shih 			   &wifi_under_b_mode);
86108431b62SPing-Ke Shih 
86208431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %s / %s/ %s/ AP=%d ",
86308431b62SPing-Ke Shih 		   "Wifi freq/ bw/ traffic",
86408431b62SPing-Ke Shih 		   gl_btc_wifi_freq_string[wifi_freq],
86508431b62SPing-Ke Shih 		   ((wifi_under_b_mode) ? "11b" :
86608431b62SPing-Ke Shih 		    gl_btc_wifi_bw_string[wifi_bw]),
86708431b62SPing-Ke Shih 		   ((!wifi_busy) ? "idle" : ((BTC_WIFI_TRAFFIC_TX ==
86808431b62SPing-Ke Shih 					      wifi_traffic_dir) ? "uplink" :
86908431b62SPing-Ke Shih 					     "downlink")),
87008431b62SPing-Ke Shih 		   ap_num);
87108431b62SPing-Ke Shih 
87208431b62SPing-Ke Shih 	/* power status	 */
87308431b62SPing-Ke Shih 	dc_mode = true;	/*TODO*/
87408431b62SPing-Ke Shih 	under_ips = rtlpriv->psc.inactive_pwrstate == ERFOFF ? 1 : 0;
87508431b62SPing-Ke Shih 	under_lps = rtlpriv->psc.dot11_psmode == EACTIVE ? 0 : 1;
87608431b62SPing-Ke Shih 	low_power = 0; /*TODO*/
87708431b62SPing-Ke Shih 	seq_printf(m, "\n %-35s = %s%s%s%s",
87808431b62SPing-Ke Shih 		   "Power Status",
87908431b62SPing-Ke Shih 		   (dc_mode ? "DC mode" : "AC mode"),
88008431b62SPing-Ke Shih 		   (under_ips ? ", IPS ON" : ""),
88108431b62SPing-Ke Shih 		   (under_lps ? ", LPS ON" : ""),
88208431b62SPing-Ke Shih 		   (low_power ? ", 32k" : ""));
88308431b62SPing-Ke Shih 
88408431b62SPing-Ke Shih 	seq_printf(m,
8851751a735SAndy Shevchenko 		   "\n %-35s = %6ph (0x%x/0x%x)",
88608431b62SPing-Ke Shih 		   "Power mode cmd(lps/rpwm)",
8871751a735SAndy Shevchenko 		   btcoexist->pwr_mode_val,
88808431b62SPing-Ke Shih 		   btcoexist->bt_info.lps_val,
88908431b62SPing-Ke Shih 		   btcoexist->bt_info.rpwm_val);
89008431b62SPing-Ke Shih }
89108431b62SPing-Ke Shih 
892f1d2b4d3SLarry Finger /************************************************************
893f1d2b4d3SLarry Finger  *		IO related function
894f1d2b4d3SLarry Finger  ************************************************************/
halbtc_read_1byte(void * bt_context,u32 reg_addr)895f1d2b4d3SLarry Finger static u8 halbtc_read_1byte(void *bt_context, u32 reg_addr)
896f1d2b4d3SLarry Finger {
897f1d2b4d3SLarry Finger 	struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
898f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
899f1d2b4d3SLarry Finger 
900f1d2b4d3SLarry Finger 	return	rtl_read_byte(rtlpriv, reg_addr);
901f1d2b4d3SLarry Finger }
902f1d2b4d3SLarry Finger 
halbtc_read_2byte(void * bt_context,u32 reg_addr)903f1d2b4d3SLarry Finger static u16 halbtc_read_2byte(void *bt_context, u32 reg_addr)
904f1d2b4d3SLarry Finger {
905f1d2b4d3SLarry Finger 	struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
906f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
907f1d2b4d3SLarry Finger 
908f1d2b4d3SLarry Finger 	return	rtl_read_word(rtlpriv, reg_addr);
909f1d2b4d3SLarry Finger }
910f1d2b4d3SLarry Finger 
halbtc_read_4byte(void * bt_context,u32 reg_addr)911f1d2b4d3SLarry Finger static u32 halbtc_read_4byte(void *bt_context, u32 reg_addr)
912f1d2b4d3SLarry Finger {
913f1d2b4d3SLarry Finger 	struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
914f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
915f1d2b4d3SLarry Finger 
916f1d2b4d3SLarry Finger 	return	rtl_read_dword(rtlpriv, reg_addr);
917f1d2b4d3SLarry Finger }
918f1d2b4d3SLarry Finger 
halbtc_write_1byte(void * bt_context,u32 reg_addr,u32 data)919f1d2b4d3SLarry Finger static void halbtc_write_1byte(void *bt_context, u32 reg_addr, u32 data)
920f1d2b4d3SLarry Finger {
921f1d2b4d3SLarry Finger 	struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
922f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
923f1d2b4d3SLarry Finger 
924f1d2b4d3SLarry Finger 	rtl_write_byte(rtlpriv, reg_addr, data);
925f1d2b4d3SLarry Finger }
926f1d2b4d3SLarry Finger 
halbtc_bitmask_write_1byte(void * bt_context,u32 reg_addr,u32 bit_mask,u8 data)927f1d2b4d3SLarry Finger static void halbtc_bitmask_write_1byte(void *bt_context, u32 reg_addr,
928f1d2b4d3SLarry Finger 				       u32 bit_mask, u8 data)
929f1d2b4d3SLarry Finger {
930f1d2b4d3SLarry Finger 	struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
931f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
932f1d2b4d3SLarry Finger 	u8 original_value, bit_shift = 0;
933f1d2b4d3SLarry Finger 	u8 i;
934f1d2b4d3SLarry Finger 
935f1d2b4d3SLarry Finger 	if (bit_mask != MASKDWORD) {/*if not "double word" write*/
936f1d2b4d3SLarry Finger 		original_value = rtl_read_byte(rtlpriv, reg_addr);
937f1d2b4d3SLarry Finger 		for (i = 0; i <= 7; i++) {
938f1d2b4d3SLarry Finger 			if ((bit_mask>>i) & 0x1)
939f1d2b4d3SLarry Finger 				break;
940f1d2b4d3SLarry Finger 		}
941f1d2b4d3SLarry Finger 		bit_shift = i;
942f1d2b4d3SLarry Finger 		data = (original_value & (~bit_mask)) |
943f1d2b4d3SLarry Finger 			((data << bit_shift) & bit_mask);
944f1d2b4d3SLarry Finger 	}
945f1d2b4d3SLarry Finger 	rtl_write_byte(rtlpriv, reg_addr, data);
946f1d2b4d3SLarry Finger }
947f1d2b4d3SLarry Finger 
halbtc_write_2byte(void * bt_context,u32 reg_addr,u16 data)948f1d2b4d3SLarry Finger static void halbtc_write_2byte(void *bt_context, u32 reg_addr, u16 data)
949f1d2b4d3SLarry Finger {
950f1d2b4d3SLarry Finger 	struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
951f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
952f1d2b4d3SLarry Finger 
953f1d2b4d3SLarry Finger 	rtl_write_word(rtlpriv, reg_addr, data);
954f1d2b4d3SLarry Finger }
955f1d2b4d3SLarry Finger 
halbtc_write_4byte(void * bt_context,u32 reg_addr,u32 data)956f1d2b4d3SLarry Finger static void halbtc_write_4byte(void *bt_context, u32 reg_addr, u32 data)
957f1d2b4d3SLarry Finger {
958f1d2b4d3SLarry Finger 	struct btc_coexist *btcoexist =
959f1d2b4d3SLarry Finger 		(struct btc_coexist *)bt_context;
960f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
961f1d2b4d3SLarry Finger 
962f1d2b4d3SLarry Finger 	rtl_write_dword(rtlpriv, reg_addr, data);
963f1d2b4d3SLarry Finger }
964f1d2b4d3SLarry Finger 
halbtc_write_local_reg_1byte(void * btc_context,u32 reg_addr,u8 data)965f2f6026aSPing-Ke Shih static void halbtc_write_local_reg_1byte(void *btc_context, u32 reg_addr,
966f2f6026aSPing-Ke Shih 					 u8 data)
967c42ea613SYan-Hsuan Chuang {
968c42ea613SYan-Hsuan Chuang 	struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context;
969c42ea613SYan-Hsuan Chuang 	struct rtl_priv *rtlpriv = btcoexist->adapter;
970c42ea613SYan-Hsuan Chuang 
971c42ea613SYan-Hsuan Chuang 	if (btcoexist->chip_interface == BTC_INTF_SDIO)
972c42ea613SYan-Hsuan Chuang 		;
973c42ea613SYan-Hsuan Chuang 	else if (btcoexist->chip_interface == BTC_INTF_PCI)
974c42ea613SYan-Hsuan Chuang 		rtl_write_byte(rtlpriv, reg_addr, data);
975c42ea613SYan-Hsuan Chuang 	else if (btcoexist->chip_interface == BTC_INTF_USB)
976c42ea613SYan-Hsuan Chuang 		rtl_write_byte(rtlpriv, reg_addr, data);
977c42ea613SYan-Hsuan Chuang }
978c42ea613SYan-Hsuan Chuang 
halbtc_set_bbreg(void * bt_context,u32 reg_addr,u32 bit_mask,u32 data)979f1d2b4d3SLarry Finger static void halbtc_set_bbreg(void *bt_context, u32 reg_addr, u32 bit_mask,
980f1d2b4d3SLarry Finger 			     u32 data)
981f1d2b4d3SLarry Finger {
982f1d2b4d3SLarry Finger 	struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
983f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
984f1d2b4d3SLarry Finger 
985f1d2b4d3SLarry Finger 	rtl_set_bbreg(rtlpriv->mac80211.hw, reg_addr, bit_mask, data);
986f1d2b4d3SLarry Finger }
987f1d2b4d3SLarry Finger 
halbtc_get_bbreg(void * bt_context,u32 reg_addr,u32 bit_mask)988f1d2b4d3SLarry Finger static u32 halbtc_get_bbreg(void *bt_context, u32 reg_addr, u32 bit_mask)
989f1d2b4d3SLarry Finger {
990f1d2b4d3SLarry Finger 	struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
991f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
992f1d2b4d3SLarry Finger 
993f1d2b4d3SLarry Finger 	return rtl_get_bbreg(rtlpriv->mac80211.hw, reg_addr, bit_mask);
994f1d2b4d3SLarry Finger }
995f1d2b4d3SLarry Finger 
halbtc_set_rfreg(void * bt_context,u8 rf_path,u32 reg_addr,u32 bit_mask,u32 data)996f1d2b4d3SLarry Finger static void halbtc_set_rfreg(void *bt_context, u8 rf_path, u32 reg_addr,
997f1d2b4d3SLarry Finger 			     u32 bit_mask, u32 data)
998f1d2b4d3SLarry Finger {
999f1d2b4d3SLarry Finger 	struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
1000f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1001f1d2b4d3SLarry Finger 
1002f1d2b4d3SLarry Finger 	rtl_set_rfreg(rtlpriv->mac80211.hw, rf_path, reg_addr, bit_mask, data);
1003f1d2b4d3SLarry Finger }
1004f1d2b4d3SLarry Finger 
halbtc_get_rfreg(void * bt_context,u8 rf_path,u32 reg_addr,u32 bit_mask)1005f1d2b4d3SLarry Finger static u32 halbtc_get_rfreg(void *bt_context, u8 rf_path, u32 reg_addr,
1006f1d2b4d3SLarry Finger 			    u32 bit_mask)
1007f1d2b4d3SLarry Finger {
1008f1d2b4d3SLarry Finger 	struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
1009f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1010f1d2b4d3SLarry Finger 
1011f1d2b4d3SLarry Finger 	return rtl_get_rfreg(rtlpriv->mac80211.hw, rf_path, reg_addr, bit_mask);
1012f1d2b4d3SLarry Finger }
1013f1d2b4d3SLarry Finger 
halbtc_fill_h2c_cmd(void * bt_context,u8 element_id,u32 cmd_len,u8 * cmd_buf)1014f1d2b4d3SLarry Finger static void halbtc_fill_h2c_cmd(void *bt_context, u8 element_id,
1015f1d2b4d3SLarry Finger 				u32 cmd_len, u8 *cmd_buf)
1016f1d2b4d3SLarry Finger {
1017f1d2b4d3SLarry Finger 	struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
1018f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1019f1d2b4d3SLarry Finger 
1020f1d2b4d3SLarry Finger 	rtlpriv->cfg->ops->fill_h2c_cmd(rtlpriv->mac80211.hw, element_id,
1021f1d2b4d3SLarry Finger 					cmd_len, cmd_buf);
1022f1d2b4d3SLarry Finger }
1023f1d2b4d3SLarry Finger 
halbtc_send_wifi_port_id_cmd(void * bt_context)1024d7297a86SPing-Ke Shih void halbtc_send_wifi_port_id_cmd(void *bt_context)
1025d7297a86SPing-Ke Shih {
1026d7297a86SPing-Ke Shih 	struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
1027d7297a86SPing-Ke Shih 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1028d7297a86SPing-Ke Shih 	u8 cmd_buf[1] = {0};	/* port id [2:0] = 0 */
1029d7297a86SPing-Ke Shih 
1030d7297a86SPing-Ke Shih 	rtlpriv->cfg->ops->fill_h2c_cmd(rtlpriv->mac80211.hw, H2C_BT_PORT_ID,
1031d7297a86SPing-Ke Shih 					1, cmd_buf);
1032d7297a86SPing-Ke Shih }
1033d7297a86SPing-Ke Shih 
halbtc_set_default_port_id_cmd(void * bt_context)1034d7297a86SPing-Ke Shih void halbtc_set_default_port_id_cmd(void *bt_context)
1035d7297a86SPing-Ke Shih {
1036d7297a86SPing-Ke Shih 	struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
1037d7297a86SPing-Ke Shih 	struct rtl_priv *rtlpriv = btcoexist->adapter;
1038d7297a86SPing-Ke Shih 	struct ieee80211_hw *hw = rtlpriv->mac80211.hw;
1039d7297a86SPing-Ke Shih 
1040d7297a86SPing-Ke Shih 	if (!rtlpriv->cfg->ops->set_default_port_id_cmd)
1041d7297a86SPing-Ke Shih 		return;
1042d7297a86SPing-Ke Shih 
1043d7297a86SPing-Ke Shih 	rtlpriv->cfg->ops->set_default_port_id_cmd(hw);
1044d7297a86SPing-Ke Shih }
1045d7297a86SPing-Ke Shih 
1046f2f6026aSPing-Ke Shih static
halbtc_set_bt_reg(void * btc_context,u8 reg_type,u32 offset,u32 set_val)1047c42ea613SYan-Hsuan Chuang void halbtc_set_bt_reg(void *btc_context, u8 reg_type, u32 offset, u32 set_val)
1048c42ea613SYan-Hsuan Chuang {
1049c42ea613SYan-Hsuan Chuang 	struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context;
1050c42ea613SYan-Hsuan Chuang 	u8 cmd_buffer1[4] = {0};
1051c42ea613SYan-Hsuan Chuang 	u8 cmd_buffer2[4] = {0};
1052c42ea613SYan-Hsuan Chuang 
1053b2283dadSPing-Ke Shih 	/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */
1054b2283dadSPing-Ke Shih 	*((__le16 *)&cmd_buffer1[2]) = cpu_to_le16((u16)set_val);
1055b2283dadSPing-Ke Shih 	if (!halbtc_send_bt_mp_operation(btcoexist, BT_OP_WRITE_REG_VALUE,
1056b2283dadSPing-Ke Shih 					 cmd_buffer1, 4, 200))
1057b2283dadSPing-Ke Shih 		return;
1058c42ea613SYan-Hsuan Chuang 
1059b2283dadSPing-Ke Shih 	/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */
1060b2283dadSPing-Ke Shih 	cmd_buffer2[2] = reg_type;
1061b2283dadSPing-Ke Shih 	*((u8 *)&cmd_buffer2[3]) = (u8)offset;
1062b2283dadSPing-Ke Shih 	halbtc_send_bt_mp_operation(btcoexist, BT_OP_WRITE_REG_ADDR,
1063b2283dadSPing-Ke Shih 				    cmd_buffer2, 4, 200);
1064c42ea613SYan-Hsuan Chuang }
1065c42ea613SYan-Hsuan Chuang 
halbtc_display_dbg_msg(void * bt_context,u8 disp_type,struct seq_file * m)106608431b62SPing-Ke Shih static void halbtc_display_dbg_msg(void *bt_context, u8 disp_type,
106708431b62SPing-Ke Shih 				   struct seq_file *m)
106808431b62SPing-Ke Shih {
106908431b62SPing-Ke Shih 	struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
107008431b62SPing-Ke Shih 
107108431b62SPing-Ke Shih 	switch (disp_type) {
107208431b62SPing-Ke Shih 	case BTC_DBG_DISP_COEX_STATISTICS:
107308431b62SPing-Ke Shih 		halbtc_display_coex_statistics(btcoexist, m);
107408431b62SPing-Ke Shih 		break;
107508431b62SPing-Ke Shih 	case BTC_DBG_DISP_BT_LINK_INFO:
107608431b62SPing-Ke Shih 		halbtc_display_bt_link_info(btcoexist, m);
107708431b62SPing-Ke Shih 		break;
107808431b62SPing-Ke Shih 	case BTC_DBG_DISP_WIFI_STATUS:
107908431b62SPing-Ke Shih 		halbtc_display_wifi_status(btcoexist, m);
108008431b62SPing-Ke Shih 		break;
108108431b62SPing-Ke Shih 	default:
108208431b62SPing-Ke Shih 		break;
108308431b62SPing-Ke Shih 	}
108408431b62SPing-Ke Shih }
108508431b62SPing-Ke Shih 
halbtc_get_bt_reg(void * btc_context,u8 reg_type,u32 offset)1086c3788947SPing-Ke Shih static u32 halbtc_get_bt_reg(void *btc_context, u8 reg_type, u32 offset)
1087c3788947SPing-Ke Shih {
1088c3788947SPing-Ke Shih 	return 0;
1089c3788947SPing-Ke Shih }
1090c3788947SPing-Ke Shih 
halbtc_under_ips(struct btc_coexist * btcoexist)1091f2f6026aSPing-Ke Shih static bool halbtc_under_ips(struct btc_coexist *btcoexist)
10927937f02dSYan-Hsuan Chuang {
10937937f02dSYan-Hsuan Chuang 	struct rtl_priv *rtlpriv = btcoexist->adapter;
10947937f02dSYan-Hsuan Chuang 	struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
10957937f02dSYan-Hsuan Chuang 	enum rf_pwrstate rtstate;
10967937f02dSYan-Hsuan Chuang 
10977937f02dSYan-Hsuan Chuang 	if (ppsc->inactiveps) {
10987937f02dSYan-Hsuan Chuang 		rtstate = ppsc->rfpwr_state;
10997937f02dSYan-Hsuan Chuang 
11007937f02dSYan-Hsuan Chuang 		if (rtstate != ERFON &&
11017937f02dSYan-Hsuan Chuang 		    ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
11027937f02dSYan-Hsuan Chuang 			return true;
11037937f02dSYan-Hsuan Chuang 		}
11047937f02dSYan-Hsuan Chuang 	}
11057937f02dSYan-Hsuan Chuang 
11067937f02dSYan-Hsuan Chuang 	return false;
11077937f02dSYan-Hsuan Chuang }
11087937f02dSYan-Hsuan Chuang 
11097fd34dc4SPing-Ke Shih static
halbtc_get_phydm_version(void * btc_context)11107fd34dc4SPing-Ke Shih u32 halbtc_get_phydm_version(void *btc_context)
11117fd34dc4SPing-Ke Shih {
11127fd34dc4SPing-Ke Shih 	return 0;
11137fd34dc4SPing-Ke Shih }
11147fd34dc4SPing-Ke Shih 
11157fd34dc4SPing-Ke Shih static
halbtc_phydm_modify_ra_pcr_threshold(void * btc_context,u8 ra_offset_direction,u8 ra_threshold_offset)11167fd34dc4SPing-Ke Shih void halbtc_phydm_modify_ra_pcr_threshold(void *btc_context,
11177fd34dc4SPing-Ke Shih 					  u8 ra_offset_direction,
11187fd34dc4SPing-Ke Shih 					  u8 ra_threshold_offset)
11197fd34dc4SPing-Ke Shih {
11207fd34dc4SPing-Ke Shih }
11217fd34dc4SPing-Ke Shih 
11227fd34dc4SPing-Ke Shih static
halbtc_phydm_query_phy_counter(void * btc_context,enum dm_info_query dm_id)11237fd34dc4SPing-Ke Shih u32 halbtc_phydm_query_phy_counter(void *btc_context, enum dm_info_query dm_id)
11247fd34dc4SPing-Ke Shih {
11257fd34dc4SPing-Ke Shih 	return 0;
11267fd34dc4SPing-Ke Shih }
11277fd34dc4SPing-Ke Shih 
halbtc_get_ant_det_val_from_bt(void * btc_context)1128b2283dadSPing-Ke Shih static u8 halbtc_get_ant_det_val_from_bt(void *btc_context)
1129b2283dadSPing-Ke Shih {
1130b2283dadSPing-Ke Shih 	struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context;
1131b2283dadSPing-Ke Shih 	u8 cmd_buffer[4] = {0};
1132b2283dadSPing-Ke Shih 
1133b2283dadSPing-Ke Shih 	/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */
1134b2283dadSPing-Ke Shih 	halbtc_send_bt_mp_operation(btcoexist, BT_OP_GET_BT_ANT_DET_VAL,
1135b2283dadSPing-Ke Shih 				    cmd_buffer, 4, 200);
1136b2283dadSPing-Ke Shih 
1137b2283dadSPing-Ke Shih 	/* need wait completion to return correct value */
1138b2283dadSPing-Ke Shih 
1139b2283dadSPing-Ke Shih 	return btcoexist->bt_info.bt_ant_det_val;
1140b2283dadSPing-Ke Shih }
1141b2283dadSPing-Ke Shih 
halbtc_get_ble_scan_type_from_bt(void * btc_context)1142b2283dadSPing-Ke Shih static u8 halbtc_get_ble_scan_type_from_bt(void *btc_context)
1143b2283dadSPing-Ke Shih {
1144b2283dadSPing-Ke Shih 	struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context;
1145b2283dadSPing-Ke Shih 	u8 cmd_buffer[4] = {0};
1146b2283dadSPing-Ke Shih 
1147b2283dadSPing-Ke Shih 	/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */
1148b2283dadSPing-Ke Shih 	halbtc_send_bt_mp_operation(btcoexist, BT_OP_GET_BT_BLE_SCAN_TYPE,
1149b2283dadSPing-Ke Shih 				    cmd_buffer, 4, 200);
1150b2283dadSPing-Ke Shih 
1151b2283dadSPing-Ke Shih 	/* need wait completion to return correct value */
1152b2283dadSPing-Ke Shih 
1153b2283dadSPing-Ke Shih 	return btcoexist->bt_info.bt_ble_scan_type;
1154b2283dadSPing-Ke Shih }
1155b2283dadSPing-Ke Shih 
halbtc_get_ble_scan_para_from_bt(void * btc_context,u8 scan_type)1156b2283dadSPing-Ke Shih static u32 halbtc_get_ble_scan_para_from_bt(void *btc_context, u8 scan_type)
1157b2283dadSPing-Ke Shih {
1158b2283dadSPing-Ke Shih 	struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context;
1159b2283dadSPing-Ke Shih 	u8 cmd_buffer[4] = {0};
1160b2283dadSPing-Ke Shih 
1161b2283dadSPing-Ke Shih 	/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */
1162b2283dadSPing-Ke Shih 	halbtc_send_bt_mp_operation(btcoexist, BT_OP_GET_BT_BLE_SCAN_PARA,
1163b2283dadSPing-Ke Shih 				    cmd_buffer, 4, 200);
1164b2283dadSPing-Ke Shih 
1165b2283dadSPing-Ke Shih 	/* need wait completion to return correct value */
1166b2283dadSPing-Ke Shih 
1167b2283dadSPing-Ke Shih 	return btcoexist->bt_info.bt_ble_scan_para;
1168b2283dadSPing-Ke Shih }
1169b2283dadSPing-Ke Shih 
halbtc_get_bt_afh_map_from_bt(void * btc_context,u8 map_type,u8 * afh_map)1170b2283dadSPing-Ke Shih static bool halbtc_get_bt_afh_map_from_bt(void *btc_context, u8 map_type,
1171b2283dadSPing-Ke Shih 					  u8 *afh_map)
1172b2283dadSPing-Ke Shih {
1173b2283dadSPing-Ke Shih 	struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context;
1174b2283dadSPing-Ke Shih 	u8 cmd_buffer[2] = {0};
1175b2283dadSPing-Ke Shih 	bool ret;
1176b2283dadSPing-Ke Shih 	u32 *afh_map_l = (u32 *)afh_map;
1177b2283dadSPing-Ke Shih 	u32 *afh_map_m = (u32 *)(afh_map + 4);
1178b2283dadSPing-Ke Shih 	u16 *afh_map_h = (u16 *)(afh_map + 8);
1179b2283dadSPing-Ke Shih 
1180b2283dadSPing-Ke Shih 	/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */
1181b2283dadSPing-Ke Shih 	ret = halbtc_send_bt_mp_operation(btcoexist, BT_OP_GET_AFH_MAP_L,
1182b2283dadSPing-Ke Shih 					  cmd_buffer, 2, 200);
1183b2283dadSPing-Ke Shih 	if (!ret)
1184b2283dadSPing-Ke Shih 		goto exit;
1185b2283dadSPing-Ke Shih 
1186b2283dadSPing-Ke Shih 	*afh_map_l = btcoexist->bt_info.afh_map_l;
1187b2283dadSPing-Ke Shih 
1188b2283dadSPing-Ke Shih 	/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */
1189b2283dadSPing-Ke Shih 	ret = halbtc_send_bt_mp_operation(btcoexist, BT_OP_GET_AFH_MAP_M,
1190b2283dadSPing-Ke Shih 					  cmd_buffer, 2, 200);
1191b2283dadSPing-Ke Shih 	if (!ret)
1192b2283dadSPing-Ke Shih 		goto exit;
1193b2283dadSPing-Ke Shih 
1194b2283dadSPing-Ke Shih 	*afh_map_m = btcoexist->bt_info.afh_map_m;
1195b2283dadSPing-Ke Shih 
1196b2283dadSPing-Ke Shih 	/* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */
1197b2283dadSPing-Ke Shih 	ret = halbtc_send_bt_mp_operation(btcoexist, BT_OP_GET_AFH_MAP_H,
1198b2283dadSPing-Ke Shih 					  cmd_buffer, 2, 200);
1199b2283dadSPing-Ke Shih 	if (!ret)
1200b2283dadSPing-Ke Shih 		goto exit;
1201b2283dadSPing-Ke Shih 
1202b2283dadSPing-Ke Shih 	*afh_map_h = btcoexist->bt_info.afh_map_h;
1203b2283dadSPing-Ke Shih 
1204b2283dadSPing-Ke Shih exit:
1205b2283dadSPing-Ke Shih 	return ret;
1206b2283dadSPing-Ke Shih }
1207b2283dadSPing-Ke Shih 
1208f1d2b4d3SLarry Finger /*****************************************************************
1209f1d2b4d3SLarry Finger  *         Extern functions called by other module
1210f1d2b4d3SLarry Finger  *****************************************************************/
exhalbtc_initlize_variables(struct rtl_priv * rtlpriv)121140d9dd4fSPing-Ke Shih bool exhalbtc_initlize_variables(struct rtl_priv *rtlpriv)
1212f1d2b4d3SLarry Finger {
121340d9dd4fSPing-Ke Shih 	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
121440d9dd4fSPing-Ke Shih 
121540d9dd4fSPing-Ke Shih 	if (!btcoexist)
121640d9dd4fSPing-Ke Shih 		return false;
1217f1d2b4d3SLarry Finger 
1218f1d2b4d3SLarry Finger 	halbtc_dbg_init();
1219f1d2b4d3SLarry Finger 
1220f1d2b4d3SLarry Finger 	btcoexist->btc_read_1byte = halbtc_read_1byte;
1221f1d2b4d3SLarry Finger 	btcoexist->btc_write_1byte = halbtc_write_1byte;
1222f1d2b4d3SLarry Finger 	btcoexist->btc_write_1byte_bitmask = halbtc_bitmask_write_1byte;
1223f1d2b4d3SLarry Finger 	btcoexist->btc_read_2byte = halbtc_read_2byte;
1224f1d2b4d3SLarry Finger 	btcoexist->btc_write_2byte = halbtc_write_2byte;
1225f1d2b4d3SLarry Finger 	btcoexist->btc_read_4byte = halbtc_read_4byte;
1226f1d2b4d3SLarry Finger 	btcoexist->btc_write_4byte = halbtc_write_4byte;
1227c42ea613SYan-Hsuan Chuang 	btcoexist->btc_write_local_reg_1byte = halbtc_write_local_reg_1byte;
1228f1d2b4d3SLarry Finger 
1229f1d2b4d3SLarry Finger 	btcoexist->btc_set_bb_reg = halbtc_set_bbreg;
1230f1d2b4d3SLarry Finger 	btcoexist->btc_get_bb_reg = halbtc_get_bbreg;
1231f1d2b4d3SLarry Finger 
1232f1d2b4d3SLarry Finger 	btcoexist->btc_set_rf_reg = halbtc_set_rfreg;
1233f1d2b4d3SLarry Finger 	btcoexist->btc_get_rf_reg = halbtc_get_rfreg;
1234f1d2b4d3SLarry Finger 
1235f1d2b4d3SLarry Finger 	btcoexist->btc_fill_h2c = halbtc_fill_h2c_cmd;
123608431b62SPing-Ke Shih 	btcoexist->btc_disp_dbg_msg = halbtc_display_dbg_msg;
1237f1d2b4d3SLarry Finger 
1238f1d2b4d3SLarry Finger 	btcoexist->btc_get = halbtc_get;
1239f1d2b4d3SLarry Finger 	btcoexist->btc_set = halbtc_set;
1240c42ea613SYan-Hsuan Chuang 	btcoexist->btc_set_bt_reg = halbtc_set_bt_reg;
1241c3788947SPing-Ke Shih 	btcoexist->btc_get_bt_reg = halbtc_get_bt_reg;
1242c42ea613SYan-Hsuan Chuang 
1243f1d2b4d3SLarry Finger 	btcoexist->bt_info.bt_ctrl_buf_size = false;
1244f1d2b4d3SLarry Finger 	btcoexist->bt_info.agg_buf_size = 5;
1245f1d2b4d3SLarry Finger 
1246f1d2b4d3SLarry Finger 	btcoexist->bt_info.increase_scan_dev_num = false;
1247b2283dadSPing-Ke Shih 
1248b2283dadSPing-Ke Shih 	btcoexist->btc_get_bt_coex_supported_feature =
1249b2283dadSPing-Ke Shih 					halbtc_get_bt_coex_supported_feature;
1250b2283dadSPing-Ke Shih 	btcoexist->btc_get_bt_coex_supported_version =
1251b2283dadSPing-Ke Shih 					halbtc_get_bt_coex_supported_version;
12527fd34dc4SPing-Ke Shih 	btcoexist->btc_get_bt_phydm_version = halbtc_get_phydm_version;
12537fd34dc4SPing-Ke Shih 	btcoexist->btc_phydm_modify_ra_pcr_threshold =
12547fd34dc4SPing-Ke Shih 					halbtc_phydm_modify_ra_pcr_threshold;
12557fd34dc4SPing-Ke Shih 	btcoexist->btc_phydm_query_phy_counter = halbtc_phydm_query_phy_counter;
1256b2283dadSPing-Ke Shih 	btcoexist->btc_get_ant_det_val_from_bt = halbtc_get_ant_det_val_from_bt;
1257b2283dadSPing-Ke Shih 	btcoexist->btc_get_ble_scan_type_from_bt =
1258b2283dadSPing-Ke Shih 					halbtc_get_ble_scan_type_from_bt;
1259b2283dadSPing-Ke Shih 	btcoexist->btc_get_ble_scan_para_from_bt =
1260b2283dadSPing-Ke Shih 					halbtc_get_ble_scan_para_from_bt;
1261b2283dadSPing-Ke Shih 	btcoexist->btc_get_bt_afh_map_from_bt =
1262b2283dadSPing-Ke Shih 					halbtc_get_bt_afh_map_from_bt;
1263b2283dadSPing-Ke Shih 
1264b2283dadSPing-Ke Shih 	init_completion(&btcoexist->bt_mp_comp);
1265b2283dadSPing-Ke Shih 
1266f1d2b4d3SLarry Finger 	return true;
1267f1d2b4d3SLarry Finger }
1268f1d2b4d3SLarry Finger 
exhalbtc_initlize_variables_wifi_only(struct rtl_priv * rtlpriv)12699177c336SPing-Ke Shih bool exhalbtc_initlize_variables_wifi_only(struct rtl_priv *rtlpriv)
12709177c336SPing-Ke Shih {
12719177c336SPing-Ke Shih 	struct wifi_only_cfg *wifionly_cfg = rtl_btc_wifi_only(rtlpriv);
12729177c336SPing-Ke Shih 	struct wifi_only_haldata *wifionly_haldata;
12739177c336SPing-Ke Shih 
12749177c336SPing-Ke Shih 	if (!wifionly_cfg)
12759177c336SPing-Ke Shih 		return false;
12769177c336SPing-Ke Shih 
12779177c336SPing-Ke Shih 	wifionly_cfg->adapter = rtlpriv;
12789177c336SPing-Ke Shih 
12799177c336SPing-Ke Shih 	switch (rtlpriv->rtlhal.interface) {
12809177c336SPing-Ke Shih 	case INTF_PCI:
128131138a82SNathan Chancellor 		wifionly_cfg->chip_interface = WIFIONLY_INTF_PCI;
12829177c336SPing-Ke Shih 		break;
12839177c336SPing-Ke Shih 	case INTF_USB:
128431138a82SNathan Chancellor 		wifionly_cfg->chip_interface = WIFIONLY_INTF_USB;
12859177c336SPing-Ke Shih 		break;
12869177c336SPing-Ke Shih 	default:
128731138a82SNathan Chancellor 		wifionly_cfg->chip_interface = WIFIONLY_INTF_UNKNOWN;
12889177c336SPing-Ke Shih 		break;
12899177c336SPing-Ke Shih 	}
12909177c336SPing-Ke Shih 
12919177c336SPing-Ke Shih 	wifionly_haldata = &wifionly_cfg->haldata_info;
12929177c336SPing-Ke Shih 
12939177c336SPing-Ke Shih 	wifionly_haldata->customer_id = CUSTOMER_NORMAL;
12949177c336SPing-Ke Shih 	wifionly_haldata->efuse_pg_antnum = rtl_get_hwpg_ant_num(rtlpriv);
12959177c336SPing-Ke Shih 	wifionly_haldata->efuse_pg_antpath =
12969177c336SPing-Ke Shih 					rtl_get_hwpg_single_ant_path(rtlpriv);
12979177c336SPing-Ke Shih 	wifionly_haldata->rfe_type = rtl_get_hwpg_rfe_type(rtlpriv);
12989177c336SPing-Ke Shih 	wifionly_haldata->ant_div_cfg = 0;
12999177c336SPing-Ke Shih 
13009177c336SPing-Ke Shih 	return true;
13019177c336SPing-Ke Shih }
13029177c336SPing-Ke Shih 
exhalbtc_bind_bt_coex_withadapter(void * adapter)13030199103eSYan-Hsuan Chuang bool exhalbtc_bind_bt_coex_withadapter(void *adapter)
13040199103eSYan-Hsuan Chuang {
13050199103eSYan-Hsuan Chuang 	struct rtl_priv *rtlpriv = adapter;
130640d9dd4fSPing-Ke Shih 	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
130756b06d4dSColin Ian King 	u8 ant_num, chip_type, single_ant_path;
130840d9dd4fSPing-Ke Shih 
130940d9dd4fSPing-Ke Shih 	if (!btcoexist)
131040d9dd4fSPing-Ke Shih 		return false;
13110199103eSYan-Hsuan Chuang 
13120199103eSYan-Hsuan Chuang 	if (btcoexist->binded)
13130199103eSYan-Hsuan Chuang 		return false;
13140199103eSYan-Hsuan Chuang 
131543f5644aSPing-Ke Shih 	switch (rtlpriv->rtlhal.interface) {
131643f5644aSPing-Ke Shih 	case INTF_PCI:
131743f5644aSPing-Ke Shih 		btcoexist->chip_interface = BTC_INTF_PCI;
131843f5644aSPing-Ke Shih 		break;
131943f5644aSPing-Ke Shih 	case INTF_USB:
132043f5644aSPing-Ke Shih 		btcoexist->chip_interface = BTC_INTF_USB;
132143f5644aSPing-Ke Shih 		break;
132243f5644aSPing-Ke Shih 	default:
132343f5644aSPing-Ke Shih 		btcoexist->chip_interface = BTC_INTF_UNKNOWN;
132443f5644aSPing-Ke Shih 		break;
132543f5644aSPing-Ke Shih 	}
132643f5644aSPing-Ke Shih 
13270199103eSYan-Hsuan Chuang 	btcoexist->binded = true;
13280199103eSYan-Hsuan Chuang 	btcoexist->statistics.cnt_bind++;
13290199103eSYan-Hsuan Chuang 
13300199103eSYan-Hsuan Chuang 	btcoexist->adapter = adapter;
13310199103eSYan-Hsuan Chuang 
13320199103eSYan-Hsuan Chuang 	btcoexist->stack_info.profile_notified = false;
13330199103eSYan-Hsuan Chuang 
13340199103eSYan-Hsuan Chuang 	btcoexist->bt_info.bt_ctrl_agg_buf_size = false;
13350199103eSYan-Hsuan Chuang 	btcoexist->bt_info.agg_buf_size = 5;
13360199103eSYan-Hsuan Chuang 
13370199103eSYan-Hsuan Chuang 	btcoexist->bt_info.increase_scan_dev_num = false;
13380199103eSYan-Hsuan Chuang 	btcoexist->bt_info.miracast_plus_bt = false;
13390199103eSYan-Hsuan Chuang 
13400199103eSYan-Hsuan Chuang 	chip_type = rtl_get_hwpg_bt_type(rtlpriv);
134140d9dd4fSPing-Ke Shih 	exhalbtc_set_chip_type(btcoexist, chip_type);
13420199103eSYan-Hsuan Chuang 	ant_num = rtl_get_hwpg_ant_num(rtlpriv);
13430199103eSYan-Hsuan Chuang 	exhalbtc_set_ant_num(rtlpriv, BT_COEX_ANT_TYPE_PG, ant_num);
13440199103eSYan-Hsuan Chuang 
134540d9dd4fSPing-Ke Shih 	/* set default antenna position to main  port */
134640d9dd4fSPing-Ke Shih 	btcoexist->board_info.btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
134740d9dd4fSPing-Ke Shih 
134840d9dd4fSPing-Ke Shih 	single_ant_path = rtl_get_hwpg_single_ant_path(rtlpriv);
134940d9dd4fSPing-Ke Shih 	exhalbtc_set_single_ant_path(btcoexist, single_ant_path);
135040d9dd4fSPing-Ke Shih 
13510199103eSYan-Hsuan Chuang 	if (rtl_get_hwpg_package_type(rtlpriv) == 0)
13520199103eSYan-Hsuan Chuang 		btcoexist->board_info.tfbga_package = false;
13530199103eSYan-Hsuan Chuang 	else if (rtl_get_hwpg_package_type(rtlpriv) == 1)
13540199103eSYan-Hsuan Chuang 		btcoexist->board_info.tfbga_package = false;
13550199103eSYan-Hsuan Chuang 	else
13560199103eSYan-Hsuan Chuang 		btcoexist->board_info.tfbga_package = true;
13570199103eSYan-Hsuan Chuang 
13580199103eSYan-Hsuan Chuang 	if (btcoexist->board_info.tfbga_package)
1359c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
13600199103eSYan-Hsuan Chuang 			"[BTCoex], Package Type = TFBGA\n");
13610199103eSYan-Hsuan Chuang 	else
1362c8159c3fSLarry Finger 		rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
13630199103eSYan-Hsuan Chuang 			"[BTCoex], Package Type = Non-TFBGA\n");
13640199103eSYan-Hsuan Chuang 
1365188b6b09SPing-Ke Shih 	btcoexist->board_info.rfe_type = rtl_get_hwpg_rfe_type(rtlpriv);
1366f243bca1SPing-Ke Shih 	btcoexist->board_info.ant_div_cfg = 0;
1367188b6b09SPing-Ke Shih 
13680199103eSYan-Hsuan Chuang 	return true;
13690199103eSYan-Hsuan Chuang }
13700199103eSYan-Hsuan Chuang 
exhalbtc_power_on_setting(struct btc_coexist * btcoexist)137160f44100SYan-Hsuan Chuang void exhalbtc_power_on_setting(struct btc_coexist *btcoexist)
137260f44100SYan-Hsuan Chuang {
137360f44100SYan-Hsuan Chuang 	if (!halbtc_is_bt_coexist_available(btcoexist))
137460f44100SYan-Hsuan Chuang 		return;
137560f44100SYan-Hsuan Chuang 
137660f44100SYan-Hsuan Chuang 	btcoexist->statistics.cnt_power_on++;
137760f44100SYan-Hsuan Chuang 
137860f44100SYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
137960f44100SYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
138060f44100SYan-Hsuan Chuang 			ex_btc8723b2ant_power_on_setting(btcoexist);
138160f44100SYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
138260f44100SYan-Hsuan Chuang 			ex_btc8723b1ant_power_on_setting(btcoexist);
138360f44100SYan-Hsuan Chuang 	}
138460f44100SYan-Hsuan Chuang }
138560f44100SYan-Hsuan Chuang 
exhalbtc_pre_load_firmware(struct btc_coexist * btcoexist)13866fbbc82aSYan-Hsuan Chuang void exhalbtc_pre_load_firmware(struct btc_coexist *btcoexist)
13876fbbc82aSYan-Hsuan Chuang {
13886fbbc82aSYan-Hsuan Chuang 	if (!halbtc_is_bt_coexist_available(btcoexist))
13896fbbc82aSYan-Hsuan Chuang 		return;
13906fbbc82aSYan-Hsuan Chuang 
13916fbbc82aSYan-Hsuan Chuang 	btcoexist->statistics.cnt_pre_load_firmware++;
13926fbbc82aSYan-Hsuan Chuang 
13936fbbc82aSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
13946fbbc82aSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
13956fbbc82aSYan-Hsuan Chuang 			ex_btc8723b2ant_pre_load_firmware(btcoexist);
13966fbbc82aSYan-Hsuan Chuang 	}
13976fbbc82aSYan-Hsuan Chuang }
13986fbbc82aSYan-Hsuan Chuang 
exhalbtc_init_hw_config(struct btc_coexist * btcoexist,bool wifi_only)139943f5644aSPing-Ke Shih void exhalbtc_init_hw_config(struct btc_coexist *btcoexist, bool wifi_only)
1400f1d2b4d3SLarry Finger {
1401f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1402f1d2b4d3SLarry Finger 		return;
1403f1d2b4d3SLarry Finger 
1404f1d2b4d3SLarry Finger 	btcoexist->statistics.cnt_init_hw_config++;
1405f1d2b4d3SLarry Finger 
14067937f02dSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) {
14077937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
14087937f02dSYan-Hsuan Chuang 			ex_btc8821a2ant_init_hwconfig(btcoexist);
14097937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
14107937f02dSYan-Hsuan Chuang 			ex_btc8821a1ant_init_hwconfig(btcoexist, wifi_only);
14117937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
14127937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
1413f1d2b4d3SLarry Finger 			ex_btc8723b2ant_init_hwconfig(btcoexist);
14147937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
14157937f02dSYan-Hsuan Chuang 			ex_btc8723b1ant_init_hwconfig(btcoexist, wifi_only);
14167937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8723A(btcoexist->adapter)) {
14177937f02dSYan-Hsuan Chuang 		/* 8723A has no this function */
14187937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) {
14197937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
14207937f02dSYan-Hsuan Chuang 			ex_btc8192e2ant_init_hwconfig(btcoexist);
14217937f02dSYan-Hsuan Chuang 	}
1422f1d2b4d3SLarry Finger }
1423f1d2b4d3SLarry Finger 
exhalbtc_init_hw_config_wifi_only(struct wifi_only_cfg * wifionly_cfg)14249177c336SPing-Ke Shih void exhalbtc_init_hw_config_wifi_only(struct wifi_only_cfg *wifionly_cfg)
14259177c336SPing-Ke Shih {
14269177c336SPing-Ke Shih }
14279177c336SPing-Ke Shih 
exhalbtc_init_coex_dm(struct btc_coexist * btcoexist)1428f1d2b4d3SLarry Finger void exhalbtc_init_coex_dm(struct btc_coexist *btcoexist)
1429f1d2b4d3SLarry Finger {
1430f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1431f1d2b4d3SLarry Finger 		return;
1432f1d2b4d3SLarry Finger 
1433f1d2b4d3SLarry Finger 	btcoexist->statistics.cnt_init_coex_dm++;
1434f1d2b4d3SLarry Finger 
14357937f02dSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) {
14367937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
14377937f02dSYan-Hsuan Chuang 			ex_btc8821a2ant_init_coex_dm(btcoexist);
14387937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
14397937f02dSYan-Hsuan Chuang 			ex_btc8821a1ant_init_coex_dm(btcoexist);
14407937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
14417937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
1442f1d2b4d3SLarry Finger 			ex_btc8723b2ant_init_coex_dm(btcoexist);
14437937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
14447937f02dSYan-Hsuan Chuang 			ex_btc8723b1ant_init_coex_dm(btcoexist);
14457937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) {
14467937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
14477937f02dSYan-Hsuan Chuang 			ex_btc8192e2ant_init_coex_dm(btcoexist);
14487937f02dSYan-Hsuan Chuang 	}
1449f1d2b4d3SLarry Finger 
1450f76c3408SColin Ian King 	btcoexist->initialized = true;
1451f1d2b4d3SLarry Finger }
1452f1d2b4d3SLarry Finger 
exhalbtc_ips_notify(struct btc_coexist * btcoexist,u8 type)1453f1d2b4d3SLarry Finger void exhalbtc_ips_notify(struct btc_coexist *btcoexist, u8 type)
1454f1d2b4d3SLarry Finger {
1455f1d2b4d3SLarry Finger 	u8 ips_type;
1456f1d2b4d3SLarry Finger 
1457f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1458f1d2b4d3SLarry Finger 		return;
1459f1d2b4d3SLarry Finger 	btcoexist->statistics.cnt_ips_notify++;
1460f1d2b4d3SLarry Finger 	if (btcoexist->manual_control)
1461f1d2b4d3SLarry Finger 		return;
1462f1d2b4d3SLarry Finger 
1463f1d2b4d3SLarry Finger 	if (ERFOFF == type)
1464f1d2b4d3SLarry Finger 		ips_type = BTC_IPS_ENTER;
1465f1d2b4d3SLarry Finger 	else
1466f1d2b4d3SLarry Finger 		ips_type = BTC_IPS_LEAVE;
1467f1d2b4d3SLarry Finger 
14687937f02dSYan-Hsuan Chuang 	halbtc_leave_low_power(btcoexist);
1469f1d2b4d3SLarry Finger 
14707937f02dSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) {
14717937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
14727937f02dSYan-Hsuan Chuang 			ex_btc8821a2ant_ips_notify(btcoexist, ips_type);
14737937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
14747937f02dSYan-Hsuan Chuang 			ex_btc8821a1ant_ips_notify(btcoexist, ips_type);
14757937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
14767937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
1477f1d2b4d3SLarry Finger 			ex_btc8723b2ant_ips_notify(btcoexist, ips_type);
14787937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
14797937f02dSYan-Hsuan Chuang 			ex_btc8723b1ant_ips_notify(btcoexist, ips_type);
14807937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) {
14817937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
14827937f02dSYan-Hsuan Chuang 			ex_btc8192e2ant_ips_notify(btcoexist, ips_type);
14837937f02dSYan-Hsuan Chuang 	}
1484f1d2b4d3SLarry Finger 
14857937f02dSYan-Hsuan Chuang 	halbtc_normal_low_power(btcoexist);
1486f1d2b4d3SLarry Finger }
1487f1d2b4d3SLarry Finger 
exhalbtc_lps_notify(struct btc_coexist * btcoexist,u8 type)1488f1d2b4d3SLarry Finger void exhalbtc_lps_notify(struct btc_coexist *btcoexist, u8 type)
1489f1d2b4d3SLarry Finger {
1490f1d2b4d3SLarry Finger 	u8 lps_type;
1491f1d2b4d3SLarry Finger 
1492f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1493f1d2b4d3SLarry Finger 		return;
1494f1d2b4d3SLarry Finger 	btcoexist->statistics.cnt_lps_notify++;
1495f1d2b4d3SLarry Finger 	if (btcoexist->manual_control)
1496f1d2b4d3SLarry Finger 		return;
1497f1d2b4d3SLarry Finger 
1498f1d2b4d3SLarry Finger 	if (EACTIVE == type)
1499f1d2b4d3SLarry Finger 		lps_type = BTC_LPS_DISABLE;
1500f1d2b4d3SLarry Finger 	else
1501f1d2b4d3SLarry Finger 		lps_type = BTC_LPS_ENABLE;
1502f1d2b4d3SLarry Finger 
15037937f02dSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) {
15047937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
15057937f02dSYan-Hsuan Chuang 			ex_btc8821a2ant_lps_notify(btcoexist, lps_type);
15067937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
15077937f02dSYan-Hsuan Chuang 			ex_btc8821a1ant_lps_notify(btcoexist, lps_type);
15087937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
15097937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
1510f1d2b4d3SLarry Finger 			ex_btc8723b2ant_lps_notify(btcoexist, lps_type);
15117937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
15127937f02dSYan-Hsuan Chuang 			ex_btc8723b1ant_lps_notify(btcoexist, lps_type);
15137937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) {
15147937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
15157937f02dSYan-Hsuan Chuang 			ex_btc8192e2ant_lps_notify(btcoexist, lps_type);
15167937f02dSYan-Hsuan Chuang 	}
1517f1d2b4d3SLarry Finger }
1518f1d2b4d3SLarry Finger 
exhalbtc_scan_notify(struct btc_coexist * btcoexist,u8 type)1519f1d2b4d3SLarry Finger void exhalbtc_scan_notify(struct btc_coexist *btcoexist, u8 type)
1520f1d2b4d3SLarry Finger {
1521f1d2b4d3SLarry Finger 	u8 scan_type;
1522f1d2b4d3SLarry Finger 
1523f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1524f1d2b4d3SLarry Finger 		return;
1525f1d2b4d3SLarry Finger 	btcoexist->statistics.cnt_scan_notify++;
1526f1d2b4d3SLarry Finger 	if (btcoexist->manual_control)
1527f1d2b4d3SLarry Finger 		return;
1528f1d2b4d3SLarry Finger 
1529f1d2b4d3SLarry Finger 	if (type)
1530f1d2b4d3SLarry Finger 		scan_type = BTC_SCAN_START;
1531f1d2b4d3SLarry Finger 	else
1532f1d2b4d3SLarry Finger 		scan_type = BTC_SCAN_FINISH;
1533f1d2b4d3SLarry Finger 
15347937f02dSYan-Hsuan Chuang 	halbtc_leave_low_power(btcoexist);
1535f1d2b4d3SLarry Finger 
15367937f02dSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) {
15377937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
15387937f02dSYan-Hsuan Chuang 			ex_btc8821a2ant_scan_notify(btcoexist, scan_type);
15397937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
15407937f02dSYan-Hsuan Chuang 			ex_btc8821a1ant_scan_notify(btcoexist, scan_type);
15417937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
15427937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
1543f1d2b4d3SLarry Finger 			ex_btc8723b2ant_scan_notify(btcoexist, scan_type);
15447937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
15457937f02dSYan-Hsuan Chuang 			ex_btc8723b1ant_scan_notify(btcoexist, scan_type);
15467937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) {
15477937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
15487937f02dSYan-Hsuan Chuang 			ex_btc8192e2ant_scan_notify(btcoexist, scan_type);
15497937f02dSYan-Hsuan Chuang 	}
1550f1d2b4d3SLarry Finger 
15517937f02dSYan-Hsuan Chuang 	halbtc_normal_low_power(btcoexist);
1552f1d2b4d3SLarry Finger }
1553f1d2b4d3SLarry Finger 
exhalbtc_scan_notify_wifi_only(struct wifi_only_cfg * wifionly_cfg,u8 is_5g)15549177c336SPing-Ke Shih void exhalbtc_scan_notify_wifi_only(struct wifi_only_cfg *wifionly_cfg,
15559177c336SPing-Ke Shih 				    u8 is_5g)
15569177c336SPing-Ke Shih {
15579177c336SPing-Ke Shih }
15589177c336SPing-Ke Shih 
exhalbtc_connect_notify(struct btc_coexist * btcoexist,u8 action)1559f1d2b4d3SLarry Finger void exhalbtc_connect_notify(struct btc_coexist *btcoexist, u8 action)
1560f1d2b4d3SLarry Finger {
1561d477a485SYueHaibing 	u8 asso_type;
15620843e98aSPing-Ke Shih 	bool wifi_under_5g;
1563f1d2b4d3SLarry Finger 
1564f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1565f1d2b4d3SLarry Finger 		return;
1566f1d2b4d3SLarry Finger 	btcoexist->statistics.cnt_connect_notify++;
1567f1d2b4d3SLarry Finger 	if (btcoexist->manual_control)
1568f1d2b4d3SLarry Finger 		return;
1569f1d2b4d3SLarry Finger 
15700843e98aSPing-Ke Shih 	btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
15710843e98aSPing-Ke Shih 
1572d477a485SYueHaibing 	if (action)
1573f1d2b4d3SLarry Finger 		asso_type = BTC_ASSOCIATE_START;
1574d477a485SYueHaibing 	else
1575f1d2b4d3SLarry Finger 		asso_type = BTC_ASSOCIATE_FINISH;
1576f1d2b4d3SLarry Finger 
15777937f02dSYan-Hsuan Chuang 	halbtc_leave_low_power(btcoexist);
1578f1d2b4d3SLarry Finger 
15797937f02dSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) {
15807937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
15817937f02dSYan-Hsuan Chuang 			ex_btc8821a2ant_connect_notify(btcoexist, asso_type);
15827937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
15837937f02dSYan-Hsuan Chuang 			ex_btc8821a1ant_connect_notify(btcoexist, asso_type);
15847937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
15857937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
1586f1d2b4d3SLarry Finger 			ex_btc8723b2ant_connect_notify(btcoexist, asso_type);
15877937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
15887937f02dSYan-Hsuan Chuang 			ex_btc8723b1ant_connect_notify(btcoexist, asso_type);
15897937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) {
15907937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
15917937f02dSYan-Hsuan Chuang 			ex_btc8192e2ant_connect_notify(btcoexist, asso_type);
15927937f02dSYan-Hsuan Chuang 	}
15937937f02dSYan-Hsuan Chuang 
15947937f02dSYan-Hsuan Chuang 	halbtc_normal_low_power(btcoexist);
1595f1d2b4d3SLarry Finger }
1596f1d2b4d3SLarry Finger 
exhalbtc_mediastatus_notify(struct btc_coexist * btcoexist,enum rt_media_status media_status)1597f1d2b4d3SLarry Finger void exhalbtc_mediastatus_notify(struct btc_coexist *btcoexist,
1598f1d2b4d3SLarry Finger 				 enum rt_media_status media_status)
1599f1d2b4d3SLarry Finger {
1600f1d2b4d3SLarry Finger 	u8 status;
1601f1d2b4d3SLarry Finger 
1602f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1603f1d2b4d3SLarry Finger 		return;
1604f1d2b4d3SLarry Finger 	btcoexist->statistics.cnt_media_status_notify++;
1605f1d2b4d3SLarry Finger 	if (btcoexist->manual_control)
1606f1d2b4d3SLarry Finger 		return;
1607f1d2b4d3SLarry Finger 
1608f1d2b4d3SLarry Finger 	if (RT_MEDIA_CONNECT == media_status)
1609f1d2b4d3SLarry Finger 		status = BTC_MEDIA_CONNECT;
1610f1d2b4d3SLarry Finger 	else
1611f1d2b4d3SLarry Finger 		status = BTC_MEDIA_DISCONNECT;
1612f1d2b4d3SLarry Finger 
16137937f02dSYan-Hsuan Chuang 	halbtc_leave_low_power(btcoexist);
1614f1d2b4d3SLarry Finger 
16157937f02dSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) {
16167937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
16177937f02dSYan-Hsuan Chuang 			ex_btc8821a2ant_media_status_notify(btcoexist, status);
16187937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
16197937f02dSYan-Hsuan Chuang 			ex_btc8821a1ant_media_status_notify(btcoexist, status);
16207937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
16217937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
16227937f02dSYan-Hsuan Chuang 			ex_btc8723b2ant_media_status_notify(btcoexist, status);
16237937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
16247937f02dSYan-Hsuan Chuang 			ex_btc8723b1ant_media_status_notify(btcoexist, status);
16257937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) {
16267937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
16277937f02dSYan-Hsuan Chuang 			ex_btc8192e2ant_media_status_notify(btcoexist, status);
16287937f02dSYan-Hsuan Chuang 	}
16297937f02dSYan-Hsuan Chuang 
16307937f02dSYan-Hsuan Chuang 	halbtc_normal_low_power(btcoexist);
1631f1d2b4d3SLarry Finger }
1632f1d2b4d3SLarry Finger 
exhalbtc_special_packet_notify(struct btc_coexist * btcoexist,u8 pkt_type)1633f1d2b4d3SLarry Finger void exhalbtc_special_packet_notify(struct btc_coexist *btcoexist, u8 pkt_type)
1634f1d2b4d3SLarry Finger {
1635f1d2b4d3SLarry Finger 	u8 packet_type;
1636f1d2b4d3SLarry Finger 
1637f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1638f1d2b4d3SLarry Finger 		return;
1639f1d2b4d3SLarry Finger 	btcoexist->statistics.cnt_special_packet_notify++;
1640f1d2b4d3SLarry Finger 	if (btcoexist->manual_control)
1641f1d2b4d3SLarry Finger 		return;
1642f1d2b4d3SLarry Finger 
16437937f02dSYan-Hsuan Chuang 	if (pkt_type == PACKET_DHCP) {
1644f1d2b4d3SLarry Finger 		packet_type = BTC_PACKET_DHCP;
16457937f02dSYan-Hsuan Chuang 	} else if (pkt_type == PACKET_EAPOL) {
16467937f02dSYan-Hsuan Chuang 		packet_type = BTC_PACKET_EAPOL;
16477937f02dSYan-Hsuan Chuang 	} else if (pkt_type == PACKET_ARP) {
16487937f02dSYan-Hsuan Chuang 		packet_type = BTC_PACKET_ARP;
16497937f02dSYan-Hsuan Chuang 	} else {
16507937f02dSYan-Hsuan Chuang 		packet_type = BTC_PACKET_UNKNOWN;
16517937f02dSYan-Hsuan Chuang 		return;
16527937f02dSYan-Hsuan Chuang 	}
1653f1d2b4d3SLarry Finger 
16547937f02dSYan-Hsuan Chuang 	halbtc_leave_low_power(btcoexist);
1655f1d2b4d3SLarry Finger 
16567937f02dSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) {
16577937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
16587937f02dSYan-Hsuan Chuang 			ex_btc8821a2ant_special_packet_notify(btcoexist,
16597937f02dSYan-Hsuan Chuang 							      packet_type);
16607937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
16617937f02dSYan-Hsuan Chuang 			ex_btc8821a1ant_special_packet_notify(btcoexist,
16627937f02dSYan-Hsuan Chuang 							      packet_type);
16637937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
16647937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
1665f1d2b4d3SLarry Finger 			ex_btc8723b2ant_special_packet_notify(btcoexist,
1666f1d2b4d3SLarry Finger 							      packet_type);
16677937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
16687937f02dSYan-Hsuan Chuang 			ex_btc8723b1ant_special_packet_notify(btcoexist,
16697937f02dSYan-Hsuan Chuang 							      packet_type);
16707937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) {
16717937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
16727937f02dSYan-Hsuan Chuang 			ex_btc8192e2ant_special_packet_notify(btcoexist,
16737937f02dSYan-Hsuan Chuang 							      packet_type);
16747937f02dSYan-Hsuan Chuang 	}
1675f1d2b4d3SLarry Finger 
16767937f02dSYan-Hsuan Chuang 	halbtc_normal_low_power(btcoexist);
1677f1d2b4d3SLarry Finger }
1678f1d2b4d3SLarry Finger 
exhalbtc_bt_info_notify(struct btc_coexist * btcoexist,u8 * tmp_buf,u8 length)1679f1d2b4d3SLarry Finger void exhalbtc_bt_info_notify(struct btc_coexist *btcoexist,
1680f1d2b4d3SLarry Finger 			     u8 *tmp_buf, u8 length)
1681f1d2b4d3SLarry Finger {
1682f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1683f1d2b4d3SLarry Finger 		return;
1684f1d2b4d3SLarry Finger 	btcoexist->statistics.cnt_bt_info_notify++;
1685f1d2b4d3SLarry Finger 
16867937f02dSYan-Hsuan Chuang 	halbtc_leave_low_power(btcoexist);
16877937f02dSYan-Hsuan Chuang 
16887937f02dSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) {
16897937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
16907937f02dSYan-Hsuan Chuang 			ex_btc8821a2ant_bt_info_notify(btcoexist, tmp_buf,
16917937f02dSYan-Hsuan Chuang 						       length);
16927937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
16937937f02dSYan-Hsuan Chuang 			ex_btc8821a1ant_bt_info_notify(btcoexist, tmp_buf,
16947937f02dSYan-Hsuan Chuang 						       length);
16957937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
16967937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
16977937f02dSYan-Hsuan Chuang 			ex_btc8723b2ant_bt_info_notify(btcoexist, tmp_buf,
16987937f02dSYan-Hsuan Chuang 						       length);
16997937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
17007937f02dSYan-Hsuan Chuang 			ex_btc8723b1ant_bt_info_notify(btcoexist, tmp_buf,
17017937f02dSYan-Hsuan Chuang 						       length);
17027937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) {
17037937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
17047937f02dSYan-Hsuan Chuang 			ex_btc8192e2ant_bt_info_notify(btcoexist, tmp_buf,
17057937f02dSYan-Hsuan Chuang 						       length);
17067937f02dSYan-Hsuan Chuang 	}
17077937f02dSYan-Hsuan Chuang 
17087937f02dSYan-Hsuan Chuang 	halbtc_normal_low_power(btcoexist);
17097937f02dSYan-Hsuan Chuang }
17107937f02dSYan-Hsuan Chuang 
exhalbtc_rf_status_notify(struct btc_coexist * btcoexist,u8 type)17117937f02dSYan-Hsuan Chuang void exhalbtc_rf_status_notify(struct btc_coexist *btcoexist, u8 type)
17127937f02dSYan-Hsuan Chuang {
17137937f02dSYan-Hsuan Chuang 	if (!halbtc_is_bt_coexist_available(btcoexist))
17147937f02dSYan-Hsuan Chuang 		return;
17157937f02dSYan-Hsuan Chuang 
17167937f02dSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) {
17177937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
17187937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 1)
17197937f02dSYan-Hsuan Chuang 			ex_btc8723b1ant_rf_status_notify(btcoexist, type);
17207937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) {
17217937f02dSYan-Hsuan Chuang 	}
1722f1d2b4d3SLarry Finger }
1723f1d2b4d3SLarry Finger 
exhalbtc_halt_notify(struct btc_coexist * btcoexist)1724f1d2b4d3SLarry Finger void exhalbtc_halt_notify(struct btc_coexist *btcoexist)
1725f1d2b4d3SLarry Finger {
1726f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1727f1d2b4d3SLarry Finger 		return;
1728f1d2b4d3SLarry Finger 
17297937f02dSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) {
17307937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
17317937f02dSYan-Hsuan Chuang 			ex_btc8821a2ant_halt_notify(btcoexist);
17327937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
17337937f02dSYan-Hsuan Chuang 			ex_btc8821a1ant_halt_notify(btcoexist);
17347937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
17357937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
1736f1d2b4d3SLarry Finger 			ex_btc8723b2ant_halt_notify(btcoexist);
17377937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
17387937f02dSYan-Hsuan Chuang 			ex_btc8723b1ant_halt_notify(btcoexist);
17397937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) {
17407937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
17417937f02dSYan-Hsuan Chuang 			ex_btc8192e2ant_halt_notify(btcoexist);
17427937f02dSYan-Hsuan Chuang 	}
17437937f02dSYan-Hsuan Chuang 
17447937f02dSYan-Hsuan Chuang 	btcoexist->binded = false;
1745f1d2b4d3SLarry Finger }
1746f1d2b4d3SLarry Finger 
exhalbtc_pnp_notify(struct btc_coexist * btcoexist,u8 pnp_state)1747f1d2b4d3SLarry Finger void exhalbtc_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
1748f1d2b4d3SLarry Finger {
1749f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1750f1d2b4d3SLarry Finger 		return;
175186f9ab2eSYan-Hsuan Chuang 
175286f9ab2eSYan-Hsuan Chuang 	/* currently only 1ant we have to do the notification,
175386f9ab2eSYan-Hsuan Chuang 	 * once pnp is notified to sleep state, we have to leave LPS that
175486f9ab2eSYan-Hsuan Chuang 	 * we can sleep normally.
175586f9ab2eSYan-Hsuan Chuang 	 */
175686f9ab2eSYan-Hsuan Chuang 
175786f9ab2eSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
175886f9ab2eSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 1)
175986f9ab2eSYan-Hsuan Chuang 			ex_btc8723b1ant_pnp_notify(btcoexist, pnp_state);
176086f9ab2eSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 2)
176186f9ab2eSYan-Hsuan Chuang 			ex_btc8723b2ant_pnp_notify(btcoexist, pnp_state);
176286f9ab2eSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) {
176386f9ab2eSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 1)
176486f9ab2eSYan-Hsuan Chuang 			ex_btc8821a1ant_pnp_notify(btcoexist, pnp_state);
176586f9ab2eSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 2)
176686f9ab2eSYan-Hsuan Chuang 			ex_btc8821a2ant_pnp_notify(btcoexist, pnp_state);
176786f9ab2eSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) {
176886f9ab2eSYan-Hsuan Chuang 	}
1769f1d2b4d3SLarry Finger }
1770f1d2b4d3SLarry Finger 
exhalbtc_coex_dm_switch(struct btc_coexist * btcoexist)17717937f02dSYan-Hsuan Chuang void exhalbtc_coex_dm_switch(struct btc_coexist *btcoexist)
1772f1d2b4d3SLarry Finger {
1773f1d2b4d3SLarry Finger 	struct rtl_priv *rtlpriv = btcoexist->adapter;
17747937f02dSYan-Hsuan Chuang 
17757937f02dSYan-Hsuan Chuang 	if (!halbtc_is_bt_coexist_available(btcoexist))
17767937f02dSYan-Hsuan Chuang 		return;
17777937f02dSYan-Hsuan Chuang 	btcoexist->statistics.cnt_coex_dm_switch++;
17787937f02dSYan-Hsuan Chuang 
17797937f02dSYan-Hsuan Chuang 	halbtc_leave_low_power(btcoexist);
17807937f02dSYan-Hsuan Chuang 
17817937f02dSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
17827937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 1) {
17837937f02dSYan-Hsuan Chuang 			btcoexist->stop_coex_dm = true;
17847937f02dSYan-Hsuan Chuang 			ex_btc8723b1ant_coex_dm_reset(btcoexist);
17857937f02dSYan-Hsuan Chuang 			exhalbtc_set_ant_num(rtlpriv,
17867937f02dSYan-Hsuan Chuang 					     BT_COEX_ANT_TYPE_DETECTED, 2);
17877937f02dSYan-Hsuan Chuang 			ex_btc8723b2ant_init_hwconfig(btcoexist);
17887937f02dSYan-Hsuan Chuang 			ex_btc8723b2ant_init_coex_dm(btcoexist);
17897937f02dSYan-Hsuan Chuang 			btcoexist->stop_coex_dm = false;
17907937f02dSYan-Hsuan Chuang 		}
17917937f02dSYan-Hsuan Chuang 	}
17927937f02dSYan-Hsuan Chuang 
17937937f02dSYan-Hsuan Chuang 	halbtc_normal_low_power(btcoexist);
17947937f02dSYan-Hsuan Chuang }
17957937f02dSYan-Hsuan Chuang 
exhalbtc_periodical(struct btc_coexist * btcoexist)17967937f02dSYan-Hsuan Chuang void exhalbtc_periodical(struct btc_coexist *btcoexist)
17977937f02dSYan-Hsuan Chuang {
1798f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1799f1d2b4d3SLarry Finger 		return;
1800f1d2b4d3SLarry Finger 	btcoexist->statistics.cnt_periodical++;
1801f1d2b4d3SLarry Finger 
18027937f02dSYan-Hsuan Chuang 	halbtc_leave_low_power(btcoexist);
1803f1d2b4d3SLarry Finger 
18047937f02dSYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) {
18057937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
18067937f02dSYan-Hsuan Chuang 			ex_btc8821a2ant_periodical(btcoexist);
18077937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
18087937f02dSYan-Hsuan Chuang 			if (!halbtc_under_ips(btcoexist))
18097937f02dSYan-Hsuan Chuang 				ex_btc8821a1ant_periodical(btcoexist);
18107937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
18117937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
1812f1d2b4d3SLarry Finger 			ex_btc8723b2ant_periodical(btcoexist);
18137937f02dSYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
18147937f02dSYan-Hsuan Chuang 			ex_btc8723b1ant_periodical(btcoexist);
18157937f02dSYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) {
18167937f02dSYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
18177937f02dSYan-Hsuan Chuang 			ex_btc8192e2ant_periodical(btcoexist);
18187937f02dSYan-Hsuan Chuang 	}
1819f1d2b4d3SLarry Finger 
18207937f02dSYan-Hsuan Chuang 	halbtc_normal_low_power(btcoexist);
1821f1d2b4d3SLarry Finger }
1822f1d2b4d3SLarry Finger 
exhalbtc_dbg_control(struct btc_coexist * btcoexist,u8 code,u8 len,u8 * data)1823f1d2b4d3SLarry Finger void exhalbtc_dbg_control(struct btc_coexist *btcoexist,
1824f1d2b4d3SLarry Finger 			  u8 code, u8 len, u8 *data)
1825f1d2b4d3SLarry Finger {
1826f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1827f1d2b4d3SLarry Finger 		return;
1828f1d2b4d3SLarry Finger 	btcoexist->statistics.cnt_dbg_ctrl++;
18297937f02dSYan-Hsuan Chuang 
18307937f02dSYan-Hsuan Chuang 	halbtc_leave_low_power(btcoexist);
18317937f02dSYan-Hsuan Chuang 
18327937f02dSYan-Hsuan Chuang 	halbtc_normal_low_power(btcoexist);
18337937f02dSYan-Hsuan Chuang }
18347937f02dSYan-Hsuan Chuang 
exhalbtc_antenna_detection(struct btc_coexist * btcoexist,u32 cent_freq,u32 offset,u32 span,u32 seconds)18357937f02dSYan-Hsuan Chuang void exhalbtc_antenna_detection(struct btc_coexist *btcoexist, u32 cent_freq,
18367937f02dSYan-Hsuan Chuang 				u32 offset, u32 span, u32 seconds)
18377937f02dSYan-Hsuan Chuang {
18387937f02dSYan-Hsuan Chuang 	if (!halbtc_is_bt_coexist_available(btcoexist))
18397937f02dSYan-Hsuan Chuang 		return;
1840f1d2b4d3SLarry Finger }
1841f1d2b4d3SLarry Finger 
exhalbtc_stack_update_profile_info(void)1842f1d2b4d3SLarry Finger void exhalbtc_stack_update_profile_info(void)
1843f1d2b4d3SLarry Finger {
1844f1d2b4d3SLarry Finger }
1845f1d2b4d3SLarry Finger 
exhalbtc_update_min_bt_rssi(struct btc_coexist * btcoexist,s8 bt_rssi)184640d9dd4fSPing-Ke Shih void exhalbtc_update_min_bt_rssi(struct btc_coexist *btcoexist, s8 bt_rssi)
1847f1d2b4d3SLarry Finger {
1848f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1849f1d2b4d3SLarry Finger 		return;
1850f1d2b4d3SLarry Finger 
1851f1d2b4d3SLarry Finger 	btcoexist->stack_info.min_bt_rssi = bt_rssi;
1852f1d2b4d3SLarry Finger }
1853f1d2b4d3SLarry Finger 
exhalbtc_set_hci_version(struct btc_coexist * btcoexist,u16 hci_version)185440d9dd4fSPing-Ke Shih void exhalbtc_set_hci_version(struct btc_coexist *btcoexist, u16 hci_version)
1855f1d2b4d3SLarry Finger {
1856f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1857f1d2b4d3SLarry Finger 		return;
1858f1d2b4d3SLarry Finger 
1859f1d2b4d3SLarry Finger 	btcoexist->stack_info.hci_version = hci_version;
1860f1d2b4d3SLarry Finger }
1861f1d2b4d3SLarry Finger 
exhalbtc_set_bt_patch_version(struct btc_coexist * btcoexist,u16 bt_hci_version,u16 bt_patch_version)186240d9dd4fSPing-Ke Shih void exhalbtc_set_bt_patch_version(struct btc_coexist *btcoexist,
186340d9dd4fSPing-Ke Shih 				   u16 bt_hci_version, u16 bt_patch_version)
1864f1d2b4d3SLarry Finger {
1865f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1866f1d2b4d3SLarry Finger 		return;
1867f1d2b4d3SLarry Finger 
1868f1d2b4d3SLarry Finger 	btcoexist->bt_info.bt_real_fw_ver = bt_patch_version;
1869f1d2b4d3SLarry Finger 	btcoexist->bt_info.bt_hci_ver = bt_hci_version;
1870f1d2b4d3SLarry Finger }
1871f1d2b4d3SLarry Finger 
exhalbtc_set_chip_type(struct btc_coexist * btcoexist,u8 chip_type)187240d9dd4fSPing-Ke Shih void exhalbtc_set_chip_type(struct btc_coexist *btcoexist, u8 chip_type)
1873f1d2b4d3SLarry Finger {
1874f1d2b4d3SLarry Finger 	switch (chip_type) {
1875f1d2b4d3SLarry Finger 	default:
1876f1d2b4d3SLarry Finger 	case BT_2WIRE:
1877f1d2b4d3SLarry Finger 	case BT_ISSC_3WIRE:
1878f1d2b4d3SLarry Finger 	case BT_ACCEL:
1879f1d2b4d3SLarry Finger 	case BT_RTL8756:
188040d9dd4fSPing-Ke Shih 		btcoexist->board_info.bt_chip_type = BTC_CHIP_UNDEF;
1881f1d2b4d3SLarry Finger 		break;
1882f1d2b4d3SLarry Finger 	case BT_CSR_BC4:
188340d9dd4fSPing-Ke Shih 		btcoexist->board_info.bt_chip_type = BTC_CHIP_CSR_BC4;
1884f1d2b4d3SLarry Finger 		break;
1885f1d2b4d3SLarry Finger 	case BT_CSR_BC8:
188640d9dd4fSPing-Ke Shih 		btcoexist->board_info.bt_chip_type = BTC_CHIP_CSR_BC8;
1887f1d2b4d3SLarry Finger 		break;
1888f1d2b4d3SLarry Finger 	case BT_RTL8723A:
188940d9dd4fSPing-Ke Shih 		btcoexist->board_info.bt_chip_type = BTC_CHIP_RTL8723A;
1890f1d2b4d3SLarry Finger 		break;
1891f1d2b4d3SLarry Finger 	case BT_RTL8821A:
189240d9dd4fSPing-Ke Shih 		btcoexist->board_info.bt_chip_type = BTC_CHIP_RTL8821;
1893f1d2b4d3SLarry Finger 		break;
1894f1d2b4d3SLarry Finger 	case BT_RTL8723B:
189540d9dd4fSPing-Ke Shih 		btcoexist->board_info.bt_chip_type = BTC_CHIP_RTL8723B;
1896f1d2b4d3SLarry Finger 		break;
1897f1d2b4d3SLarry Finger 	}
1898f1d2b4d3SLarry Finger }
1899f1d2b4d3SLarry Finger 
exhalbtc_set_ant_num(struct rtl_priv * rtlpriv,u8 type,u8 ant_num)1900baa17022SLarry Finger void exhalbtc_set_ant_num(struct rtl_priv *rtlpriv, u8 type, u8 ant_num)
1901f1d2b4d3SLarry Finger {
190240d9dd4fSPing-Ke Shih 	struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv);
190340d9dd4fSPing-Ke Shih 
190440d9dd4fSPing-Ke Shih 	if (!btcoexist)
190540d9dd4fSPing-Ke Shih 		return;
190640d9dd4fSPing-Ke Shih 
1907f1d2b4d3SLarry Finger 	if (BT_COEX_ANT_TYPE_PG == type) {
190840d9dd4fSPing-Ke Shih 		btcoexist->board_info.pg_ant_num = ant_num;
190940d9dd4fSPing-Ke Shih 		btcoexist->board_info.btdm_ant_num = ant_num;
1910f1d2b4d3SLarry Finger 	} else if (BT_COEX_ANT_TYPE_ANTDIV == type) {
191140d9dd4fSPing-Ke Shih 		btcoexist->board_info.btdm_ant_num = ant_num;
1912baa17022SLarry Finger 	} else if (type == BT_COEX_ANT_TYPE_DETECTED) {
191340d9dd4fSPing-Ke Shih 		btcoexist->board_info.btdm_ant_num = ant_num;
1914baa17022SLarry Finger 		if (rtlpriv->cfg->mod_params->ant_sel == 1)
191540d9dd4fSPing-Ke Shih 			btcoexist->board_info.btdm_ant_pos =
1916baa17022SLarry Finger 				BTC_ANTENNA_AT_AUX_PORT;
1917baa17022SLarry Finger 		else
191840d9dd4fSPing-Ke Shih 			btcoexist->board_info.btdm_ant_pos =
1919baa17022SLarry Finger 				BTC_ANTENNA_AT_MAIN_PORT;
1920f1d2b4d3SLarry Finger 	}
1921f1d2b4d3SLarry Finger }
1922f1d2b4d3SLarry Finger 
19230199103eSYan-Hsuan Chuang /* Currently used by 8723b only, S0 or S1 */
exhalbtc_set_single_ant_path(struct btc_coexist * btcoexist,u8 single_ant_path)192440d9dd4fSPing-Ke Shih void exhalbtc_set_single_ant_path(struct btc_coexist *btcoexist,
192540d9dd4fSPing-Ke Shih 				  u8 single_ant_path)
19260199103eSYan-Hsuan Chuang {
192740d9dd4fSPing-Ke Shih 	btcoexist->board_info.single_ant_path = single_ant_path;
19280199103eSYan-Hsuan Chuang }
19290199103eSYan-Hsuan Chuang 
exhalbtc_display_bt_coex_info(struct btc_coexist * btcoexist,struct seq_file * m)1930610247f4SPing-Ke Shih void exhalbtc_display_bt_coex_info(struct btc_coexist *btcoexist,
1931610247f4SPing-Ke Shih 				   struct seq_file *m)
1932f1d2b4d3SLarry Finger {
1933f1d2b4d3SLarry Finger 	if (!halbtc_is_bt_coexist_available(btcoexist))
1934f1d2b4d3SLarry Finger 		return;
1935f1d2b4d3SLarry Finger 
1936c42ea613SYan-Hsuan Chuang 	halbtc_leave_low_power(btcoexist);
1937c42ea613SYan-Hsuan Chuang 
1938c42ea613SYan-Hsuan Chuang 	if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) {
1939c42ea613SYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
194008431b62SPing-Ke Shih 			ex_btc8821a2ant_display_coex_info(btcoexist, m);
1941c42ea613SYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
194208431b62SPing-Ke Shih 			ex_btc8821a1ant_display_coex_info(btcoexist, m);
1943c42ea613SYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) {
1944c42ea613SYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
194508431b62SPing-Ke Shih 			ex_btc8723b2ant_display_coex_info(btcoexist, m);
1946c42ea613SYan-Hsuan Chuang 		else if (btcoexist->board_info.btdm_ant_num == 1)
194708431b62SPing-Ke Shih 			ex_btc8723b1ant_display_coex_info(btcoexist, m);
1948c42ea613SYan-Hsuan Chuang 	} else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) {
1949c42ea613SYan-Hsuan Chuang 		if (btcoexist->board_info.btdm_ant_num == 2)
195008431b62SPing-Ke Shih 			ex_btc8192e2ant_display_coex_info(btcoexist, m);
1951c42ea613SYan-Hsuan Chuang 	}
1952c42ea613SYan-Hsuan Chuang 
1953c42ea613SYan-Hsuan Chuang 	halbtc_normal_low_power(btcoexist);
1954f1d2b4d3SLarry Finger }
195517bf8510SPing-Ke Shih 
exhalbtc_switch_band_notify(struct btc_coexist * btcoexist,u8 type)195617bf8510SPing-Ke Shih void exhalbtc_switch_band_notify(struct btc_coexist *btcoexist, u8 type)
195717bf8510SPing-Ke Shih {
195817bf8510SPing-Ke Shih 	if (!halbtc_is_bt_coexist_available(btcoexist))
195917bf8510SPing-Ke Shih 		return;
196017bf8510SPing-Ke Shih 
196117bf8510SPing-Ke Shih 	if (btcoexist->manual_control)
196217bf8510SPing-Ke Shih 		return;
196317bf8510SPing-Ke Shih 
196417bf8510SPing-Ke Shih 	halbtc_leave_low_power(btcoexist);
196517bf8510SPing-Ke Shih 
196617bf8510SPing-Ke Shih 	halbtc_normal_low_power(btcoexist);
196717bf8510SPing-Ke Shih }
19689177c336SPing-Ke Shih 
exhalbtc_switch_band_notify_wifi_only(struct wifi_only_cfg * wifionly_cfg,u8 is_5g)19699177c336SPing-Ke Shih void exhalbtc_switch_band_notify_wifi_only(struct wifi_only_cfg *wifionly_cfg,
19709177c336SPing-Ke Shih 					   u8 is_5g)
19719177c336SPing-Ke Shih {
19729177c336SPing-Ke Shih }
1973