18c086312SLarry Finger // SPDX-License-Identifier: GPL-2.0
28c086312SLarry Finger /* Copyright(c) 2012 Realtek Corporation.*/
38c086312SLarry Finger
4f1d2b4d3SLarry Finger /***************************************************************
5f1d2b4d3SLarry Finger * Description:
6f1d2b4d3SLarry Finger *
7f1d2b4d3SLarry Finger * This file is for RTL8723B Co-exist mechanism
8f1d2b4d3SLarry Finger *
9f1d2b4d3SLarry Finger * History
10f1d2b4d3SLarry Finger * 2012/11/15 Cosa first check in.
11f1d2b4d3SLarry Finger *
12f1d2b4d3SLarry Finger **************************************************************/
13f1d2b4d3SLarry Finger /**************************************************************
14f1d2b4d3SLarry Finger * include files
15f1d2b4d3SLarry Finger **************************************************************/
16f1d2b4d3SLarry Finger #include "halbt_precomp.h"
17f1d2b4d3SLarry Finger /**************************************************************
18f1d2b4d3SLarry Finger * Global variables, these are static variables
19f1d2b4d3SLarry Finger **************************************************************/
20f1d2b4d3SLarry Finger static struct coex_dm_8723b_2ant glcoex_dm_8723b_2ant;
21f1d2b4d3SLarry Finger static struct coex_dm_8723b_2ant *coex_dm = &glcoex_dm_8723b_2ant;
22f1d2b4d3SLarry Finger static struct coex_sta_8723b_2ant glcoex_sta_8723b_2ant;
23f1d2b4d3SLarry Finger static struct coex_sta_8723b_2ant *coex_sta = &glcoex_sta_8723b_2ant;
24f1d2b4d3SLarry Finger
25f1d2b4d3SLarry Finger static const char *const glbt_info_src_8723b_2ant[] = {
26f1d2b4d3SLarry Finger "BT Info[wifi fw]",
27f1d2b4d3SLarry Finger "BT Info[bt rsp]",
28f1d2b4d3SLarry Finger "BT Info[bt auto report]",
29f1d2b4d3SLarry Finger };
30f1d2b4d3SLarry Finger
31f1d2b4d3SLarry Finger static u32 glcoex_ver_date_8723b_2ant = 20131113;
32f1d2b4d3SLarry Finger static u32 glcoex_ver_8723b_2ant = 0x3f;
33f1d2b4d3SLarry Finger
34f1d2b4d3SLarry Finger /**************************************************************
35f1d2b4d3SLarry Finger * local function proto type if needed
36f1d2b4d3SLarry Finger **************************************************************/
37f1d2b4d3SLarry Finger /**************************************************************
38f1d2b4d3SLarry Finger * local function start with btc8723b2ant_
39f1d2b4d3SLarry Finger **************************************************************/
btc8723b2ant_bt_rssi_state(struct btc_coexist * btcoexist,u8 level_num,u8 rssi_thresh,u8 rssi_thresh1)402277f5f1SLarry Finger static u8 btc8723b2ant_bt_rssi_state(struct btc_coexist *btcoexist,
412277f5f1SLarry Finger u8 level_num, u8 rssi_thresh,
42f1d2b4d3SLarry Finger u8 rssi_thresh1)
43f1d2b4d3SLarry Finger {
442277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
45f1d2b4d3SLarry Finger s32 bt_rssi = 0;
46f1d2b4d3SLarry Finger u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;
47f1d2b4d3SLarry Finger
48f1d2b4d3SLarry Finger bt_rssi = coex_sta->bt_rssi;
49f1d2b4d3SLarry Finger
50f1d2b4d3SLarry Finger if (level_num == 2) {
51f1d2b4d3SLarry Finger if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
52f1d2b4d3SLarry Finger (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
53f1d2b4d3SLarry Finger if (bt_rssi >= rssi_thresh +
54f1d2b4d3SLarry Finger BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
55f1d2b4d3SLarry Finger bt_rssi_state = BTC_RSSI_STATE_HIGH;
56c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
57466414a0SJoe Perches "[BTCoex], BT Rssi state switch to High\n");
58f1d2b4d3SLarry Finger } else {
59f1d2b4d3SLarry Finger bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
60c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
61466414a0SJoe Perches "[BTCoex], BT Rssi state stay at Low\n");
62f1d2b4d3SLarry Finger }
63f1d2b4d3SLarry Finger } else {
64f1d2b4d3SLarry Finger if (bt_rssi < rssi_thresh) {
65f1d2b4d3SLarry Finger bt_rssi_state = BTC_RSSI_STATE_LOW;
66c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
67466414a0SJoe Perches "[BTCoex], BT Rssi state switch to Low\n");
68f1d2b4d3SLarry Finger } else {
69f1d2b4d3SLarry Finger bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
70c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
71466414a0SJoe Perches "[BTCoex], BT Rssi state stay at High\n");
72f1d2b4d3SLarry Finger }
73f1d2b4d3SLarry Finger }
74f1d2b4d3SLarry Finger } else if (level_num == 3) {
75f1d2b4d3SLarry Finger if (rssi_thresh > rssi_thresh1) {
76c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
77f1d2b4d3SLarry Finger "[BTCoex], BT Rssi thresh error!!\n");
78f1d2b4d3SLarry Finger return coex_sta->pre_bt_rssi_state;
79f1d2b4d3SLarry Finger }
80f1d2b4d3SLarry Finger
81f1d2b4d3SLarry Finger if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
82f1d2b4d3SLarry Finger (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
83f1d2b4d3SLarry Finger if (bt_rssi >= rssi_thresh +
84f1d2b4d3SLarry Finger BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
85f1d2b4d3SLarry Finger bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
86c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
87466414a0SJoe Perches "[BTCoex], BT Rssi state switch to Medium\n");
88f1d2b4d3SLarry Finger } else {
89f1d2b4d3SLarry Finger bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
90c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
91466414a0SJoe Perches "[BTCoex], BT Rssi state stay at Low\n");
92f1d2b4d3SLarry Finger }
93f1d2b4d3SLarry Finger } else if ((coex_sta->pre_bt_rssi_state ==
94f1d2b4d3SLarry Finger BTC_RSSI_STATE_MEDIUM) ||
95f1d2b4d3SLarry Finger (coex_sta->pre_bt_rssi_state ==
96f1d2b4d3SLarry Finger BTC_RSSI_STATE_STAY_MEDIUM)) {
97f1d2b4d3SLarry Finger if (bt_rssi >= rssi_thresh1 +
98f1d2b4d3SLarry Finger BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
99f1d2b4d3SLarry Finger bt_rssi_state = BTC_RSSI_STATE_HIGH;
100c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
101466414a0SJoe Perches "[BTCoex], BT Rssi state switch to High\n");
102f1d2b4d3SLarry Finger } else if (bt_rssi < rssi_thresh) {
103f1d2b4d3SLarry Finger bt_rssi_state = BTC_RSSI_STATE_LOW;
104c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
105466414a0SJoe Perches "[BTCoex], BT Rssi state switch to Low\n");
106f1d2b4d3SLarry Finger } else {
107f1d2b4d3SLarry Finger bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
108c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
109466414a0SJoe Perches "[BTCoex], BT Rssi state stay at Medium\n");
110f1d2b4d3SLarry Finger }
111f1d2b4d3SLarry Finger } else {
112f1d2b4d3SLarry Finger if (bt_rssi < rssi_thresh1) {
113f1d2b4d3SLarry Finger bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
114c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
115466414a0SJoe Perches "[BTCoex], BT Rssi state switch to Medium\n");
116f1d2b4d3SLarry Finger } else {
117f1d2b4d3SLarry Finger bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
118c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
119466414a0SJoe Perches "[BTCoex], BT Rssi state stay at High\n");
120f1d2b4d3SLarry Finger }
121f1d2b4d3SLarry Finger }
122f1d2b4d3SLarry Finger }
123f1d2b4d3SLarry Finger
124f1d2b4d3SLarry Finger coex_sta->pre_bt_rssi_state = bt_rssi_state;
125f1d2b4d3SLarry Finger
126f1d2b4d3SLarry Finger return bt_rssi_state;
127f1d2b4d3SLarry Finger }
128f1d2b4d3SLarry Finger
btc8723b2ant_wifi_rssi_state(struct btc_coexist * btcoexist,u8 index,u8 level_num,u8 rssi_thresh,u8 rssi_thresh1)129f1d2b4d3SLarry Finger static u8 btc8723b2ant_wifi_rssi_state(struct btc_coexist *btcoexist,
130f1d2b4d3SLarry Finger u8 index, u8 level_num,
131f1d2b4d3SLarry Finger u8 rssi_thresh, u8 rssi_thresh1)
132f1d2b4d3SLarry Finger {
1332277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
134f1d2b4d3SLarry Finger s32 wifi_rssi = 0;
135f1d2b4d3SLarry Finger u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
136f1d2b4d3SLarry Finger
137f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
138f1d2b4d3SLarry Finger
139f1d2b4d3SLarry Finger if (level_num == 2) {
140f1d2b4d3SLarry Finger if ((coex_sta->pre_wifi_rssi_state[index] ==
141f1d2b4d3SLarry Finger BTC_RSSI_STATE_LOW) ||
142f1d2b4d3SLarry Finger (coex_sta->pre_wifi_rssi_state[index] ==
143f1d2b4d3SLarry Finger BTC_RSSI_STATE_STAY_LOW)) {
144f1d2b4d3SLarry Finger if (wifi_rssi >= rssi_thresh +
145f1d2b4d3SLarry Finger BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
146f1d2b4d3SLarry Finger wifi_rssi_state = BTC_RSSI_STATE_HIGH;
147c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
148466414a0SJoe Perches "[BTCoex], wifi RSSI state switch to High\n");
149f1d2b4d3SLarry Finger } else {
150f1d2b4d3SLarry Finger wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
151c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
152466414a0SJoe Perches "[BTCoex], wifi RSSI state stay at Low\n");
153f1d2b4d3SLarry Finger }
154f1d2b4d3SLarry Finger } else {
155f1d2b4d3SLarry Finger if (wifi_rssi < rssi_thresh) {
156f1d2b4d3SLarry Finger wifi_rssi_state = BTC_RSSI_STATE_LOW;
157c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
158466414a0SJoe Perches "[BTCoex], wifi RSSI state switch to Low\n");
159f1d2b4d3SLarry Finger } else {
160f1d2b4d3SLarry Finger wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
161c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
162466414a0SJoe Perches "[BTCoex], wifi RSSI state stay at High\n");
163f1d2b4d3SLarry Finger }
164f1d2b4d3SLarry Finger }
165f1d2b4d3SLarry Finger } else if (level_num == 3) {
166f1d2b4d3SLarry Finger if (rssi_thresh > rssi_thresh1) {
167c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
168f1d2b4d3SLarry Finger "[BTCoex], wifi RSSI thresh error!!\n");
169f1d2b4d3SLarry Finger return coex_sta->pre_wifi_rssi_state[index];
170f1d2b4d3SLarry Finger }
171f1d2b4d3SLarry Finger
172f1d2b4d3SLarry Finger if ((coex_sta->pre_wifi_rssi_state[index] ==
173f1d2b4d3SLarry Finger BTC_RSSI_STATE_LOW) ||
174f1d2b4d3SLarry Finger (coex_sta->pre_wifi_rssi_state[index] ==
175f1d2b4d3SLarry Finger BTC_RSSI_STATE_STAY_LOW)) {
176f1d2b4d3SLarry Finger if (wifi_rssi >= rssi_thresh +
177f1d2b4d3SLarry Finger BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
178f1d2b4d3SLarry Finger wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
179c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
180466414a0SJoe Perches "[BTCoex], wifi RSSI state switch to Medium\n");
181f1d2b4d3SLarry Finger } else {
182f1d2b4d3SLarry Finger wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
183c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
184466414a0SJoe Perches "[BTCoex], wifi RSSI state stay at Low\n");
185f1d2b4d3SLarry Finger }
186f1d2b4d3SLarry Finger } else if ((coex_sta->pre_wifi_rssi_state[index] ==
187f1d2b4d3SLarry Finger BTC_RSSI_STATE_MEDIUM) ||
188f1d2b4d3SLarry Finger (coex_sta->pre_wifi_rssi_state[index] ==
189f1d2b4d3SLarry Finger BTC_RSSI_STATE_STAY_MEDIUM)) {
190f1d2b4d3SLarry Finger if (wifi_rssi >= rssi_thresh1 +
191f1d2b4d3SLarry Finger BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
192f1d2b4d3SLarry Finger wifi_rssi_state = BTC_RSSI_STATE_HIGH;
193c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
194466414a0SJoe Perches "[BTCoex], wifi RSSI state switch to High\n");
195f1d2b4d3SLarry Finger } else if (wifi_rssi < rssi_thresh) {
196f1d2b4d3SLarry Finger wifi_rssi_state = BTC_RSSI_STATE_LOW;
197c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
198466414a0SJoe Perches "[BTCoex], wifi RSSI state switch to Low\n");
199f1d2b4d3SLarry Finger } else {
200f1d2b4d3SLarry Finger wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
201c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
202466414a0SJoe Perches "[BTCoex], wifi RSSI state stay at Medium\n");
203f1d2b4d3SLarry Finger }
204f1d2b4d3SLarry Finger } else {
205f1d2b4d3SLarry Finger if (wifi_rssi < rssi_thresh1) {
206f1d2b4d3SLarry Finger wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
207c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
208466414a0SJoe Perches "[BTCoex], wifi RSSI state switch to Medium\n");
209f1d2b4d3SLarry Finger } else {
210f1d2b4d3SLarry Finger wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
211c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
212466414a0SJoe Perches "[BTCoex], wifi RSSI state stay at High\n");
213f1d2b4d3SLarry Finger }
214f1d2b4d3SLarry Finger }
215f1d2b4d3SLarry Finger }
216f1d2b4d3SLarry Finger
217f1d2b4d3SLarry Finger coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
218f1d2b4d3SLarry Finger
219f1d2b4d3SLarry Finger return wifi_rssi_state;
220f1d2b4d3SLarry Finger }
221f1d2b4d3SLarry Finger
222155305f5SYan-Hsuan Chuang static
btc8723b2ant_limited_rx(struct btc_coexist * btcoexist,bool force_exec,bool rej_ap_agg_pkt,bool bt_ctrl_agg_buf_size,u8 agg_buf_size)223155305f5SYan-Hsuan Chuang void btc8723b2ant_limited_rx(struct btc_coexist *btcoexist, bool force_exec,
224155305f5SYan-Hsuan Chuang bool rej_ap_agg_pkt, bool bt_ctrl_agg_buf_size,
225155305f5SYan-Hsuan Chuang u8 agg_buf_size)
226155305f5SYan-Hsuan Chuang {
227155305f5SYan-Hsuan Chuang bool reject_rx_agg = rej_ap_agg_pkt;
228155305f5SYan-Hsuan Chuang bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
229155305f5SYan-Hsuan Chuang u8 rx_agg_size = agg_buf_size;
230155305f5SYan-Hsuan Chuang
231155305f5SYan-Hsuan Chuang /* ============================================ */
232155305f5SYan-Hsuan Chuang /* Rx Aggregation related setting */
233155305f5SYan-Hsuan Chuang /* ============================================ */
234155305f5SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
235155305f5SYan-Hsuan Chuang &reject_rx_agg);
236155305f5SYan-Hsuan Chuang /* decide BT control aggregation buf size or not */
237155305f5SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
238155305f5SYan-Hsuan Chuang &bt_ctrl_rx_agg_size);
239155305f5SYan-Hsuan Chuang /* aggregate buf size, only work when BT control Rx aggregate size */
240155305f5SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
241155305f5SYan-Hsuan Chuang /* real update aggregation setting */
242155305f5SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
243155305f5SYan-Hsuan Chuang }
244155305f5SYan-Hsuan Chuang
btc8723b2ant_monitor_bt_ctr(struct btc_coexist * btcoexist)245f1d2b4d3SLarry Finger static void btc8723b2ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
246f1d2b4d3SLarry Finger {
2472277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
24861d80261SYan-Hsuan Chuang struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
249f1d2b4d3SLarry Finger u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
250f1d2b4d3SLarry Finger u32 reg_hp_tx = 0, reg_hp_rx = 0;
251f1d2b4d3SLarry Finger u32 reg_lp_tx = 0, reg_lp_rx = 0;
252f1d2b4d3SLarry Finger
253f1d2b4d3SLarry Finger reg_hp_txrx = 0x770;
254f1d2b4d3SLarry Finger reg_lp_txrx = 0x774;
255f1d2b4d3SLarry Finger
256f1d2b4d3SLarry Finger u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
257f1d2b4d3SLarry Finger reg_hp_tx = u32tmp & MASKLWORD;
258f1d2b4d3SLarry Finger reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
259f1d2b4d3SLarry Finger
260f1d2b4d3SLarry Finger u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
261f1d2b4d3SLarry Finger reg_lp_tx = u32tmp & MASKLWORD;
262f1d2b4d3SLarry Finger reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
263f1d2b4d3SLarry Finger
264f1d2b4d3SLarry Finger coex_sta->high_priority_tx = reg_hp_tx;
265f1d2b4d3SLarry Finger coex_sta->high_priority_rx = reg_hp_rx;
266f1d2b4d3SLarry Finger coex_sta->low_priority_tx = reg_lp_tx;
267f1d2b4d3SLarry Finger coex_sta->low_priority_rx = reg_lp_rx;
268f1d2b4d3SLarry Finger
26961d80261SYan-Hsuan Chuang if ((coex_sta->low_priority_tx > 1050) &&
27061d80261SYan-Hsuan Chuang (!coex_sta->c2h_bt_inquiry_page))
27161d80261SYan-Hsuan Chuang coex_sta->pop_event_cnt++;
27261d80261SYan-Hsuan Chuang
27361d80261SYan-Hsuan Chuang if ((coex_sta->low_priority_rx >= 950) &&
27461d80261SYan-Hsuan Chuang (coex_sta->low_priority_rx >= coex_sta->low_priority_tx) &&
27561d80261SYan-Hsuan Chuang (!coex_sta->under_ips))
27661d80261SYan-Hsuan Chuang bt_link_info->slave_role = true;
27761d80261SYan-Hsuan Chuang else
27861d80261SYan-Hsuan Chuang bt_link_info->slave_role = false;
27961d80261SYan-Hsuan Chuang
280c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
281f1d2b4d3SLarry Finger "[BTCoex], High Priority Tx/Rx(reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
282f1d2b4d3SLarry Finger reg_hp_txrx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);
283c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
284f1d2b4d3SLarry Finger "[BTCoex], Low Priority Tx/Rx(reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
285f1d2b4d3SLarry Finger reg_lp_txrx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx);
286f1d2b4d3SLarry Finger
287f1d2b4d3SLarry Finger /* reset counter */
288f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
289f1d2b4d3SLarry Finger }
290f1d2b4d3SLarry Finger
btc8723b2ant_monitor_wifi_ctr(struct btc_coexist * btcoexist)29155e9e37dSYan-Hsuan Chuang static void btc8723b2ant_monitor_wifi_ctr(struct btc_coexist *btcoexist)
29255e9e37dSYan-Hsuan Chuang {
29355e9e37dSYan-Hsuan Chuang if (coex_sta->under_ips) {
29455e9e37dSYan-Hsuan Chuang coex_sta->crc_ok_cck = 0;
29555e9e37dSYan-Hsuan Chuang coex_sta->crc_ok_11g = 0;
29655e9e37dSYan-Hsuan Chuang coex_sta->crc_ok_11n = 0;
29755e9e37dSYan-Hsuan Chuang coex_sta->crc_ok_11n_agg = 0;
29855e9e37dSYan-Hsuan Chuang
29955e9e37dSYan-Hsuan Chuang coex_sta->crc_err_cck = 0;
30055e9e37dSYan-Hsuan Chuang coex_sta->crc_err_11g = 0;
30155e9e37dSYan-Hsuan Chuang coex_sta->crc_err_11n = 0;
30255e9e37dSYan-Hsuan Chuang coex_sta->crc_err_11n_agg = 0;
30355e9e37dSYan-Hsuan Chuang } else {
30455e9e37dSYan-Hsuan Chuang coex_sta->crc_ok_cck =
30555e9e37dSYan-Hsuan Chuang btcoexist->btc_read_4byte(btcoexist, 0xf88);
30655e9e37dSYan-Hsuan Chuang coex_sta->crc_ok_11g =
30755e9e37dSYan-Hsuan Chuang btcoexist->btc_read_2byte(btcoexist, 0xf94);
30855e9e37dSYan-Hsuan Chuang coex_sta->crc_ok_11n =
30955e9e37dSYan-Hsuan Chuang btcoexist->btc_read_2byte(btcoexist, 0xf90);
31055e9e37dSYan-Hsuan Chuang coex_sta->crc_ok_11n_agg =
31155e9e37dSYan-Hsuan Chuang btcoexist->btc_read_2byte(btcoexist, 0xfb8);
31255e9e37dSYan-Hsuan Chuang
31355e9e37dSYan-Hsuan Chuang coex_sta->crc_err_cck =
31455e9e37dSYan-Hsuan Chuang btcoexist->btc_read_4byte(btcoexist, 0xf84);
31555e9e37dSYan-Hsuan Chuang coex_sta->crc_err_11g =
31655e9e37dSYan-Hsuan Chuang btcoexist->btc_read_2byte(btcoexist, 0xf96);
31755e9e37dSYan-Hsuan Chuang coex_sta->crc_err_11n =
31855e9e37dSYan-Hsuan Chuang btcoexist->btc_read_2byte(btcoexist, 0xf92);
31955e9e37dSYan-Hsuan Chuang coex_sta->crc_err_11n_agg =
32055e9e37dSYan-Hsuan Chuang btcoexist->btc_read_2byte(btcoexist, 0xfba);
32155e9e37dSYan-Hsuan Chuang }
32255e9e37dSYan-Hsuan Chuang
32355e9e37dSYan-Hsuan Chuang /* reset counter */
32455e9e37dSYan-Hsuan Chuang btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x1);
32555e9e37dSYan-Hsuan Chuang btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x0);
32655e9e37dSYan-Hsuan Chuang }
32755e9e37dSYan-Hsuan Chuang
btc8723b2ant_query_bt_info(struct btc_coexist * btcoexist)328f1d2b4d3SLarry Finger static void btc8723b2ant_query_bt_info(struct btc_coexist *btcoexist)
329f1d2b4d3SLarry Finger {
3302277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
331f1d2b4d3SLarry Finger u8 h2c_parameter[1] = {0};
332f1d2b4d3SLarry Finger
333f1d2b4d3SLarry Finger coex_sta->c2h_bt_info_req_sent = true;
334f1d2b4d3SLarry Finger
335f1d2b4d3SLarry Finger h2c_parameter[0] |= BIT0; /* trigger */
336f1d2b4d3SLarry Finger
337c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
338f1d2b4d3SLarry Finger "[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n",
339f1d2b4d3SLarry Finger h2c_parameter[0]);
340f1d2b4d3SLarry Finger
341f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
342f1d2b4d3SLarry Finger }
343f1d2b4d3SLarry Finger
btc8723b2ant_is_wifi_status_changed(struct btc_coexist * btcoexist)344f1d2b4d3SLarry Finger static bool btc8723b2ant_is_wifi_status_changed(struct btc_coexist *btcoexist)
345f1d2b4d3SLarry Finger {
346f1d2b4d3SLarry Finger static bool pre_wifi_busy;
347f1d2b4d3SLarry Finger static bool pre_under_4way;
348f1d2b4d3SLarry Finger static bool pre_bt_hs_on;
349f1d2b4d3SLarry Finger bool wifi_busy = false, under_4way = false, bt_hs_on = false;
350f1d2b4d3SLarry Finger bool wifi_connected = false;
351c5e21136SYan-Hsuan Chuang u8 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
352c5e21136SYan-Hsuan Chuang u8 tmp;
353f1d2b4d3SLarry Finger
354f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
355f1d2b4d3SLarry Finger &wifi_connected);
356f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
357f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
358f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
359f1d2b4d3SLarry Finger &under_4way);
360f1d2b4d3SLarry Finger
361f1d2b4d3SLarry Finger if (wifi_connected) {
362f1d2b4d3SLarry Finger if (wifi_busy != pre_wifi_busy) {
363f1d2b4d3SLarry Finger pre_wifi_busy = wifi_busy;
364f1d2b4d3SLarry Finger return true;
365f1d2b4d3SLarry Finger }
366f1d2b4d3SLarry Finger
367f1d2b4d3SLarry Finger if (under_4way != pre_under_4way) {
368f1d2b4d3SLarry Finger pre_under_4way = under_4way;
369f1d2b4d3SLarry Finger return true;
370f1d2b4d3SLarry Finger }
371f1d2b4d3SLarry Finger
372f1d2b4d3SLarry Finger if (bt_hs_on != pre_bt_hs_on) {
373f1d2b4d3SLarry Finger pre_bt_hs_on = bt_hs_on;
374f1d2b4d3SLarry Finger return true;
375f1d2b4d3SLarry Finger }
376c5e21136SYan-Hsuan Chuang
377c5e21136SYan-Hsuan Chuang tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
378c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
379c5e21136SYan-Hsuan Chuang wifi_rssi_state =
380c5e21136SYan-Hsuan Chuang btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, tmp, 0);
381c5e21136SYan-Hsuan Chuang
382c5e21136SYan-Hsuan Chuang if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
383c5e21136SYan-Hsuan Chuang (wifi_rssi_state == BTC_RSSI_STATE_LOW))
384c5e21136SYan-Hsuan Chuang return true;
385f1d2b4d3SLarry Finger }
386f1d2b4d3SLarry Finger
387f1d2b4d3SLarry Finger return false;
388f1d2b4d3SLarry Finger }
389f1d2b4d3SLarry Finger
btc8723b2ant_update_bt_link_info(struct btc_coexist * btcoexist)390f1d2b4d3SLarry Finger static void btc8723b2ant_update_bt_link_info(struct btc_coexist *btcoexist)
391f1d2b4d3SLarry Finger {
392f1d2b4d3SLarry Finger struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
393f1d2b4d3SLarry Finger bool bt_hs_on = false;
394f1d2b4d3SLarry Finger
395f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
396f1d2b4d3SLarry Finger
397f1d2b4d3SLarry Finger bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
398f1d2b4d3SLarry Finger bt_link_info->sco_exist = coex_sta->sco_exist;
399f1d2b4d3SLarry Finger bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
400f1d2b4d3SLarry Finger bt_link_info->pan_exist = coex_sta->pan_exist;
401f1d2b4d3SLarry Finger bt_link_info->hid_exist = coex_sta->hid_exist;
402f1d2b4d3SLarry Finger
403f1d2b4d3SLarry Finger /* work around for HS mode. */
404f1d2b4d3SLarry Finger if (bt_hs_on) {
405f1d2b4d3SLarry Finger bt_link_info->pan_exist = true;
406f1d2b4d3SLarry Finger bt_link_info->bt_link_exist = true;
407f1d2b4d3SLarry Finger }
408f1d2b4d3SLarry Finger
409f1d2b4d3SLarry Finger /* check if Sco only */
410f1d2b4d3SLarry Finger if (bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
411f1d2b4d3SLarry Finger !bt_link_info->pan_exist && !bt_link_info->hid_exist)
412f1d2b4d3SLarry Finger bt_link_info->sco_only = true;
413f1d2b4d3SLarry Finger else
414f1d2b4d3SLarry Finger bt_link_info->sco_only = false;
415f1d2b4d3SLarry Finger
416f1d2b4d3SLarry Finger /* check if A2dp only */
417f1d2b4d3SLarry Finger if (!bt_link_info->sco_exist && bt_link_info->a2dp_exist &&
418f1d2b4d3SLarry Finger !bt_link_info->pan_exist && !bt_link_info->hid_exist)
419f1d2b4d3SLarry Finger bt_link_info->a2dp_only = true;
420f1d2b4d3SLarry Finger else
421f1d2b4d3SLarry Finger bt_link_info->a2dp_only = false;
422f1d2b4d3SLarry Finger
423f1d2b4d3SLarry Finger /* check if Pan only */
424f1d2b4d3SLarry Finger if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
425f1d2b4d3SLarry Finger bt_link_info->pan_exist && !bt_link_info->hid_exist)
426f1d2b4d3SLarry Finger bt_link_info->pan_only = true;
427f1d2b4d3SLarry Finger else
428f1d2b4d3SLarry Finger bt_link_info->pan_only = false;
429f1d2b4d3SLarry Finger
430f1d2b4d3SLarry Finger /* check if Hid only */
431f1d2b4d3SLarry Finger if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
432f1d2b4d3SLarry Finger !bt_link_info->pan_exist && bt_link_info->hid_exist)
433f1d2b4d3SLarry Finger bt_link_info->hid_only = true;
434f1d2b4d3SLarry Finger else
435f1d2b4d3SLarry Finger bt_link_info->hid_only = false;
436f1d2b4d3SLarry Finger }
437f1d2b4d3SLarry Finger
btc8723b2ant_action_algorithm(struct btc_coexist * btcoexist)438f1d2b4d3SLarry Finger static u8 btc8723b2ant_action_algorithm(struct btc_coexist *btcoexist)
439f1d2b4d3SLarry Finger {
4402277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
441f1d2b4d3SLarry Finger struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
442f1d2b4d3SLarry Finger bool bt_hs_on = false;
443f1d2b4d3SLarry Finger u8 algorithm = BT_8723B_2ANT_COEX_ALGO_UNDEFINED;
444f1d2b4d3SLarry Finger u8 num_of_diff_profile = 0;
445f1d2b4d3SLarry Finger
446f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
447f1d2b4d3SLarry Finger
448f1d2b4d3SLarry Finger if (!bt_link_info->bt_link_exist) {
449c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
450f1d2b4d3SLarry Finger "[BTCoex], No BT link exists!!!\n");
451f1d2b4d3SLarry Finger return algorithm;
452f1d2b4d3SLarry Finger }
453f1d2b4d3SLarry Finger
454f1d2b4d3SLarry Finger if (bt_link_info->sco_exist)
455f1d2b4d3SLarry Finger num_of_diff_profile++;
456f1d2b4d3SLarry Finger if (bt_link_info->hid_exist)
457f1d2b4d3SLarry Finger num_of_diff_profile++;
458f1d2b4d3SLarry Finger if (bt_link_info->pan_exist)
459f1d2b4d3SLarry Finger num_of_diff_profile++;
460f1d2b4d3SLarry Finger if (bt_link_info->a2dp_exist)
461f1d2b4d3SLarry Finger num_of_diff_profile++;
462f1d2b4d3SLarry Finger
463f1d2b4d3SLarry Finger if (num_of_diff_profile == 1) {
464f1d2b4d3SLarry Finger if (bt_link_info->sco_exist) {
465c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
466f1d2b4d3SLarry Finger "[BTCoex], SCO only\n");
467f1d2b4d3SLarry Finger algorithm = BT_8723B_2ANT_COEX_ALGO_SCO;
468f1d2b4d3SLarry Finger } else {
469f1d2b4d3SLarry Finger if (bt_link_info->hid_exist) {
470c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
471f1d2b4d3SLarry Finger "[BTCoex], HID only\n");
472f1d2b4d3SLarry Finger algorithm = BT_8723B_2ANT_COEX_ALGO_HID;
473f1d2b4d3SLarry Finger } else if (bt_link_info->a2dp_exist) {
474c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
475f1d2b4d3SLarry Finger "[BTCoex], A2DP only\n");
476f1d2b4d3SLarry Finger algorithm = BT_8723B_2ANT_COEX_ALGO_A2DP;
477f1d2b4d3SLarry Finger } else if (bt_link_info->pan_exist) {
478f1d2b4d3SLarry Finger if (bt_hs_on) {
479c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
4802277f5f1SLarry Finger DBG_LOUD,
481f1d2b4d3SLarry Finger "[BTCoex], PAN(HS) only\n");
482f1d2b4d3SLarry Finger algorithm =
483f1d2b4d3SLarry Finger BT_8723B_2ANT_COEX_ALGO_PANHS;
484f1d2b4d3SLarry Finger } else {
485c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
4862277f5f1SLarry Finger DBG_LOUD,
487f1d2b4d3SLarry Finger "[BTCoex], PAN(EDR) only\n");
488f1d2b4d3SLarry Finger algorithm =
489f1d2b4d3SLarry Finger BT_8723B_2ANT_COEX_ALGO_PANEDR;
490f1d2b4d3SLarry Finger }
491f1d2b4d3SLarry Finger }
492f1d2b4d3SLarry Finger }
493f1d2b4d3SLarry Finger } else if (num_of_diff_profile == 2) {
494f1d2b4d3SLarry Finger if (bt_link_info->sco_exist) {
495f1d2b4d3SLarry Finger if (bt_link_info->hid_exist) {
496c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
497f1d2b4d3SLarry Finger "[BTCoex], SCO + HID\n");
498f1d2b4d3SLarry Finger algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
499f1d2b4d3SLarry Finger } else if (bt_link_info->a2dp_exist) {
500c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
501f1d2b4d3SLarry Finger "[BTCoex], SCO + A2DP ==> SCO\n");
502f1d2b4d3SLarry Finger algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
503f1d2b4d3SLarry Finger } else if (bt_link_info->pan_exist) {
504f1d2b4d3SLarry Finger if (bt_hs_on) {
505c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
5062277f5f1SLarry Finger DBG_LOUD,
507f1d2b4d3SLarry Finger "[BTCoex], SCO + PAN(HS)\n");
508f1d2b4d3SLarry Finger algorithm = BT_8723B_2ANT_COEX_ALGO_SCO;
509f1d2b4d3SLarry Finger } else {
510c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
5112277f5f1SLarry Finger DBG_LOUD,
512f1d2b4d3SLarry Finger "[BTCoex], SCO + PAN(EDR)\n");
513f1d2b4d3SLarry Finger algorithm =
514f1d2b4d3SLarry Finger BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
515f1d2b4d3SLarry Finger }
516f1d2b4d3SLarry Finger }
517f1d2b4d3SLarry Finger } else {
518f1d2b4d3SLarry Finger if (bt_link_info->hid_exist &&
519f1d2b4d3SLarry Finger bt_link_info->a2dp_exist) {
520c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
521f1d2b4d3SLarry Finger "[BTCoex], HID + A2DP\n");
522f1d2b4d3SLarry Finger algorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP;
523f1d2b4d3SLarry Finger } else if (bt_link_info->hid_exist &&
524f1d2b4d3SLarry Finger bt_link_info->pan_exist) {
525f1d2b4d3SLarry Finger if (bt_hs_on) {
526c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
5272277f5f1SLarry Finger DBG_LOUD,
528f1d2b4d3SLarry Finger "[BTCoex], HID + PAN(HS)\n");
529f1d2b4d3SLarry Finger algorithm = BT_8723B_2ANT_COEX_ALGO_HID;
530f1d2b4d3SLarry Finger } else {
531c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
5322277f5f1SLarry Finger DBG_LOUD,
533f1d2b4d3SLarry Finger "[BTCoex], HID + PAN(EDR)\n");
534f1d2b4d3SLarry Finger algorithm =
535f1d2b4d3SLarry Finger BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
536f1d2b4d3SLarry Finger }
537f1d2b4d3SLarry Finger } else if (bt_link_info->pan_exist &&
538f1d2b4d3SLarry Finger bt_link_info->a2dp_exist) {
539f1d2b4d3SLarry Finger if (bt_hs_on) {
540c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
5412277f5f1SLarry Finger DBG_LOUD,
542f1d2b4d3SLarry Finger "[BTCoex], A2DP + PAN(HS)\n");
543f1d2b4d3SLarry Finger algorithm =
544f1d2b4d3SLarry Finger BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS;
545f1d2b4d3SLarry Finger } else {
546c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
5472277f5f1SLarry Finger DBG_LOUD,
548f1d2b4d3SLarry Finger "[BTCoex],A2DP + PAN(EDR)\n");
549f1d2b4d3SLarry Finger algorithm =
550f1d2b4d3SLarry Finger BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP;
551f1d2b4d3SLarry Finger }
552f1d2b4d3SLarry Finger }
553f1d2b4d3SLarry Finger }
554f1d2b4d3SLarry Finger } else if (num_of_diff_profile == 3) {
555f1d2b4d3SLarry Finger if (bt_link_info->sco_exist) {
556f1d2b4d3SLarry Finger if (bt_link_info->hid_exist &&
557f1d2b4d3SLarry Finger bt_link_info->a2dp_exist) {
558c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
559466414a0SJoe Perches "[BTCoex], SCO + HID + A2DP ==> HID\n");
560f1d2b4d3SLarry Finger algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
561f1d2b4d3SLarry Finger } else if (bt_link_info->hid_exist &&
562f1d2b4d3SLarry Finger bt_link_info->pan_exist) {
563f1d2b4d3SLarry Finger if (bt_hs_on) {
564c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
5652277f5f1SLarry Finger DBG_LOUD,
566466414a0SJoe Perches "[BTCoex], SCO + HID + PAN(HS)\n");
567f1d2b4d3SLarry Finger algorithm =
568f1d2b4d3SLarry Finger BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
569f1d2b4d3SLarry Finger } else {
570c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
5712277f5f1SLarry Finger DBG_LOUD,
572466414a0SJoe Perches "[BTCoex], SCO + HID + PAN(EDR)\n");
573f1d2b4d3SLarry Finger algorithm =
574f1d2b4d3SLarry Finger BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
575f1d2b4d3SLarry Finger }
576f1d2b4d3SLarry Finger } else if (bt_link_info->pan_exist &&
577f1d2b4d3SLarry Finger bt_link_info->a2dp_exist) {
578f1d2b4d3SLarry Finger if (bt_hs_on) {
579c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
5802277f5f1SLarry Finger DBG_LOUD,
581466414a0SJoe Perches "[BTCoex], SCO + A2DP + PAN(HS)\n");
582f1d2b4d3SLarry Finger algorithm =
583f1d2b4d3SLarry Finger BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
584f1d2b4d3SLarry Finger } else {
585c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
5862277f5f1SLarry Finger DBG_LOUD,
587466414a0SJoe Perches "[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n");
588f1d2b4d3SLarry Finger algorithm =
589f1d2b4d3SLarry Finger BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
590f1d2b4d3SLarry Finger }
591f1d2b4d3SLarry Finger }
592f1d2b4d3SLarry Finger } else {
593f1d2b4d3SLarry Finger if (bt_link_info->hid_exist &&
594f1d2b4d3SLarry Finger bt_link_info->pan_exist &&
595f1d2b4d3SLarry Finger bt_link_info->a2dp_exist) {
596f1d2b4d3SLarry Finger if (bt_hs_on) {
597c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
5982277f5f1SLarry Finger DBG_LOUD,
599466414a0SJoe Perches "[BTCoex], HID + A2DP + PAN(HS)\n");
600f1d2b4d3SLarry Finger algorithm =
601f1d2b4d3SLarry Finger BT_8723B_2ANT_COEX_ALGO_HID_A2DP;
602f1d2b4d3SLarry Finger } else {
603c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
6042277f5f1SLarry Finger DBG_LOUD,
605466414a0SJoe Perches "[BTCoex], HID + A2DP + PAN(EDR)\n");
606f1d2b4d3SLarry Finger algorithm =
607f1d2b4d3SLarry Finger BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
608f1d2b4d3SLarry Finger }
609f1d2b4d3SLarry Finger }
610f1d2b4d3SLarry Finger }
611f1d2b4d3SLarry Finger } else if (num_of_diff_profile >= 3) {
612f1d2b4d3SLarry Finger if (bt_link_info->sco_exist) {
613f1d2b4d3SLarry Finger if (bt_link_info->hid_exist &&
614f1d2b4d3SLarry Finger bt_link_info->pan_exist &&
615f1d2b4d3SLarry Finger bt_link_info->a2dp_exist) {
616f1d2b4d3SLarry Finger if (bt_hs_on) {
617c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
6182277f5f1SLarry Finger DBG_LOUD,
619466414a0SJoe Perches "[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n");
620f1d2b4d3SLarry Finger } else {
621c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST,
6222277f5f1SLarry Finger DBG_LOUD,
623466414a0SJoe Perches "[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");
624f1d2b4d3SLarry Finger algorithm =
625f1d2b4d3SLarry Finger BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
626f1d2b4d3SLarry Finger }
627f1d2b4d3SLarry Finger }
628f1d2b4d3SLarry Finger }
629f1d2b4d3SLarry Finger }
630f1d2b4d3SLarry Finger return algorithm;
631f1d2b4d3SLarry Finger }
632f1d2b4d3SLarry Finger
btc8723b2ant_set_fw_dac_swing_level(struct btc_coexist * btcoexist,u8 dac_swing_lvl)633f1d2b4d3SLarry Finger static void btc8723b2ant_set_fw_dac_swing_level(struct btc_coexist *btcoexist,
634f1d2b4d3SLarry Finger u8 dac_swing_lvl)
635f1d2b4d3SLarry Finger {
6362277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
637f1d2b4d3SLarry Finger u8 h2c_parameter[1] = {0};
638f1d2b4d3SLarry Finger
639f1d2b4d3SLarry Finger /* There are several type of dacswing
640f1d2b4d3SLarry Finger * 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6
641f1d2b4d3SLarry Finger */
642f1d2b4d3SLarry Finger h2c_parameter[0] = dac_swing_lvl;
643f1d2b4d3SLarry Finger
644c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
645f1d2b4d3SLarry Finger "[BTCoex], Set Dac Swing Level=0x%x\n", dac_swing_lvl);
646c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
647f1d2b4d3SLarry Finger "[BTCoex], FW write 0x64=0x%x\n", h2c_parameter[0]);
648f1d2b4d3SLarry Finger
649f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);
650f1d2b4d3SLarry Finger }
651f1d2b4d3SLarry Finger
btc8723b2ant_set_fw_dec_bt_pwr(struct btc_coexist * btcoexist,u8 dec_bt_pwr_lvl)652f1d2b4d3SLarry Finger static void btc8723b2ant_set_fw_dec_bt_pwr(struct btc_coexist *btcoexist,
65344e9a534SYan-Hsuan Chuang u8 dec_bt_pwr_lvl)
654f1d2b4d3SLarry Finger {
6552277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
656f1d2b4d3SLarry Finger u8 h2c_parameter[1] = {0};
657f1d2b4d3SLarry Finger
65844e9a534SYan-Hsuan Chuang h2c_parameter[0] = dec_bt_pwr_lvl;
659f1d2b4d3SLarry Finger
660c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
66144e9a534SYan-Hsuan Chuang "[BTCoex], decrease Bt Power Level : %u\n", dec_bt_pwr_lvl);
662f1d2b4d3SLarry Finger
663f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter);
664f1d2b4d3SLarry Finger }
665f1d2b4d3SLarry Finger
btc8723b2ant_dec_bt_pwr(struct btc_coexist * btcoexist,bool force_exec,u8 dec_bt_pwr_lvl)666f1d2b4d3SLarry Finger static void btc8723b2ant_dec_bt_pwr(struct btc_coexist *btcoexist,
66744e9a534SYan-Hsuan Chuang bool force_exec, u8 dec_bt_pwr_lvl)
668f1d2b4d3SLarry Finger {
6692277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
6702277f5f1SLarry Finger
671c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
67244e9a534SYan-Hsuan Chuang "[BTCoex], Dec BT power level = %u\n", dec_bt_pwr_lvl);
67344e9a534SYan-Hsuan Chuang coex_dm->cur_dec_bt_pwr_lvl = dec_bt_pwr_lvl;
674f1d2b4d3SLarry Finger
675f1d2b4d3SLarry Finger if (!force_exec) {
676c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
67744e9a534SYan-Hsuan Chuang "[BTCoex], PreDecBtPwrLvl=%d, CurDecBtPwrLvl=%d\n",
67844e9a534SYan-Hsuan Chuang coex_dm->pre_dec_bt_pwr_lvl,
67944e9a534SYan-Hsuan Chuang coex_dm->cur_dec_bt_pwr_lvl);
680f1d2b4d3SLarry Finger
68144e9a534SYan-Hsuan Chuang if (coex_dm->pre_dec_bt_pwr_lvl == coex_dm->cur_dec_bt_pwr_lvl)
682f1d2b4d3SLarry Finger return;
683f1d2b4d3SLarry Finger }
68444e9a534SYan-Hsuan Chuang btc8723b2ant_set_fw_dec_bt_pwr(btcoexist, coex_dm->cur_dec_bt_pwr_lvl);
685f1d2b4d3SLarry Finger
68644e9a534SYan-Hsuan Chuang coex_dm->pre_dec_bt_pwr_lvl = coex_dm->cur_dec_bt_pwr_lvl;
687f1d2b4d3SLarry Finger }
688f1d2b4d3SLarry Finger
689d6a82054SLarry Finger static
halbtc8723b2ant_set_bt_auto_report(struct btc_coexist * btcoexist,bool enable_auto_report)690d6a82054SLarry Finger void halbtc8723b2ant_set_bt_auto_report(struct btc_coexist *btcoexist,
691d6a82054SLarry Finger bool enable_auto_report)
692d6a82054SLarry Finger {
693d6a82054SLarry Finger u8 h2c_parameter[1] = {0};
694d6a82054SLarry Finger
695d6a82054SLarry Finger h2c_parameter[0] = 0;
696d6a82054SLarry Finger
697d6a82054SLarry Finger if (enable_auto_report)
698d6a82054SLarry Finger h2c_parameter[0] |= BIT(0);
699d6a82054SLarry Finger
700d6a82054SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
701d6a82054SLarry Finger }
702d6a82054SLarry Finger
703d6a82054SLarry Finger static
btc8723b2ant_bt_auto_report(struct btc_coexist * btcoexist,bool force_exec,bool enable_auto_report)704d6a82054SLarry Finger void btc8723b2ant_bt_auto_report(struct btc_coexist *btcoexist,
705d6a82054SLarry Finger bool force_exec, bool enable_auto_report)
706d6a82054SLarry Finger {
707d6a82054SLarry Finger coex_dm->cur_bt_auto_report = enable_auto_report;
708d6a82054SLarry Finger
709d6a82054SLarry Finger if (!force_exec) {
710d6a82054SLarry Finger if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
711d6a82054SLarry Finger return;
712d6a82054SLarry Finger }
713d6a82054SLarry Finger halbtc8723b2ant_set_bt_auto_report(btcoexist,
714d6a82054SLarry Finger coex_dm->cur_bt_auto_report);
715d6a82054SLarry Finger
716d6a82054SLarry Finger coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
717d6a82054SLarry Finger }
718d6a82054SLarry Finger
btc8723b2ant_fw_dac_swing_lvl(struct btc_coexist * btcoexist,bool force_exec,u8 fw_dac_swing_lvl)719f1d2b4d3SLarry Finger static void btc8723b2ant_fw_dac_swing_lvl(struct btc_coexist *btcoexist,
720f1d2b4d3SLarry Finger bool force_exec, u8 fw_dac_swing_lvl)
721f1d2b4d3SLarry Finger {
7222277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
7232277f5f1SLarry Finger
724c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
725f1d2b4d3SLarry Finger "[BTCoex], %s set FW Dac Swing level = %d\n",
726f1d2b4d3SLarry Finger (force_exec ? "force to" : ""), fw_dac_swing_lvl);
727f1d2b4d3SLarry Finger coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl;
728f1d2b4d3SLarry Finger
729f1d2b4d3SLarry Finger if (!force_exec) {
730c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
731466414a0SJoe Perches "[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n",
732f1d2b4d3SLarry Finger coex_dm->pre_fw_dac_swing_lvl,
733f1d2b4d3SLarry Finger coex_dm->cur_fw_dac_swing_lvl);
734f1d2b4d3SLarry Finger
735f1d2b4d3SLarry Finger if (coex_dm->pre_fw_dac_swing_lvl ==
736f1d2b4d3SLarry Finger coex_dm->cur_fw_dac_swing_lvl)
737f1d2b4d3SLarry Finger return;
738f1d2b4d3SLarry Finger }
739f1d2b4d3SLarry Finger
740f1d2b4d3SLarry Finger btc8723b2ant_set_fw_dac_swing_level(btcoexist,
741f1d2b4d3SLarry Finger coex_dm->cur_fw_dac_swing_lvl);
742f1d2b4d3SLarry Finger coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;
743f1d2b4d3SLarry Finger }
744f1d2b4d3SLarry Finger
btc8723b_set_penalty_txrate(struct btc_coexist * btcoexist,bool low_penalty_ra)745f1d2b4d3SLarry Finger static void btc8723b_set_penalty_txrate(struct btc_coexist *btcoexist,
746f1d2b4d3SLarry Finger bool low_penalty_ra)
747f1d2b4d3SLarry Finger {
7482277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
749f1d2b4d3SLarry Finger u8 h2c_parameter[6] = {0};
750f1d2b4d3SLarry Finger
751c6821613SYan-Hsuan Chuang h2c_parameter[0] = 0x6; /* op_code, 0x6 = Retry_Penalty */
752f1d2b4d3SLarry Finger
753f1d2b4d3SLarry Finger if (low_penalty_ra) {
754f1d2b4d3SLarry Finger h2c_parameter[1] |= BIT0;
755f1d2b4d3SLarry Finger /* normal rate except MCS7/6/5, OFDM54/48/36 */
756f1d2b4d3SLarry Finger h2c_parameter[2] = 0x00;
757e4782bc6SYan-Hsuan Chuang h2c_parameter[3] = 0xf4; /* MCS7 or OFDM54 */
758e4782bc6SYan-Hsuan Chuang h2c_parameter[4] = 0xf5; /* MCS6 or OFDM48 */
759e4782bc6SYan-Hsuan Chuang h2c_parameter[5] = 0xf6; /* MCS5 or OFDM36 */
760f1d2b4d3SLarry Finger }
761f1d2b4d3SLarry Finger
762c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
763f1d2b4d3SLarry Finger "[BTCoex], set WiFi Low-Penalty Retry: %s",
764f1d2b4d3SLarry Finger (low_penalty_ra ? "ON!!" : "OFF!!"));
765f1d2b4d3SLarry Finger
766f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
767f1d2b4d3SLarry Finger }
768f1d2b4d3SLarry Finger
btc8723b2ant_low_penalty_ra(struct btc_coexist * btcoexist,bool force_exec,bool low_penalty_ra)769f1d2b4d3SLarry Finger static void btc8723b2ant_low_penalty_ra(struct btc_coexist *btcoexist,
770f1d2b4d3SLarry Finger bool force_exec, bool low_penalty_ra)
771f1d2b4d3SLarry Finger {
7722277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
7732277f5f1SLarry Finger
774c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
775f1d2b4d3SLarry Finger "[BTCoex], %s turn LowPenaltyRA = %s\n",
776f1d2b4d3SLarry Finger (force_exec ? "force to" : ""), (low_penalty_ra ?
777f1d2b4d3SLarry Finger "ON" : "OFF"));
778f1d2b4d3SLarry Finger coex_dm->cur_low_penalty_ra = low_penalty_ra;
779f1d2b4d3SLarry Finger
780f1d2b4d3SLarry Finger if (!force_exec) {
781c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
782466414a0SJoe Perches "[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n",
783f1d2b4d3SLarry Finger coex_dm->pre_low_penalty_ra,
784f1d2b4d3SLarry Finger coex_dm->cur_low_penalty_ra);
785f1d2b4d3SLarry Finger
786f1d2b4d3SLarry Finger if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
787f1d2b4d3SLarry Finger return;
788f1d2b4d3SLarry Finger }
789f1d2b4d3SLarry Finger btc8723b_set_penalty_txrate(btcoexist, coex_dm->cur_low_penalty_ra);
790f1d2b4d3SLarry Finger
791f1d2b4d3SLarry Finger coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
792f1d2b4d3SLarry Finger }
793f1d2b4d3SLarry Finger
btc8723b2ant_set_dac_swing_reg(struct btc_coexist * btcoexist,u32 level)794f1d2b4d3SLarry Finger static void btc8723b2ant_set_dac_swing_reg(struct btc_coexist *btcoexist,
795f1d2b4d3SLarry Finger u32 level)
796f1d2b4d3SLarry Finger {
7972277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
798f1d2b4d3SLarry Finger u8 val = (u8) level;
7992277f5f1SLarry Finger
800c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
801f1d2b4d3SLarry Finger "[BTCoex], Write SwDacSwing = 0x%x\n", level);
802f1d2b4d3SLarry Finger btcoexist->btc_write_1byte_bitmask(btcoexist, 0x883, 0x3e, val);
803f1d2b4d3SLarry Finger }
804f1d2b4d3SLarry Finger
btc8723b2ant_set_sw_fulltime_dac_swing(struct btc_coexist * btcoex,bool sw_dac_swing_on,u32 sw_dac_swing_lvl)805f1d2b4d3SLarry Finger static void btc8723b2ant_set_sw_fulltime_dac_swing(struct btc_coexist *btcoex,
806f1d2b4d3SLarry Finger bool sw_dac_swing_on,
807f1d2b4d3SLarry Finger u32 sw_dac_swing_lvl)
808f1d2b4d3SLarry Finger {
809f1d2b4d3SLarry Finger if (sw_dac_swing_on)
810f1d2b4d3SLarry Finger btc8723b2ant_set_dac_swing_reg(btcoex, sw_dac_swing_lvl);
811f1d2b4d3SLarry Finger else
812f1d2b4d3SLarry Finger btc8723b2ant_set_dac_swing_reg(btcoex, 0x18);
813f1d2b4d3SLarry Finger }
814f1d2b4d3SLarry Finger
btc8723b2ant_dac_swing(struct btc_coexist * btcoexist,bool force_exec,bool dac_swing_on,u32 dac_swing_lvl)81591b9e684SPing-Ke Shih static void btc8723b2ant_dac_swing(struct btc_coexist *btcoexist,
816f1d2b4d3SLarry Finger bool force_exec, bool dac_swing_on,
817f1d2b4d3SLarry Finger u32 dac_swing_lvl)
818f1d2b4d3SLarry Finger {
8192277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
8202277f5f1SLarry Finger
821c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
822f1d2b4d3SLarry Finger "[BTCoex], %s turn DacSwing=%s, dac_swing_lvl=0x%x\n",
823f1d2b4d3SLarry Finger (force_exec ? "force to" : ""),
824f1d2b4d3SLarry Finger (dac_swing_on ? "ON" : "OFF"), dac_swing_lvl);
825f1d2b4d3SLarry Finger coex_dm->cur_dac_swing_on = dac_swing_on;
826f1d2b4d3SLarry Finger coex_dm->cur_dac_swing_lvl = dac_swing_lvl;
827f1d2b4d3SLarry Finger
828f1d2b4d3SLarry Finger if (!force_exec) {
829c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
830466414a0SJoe Perches "[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n",
831466414a0SJoe Perches coex_dm->pre_dac_swing_on,
832466414a0SJoe Perches coex_dm->pre_dac_swing_lvl,
833f1d2b4d3SLarry Finger coex_dm->cur_dac_swing_on,
834f1d2b4d3SLarry Finger coex_dm->cur_dac_swing_lvl);
835f1d2b4d3SLarry Finger
836f1d2b4d3SLarry Finger if ((coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) &&
837f1d2b4d3SLarry Finger (coex_dm->pre_dac_swing_lvl == coex_dm->cur_dac_swing_lvl))
838f1d2b4d3SLarry Finger return;
839f1d2b4d3SLarry Finger }
840f1d2b4d3SLarry Finger mdelay(30);
841f1d2b4d3SLarry Finger btc8723b2ant_set_sw_fulltime_dac_swing(btcoexist, dac_swing_on,
842f1d2b4d3SLarry Finger dac_swing_lvl);
843f1d2b4d3SLarry Finger
844f1d2b4d3SLarry Finger coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on;
845f1d2b4d3SLarry Finger coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl;
846f1d2b4d3SLarry Finger }
847f1d2b4d3SLarry Finger
btc8723b2ant_set_coex_table(struct btc_coexist * btcoexist,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)848f1d2b4d3SLarry Finger static void btc8723b2ant_set_coex_table(struct btc_coexist *btcoexist,
849f1d2b4d3SLarry Finger u32 val0x6c0, u32 val0x6c4,
850f1d2b4d3SLarry Finger u32 val0x6c8, u8 val0x6cc)
851f1d2b4d3SLarry Finger {
8522277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
8532277f5f1SLarry Finger
854c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
855f1d2b4d3SLarry Finger "[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0);
856f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
857f1d2b4d3SLarry Finger
858c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
859f1d2b4d3SLarry Finger "[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4);
860f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
861f1d2b4d3SLarry Finger
862c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
863f1d2b4d3SLarry Finger "[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8);
864f1d2b4d3SLarry Finger btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
865f1d2b4d3SLarry Finger
866c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
867f1d2b4d3SLarry Finger "[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc);
868f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
869f1d2b4d3SLarry Finger }
870f1d2b4d3SLarry Finger
btc8723b2ant_coex_table(struct btc_coexist * btcoexist,bool force_exec,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)871f1d2b4d3SLarry Finger static void btc8723b2ant_coex_table(struct btc_coexist *btcoexist,
872f1d2b4d3SLarry Finger bool force_exec, u32 val0x6c0,
873f1d2b4d3SLarry Finger u32 val0x6c4, u32 val0x6c8,
874f1d2b4d3SLarry Finger u8 val0x6cc)
875f1d2b4d3SLarry Finger {
8762277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
8772277f5f1SLarry Finger
878c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
879466414a0SJoe Perches "[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n",
880466414a0SJoe Perches force_exec ? "force to" : "",
881466414a0SJoe Perches val0x6c0, val0x6c4, val0x6c8, val0x6cc);
882f1d2b4d3SLarry Finger coex_dm->cur_val0x6c0 = val0x6c0;
883f1d2b4d3SLarry Finger coex_dm->cur_val0x6c4 = val0x6c4;
884f1d2b4d3SLarry Finger coex_dm->cur_val0x6c8 = val0x6c8;
885f1d2b4d3SLarry Finger coex_dm->cur_val0x6cc = val0x6cc;
886f1d2b4d3SLarry Finger
887f1d2b4d3SLarry Finger if (!force_exec) {
888c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
889466414a0SJoe Perches "[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n",
890f1d2b4d3SLarry Finger coex_dm->pre_val0x6c0, coex_dm->pre_val0x6c4,
891f1d2b4d3SLarry Finger coex_dm->pre_val0x6c8, coex_dm->pre_val0x6cc);
892c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
893466414a0SJoe Perches "[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n",
894f1d2b4d3SLarry Finger coex_dm->cur_val0x6c0, coex_dm->cur_val0x6c4,
895f1d2b4d3SLarry Finger coex_dm->cur_val0x6c8, coex_dm->cur_val0x6cc);
896f1d2b4d3SLarry Finger
897f1d2b4d3SLarry Finger if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
898f1d2b4d3SLarry Finger (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
899f1d2b4d3SLarry Finger (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
900f1d2b4d3SLarry Finger (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
901f1d2b4d3SLarry Finger return;
902f1d2b4d3SLarry Finger }
903f1d2b4d3SLarry Finger btc8723b2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,
904f1d2b4d3SLarry Finger val0x6c8, val0x6cc);
905f1d2b4d3SLarry Finger
906f1d2b4d3SLarry Finger coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
907f1d2b4d3SLarry Finger coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
908f1d2b4d3SLarry Finger coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
909f1d2b4d3SLarry Finger coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
910f1d2b4d3SLarry Finger }
911f1d2b4d3SLarry Finger
btc8723b2ant_coex_table_with_type(struct btc_coexist * btcoexist,bool force_exec,u8 type)912c6821613SYan-Hsuan Chuang static void btc8723b2ant_coex_table_with_type(struct btc_coexist *btcoexist,
913f1d2b4d3SLarry Finger bool force_exec, u8 type)
914f1d2b4d3SLarry Finger {
915f1d2b4d3SLarry Finger switch (type) {
916f1d2b4d3SLarry Finger case 0:
917f1d2b4d3SLarry Finger btc8723b2ant_coex_table(btcoexist, force_exec, 0x55555555,
918f36714fbSYan-Hsuan Chuang 0x55555555, 0xffffff, 0x3);
919f1d2b4d3SLarry Finger break;
920f1d2b4d3SLarry Finger case 1:
921f1d2b4d3SLarry Finger btc8723b2ant_coex_table(btcoexist, force_exec, 0x55555555,
922f36714fbSYan-Hsuan Chuang 0x5afa5afa, 0xffffff, 0x3);
923f1d2b4d3SLarry Finger break;
924f1d2b4d3SLarry Finger case 2:
925f36714fbSYan-Hsuan Chuang btc8723b2ant_coex_table(btcoexist, force_exec, 0x5ada5ada,
926f36714fbSYan-Hsuan Chuang 0x5ada5ada, 0xffffff, 0x3);
927f1d2b4d3SLarry Finger break;
928f1d2b4d3SLarry Finger case 3:
929f1d2b4d3SLarry Finger btc8723b2ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,
930f36714fbSYan-Hsuan Chuang 0xaaaaaaaa, 0xffffff, 0x3);
931f1d2b4d3SLarry Finger break;
932f1d2b4d3SLarry Finger case 4:
933f1d2b4d3SLarry Finger btc8723b2ant_coex_table(btcoexist, force_exec, 0xffffffff,
934f36714fbSYan-Hsuan Chuang 0xffffffff, 0xffffff, 0x3);
935f1d2b4d3SLarry Finger break;
936f1d2b4d3SLarry Finger case 5:
937f1d2b4d3SLarry Finger btc8723b2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
938f36714fbSYan-Hsuan Chuang 0x5fff5fff, 0xffffff, 0x3);
939f1d2b4d3SLarry Finger break;
940f1d2b4d3SLarry Finger case 6:
941f1d2b4d3SLarry Finger btc8723b2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
942f36714fbSYan-Hsuan Chuang 0x5a5a5a5a, 0xffffff, 0x3);
943f1d2b4d3SLarry Finger break;
944f1d2b4d3SLarry Finger case 7:
945f36714fbSYan-Hsuan Chuang btc8723b2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
946f36714fbSYan-Hsuan Chuang 0x5ada5ada, 0xffffff, 0x3);
947f1d2b4d3SLarry Finger break;
948f1d2b4d3SLarry Finger case 8:
949f36714fbSYan-Hsuan Chuang btc8723b2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
950f36714fbSYan-Hsuan Chuang 0x5ada5ada, 0xffffff, 0x3);
951f1d2b4d3SLarry Finger break;
952f1d2b4d3SLarry Finger case 9:
953f36714fbSYan-Hsuan Chuang btc8723b2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
954f36714fbSYan-Hsuan Chuang 0x5ada5ada, 0xffffff, 0x3);
955f1d2b4d3SLarry Finger break;
956f1d2b4d3SLarry Finger case 10:
957f36714fbSYan-Hsuan Chuang btc8723b2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
958f36714fbSYan-Hsuan Chuang 0x5ada5ada, 0xffffff, 0x3);
959f1d2b4d3SLarry Finger break;
960f1d2b4d3SLarry Finger case 11:
961f36714fbSYan-Hsuan Chuang btc8723b2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
962f36714fbSYan-Hsuan Chuang 0x5ada5ada, 0xffffff, 0x3);
963f1d2b4d3SLarry Finger break;
964f1d2b4d3SLarry Finger case 12:
965f36714fbSYan-Hsuan Chuang btc8723b2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
966f36714fbSYan-Hsuan Chuang 0x5ada5ada, 0xffffff, 0x3);
967f36714fbSYan-Hsuan Chuang break;
968f36714fbSYan-Hsuan Chuang case 13:
969f36714fbSYan-Hsuan Chuang btc8723b2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
970f36714fbSYan-Hsuan Chuang 0xaaaaaaaa, 0xffffff, 0x3);
971f36714fbSYan-Hsuan Chuang break;
972f36714fbSYan-Hsuan Chuang case 14:
973f36714fbSYan-Hsuan Chuang btc8723b2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
974f36714fbSYan-Hsuan Chuang 0x5ada5ada, 0xffffff, 0x3);
975f36714fbSYan-Hsuan Chuang break;
976f36714fbSYan-Hsuan Chuang case 15:
977f36714fbSYan-Hsuan Chuang btc8723b2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
978f36714fbSYan-Hsuan Chuang 0xaaaaaaaa, 0xffffff, 0x3);
979f1d2b4d3SLarry Finger break;
980f1d2b4d3SLarry Finger default:
981f1d2b4d3SLarry Finger break;
982f1d2b4d3SLarry Finger }
983f1d2b4d3SLarry Finger }
984f1d2b4d3SLarry Finger
btc8723b2ant_set_fw_ignore_wlan_act(struct btc_coexist * btcoexist,bool enable)985f1d2b4d3SLarry Finger static void btc8723b2ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,
986f1d2b4d3SLarry Finger bool enable)
987f1d2b4d3SLarry Finger {
9882277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
989f1d2b4d3SLarry Finger u8 h2c_parameter[1] = {0};
990f1d2b4d3SLarry Finger
991f1d2b4d3SLarry Finger if (enable)
992f1d2b4d3SLarry Finger h2c_parameter[0] |= BIT0; /* function enable */
993f1d2b4d3SLarry Finger
994c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
995466414a0SJoe Perches "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n",
996466414a0SJoe Perches h2c_parameter[0]);
997f1d2b4d3SLarry Finger
998f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
999f1d2b4d3SLarry Finger }
1000f1d2b4d3SLarry Finger
btc8723b2ant_set_lps_rpwm(struct btc_coexist * btcoexist,u8 lps_val,u8 rpwm_val)1001b01127b2SYan-Hsuan Chuang static void btc8723b2ant_set_lps_rpwm(struct btc_coexist *btcoexist,
1002b01127b2SYan-Hsuan Chuang u8 lps_val, u8 rpwm_val)
1003b01127b2SYan-Hsuan Chuang {
1004b01127b2SYan-Hsuan Chuang u8 lps = lps_val;
1005b01127b2SYan-Hsuan Chuang u8 rpwm = rpwm_val;
1006b01127b2SYan-Hsuan Chuang
1007b01127b2SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
1008b01127b2SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
1009b01127b2SYan-Hsuan Chuang }
1010b01127b2SYan-Hsuan Chuang
btc8723b2ant_lps_rpwm(struct btc_coexist * btcoexist,bool force_exec,u8 lps_val,u8 rpwm_val)1011b01127b2SYan-Hsuan Chuang static void btc8723b2ant_lps_rpwm(struct btc_coexist *btcoexist,
1012b01127b2SYan-Hsuan Chuang bool force_exec, u8 lps_val, u8 rpwm_val)
1013b01127b2SYan-Hsuan Chuang {
1014b01127b2SYan-Hsuan Chuang coex_dm->cur_lps = lps_val;
1015b01127b2SYan-Hsuan Chuang coex_dm->cur_rpwm = rpwm_val;
1016b01127b2SYan-Hsuan Chuang
1017b01127b2SYan-Hsuan Chuang if (!force_exec) {
1018b01127b2SYan-Hsuan Chuang if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
1019b01127b2SYan-Hsuan Chuang (coex_dm->pre_rpwm == coex_dm->cur_rpwm))
1020b01127b2SYan-Hsuan Chuang return;
1021b01127b2SYan-Hsuan Chuang }
1022b01127b2SYan-Hsuan Chuang btc8723b2ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
1023b01127b2SYan-Hsuan Chuang
1024b01127b2SYan-Hsuan Chuang coex_dm->pre_lps = coex_dm->cur_lps;
1025b01127b2SYan-Hsuan Chuang coex_dm->pre_rpwm = coex_dm->cur_rpwm;
1026b01127b2SYan-Hsuan Chuang }
1027b01127b2SYan-Hsuan Chuang
btc8723b2ant_ignore_wlan_act(struct btc_coexist * btcoexist,bool force_exec,bool enable)1028f1d2b4d3SLarry Finger static void btc8723b2ant_ignore_wlan_act(struct btc_coexist *btcoexist,
1029f1d2b4d3SLarry Finger bool force_exec, bool enable)
1030f1d2b4d3SLarry Finger {
10312277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
10322277f5f1SLarry Finger
1033c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1034f1d2b4d3SLarry Finger "[BTCoex], %s turn Ignore WlanAct %s\n",
1035f1d2b4d3SLarry Finger (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
1036f1d2b4d3SLarry Finger coex_dm->cur_ignore_wlan_act = enable;
1037f1d2b4d3SLarry Finger
1038f1d2b4d3SLarry Finger if (!force_exec) {
1039c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1040466414a0SJoe Perches "[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n",
1041f1d2b4d3SLarry Finger coex_dm->pre_ignore_wlan_act,
1042f1d2b4d3SLarry Finger coex_dm->cur_ignore_wlan_act);
1043f1d2b4d3SLarry Finger
1044f1d2b4d3SLarry Finger if (coex_dm->pre_ignore_wlan_act ==
1045f1d2b4d3SLarry Finger coex_dm->cur_ignore_wlan_act)
1046f1d2b4d3SLarry Finger return;
1047f1d2b4d3SLarry Finger }
1048f1d2b4d3SLarry Finger btc8723b2ant_set_fw_ignore_wlan_act(btcoexist, enable);
1049f1d2b4d3SLarry Finger
1050f1d2b4d3SLarry Finger coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
1051f1d2b4d3SLarry Finger }
1052f1d2b4d3SLarry Finger
btc8723b2ant_set_fw_ps_tdma(struct btc_coexist * btcoexist,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 byte5)1053f1d2b4d3SLarry Finger static void btc8723b2ant_set_fw_ps_tdma(struct btc_coexist *btcoexist, u8 byte1,
1054f1d2b4d3SLarry Finger u8 byte2, u8 byte3, u8 byte4, u8 byte5)
1055f1d2b4d3SLarry Finger {
10562277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
1057f1d2b4d3SLarry Finger u8 h2c_parameter[5];
1058a0f430b3SYan-Hsuan Chuang if ((coex_sta->a2dp_exist) && (coex_sta->hid_exist))
1059a0f430b3SYan-Hsuan Chuang byte5 = byte5 | 0x1;
1060f1d2b4d3SLarry Finger
1061f1d2b4d3SLarry Finger h2c_parameter[0] = byte1;
1062f1d2b4d3SLarry Finger h2c_parameter[1] = byte2;
1063f1d2b4d3SLarry Finger h2c_parameter[2] = byte3;
1064f1d2b4d3SLarry Finger h2c_parameter[3] = byte4;
1065f1d2b4d3SLarry Finger h2c_parameter[4] = byte5;
1066f1d2b4d3SLarry Finger
1067f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[0] = byte1;
1068f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[1] = byte2;
1069f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[2] = byte3;
1070f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[3] = byte4;
1071f1d2b4d3SLarry Finger coex_dm->ps_tdma_para[4] = byte5;
1072f1d2b4d3SLarry Finger
1073c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1074f1d2b4d3SLarry Finger "[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n",
1075f1d2b4d3SLarry Finger h2c_parameter[0],
1076f1d2b4d3SLarry Finger h2c_parameter[1] << 24 | h2c_parameter[2] << 16 |
1077f1d2b4d3SLarry Finger h2c_parameter[3] << 8 | h2c_parameter[4]);
1078f1d2b4d3SLarry Finger
1079f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1080f1d2b4d3SLarry Finger }
1081f1d2b4d3SLarry Finger
btc8723b2ant_sw_mechanism(struct btc_coexist * btcoexist,bool shrink_rx_lpf,bool low_penalty_ra,bool limited_dig,bool bt_lna_constrain)1082c6821613SYan-Hsuan Chuang static void btc8723b2ant_sw_mechanism(struct btc_coexist *btcoexist,
1083f1d2b4d3SLarry Finger bool shrink_rx_lpf, bool low_penalty_ra,
1084f1d2b4d3SLarry Finger bool limited_dig, bool bt_lna_constrain)
1085f1d2b4d3SLarry Finger {
1086f1d2b4d3SLarry Finger btc8723b2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
1087f1d2b4d3SLarry Finger }
1088f1d2b4d3SLarry Finger
btc8723b2ant_set_ant_path(struct btc_coexist * btcoexist,u8 antpos_type,bool init_hwcfg,bool wifi_off)1089f1d2b4d3SLarry Finger static void btc8723b2ant_set_ant_path(struct btc_coexist *btcoexist,
1090f1d2b4d3SLarry Finger u8 antpos_type, bool init_hwcfg,
1091f1d2b4d3SLarry Finger bool wifi_off)
1092f1d2b4d3SLarry Finger {
1093f1d2b4d3SLarry Finger struct btc_board_info *board_info = &btcoexist->board_info;
1094f1d2b4d3SLarry Finger u32 fw_ver = 0, u32tmp = 0;
1095f1d2b4d3SLarry Finger bool pg_ext_switch = false;
1096f1d2b4d3SLarry Finger bool use_ext_switch = false;
1097f1d2b4d3SLarry Finger u8 h2c_parameter[2] = {0};
1098f1d2b4d3SLarry Finger
1099f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_EXT_SWITCH, &pg_ext_switch);
1100f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
1101f1d2b4d3SLarry Finger
1102f1d2b4d3SLarry Finger if ((fw_ver < 0xc0000) || pg_ext_switch)
1103f1d2b4d3SLarry Finger use_ext_switch = true;
1104f1d2b4d3SLarry Finger
1105f1d2b4d3SLarry Finger if (init_hwcfg) {
1106bcd37f4aSYan-Hsuan Chuang btcoexist->btc_write_1byte_bitmask(btcoexist, 0x39, 0x8, 0x1);
1107f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
1108f1d2b4d3SLarry Finger btcoexist->btc_write_1byte_bitmask(btcoexist, 0x944, 0x3, 0x3);
1109f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x930, 0x77);
1110f1d2b4d3SLarry Finger btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x1);
1111f1d2b4d3SLarry Finger
1112495d36e6SYan-Hsuan Chuang if (fw_ver >= 0x180000) {
1113495d36e6SYan-Hsuan Chuang /* Use H2C to set GNT_BT to High to avoid A2DP click */
1114495d36e6SYan-Hsuan Chuang h2c_parameter[0] = 1;
1115495d36e6SYan-Hsuan Chuang btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
1116495d36e6SYan-Hsuan Chuang h2c_parameter);
1117495d36e6SYan-Hsuan Chuang } else {
1118495d36e6SYan-Hsuan Chuang btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
1119495d36e6SYan-Hsuan Chuang }
1120f1d2b4d3SLarry Finger
1121bcd37f4aSYan-Hsuan Chuang btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
1122bcd37f4aSYan-Hsuan Chuang
1123bcd37f4aSYan-Hsuan Chuang /* WiFi TRx Mask off */
1124bcd37f4aSYan-Hsuan Chuang btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A,
1125bcd37f4aSYan-Hsuan Chuang 0x1, 0xfffff, 0x0);
1126bcd37f4aSYan-Hsuan Chuang
1127f1d2b4d3SLarry Finger if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {
1128f1d2b4d3SLarry Finger /* tell firmware "no antenna inverse" */
1129f1d2b4d3SLarry Finger h2c_parameter[0] = 0;
1130f1d2b4d3SLarry Finger } else {
1131f1d2b4d3SLarry Finger /* tell firmware "antenna inverse" */
1132f1d2b4d3SLarry Finger h2c_parameter[0] = 1;
1133495d36e6SYan-Hsuan Chuang }
11343b4fa04dSYan-Hsuan Chuang
11353b4fa04dSYan-Hsuan Chuang if (use_ext_switch) {
11363b4fa04dSYan-Hsuan Chuang /* ext switch type */
11373b4fa04dSYan-Hsuan Chuang h2c_parameter[1] = 1;
11383b4fa04dSYan-Hsuan Chuang } else {
11393b4fa04dSYan-Hsuan Chuang /* int switch type */
11403b4fa04dSYan-Hsuan Chuang h2c_parameter[1] = 0;
11413b4fa04dSYan-Hsuan Chuang }
11423b4fa04dSYan-Hsuan Chuang btcoexist->btc_fill_h2c(btcoexist, 0x65, 2, h2c_parameter);
1143495d36e6SYan-Hsuan Chuang } else {
1144495d36e6SYan-Hsuan Chuang if (fw_ver >= 0x180000) {
1145495d36e6SYan-Hsuan Chuang /* Use H2C to set GNT_BT to "Control by PTA"*/
1146495d36e6SYan-Hsuan Chuang h2c_parameter[0] = 0;
1147495d36e6SYan-Hsuan Chuang btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
1148f1d2b4d3SLarry Finger h2c_parameter);
1149bcd37f4aSYan-Hsuan Chuang } else {
1150bcd37f4aSYan-Hsuan Chuang btcoexist->btc_write_1byte(btcoexist, 0x765, 0x0);
1151f1d2b4d3SLarry Finger }
1152f1d2b4d3SLarry Finger }
1153f1d2b4d3SLarry Finger
1154f1d2b4d3SLarry Finger /* ext switch setting */
1155f1d2b4d3SLarry Finger if (use_ext_switch) {
1156bcd37f4aSYan-Hsuan Chuang if (init_hwcfg) {
1157bcd37f4aSYan-Hsuan Chuang /* 0x4c[23] = 0, 0x4c[24] = 1 Ant controlled by WL/BT */
1158bcd37f4aSYan-Hsuan Chuang u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
1159bcd37f4aSYan-Hsuan Chuang u32tmp &= ~BIT23;
1160bcd37f4aSYan-Hsuan Chuang u32tmp |= BIT24;
1161bcd37f4aSYan-Hsuan Chuang btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
1162bcd37f4aSYan-Hsuan Chuang }
1163bcd37f4aSYan-Hsuan Chuang
1164f1d2b4d3SLarry Finger /* fixed internal switch S1->WiFi, S0->BT */
1165a33fcba6SLarry Finger if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
1166a33fcba6SLarry Finger btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
1167a33fcba6SLarry Finger else
1168a33fcba6SLarry Finger btcoexist->btc_write_2byte(btcoexist, 0x948, 0x280);
1169baa17022SLarry Finger
1170f1d2b4d3SLarry Finger switch (antpos_type) {
1171f1d2b4d3SLarry Finger case BTC_ANT_WIFI_AT_MAIN:
1172f1d2b4d3SLarry Finger /* ext switch main at wifi */
1173f1d2b4d3SLarry Finger btcoexist->btc_write_1byte_bitmask(btcoexist, 0x92c,
1174f1d2b4d3SLarry Finger 0x3, 0x1);
1175f1d2b4d3SLarry Finger break;
1176f1d2b4d3SLarry Finger case BTC_ANT_WIFI_AT_AUX:
1177f1d2b4d3SLarry Finger /* ext switch aux at wifi */
1178f1d2b4d3SLarry Finger btcoexist->btc_write_1byte_bitmask(btcoexist,
1179f1d2b4d3SLarry Finger 0x92c, 0x3, 0x2);
1180f1d2b4d3SLarry Finger break;
1181f1d2b4d3SLarry Finger }
1182bcd37f4aSYan-Hsuan Chuang } else {
1183bcd37f4aSYan-Hsuan Chuang /* internal switch */
1184bcd37f4aSYan-Hsuan Chuang if (init_hwcfg) {
1185bcd37f4aSYan-Hsuan Chuang /* 0x4c[23] = 0, 0x4c[24] = 1 Ant controlled by WL/BT */
1186bcd37f4aSYan-Hsuan Chuang u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
1187bcd37f4aSYan-Hsuan Chuang u32tmp |= BIT23;
1188bcd37f4aSYan-Hsuan Chuang u32tmp &= ~BIT24;
1189bcd37f4aSYan-Hsuan Chuang btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
1190bcd37f4aSYan-Hsuan Chuang }
1191bcd37f4aSYan-Hsuan Chuang
1192bcd37f4aSYan-Hsuan Chuang /* fixed ext switch, S1->Main, S0->Aux */
1193bcd37f4aSYan-Hsuan Chuang btcoexist->btc_write_1byte_bitmask(btcoexist, 0x64, 0x1, 0x0);
1194f1d2b4d3SLarry Finger switch (antpos_type) {
1195f1d2b4d3SLarry Finger case BTC_ANT_WIFI_AT_MAIN:
1196f1d2b4d3SLarry Finger /* fixed internal switch S1->WiFi, S0->BT */
1197f1d2b4d3SLarry Finger btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
1198f1d2b4d3SLarry Finger break;
1199f1d2b4d3SLarry Finger case BTC_ANT_WIFI_AT_AUX:
1200f1d2b4d3SLarry Finger /* fixed internal switch S0->WiFi, S1->BT */
1201f1d2b4d3SLarry Finger btcoexist->btc_write_2byte(btcoexist, 0x948, 0x280);
1202f1d2b4d3SLarry Finger break;
1203f1d2b4d3SLarry Finger }
1204f1d2b4d3SLarry Finger }
1205f1d2b4d3SLarry Finger }
1206f1d2b4d3SLarry Finger
btc8723b2ant_ps_tdma(struct btc_coexist * btcoexist,bool force_exec,bool turn_on,u8 type)1207f1d2b4d3SLarry Finger static void btc8723b2ant_ps_tdma(struct btc_coexist *btcoexist, bool force_exec,
1208f1d2b4d3SLarry Finger bool turn_on, u8 type)
1209f1d2b4d3SLarry Finger {
12102277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
121161d80261SYan-Hsuan Chuang struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1212c5e21136SYan-Hsuan Chuang u8 wifi_rssi_state, bt_rssi_state;
12133f957062SYan-Hsuan Chuang s8 wifi_duration_adjust = 0x0;
121461d80261SYan-Hsuan Chuang u8 tdma_byte4_modify = 0x0;
1215c5e21136SYan-Hsuan Chuang u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
1216c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
1217c5e21136SYan-Hsuan Chuang
1218c5e21136SYan-Hsuan Chuang wifi_rssi_state = btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, tmp, 0);
1219c5e21136SYan-Hsuan Chuang tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
1220c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
1221c5e21136SYan-Hsuan Chuang bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
12222277f5f1SLarry Finger
1223c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1224f1d2b4d3SLarry Finger "[BTCoex], %s turn %s PS TDMA, type=%d\n",
1225f1d2b4d3SLarry Finger (force_exec ? "force to" : ""),
1226f1d2b4d3SLarry Finger (turn_on ? "ON" : "OFF"), type);
1227f1d2b4d3SLarry Finger coex_dm->cur_ps_tdma_on = turn_on;
1228f1d2b4d3SLarry Finger coex_dm->cur_ps_tdma = type;
1229f1d2b4d3SLarry Finger
1230c5e21136SYan-Hsuan Chuang if (!(BTC_RSSI_HIGH(wifi_rssi_state) &&
1231c5e21136SYan-Hsuan Chuang BTC_RSSI_HIGH(bt_rssi_state)) && turn_on) {
1232c5e21136SYan-Hsuan Chuang /* for WiFi RSSI low or BT RSSI low */
1233c5e21136SYan-Hsuan Chuang type = type + 100;
1234c5e21136SYan-Hsuan Chuang coex_dm->is_switch_to_1dot5_ant = true;
1235c5e21136SYan-Hsuan Chuang } else {
1236c5e21136SYan-Hsuan Chuang coex_dm->is_switch_to_1dot5_ant = false;
1237c5e21136SYan-Hsuan Chuang }
1238c5e21136SYan-Hsuan Chuang
1239f1d2b4d3SLarry Finger if (!force_exec) {
1240c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1241f1d2b4d3SLarry Finger "[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n",
1242f1d2b4d3SLarry Finger coex_dm->pre_ps_tdma_on, coex_dm->cur_ps_tdma_on);
1243c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1244f1d2b4d3SLarry Finger "[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n",
1245f1d2b4d3SLarry Finger coex_dm->pre_ps_tdma, coex_dm->cur_ps_tdma);
1246f1d2b4d3SLarry Finger
1247f1d2b4d3SLarry Finger if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1248f1d2b4d3SLarry Finger (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1249f1d2b4d3SLarry Finger return;
1250f1d2b4d3SLarry Finger }
125161d80261SYan-Hsuan Chuang
12523f957062SYan-Hsuan Chuang if (coex_sta->scan_ap_num <= 5) {
12533f957062SYan-Hsuan Chuang if (coex_sta->a2dp_bit_pool >= 45)
12543f957062SYan-Hsuan Chuang wifi_duration_adjust = -15;
12553f957062SYan-Hsuan Chuang else if (coex_sta->a2dp_bit_pool >= 35)
12563f957062SYan-Hsuan Chuang wifi_duration_adjust = -10;
12573f957062SYan-Hsuan Chuang else
12583f957062SYan-Hsuan Chuang wifi_duration_adjust = 5;
12593f957062SYan-Hsuan Chuang } else if (coex_sta->scan_ap_num <= 20) {
12603f957062SYan-Hsuan Chuang if (coex_sta->a2dp_bit_pool >= 45)
12613f957062SYan-Hsuan Chuang wifi_duration_adjust = -15;
12623f957062SYan-Hsuan Chuang else if (coex_sta->a2dp_bit_pool >= 35)
12633f957062SYan-Hsuan Chuang wifi_duration_adjust = -10;
12643f957062SYan-Hsuan Chuang else
12653f957062SYan-Hsuan Chuang wifi_duration_adjust = 0;
12663f957062SYan-Hsuan Chuang } else if (coex_sta->scan_ap_num <= 40) {
12673f957062SYan-Hsuan Chuang if (coex_sta->a2dp_bit_pool >= 45)
12683f957062SYan-Hsuan Chuang wifi_duration_adjust = -15;
12693f957062SYan-Hsuan Chuang else if (coex_sta->a2dp_bit_pool >= 35)
12703f957062SYan-Hsuan Chuang wifi_duration_adjust = -10;
12713f957062SYan-Hsuan Chuang else
12723f957062SYan-Hsuan Chuang wifi_duration_adjust = -5;
12733f957062SYan-Hsuan Chuang } else {
12743f957062SYan-Hsuan Chuang if (coex_sta->a2dp_bit_pool >= 45)
12753f957062SYan-Hsuan Chuang wifi_duration_adjust = -15;
12763f957062SYan-Hsuan Chuang else if (coex_sta->a2dp_bit_pool >= 35)
12773f957062SYan-Hsuan Chuang wifi_duration_adjust = -10;
12783f957062SYan-Hsuan Chuang else
12793f957062SYan-Hsuan Chuang wifi_duration_adjust = -10;
12803f957062SYan-Hsuan Chuang }
12813f957062SYan-Hsuan Chuang
128261d80261SYan-Hsuan Chuang if ((bt_link_info->slave_role) && (bt_link_info->a2dp_exist))
128361d80261SYan-Hsuan Chuang /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
128461d80261SYan-Hsuan Chuang tdma_byte4_modify = 0x1;
128561d80261SYan-Hsuan Chuang
1286f1d2b4d3SLarry Finger if (turn_on) {
1287f1d2b4d3SLarry Finger switch (type) {
1288f1d2b4d3SLarry Finger case 1:
1289f1d2b4d3SLarry Finger default:
129061d80261SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(
129161d80261SYan-Hsuan Chuang btcoexist, 0xe3, 0x3c,
129261d80261SYan-Hsuan Chuang 0x03, 0xf1, 0x90 | tdma_byte4_modify);
1293f1d2b4d3SLarry Finger break;
1294f1d2b4d3SLarry Finger case 2:
129561d80261SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(
129661d80261SYan-Hsuan Chuang btcoexist, 0xe3, 0x2d,
129761d80261SYan-Hsuan Chuang 0x03, 0xf1, 0x90 | tdma_byte4_modify);
1298f1d2b4d3SLarry Finger break;
1299f1d2b4d3SLarry Finger case 3:
130061d80261SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
130161d80261SYan-Hsuan Chuang 0x3, 0xf1,
130261d80261SYan-Hsuan Chuang 0x90 | tdma_byte4_modify);
1303f1d2b4d3SLarry Finger break;
1304f1d2b4d3SLarry Finger case 4:
1305f1d2b4d3SLarry Finger btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
130661d80261SYan-Hsuan Chuang 0x03, 0xf1,
130761d80261SYan-Hsuan Chuang 0x90 | tdma_byte4_modify);
1308f1d2b4d3SLarry Finger break;
1309f1d2b4d3SLarry Finger case 5:
131061d80261SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(
131161d80261SYan-Hsuan Chuang btcoexist, 0xe3, 0x3c,
131261d80261SYan-Hsuan Chuang 0x3, 0x70, 0x90 | tdma_byte4_modify);
1313f1d2b4d3SLarry Finger break;
1314f1d2b4d3SLarry Finger case 6:
131561d80261SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(
131661d80261SYan-Hsuan Chuang btcoexist, 0xe3, 0x2d,
131761d80261SYan-Hsuan Chuang 0x3, 0x70, 0x90 | tdma_byte4_modify);
1318f1d2b4d3SLarry Finger break;
1319f1d2b4d3SLarry Finger case 7:
1320f1d2b4d3SLarry Finger btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
132161d80261SYan-Hsuan Chuang 0x3, 0x70,
132261d80261SYan-Hsuan Chuang 0x90 | tdma_byte4_modify);
1323f1d2b4d3SLarry Finger break;
1324f1d2b4d3SLarry Finger case 8:
1325f1d2b4d3SLarry Finger btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x10,
132661d80261SYan-Hsuan Chuang 0x3, 0x70,
132761d80261SYan-Hsuan Chuang 0x90 | tdma_byte4_modify);
1328f1d2b4d3SLarry Finger break;
1329f1d2b4d3SLarry Finger case 9:
13303f957062SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(
13313f957062SYan-Hsuan Chuang btcoexist, 0xe3, 0x3c + wifi_duration_adjust,
13323f957062SYan-Hsuan Chuang 0x03, 0xf1, 0x90 | tdma_byte4_modify);
1333f1d2b4d3SLarry Finger break;
1334f1d2b4d3SLarry Finger case 10:
133561d80261SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(
133661d80261SYan-Hsuan Chuang btcoexist, 0xe3, 0x2d,
133761d80261SYan-Hsuan Chuang 0x03, 0xf1, 0x90 | tdma_byte4_modify);
1338f1d2b4d3SLarry Finger break;
1339f1d2b4d3SLarry Finger case 11:
134061d80261SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
134161d80261SYan-Hsuan Chuang 0x3, 0xf1,
134261d80261SYan-Hsuan Chuang 0x90 | tdma_byte4_modify);
1343f1d2b4d3SLarry Finger break;
1344f1d2b4d3SLarry Finger case 12:
134561d80261SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
134661d80261SYan-Hsuan Chuang 0x3, 0xf1,
134761d80261SYan-Hsuan Chuang 0x90 | tdma_byte4_modify);
1348f1d2b4d3SLarry Finger break;
1349f1d2b4d3SLarry Finger case 13:
135061d80261SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(
135161d80261SYan-Hsuan Chuang btcoexist, 0xe3, 0x3c,
135261d80261SYan-Hsuan Chuang 0x3, 0x70, 0x90 | tdma_byte4_modify);
1353f1d2b4d3SLarry Finger break;
1354f1d2b4d3SLarry Finger case 14:
135561d80261SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(
135661d80261SYan-Hsuan Chuang btcoexist, 0xe3, 0x2d,
135761d80261SYan-Hsuan Chuang 0x3, 0x70, 0x90 | tdma_byte4_modify);
1358f1d2b4d3SLarry Finger break;
1359f1d2b4d3SLarry Finger case 15:
136061d80261SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
136161d80261SYan-Hsuan Chuang 0x3, 0x70,
136261d80261SYan-Hsuan Chuang 0x90 | tdma_byte4_modify);
1363f1d2b4d3SLarry Finger break;
1364f1d2b4d3SLarry Finger case 16:
136561d80261SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
136661d80261SYan-Hsuan Chuang 0x3, 0x70,
136761d80261SYan-Hsuan Chuang 0x90 | tdma_byte4_modify);
1368f1d2b4d3SLarry Finger break;
1369f1d2b4d3SLarry Finger case 17:
1370f1d2b4d3SLarry Finger btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x2f,
1371f1d2b4d3SLarry Finger 0x2f, 0x60, 0x90);
1372f1d2b4d3SLarry Finger break;
1373f1d2b4d3SLarry Finger case 18:
13743f957062SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5, 0x5,
13753f957062SYan-Hsuan Chuang 0xe1, 0x90);
1376f1d2b4d3SLarry Finger break;
1377f1d2b4d3SLarry Finger case 19:
1378f1d2b4d3SLarry Finger btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1379f1d2b4d3SLarry Finger 0x25, 0xe1, 0x90);
1380f1d2b4d3SLarry Finger break;
1381f1d2b4d3SLarry Finger case 20:
1382f1d2b4d3SLarry Finger btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1383f1d2b4d3SLarry Finger 0x25, 0x60, 0x90);
1384f1d2b4d3SLarry Finger break;
1385f1d2b4d3SLarry Finger case 21:
1386f1d2b4d3SLarry Finger btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1387f1d2b4d3SLarry Finger 0x03, 0x70, 0x90);
1388f1d2b4d3SLarry Finger break;
1389c5e21136SYan-Hsuan Chuang
1390c5e21136SYan-Hsuan Chuang case 23:
1391c5e21136SYan-Hsuan Chuang case 123:
1392c5e21136SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x35,
1393c5e21136SYan-Hsuan Chuang 0x03, 0x71, 0x10);
1394c5e21136SYan-Hsuan Chuang break;
1395f1d2b4d3SLarry Finger case 71:
13963f957062SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(
13973f957062SYan-Hsuan Chuang btcoexist, 0xe3, 0x3c + wifi_duration_adjust,
13983f957062SYan-Hsuan Chuang 0x03, 0xf1, 0x90);
13993f957062SYan-Hsuan Chuang break;
14003f957062SYan-Hsuan Chuang case 101:
14013f957062SYan-Hsuan Chuang case 105:
14023f957062SYan-Hsuan Chuang case 113:
14033f957062SYan-Hsuan Chuang case 171:
14043f957062SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(
14053f957062SYan-Hsuan Chuang btcoexist, 0xd3, 0x3a + wifi_duration_adjust,
14063f957062SYan-Hsuan Chuang 0x03, 0x70, 0x50 | tdma_byte4_modify);
14073f957062SYan-Hsuan Chuang break;
14083f957062SYan-Hsuan Chuang case 102:
14093f957062SYan-Hsuan Chuang case 106:
14103f957062SYan-Hsuan Chuang case 110:
14113f957062SYan-Hsuan Chuang case 114:
14123f957062SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(
14133f957062SYan-Hsuan Chuang btcoexist, 0xd3, 0x2d + wifi_duration_adjust,
14143f957062SYan-Hsuan Chuang 0x03, 0x70, 0x50 | tdma_byte4_modify);
1415f1d2b4d3SLarry Finger break;
1416c5e21136SYan-Hsuan Chuang case 103:
1417c5e21136SYan-Hsuan Chuang case 107:
1418c5e21136SYan-Hsuan Chuang case 111:
1419c5e21136SYan-Hsuan Chuang case 115:
1420c5e21136SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1c,
1421c5e21136SYan-Hsuan Chuang 0x03, 0x70,
1422c5e21136SYan-Hsuan Chuang 0x50 | tdma_byte4_modify);
1423c5e21136SYan-Hsuan Chuang break;
1424c5e21136SYan-Hsuan Chuang case 104:
1425c5e21136SYan-Hsuan Chuang case 108:
1426c5e21136SYan-Hsuan Chuang case 112:
1427c5e21136SYan-Hsuan Chuang case 116:
1428c5e21136SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x10,
1429c5e21136SYan-Hsuan Chuang 0x03, 0x70,
1430c5e21136SYan-Hsuan Chuang 0x50 | tdma_byte4_modify);
1431c5e21136SYan-Hsuan Chuang break;
1432c5e21136SYan-Hsuan Chuang case 109:
1433c5e21136SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1434c5e21136SYan-Hsuan Chuang 0x03, 0xf1,
1435c5e21136SYan-Hsuan Chuang 0x90 | tdma_byte4_modify);
1436c5e21136SYan-Hsuan Chuang break;
1437c5e21136SYan-Hsuan Chuang case 121:
1438c5e21136SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1439c5e21136SYan-Hsuan Chuang 0x03, 0x70,
1440c5e21136SYan-Hsuan Chuang 0x90 | tdma_byte4_modify);
1441c5e21136SYan-Hsuan Chuang break;
1442c5e21136SYan-Hsuan Chuang case 22:
1443c5e21136SYan-Hsuan Chuang case 122:
1444c5e21136SYan-Hsuan Chuang btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x35,
1445c5e21136SYan-Hsuan Chuang 0x03, 0x71, 0x11);
1446c5e21136SYan-Hsuan Chuang break;
1447f1d2b4d3SLarry Finger }
1448f1d2b4d3SLarry Finger } else {
1449f1d2b4d3SLarry Finger /* disable PS tdma */
1450f1d2b4d3SLarry Finger switch (type) {
1451f1d2b4d3SLarry Finger case 0:
1452f1d2b4d3SLarry Finger btc8723b2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1453f1d2b4d3SLarry Finger 0x40, 0x0);
1454f1d2b4d3SLarry Finger break;
1455f1d2b4d3SLarry Finger case 1:
1456f1d2b4d3SLarry Finger btc8723b2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1457f1d2b4d3SLarry Finger 0x48, 0x0);
1458f1d2b4d3SLarry Finger break;
1459f1d2b4d3SLarry Finger default:
1460f1d2b4d3SLarry Finger btc8723b2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1461f1d2b4d3SLarry Finger 0x40, 0x0);
1462f1d2b4d3SLarry Finger break;
1463f1d2b4d3SLarry Finger }
1464f1d2b4d3SLarry Finger }
1465f1d2b4d3SLarry Finger
1466f1d2b4d3SLarry Finger /* update pre state */
1467f1d2b4d3SLarry Finger coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1468f1d2b4d3SLarry Finger coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1469f1d2b4d3SLarry Finger }
1470f1d2b4d3SLarry Finger
btc8723b2ant_ps_tdma_check_for_power_save_state(struct btc_coexist * btcoexist,bool new_ps_state)1471b01127b2SYan-Hsuan Chuang static void btc8723b2ant_ps_tdma_check_for_power_save_state(
1472b01127b2SYan-Hsuan Chuang struct btc_coexist *btcoexist, bool new_ps_state)
1473b01127b2SYan-Hsuan Chuang {
1474b01127b2SYan-Hsuan Chuang u8 lps_mode = 0x0;
1475b01127b2SYan-Hsuan Chuang
1476b01127b2SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1477b01127b2SYan-Hsuan Chuang
1478b01127b2SYan-Hsuan Chuang if (lps_mode) {
1479b01127b2SYan-Hsuan Chuang /* already under LPS state */
1480b01127b2SYan-Hsuan Chuang if (new_ps_state) {
1481b01127b2SYan-Hsuan Chuang /* keep state under LPS, do nothing. */
1482b01127b2SYan-Hsuan Chuang } else {
1483b01127b2SYan-Hsuan Chuang /* will leave LPS state, turn off psTdma first */
1484b01127b2SYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1485b01127b2SYan-Hsuan Chuang }
1486b01127b2SYan-Hsuan Chuang } else {
1487b01127b2SYan-Hsuan Chuang /* NO PS state */
1488b01127b2SYan-Hsuan Chuang if (new_ps_state) {
1489b01127b2SYan-Hsuan Chuang /* will enter LPS state, turn off psTdma first */
1490b01127b2SYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1491b01127b2SYan-Hsuan Chuang } else {
1492b01127b2SYan-Hsuan Chuang /* keep state under NO PS state, do nothing. */
1493b01127b2SYan-Hsuan Chuang }
1494b01127b2SYan-Hsuan Chuang }
1495b01127b2SYan-Hsuan Chuang }
1496b01127b2SYan-Hsuan Chuang
btc8723b2ant_power_save_state(struct btc_coexist * btcoexist,u8 ps_type,u8 lps_val,u8 rpwm_val)1497b01127b2SYan-Hsuan Chuang static void btc8723b2ant_power_save_state(struct btc_coexist *btcoexist,
1498b01127b2SYan-Hsuan Chuang u8 ps_type, u8 lps_val, u8 rpwm_val)
1499b01127b2SYan-Hsuan Chuang {
1500b01127b2SYan-Hsuan Chuang bool low_pwr_disable = false;
1501b01127b2SYan-Hsuan Chuang
1502b01127b2SYan-Hsuan Chuang switch (ps_type) {
1503b01127b2SYan-Hsuan Chuang case BTC_PS_WIFI_NATIVE:
1504b01127b2SYan-Hsuan Chuang /* recover to original 32k low power setting */
1505b01127b2SYan-Hsuan Chuang low_pwr_disable = false;
1506b01127b2SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1507b01127b2SYan-Hsuan Chuang &low_pwr_disable);
1508b01127b2SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
1509b01127b2SYan-Hsuan Chuang coex_sta->force_lps_on = false;
1510b01127b2SYan-Hsuan Chuang break;
1511b01127b2SYan-Hsuan Chuang case BTC_PS_LPS_ON:
1512b01127b2SYan-Hsuan Chuang btc8723b2ant_ps_tdma_check_for_power_save_state(btcoexist,
1513b01127b2SYan-Hsuan Chuang true);
1514b01127b2SYan-Hsuan Chuang btc8723b2ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,
1515b01127b2SYan-Hsuan Chuang rpwm_val);
1516b01127b2SYan-Hsuan Chuang /* when coex force to enter LPS, do not enter 32k low power */
1517b01127b2SYan-Hsuan Chuang low_pwr_disable = true;
1518b01127b2SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1519b01127b2SYan-Hsuan Chuang &low_pwr_disable);
1520b01127b2SYan-Hsuan Chuang /* power save must executed before psTdma */
1521b01127b2SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
1522b01127b2SYan-Hsuan Chuang coex_sta->force_lps_on = true;
1523b01127b2SYan-Hsuan Chuang break;
1524b01127b2SYan-Hsuan Chuang case BTC_PS_LPS_OFF:
1525b01127b2SYan-Hsuan Chuang btc8723b2ant_ps_tdma_check_for_power_save_state(btcoexist,
1526b01127b2SYan-Hsuan Chuang false);
1527b01127b2SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
1528b01127b2SYan-Hsuan Chuang coex_sta->force_lps_on = false;
1529b01127b2SYan-Hsuan Chuang break;
1530b01127b2SYan-Hsuan Chuang default:
1531b01127b2SYan-Hsuan Chuang break;
1532b01127b2SYan-Hsuan Chuang }
1533b01127b2SYan-Hsuan Chuang }
1534b01127b2SYan-Hsuan Chuang
btc8723b2ant_coex_alloff(struct btc_coexist * btcoexist)1535f1d2b4d3SLarry Finger static void btc8723b2ant_coex_alloff(struct btc_coexist *btcoexist)
1536f1d2b4d3SLarry Finger {
1537f1d2b4d3SLarry Finger /* fw all off */
1538b01127b2SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1539f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1540f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
154144e9a534SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1542f1d2b4d3SLarry Finger
1543f1d2b4d3SLarry Finger /* sw all off */
1544c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, false, false, false);
1545f1d2b4d3SLarry Finger
1546f1d2b4d3SLarry Finger /* hw all off */
1547f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
1548c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1549f1d2b4d3SLarry Finger }
1550f1d2b4d3SLarry Finger
btc8723b2ant_init_coex_dm(struct btc_coexist * btcoexist)1551f1d2b4d3SLarry Finger static void btc8723b2ant_init_coex_dm(struct btc_coexist *btcoexist)
1552f1d2b4d3SLarry Finger {
1553f1d2b4d3SLarry Finger /* force to reset coex mechanism*/
1554bcd37f4aSYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1555b01127b2SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1556f1d2b4d3SLarry Finger
1557f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1);
1558f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
155944e9a534SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, FORCE_EXEC, 0);
1560f1d2b4d3SLarry Finger
1561c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, false, false, false);
1562c6821613SYan-Hsuan Chuang
1563c6821613SYan-Hsuan Chuang coex_sta->pop_event_cnt = 0;
1564f1d2b4d3SLarry Finger }
1565f1d2b4d3SLarry Finger
btc8723b2ant_action_bt_inquiry(struct btc_coexist * btcoexist)1566f1d2b4d3SLarry Finger static void btc8723b2ant_action_bt_inquiry(struct btc_coexist *btcoexist)
1567f1d2b4d3SLarry Finger {
1568684df42cSYan-Hsuan Chuang struct rtl_priv *rtlpriv = btcoexist->adapter;
1569f1d2b4d3SLarry Finger bool wifi_connected = false;
1570f1d2b4d3SLarry Finger bool low_pwr_disable = true;
1571684df42cSYan-Hsuan Chuang bool scan = false, link = false, roam = false;
1572f1d2b4d3SLarry Finger
1573f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1574f1d2b4d3SLarry Finger &low_pwr_disable);
1575f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1576f1d2b4d3SLarry Finger &wifi_connected);
1577f1d2b4d3SLarry Finger
1578684df42cSYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
1579684df42cSYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
1580684df42cSYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
1581684df42cSYan-Hsuan Chuang
1582684df42cSYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1583684df42cSYan-Hsuan Chuang
1584684df42cSYan-Hsuan Chuang if (coex_sta->bt_abnormal_scan) {
1585684df42cSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
1586684df42cSYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3);
1587684df42cSYan-Hsuan Chuang } else if (scan || link || roam) {
1588c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1589684df42cSYan-Hsuan Chuang "[BTCoex], Wifi link process + BT Inq/Page!!\n");
1590684df42cSYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);
1591684df42cSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1592684df42cSYan-Hsuan Chuang } else if (wifi_connected) {
1593c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1594684df42cSYan-Hsuan Chuang "[BTCoex], Wifi connected + BT Inq/Page!!\n");
1595684df42cSYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);
1596684df42cSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1597f1d2b4d3SLarry Finger } else {
1598c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1599f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1600f1d2b4d3SLarry Finger }
1601f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
160244e9a534SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1603f1d2b4d3SLarry Finger
1604c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, false, false, false);
1605f1d2b4d3SLarry Finger }
1606f1d2b4d3SLarry Finger
btc8723b2ant_action_wifi_link_process(struct btc_coexist * btcoexist)160783cded7aSYan-Hsuan Chuang static void btc8723b2ant_action_wifi_link_process(struct btc_coexist
160883cded7aSYan-Hsuan Chuang *btcoexist)
160983cded7aSYan-Hsuan Chuang {
161083cded7aSYan-Hsuan Chuang struct rtl_priv *rtlpriv = btcoexist->adapter;
161183cded7aSYan-Hsuan Chuang u32 u32tmp;
161283cded7aSYan-Hsuan Chuang u8 u8tmpa, u8tmpb;
161383cded7aSYan-Hsuan Chuang
161483cded7aSYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);
161583cded7aSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
161683cded7aSYan-Hsuan Chuang
161783cded7aSYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, false, false, false);
161883cded7aSYan-Hsuan Chuang
161983cded7aSYan-Hsuan Chuang u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
162083cded7aSYan-Hsuan Chuang u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
162183cded7aSYan-Hsuan Chuang u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x76e);
162283cded7aSYan-Hsuan Chuang
1623c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
162483cded7aSYan-Hsuan Chuang "[BTCoex], 0x948 = 0x%x, 0x765 = 0x%x, 0x76e = 0x%x\n",
162583cded7aSYan-Hsuan Chuang u32tmp, u8tmpa, u8tmpb);
162683cded7aSYan-Hsuan Chuang }
162783cded7aSYan-Hsuan Chuang
btc8723b2ant_action_wifi_idle_process(struct btc_coexist * btcoexist)1628470eec1aSYan-Hsuan Chuang static bool btc8723b2ant_action_wifi_idle_process(struct btc_coexist *btcoexist)
1629470eec1aSYan-Hsuan Chuang {
1630470eec1aSYan-Hsuan Chuang struct rtl_priv *rtlpriv = btcoexist->adapter;
1631*bb053d02SLee Jones u8 wifi_rssi_state1;
1632470eec1aSYan-Hsuan Chuang u8 ap_num = 0;
1633470eec1aSYan-Hsuan Chuang u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
1634470eec1aSYan-Hsuan Chuang coex_dm->switch_thres_offset - coex_dm->switch_thres_offset;
1635470eec1aSYan-Hsuan Chuang
1636*bb053d02SLee Jones btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
1637470eec1aSYan-Hsuan Chuang wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
1638470eec1aSYan-Hsuan Chuang tmp, 0);
1639470eec1aSYan-Hsuan Chuang tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
1640470eec1aSYan-Hsuan Chuang coex_dm->switch_thres_offset - coex_dm->switch_thres_offset;
1641*bb053d02SLee Jones btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
1642470eec1aSYan-Hsuan Chuang
1643470eec1aSYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
1644470eec1aSYan-Hsuan Chuang
1645470eec1aSYan-Hsuan Chuang /* office environment */
1646470eec1aSYan-Hsuan Chuang if (BTC_RSSI_HIGH(wifi_rssi_state1) && (coex_sta->hid_exist) &&
1647470eec1aSYan-Hsuan Chuang (coex_sta->a2dp_exist)) {
1648c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1649470eec1aSYan-Hsuan Chuang "[BTCoex], Wifi idle process for BT HID+A2DP exist!!\n");
1650470eec1aSYan-Hsuan Chuang
1651470eec1aSYan-Hsuan Chuang btc8723b2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x6);
1652470eec1aSYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1653470eec1aSYan-Hsuan Chuang
1654470eec1aSYan-Hsuan Chuang /* sw all off */
1655470eec1aSYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, false, false,
1656470eec1aSYan-Hsuan Chuang false);
1657470eec1aSYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1658470eec1aSYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1659470eec1aSYan-Hsuan Chuang 0x0, 0x0);
1660470eec1aSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1661470eec1aSYan-Hsuan Chuang
1662470eec1aSYan-Hsuan Chuang return true;
1663470eec1aSYan-Hsuan Chuang }
1664470eec1aSYan-Hsuan Chuang
1665470eec1aSYan-Hsuan Chuang btc8723b2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x18);
1666470eec1aSYan-Hsuan Chuang return false;
1667470eec1aSYan-Hsuan Chuang }
1668470eec1aSYan-Hsuan Chuang
btc8723b2ant_is_common_action(struct btc_coexist * btcoexist)1669f1d2b4d3SLarry Finger static bool btc8723b2ant_is_common_action(struct btc_coexist *btcoexist)
1670f1d2b4d3SLarry Finger {
16712277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
1672f1d2b4d3SLarry Finger bool common = false, wifi_connected = false;
1673f1d2b4d3SLarry Finger bool wifi_busy = false;
1674f1d2b4d3SLarry Finger bool bt_hs_on = false, low_pwr_disable = false;
1675f1d2b4d3SLarry Finger
1676f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
1677f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1678f1d2b4d3SLarry Finger &wifi_connected);
1679f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1680f1d2b4d3SLarry Finger
1681f1d2b4d3SLarry Finger if (!wifi_connected) {
1682f1d2b4d3SLarry Finger low_pwr_disable = false;
1683f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1684f1d2b4d3SLarry Finger &low_pwr_disable);
1685155305f5SYan-Hsuan Chuang btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC,
1686155305f5SYan-Hsuan Chuang false, false, 0x8);
1687f1d2b4d3SLarry Finger
1688c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1689f1d2b4d3SLarry Finger "[BTCoex], Wifi non-connected idle!!\n");
1690f1d2b4d3SLarry Finger
1691f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
1692f1d2b4d3SLarry Finger 0x0);
1693c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1694f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1695f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
169644e9a534SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1697f1d2b4d3SLarry Finger
1698c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, false, false,
1699f1d2b4d3SLarry Finger false);
1700f1d2b4d3SLarry Finger
1701f1d2b4d3SLarry Finger common = true;
1702f1d2b4d3SLarry Finger } else {
1703f1d2b4d3SLarry Finger if (BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
1704f1d2b4d3SLarry Finger coex_dm->bt_status) {
1705f1d2b4d3SLarry Finger low_pwr_disable = false;
1706f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist,
1707f1d2b4d3SLarry Finger BTC_SET_ACT_DISABLE_LOW_POWER,
1708f1d2b4d3SLarry Finger &low_pwr_disable);
1709155305f5SYan-Hsuan Chuang btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC,
1710155305f5SYan-Hsuan Chuang false, false, 0x8);
1711f1d2b4d3SLarry Finger
1712c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1713466414a0SJoe Perches "[BTCoex], Wifi connected + BT non connected-idle!!\n");
1714f1d2b4d3SLarry Finger
1715f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
1716f1d2b4d3SLarry Finger 0xfffff, 0x0);
1717c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist,
1718c6821613SYan-Hsuan Chuang NORMAL_EXEC, 0);
1719f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1720f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
1721f1d2b4d3SLarry Finger 0xb);
172244e9a534SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1723f1d2b4d3SLarry Finger
1724c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, false,
1725f1d2b4d3SLarry Finger false, false);
1726f1d2b4d3SLarry Finger
1727f1d2b4d3SLarry Finger common = true;
1728f1d2b4d3SLarry Finger } else if (BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE ==
1729f1d2b4d3SLarry Finger coex_dm->bt_status) {
1730f1d2b4d3SLarry Finger low_pwr_disable = true;
1731f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist,
1732f1d2b4d3SLarry Finger BTC_SET_ACT_DISABLE_LOW_POWER,
1733f1d2b4d3SLarry Finger &low_pwr_disable);
1734f1d2b4d3SLarry Finger
1735f1d2b4d3SLarry Finger if (bt_hs_on)
1736f1d2b4d3SLarry Finger return false;
1737c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1738466414a0SJoe Perches "[BTCoex], Wifi connected + BT connected-idle!!\n");
1739155305f5SYan-Hsuan Chuang btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC,
1740155305f5SYan-Hsuan Chuang false, false, 0x8);
1741f1d2b4d3SLarry Finger
1742f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
1743f1d2b4d3SLarry Finger 0xfffff, 0x0);
1744c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist,
1745c6821613SYan-Hsuan Chuang NORMAL_EXEC, 0);
1746f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1747f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
1748f1d2b4d3SLarry Finger 0xb);
174944e9a534SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1750f1d2b4d3SLarry Finger
1751c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, true, false,
1752f1d2b4d3SLarry Finger false, false);
1753f1d2b4d3SLarry Finger
1754f1d2b4d3SLarry Finger common = true;
1755f1d2b4d3SLarry Finger } else {
1756f1d2b4d3SLarry Finger low_pwr_disable = true;
1757f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist,
1758f1d2b4d3SLarry Finger BTC_SET_ACT_DISABLE_LOW_POWER,
1759f1d2b4d3SLarry Finger &low_pwr_disable);
1760f1d2b4d3SLarry Finger
1761f1d2b4d3SLarry Finger if (wifi_busy) {
1762c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1763466414a0SJoe Perches "[BTCoex], Wifi Connected-Busy + BT Busy!!\n");
1764f1d2b4d3SLarry Finger common = false;
1765f1d2b4d3SLarry Finger } else {
1766c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1767466414a0SJoe Perches "[BTCoex], Wifi Connected-Idle + BT Busy!!\n");
1768f1d2b4d3SLarry Finger
1769470eec1aSYan-Hsuan Chuang common =
1770470eec1aSYan-Hsuan Chuang btc8723b2ant_action_wifi_idle_process(
1771470eec1aSYan-Hsuan Chuang btcoexist);
1772f1d2b4d3SLarry Finger }
1773f1d2b4d3SLarry Finger }
1774f1d2b4d3SLarry Finger }
1775f1d2b4d3SLarry Finger
1776f1d2b4d3SLarry Finger return common;
1777f1d2b4d3SLarry Finger }
1778f1d2b4d3SLarry Finger
btc8723b2ant_tdma_duration_adjust(struct btc_coexist * btcoexist,bool sco_hid,bool tx_pause,u8 max_interval)1779f1d2b4d3SLarry Finger static void btc8723b2ant_tdma_duration_adjust(struct btc_coexist *btcoexist,
1780f1d2b4d3SLarry Finger bool sco_hid, bool tx_pause,
1781f1d2b4d3SLarry Finger u8 max_interval)
1782f1d2b4d3SLarry Finger {
17832277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
1784f1d2b4d3SLarry Finger static s32 up, dn, m, n, wait_count;
1785f1d2b4d3SLarry Finger /*0: no change, +1: increase WiFi duration, -1: decrease WiFi duration*/
1786f1d2b4d3SLarry Finger s32 result;
1787f1d2b4d3SLarry Finger u8 retry_count = 0;
1788f1d2b4d3SLarry Finger
1789c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1790f1d2b4d3SLarry Finger "[BTCoex], TdmaDurationAdjust()\n");
1791f1d2b4d3SLarry Finger
1792f1d2b4d3SLarry Finger if (!coex_dm->auto_tdma_adjust) {
1793f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust = true;
1794c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1795f1d2b4d3SLarry Finger "[BTCoex], first run TdmaDurationAdjust()!!\n");
1796f1d2b4d3SLarry Finger if (sco_hid) {
1797f1d2b4d3SLarry Finger if (tx_pause) {
1798f1d2b4d3SLarry Finger if (max_interval == 1) {
1799f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist,
1800f1d2b4d3SLarry Finger NORMAL_EXEC,
1801f1d2b4d3SLarry Finger true, 13);
1802b91ed731SYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 13;
1803f1d2b4d3SLarry Finger } else if (max_interval == 2) {
1804f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist,
1805f1d2b4d3SLarry Finger NORMAL_EXEC,
1806f1d2b4d3SLarry Finger true, 14);
1807b91ed731SYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 14;
18081712952bSYan-Hsuan Chuang } else if (max_interval == 3) {
18091712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
18101712952bSYan-Hsuan Chuang NORMAL_EXEC,
18111712952bSYan-Hsuan Chuang true, 15);
18121712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 15;
1813f1d2b4d3SLarry Finger } else {
1814f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist,
1815f1d2b4d3SLarry Finger NORMAL_EXEC,
1816f1d2b4d3SLarry Finger true, 15);
1817b91ed731SYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 15;
1818f1d2b4d3SLarry Finger }
1819f1d2b4d3SLarry Finger } else {
1820f1d2b4d3SLarry Finger if (max_interval == 1) {
1821f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist,
1822f1d2b4d3SLarry Finger NORMAL_EXEC,
1823f1d2b4d3SLarry Finger true, 9);
1824b91ed731SYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 9;
1825f1d2b4d3SLarry Finger } else if (max_interval == 2) {
1826f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist,
1827f1d2b4d3SLarry Finger NORMAL_EXEC,
1828f1d2b4d3SLarry Finger true, 10);
1829b91ed731SYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 10;
18301712952bSYan-Hsuan Chuang } else if (max_interval == 3) {
18311712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
18321712952bSYan-Hsuan Chuang NORMAL_EXEC,
18331712952bSYan-Hsuan Chuang true, 11);
18341712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 11;
1835f1d2b4d3SLarry Finger } else {
1836f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist,
1837f1d2b4d3SLarry Finger NORMAL_EXEC,
1838f1d2b4d3SLarry Finger true, 11);
1839b91ed731SYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 11;
1840f1d2b4d3SLarry Finger }
1841f1d2b4d3SLarry Finger }
1842f1d2b4d3SLarry Finger } else {
1843f1d2b4d3SLarry Finger if (tx_pause) {
1844f1d2b4d3SLarry Finger if (max_interval == 1) {
1845f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist,
1846f1d2b4d3SLarry Finger NORMAL_EXEC,
1847f1d2b4d3SLarry Finger true, 5);
1848b91ed731SYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 5;
1849f1d2b4d3SLarry Finger } else if (max_interval == 2) {
1850f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist,
1851f1d2b4d3SLarry Finger NORMAL_EXEC,
1852f1d2b4d3SLarry Finger true, 6);
1853b91ed731SYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 6;
18541712952bSYan-Hsuan Chuang } else if (max_interval == 3) {
18551712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
18561712952bSYan-Hsuan Chuang NORMAL_EXEC,
18571712952bSYan-Hsuan Chuang true, 7);
18581712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 7;
1859f1d2b4d3SLarry Finger } else {
1860f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist,
1861f1d2b4d3SLarry Finger NORMAL_EXEC,
1862f1d2b4d3SLarry Finger true, 7);
1863b91ed731SYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 7;
1864f1d2b4d3SLarry Finger }
1865f1d2b4d3SLarry Finger } else {
1866f1d2b4d3SLarry Finger if (max_interval == 1) {
1867f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist,
1868f1d2b4d3SLarry Finger NORMAL_EXEC,
1869f1d2b4d3SLarry Finger true, 1);
1870b91ed731SYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 1;
1871f1d2b4d3SLarry Finger } else if (max_interval == 2) {
1872f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist,
1873f1d2b4d3SLarry Finger NORMAL_EXEC,
1874f1d2b4d3SLarry Finger true, 2);
1875b91ed731SYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 2;
18761712952bSYan-Hsuan Chuang } else if (max_interval == 3) {
18771712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
18781712952bSYan-Hsuan Chuang NORMAL_EXEC,
18791712952bSYan-Hsuan Chuang true, 3);
18801712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 3;
1881f1d2b4d3SLarry Finger } else {
1882f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist,
1883f1d2b4d3SLarry Finger NORMAL_EXEC,
1884f1d2b4d3SLarry Finger true, 3);
1885b91ed731SYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 3;
1886f1d2b4d3SLarry Finger }
1887f1d2b4d3SLarry Finger }
1888f1d2b4d3SLarry Finger }
1889f1d2b4d3SLarry Finger
1890f1d2b4d3SLarry Finger up = 0;
1891f1d2b4d3SLarry Finger dn = 0;
1892f1d2b4d3SLarry Finger m = 1;
1893f1d2b4d3SLarry Finger n = 3;
1894f1d2b4d3SLarry Finger result = 0;
1895f1d2b4d3SLarry Finger wait_count = 0;
1896f1d2b4d3SLarry Finger } else {
1897f1d2b4d3SLarry Finger /*accquire the BT TRx retry count from BT_Info byte2*/
1898f1d2b4d3SLarry Finger retry_count = coex_sta->bt_retry_cnt;
18992037b83cSYan-Hsuan Chuang
19002037b83cSYan-Hsuan Chuang if ((coex_sta->low_priority_tx) > 1050 ||
19012037b83cSYan-Hsuan Chuang (coex_sta->low_priority_rx) > 1250)
19022037b83cSYan-Hsuan Chuang retry_count++;
19032037b83cSYan-Hsuan Chuang
1904c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1905f1d2b4d3SLarry Finger "[BTCoex], retry_count = %d\n", retry_count);
1906c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1907f1d2b4d3SLarry Finger "[BTCoex], up=%d, dn=%d, m=%d, n=%d, wait_count=%d\n",
1908f1d2b4d3SLarry Finger up, dn, m, n, wait_count);
1909f1d2b4d3SLarry Finger result = 0;
1910f1d2b4d3SLarry Finger wait_count++;
1911f1d2b4d3SLarry Finger /* no retry in the last 2-second duration*/
1912f1d2b4d3SLarry Finger if (retry_count == 0) {
1913f1d2b4d3SLarry Finger up++;
1914f1d2b4d3SLarry Finger dn--;
1915f1d2b4d3SLarry Finger
1916f1d2b4d3SLarry Finger if (dn <= 0)
1917f1d2b4d3SLarry Finger dn = 0;
1918f1d2b4d3SLarry Finger
1919f1d2b4d3SLarry Finger if (up >= n) {
1920a66a4176SYan-Hsuan Chuang /* if retry count during continuous n*2
1921a66a4176SYan-Hsuan Chuang * seconds is 0, enlarge WiFi duration
1922a66a4176SYan-Hsuan Chuang */
1923f1d2b4d3SLarry Finger wait_count = 0;
1924f1d2b4d3SLarry Finger n = 3;
1925f1d2b4d3SLarry Finger up = 0;
1926f1d2b4d3SLarry Finger dn = 0;
1927f1d2b4d3SLarry Finger result = 1;
1928c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1929466414a0SJoe Perches "[BTCoex], Increase wifi duration!!\n");
1930f1d2b4d3SLarry Finger } /* <=3 retry in the last 2-second duration*/
1931f1d2b4d3SLarry Finger } else if (retry_count <= 3) {
1932f1d2b4d3SLarry Finger up--;
1933f1d2b4d3SLarry Finger dn++;
1934f1d2b4d3SLarry Finger
1935f1d2b4d3SLarry Finger if (up <= 0)
1936f1d2b4d3SLarry Finger up = 0;
1937f1d2b4d3SLarry Finger
1938f1d2b4d3SLarry Finger if (dn == 2) {
1939a66a4176SYan-Hsuan Chuang /* if continuous 2 retry count(every 2
1940a66a4176SYan-Hsuan Chuang * seconds) >0 and < 3, reduce WiFi duration
1941a66a4176SYan-Hsuan Chuang */
1942f1d2b4d3SLarry Finger if (wait_count <= 2)
1943a66a4176SYan-Hsuan Chuang /* avoid loop between the two levels */
1944f1d2b4d3SLarry Finger m++;
1945f1d2b4d3SLarry Finger else
1946f1d2b4d3SLarry Finger m = 1;
1947f1d2b4d3SLarry Finger
1948f1d2b4d3SLarry Finger if (m >= 20)
1949a66a4176SYan-Hsuan Chuang /* maximum of m = 20 ' will recheck if
1950a66a4176SYan-Hsuan Chuang * need to adjust wifi duration in
1951a66a4176SYan-Hsuan Chuang * maximum time interval 120 seconds
1952a66a4176SYan-Hsuan Chuang */
1953f1d2b4d3SLarry Finger m = 20;
1954f1d2b4d3SLarry Finger
1955f1d2b4d3SLarry Finger n = 3 * m;
1956f1d2b4d3SLarry Finger up = 0;
1957f1d2b4d3SLarry Finger dn = 0;
1958f1d2b4d3SLarry Finger wait_count = 0;
1959f1d2b4d3SLarry Finger result = -1;
1960c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1961466414a0SJoe Perches "[BTCoex], Decrease wifi duration for retry_counter<3!!\n");
1962f1d2b4d3SLarry Finger }
1963f1d2b4d3SLarry Finger } else {
1964a66a4176SYan-Hsuan Chuang /* retry count > 3, once retry count > 3, to reduce
1965a66a4176SYan-Hsuan Chuang * WiFi duration
1966a66a4176SYan-Hsuan Chuang */
1967f1d2b4d3SLarry Finger if (wait_count == 1)
1968a66a4176SYan-Hsuan Chuang /* to avoid loop between the two levels */
1969f1d2b4d3SLarry Finger m++;
1970f1d2b4d3SLarry Finger else
1971f1d2b4d3SLarry Finger m = 1;
1972f1d2b4d3SLarry Finger
1973f1d2b4d3SLarry Finger if (m >= 20)
1974a66a4176SYan-Hsuan Chuang /* maximum of m = 20 ' will recheck if need to
1975a66a4176SYan-Hsuan Chuang * adjust wifi duration in maximum time interval
1976a66a4176SYan-Hsuan Chuang * 120 seconds
1977a66a4176SYan-Hsuan Chuang */
1978f1d2b4d3SLarry Finger m = 20;
1979f1d2b4d3SLarry Finger
1980f1d2b4d3SLarry Finger n = 3 * m;
1981f1d2b4d3SLarry Finger up = 0;
1982f1d2b4d3SLarry Finger dn = 0;
1983f1d2b4d3SLarry Finger wait_count = 0;
1984f1d2b4d3SLarry Finger result = -1;
1985c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1986466414a0SJoe Perches "[BTCoex], Decrease wifi duration for retry_counter>3!!\n");
1987f1d2b4d3SLarry Finger }
1988f1d2b4d3SLarry Finger
1989c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1990f1d2b4d3SLarry Finger "[BTCoex], max Interval = %d\n", max_interval);
19911712952bSYan-Hsuan Chuang if (max_interval == 1) {
19921712952bSYan-Hsuan Chuang if (tx_pause) {
19931712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 71) {
19941712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
19951712952bSYan-Hsuan Chuang NORMAL_EXEC,
19961712952bSYan-Hsuan Chuang true, 5);
19971712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 5;
19981712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 1) {
19991712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
20001712952bSYan-Hsuan Chuang NORMAL_EXEC,
20011712952bSYan-Hsuan Chuang true, 5);
20021712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 5;
20031712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 2) {
20041712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
20051712952bSYan-Hsuan Chuang NORMAL_EXEC,
20061712952bSYan-Hsuan Chuang true, 6);
20071712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 6;
20081712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 3) {
20091712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
20101712952bSYan-Hsuan Chuang NORMAL_EXEC,
20111712952bSYan-Hsuan Chuang true, 7);
20121712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 7;
20131712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 4) {
20141712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
20151712952bSYan-Hsuan Chuang NORMAL_EXEC,
20161712952bSYan-Hsuan Chuang true, 8);
20171712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 8;
20181712952bSYan-Hsuan Chuang }
20191712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 9) {
20201712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
20211712952bSYan-Hsuan Chuang NORMAL_EXEC,
20221712952bSYan-Hsuan Chuang true, 13);
20231712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 13;
20241712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 10) {
20251712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
20261712952bSYan-Hsuan Chuang NORMAL_EXEC,
20271712952bSYan-Hsuan Chuang true, 14);
20281712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 14;
20291712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 11) {
20301712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
20311712952bSYan-Hsuan Chuang NORMAL_EXEC,
20321712952bSYan-Hsuan Chuang true, 15);
20331712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 15;
20341712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 12) {
20351712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
20361712952bSYan-Hsuan Chuang NORMAL_EXEC,
20371712952bSYan-Hsuan Chuang true, 16);
20381712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 16;
20391712952bSYan-Hsuan Chuang }
20401712952bSYan-Hsuan Chuang
20411712952bSYan-Hsuan Chuang if (result == -1) {
20421712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 5) {
20431712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
20441712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
20451712952bSYan-Hsuan Chuang true, 6);
20461712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
20471712952bSYan-Hsuan Chuang 6;
20481712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 6) {
20491712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
20501712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
20511712952bSYan-Hsuan Chuang true, 7);
20521712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
20531712952bSYan-Hsuan Chuang 7;
20541712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 7) {
20551712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
20561712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
20571712952bSYan-Hsuan Chuang true, 8);
20581712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
20591712952bSYan-Hsuan Chuang 8;
20601712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 13) {
20611712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
20621712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
20631712952bSYan-Hsuan Chuang true, 14);
20641712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
20651712952bSYan-Hsuan Chuang 14;
20661712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 14) {
20671712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
20681712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
20691712952bSYan-Hsuan Chuang true, 15);
20701712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
20711712952bSYan-Hsuan Chuang 15;
20721712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 15) {
20731712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
20741712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
20751712952bSYan-Hsuan Chuang true, 16);
20761712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
20771712952bSYan-Hsuan Chuang 16;
20781712952bSYan-Hsuan Chuang }
20791712952bSYan-Hsuan Chuang } else if (result == 1) {
20801712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 8) {
20811712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
20821712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
20831712952bSYan-Hsuan Chuang true, 7);
20841712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
20851712952bSYan-Hsuan Chuang 7;
20861712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 7) {
20871712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
20881712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
20891712952bSYan-Hsuan Chuang true, 6);
20901712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
20911712952bSYan-Hsuan Chuang 6;
20921712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 6) {
20931712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
20941712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
20951712952bSYan-Hsuan Chuang true, 5);
20961712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
20971712952bSYan-Hsuan Chuang 5;
20981712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 16) {
20991712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
21001712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
21011712952bSYan-Hsuan Chuang true, 15);
21021712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
21031712952bSYan-Hsuan Chuang 15;
21041712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 15) {
21051712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
21061712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
21071712952bSYan-Hsuan Chuang true, 14);
21081712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
21091712952bSYan-Hsuan Chuang 14;
21101712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 14) {
21111712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
21121712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
21131712952bSYan-Hsuan Chuang true, 13);
21141712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
21151712952bSYan-Hsuan Chuang 13;
21161712952bSYan-Hsuan Chuang }
21171712952bSYan-Hsuan Chuang }
21181712952bSYan-Hsuan Chuang } else {
21191712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 5) {
21201712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
21211712952bSYan-Hsuan Chuang NORMAL_EXEC,
21221712952bSYan-Hsuan Chuang true, 71);
21231712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 71;
21241712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 6) {
21251712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
21261712952bSYan-Hsuan Chuang NORMAL_EXEC,
21271712952bSYan-Hsuan Chuang true, 2);
21281712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 2;
21291712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 7) {
21301712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
21311712952bSYan-Hsuan Chuang NORMAL_EXEC,
21321712952bSYan-Hsuan Chuang true, 3);
21331712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 3;
21341712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 8) {
21351712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
21361712952bSYan-Hsuan Chuang NORMAL_EXEC,
21371712952bSYan-Hsuan Chuang true, 4);
21381712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 4;
21391712952bSYan-Hsuan Chuang }
21401712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 13) {
21411712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
21421712952bSYan-Hsuan Chuang NORMAL_EXEC,
21431712952bSYan-Hsuan Chuang true, 9);
21441712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 9;
21451712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 14) {
21461712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
21471712952bSYan-Hsuan Chuang NORMAL_EXEC,
21481712952bSYan-Hsuan Chuang true, 10);
21491712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 10;
21501712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 15) {
21511712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
21521712952bSYan-Hsuan Chuang NORMAL_EXEC,
21531712952bSYan-Hsuan Chuang true, 11);
21541712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 11;
21551712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 16) {
21561712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
21571712952bSYan-Hsuan Chuang NORMAL_EXEC,
21581712952bSYan-Hsuan Chuang true, 12);
21591712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 12;
21601712952bSYan-Hsuan Chuang }
21611712952bSYan-Hsuan Chuang
21621712952bSYan-Hsuan Chuang if (result == -1) {
21631712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 71) {
21641712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
21651712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
21661712952bSYan-Hsuan Chuang true, 1);
21671712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
21681712952bSYan-Hsuan Chuang 1;
21691712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 1) {
21701712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
21711712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
21721712952bSYan-Hsuan Chuang true, 2);
21731712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
21741712952bSYan-Hsuan Chuang 2;
21751712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 2) {
21761712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
21771712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
21781712952bSYan-Hsuan Chuang true, 3);
21791712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
21801712952bSYan-Hsuan Chuang 3;
21811712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 3) {
21821712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
21831712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
21841712952bSYan-Hsuan Chuang true, 4);
21851712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
21861712952bSYan-Hsuan Chuang 4;
21871712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 9) {
21881712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
21891712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
21901712952bSYan-Hsuan Chuang true, 10);
21911712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
21921712952bSYan-Hsuan Chuang 10;
21931712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 10) {
21941712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
21951712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
21961712952bSYan-Hsuan Chuang true, 11);
21971712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
21981712952bSYan-Hsuan Chuang 11;
21991712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 11) {
22001712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
22011712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
22021712952bSYan-Hsuan Chuang true, 12);
22031712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
22041712952bSYan-Hsuan Chuang 12;
22051712952bSYan-Hsuan Chuang }
22061712952bSYan-Hsuan Chuang } else if (result == 1) {
22071712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 4) {
22081712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
22091712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
22101712952bSYan-Hsuan Chuang true, 3);
22111712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
22121712952bSYan-Hsuan Chuang 3;
22131712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 3) {
22141712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
22151712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
22161712952bSYan-Hsuan Chuang true, 2);
22171712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
22181712952bSYan-Hsuan Chuang 2;
22191712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 2) {
22201712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
22211712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
22221712952bSYan-Hsuan Chuang true, 1);
22231712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
22241712952bSYan-Hsuan Chuang 1;
22251712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 1) {
22261712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
22271712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
22281712952bSYan-Hsuan Chuang true, 71);
22291712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
22301712952bSYan-Hsuan Chuang 71;
22311712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 12) {
22321712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
22331712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
22341712952bSYan-Hsuan Chuang true, 11);
22351712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
22361712952bSYan-Hsuan Chuang 11;
22371712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 11) {
22381712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
22391712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
22401712952bSYan-Hsuan Chuang true, 10);
22411712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
22421712952bSYan-Hsuan Chuang 10;
22431712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 10) {
22441712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
22451712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
22461712952bSYan-Hsuan Chuang true, 9);
22471712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
22481712952bSYan-Hsuan Chuang 9;
22491712952bSYan-Hsuan Chuang }
22501712952bSYan-Hsuan Chuang }
22511712952bSYan-Hsuan Chuang }
22521712952bSYan-Hsuan Chuang } else if (max_interval == 2) {
22531712952bSYan-Hsuan Chuang if (tx_pause) {
22541712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 1) {
22551712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
22561712952bSYan-Hsuan Chuang NORMAL_EXEC,
22571712952bSYan-Hsuan Chuang true, 6);
22581712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 6;
22591712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 2) {
22601712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
22611712952bSYan-Hsuan Chuang NORMAL_EXEC,
22621712952bSYan-Hsuan Chuang true, 6);
22631712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 6;
22641712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 3) {
22651712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
22661712952bSYan-Hsuan Chuang NORMAL_EXEC,
22671712952bSYan-Hsuan Chuang true, 7);
22681712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 7;
22691712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 4) {
22701712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
22711712952bSYan-Hsuan Chuang NORMAL_EXEC,
22721712952bSYan-Hsuan Chuang true, 8);
22731712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 8;
22741712952bSYan-Hsuan Chuang }
22751712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 9) {
22761712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
22771712952bSYan-Hsuan Chuang NORMAL_EXEC,
22781712952bSYan-Hsuan Chuang true, 14);
22791712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 14;
22801712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 10) {
22811712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
22821712952bSYan-Hsuan Chuang NORMAL_EXEC,
22831712952bSYan-Hsuan Chuang true, 14);
22841712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 14;
22851712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 11) {
22861712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
22871712952bSYan-Hsuan Chuang NORMAL_EXEC,
22881712952bSYan-Hsuan Chuang true, 15);
22891712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 15;
22901712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 12) {
22911712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
22921712952bSYan-Hsuan Chuang NORMAL_EXEC,
22931712952bSYan-Hsuan Chuang true, 16);
22941712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 16;
22951712952bSYan-Hsuan Chuang }
22961712952bSYan-Hsuan Chuang if (result == -1) {
22971712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 5) {
22981712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
22991712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
23001712952bSYan-Hsuan Chuang true, 6);
23011712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
23021712952bSYan-Hsuan Chuang 6;
23031712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 6) {
23041712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
23051712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
23061712952bSYan-Hsuan Chuang true, 7);
23071712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
23081712952bSYan-Hsuan Chuang 7;
23091712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 7) {
23101712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
23111712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
23121712952bSYan-Hsuan Chuang true, 8);
23131712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
23141712952bSYan-Hsuan Chuang 8;
23151712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 13) {
23161712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
23171712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
23181712952bSYan-Hsuan Chuang true, 14);
23191712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
23201712952bSYan-Hsuan Chuang 14;
23211712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 14) {
23221712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
23231712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
23241712952bSYan-Hsuan Chuang true, 15);
23251712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
23261712952bSYan-Hsuan Chuang 15;
23271712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 15) {
23281712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
23291712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
23301712952bSYan-Hsuan Chuang true, 16);
23311712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
23321712952bSYan-Hsuan Chuang 16;
23331712952bSYan-Hsuan Chuang }
23341712952bSYan-Hsuan Chuang } else if (result == 1) {
23351712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 8) {
23361712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
23371712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
23381712952bSYan-Hsuan Chuang true, 7);
23391712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
23401712952bSYan-Hsuan Chuang 7;
23411712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 7) {
23421712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
23431712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
23441712952bSYan-Hsuan Chuang true, 6);
23451712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
23461712952bSYan-Hsuan Chuang 6;
23471712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 6) {
23481712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
23491712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
23501712952bSYan-Hsuan Chuang true, 6);
23511712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
23521712952bSYan-Hsuan Chuang 6;
23531712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 16) {
23541712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
23551712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
23561712952bSYan-Hsuan Chuang true, 15);
23571712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
23581712952bSYan-Hsuan Chuang 15;
23591712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 15) {
23601712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
23611712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
23621712952bSYan-Hsuan Chuang true, 14);
23631712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
23641712952bSYan-Hsuan Chuang 14;
23651712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 14) {
23661712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
23671712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
23681712952bSYan-Hsuan Chuang true, 14);
23691712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
23701712952bSYan-Hsuan Chuang 14;
23711712952bSYan-Hsuan Chuang }
23721712952bSYan-Hsuan Chuang }
23731712952bSYan-Hsuan Chuang } else {
23741712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 5) {
23751712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
23761712952bSYan-Hsuan Chuang NORMAL_EXEC,
23771712952bSYan-Hsuan Chuang true, 2);
23781712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 2;
23791712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 6) {
23801712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
23811712952bSYan-Hsuan Chuang NORMAL_EXEC,
23821712952bSYan-Hsuan Chuang true, 2);
23831712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 2;
23841712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 7) {
23851712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
23861712952bSYan-Hsuan Chuang NORMAL_EXEC,
23871712952bSYan-Hsuan Chuang true, 3);
23881712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 3;
23891712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 8) {
23901712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
23911712952bSYan-Hsuan Chuang NORMAL_EXEC,
23921712952bSYan-Hsuan Chuang true, 4);
23931712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 4;
23941712952bSYan-Hsuan Chuang }
23951712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 13) {
23961712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
23971712952bSYan-Hsuan Chuang NORMAL_EXEC,
23981712952bSYan-Hsuan Chuang true, 10);
23991712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 10;
24001712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 14) {
24011712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
24021712952bSYan-Hsuan Chuang NORMAL_EXEC,
24031712952bSYan-Hsuan Chuang true, 10);
24041712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 10;
24051712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 15) {
24061712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
24071712952bSYan-Hsuan Chuang NORMAL_EXEC,
24081712952bSYan-Hsuan Chuang true, 11);
24091712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 11;
24101712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 16) {
24111712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
24121712952bSYan-Hsuan Chuang NORMAL_EXEC,
24131712952bSYan-Hsuan Chuang true, 12);
24141712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 12;
24151712952bSYan-Hsuan Chuang }
24161712952bSYan-Hsuan Chuang if (result == -1) {
24171712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 1) {
24181712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
24191712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
24201712952bSYan-Hsuan Chuang true, 2);
24211712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
24221712952bSYan-Hsuan Chuang 2;
24231712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 2) {
24241712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
24251712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
24261712952bSYan-Hsuan Chuang true, 3);
24271712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
24281712952bSYan-Hsuan Chuang 3;
24291712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 3) {
24301712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
24311712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
24321712952bSYan-Hsuan Chuang true, 4);
24331712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
24341712952bSYan-Hsuan Chuang 4;
24351712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 9) {
24361712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
24371712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
24381712952bSYan-Hsuan Chuang true, 10);
24391712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
24401712952bSYan-Hsuan Chuang 10;
24411712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 10) {
24421712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
24431712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
24441712952bSYan-Hsuan Chuang true, 11);
24451712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
24461712952bSYan-Hsuan Chuang 11;
24471712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 11) {
24481712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
24491712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
24501712952bSYan-Hsuan Chuang true, 12);
24511712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
24521712952bSYan-Hsuan Chuang 12;
24531712952bSYan-Hsuan Chuang }
24541712952bSYan-Hsuan Chuang } else if (result == 1) {
24551712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 4) {
24561712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
24571712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
24581712952bSYan-Hsuan Chuang true, 3);
24591712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
24601712952bSYan-Hsuan Chuang 3;
24611712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 3) {
24621712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
24631712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
24641712952bSYan-Hsuan Chuang true, 2);
24651712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
24661712952bSYan-Hsuan Chuang 2;
24671712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 2) {
24681712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
24691712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
24701712952bSYan-Hsuan Chuang true, 2);
24711712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
24721712952bSYan-Hsuan Chuang 2;
24731712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 12) {
24741712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
24751712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
24761712952bSYan-Hsuan Chuang true, 11);
24771712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
24781712952bSYan-Hsuan Chuang 11;
24791712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 11) {
24801712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
24811712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
24821712952bSYan-Hsuan Chuang true, 10);
24831712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
24841712952bSYan-Hsuan Chuang 10;
24851712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 10) {
24861712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
24871712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
24881712952bSYan-Hsuan Chuang true, 10);
24891712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
24901712952bSYan-Hsuan Chuang 10;
24911712952bSYan-Hsuan Chuang }
24921712952bSYan-Hsuan Chuang }
24931712952bSYan-Hsuan Chuang }
24941712952bSYan-Hsuan Chuang } else if (max_interval == 3) {
24951712952bSYan-Hsuan Chuang if (tx_pause) {
24961712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 1) {
24971712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
24981712952bSYan-Hsuan Chuang NORMAL_EXEC,
24991712952bSYan-Hsuan Chuang true, 7);
25001712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 7;
25011712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 2) {
25021712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
25031712952bSYan-Hsuan Chuang NORMAL_EXEC,
25041712952bSYan-Hsuan Chuang true, 7);
25051712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 7;
25061712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 3) {
25071712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
25081712952bSYan-Hsuan Chuang NORMAL_EXEC,
25091712952bSYan-Hsuan Chuang true, 7);
25101712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 7;
25111712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 4) {
25121712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
25131712952bSYan-Hsuan Chuang NORMAL_EXEC,
25141712952bSYan-Hsuan Chuang true, 8);
25151712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 8;
25161712952bSYan-Hsuan Chuang }
25171712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 9) {
25181712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
25191712952bSYan-Hsuan Chuang NORMAL_EXEC,
25201712952bSYan-Hsuan Chuang true, 15);
25211712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 15;
25221712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 10) {
25231712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
25241712952bSYan-Hsuan Chuang NORMAL_EXEC,
25251712952bSYan-Hsuan Chuang true, 15);
25261712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 15;
25271712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 11) {
25281712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
25291712952bSYan-Hsuan Chuang NORMAL_EXEC,
25301712952bSYan-Hsuan Chuang true, 15);
25311712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 15;
25321712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 12) {
25331712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
25341712952bSYan-Hsuan Chuang NORMAL_EXEC,
25351712952bSYan-Hsuan Chuang true, 16);
25361712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 16;
25371712952bSYan-Hsuan Chuang }
25381712952bSYan-Hsuan Chuang if (result == -1) {
25391712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 5) {
25401712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
25411712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
25421712952bSYan-Hsuan Chuang true, 7);
25431712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
25441712952bSYan-Hsuan Chuang 7;
25451712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 6) {
25461712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
25471712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
25481712952bSYan-Hsuan Chuang true, 7);
25491712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
25501712952bSYan-Hsuan Chuang 7;
25511712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 7) {
25521712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
25531712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
25541712952bSYan-Hsuan Chuang true, 8);
25551712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
25561712952bSYan-Hsuan Chuang 8;
25571712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 13) {
25581712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
25591712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
25601712952bSYan-Hsuan Chuang true, 15);
25611712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
25621712952bSYan-Hsuan Chuang 15;
25631712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 14) {
25641712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
25651712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
25661712952bSYan-Hsuan Chuang true, 15);
25671712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
25681712952bSYan-Hsuan Chuang 15;
25691712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 15) {
25701712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
25711712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
25721712952bSYan-Hsuan Chuang true, 16);
25731712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
25741712952bSYan-Hsuan Chuang 16;
25751712952bSYan-Hsuan Chuang }
25761712952bSYan-Hsuan Chuang } else if (result == 1) {
25771712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 8) {
25781712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
25791712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
25801712952bSYan-Hsuan Chuang true, 7);
25811712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
25821712952bSYan-Hsuan Chuang 7;
25831712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 7) {
25841712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
25851712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
25861712952bSYan-Hsuan Chuang true, 7);
25871712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
25881712952bSYan-Hsuan Chuang 7;
25891712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 6) {
25901712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
25911712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
25921712952bSYan-Hsuan Chuang true, 7);
25931712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
25941712952bSYan-Hsuan Chuang 7;
25951712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 16) {
25961712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
25971712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
25981712952bSYan-Hsuan Chuang true, 15);
25991712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
26001712952bSYan-Hsuan Chuang 15;
26011712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 15) {
26021712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
26031712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
26041712952bSYan-Hsuan Chuang true, 15);
26051712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
26061712952bSYan-Hsuan Chuang 15;
26071712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 14) {
26081712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
26091712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
26101712952bSYan-Hsuan Chuang true, 15);
26111712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
26121712952bSYan-Hsuan Chuang 15;
26131712952bSYan-Hsuan Chuang }
26141712952bSYan-Hsuan Chuang }
26151712952bSYan-Hsuan Chuang } else {
26161712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 5) {
26171712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
26181712952bSYan-Hsuan Chuang NORMAL_EXEC,
26191712952bSYan-Hsuan Chuang true, 3);
26201712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 3;
26211712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 6) {
26221712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
26231712952bSYan-Hsuan Chuang NORMAL_EXEC,
26241712952bSYan-Hsuan Chuang true, 3);
26251712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 3;
26261712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 7) {
26271712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
26281712952bSYan-Hsuan Chuang NORMAL_EXEC,
26291712952bSYan-Hsuan Chuang true, 3);
26301712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 3;
26311712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 8) {
26321712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
26331712952bSYan-Hsuan Chuang NORMAL_EXEC,
26341712952bSYan-Hsuan Chuang true, 4);
26351712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 4;
26361712952bSYan-Hsuan Chuang }
26371712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 13) {
26381712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
26391712952bSYan-Hsuan Chuang NORMAL_EXEC,
26401712952bSYan-Hsuan Chuang true, 11);
26411712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 11;
26421712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 14) {
26431712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
26441712952bSYan-Hsuan Chuang NORMAL_EXEC,
26451712952bSYan-Hsuan Chuang true, 11);
26461712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 11;
26471712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 15) {
26481712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
26491712952bSYan-Hsuan Chuang NORMAL_EXEC,
26501712952bSYan-Hsuan Chuang true, 11);
26511712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 11;
26521712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 16) {
26531712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist,
26541712952bSYan-Hsuan Chuang NORMAL_EXEC,
26551712952bSYan-Hsuan Chuang true, 12);
26561712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type = 12;
26571712952bSYan-Hsuan Chuang }
26581712952bSYan-Hsuan Chuang if (result == -1) {
26591712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 1) {
26601712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
26611712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
26621712952bSYan-Hsuan Chuang true, 3);
26631712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
26641712952bSYan-Hsuan Chuang 3;
26651712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 2) {
26661712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
26671712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
26681712952bSYan-Hsuan Chuang true, 3);
26691712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
26701712952bSYan-Hsuan Chuang 3;
26711712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 3) {
26721712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
26731712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
26741712952bSYan-Hsuan Chuang true, 4);
26751712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
26761712952bSYan-Hsuan Chuang 4;
26771712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 9) {
26781712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
26791712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
26801712952bSYan-Hsuan Chuang true, 11);
26811712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
26821712952bSYan-Hsuan Chuang 11;
26831712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 10) {
26841712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
26851712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
26861712952bSYan-Hsuan Chuang true, 11);
26871712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
26881712952bSYan-Hsuan Chuang 11;
26891712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 11) {
26901712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
26911712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
26921712952bSYan-Hsuan Chuang true, 12);
26931712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
26941712952bSYan-Hsuan Chuang 12;
26951712952bSYan-Hsuan Chuang }
26961712952bSYan-Hsuan Chuang } else if (result == 1) {
26971712952bSYan-Hsuan Chuang if (coex_dm->cur_ps_tdma == 4) {
26981712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
26991712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
27001712952bSYan-Hsuan Chuang true, 3);
27011712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
27021712952bSYan-Hsuan Chuang 3;
27031712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 3) {
27041712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
27051712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
27061712952bSYan-Hsuan Chuang true, 3);
27071712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
27081712952bSYan-Hsuan Chuang 3;
27091712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 2) {
27101712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
27111712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
27121712952bSYan-Hsuan Chuang true, 3);
27131712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
27141712952bSYan-Hsuan Chuang 3;
27151712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 12) {
27161712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
27171712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
27181712952bSYan-Hsuan Chuang true, 11);
27191712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
27201712952bSYan-Hsuan Chuang 11;
27211712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 11) {
27221712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
27231712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
27241712952bSYan-Hsuan Chuang true, 11);
27251712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
27261712952bSYan-Hsuan Chuang 11;
27271712952bSYan-Hsuan Chuang } else if (coex_dm->cur_ps_tdma == 10) {
27281712952bSYan-Hsuan Chuang btc8723b2ant_ps_tdma(
27291712952bSYan-Hsuan Chuang btcoexist, NORMAL_EXEC,
27301712952bSYan-Hsuan Chuang true, 11);
27311712952bSYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type =
27321712952bSYan-Hsuan Chuang 11;
27331712952bSYan-Hsuan Chuang }
27341712952bSYan-Hsuan Chuang }
27351712952bSYan-Hsuan Chuang }
27361712952bSYan-Hsuan Chuang }
2737f1d2b4d3SLarry Finger }
2738f1d2b4d3SLarry Finger
2739c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2740c6821613SYan-Hsuan Chuang "[BTCoex], max Interval = %d\n", max_interval);
2741c6821613SYan-Hsuan Chuang
2742c6821613SYan-Hsuan Chuang /* if current PsTdma not match with the recorded one (scan, dhcp, ...),
2743f1d2b4d3SLarry Finger * then we have to adjust it back to the previous recorded one.
2744f1d2b4d3SLarry Finger */
2745b91ed731SYan-Hsuan Chuang if (coex_dm->cur_ps_tdma != coex_dm->ps_tdma_du_adj_type) {
2746f1d2b4d3SLarry Finger bool scan = false, link = false, roam = false;
2747c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2748070fc356SColin Ian King "[BTCoex], PsTdma type mismatch!!!, curPsTdma=%d, recordPsTdma=%d\n",
2749b91ed731SYan-Hsuan Chuang coex_dm->cur_ps_tdma, coex_dm->ps_tdma_du_adj_type);
2750f1d2b4d3SLarry Finger
2751f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2752f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2753f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2754f1d2b4d3SLarry Finger
2755f1d2b4d3SLarry Finger if (!scan && !link && !roam)
2756f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2757b91ed731SYan-Hsuan Chuang coex_dm->ps_tdma_du_adj_type);
2758f1d2b4d3SLarry Finger else
2759c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2760466414a0SJoe Perches "[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n");
2761f1d2b4d3SLarry Finger }
2762f1d2b4d3SLarry Finger }
2763f1d2b4d3SLarry Finger
2764f1d2b4d3SLarry Finger /* SCO only or SCO+PAN(HS) */
btc8723b2ant_action_sco(struct btc_coexist * btcoexist)2765f1d2b4d3SLarry Finger static void btc8723b2ant_action_sco(struct btc_coexist *btcoexist)
2766f1d2b4d3SLarry Finger {
2767*bb053d02SLee Jones u8 bt_rssi_state;
2768f1d2b4d3SLarry Finger u32 wifi_bw;
2769f1d2b4d3SLarry Finger
2770*bb053d02SLee Jones btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2771c5e21136SYan-Hsuan Chuang bt_rssi_state = btc8723b2ant_bt_rssi_state(
2772c5e21136SYan-Hsuan Chuang btcoexist, 2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
2773c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset,
2774c5e21136SYan-Hsuan Chuang 0);
2775f1d2b4d3SLarry Finger
2776f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2777f1d2b4d3SLarry Finger
2778155305f5SYan-Hsuan Chuang btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2779f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 4);
2780f1d2b4d3SLarry Finger
2781c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(bt_rssi_state))
2782c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2783c5e21136SYan-Hsuan Chuang else
2784c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2785c5e21136SYan-Hsuan Chuang
2786f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2787f1d2b4d3SLarry Finger
2788f1d2b4d3SLarry Finger if (BTC_WIFI_BW_LEGACY == wifi_bw)
2789c6821613SYan-Hsuan Chuang /* for SCO quality at 11b/g mode */
2790c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2791c6821613SYan-Hsuan Chuang else
2792c6821613SYan-Hsuan Chuang /* for SCO quality & wifi performance balance at 11n mode */
2793c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
2794f1d2b4d3SLarry Finger
2795f1d2b4d3SLarry Finger /* for voice quality */
2796f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2797f1d2b4d3SLarry Finger
2798f1d2b4d3SLarry Finger /* sw mechanism */
2799f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) {
2800c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, true, true,
2801f1d2b4d3SLarry Finger false, false);
2802f1d2b4d3SLarry Finger } else {
2803c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, true,
2804f1d2b4d3SLarry Finger false, false);
2805f1d2b4d3SLarry Finger }
2806f1d2b4d3SLarry Finger }
2807f1d2b4d3SLarry Finger
btc8723b2ant_action_hid(struct btc_coexist * btcoexist)2808f1d2b4d3SLarry Finger static void btc8723b2ant_action_hid(struct btc_coexist *btcoexist)
2809f1d2b4d3SLarry Finger {
2810*bb053d02SLee Jones u8 bt_rssi_state;
2811f1d2b4d3SLarry Finger u32 wifi_bw;
2812c5e21136SYan-Hsuan Chuang u8 tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
2813c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
2814f1d2b4d3SLarry Finger
2815*bb053d02SLee Jones btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2816c5e21136SYan-Hsuan Chuang bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
2817f1d2b4d3SLarry Finger
2818f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2819f1d2b4d3SLarry Finger
2820c5e21136SYan-Hsuan Chuang btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2821f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2822f1d2b4d3SLarry Finger
2823c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(bt_rssi_state))
2824c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2825c5e21136SYan-Hsuan Chuang else
2826c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2827c5e21136SYan-Hsuan Chuang
2828f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2829f1d2b4d3SLarry Finger
2830c6821613SYan-Hsuan Chuang if (wifi_bw == BTC_WIFI_BW_LEGACY)
2831c6821613SYan-Hsuan Chuang /* for HID at 11b/g mode */
2832c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2833c6821613SYan-Hsuan Chuang else
2834c6821613SYan-Hsuan Chuang /* for HID quality & wifi performance balance at 11n mode */
2835c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 9);
2836c6821613SYan-Hsuan Chuang
2837b01127b2SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2838b01127b2SYan-Hsuan Chuang
2839f1d2b4d3SLarry Finger if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2840f1d2b4d3SLarry Finger (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
2841f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
2842f1d2b4d3SLarry Finger else
2843f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
2844f1d2b4d3SLarry Finger
2845f1d2b4d3SLarry Finger /* sw mechanism */
284606895b16SGustavo A. R. Silva if (wifi_bw == BTC_WIFI_BW_HT40)
284706895b16SGustavo A. R. Silva btc8723b2ant_sw_mechanism(btcoexist, true, true, false, false);
284806895b16SGustavo A. R. Silva else
284906895b16SGustavo A. R. Silva btc8723b2ant_sw_mechanism(btcoexist, false, true, false, false);
2850f1d2b4d3SLarry Finger }
2851f1d2b4d3SLarry Finger
2852f1d2b4d3SLarry Finger /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
btc8723b2ant_action_a2dp(struct btc_coexist * btcoexist)2853f1d2b4d3SLarry Finger static void btc8723b2ant_action_a2dp(struct btc_coexist *btcoexist)
2854f1d2b4d3SLarry Finger {
2855*bb053d02SLee Jones u8 wifi_rssi_state1, bt_rssi_state;
2856f1d2b4d3SLarry Finger u32 wifi_bw;
2857f1d2b4d3SLarry Finger u8 ap_num = 0;
2858c5e21136SYan-Hsuan Chuang u8 tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
2859c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
2860f1d2b4d3SLarry Finger
2861*bb053d02SLee Jones btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2862c5e21136SYan-Hsuan Chuang wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2, 40, 0);
2863c5e21136SYan-Hsuan Chuang bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
2864f1d2b4d3SLarry Finger
2865f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
2866f1d2b4d3SLarry Finger
2867f1d2b4d3SLarry Finger /* define the office environment */
2868f1d2b4d3SLarry Finger /* driver don't know AP num in Linux, so we will never enter this if */
2869f1d2b4d3SLarry Finger if (ap_num >= 10 && BTC_RSSI_HIGH(wifi_rssi_state1)) {
2870f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
2871f1d2b4d3SLarry Finger 0x0);
2872f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2873f1d2b4d3SLarry Finger btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2874c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2875f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
2876f1d2b4d3SLarry Finger
2877f1d2b4d3SLarry Finger /* sw mechanism */
2878f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2879f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) {
2880c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, true, false,
2881f1d2b4d3SLarry Finger false, false);
2882f1d2b4d3SLarry Finger } else {
2883c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, false,
2884f1d2b4d3SLarry Finger false, false);
2885f1d2b4d3SLarry Finger }
2886f1d2b4d3SLarry Finger return;
2887f1d2b4d3SLarry Finger }
2888f1d2b4d3SLarry Finger
2889f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2890155305f5SYan-Hsuan Chuang btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2891f1d2b4d3SLarry Finger
2892f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2893f1d2b4d3SLarry Finger
2894c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(bt_rssi_state))
2895c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2896c5e21136SYan-Hsuan Chuang else
2897c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2898c5e21136SYan-Hsuan Chuang
2899c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
2900c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2901c5e21136SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2902c5e21136SYan-Hsuan Chuang 0x0, 0x0);
2903c5e21136SYan-Hsuan Chuang } else {
2904c5e21136SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
2905c5e21136SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
2906c5e21136SYan-Hsuan Chuang 0x4);
2907c5e21136SYan-Hsuan Chuang }
2908f1d2b4d3SLarry Finger
2909f1d2b4d3SLarry Finger if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2910f1d2b4d3SLarry Finger (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
2911f1d2b4d3SLarry Finger btc8723b2ant_tdma_duration_adjust(btcoexist, false,
2912f1d2b4d3SLarry Finger false, 1);
2913f1d2b4d3SLarry Finger else
2914f1d2b4d3SLarry Finger btc8723b2ant_tdma_duration_adjust(btcoexist, false, true, 1);
2915f1d2b4d3SLarry Finger
2916f1d2b4d3SLarry Finger /* sw mechanism */
2917f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2918f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) {
2919c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, true, false,
2920f1d2b4d3SLarry Finger false, false);
2921f1d2b4d3SLarry Finger } else {
2922c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, false,
2923f1d2b4d3SLarry Finger false, false);
2924f1d2b4d3SLarry Finger }
2925f1d2b4d3SLarry Finger }
2926f1d2b4d3SLarry Finger
btc8723b2ant_action_a2dp_pan_hs(struct btc_coexist * btcoexist)2927f1d2b4d3SLarry Finger static void btc8723b2ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)
2928f1d2b4d3SLarry Finger {
2929*bb053d02SLee Jones u8 wifi_rssi_state1, bt_rssi_state;
2930f1d2b4d3SLarry Finger u32 wifi_bw;
2931c5e21136SYan-Hsuan Chuang u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
2932c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
2933f1d2b4d3SLarry Finger
2934*bb053d02SLee Jones btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2935c5e21136SYan-Hsuan Chuang wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
2936c5e21136SYan-Hsuan Chuang tmp, 0);
2937c5e21136SYan-Hsuan Chuang tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
2938c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
2939c5e21136SYan-Hsuan Chuang bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
2940f1d2b4d3SLarry Finger
2941f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2942f1d2b4d3SLarry Finger
2943155305f5SYan-Hsuan Chuang btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2944f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2945f1d2b4d3SLarry Finger
2946c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(bt_rssi_state))
2947c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2948c5e21136SYan-Hsuan Chuang else
2949c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2950c5e21136SYan-Hsuan Chuang
2951c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
2952c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2953c5e21136SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2954c5e21136SYan-Hsuan Chuang 0x0, 0x0);
2955c5e21136SYan-Hsuan Chuang } else {
2956c5e21136SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
2957c5e21136SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
2958c5e21136SYan-Hsuan Chuang 0x4);
2959c5e21136SYan-Hsuan Chuang }
2960f1d2b4d3SLarry Finger
2961f1d2b4d3SLarry Finger btc8723b2ant_tdma_duration_adjust(btcoexist, false, true, 2);
2962f1d2b4d3SLarry Finger
2963f1d2b4d3SLarry Finger /* sw mechanism */
2964c6821613SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2965f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) {
2966c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, true, false,
2967f1d2b4d3SLarry Finger false, false);
2968f1d2b4d3SLarry Finger } else {
2969c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, false,
2970f1d2b4d3SLarry Finger false, false);
2971f1d2b4d3SLarry Finger }
2972f1d2b4d3SLarry Finger }
2973f1d2b4d3SLarry Finger
btc8723b2ant_action_pan_edr(struct btc_coexist * btcoexist)2974f1d2b4d3SLarry Finger static void btc8723b2ant_action_pan_edr(struct btc_coexist *btcoexist)
2975f1d2b4d3SLarry Finger {
2976*bb053d02SLee Jones u8 wifi_rssi_state1, bt_rssi_state;
2977f1d2b4d3SLarry Finger u32 wifi_bw;
2978c5e21136SYan-Hsuan Chuang u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
2979c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
2980f1d2b4d3SLarry Finger
2981*bb053d02SLee Jones btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2982c5e21136SYan-Hsuan Chuang wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
2983c5e21136SYan-Hsuan Chuang tmp, 0);
2984c5e21136SYan-Hsuan Chuang tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
2985c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
2986c5e21136SYan-Hsuan Chuang bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
2987f1d2b4d3SLarry Finger
2988f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2989f1d2b4d3SLarry Finger
2990155305f5SYan-Hsuan Chuang btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2991f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2992f1d2b4d3SLarry Finger
299327a31a60SYan-Hsuan Chuang if (BTC_RSSI_HIGH(bt_rssi_state))
299427a31a60SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2995f1d2b4d3SLarry Finger else
299627a31a60SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2997f1d2b4d3SLarry Finger
2998c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
2999c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 10);
3000c5e21136SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3001c5e21136SYan-Hsuan Chuang 0x0, 0x0);
3002c5e21136SYan-Hsuan Chuang } else {
3003c5e21136SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
3004c5e21136SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3005c5e21136SYan-Hsuan Chuang 0x4);
3006c5e21136SYan-Hsuan Chuang }
3007f1d2b4d3SLarry Finger
3008f1d2b4d3SLarry Finger if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3009f1d2b4d3SLarry Finger (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
3010f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1);
3011f1d2b4d3SLarry Finger else
3012f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
3013f1d2b4d3SLarry Finger
3014f1d2b4d3SLarry Finger /* sw mechanism */
3015f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3016f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) {
3017c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, true, false,
3018f1d2b4d3SLarry Finger false, false);
3019f1d2b4d3SLarry Finger } else {
3020c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, false,
3021f1d2b4d3SLarry Finger false, false);
3022f1d2b4d3SLarry Finger }
3023f1d2b4d3SLarry Finger }
3024f1d2b4d3SLarry Finger
3025f1d2b4d3SLarry Finger /* PAN(HS) only */
btc8723b2ant_action_pan_hs(struct btc_coexist * btcoexist)3026f1d2b4d3SLarry Finger static void btc8723b2ant_action_pan_hs(struct btc_coexist *btcoexist)
3027f1d2b4d3SLarry Finger {
3028*bb053d02SLee Jones u8 bt_rssi_state;
3029f1d2b4d3SLarry Finger u32 wifi_bw;
3030c5e21136SYan-Hsuan Chuang u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
3031c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
3032f1d2b4d3SLarry Finger
3033*bb053d02SLee Jones btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3034*bb053d02SLee Jones btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
3035c5e21136SYan-Hsuan Chuang tmp, 0);
3036c5e21136SYan-Hsuan Chuang tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
3037c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
3038c5e21136SYan-Hsuan Chuang bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
3039f1d2b4d3SLarry Finger
3040f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3041f1d2b4d3SLarry Finger
3042155305f5SYan-Hsuan Chuang btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3043f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3044f1d2b4d3SLarry Finger
3045c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(bt_rssi_state))
3046c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3047f1d2b4d3SLarry Finger else
304844e9a534SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3049f1d2b4d3SLarry Finger
3050c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3051f1d2b4d3SLarry Finger btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3052f1d2b4d3SLarry Finger
3053f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3054f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) {
3055c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, true, false,
3056f1d2b4d3SLarry Finger false, false);
3057f1d2b4d3SLarry Finger } else {
3058c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, false,
3059f1d2b4d3SLarry Finger false, false);
3060f1d2b4d3SLarry Finger }
3061f1d2b4d3SLarry Finger }
3062f1d2b4d3SLarry Finger
3063f1d2b4d3SLarry Finger /* PAN(EDR) + A2DP */
btc8723b2ant_action_pan_edr_a2dp(struct btc_coexist * btcoexist)3064f1d2b4d3SLarry Finger static void btc8723b2ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)
3065f1d2b4d3SLarry Finger {
3066*bb053d02SLee Jones u8 wifi_rssi_state1, bt_rssi_state;
3067f1d2b4d3SLarry Finger u32 wifi_bw;
3068c5e21136SYan-Hsuan Chuang u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
3069c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
3070f1d2b4d3SLarry Finger
3071*bb053d02SLee Jones btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3072c5e21136SYan-Hsuan Chuang wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
3073c5e21136SYan-Hsuan Chuang tmp, 0);
3074c5e21136SYan-Hsuan Chuang tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
3075c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
3076c5e21136SYan-Hsuan Chuang bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
3077f1d2b4d3SLarry Finger
3078f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3079f1d2b4d3SLarry Finger
3080f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3081f1d2b4d3SLarry Finger
308227a31a60SYan-Hsuan Chuang if (BTC_RSSI_HIGH(bt_rssi_state))
308327a31a60SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3084f1d2b4d3SLarry Finger else
308544e9a534SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3086f1d2b4d3SLarry Finger
3087c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state))
3088c5e21136SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3089c5e21136SYan-Hsuan Chuang 0x0, 0x0);
3090c5e21136SYan-Hsuan Chuang else
3091c5e21136SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3092c5e21136SYan-Hsuan Chuang 0x4);
3093f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3094f1d2b4d3SLarry Finger
3095f1d2b4d3SLarry Finger if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3096f1d2b4d3SLarry Finger (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3097c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 12);
3098f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw)
3099f1d2b4d3SLarry Finger btc8723b2ant_tdma_duration_adjust(btcoexist, false,
3100f1d2b4d3SLarry Finger true, 3);
3101f1d2b4d3SLarry Finger else
3102f1d2b4d3SLarry Finger btc8723b2ant_tdma_duration_adjust(btcoexist, false,
3103f1d2b4d3SLarry Finger false, 3);
3104f1d2b4d3SLarry Finger } else {
3105c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
31062e668982SYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
3107f1d2b4d3SLarry Finger }
3108f1d2b4d3SLarry Finger
3109f1d2b4d3SLarry Finger /* sw mechanism */
3110f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) {
3111c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, true, false,
3112f1d2b4d3SLarry Finger false, false);
3113f1d2b4d3SLarry Finger } else {
3114c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, false,
3115f1d2b4d3SLarry Finger false, false);
3116f1d2b4d3SLarry Finger }
3117f1d2b4d3SLarry Finger }
3118f1d2b4d3SLarry Finger
btc8723b2ant_action_pan_edr_hid(struct btc_coexist * btcoexist)3119f1d2b4d3SLarry Finger static void btc8723b2ant_action_pan_edr_hid(struct btc_coexist *btcoexist)
3120f1d2b4d3SLarry Finger {
3121*bb053d02SLee Jones u8 wifi_rssi_state1, bt_rssi_state;
3122f1d2b4d3SLarry Finger u32 wifi_bw;
3123c5e21136SYan-Hsuan Chuang u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
3124c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
3125f1d2b4d3SLarry Finger
3126*bb053d02SLee Jones btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3127c5e21136SYan-Hsuan Chuang wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
3128c5e21136SYan-Hsuan Chuang tmp, 0);
3129c5e21136SYan-Hsuan Chuang tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
3130c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
3131c5e21136SYan-Hsuan Chuang bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
3132f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3133f1d2b4d3SLarry Finger
3134155305f5SYan-Hsuan Chuang btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3135155305f5SYan-Hsuan Chuang
313627a31a60SYan-Hsuan Chuang if (BTC_RSSI_HIGH(bt_rssi_state))
313727a31a60SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3138f1d2b4d3SLarry Finger else
313944e9a534SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3140f1d2b4d3SLarry Finger
3141c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
3142c5e21136SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3143c5e21136SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3144c5e21136SYan-Hsuan Chuang 0x0, 0x0);
3145c5e21136SYan-Hsuan Chuang } else {
3146c5e21136SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 14);
3147c5e21136SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3148c5e21136SYan-Hsuan Chuang 0x4);
3149c5e21136SYan-Hsuan Chuang }
3150c5e21136SYan-Hsuan Chuang
3151f1d2b4d3SLarry Finger if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3152f1d2b4d3SLarry Finger (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3153f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) {
3154f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
3155f1d2b4d3SLarry Finger 3);
3156f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
3157f1d2b4d3SLarry Finger 0xfffff, 0x780);
3158f1d2b4d3SLarry Finger } else {
3159f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
3160f1d2b4d3SLarry Finger 6);
3161f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
3162f1d2b4d3SLarry Finger 0xfffff, 0x0);
3163f1d2b4d3SLarry Finger }
3164f1d2b4d3SLarry Finger btc8723b2ant_tdma_duration_adjust(btcoexist, true, false, 2);
3165f1d2b4d3SLarry Finger } else {
3166f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3167f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
3168f1d2b4d3SLarry Finger 0x0);
3169f1d2b4d3SLarry Finger btc8723b2ant_tdma_duration_adjust(btcoexist, true, true, 2);
3170f1d2b4d3SLarry Finger }
3171f1d2b4d3SLarry Finger
3172f1d2b4d3SLarry Finger /* sw mechanism */
3173f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) {
3174c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, true, true,
3175f1d2b4d3SLarry Finger false, false);
3176f1d2b4d3SLarry Finger } else {
3177c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, true,
3178f1d2b4d3SLarry Finger false, false);
3179f1d2b4d3SLarry Finger }
3180f1d2b4d3SLarry Finger }
3181f1d2b4d3SLarry Finger
3182f1d2b4d3SLarry Finger /* HID + A2DP + PAN(EDR) */
btc8723b2ant_action_hid_a2dp_pan_edr(struct btc_coexist * btcoexist)3183f1d2b4d3SLarry Finger static void btc8723b2ant_action_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)
3184f1d2b4d3SLarry Finger {
3185*bb053d02SLee Jones u8 wifi_rssi_state1, bt_rssi_state;
3186f1d2b4d3SLarry Finger u32 wifi_bw;
3187c5e21136SYan-Hsuan Chuang u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
3188c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
3189f1d2b4d3SLarry Finger
3190*bb053d02SLee Jones btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3191c5e21136SYan-Hsuan Chuang wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
3192c5e21136SYan-Hsuan Chuang tmp, 0);
3193c5e21136SYan-Hsuan Chuang tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
3194c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
3195c5e21136SYan-Hsuan Chuang bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
3196f1d2b4d3SLarry Finger
3197f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3198f1d2b4d3SLarry Finger
3199155305f5SYan-Hsuan Chuang btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3200f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3201f1d2b4d3SLarry Finger
320227a31a60SYan-Hsuan Chuang if (BTC_RSSI_HIGH(bt_rssi_state))
320327a31a60SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3204f1d2b4d3SLarry Finger else
320544e9a534SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3206f1d2b4d3SLarry Finger
3207c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
3208c5e21136SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3209c5e21136SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3210c5e21136SYan-Hsuan Chuang 0x0, 0x0);
3211c5e21136SYan-Hsuan Chuang } else {
3212c5e21136SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 14);
3213c5e21136SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3214c5e21136SYan-Hsuan Chuang 0x4);
3215c5e21136SYan-Hsuan Chuang }
3216c5e21136SYan-Hsuan Chuang
3217f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3218f1d2b4d3SLarry Finger
3219f1d2b4d3SLarry Finger
3220f1d2b4d3SLarry Finger if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3221f1d2b4d3SLarry Finger (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3222f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw)
3223f1d2b4d3SLarry Finger btc8723b2ant_tdma_duration_adjust(btcoexist, true,
3224f1d2b4d3SLarry Finger true, 2);
3225f1d2b4d3SLarry Finger else
3226f1d2b4d3SLarry Finger btc8723b2ant_tdma_duration_adjust(btcoexist, true,
3227f1d2b4d3SLarry Finger false, 3);
3228f1d2b4d3SLarry Finger } else {
3229f1d2b4d3SLarry Finger btc8723b2ant_tdma_duration_adjust(btcoexist, true, true, 3);
3230f1d2b4d3SLarry Finger }
3231f1d2b4d3SLarry Finger
3232f1d2b4d3SLarry Finger /* sw mechanism */
3233f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) {
3234c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, true, true,
3235f1d2b4d3SLarry Finger false, false);
3236f1d2b4d3SLarry Finger } else {
3237c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, true,
3238f1d2b4d3SLarry Finger false, false);
3239f1d2b4d3SLarry Finger }
3240f1d2b4d3SLarry Finger }
3241f1d2b4d3SLarry Finger
btc8723b2ant_action_hid_a2dp(struct btc_coexist * btcoexist)3242f1d2b4d3SLarry Finger static void btc8723b2ant_action_hid_a2dp(struct btc_coexist *btcoexist)
3243f1d2b4d3SLarry Finger {
3244*bb053d02SLee Jones u8 wifi_rssi_state1, bt_rssi_state;
3245f1d2b4d3SLarry Finger u32 wifi_bw;
3246c5e21136SYan-Hsuan Chuang u8 ap_num = 0;
3247c5e21136SYan-Hsuan Chuang u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
3248c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
3249f1d2b4d3SLarry Finger
3250*bb053d02SLee Jones btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3251c5e21136SYan-Hsuan Chuang wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
3252c5e21136SYan-Hsuan Chuang tmp, 0);
3253c5e21136SYan-Hsuan Chuang tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
3254c5e21136SYan-Hsuan Chuang coex_dm->switch_thres_offset;
3255c5e21136SYan-Hsuan Chuang bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 3, tmp, 37);
3256f1d2b4d3SLarry Finger
3257f1d2b4d3SLarry Finger btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3258f1d2b4d3SLarry Finger
325911094402SYan-Hsuan Chuang btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, true, 0x5);
3260f1d2b4d3SLarry Finger btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3261f1d2b4d3SLarry Finger
3262f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3263f1d2b4d3SLarry Finger
3264c5e21136SYan-Hsuan Chuang if (wifi_bw == BTC_WIFI_BW_LEGACY) {
3265c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(bt_rssi_state))
3266c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3267c5e21136SYan-Hsuan Chuang else if (BTC_RSSI_MEDIUM(bt_rssi_state))
3268c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3269f1d2b4d3SLarry Finger else
3270c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3271c5e21136SYan-Hsuan Chuang } else {
3272c5e21136SYan-Hsuan Chuang /* only 802.11N mode we have to dec bt power to 4 degree */
3273c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(bt_rssi_state)) {
3274c5e21136SYan-Hsuan Chuang /* need to check ap Number of Not */
3275c5e21136SYan-Hsuan Chuang if (ap_num < 10)
3276c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist,
3277c5e21136SYan-Hsuan Chuang NORMAL_EXEC, 4);
3278c5e21136SYan-Hsuan Chuang else
3279c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist,
3280c5e21136SYan-Hsuan Chuang NORMAL_EXEC, 2);
3281c5e21136SYan-Hsuan Chuang } else if (BTC_RSSI_MEDIUM(bt_rssi_state)) {
3282c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3283c5e21136SYan-Hsuan Chuang } else {
3284c5e21136SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3285c5e21136SYan-Hsuan Chuang }
3286c5e21136SYan-Hsuan Chuang }
3287c5e21136SYan-Hsuan Chuang
3288c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
3289c5e21136SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3290c5e21136SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3291c5e21136SYan-Hsuan Chuang 0x0, 0x0);
3292c5e21136SYan-Hsuan Chuang } else {
3293c5e21136SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 14);
3294c5e21136SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3295c5e21136SYan-Hsuan Chuang 0x4);
3296c5e21136SYan-Hsuan Chuang }
3297c5e21136SYan-Hsuan Chuang
3298c5e21136SYan-Hsuan Chuang if (BTC_RSSI_HIGH(bt_rssi_state)) {
3299c5e21136SYan-Hsuan Chuang if (ap_num < 10)
3300c5e21136SYan-Hsuan Chuang btc8723b2ant_tdma_duration_adjust(btcoexist, true,
3301c5e21136SYan-Hsuan Chuang false, 1);
3302c5e21136SYan-Hsuan Chuang else
3303c5e21136SYan-Hsuan Chuang btc8723b2ant_tdma_duration_adjust(btcoexist, true,
3304c5e21136SYan-Hsuan Chuang false, 3);
3305c5e21136SYan-Hsuan Chuang } else {
3306c5e21136SYan-Hsuan Chuang btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 18);
3307c5e21136SYan-Hsuan Chuang btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);
3308c5e21136SYan-Hsuan Chuang btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);
3309c5e21136SYan-Hsuan Chuang btcoexist->btc_write_4byte(btcoexist, 0x430, 0x0);
3310c5e21136SYan-Hsuan Chuang btcoexist->btc_write_4byte(btcoexist, 0x434, 0x01010000);
3311c5e21136SYan-Hsuan Chuang
3312c5e21136SYan-Hsuan Chuang if (ap_num < 10)
3313c5e21136SYan-Hsuan Chuang btc8723b2ant_tdma_duration_adjust(btcoexist, true,
3314c5e21136SYan-Hsuan Chuang true, 1);
3315c5e21136SYan-Hsuan Chuang else
3316c5e21136SYan-Hsuan Chuang btc8723b2ant_tdma_duration_adjust(btcoexist, true,
3317c5e21136SYan-Hsuan Chuang true, 3);
3318c5e21136SYan-Hsuan Chuang }
3319f1d2b4d3SLarry Finger
3320f1d2b4d3SLarry Finger /* sw mechanism */
3321f1d2b4d3SLarry Finger if (BTC_WIFI_BW_HT40 == wifi_bw) {
3322c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, true, true,
3323f1d2b4d3SLarry Finger false, false);
3324f1d2b4d3SLarry Finger } else {
3325c6821613SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, true,
3326f1d2b4d3SLarry Finger false, false);
3327f1d2b4d3SLarry Finger }
3328f1d2b4d3SLarry Finger }
3329f1d2b4d3SLarry Finger
btc8723b2ant_action_wifi_multi_port(struct btc_coexist * btcoexist)3330a8570896SYan-Hsuan Chuang static void btc8723b2ant_action_wifi_multi_port(struct btc_coexist *btcoexist)
3331a8570896SYan-Hsuan Chuang {
3332a8570896SYan-Hsuan Chuang btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3333a8570896SYan-Hsuan Chuang btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3334a8570896SYan-Hsuan Chuang
3335a8570896SYan-Hsuan Chuang /* sw all off */
3336a8570896SYan-Hsuan Chuang btc8723b2ant_sw_mechanism(btcoexist, false, false, false, false);
3337a8570896SYan-Hsuan Chuang
3338a8570896SYan-Hsuan Chuang /* hw all off */
3339a8570896SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3340a8570896SYan-Hsuan Chuang
3341a8570896SYan-Hsuan Chuang btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
3342a8570896SYan-Hsuan Chuang btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3343a8570896SYan-Hsuan Chuang }
3344a8570896SYan-Hsuan Chuang
btc8723b2ant_run_coexist_mechanism(struct btc_coexist * btcoexist)3345f1d2b4d3SLarry Finger static void btc8723b2ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
3346f1d2b4d3SLarry Finger {
33472277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
3348f1d2b4d3SLarry Finger u8 algorithm = 0;
3349a8570896SYan-Hsuan Chuang u32 num_of_wifi_link = 0;
3350a8570896SYan-Hsuan Chuang u32 wifi_link_status = 0;
3351a8570896SYan-Hsuan Chuang struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3352a8570896SYan-Hsuan Chuang bool miracast_plus_bt = false;
335383cded7aSYan-Hsuan Chuang bool scan = false, link = false, roam = false;
3354f1d2b4d3SLarry Finger
3355c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3356f1d2b4d3SLarry Finger "[BTCoex], RunCoexistMechanism()===>\n");
3357f1d2b4d3SLarry Finger
3358f1d2b4d3SLarry Finger if (btcoexist->manual_control) {
3359c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3360466414a0SJoe Perches "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
3361f1d2b4d3SLarry Finger return;
3362f1d2b4d3SLarry Finger }
3363f1d2b4d3SLarry Finger
3364f1d2b4d3SLarry Finger if (coex_sta->under_ips) {
3365c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3366f1d2b4d3SLarry Finger "[BTCoex], wifi is under IPS !!!\n");
3367f1d2b4d3SLarry Finger return;
3368f1d2b4d3SLarry Finger }
3369f1d2b4d3SLarry Finger
3370f1d2b4d3SLarry Finger algorithm = btc8723b2ant_action_algorithm(btcoexist);
3371f1d2b4d3SLarry Finger if (coex_sta->c2h_bt_inquiry_page &&
3372f1d2b4d3SLarry Finger (BT_8723B_2ANT_COEX_ALGO_PANHS != algorithm)) {
3373c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3374f1d2b4d3SLarry Finger "[BTCoex], BT is under inquiry/page scan !!\n");
3375f1d2b4d3SLarry Finger btc8723b2ant_action_bt_inquiry(btcoexist);
3376f1d2b4d3SLarry Finger return;
3377f1d2b4d3SLarry Finger }
3378f1d2b4d3SLarry Finger
337983cded7aSYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
338083cded7aSYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
338183cded7aSYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
338283cded7aSYan-Hsuan Chuang
338383cded7aSYan-Hsuan Chuang if (scan || link || roam) {
3384c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
338583cded7aSYan-Hsuan Chuang "[BTCoex], WiFi is under Link Process !!\n");
338683cded7aSYan-Hsuan Chuang btc8723b2ant_action_wifi_link_process(btcoexist);
338783cded7aSYan-Hsuan Chuang return;
338883cded7aSYan-Hsuan Chuang }
338983cded7aSYan-Hsuan Chuang
3390a8570896SYan-Hsuan Chuang /* for P2P */
3391a8570896SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3392a8570896SYan-Hsuan Chuang &wifi_link_status);
3393a8570896SYan-Hsuan Chuang num_of_wifi_link = wifi_link_status >> 16;
3394a8570896SYan-Hsuan Chuang
3395a8570896SYan-Hsuan Chuang if ((num_of_wifi_link >= 2) ||
3396a8570896SYan-Hsuan Chuang (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {
3397c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3398a8570896SYan-Hsuan Chuang "############# [BTCoex], Multi-Port num_of_wifi_link = %d, wifi_link_status = 0x%x\n",
3399a8570896SYan-Hsuan Chuang num_of_wifi_link, wifi_link_status);
3400a8570896SYan-Hsuan Chuang
3401a8570896SYan-Hsuan Chuang if (bt_link_info->bt_link_exist)
3402a8570896SYan-Hsuan Chuang miracast_plus_bt = true;
3403a8570896SYan-Hsuan Chuang else
3404a8570896SYan-Hsuan Chuang miracast_plus_bt = false;
3405a8570896SYan-Hsuan Chuang
3406a8570896SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3407a8570896SYan-Hsuan Chuang &miracast_plus_bt);
3408a8570896SYan-Hsuan Chuang btc8723b2ant_action_wifi_multi_port(btcoexist);
3409a8570896SYan-Hsuan Chuang
3410a8570896SYan-Hsuan Chuang return;
3411a8570896SYan-Hsuan Chuang }
3412a8570896SYan-Hsuan Chuang
3413a8570896SYan-Hsuan Chuang miracast_plus_bt = false;
3414a8570896SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3415a8570896SYan-Hsuan Chuang &miracast_plus_bt);
3416a8570896SYan-Hsuan Chuang
3417f1d2b4d3SLarry Finger coex_dm->cur_algorithm = algorithm;
3418c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
34192277f5f1SLarry Finger "[BTCoex], Algorithm = %d\n",
3420f1d2b4d3SLarry Finger coex_dm->cur_algorithm);
3421f1d2b4d3SLarry Finger
3422f1d2b4d3SLarry Finger if (btc8723b2ant_is_common_action(btcoexist)) {
3423c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3424466414a0SJoe Perches "[BTCoex], Action 2-Ant common\n");
3425f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust = false;
3426f1d2b4d3SLarry Finger } else {
3427f1d2b4d3SLarry Finger if (coex_dm->cur_algorithm != coex_dm->pre_algorithm) {
3428c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3429466414a0SJoe Perches "[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n",
3430466414a0SJoe Perches coex_dm->pre_algorithm,
3431f1d2b4d3SLarry Finger coex_dm->cur_algorithm);
3432f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust = false;
3433f1d2b4d3SLarry Finger }
3434f1d2b4d3SLarry Finger switch (coex_dm->cur_algorithm) {
3435f1d2b4d3SLarry Finger case BT_8723B_2ANT_COEX_ALGO_SCO:
3436c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3437466414a0SJoe Perches "[BTCoex], Action 2-Ant, algorithm = SCO\n");
3438f1d2b4d3SLarry Finger btc8723b2ant_action_sco(btcoexist);
3439f1d2b4d3SLarry Finger break;
3440f1d2b4d3SLarry Finger case BT_8723B_2ANT_COEX_ALGO_HID:
3441c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3442466414a0SJoe Perches "[BTCoex], Action 2-Ant, algorithm = HID\n");
3443f1d2b4d3SLarry Finger btc8723b2ant_action_hid(btcoexist);
3444f1d2b4d3SLarry Finger break;
3445f1d2b4d3SLarry Finger case BT_8723B_2ANT_COEX_ALGO_A2DP:
3446c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3447466414a0SJoe Perches "[BTCoex], Action 2-Ant, algorithm = A2DP\n");
3448f1d2b4d3SLarry Finger btc8723b2ant_action_a2dp(btcoexist);
3449f1d2b4d3SLarry Finger break;
3450f1d2b4d3SLarry Finger case BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS:
3451c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3452466414a0SJoe Perches "[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS)\n");
3453f1d2b4d3SLarry Finger btc8723b2ant_action_a2dp_pan_hs(btcoexist);
3454f1d2b4d3SLarry Finger break;
3455f1d2b4d3SLarry Finger case BT_8723B_2ANT_COEX_ALGO_PANEDR:
3456c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3457466414a0SJoe Perches "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)\n");
3458f1d2b4d3SLarry Finger btc8723b2ant_action_pan_edr(btcoexist);
3459f1d2b4d3SLarry Finger break;
3460f1d2b4d3SLarry Finger case BT_8723B_2ANT_COEX_ALGO_PANHS:
3461c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3462466414a0SJoe Perches "[BTCoex], Action 2-Ant, algorithm = HS mode\n");
3463f1d2b4d3SLarry Finger btc8723b2ant_action_pan_hs(btcoexist);
3464f1d2b4d3SLarry Finger break;
3465f1d2b4d3SLarry Finger case BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP:
3466c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3467466414a0SJoe Perches "[BTCoex], Action 2-Ant, algorithm = PAN+A2DP\n");
3468f1d2b4d3SLarry Finger btc8723b2ant_action_pan_edr_a2dp(btcoexist);
3469f1d2b4d3SLarry Finger break;
3470f1d2b4d3SLarry Finger case BT_8723B_2ANT_COEX_ALGO_PANEDR_HID:
3471c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3472466414a0SJoe Perches "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID\n");
3473f1d2b4d3SLarry Finger btc8723b2ant_action_pan_edr_hid(btcoexist);
3474f1d2b4d3SLarry Finger break;
3475f1d2b4d3SLarry Finger case BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
3476c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3477466414a0SJoe Perches "[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN\n");
3478f1d2b4d3SLarry Finger btc8723b2ant_action_hid_a2dp_pan_edr(btcoexist);
3479f1d2b4d3SLarry Finger break;
3480f1d2b4d3SLarry Finger case BT_8723B_2ANT_COEX_ALGO_HID_A2DP:
3481c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3482466414a0SJoe Perches "[BTCoex], Action 2-Ant, algorithm = HID+A2DP\n");
3483f1d2b4d3SLarry Finger btc8723b2ant_action_hid_a2dp(btcoexist);
3484f1d2b4d3SLarry Finger break;
3485f1d2b4d3SLarry Finger default:
3486c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3487466414a0SJoe Perches "[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n");
3488f1d2b4d3SLarry Finger btc8723b2ant_coex_alloff(btcoexist);
3489f1d2b4d3SLarry Finger break;
3490f1d2b4d3SLarry Finger }
3491f1d2b4d3SLarry Finger coex_dm->pre_algorithm = coex_dm->cur_algorithm;
3492f1d2b4d3SLarry Finger }
3493f1d2b4d3SLarry Finger }
3494f1d2b4d3SLarry Finger
btc8723b2ant_wifioff_hwcfg(struct btc_coexist * btcoexist)3495f1d2b4d3SLarry Finger static void btc8723b2ant_wifioff_hwcfg(struct btc_coexist *btcoexist)
3496f1d2b4d3SLarry Finger {
34977558668dSYan-Hsuan Chuang bool is_in_mp_mode = false;
3498495d36e6SYan-Hsuan Chuang u8 h2c_parameter[2] = {0};
3499495d36e6SYan-Hsuan Chuang u32 fw_ver = 0;
3500495d36e6SYan-Hsuan Chuang
3501f1d2b4d3SLarry Finger /* set wlan_act to low */
3502f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
3503495d36e6SYan-Hsuan Chuang
3504495d36e6SYan-Hsuan Chuang /* WiFi standby while GNT_BT 0 -> 1 */
3505495d36e6SYan-Hsuan Chuang btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);
3506495d36e6SYan-Hsuan Chuang
3507495d36e6SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3508495d36e6SYan-Hsuan Chuang if (fw_ver >= 0x180000) {
3509495d36e6SYan-Hsuan Chuang /* Use H2C to set GNT_BT to HIGH */
3510495d36e6SYan-Hsuan Chuang h2c_parameter[0] = 1;
3511495d36e6SYan-Hsuan Chuang btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1, h2c_parameter);
3512495d36e6SYan-Hsuan Chuang } else {
3513495d36e6SYan-Hsuan Chuang btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
3514495d36e6SYan-Hsuan Chuang }
35157558668dSYan-Hsuan Chuang
35167558668dSYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE,
35177558668dSYan-Hsuan Chuang &is_in_mp_mode);
35187558668dSYan-Hsuan Chuang if (!is_in_mp_mode)
35197558668dSYan-Hsuan Chuang /* BT select s0/s1 is controlled by BT */
35207558668dSYan-Hsuan Chuang btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x0);
35217558668dSYan-Hsuan Chuang else
35227558668dSYan-Hsuan Chuang /* BT select s0/s1 is controlled by WiFi */
35237558668dSYan-Hsuan Chuang btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x1);
3524f1d2b4d3SLarry Finger }
3525f1d2b4d3SLarry Finger
3526f1d2b4d3SLarry Finger /*********************************************************************
3527c6821613SYan-Hsuan Chuang * extern function start with ex_btc8723b2ant_
3528f1d2b4d3SLarry Finger *********************************************************************/
ex_btc8723b2ant_init_hwconfig(struct btc_coexist * btcoexist)3529f1d2b4d3SLarry Finger void ex_btc8723b2ant_init_hwconfig(struct btc_coexist *btcoexist)
3530f1d2b4d3SLarry Finger {
35312277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
3532f1d2b4d3SLarry Finger u8 u8tmp = 0;
3533f1d2b4d3SLarry Finger
3534c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3535f1d2b4d3SLarry Finger "[BTCoex], 2Ant Init HW Config!!\n");
3536f1d2b4d3SLarry Finger coex_dm->bt_rf0x1e_backup =
3537f1d2b4d3SLarry Finger btcoexist->btc_get_rf_reg(btcoexist, BTC_RF_A, 0x1e, 0xfffff);
3538f1d2b4d3SLarry Finger
3539f1d2b4d3SLarry Finger /* 0x790[5:0] = 0x5 */
3540f1d2b4d3SLarry Finger u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
3541f1d2b4d3SLarry Finger u8tmp &= 0xc0;
3542f1d2b4d3SLarry Finger u8tmp |= 0x5;
3543f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x790, u8tmp);
3544f1d2b4d3SLarry Finger
3545f1d2b4d3SLarry Finger /* Antenna config */
3546f1d2b4d3SLarry Finger btc8723b2ant_set_ant_path(btcoexist, BTC_ANT_WIFI_AT_MAIN,
3547f1d2b4d3SLarry Finger true, false);
3548b59f02fbSYan-Hsuan Chuang coex_sta->dis_ver_info_cnt = 0;
3549b59f02fbSYan-Hsuan Chuang
3550f1d2b4d3SLarry Finger /* PTA parameter */
3551c6821613SYan-Hsuan Chuang btc8723b2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
3552f1d2b4d3SLarry Finger
3553f1d2b4d3SLarry Finger /* Enable counter statistics */
3554c6821613SYan-Hsuan Chuang /* 0x76e[3] = 1, WLAN_ACT controlled by PTA */
3555b59f02fbSYan-Hsuan Chuang btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
3556f1d2b4d3SLarry Finger btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
3557f1d2b4d3SLarry Finger btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
3558d6a82054SLarry Finger btcoexist->auto_report_2ant = true;
3559f1d2b4d3SLarry Finger }
3560f1d2b4d3SLarry Finger
ex_btc8723b2ant_power_on_setting(struct btc_coexist * btcoexist)35614e6becc0SYan-Hsuan Chuang void ex_btc8723b2ant_power_on_setting(struct btc_coexist *btcoexist)
35624e6becc0SYan-Hsuan Chuang {
35634e6becc0SYan-Hsuan Chuang struct btc_board_info *board_info = &btcoexist->board_info;
35644e6becc0SYan-Hsuan Chuang u16 u16tmp = 0x0;
35654e6becc0SYan-Hsuan Chuang u32 value = 0;
35664e6becc0SYan-Hsuan Chuang
35674e6becc0SYan-Hsuan Chuang btcoexist->btc_write_1byte(btcoexist, 0x67, 0x20);
35684e6becc0SYan-Hsuan Chuang
35694e6becc0SYan-Hsuan Chuang /* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly */
35704e6becc0SYan-Hsuan Chuang u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2);
35714e6becc0SYan-Hsuan Chuang btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT0 | BIT1);
35724e6becc0SYan-Hsuan Chuang
35734e6becc0SYan-Hsuan Chuang btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
35744e6becc0SYan-Hsuan Chuang
35754e6becc0SYan-Hsuan Chuang if (btcoexist->chip_interface == BTC_INTF_USB) {
35764e6becc0SYan-Hsuan Chuang /* fixed at S0 for USB interface */
35774e6becc0SYan-Hsuan Chuang board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
35784e6becc0SYan-Hsuan Chuang } else {
35794e6becc0SYan-Hsuan Chuang /* for PCIE and SDIO interface, we check efuse 0xc3[6] */
35804e6becc0SYan-Hsuan Chuang if (board_info->single_ant_path == 0) {
35814e6becc0SYan-Hsuan Chuang /* set to S1 */
35824e6becc0SYan-Hsuan Chuang board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
35834e6becc0SYan-Hsuan Chuang } else if (board_info->single_ant_path == 1) {
35844e6becc0SYan-Hsuan Chuang /* set to S0 */
35854e6becc0SYan-Hsuan Chuang board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
35864e6becc0SYan-Hsuan Chuang }
35874e6becc0SYan-Hsuan Chuang btcoexist->btc_set(btcoexist, BTC_SET_ACT_ANTPOSREGRISTRY_CTRL,
35884e6becc0SYan-Hsuan Chuang &value);
35894e6becc0SYan-Hsuan Chuang }
35904e6becc0SYan-Hsuan Chuang }
35914e6becc0SYan-Hsuan Chuang
ex_btc8723b2ant_pre_load_firmware(struct btc_coexist * btcoexist)35926dcf041eSYan-Hsuan Chuang void ex_btc8723b2ant_pre_load_firmware(struct btc_coexist *btcoexist)
35936dcf041eSYan-Hsuan Chuang {
35946dcf041eSYan-Hsuan Chuang struct btc_board_info *board_info = &btcoexist->board_info;
35956dcf041eSYan-Hsuan Chuang u8 u8tmp = 0x4; /* Set BIT2 by default since it's 2ant case */
35966dcf041eSYan-Hsuan Chuang
35976dcf041eSYan-Hsuan Chuang /**
35986dcf041eSYan-Hsuan Chuang * S0 or S1 setting and Local register setting(By this fw can get
35996dcf041eSYan-Hsuan Chuang * ant number, S0/S1, ... info)
36006dcf041eSYan-Hsuan Chuang *
36016dcf041eSYan-Hsuan Chuang * Local setting bit define
36026dcf041eSYan-Hsuan Chuang * BIT0: "0" : no antenna inverse; "1" : antenna inverse
36036dcf041eSYan-Hsuan Chuang * BIT1: "0" : internal switch; "1" : external switch
36046dcf041eSYan-Hsuan Chuang * BIT2: "0" : one antenna; "1" : two antennas
36056dcf041eSYan-Hsuan Chuang *
36066dcf041eSYan-Hsuan Chuang * NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and
36076dcf041eSYan-Hsuan Chuang * BIT2 = 0
36086dcf041eSYan-Hsuan Chuang */
36096dcf041eSYan-Hsuan Chuang if (btcoexist->chip_interface == BTC_INTF_USB) {
36106dcf041eSYan-Hsuan Chuang /* fixed at S0 for USB interface */
36116dcf041eSYan-Hsuan Chuang u8tmp |= 0x1; /* antenna inverse */
36126dcf041eSYan-Hsuan Chuang btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
36136dcf041eSYan-Hsuan Chuang } else {
36146dcf041eSYan-Hsuan Chuang /* for PCIE and SDIO interface, we check efuse 0xc3[6] */
36156dcf041eSYan-Hsuan Chuang if (board_info->single_ant_path == 0) {
36166dcf041eSYan-Hsuan Chuang } else if (board_info->single_ant_path == 1) {
36176dcf041eSYan-Hsuan Chuang /* set to S0 */
36186dcf041eSYan-Hsuan Chuang u8tmp |= 0x1; /* antenna inverse */
36196dcf041eSYan-Hsuan Chuang }
36206dcf041eSYan-Hsuan Chuang
36216dcf041eSYan-Hsuan Chuang if (btcoexist->chip_interface == BTC_INTF_PCI)
36226dcf041eSYan-Hsuan Chuang btcoexist->btc_write_local_reg_1byte(btcoexist, 0x384,
36236dcf041eSYan-Hsuan Chuang u8tmp);
36246dcf041eSYan-Hsuan Chuang else if (btcoexist->chip_interface == BTC_INTF_SDIO)
36256dcf041eSYan-Hsuan Chuang btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60,
36266dcf041eSYan-Hsuan Chuang u8tmp);
36276dcf041eSYan-Hsuan Chuang }
36286dcf041eSYan-Hsuan Chuang }
36296dcf041eSYan-Hsuan Chuang
ex_btc8723b2ant_init_coex_dm(struct btc_coexist * btcoexist)3630f1d2b4d3SLarry Finger void ex_btc8723b2ant_init_coex_dm(struct btc_coexist *btcoexist)
3631f1d2b4d3SLarry Finger {
36322277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
36332277f5f1SLarry Finger
3634c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3635f1d2b4d3SLarry Finger "[BTCoex], Coex Mechanism Init!!\n");
3636f1d2b4d3SLarry Finger btc8723b2ant_init_coex_dm(btcoexist);
3637f1d2b4d3SLarry Finger }
3638f1d2b4d3SLarry Finger
ex_btc8723b2ant_display_coex_info(struct btc_coexist * btcoexist,struct seq_file * m)363908431b62SPing-Ke Shih void ex_btc8723b2ant_display_coex_info(struct btc_coexist *btcoexist,
364008431b62SPing-Ke Shih struct seq_file *m)
3641f1d2b4d3SLarry Finger {
3642f1d2b4d3SLarry Finger struct btc_board_info *board_info = &btcoexist->board_info;
3643f1d2b4d3SLarry Finger struct btc_stack_info *stack_info = &btcoexist->stack_info;
3644f1d2b4d3SLarry Finger struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3645f1d2b4d3SLarry Finger u8 u8tmp[4], i, bt_info_ext, ps_tdma_case = 0;
3646f1d2b4d3SLarry Finger u32 u32tmp[4];
3647f1d2b4d3SLarry Finger bool roam = false, scan = false;
3648f1d2b4d3SLarry Finger bool link = false, wifi_under_5g = false;
3649f1d2b4d3SLarry Finger bool bt_hs_on = false, wifi_busy = false;
3650f1d2b4d3SLarry Finger s32 wifi_rssi = 0, bt_hs_rssi = 0;
3651f1d2b4d3SLarry Finger u32 wifi_bw, wifi_traffic_dir, fa_ofdm, fa_cck;
3652f1d2b4d3SLarry Finger u8 wifi_dot11_chnl, wifi_hs_chnl;
3653f1d2b4d3SLarry Finger u32 fw_ver = 0, bt_patch_ver = 0;
3654f1d2b4d3SLarry Finger u8 ap_num = 0;
3655f1d2b4d3SLarry Finger
365608431b62SPing-Ke Shih seq_puts(m, "\n ============[BT Coexist info]============");
3657f1d2b4d3SLarry Finger
3658f1d2b4d3SLarry Finger if (btcoexist->manual_control) {
365908431b62SPing-Ke Shih seq_puts(m, "\n ==========[Under Manual Control]============");
366008431b62SPing-Ke Shih seq_puts(m, "\n ==========================================");
3661f1d2b4d3SLarry Finger }
3662f1d2b4d3SLarry Finger
366308431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d ",
3664f1d2b4d3SLarry Finger "Ant PG number/ Ant mechanism:",
3665f1d2b4d3SLarry Finger board_info->pg_ant_num, board_info->btdm_ant_num);
3666f1d2b4d3SLarry Finger
366708431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %s / %d",
3668f1d2b4d3SLarry Finger "BT stack/ hci ext ver",
3669f1d2b4d3SLarry Finger ((stack_info->profile_notified) ? "Yes" : "No"),
3670f1d2b4d3SLarry Finger stack_info->hci_version);
3671f1d2b4d3SLarry Finger
3672f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
3673f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
367408431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
3675f1d2b4d3SLarry Finger "CoexVer/ FwVer/ PatchVer",
3676f1d2b4d3SLarry Finger glcoex_ver_date_8723b_2ant, glcoex_ver_8723b_2ant,
3677f1d2b4d3SLarry Finger fw_ver, bt_patch_ver, bt_patch_ver);
3678f1d2b4d3SLarry Finger
3679f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3680f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
3681f1d2b4d3SLarry Finger &wifi_dot11_chnl);
3682f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);
3683f1d2b4d3SLarry Finger
368408431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d / %d(%d)",
3685f1d2b4d3SLarry Finger "Dot11 channel / HsChnl(HsMode)",
3686f1d2b4d3SLarry Finger wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);
3687f1d2b4d3SLarry Finger
368808431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %3ph ",
368968ec5810SAndy Shevchenko "H2C Wifi inform bt chnl Info", coex_dm->wifi_chnl_info);
3690f1d2b4d3SLarry Finger
3691f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
3692f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
3693f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
369408431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d/ %d",
3695f1d2b4d3SLarry Finger "Wifi rssi/ HS rssi/ AP#", wifi_rssi, bt_hs_rssi, ap_num);
3696f1d2b4d3SLarry Finger
3697f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3698f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3699f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
370008431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d/ %d ",
3701f1d2b4d3SLarry Finger "Wifi link/ roam/ scan", link, roam, scan);
3702f1d2b4d3SLarry Finger
3703f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3704f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3705f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3706f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
3707f1d2b4d3SLarry Finger &wifi_traffic_dir);
370808431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %s / %s/ %s ",
3709f1d2b4d3SLarry Finger "Wifi status", (wifi_under_5g ? "5G" : "2.4G"),
37102277f5f1SLarry Finger ((wifi_bw == BTC_WIFI_BW_LEGACY) ? "Legacy" :
37112277f5f1SLarry Finger (((wifi_bw == BTC_WIFI_BW_HT40) ? "HT40" : "HT20"))),
3712f1d2b4d3SLarry Finger ((!wifi_busy) ? "idle" :
37132277f5f1SLarry Finger ((wifi_traffic_dir == BTC_WIFI_TRAFFIC_TX) ?
3714f1d2b4d3SLarry Finger "uplink" : "downlink")));
3715f1d2b4d3SLarry Finger
371608431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d / %d / %d / %d",
3717f1d2b4d3SLarry Finger "SCO/HID/PAN/A2DP",
3718f1d2b4d3SLarry Finger bt_link_info->sco_exist, bt_link_info->hid_exist,
3719f1d2b4d3SLarry Finger bt_link_info->pan_exist, bt_link_info->a2dp_exist);
372008431b62SPing-Ke Shih btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO, m);
3721f1d2b4d3SLarry Finger
3722f1d2b4d3SLarry Finger bt_info_ext = coex_sta->bt_info_ext;
372308431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %s",
3724f1d2b4d3SLarry Finger "BT Info A2DP rate",
3725f1d2b4d3SLarry Finger (bt_info_ext & BIT0) ? "Basic rate" : "EDR rate");
3726f1d2b4d3SLarry Finger
3727f1d2b4d3SLarry Finger for (i = 0; i < BT_INFO_SRC_8723B_2ANT_MAX; i++) {
3728f1d2b4d3SLarry Finger if (coex_sta->bt_info_c2h_cnt[i]) {
372908431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %7ph(%d)",
3730f1d2b4d3SLarry Finger glbt_info_src_8723b_2ant[i],
373168ec5810SAndy Shevchenko coex_sta->bt_info_c2h[i],
3732f1d2b4d3SLarry Finger coex_sta->bt_info_c2h_cnt[i]);
3733f1d2b4d3SLarry Finger }
3734f1d2b4d3SLarry Finger }
3735f1d2b4d3SLarry Finger
373608431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %s/%s",
3737f1d2b4d3SLarry Finger "PS state, IPS/LPS",
3738f1d2b4d3SLarry Finger ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
3739f1d2b4d3SLarry Finger ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")));
374008431b62SPing-Ke Shih btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);
3741f1d2b4d3SLarry Finger
3742f1d2b4d3SLarry Finger /* Sw mechanism */
374308431b62SPing-Ke Shih seq_printf(m,
374408431b62SPing-Ke Shih "\n %-35s", "============[Sw mechanism]============");
374508431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d/ %d ",
3746f1d2b4d3SLarry Finger "SM1[ShRf/ LpRA/ LimDig]", coex_dm->cur_rf_rx_lpf_shrink,
3747f1d2b4d3SLarry Finger coex_dm->cur_low_penalty_ra, coex_dm->limited_dig);
374808431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d/ %d(0x%x) ",
3749f1d2b4d3SLarry Finger "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]",
3750f1d2b4d3SLarry Finger coex_dm->cur_agc_table_en, coex_dm->cur_adc_back_off,
3751f1d2b4d3SLarry Finger coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl);
3752f1d2b4d3SLarry Finger
3753f1d2b4d3SLarry Finger /* Fw mechanism */
375408431b62SPing-Ke Shih seq_printf(m, "\n %-35s",
3755f1d2b4d3SLarry Finger "============[Fw mechanism]============");
3756f1d2b4d3SLarry Finger
3757f1d2b4d3SLarry Finger ps_tdma_case = coex_dm->cur_ps_tdma;
375808431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %5ph case-%d (auto:%d)",
375968ec5810SAndy Shevchenko "PS TDMA", coex_dm->ps_tdma_para,
3760f1d2b4d3SLarry Finger ps_tdma_case, coex_dm->auto_tdma_adjust);
3761f1d2b4d3SLarry Finger
376208431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d ",
376344e9a534SYan-Hsuan Chuang "DecBtPwr/ IgnWlanAct", coex_dm->cur_dec_bt_pwr_lvl,
3764f1d2b4d3SLarry Finger coex_dm->cur_ignore_wlan_act);
3765f1d2b4d3SLarry Finger
3766f1d2b4d3SLarry Finger /* Hw setting */
376708431b62SPing-Ke Shih seq_printf(m, "\n %-35s",
3768f1d2b4d3SLarry Finger "============[Hw setting]============");
3769f1d2b4d3SLarry Finger
377008431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x",
3771f1d2b4d3SLarry Finger "RF-A, 0x1e initVal", coex_dm->bt_rf0x1e_backup);
3772f1d2b4d3SLarry Finger
3773f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
3774f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x880);
377508431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3776f1d2b4d3SLarry Finger "0x778/0x880[29:25]", u8tmp[0],
3777f1d2b4d3SLarry Finger (u32tmp[0] & 0x3e000000) >> 25);
3778f1d2b4d3SLarry Finger
3779f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x948);
3780f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x67);
3781f1d2b4d3SLarry Finger u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x765);
378208431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
3783f1d2b4d3SLarry Finger "0x948/ 0x67[5] / 0x765",
3784f1d2b4d3SLarry Finger u32tmp[0], ((u8tmp[0] & 0x20) >> 5), u8tmp[1]);
3785f1d2b4d3SLarry Finger
3786f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x92c);
3787f1d2b4d3SLarry Finger u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x930);
3788f1d2b4d3SLarry Finger u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x944);
378908431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
3790f1d2b4d3SLarry Finger "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]",
3791f1d2b4d3SLarry Finger u32tmp[0] & 0x3, u32tmp[1] & 0xff, u32tmp[2] & 0x3);
3792f1d2b4d3SLarry Finger
3793f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x39);
3794f1d2b4d3SLarry Finger u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
3795f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
3796f1d2b4d3SLarry Finger u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64);
379708431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
3798f1d2b4d3SLarry Finger "0x38[11]/0x40/0x4c[24:23]/0x64[0]",
3799f1d2b4d3SLarry Finger ((u8tmp[0] & 0x8) >> 3), u8tmp[1],
3800f1d2b4d3SLarry Finger ((u32tmp[0] & 0x01800000) >> 23), u8tmp[2] & 0x1);
3801f1d2b4d3SLarry Finger
3802f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
3803f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
380408431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3805f1d2b4d3SLarry Finger "0x550(bcn ctrl)/0x522", u32tmp[0], u8tmp[0]);
3806f1d2b4d3SLarry Finger
3807f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
3808f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x49c);
380908431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3810f1d2b4d3SLarry Finger "0xc50(dig)/0x49c(null-drop)", u32tmp[0] & 0xff, u8tmp[0]);
3811f1d2b4d3SLarry Finger
3812f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xda0);
3813f1d2b4d3SLarry Finger u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xda4);
3814f1d2b4d3SLarry Finger u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0xda8);
3815f1d2b4d3SLarry Finger u32tmp[3] = btcoexist->btc_read_4byte(btcoexist, 0xcf0);
3816f1d2b4d3SLarry Finger
3817f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);
3818f1d2b4d3SLarry Finger u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
3819f1d2b4d3SLarry Finger
3820f1d2b4d3SLarry Finger fa_ofdm = ((u32tmp[0]&0xffff0000) >> 16) +
3821f1d2b4d3SLarry Finger ((u32tmp[1]&0xffff0000) >> 16) +
3822f1d2b4d3SLarry Finger (u32tmp[1] & 0xffff) +
3823f1d2b4d3SLarry Finger (u32tmp[2] & 0xffff) +
3824f1d2b4d3SLarry Finger ((u32tmp[3]&0xffff0000) >> 16) +
3825f1d2b4d3SLarry Finger (u32tmp[3] & 0xffff);
3826f1d2b4d3SLarry Finger fa_cck = (u8tmp[0] << 8) + u8tmp[1];
3827f1d2b4d3SLarry Finger
382808431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
3829f1d2b4d3SLarry Finger "OFDM-CCA/OFDM-FA/CCK-FA",
3830f1d2b4d3SLarry Finger u32tmp[0] & 0xffff, fa_ofdm, fa_cck);
3831f1d2b4d3SLarry Finger
3832f1d2b4d3SLarry Finger u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
3833f1d2b4d3SLarry Finger u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
3834f1d2b4d3SLarry Finger u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
3835f1d2b4d3SLarry Finger u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
383608431b62SPing-Ke Shih seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
3837f1d2b4d3SLarry Finger "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)",
3838f1d2b4d3SLarry Finger u32tmp[0], u32tmp[1], u32tmp[2], u8tmp[0]);
3839f1d2b4d3SLarry Finger
384008431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d",
3841f1d2b4d3SLarry Finger "0x770(high-pri rx/tx)",
3842f1d2b4d3SLarry Finger coex_sta->high_priority_rx, coex_sta->high_priority_tx);
384308431b62SPing-Ke Shih seq_printf(m, "\n %-35s = %d/ %d",
3844f1d2b4d3SLarry Finger "0x774(low-pri rx/tx)", coex_sta->low_priority_rx,
3845f1d2b4d3SLarry Finger coex_sta->low_priority_tx);
3846d6a82054SLarry Finger if (btcoexist->auto_report_2ant)
3847f1d2b4d3SLarry Finger btc8723b2ant_monitor_bt_ctr(btcoexist);
384808431b62SPing-Ke Shih btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);
3849f1d2b4d3SLarry Finger }
3850f1d2b4d3SLarry Finger
ex_btc8723b2ant_ips_notify(struct btc_coexist * btcoexist,u8 type)3851f1d2b4d3SLarry Finger void ex_btc8723b2ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
3852f1d2b4d3SLarry Finger {
38532277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
38542277f5f1SLarry Finger
3855f1d2b4d3SLarry Finger if (BTC_IPS_ENTER == type) {
3856c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3857f1d2b4d3SLarry Finger "[BTCoex], IPS ENTER notify\n");
3858f1d2b4d3SLarry Finger coex_sta->under_ips = true;
3859f1d2b4d3SLarry Finger btc8723b2ant_wifioff_hwcfg(btcoexist);
3860f1d2b4d3SLarry Finger btc8723b2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
3861f1d2b4d3SLarry Finger btc8723b2ant_coex_alloff(btcoexist);
3862f1d2b4d3SLarry Finger } else if (BTC_IPS_LEAVE == type) {
3863c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3864f1d2b4d3SLarry Finger "[BTCoex], IPS LEAVE notify\n");
3865f1d2b4d3SLarry Finger coex_sta->under_ips = false;
3866f1d2b4d3SLarry Finger ex_btc8723b2ant_init_hwconfig(btcoexist);
3867f1d2b4d3SLarry Finger btc8723b2ant_init_coex_dm(btcoexist);
3868f1d2b4d3SLarry Finger btc8723b2ant_query_bt_info(btcoexist);
3869f1d2b4d3SLarry Finger }
3870f1d2b4d3SLarry Finger }
3871f1d2b4d3SLarry Finger
ex_btc8723b2ant_lps_notify(struct btc_coexist * btcoexist,u8 type)3872f1d2b4d3SLarry Finger void ex_btc8723b2ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
3873f1d2b4d3SLarry Finger {
38742277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
38752277f5f1SLarry Finger
3876f1d2b4d3SLarry Finger if (BTC_LPS_ENABLE == type) {
3877c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3878f1d2b4d3SLarry Finger "[BTCoex], LPS ENABLE notify\n");
3879f1d2b4d3SLarry Finger coex_sta->under_lps = true;
3880f1d2b4d3SLarry Finger } else if (BTC_LPS_DISABLE == type) {
3881c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3882f1d2b4d3SLarry Finger "[BTCoex], LPS DISABLE notify\n");
3883f1d2b4d3SLarry Finger coex_sta->under_lps = false;
3884f1d2b4d3SLarry Finger }
3885f1d2b4d3SLarry Finger }
3886f1d2b4d3SLarry Finger
ex_btc8723b2ant_scan_notify(struct btc_coexist * btcoexist,u8 type)3887f1d2b4d3SLarry Finger void ex_btc8723b2ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
3888f1d2b4d3SLarry Finger {
38892277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
3890ae889ebcSYan-Hsuan Chuang u32 u32tmp;
3891ae889ebcSYan-Hsuan Chuang u8 u8tmpa, u8tmpb;
3892ae889ebcSYan-Hsuan Chuang
3893ae889ebcSYan-Hsuan Chuang u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
3894ae889ebcSYan-Hsuan Chuang u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
3895ae889ebcSYan-Hsuan Chuang u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x76e);
38962277f5f1SLarry Finger
3897f1d2b4d3SLarry Finger if (BTC_SCAN_START == type)
3898c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3899f1d2b4d3SLarry Finger "[BTCoex], SCAN START notify\n");
3900f1d2b4d3SLarry Finger else if (BTC_SCAN_FINISH == type)
3901c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3902f1d2b4d3SLarry Finger "[BTCoex], SCAN FINISH notify\n");
39033f957062SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
39043f957062SYan-Hsuan Chuang &coex_sta->scan_ap_num);
3905ae889ebcSYan-Hsuan Chuang
3906c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3907ae889ebcSYan-Hsuan Chuang "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x76e=0x%x\n",
3908ae889ebcSYan-Hsuan Chuang u32tmp, u8tmpa, u8tmpb);
3909f1d2b4d3SLarry Finger }
3910f1d2b4d3SLarry Finger
ex_btc8723b2ant_connect_notify(struct btc_coexist * btcoexist,u8 type)3911f1d2b4d3SLarry Finger void ex_btc8723b2ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
3912f1d2b4d3SLarry Finger {
39132277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
39142277f5f1SLarry Finger
3915f1d2b4d3SLarry Finger if (BTC_ASSOCIATE_START == type)
3916c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3917f1d2b4d3SLarry Finger "[BTCoex], CONNECT START notify\n");
3918f1d2b4d3SLarry Finger else if (BTC_ASSOCIATE_FINISH == type)
3919c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3920f1d2b4d3SLarry Finger "[BTCoex], CONNECT FINISH notify\n");
3921f1d2b4d3SLarry Finger }
3922f1d2b4d3SLarry Finger
ex_btc8723b2ant_media_status_notify(struct btc_coexist * btcoexist,u8 type)3923f1d2b4d3SLarry Finger void ex_btc8723b2ant_media_status_notify(struct btc_coexist *btcoexist,
3924f1d2b4d3SLarry Finger u8 type)
3925f1d2b4d3SLarry Finger {
39262277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
3927f1d2b4d3SLarry Finger u8 h2c_parameter[3] = {0};
3928f1d2b4d3SLarry Finger u32 wifi_bw;
3929f1d2b4d3SLarry Finger u8 wifi_central_chnl;
39305a347a48SYan-Hsuan Chuang u8 ap_num = 0;
3931f1d2b4d3SLarry Finger
3932f1d2b4d3SLarry Finger if (BTC_MEDIA_CONNECT == type)
3933c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3934f1d2b4d3SLarry Finger "[BTCoex], MEDIA connect notify\n");
3935f1d2b4d3SLarry Finger else
3936c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3937f1d2b4d3SLarry Finger "[BTCoex], MEDIA disconnect notify\n");
3938f1d2b4d3SLarry Finger
3939f1d2b4d3SLarry Finger /* only 2.4G we need to inform bt the chnl mask */
3940f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist,
3941f1d2b4d3SLarry Finger BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifi_central_chnl);
3942f1d2b4d3SLarry Finger if ((BTC_MEDIA_CONNECT == type) &&
3943f1d2b4d3SLarry Finger (wifi_central_chnl <= 14)) {
3944f1d2b4d3SLarry Finger h2c_parameter[0] = 0x1;
3945f1d2b4d3SLarry Finger h2c_parameter[1] = wifi_central_chnl;
3946f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist,
3947f1d2b4d3SLarry Finger BTC_GET_U4_WIFI_BW, &wifi_bw);
39485a347a48SYan-Hsuan Chuang if (wifi_bw == BTC_WIFI_BW_HT40) {
39495a347a48SYan-Hsuan Chuang h2c_parameter[2] = 0x30;
39505a347a48SYan-Hsuan Chuang } else {
39515a347a48SYan-Hsuan Chuang btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
39525a347a48SYan-Hsuan Chuang &ap_num);
39535a347a48SYan-Hsuan Chuang if (ap_num < 10)
3954f1d2b4d3SLarry Finger h2c_parameter[2] = 0x30;
3955f1d2b4d3SLarry Finger else
3956f1d2b4d3SLarry Finger h2c_parameter[2] = 0x20;
3957f1d2b4d3SLarry Finger }
39585a347a48SYan-Hsuan Chuang }
3959f1d2b4d3SLarry Finger
3960f1d2b4d3SLarry Finger coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
3961f1d2b4d3SLarry Finger coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
3962f1d2b4d3SLarry Finger coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
3963f1d2b4d3SLarry Finger
3964c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3965f1d2b4d3SLarry Finger "[BTCoex], FW write 0x66=0x%x\n",
3966f1d2b4d3SLarry Finger h2c_parameter[0] << 16 | h2c_parameter[1] << 8 |
3967f1d2b4d3SLarry Finger h2c_parameter[2]);
3968f1d2b4d3SLarry Finger
3969f1d2b4d3SLarry Finger btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
3970f1d2b4d3SLarry Finger }
3971f1d2b4d3SLarry Finger
ex_btc8723b2ant_special_packet_notify(struct btc_coexist * btcoexist,u8 type)3972f1d2b4d3SLarry Finger void ex_btc8723b2ant_special_packet_notify(struct btc_coexist *btcoexist,
3973f1d2b4d3SLarry Finger u8 type)
3974f1d2b4d3SLarry Finger {
39752277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
39762277f5f1SLarry Finger
3977f1d2b4d3SLarry Finger if (type == BTC_PACKET_DHCP)
3978c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3979f1d2b4d3SLarry Finger "[BTCoex], DHCP Packet notify\n");
3980f1d2b4d3SLarry Finger }
3981f1d2b4d3SLarry Finger
ex_btc8723b2ant_bt_info_notify(struct btc_coexist * btcoexist,u8 * tmpbuf,u8 length)3982f1d2b4d3SLarry Finger void ex_btc8723b2ant_bt_info_notify(struct btc_coexist *btcoexist,
3983f1d2b4d3SLarry Finger u8 *tmpbuf, u8 length)
3984f1d2b4d3SLarry Finger {
39852277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
3986f1d2b4d3SLarry Finger u8 bt_info = 0;
3987f1d2b4d3SLarry Finger u8 i, rsp_source = 0;
3988f1d2b4d3SLarry Finger bool bt_busy = false, limited_dig = false;
3989f1d2b4d3SLarry Finger bool wifi_connected = false;
3990f1d2b4d3SLarry Finger
3991f1d2b4d3SLarry Finger coex_sta->c2h_bt_info_req_sent = false;
3992f1d2b4d3SLarry Finger
3993f1d2b4d3SLarry Finger rsp_source = tmpbuf[0]&0xf;
3994f1d2b4d3SLarry Finger if (rsp_source >= BT_INFO_SRC_8723B_2ANT_MAX)
3995f1d2b4d3SLarry Finger rsp_source = BT_INFO_SRC_8723B_2ANT_WIFI_FW;
3996f1d2b4d3SLarry Finger coex_sta->bt_info_c2h_cnt[rsp_source]++;
3997f1d2b4d3SLarry Finger
3998c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3999f1d2b4d3SLarry Finger "[BTCoex], Bt info[%d], length=%d, hex data=[",
4000f1d2b4d3SLarry Finger rsp_source, length);
4001f1d2b4d3SLarry Finger for (i = 0; i < length; i++) {
4002f1d2b4d3SLarry Finger coex_sta->bt_info_c2h[rsp_source][i] = tmpbuf[i];
4003f1d2b4d3SLarry Finger if (i == 1)
4004f1d2b4d3SLarry Finger bt_info = tmpbuf[i];
4005f1d2b4d3SLarry Finger if (i == length - 1)
4006c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4007f1d2b4d3SLarry Finger "0x%02x]\n", tmpbuf[i]);
4008f1d2b4d3SLarry Finger else
4009c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4010f1d2b4d3SLarry Finger "0x%02x, ", tmpbuf[i]);
4011f1d2b4d3SLarry Finger }
4012f1d2b4d3SLarry Finger
4013f1d2b4d3SLarry Finger if (btcoexist->manual_control) {
4014c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4015466414a0SJoe Perches "[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n");
4016f1d2b4d3SLarry Finger return;
4017f1d2b4d3SLarry Finger }
4018f1d2b4d3SLarry Finger
4019f1d2b4d3SLarry Finger if (BT_INFO_SRC_8723B_2ANT_WIFI_FW != rsp_source) {
4020c6821613SYan-Hsuan Chuang coex_sta->bt_retry_cnt =
4021f1d2b4d3SLarry Finger coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
4022f1d2b4d3SLarry Finger
4023588a290bSYan-Hsuan Chuang if (coex_sta->bt_retry_cnt >= 1)
4024588a290bSYan-Hsuan Chuang coex_sta->pop_event_cnt++;
4025588a290bSYan-Hsuan Chuang
4026f1d2b4d3SLarry Finger coex_sta->bt_rssi =
4027f1d2b4d3SLarry Finger coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;
4028f1d2b4d3SLarry Finger
4029588a290bSYan-Hsuan Chuang coex_sta->bt_info_ext = coex_sta->bt_info_c2h[rsp_source][4];
4030588a290bSYan-Hsuan Chuang
4031588a290bSYan-Hsuan Chuang if (coex_sta->bt_info_c2h[rsp_source][2] & 0x20)
4032588a290bSYan-Hsuan Chuang coex_sta->c2h_bt_remote_name_req = true;
4033588a290bSYan-Hsuan Chuang else
4034588a290bSYan-Hsuan Chuang coex_sta->c2h_bt_remote_name_req = false;
4035588a290bSYan-Hsuan Chuang
40363f957062SYan-Hsuan Chuang if (coex_sta->bt_info_c2h[rsp_source][1] == 0x49)
40373f957062SYan-Hsuan Chuang coex_sta->a2dp_bit_pool =
40383f957062SYan-Hsuan Chuang coex_sta->bt_info_c2h[rsp_source][6];
40393f957062SYan-Hsuan Chuang else
40403f957062SYan-Hsuan Chuang coex_sta->a2dp_bit_pool = 0;
4041f1d2b4d3SLarry Finger
4042f1d2b4d3SLarry Finger /* Here we need to resend some wifi info to BT
4043c6821613SYan-Hsuan Chuang * because BT is reset and loss of the info.
4044f1d2b4d3SLarry Finger */
4045f1d2b4d3SLarry Finger if ((coex_sta->bt_info_ext & BIT1)) {
4046c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4047466414a0SJoe Perches "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
4048f1d2b4d3SLarry Finger btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
4049f1d2b4d3SLarry Finger &wifi_connected);
4050f1d2b4d3SLarry Finger if (wifi_connected)
4051f1d2b4d3SLarry Finger ex_btc8723b2ant_media_status_notify(
4052f1d2b4d3SLarry Finger btcoexist,
4053f1d2b4d3SLarry Finger BTC_MEDIA_CONNECT);
4054f1d2b4d3SLarry Finger else
4055f1d2b4d3SLarry Finger ex_btc8723b2ant_media_status_notify(
4056f1d2b4d3SLarry Finger btcoexist,
4057f1d2b4d3SLarry Finger BTC_MEDIA_DISCONNECT);
4058f1d2b4d3SLarry Finger }
4059f1d2b4d3SLarry Finger
4060f1d2b4d3SLarry Finger if ((coex_sta->bt_info_ext & BIT3)) {
4061c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4062466414a0SJoe Perches "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
4063f1d2b4d3SLarry Finger btc8723b2ant_ignore_wlan_act(btcoexist, FORCE_EXEC,
4064f1d2b4d3SLarry Finger false);
4065f1d2b4d3SLarry Finger } else {
4066f1d2b4d3SLarry Finger /* BT already NOT ignore Wlan active, do nothing here.*/
4067f1d2b4d3SLarry Finger }
4068d6a82054SLarry Finger if (!btcoexist->auto_report_2ant) {
4069d6a82054SLarry Finger if (!(coex_sta->bt_info_ext & BIT4))
4070d6a82054SLarry Finger btc8723b2ant_bt_auto_report(btcoexist,
4071d6a82054SLarry Finger FORCE_EXEC, true);
4072f1d2b4d3SLarry Finger }
4073f1d2b4d3SLarry Finger }
4074f1d2b4d3SLarry Finger
4075f1d2b4d3SLarry Finger /* check BIT2 first ==> check if bt is under inquiry or page scan */
4076f1d2b4d3SLarry Finger if (bt_info & BT_INFO_8723B_2ANT_B_INQ_PAGE)
4077f1d2b4d3SLarry Finger coex_sta->c2h_bt_inquiry_page = true;
4078f1d2b4d3SLarry Finger else
4079f1d2b4d3SLarry Finger coex_sta->c2h_bt_inquiry_page = false;
4080f1d2b4d3SLarry Finger
4081f1d2b4d3SLarry Finger if (!(bt_info & BT_INFO_8723B_2ANT_B_CONNECTION)) {
4082c6821613SYan-Hsuan Chuang /* set link exist status */
4083f1d2b4d3SLarry Finger coex_sta->bt_link_exist = false;
4084f1d2b4d3SLarry Finger coex_sta->pan_exist = false;
4085f1d2b4d3SLarry Finger coex_sta->a2dp_exist = false;
4086f1d2b4d3SLarry Finger coex_sta->hid_exist = false;
4087f1d2b4d3SLarry Finger coex_sta->sco_exist = false;
4088c6821613SYan-Hsuan Chuang } else {
4089c6821613SYan-Hsuan Chuang /* connection exists */
4090f1d2b4d3SLarry Finger coex_sta->bt_link_exist = true;
4091f1d2b4d3SLarry Finger if (bt_info & BT_INFO_8723B_2ANT_B_FTP)
4092f1d2b4d3SLarry Finger coex_sta->pan_exist = true;
4093f1d2b4d3SLarry Finger else
4094f1d2b4d3SLarry Finger coex_sta->pan_exist = false;
4095f1d2b4d3SLarry Finger if (bt_info & BT_INFO_8723B_2ANT_B_A2DP)
4096f1d2b4d3SLarry Finger coex_sta->a2dp_exist = true;
4097f1d2b4d3SLarry Finger else
4098f1d2b4d3SLarry Finger coex_sta->a2dp_exist = false;
4099f1d2b4d3SLarry Finger if (bt_info & BT_INFO_8723B_2ANT_B_HID)
4100f1d2b4d3SLarry Finger coex_sta->hid_exist = true;
4101f1d2b4d3SLarry Finger else
4102f1d2b4d3SLarry Finger coex_sta->hid_exist = false;
4103f1d2b4d3SLarry Finger if (bt_info & BT_INFO_8723B_2ANT_B_SCO_ESCO)
4104f1d2b4d3SLarry Finger coex_sta->sco_exist = true;
4105f1d2b4d3SLarry Finger else
4106f1d2b4d3SLarry Finger coex_sta->sco_exist = false;
4107588a290bSYan-Hsuan Chuang
4108588a290bSYan-Hsuan Chuang if ((!coex_sta->hid_exist) &&
4109588a290bSYan-Hsuan Chuang (!coex_sta->c2h_bt_inquiry_page) &&
4110588a290bSYan-Hsuan Chuang (!coex_sta->sco_exist)) {
4111588a290bSYan-Hsuan Chuang if (coex_sta->high_priority_tx +
4112588a290bSYan-Hsuan Chuang coex_sta->high_priority_rx >= 160) {
4113588a290bSYan-Hsuan Chuang coex_sta->hid_exist = true;
4114588a290bSYan-Hsuan Chuang bt_info = bt_info | 0x28;
4115588a290bSYan-Hsuan Chuang }
4116588a290bSYan-Hsuan Chuang }
4117f1d2b4d3SLarry Finger }
4118f1d2b4d3SLarry Finger
4119f1d2b4d3SLarry Finger btc8723b2ant_update_bt_link_info(btcoexist);
4120f1d2b4d3SLarry Finger
4121f1d2b4d3SLarry Finger if (!(bt_info & BT_INFO_8723B_2ANT_B_CONNECTION)) {
4122f1d2b4d3SLarry Finger coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE;
4123c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4124466414a0SJoe Perches "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
4125f1d2b4d3SLarry Finger /* connection exists but no busy */
4126f1d2b4d3SLarry Finger } else if (bt_info == BT_INFO_8723B_2ANT_B_CONNECTION) {
4127f1d2b4d3SLarry Finger coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE;
4128c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4129f1d2b4d3SLarry Finger "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
4130f1d2b4d3SLarry Finger } else if ((bt_info & BT_INFO_8723B_2ANT_B_SCO_ESCO) ||
4131f1d2b4d3SLarry Finger (bt_info & BT_INFO_8723B_2ANT_B_SCO_BUSY)) {
4132f1d2b4d3SLarry Finger coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_SCO_BUSY;
4133c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4134f1d2b4d3SLarry Finger "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
4135f1d2b4d3SLarry Finger } else if (bt_info&BT_INFO_8723B_2ANT_B_ACL_BUSY) {
4136f1d2b4d3SLarry Finger coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_ACL_BUSY;
4137c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4138f1d2b4d3SLarry Finger "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
4139f1d2b4d3SLarry Finger } else {
4140f1d2b4d3SLarry Finger coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_MAX;
4141c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4142466414a0SJoe Perches "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
4143f1d2b4d3SLarry Finger }
4144f1d2b4d3SLarry Finger
4145f1d2b4d3SLarry Finger if ((BT_8723B_2ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
4146f1d2b4d3SLarry Finger (BT_8723B_2ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
4147f1d2b4d3SLarry Finger (BT_8723B_2ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) {
4148f1d2b4d3SLarry Finger bt_busy = true;
4149f1d2b4d3SLarry Finger limited_dig = true;
4150f1d2b4d3SLarry Finger } else {
4151f1d2b4d3SLarry Finger bt_busy = false;
4152f1d2b4d3SLarry Finger limited_dig = false;
4153f1d2b4d3SLarry Finger }
4154f1d2b4d3SLarry Finger
4155f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
4156f1d2b4d3SLarry Finger
4157f1d2b4d3SLarry Finger coex_dm->limited_dig = limited_dig;
4158f1d2b4d3SLarry Finger btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig);
4159f1d2b4d3SLarry Finger
4160f1d2b4d3SLarry Finger btc8723b2ant_run_coexist_mechanism(btcoexist);
4161f1d2b4d3SLarry Finger }
4162f1d2b4d3SLarry Finger
ex_btc8723b2ant_halt_notify(struct btc_coexist * btcoexist)4163f1d2b4d3SLarry Finger void ex_btc8723b2ant_halt_notify(struct btc_coexist *btcoexist)
4164f1d2b4d3SLarry Finger {
41652277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
41662277f5f1SLarry Finger
4167c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Halt notify\n");
4168f1d2b4d3SLarry Finger
4169f1d2b4d3SLarry Finger btc8723b2ant_wifioff_hwcfg(btcoexist);
4170f1d2b4d3SLarry Finger btc8723b2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
4171f1d2b4d3SLarry Finger ex_btc8723b2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
4172f1d2b4d3SLarry Finger }
4173f1d2b4d3SLarry Finger
ex_btc8723b2ant_pnp_notify(struct btc_coexist * btcoexist,u8 pnp_state)4174609d59acSYan-Hsuan Chuang void ex_btc8723b2ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
4175609d59acSYan-Hsuan Chuang {
4176609d59acSYan-Hsuan Chuang struct rtl_priv *rtlpriv = btcoexist->adapter;
4177609d59acSYan-Hsuan Chuang
4178c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Pnp notify\n");
4179609d59acSYan-Hsuan Chuang
4180609d59acSYan-Hsuan Chuang if (pnp_state == BTC_WIFI_PNP_SLEEP) {
4181c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4182609d59acSYan-Hsuan Chuang "[BTCoex], Pnp notify to SLEEP\n");
4183609d59acSYan-Hsuan Chuang
4184609d59acSYan-Hsuan Chuang /* Driver do not leave IPS/LPS when driver is going to sleep, so
4185609d59acSYan-Hsuan Chuang * BTCoexistence think wifi is still under IPS/LPS
4186609d59acSYan-Hsuan Chuang *
4187609d59acSYan-Hsuan Chuang * BT should clear UnderIPS/UnderLPS state to avoid mismatch
4188609d59acSYan-Hsuan Chuang * state after wakeup.
4189609d59acSYan-Hsuan Chuang */
4190609d59acSYan-Hsuan Chuang coex_sta->under_ips = false;
4191609d59acSYan-Hsuan Chuang coex_sta->under_lps = false;
4192609d59acSYan-Hsuan Chuang } else if (pnp_state == BTC_WIFI_PNP_WAKE_UP) {
4193c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4194609d59acSYan-Hsuan Chuang "[BTCoex], Pnp notify to WAKE UP\n");
4195609d59acSYan-Hsuan Chuang ex_btc8723b2ant_init_hwconfig(btcoexist);
4196609d59acSYan-Hsuan Chuang btc8723b2ant_init_coex_dm(btcoexist);
4197609d59acSYan-Hsuan Chuang btc8723b2ant_query_bt_info(btcoexist);
4198609d59acSYan-Hsuan Chuang }
4199609d59acSYan-Hsuan Chuang }
4200609d59acSYan-Hsuan Chuang
ex_btc8723b2ant_periodical(struct btc_coexist * btcoexist)4201f1d2b4d3SLarry Finger void ex_btc8723b2ant_periodical(struct btc_coexist *btcoexist)
4202f1d2b4d3SLarry Finger {
42032277f5f1SLarry Finger struct rtl_priv *rtlpriv = btcoexist->adapter;
4204f4a23e19SYan-Hsuan Chuang struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
4205f1d2b4d3SLarry Finger
4206c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4207466414a0SJoe Perches "[BTCoex], ==========================Periodical===========================\n");
4208f1d2b4d3SLarry Finger
4209b59f02fbSYan-Hsuan Chuang if (coex_sta->dis_ver_info_cnt <= 5) {
4210b59f02fbSYan-Hsuan Chuang coex_sta->dis_ver_info_cnt += 1;
4211b59f02fbSYan-Hsuan Chuang if (coex_sta->dis_ver_info_cnt == 3) {
4212b59f02fbSYan-Hsuan Chuang /* Antenna config to set 0x765 = 0x0 (GNT_BT control by
4213b59f02fbSYan-Hsuan Chuang * PTA) after initial
4214b59f02fbSYan-Hsuan Chuang */
4215c8159c3fSLarry Finger rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4216b59f02fbSYan-Hsuan Chuang "[BTCoex], Set GNT_BT control by PTA\n");
4217b59f02fbSYan-Hsuan Chuang btc8723b2ant_set_ant_path(
4218b59f02fbSYan-Hsuan Chuang btcoexist, BTC_ANT_WIFI_AT_MAIN, false, false);
4219b59f02fbSYan-Hsuan Chuang }
4220f1d2b4d3SLarry Finger }
4221f1d2b4d3SLarry Finger
4222d6a82054SLarry Finger if (!btcoexist->auto_report_2ant) {
4223f1d2b4d3SLarry Finger btc8723b2ant_query_bt_info(btcoexist);
4224d6a82054SLarry Finger } else {
422555e9e37dSYan-Hsuan Chuang btc8723b2ant_monitor_bt_ctr(btcoexist);
422655e9e37dSYan-Hsuan Chuang btc8723b2ant_monitor_wifi_ctr(btcoexist);
422755e9e37dSYan-Hsuan Chuang
4228f4a23e19SYan-Hsuan Chuang /* for some BT speakers that High-Priority pkts appear before
4229f4a23e19SYan-Hsuan Chuang * playing, this will cause HID exist
4230f4a23e19SYan-Hsuan Chuang */
4231d6a82054SLarry Finger if ((coex_sta->high_priority_tx +
4232d6a82054SLarry Finger coex_sta->high_priority_rx < 50) &&
4233f4a23e19SYan-Hsuan Chuang (bt_link_info->hid_exist))
4234f4a23e19SYan-Hsuan Chuang bt_link_info->hid_exist = false;
4235f4a23e19SYan-Hsuan Chuang
4236f1d2b4d3SLarry Finger if (btc8723b2ant_is_wifi_status_changed(btcoexist) ||
4237f1d2b4d3SLarry Finger coex_dm->auto_tdma_adjust)
4238f1d2b4d3SLarry Finger btc8723b2ant_run_coexist_mechanism(btcoexist);
4239d6a82054SLarry Finger }
4240f1d2b4d3SLarry Finger }
4241