1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2012 Realtek Corporation.*/
3
4 /***************************************************************
5 * Description:
6 *
7 * This file is for RTL8723B Co-exist mechanism
8 *
9 * History
10 * 2012/11/15 Cosa first check in.
11 *
12 **************************************************************/
13 /**************************************************************
14 * include files
15 **************************************************************/
16 #include "halbt_precomp.h"
17 /**************************************************************
18 * Global variables, these are static variables
19 **************************************************************/
20 static struct coex_dm_8723b_2ant glcoex_dm_8723b_2ant;
21 static struct coex_dm_8723b_2ant *coex_dm = &glcoex_dm_8723b_2ant;
22 static struct coex_sta_8723b_2ant glcoex_sta_8723b_2ant;
23 static struct coex_sta_8723b_2ant *coex_sta = &glcoex_sta_8723b_2ant;
24
25 static const char *const glbt_info_src_8723b_2ant[] = {
26 "BT Info[wifi fw]",
27 "BT Info[bt rsp]",
28 "BT Info[bt auto report]",
29 };
30
31 static u32 glcoex_ver_date_8723b_2ant = 20131113;
32 static u32 glcoex_ver_8723b_2ant = 0x3f;
33
34 /**************************************************************
35 * local function proto type if needed
36 **************************************************************/
37 /**************************************************************
38 * local function start with btc8723b2ant_
39 **************************************************************/
btc8723b2ant_bt_rssi_state(struct btc_coexist * btcoexist,u8 level_num,u8 rssi_thresh,u8 rssi_thresh1)40 static u8 btc8723b2ant_bt_rssi_state(struct btc_coexist *btcoexist,
41 u8 level_num, u8 rssi_thresh,
42 u8 rssi_thresh1)
43 {
44 struct rtl_priv *rtlpriv = btcoexist->adapter;
45 s32 bt_rssi = 0;
46 u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;
47
48 bt_rssi = coex_sta->bt_rssi;
49
50 if (level_num == 2) {
51 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
52 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
53 if (bt_rssi >= rssi_thresh +
54 BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
55 bt_rssi_state = BTC_RSSI_STATE_HIGH;
56 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
57 "[BTCoex], BT Rssi state switch to High\n");
58 } else {
59 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
60 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
61 "[BTCoex], BT Rssi state stay at Low\n");
62 }
63 } else {
64 if (bt_rssi < rssi_thresh) {
65 bt_rssi_state = BTC_RSSI_STATE_LOW;
66 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
67 "[BTCoex], BT Rssi state switch to Low\n");
68 } else {
69 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
70 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
71 "[BTCoex], BT Rssi state stay at High\n");
72 }
73 }
74 } else if (level_num == 3) {
75 if (rssi_thresh > rssi_thresh1) {
76 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
77 "[BTCoex], BT Rssi thresh error!!\n");
78 return coex_sta->pre_bt_rssi_state;
79 }
80
81 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
82 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
83 if (bt_rssi >= rssi_thresh +
84 BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
85 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
86 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
87 "[BTCoex], BT Rssi state switch to Medium\n");
88 } else {
89 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
90 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
91 "[BTCoex], BT Rssi state stay at Low\n");
92 }
93 } else if ((coex_sta->pre_bt_rssi_state ==
94 BTC_RSSI_STATE_MEDIUM) ||
95 (coex_sta->pre_bt_rssi_state ==
96 BTC_RSSI_STATE_STAY_MEDIUM)) {
97 if (bt_rssi >= rssi_thresh1 +
98 BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
99 bt_rssi_state = BTC_RSSI_STATE_HIGH;
100 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
101 "[BTCoex], BT Rssi state switch to High\n");
102 } else if (bt_rssi < rssi_thresh) {
103 bt_rssi_state = BTC_RSSI_STATE_LOW;
104 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
105 "[BTCoex], BT Rssi state switch to Low\n");
106 } else {
107 bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
108 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
109 "[BTCoex], BT Rssi state stay at Medium\n");
110 }
111 } else {
112 if (bt_rssi < rssi_thresh1) {
113 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
114 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
115 "[BTCoex], BT Rssi state switch to Medium\n");
116 } else {
117 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
118 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
119 "[BTCoex], BT Rssi state stay at High\n");
120 }
121 }
122 }
123
124 coex_sta->pre_bt_rssi_state = bt_rssi_state;
125
126 return bt_rssi_state;
127 }
128
btc8723b2ant_wifi_rssi_state(struct btc_coexist * btcoexist,u8 index,u8 level_num,u8 rssi_thresh,u8 rssi_thresh1)129 static u8 btc8723b2ant_wifi_rssi_state(struct btc_coexist *btcoexist,
130 u8 index, u8 level_num,
131 u8 rssi_thresh, u8 rssi_thresh1)
132 {
133 struct rtl_priv *rtlpriv = btcoexist->adapter;
134 s32 wifi_rssi = 0;
135 u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
136
137 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
138
139 if (level_num == 2) {
140 if ((coex_sta->pre_wifi_rssi_state[index] ==
141 BTC_RSSI_STATE_LOW) ||
142 (coex_sta->pre_wifi_rssi_state[index] ==
143 BTC_RSSI_STATE_STAY_LOW)) {
144 if (wifi_rssi >= rssi_thresh +
145 BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
146 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
147 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
148 "[BTCoex], wifi RSSI state switch to High\n");
149 } else {
150 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
151 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
152 "[BTCoex], wifi RSSI state stay at Low\n");
153 }
154 } else {
155 if (wifi_rssi < rssi_thresh) {
156 wifi_rssi_state = BTC_RSSI_STATE_LOW;
157 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
158 "[BTCoex], wifi RSSI state switch to Low\n");
159 } else {
160 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
161 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
162 "[BTCoex], wifi RSSI state stay at High\n");
163 }
164 }
165 } else if (level_num == 3) {
166 if (rssi_thresh > rssi_thresh1) {
167 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
168 "[BTCoex], wifi RSSI thresh error!!\n");
169 return coex_sta->pre_wifi_rssi_state[index];
170 }
171
172 if ((coex_sta->pre_wifi_rssi_state[index] ==
173 BTC_RSSI_STATE_LOW) ||
174 (coex_sta->pre_wifi_rssi_state[index] ==
175 BTC_RSSI_STATE_STAY_LOW)) {
176 if (wifi_rssi >= rssi_thresh +
177 BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
178 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
179 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
180 "[BTCoex], wifi RSSI state switch to Medium\n");
181 } else {
182 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
183 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
184 "[BTCoex], wifi RSSI state stay at Low\n");
185 }
186 } else if ((coex_sta->pre_wifi_rssi_state[index] ==
187 BTC_RSSI_STATE_MEDIUM) ||
188 (coex_sta->pre_wifi_rssi_state[index] ==
189 BTC_RSSI_STATE_STAY_MEDIUM)) {
190 if (wifi_rssi >= rssi_thresh1 +
191 BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
192 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
193 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
194 "[BTCoex], wifi RSSI state switch to High\n");
195 } else if (wifi_rssi < rssi_thresh) {
196 wifi_rssi_state = BTC_RSSI_STATE_LOW;
197 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
198 "[BTCoex], wifi RSSI state switch to Low\n");
199 } else {
200 wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
201 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
202 "[BTCoex], wifi RSSI state stay at Medium\n");
203 }
204 } else {
205 if (wifi_rssi < rssi_thresh1) {
206 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
207 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
208 "[BTCoex], wifi RSSI state switch to Medium\n");
209 } else {
210 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
211 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
212 "[BTCoex], wifi RSSI state stay at High\n");
213 }
214 }
215 }
216
217 coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
218
219 return wifi_rssi_state;
220 }
221
222 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)223 void btc8723b2ant_limited_rx(struct btc_coexist *btcoexist, bool force_exec,
224 bool rej_ap_agg_pkt, bool bt_ctrl_agg_buf_size,
225 u8 agg_buf_size)
226 {
227 bool reject_rx_agg = rej_ap_agg_pkt;
228 bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
229 u8 rx_agg_size = agg_buf_size;
230
231 /* ============================================ */
232 /* Rx Aggregation related setting */
233 /* ============================================ */
234 btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
235 &reject_rx_agg);
236 /* decide BT control aggregation buf size or not */
237 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
238 &bt_ctrl_rx_agg_size);
239 /* aggregate buf size, only work when BT control Rx aggregate size */
240 btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
241 /* real update aggregation setting */
242 btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
243 }
244
btc8723b2ant_monitor_bt_ctr(struct btc_coexist * btcoexist)245 static void btc8723b2ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
246 {
247 struct rtl_priv *rtlpriv = btcoexist->adapter;
248 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
249 u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
250 u32 reg_hp_tx = 0, reg_hp_rx = 0;
251 u32 reg_lp_tx = 0, reg_lp_rx = 0;
252
253 reg_hp_txrx = 0x770;
254 reg_lp_txrx = 0x774;
255
256 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
257 reg_hp_tx = u32tmp & MASKLWORD;
258 reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
259
260 u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
261 reg_lp_tx = u32tmp & MASKLWORD;
262 reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
263
264 coex_sta->high_priority_tx = reg_hp_tx;
265 coex_sta->high_priority_rx = reg_hp_rx;
266 coex_sta->low_priority_tx = reg_lp_tx;
267 coex_sta->low_priority_rx = reg_lp_rx;
268
269 if ((coex_sta->low_priority_tx > 1050) &&
270 (!coex_sta->c2h_bt_inquiry_page))
271 coex_sta->pop_event_cnt++;
272
273 if ((coex_sta->low_priority_rx >= 950) &&
274 (coex_sta->low_priority_rx >= coex_sta->low_priority_tx) &&
275 (!coex_sta->under_ips))
276 bt_link_info->slave_role = true;
277 else
278 bt_link_info->slave_role = false;
279
280 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
281 "[BTCoex], High Priority Tx/Rx(reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
282 reg_hp_txrx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);
283 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
284 "[BTCoex], Low Priority Tx/Rx(reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
285 reg_lp_txrx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx);
286
287 /* reset counter */
288 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
289 }
290
btc8723b2ant_monitor_wifi_ctr(struct btc_coexist * btcoexist)291 static void btc8723b2ant_monitor_wifi_ctr(struct btc_coexist *btcoexist)
292 {
293 if (coex_sta->under_ips) {
294 coex_sta->crc_ok_cck = 0;
295 coex_sta->crc_ok_11g = 0;
296 coex_sta->crc_ok_11n = 0;
297 coex_sta->crc_ok_11n_agg = 0;
298
299 coex_sta->crc_err_cck = 0;
300 coex_sta->crc_err_11g = 0;
301 coex_sta->crc_err_11n = 0;
302 coex_sta->crc_err_11n_agg = 0;
303 } else {
304 coex_sta->crc_ok_cck =
305 btcoexist->btc_read_4byte(btcoexist, 0xf88);
306 coex_sta->crc_ok_11g =
307 btcoexist->btc_read_2byte(btcoexist, 0xf94);
308 coex_sta->crc_ok_11n =
309 btcoexist->btc_read_2byte(btcoexist, 0xf90);
310 coex_sta->crc_ok_11n_agg =
311 btcoexist->btc_read_2byte(btcoexist, 0xfb8);
312
313 coex_sta->crc_err_cck =
314 btcoexist->btc_read_4byte(btcoexist, 0xf84);
315 coex_sta->crc_err_11g =
316 btcoexist->btc_read_2byte(btcoexist, 0xf96);
317 coex_sta->crc_err_11n =
318 btcoexist->btc_read_2byte(btcoexist, 0xf92);
319 coex_sta->crc_err_11n_agg =
320 btcoexist->btc_read_2byte(btcoexist, 0xfba);
321 }
322
323 /* reset counter */
324 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x1);
325 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xf16, 0x1, 0x0);
326 }
327
btc8723b2ant_query_bt_info(struct btc_coexist * btcoexist)328 static void btc8723b2ant_query_bt_info(struct btc_coexist *btcoexist)
329 {
330 struct rtl_priv *rtlpriv = btcoexist->adapter;
331 u8 h2c_parameter[1] = {0};
332
333 coex_sta->c2h_bt_info_req_sent = true;
334
335 h2c_parameter[0] |= BIT0; /* trigger */
336
337 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
338 "[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n",
339 h2c_parameter[0]);
340
341 btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
342 }
343
btc8723b2ant_is_wifi_status_changed(struct btc_coexist * btcoexist)344 static bool btc8723b2ant_is_wifi_status_changed(struct btc_coexist *btcoexist)
345 {
346 static bool pre_wifi_busy;
347 static bool pre_under_4way;
348 static bool pre_bt_hs_on;
349 bool wifi_busy = false, under_4way = false, bt_hs_on = false;
350 bool wifi_connected = false;
351 u8 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
352 u8 tmp;
353
354 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
355 &wifi_connected);
356 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
357 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
358 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
359 &under_4way);
360
361 if (wifi_connected) {
362 if (wifi_busy != pre_wifi_busy) {
363 pre_wifi_busy = wifi_busy;
364 return true;
365 }
366
367 if (under_4way != pre_under_4way) {
368 pre_under_4way = under_4way;
369 return true;
370 }
371
372 if (bt_hs_on != pre_bt_hs_on) {
373 pre_bt_hs_on = bt_hs_on;
374 return true;
375 }
376
377 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
378 coex_dm->switch_thres_offset;
379 wifi_rssi_state =
380 btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, tmp, 0);
381
382 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
383 (wifi_rssi_state == BTC_RSSI_STATE_LOW))
384 return true;
385 }
386
387 return false;
388 }
389
btc8723b2ant_update_bt_link_info(struct btc_coexist * btcoexist)390 static void btc8723b2ant_update_bt_link_info(struct btc_coexist *btcoexist)
391 {
392 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
393 bool bt_hs_on = false;
394
395 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
396
397 bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
398 bt_link_info->sco_exist = coex_sta->sco_exist;
399 bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
400 bt_link_info->pan_exist = coex_sta->pan_exist;
401 bt_link_info->hid_exist = coex_sta->hid_exist;
402
403 /* work around for HS mode. */
404 if (bt_hs_on) {
405 bt_link_info->pan_exist = true;
406 bt_link_info->bt_link_exist = true;
407 }
408
409 /* check if Sco only */
410 if (bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
411 !bt_link_info->pan_exist && !bt_link_info->hid_exist)
412 bt_link_info->sco_only = true;
413 else
414 bt_link_info->sco_only = false;
415
416 /* check if A2dp only */
417 if (!bt_link_info->sco_exist && bt_link_info->a2dp_exist &&
418 !bt_link_info->pan_exist && !bt_link_info->hid_exist)
419 bt_link_info->a2dp_only = true;
420 else
421 bt_link_info->a2dp_only = false;
422
423 /* check if Pan only */
424 if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
425 bt_link_info->pan_exist && !bt_link_info->hid_exist)
426 bt_link_info->pan_only = true;
427 else
428 bt_link_info->pan_only = false;
429
430 /* check if Hid only */
431 if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
432 !bt_link_info->pan_exist && bt_link_info->hid_exist)
433 bt_link_info->hid_only = true;
434 else
435 bt_link_info->hid_only = false;
436 }
437
btc8723b2ant_action_algorithm(struct btc_coexist * btcoexist)438 static u8 btc8723b2ant_action_algorithm(struct btc_coexist *btcoexist)
439 {
440 struct rtl_priv *rtlpriv = btcoexist->adapter;
441 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
442 bool bt_hs_on = false;
443 u8 algorithm = BT_8723B_2ANT_COEX_ALGO_UNDEFINED;
444 u8 num_of_diff_profile = 0;
445
446 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
447
448 if (!bt_link_info->bt_link_exist) {
449 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
450 "[BTCoex], No BT link exists!!!\n");
451 return algorithm;
452 }
453
454 if (bt_link_info->sco_exist)
455 num_of_diff_profile++;
456 if (bt_link_info->hid_exist)
457 num_of_diff_profile++;
458 if (bt_link_info->pan_exist)
459 num_of_diff_profile++;
460 if (bt_link_info->a2dp_exist)
461 num_of_diff_profile++;
462
463 if (num_of_diff_profile == 1) {
464 if (bt_link_info->sco_exist) {
465 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
466 "[BTCoex], SCO only\n");
467 algorithm = BT_8723B_2ANT_COEX_ALGO_SCO;
468 } else {
469 if (bt_link_info->hid_exist) {
470 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
471 "[BTCoex], HID only\n");
472 algorithm = BT_8723B_2ANT_COEX_ALGO_HID;
473 } else if (bt_link_info->a2dp_exist) {
474 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
475 "[BTCoex], A2DP only\n");
476 algorithm = BT_8723B_2ANT_COEX_ALGO_A2DP;
477 } else if (bt_link_info->pan_exist) {
478 if (bt_hs_on) {
479 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
480 DBG_LOUD,
481 "[BTCoex], PAN(HS) only\n");
482 algorithm =
483 BT_8723B_2ANT_COEX_ALGO_PANHS;
484 } else {
485 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
486 DBG_LOUD,
487 "[BTCoex], PAN(EDR) only\n");
488 algorithm =
489 BT_8723B_2ANT_COEX_ALGO_PANEDR;
490 }
491 }
492 }
493 } else if (num_of_diff_profile == 2) {
494 if (bt_link_info->sco_exist) {
495 if (bt_link_info->hid_exist) {
496 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
497 "[BTCoex], SCO + HID\n");
498 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
499 } else if (bt_link_info->a2dp_exist) {
500 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
501 "[BTCoex], SCO + A2DP ==> SCO\n");
502 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
503 } else if (bt_link_info->pan_exist) {
504 if (bt_hs_on) {
505 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
506 DBG_LOUD,
507 "[BTCoex], SCO + PAN(HS)\n");
508 algorithm = BT_8723B_2ANT_COEX_ALGO_SCO;
509 } else {
510 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
511 DBG_LOUD,
512 "[BTCoex], SCO + PAN(EDR)\n");
513 algorithm =
514 BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
515 }
516 }
517 } else {
518 if (bt_link_info->hid_exist &&
519 bt_link_info->a2dp_exist) {
520 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
521 "[BTCoex], HID + A2DP\n");
522 algorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP;
523 } else if (bt_link_info->hid_exist &&
524 bt_link_info->pan_exist) {
525 if (bt_hs_on) {
526 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
527 DBG_LOUD,
528 "[BTCoex], HID + PAN(HS)\n");
529 algorithm = BT_8723B_2ANT_COEX_ALGO_HID;
530 } else {
531 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
532 DBG_LOUD,
533 "[BTCoex], HID + PAN(EDR)\n");
534 algorithm =
535 BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
536 }
537 } else if (bt_link_info->pan_exist &&
538 bt_link_info->a2dp_exist) {
539 if (bt_hs_on) {
540 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
541 DBG_LOUD,
542 "[BTCoex], A2DP + PAN(HS)\n");
543 algorithm =
544 BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS;
545 } else {
546 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
547 DBG_LOUD,
548 "[BTCoex],A2DP + PAN(EDR)\n");
549 algorithm =
550 BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP;
551 }
552 }
553 }
554 } else if (num_of_diff_profile == 3) {
555 if (bt_link_info->sco_exist) {
556 if (bt_link_info->hid_exist &&
557 bt_link_info->a2dp_exist) {
558 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
559 "[BTCoex], SCO + HID + A2DP ==> HID\n");
560 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
561 } else if (bt_link_info->hid_exist &&
562 bt_link_info->pan_exist) {
563 if (bt_hs_on) {
564 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
565 DBG_LOUD,
566 "[BTCoex], SCO + HID + PAN(HS)\n");
567 algorithm =
568 BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
569 } else {
570 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
571 DBG_LOUD,
572 "[BTCoex], SCO + HID + PAN(EDR)\n");
573 algorithm =
574 BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
575 }
576 } else if (bt_link_info->pan_exist &&
577 bt_link_info->a2dp_exist) {
578 if (bt_hs_on) {
579 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
580 DBG_LOUD,
581 "[BTCoex], SCO + A2DP + PAN(HS)\n");
582 algorithm =
583 BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
584 } else {
585 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
586 DBG_LOUD,
587 "[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n");
588 algorithm =
589 BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
590 }
591 }
592 } else {
593 if (bt_link_info->hid_exist &&
594 bt_link_info->pan_exist &&
595 bt_link_info->a2dp_exist) {
596 if (bt_hs_on) {
597 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
598 DBG_LOUD,
599 "[BTCoex], HID + A2DP + PAN(HS)\n");
600 algorithm =
601 BT_8723B_2ANT_COEX_ALGO_HID_A2DP;
602 } else {
603 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
604 DBG_LOUD,
605 "[BTCoex], HID + A2DP + PAN(EDR)\n");
606 algorithm =
607 BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
608 }
609 }
610 }
611 } else if (num_of_diff_profile >= 3) {
612 if (bt_link_info->sco_exist) {
613 if (bt_link_info->hid_exist &&
614 bt_link_info->pan_exist &&
615 bt_link_info->a2dp_exist) {
616 if (bt_hs_on) {
617 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
618 DBG_LOUD,
619 "[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n");
620 } else {
621 rtl_dbg(rtlpriv, COMP_BT_COEXIST,
622 DBG_LOUD,
623 "[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");
624 algorithm =
625 BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
626 }
627 }
628 }
629 }
630 return algorithm;
631 }
632
btc8723b2ant_set_fw_dac_swing_level(struct btc_coexist * btcoexist,u8 dac_swing_lvl)633 static void btc8723b2ant_set_fw_dac_swing_level(struct btc_coexist *btcoexist,
634 u8 dac_swing_lvl)
635 {
636 struct rtl_priv *rtlpriv = btcoexist->adapter;
637 u8 h2c_parameter[1] = {0};
638
639 /* There are several type of dacswing
640 * 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6
641 */
642 h2c_parameter[0] = dac_swing_lvl;
643
644 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
645 "[BTCoex], Set Dac Swing Level=0x%x\n", dac_swing_lvl);
646 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
647 "[BTCoex], FW write 0x64=0x%x\n", h2c_parameter[0]);
648
649 btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);
650 }
651
btc8723b2ant_set_fw_dec_bt_pwr(struct btc_coexist * btcoexist,u8 dec_bt_pwr_lvl)652 static void btc8723b2ant_set_fw_dec_bt_pwr(struct btc_coexist *btcoexist,
653 u8 dec_bt_pwr_lvl)
654 {
655 struct rtl_priv *rtlpriv = btcoexist->adapter;
656 u8 h2c_parameter[1] = {0};
657
658 h2c_parameter[0] = dec_bt_pwr_lvl;
659
660 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
661 "[BTCoex], decrease Bt Power Level : %u\n", dec_bt_pwr_lvl);
662
663 btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter);
664 }
665
btc8723b2ant_dec_bt_pwr(struct btc_coexist * btcoexist,bool force_exec,u8 dec_bt_pwr_lvl)666 static void btc8723b2ant_dec_bt_pwr(struct btc_coexist *btcoexist,
667 bool force_exec, u8 dec_bt_pwr_lvl)
668 {
669 struct rtl_priv *rtlpriv = btcoexist->adapter;
670
671 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
672 "[BTCoex], Dec BT power level = %u\n", dec_bt_pwr_lvl);
673 coex_dm->cur_dec_bt_pwr_lvl = dec_bt_pwr_lvl;
674
675 if (!force_exec) {
676 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
677 "[BTCoex], PreDecBtPwrLvl=%d, CurDecBtPwrLvl=%d\n",
678 coex_dm->pre_dec_bt_pwr_lvl,
679 coex_dm->cur_dec_bt_pwr_lvl);
680
681 if (coex_dm->pre_dec_bt_pwr_lvl == coex_dm->cur_dec_bt_pwr_lvl)
682 return;
683 }
684 btc8723b2ant_set_fw_dec_bt_pwr(btcoexist, coex_dm->cur_dec_bt_pwr_lvl);
685
686 coex_dm->pre_dec_bt_pwr_lvl = coex_dm->cur_dec_bt_pwr_lvl;
687 }
688
689 static
halbtc8723b2ant_set_bt_auto_report(struct btc_coexist * btcoexist,bool enable_auto_report)690 void halbtc8723b2ant_set_bt_auto_report(struct btc_coexist *btcoexist,
691 bool enable_auto_report)
692 {
693 u8 h2c_parameter[1] = {0};
694
695 h2c_parameter[0] = 0;
696
697 if (enable_auto_report)
698 h2c_parameter[0] |= BIT(0);
699
700 btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
701 }
702
703 static
btc8723b2ant_bt_auto_report(struct btc_coexist * btcoexist,bool force_exec,bool enable_auto_report)704 void btc8723b2ant_bt_auto_report(struct btc_coexist *btcoexist,
705 bool force_exec, bool enable_auto_report)
706 {
707 coex_dm->cur_bt_auto_report = enable_auto_report;
708
709 if (!force_exec) {
710 if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
711 return;
712 }
713 halbtc8723b2ant_set_bt_auto_report(btcoexist,
714 coex_dm->cur_bt_auto_report);
715
716 coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
717 }
718
btc8723b2ant_fw_dac_swing_lvl(struct btc_coexist * btcoexist,bool force_exec,u8 fw_dac_swing_lvl)719 static void btc8723b2ant_fw_dac_swing_lvl(struct btc_coexist *btcoexist,
720 bool force_exec, u8 fw_dac_swing_lvl)
721 {
722 struct rtl_priv *rtlpriv = btcoexist->adapter;
723
724 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
725 "[BTCoex], %s set FW Dac Swing level = %d\n",
726 (force_exec ? "force to" : ""), fw_dac_swing_lvl);
727 coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl;
728
729 if (!force_exec) {
730 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
731 "[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n",
732 coex_dm->pre_fw_dac_swing_lvl,
733 coex_dm->cur_fw_dac_swing_lvl);
734
735 if (coex_dm->pre_fw_dac_swing_lvl ==
736 coex_dm->cur_fw_dac_swing_lvl)
737 return;
738 }
739
740 btc8723b2ant_set_fw_dac_swing_level(btcoexist,
741 coex_dm->cur_fw_dac_swing_lvl);
742 coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;
743 }
744
btc8723b_set_penalty_txrate(struct btc_coexist * btcoexist,bool low_penalty_ra)745 static void btc8723b_set_penalty_txrate(struct btc_coexist *btcoexist,
746 bool low_penalty_ra)
747 {
748 struct rtl_priv *rtlpriv = btcoexist->adapter;
749 u8 h2c_parameter[6] = {0};
750
751 h2c_parameter[0] = 0x6; /* op_code, 0x6 = Retry_Penalty */
752
753 if (low_penalty_ra) {
754 h2c_parameter[1] |= BIT0;
755 /* normal rate except MCS7/6/5, OFDM54/48/36 */
756 h2c_parameter[2] = 0x00;
757 h2c_parameter[3] = 0xf4; /* MCS7 or OFDM54 */
758 h2c_parameter[4] = 0xf5; /* MCS6 or OFDM48 */
759 h2c_parameter[5] = 0xf6; /* MCS5 or OFDM36 */
760 }
761
762 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
763 "[BTCoex], set WiFi Low-Penalty Retry: %s",
764 (low_penalty_ra ? "ON!!" : "OFF!!"));
765
766 btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
767 }
768
btc8723b2ant_low_penalty_ra(struct btc_coexist * btcoexist,bool force_exec,bool low_penalty_ra)769 static void btc8723b2ant_low_penalty_ra(struct btc_coexist *btcoexist,
770 bool force_exec, bool low_penalty_ra)
771 {
772 struct rtl_priv *rtlpriv = btcoexist->adapter;
773
774 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
775 "[BTCoex], %s turn LowPenaltyRA = %s\n",
776 (force_exec ? "force to" : ""), (low_penalty_ra ?
777 "ON" : "OFF"));
778 coex_dm->cur_low_penalty_ra = low_penalty_ra;
779
780 if (!force_exec) {
781 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
782 "[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n",
783 coex_dm->pre_low_penalty_ra,
784 coex_dm->cur_low_penalty_ra);
785
786 if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
787 return;
788 }
789 btc8723b_set_penalty_txrate(btcoexist, coex_dm->cur_low_penalty_ra);
790
791 coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
792 }
793
btc8723b2ant_set_dac_swing_reg(struct btc_coexist * btcoexist,u32 level)794 static void btc8723b2ant_set_dac_swing_reg(struct btc_coexist *btcoexist,
795 u32 level)
796 {
797 struct rtl_priv *rtlpriv = btcoexist->adapter;
798 u8 val = (u8) level;
799
800 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
801 "[BTCoex], Write SwDacSwing = 0x%x\n", level);
802 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x883, 0x3e, val);
803 }
804
btc8723b2ant_set_sw_fulltime_dac_swing(struct btc_coexist * btcoex,bool sw_dac_swing_on,u32 sw_dac_swing_lvl)805 static void btc8723b2ant_set_sw_fulltime_dac_swing(struct btc_coexist *btcoex,
806 bool sw_dac_swing_on,
807 u32 sw_dac_swing_lvl)
808 {
809 if (sw_dac_swing_on)
810 btc8723b2ant_set_dac_swing_reg(btcoex, sw_dac_swing_lvl);
811 else
812 btc8723b2ant_set_dac_swing_reg(btcoex, 0x18);
813 }
814
btc8723b2ant_dac_swing(struct btc_coexist * btcoexist,bool force_exec,bool dac_swing_on,u32 dac_swing_lvl)815 static void btc8723b2ant_dac_swing(struct btc_coexist *btcoexist,
816 bool force_exec, bool dac_swing_on,
817 u32 dac_swing_lvl)
818 {
819 struct rtl_priv *rtlpriv = btcoexist->adapter;
820
821 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
822 "[BTCoex], %s turn DacSwing=%s, dac_swing_lvl=0x%x\n",
823 (force_exec ? "force to" : ""),
824 (dac_swing_on ? "ON" : "OFF"), dac_swing_lvl);
825 coex_dm->cur_dac_swing_on = dac_swing_on;
826 coex_dm->cur_dac_swing_lvl = dac_swing_lvl;
827
828 if (!force_exec) {
829 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
830 "[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n",
831 coex_dm->pre_dac_swing_on,
832 coex_dm->pre_dac_swing_lvl,
833 coex_dm->cur_dac_swing_on,
834 coex_dm->cur_dac_swing_lvl);
835
836 if ((coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) &&
837 (coex_dm->pre_dac_swing_lvl == coex_dm->cur_dac_swing_lvl))
838 return;
839 }
840 mdelay(30);
841 btc8723b2ant_set_sw_fulltime_dac_swing(btcoexist, dac_swing_on,
842 dac_swing_lvl);
843
844 coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on;
845 coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl;
846 }
847
btc8723b2ant_set_coex_table(struct btc_coexist * btcoexist,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)848 static void btc8723b2ant_set_coex_table(struct btc_coexist *btcoexist,
849 u32 val0x6c0, u32 val0x6c4,
850 u32 val0x6c8, u8 val0x6cc)
851 {
852 struct rtl_priv *rtlpriv = btcoexist->adapter;
853
854 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
855 "[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0);
856 btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
857
858 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
859 "[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4);
860 btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
861
862 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
863 "[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8);
864 btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
865
866 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
867 "[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc);
868 btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
869 }
870
btc8723b2ant_coex_table(struct btc_coexist * btcoexist,bool force_exec,u32 val0x6c0,u32 val0x6c4,u32 val0x6c8,u8 val0x6cc)871 static void btc8723b2ant_coex_table(struct btc_coexist *btcoexist,
872 bool force_exec, u32 val0x6c0,
873 u32 val0x6c4, u32 val0x6c8,
874 u8 val0x6cc)
875 {
876 struct rtl_priv *rtlpriv = btcoexist->adapter;
877
878 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
879 "[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n",
880 force_exec ? "force to" : "",
881 val0x6c0, val0x6c4, val0x6c8, val0x6cc);
882 coex_dm->cur_val0x6c0 = val0x6c0;
883 coex_dm->cur_val0x6c4 = val0x6c4;
884 coex_dm->cur_val0x6c8 = val0x6c8;
885 coex_dm->cur_val0x6cc = val0x6cc;
886
887 if (!force_exec) {
888 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
889 "[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n",
890 coex_dm->pre_val0x6c0, coex_dm->pre_val0x6c4,
891 coex_dm->pre_val0x6c8, coex_dm->pre_val0x6cc);
892 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
893 "[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n",
894 coex_dm->cur_val0x6c0, coex_dm->cur_val0x6c4,
895 coex_dm->cur_val0x6c8, coex_dm->cur_val0x6cc);
896
897 if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
898 (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
899 (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
900 (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
901 return;
902 }
903 btc8723b2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,
904 val0x6c8, val0x6cc);
905
906 coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
907 coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
908 coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
909 coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
910 }
911
btc8723b2ant_coex_table_with_type(struct btc_coexist * btcoexist,bool force_exec,u8 type)912 static void btc8723b2ant_coex_table_with_type(struct btc_coexist *btcoexist,
913 bool force_exec, u8 type)
914 {
915 switch (type) {
916 case 0:
917 btc8723b2ant_coex_table(btcoexist, force_exec, 0x55555555,
918 0x55555555, 0xffffff, 0x3);
919 break;
920 case 1:
921 btc8723b2ant_coex_table(btcoexist, force_exec, 0x55555555,
922 0x5afa5afa, 0xffffff, 0x3);
923 break;
924 case 2:
925 btc8723b2ant_coex_table(btcoexist, force_exec, 0x5ada5ada,
926 0x5ada5ada, 0xffffff, 0x3);
927 break;
928 case 3:
929 btc8723b2ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,
930 0xaaaaaaaa, 0xffffff, 0x3);
931 break;
932 case 4:
933 btc8723b2ant_coex_table(btcoexist, force_exec, 0xffffffff,
934 0xffffffff, 0xffffff, 0x3);
935 break;
936 case 5:
937 btc8723b2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
938 0x5fff5fff, 0xffffff, 0x3);
939 break;
940 case 6:
941 btc8723b2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
942 0x5a5a5a5a, 0xffffff, 0x3);
943 break;
944 case 7:
945 btc8723b2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
946 0x5ada5ada, 0xffffff, 0x3);
947 break;
948 case 8:
949 btc8723b2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
950 0x5ada5ada, 0xffffff, 0x3);
951 break;
952 case 9:
953 btc8723b2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
954 0x5ada5ada, 0xffffff, 0x3);
955 break;
956 case 10:
957 btc8723b2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
958 0x5ada5ada, 0xffffff, 0x3);
959 break;
960 case 11:
961 btc8723b2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
962 0x5ada5ada, 0xffffff, 0x3);
963 break;
964 case 12:
965 btc8723b2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
966 0x5ada5ada, 0xffffff, 0x3);
967 break;
968 case 13:
969 btc8723b2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
970 0xaaaaaaaa, 0xffffff, 0x3);
971 break;
972 case 14:
973 btc8723b2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
974 0x5ada5ada, 0xffffff, 0x3);
975 break;
976 case 15:
977 btc8723b2ant_coex_table(btcoexist, force_exec, 0x55dd55dd,
978 0xaaaaaaaa, 0xffffff, 0x3);
979 break;
980 default:
981 break;
982 }
983 }
984
btc8723b2ant_set_fw_ignore_wlan_act(struct btc_coexist * btcoexist,bool enable)985 static void btc8723b2ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,
986 bool enable)
987 {
988 struct rtl_priv *rtlpriv = btcoexist->adapter;
989 u8 h2c_parameter[1] = {0};
990
991 if (enable)
992 h2c_parameter[0] |= BIT0; /* function enable */
993
994 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
995 "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n",
996 h2c_parameter[0]);
997
998 btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
999 }
1000
btc8723b2ant_set_lps_rpwm(struct btc_coexist * btcoexist,u8 lps_val,u8 rpwm_val)1001 static void btc8723b2ant_set_lps_rpwm(struct btc_coexist *btcoexist,
1002 u8 lps_val, u8 rpwm_val)
1003 {
1004 u8 lps = lps_val;
1005 u8 rpwm = rpwm_val;
1006
1007 btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
1008 btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
1009 }
1010
btc8723b2ant_lps_rpwm(struct btc_coexist * btcoexist,bool force_exec,u8 lps_val,u8 rpwm_val)1011 static void btc8723b2ant_lps_rpwm(struct btc_coexist *btcoexist,
1012 bool force_exec, u8 lps_val, u8 rpwm_val)
1013 {
1014 coex_dm->cur_lps = lps_val;
1015 coex_dm->cur_rpwm = rpwm_val;
1016
1017 if (!force_exec) {
1018 if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
1019 (coex_dm->pre_rpwm == coex_dm->cur_rpwm))
1020 return;
1021 }
1022 btc8723b2ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
1023
1024 coex_dm->pre_lps = coex_dm->cur_lps;
1025 coex_dm->pre_rpwm = coex_dm->cur_rpwm;
1026 }
1027
btc8723b2ant_ignore_wlan_act(struct btc_coexist * btcoexist,bool force_exec,bool enable)1028 static void btc8723b2ant_ignore_wlan_act(struct btc_coexist *btcoexist,
1029 bool force_exec, bool enable)
1030 {
1031 struct rtl_priv *rtlpriv = btcoexist->adapter;
1032
1033 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1034 "[BTCoex], %s turn Ignore WlanAct %s\n",
1035 (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
1036 coex_dm->cur_ignore_wlan_act = enable;
1037
1038 if (!force_exec) {
1039 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1040 "[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n",
1041 coex_dm->pre_ignore_wlan_act,
1042 coex_dm->cur_ignore_wlan_act);
1043
1044 if (coex_dm->pre_ignore_wlan_act ==
1045 coex_dm->cur_ignore_wlan_act)
1046 return;
1047 }
1048 btc8723b2ant_set_fw_ignore_wlan_act(btcoexist, enable);
1049
1050 coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
1051 }
1052
btc8723b2ant_set_fw_ps_tdma(struct btc_coexist * btcoexist,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 byte5)1053 static void btc8723b2ant_set_fw_ps_tdma(struct btc_coexist *btcoexist, u8 byte1,
1054 u8 byte2, u8 byte3, u8 byte4, u8 byte5)
1055 {
1056 struct rtl_priv *rtlpriv = btcoexist->adapter;
1057 u8 h2c_parameter[5];
1058 if ((coex_sta->a2dp_exist) && (coex_sta->hid_exist))
1059 byte5 = byte5 | 0x1;
1060
1061 h2c_parameter[0] = byte1;
1062 h2c_parameter[1] = byte2;
1063 h2c_parameter[2] = byte3;
1064 h2c_parameter[3] = byte4;
1065 h2c_parameter[4] = byte5;
1066
1067 coex_dm->ps_tdma_para[0] = byte1;
1068 coex_dm->ps_tdma_para[1] = byte2;
1069 coex_dm->ps_tdma_para[2] = byte3;
1070 coex_dm->ps_tdma_para[3] = byte4;
1071 coex_dm->ps_tdma_para[4] = byte5;
1072
1073 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1074 "[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n",
1075 h2c_parameter[0],
1076 h2c_parameter[1] << 24 | h2c_parameter[2] << 16 |
1077 h2c_parameter[3] << 8 | h2c_parameter[4]);
1078
1079 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1080 }
1081
btc8723b2ant_sw_mechanism(struct btc_coexist * btcoexist,bool shrink_rx_lpf,bool low_penalty_ra,bool limited_dig,bool bt_lna_constrain)1082 static void btc8723b2ant_sw_mechanism(struct btc_coexist *btcoexist,
1083 bool shrink_rx_lpf, bool low_penalty_ra,
1084 bool limited_dig, bool bt_lna_constrain)
1085 {
1086 btc8723b2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
1087 }
1088
btc8723b2ant_set_ant_path(struct btc_coexist * btcoexist,u8 antpos_type,bool init_hwcfg,bool wifi_off)1089 static void btc8723b2ant_set_ant_path(struct btc_coexist *btcoexist,
1090 u8 antpos_type, bool init_hwcfg,
1091 bool wifi_off)
1092 {
1093 struct btc_board_info *board_info = &btcoexist->board_info;
1094 u32 fw_ver = 0, u32tmp = 0;
1095 bool pg_ext_switch = false;
1096 bool use_ext_switch = false;
1097 u8 h2c_parameter[2] = {0};
1098
1099 btcoexist->btc_get(btcoexist, BTC_GET_BL_EXT_SWITCH, &pg_ext_switch);
1100 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
1101
1102 if ((fw_ver < 0xc0000) || pg_ext_switch)
1103 use_ext_switch = true;
1104
1105 if (init_hwcfg) {
1106 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x39, 0x8, 0x1);
1107 btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
1108 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x944, 0x3, 0x3);
1109 btcoexist->btc_write_1byte(btcoexist, 0x930, 0x77);
1110 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x1);
1111
1112 if (fw_ver >= 0x180000) {
1113 /* Use H2C to set GNT_BT to High to avoid A2DP click */
1114 h2c_parameter[0] = 1;
1115 btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
1116 h2c_parameter);
1117 } else {
1118 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
1119 }
1120
1121 btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
1122
1123 /* WiFi TRx Mask off */
1124 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A,
1125 0x1, 0xfffff, 0x0);
1126
1127 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {
1128 /* tell firmware "no antenna inverse" */
1129 h2c_parameter[0] = 0;
1130 } else {
1131 /* tell firmware "antenna inverse" */
1132 h2c_parameter[0] = 1;
1133 }
1134
1135 if (use_ext_switch) {
1136 /* ext switch type */
1137 h2c_parameter[1] = 1;
1138 } else {
1139 /* int switch type */
1140 h2c_parameter[1] = 0;
1141 }
1142 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2, h2c_parameter);
1143 } else {
1144 if (fw_ver >= 0x180000) {
1145 /* Use H2C to set GNT_BT to "Control by PTA"*/
1146 h2c_parameter[0] = 0;
1147 btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1,
1148 h2c_parameter);
1149 } else {
1150 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x0);
1151 }
1152 }
1153
1154 /* ext switch setting */
1155 if (use_ext_switch) {
1156 if (init_hwcfg) {
1157 /* 0x4c[23] = 0, 0x4c[24] = 1 Ant controlled by WL/BT */
1158 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
1159 u32tmp &= ~BIT23;
1160 u32tmp |= BIT24;
1161 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
1162 }
1163
1164 /* fixed internal switch S1->WiFi, S0->BT */
1165 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
1166 btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
1167 else
1168 btcoexist->btc_write_2byte(btcoexist, 0x948, 0x280);
1169
1170 switch (antpos_type) {
1171 case BTC_ANT_WIFI_AT_MAIN:
1172 /* ext switch main at wifi */
1173 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x92c,
1174 0x3, 0x1);
1175 break;
1176 case BTC_ANT_WIFI_AT_AUX:
1177 /* ext switch aux at wifi */
1178 btcoexist->btc_write_1byte_bitmask(btcoexist,
1179 0x92c, 0x3, 0x2);
1180 break;
1181 }
1182 } else {
1183 /* internal switch */
1184 if (init_hwcfg) {
1185 /* 0x4c[23] = 0, 0x4c[24] = 1 Ant controlled by WL/BT */
1186 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
1187 u32tmp |= BIT23;
1188 u32tmp &= ~BIT24;
1189 btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
1190 }
1191
1192 /* fixed ext switch, S1->Main, S0->Aux */
1193 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x64, 0x1, 0x0);
1194 switch (antpos_type) {
1195 case BTC_ANT_WIFI_AT_MAIN:
1196 /* fixed internal switch S1->WiFi, S0->BT */
1197 btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
1198 break;
1199 case BTC_ANT_WIFI_AT_AUX:
1200 /* fixed internal switch S0->WiFi, S1->BT */
1201 btcoexist->btc_write_2byte(btcoexist, 0x948, 0x280);
1202 break;
1203 }
1204 }
1205 }
1206
btc8723b2ant_ps_tdma(struct btc_coexist * btcoexist,bool force_exec,bool turn_on,u8 type)1207 static void btc8723b2ant_ps_tdma(struct btc_coexist *btcoexist, bool force_exec,
1208 bool turn_on, u8 type)
1209 {
1210 struct rtl_priv *rtlpriv = btcoexist->adapter;
1211 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1212 u8 wifi_rssi_state, bt_rssi_state;
1213 s8 wifi_duration_adjust = 0x0;
1214 u8 tdma_byte4_modify = 0x0;
1215 u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
1216 coex_dm->switch_thres_offset;
1217
1218 wifi_rssi_state = btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, tmp, 0);
1219 tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
1220 coex_dm->switch_thres_offset;
1221 bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
1222
1223 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1224 "[BTCoex], %s turn %s PS TDMA, type=%d\n",
1225 (force_exec ? "force to" : ""),
1226 (turn_on ? "ON" : "OFF"), type);
1227 coex_dm->cur_ps_tdma_on = turn_on;
1228 coex_dm->cur_ps_tdma = type;
1229
1230 if (!(BTC_RSSI_HIGH(wifi_rssi_state) &&
1231 BTC_RSSI_HIGH(bt_rssi_state)) && turn_on) {
1232 /* for WiFi RSSI low or BT RSSI low */
1233 type = type + 100;
1234 coex_dm->is_switch_to_1dot5_ant = true;
1235 } else {
1236 coex_dm->is_switch_to_1dot5_ant = false;
1237 }
1238
1239 if (!force_exec) {
1240 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1241 "[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n",
1242 coex_dm->pre_ps_tdma_on, coex_dm->cur_ps_tdma_on);
1243 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1244 "[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n",
1245 coex_dm->pre_ps_tdma, coex_dm->cur_ps_tdma);
1246
1247 if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1248 (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
1249 return;
1250 }
1251
1252 if (coex_sta->scan_ap_num <= 5) {
1253 if (coex_sta->a2dp_bit_pool >= 45)
1254 wifi_duration_adjust = -15;
1255 else if (coex_sta->a2dp_bit_pool >= 35)
1256 wifi_duration_adjust = -10;
1257 else
1258 wifi_duration_adjust = 5;
1259 } else if (coex_sta->scan_ap_num <= 20) {
1260 if (coex_sta->a2dp_bit_pool >= 45)
1261 wifi_duration_adjust = -15;
1262 else if (coex_sta->a2dp_bit_pool >= 35)
1263 wifi_duration_adjust = -10;
1264 else
1265 wifi_duration_adjust = 0;
1266 } else if (coex_sta->scan_ap_num <= 40) {
1267 if (coex_sta->a2dp_bit_pool >= 45)
1268 wifi_duration_adjust = -15;
1269 else if (coex_sta->a2dp_bit_pool >= 35)
1270 wifi_duration_adjust = -10;
1271 else
1272 wifi_duration_adjust = -5;
1273 } else {
1274 if (coex_sta->a2dp_bit_pool >= 45)
1275 wifi_duration_adjust = -15;
1276 else if (coex_sta->a2dp_bit_pool >= 35)
1277 wifi_duration_adjust = -10;
1278 else
1279 wifi_duration_adjust = -10;
1280 }
1281
1282 if ((bt_link_info->slave_role) && (bt_link_info->a2dp_exist))
1283 /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
1284 tdma_byte4_modify = 0x1;
1285
1286 if (turn_on) {
1287 switch (type) {
1288 case 1:
1289 default:
1290 btc8723b2ant_set_fw_ps_tdma(
1291 btcoexist, 0xe3, 0x3c,
1292 0x03, 0xf1, 0x90 | tdma_byte4_modify);
1293 break;
1294 case 2:
1295 btc8723b2ant_set_fw_ps_tdma(
1296 btcoexist, 0xe3, 0x2d,
1297 0x03, 0xf1, 0x90 | tdma_byte4_modify);
1298 break;
1299 case 3:
1300 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1301 0x3, 0xf1,
1302 0x90 | tdma_byte4_modify);
1303 break;
1304 case 4:
1305 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
1306 0x03, 0xf1,
1307 0x90 | tdma_byte4_modify);
1308 break;
1309 case 5:
1310 btc8723b2ant_set_fw_ps_tdma(
1311 btcoexist, 0xe3, 0x3c,
1312 0x3, 0x70, 0x90 | tdma_byte4_modify);
1313 break;
1314 case 6:
1315 btc8723b2ant_set_fw_ps_tdma(
1316 btcoexist, 0xe3, 0x2d,
1317 0x3, 0x70, 0x90 | tdma_byte4_modify);
1318 break;
1319 case 7:
1320 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1321 0x3, 0x70,
1322 0x90 | tdma_byte4_modify);
1323 break;
1324 case 8:
1325 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x10,
1326 0x3, 0x70,
1327 0x90 | tdma_byte4_modify);
1328 break;
1329 case 9:
1330 btc8723b2ant_set_fw_ps_tdma(
1331 btcoexist, 0xe3, 0x3c + wifi_duration_adjust,
1332 0x03, 0xf1, 0x90 | tdma_byte4_modify);
1333 break;
1334 case 10:
1335 btc8723b2ant_set_fw_ps_tdma(
1336 btcoexist, 0xe3, 0x2d,
1337 0x03, 0xf1, 0x90 | tdma_byte4_modify);
1338 break;
1339 case 11:
1340 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1341 0x3, 0xf1,
1342 0x90 | tdma_byte4_modify);
1343 break;
1344 case 12:
1345 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
1346 0x3, 0xf1,
1347 0x90 | tdma_byte4_modify);
1348 break;
1349 case 13:
1350 btc8723b2ant_set_fw_ps_tdma(
1351 btcoexist, 0xe3, 0x3c,
1352 0x3, 0x70, 0x90 | tdma_byte4_modify);
1353 break;
1354 case 14:
1355 btc8723b2ant_set_fw_ps_tdma(
1356 btcoexist, 0xe3, 0x2d,
1357 0x3, 0x70, 0x90 | tdma_byte4_modify);
1358 break;
1359 case 15:
1360 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
1361 0x3, 0x70,
1362 0x90 | tdma_byte4_modify);
1363 break;
1364 case 16:
1365 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
1366 0x3, 0x70,
1367 0x90 | tdma_byte4_modify);
1368 break;
1369 case 17:
1370 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x2f,
1371 0x2f, 0x60, 0x90);
1372 break;
1373 case 18:
1374 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5, 0x5,
1375 0xe1, 0x90);
1376 break;
1377 case 19:
1378 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1379 0x25, 0xe1, 0x90);
1380 break;
1381 case 20:
1382 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
1383 0x25, 0x60, 0x90);
1384 break;
1385 case 21:
1386 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1387 0x03, 0x70, 0x90);
1388 break;
1389
1390 case 23:
1391 case 123:
1392 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x35,
1393 0x03, 0x71, 0x10);
1394 break;
1395 case 71:
1396 btc8723b2ant_set_fw_ps_tdma(
1397 btcoexist, 0xe3, 0x3c + wifi_duration_adjust,
1398 0x03, 0xf1, 0x90);
1399 break;
1400 case 101:
1401 case 105:
1402 case 113:
1403 case 171:
1404 btc8723b2ant_set_fw_ps_tdma(
1405 btcoexist, 0xd3, 0x3a + wifi_duration_adjust,
1406 0x03, 0x70, 0x50 | tdma_byte4_modify);
1407 break;
1408 case 102:
1409 case 106:
1410 case 110:
1411 case 114:
1412 btc8723b2ant_set_fw_ps_tdma(
1413 btcoexist, 0xd3, 0x2d + wifi_duration_adjust,
1414 0x03, 0x70, 0x50 | tdma_byte4_modify);
1415 break;
1416 case 103:
1417 case 107:
1418 case 111:
1419 case 115:
1420 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1c,
1421 0x03, 0x70,
1422 0x50 | tdma_byte4_modify);
1423 break;
1424 case 104:
1425 case 108:
1426 case 112:
1427 case 116:
1428 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x10,
1429 0x03, 0x70,
1430 0x50 | tdma_byte4_modify);
1431 break;
1432 case 109:
1433 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x3c,
1434 0x03, 0xf1,
1435 0x90 | tdma_byte4_modify);
1436 break;
1437 case 121:
1438 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
1439 0x03, 0x70,
1440 0x90 | tdma_byte4_modify);
1441 break;
1442 case 22:
1443 case 122:
1444 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x35,
1445 0x03, 0x71, 0x11);
1446 break;
1447 }
1448 } else {
1449 /* disable PS tdma */
1450 switch (type) {
1451 case 0:
1452 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1453 0x40, 0x0);
1454 break;
1455 case 1:
1456 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1457 0x48, 0x0);
1458 break;
1459 default:
1460 btc8723b2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
1461 0x40, 0x0);
1462 break;
1463 }
1464 }
1465
1466 /* update pre state */
1467 coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1468 coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1469 }
1470
btc8723b2ant_ps_tdma_check_for_power_save_state(struct btc_coexist * btcoexist,bool new_ps_state)1471 static void btc8723b2ant_ps_tdma_check_for_power_save_state(
1472 struct btc_coexist *btcoexist, bool new_ps_state)
1473 {
1474 u8 lps_mode = 0x0;
1475
1476 btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1477
1478 if (lps_mode) {
1479 /* already under LPS state */
1480 if (new_ps_state) {
1481 /* keep state under LPS, do nothing. */
1482 } else {
1483 /* will leave LPS state, turn off psTdma first */
1484 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1485 }
1486 } else {
1487 /* NO PS state */
1488 if (new_ps_state) {
1489 /* will enter LPS state, turn off psTdma first */
1490 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1491 } else {
1492 /* keep state under NO PS state, do nothing. */
1493 }
1494 }
1495 }
1496
btc8723b2ant_power_save_state(struct btc_coexist * btcoexist,u8 ps_type,u8 lps_val,u8 rpwm_val)1497 static void btc8723b2ant_power_save_state(struct btc_coexist *btcoexist,
1498 u8 ps_type, u8 lps_val, u8 rpwm_val)
1499 {
1500 bool low_pwr_disable = false;
1501
1502 switch (ps_type) {
1503 case BTC_PS_WIFI_NATIVE:
1504 /* recover to original 32k low power setting */
1505 low_pwr_disable = false;
1506 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1507 &low_pwr_disable);
1508 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
1509 coex_sta->force_lps_on = false;
1510 break;
1511 case BTC_PS_LPS_ON:
1512 btc8723b2ant_ps_tdma_check_for_power_save_state(btcoexist,
1513 true);
1514 btc8723b2ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val,
1515 rpwm_val);
1516 /* when coex force to enter LPS, do not enter 32k low power */
1517 low_pwr_disable = true;
1518 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1519 &low_pwr_disable);
1520 /* power save must executed before psTdma */
1521 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
1522 coex_sta->force_lps_on = true;
1523 break;
1524 case BTC_PS_LPS_OFF:
1525 btc8723b2ant_ps_tdma_check_for_power_save_state(btcoexist,
1526 false);
1527 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
1528 coex_sta->force_lps_on = false;
1529 break;
1530 default:
1531 break;
1532 }
1533 }
1534
btc8723b2ant_coex_alloff(struct btc_coexist * btcoexist)1535 static void btc8723b2ant_coex_alloff(struct btc_coexist *btcoexist)
1536 {
1537 /* fw all off */
1538 btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1539 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1540 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1541 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1542
1543 /* sw all off */
1544 btc8723b2ant_sw_mechanism(btcoexist, false, false, false, false);
1545
1546 /* hw all off */
1547 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
1548 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1549 }
1550
btc8723b2ant_init_coex_dm(struct btc_coexist * btcoexist)1551 static void btc8723b2ant_init_coex_dm(struct btc_coexist *btcoexist)
1552 {
1553 /* force to reset coex mechanism*/
1554 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1555 btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1556
1557 btc8723b2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1);
1558 btc8723b2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
1559 btc8723b2ant_dec_bt_pwr(btcoexist, FORCE_EXEC, 0);
1560
1561 btc8723b2ant_sw_mechanism(btcoexist, false, false, false, false);
1562
1563 coex_sta->pop_event_cnt = 0;
1564 }
1565
btc8723b2ant_action_bt_inquiry(struct btc_coexist * btcoexist)1566 static void btc8723b2ant_action_bt_inquiry(struct btc_coexist *btcoexist)
1567 {
1568 struct rtl_priv *rtlpriv = btcoexist->adapter;
1569 bool wifi_connected = false;
1570 bool low_pwr_disable = true;
1571 bool scan = false, link = false, roam = false;
1572
1573 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1574 &low_pwr_disable);
1575 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1576 &wifi_connected);
1577
1578 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
1579 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
1580 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
1581
1582 btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1583
1584 if (coex_sta->bt_abnormal_scan) {
1585 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 23);
1586 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 3);
1587 } else if (scan || link || roam) {
1588 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1589 "[BTCoex], Wifi link process + BT Inq/Page!!\n");
1590 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);
1591 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1592 } else if (wifi_connected) {
1593 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1594 "[BTCoex], Wifi connected + BT Inq/Page!!\n");
1595 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);
1596 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1597 } else {
1598 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1599 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1600 }
1601 btc8723b2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
1602 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1603
1604 btc8723b2ant_sw_mechanism(btcoexist, false, false, false, false);
1605 }
1606
btc8723b2ant_action_wifi_link_process(struct btc_coexist * btcoexist)1607 static void btc8723b2ant_action_wifi_link_process(struct btc_coexist
1608 *btcoexist)
1609 {
1610 struct rtl_priv *rtlpriv = btcoexist->adapter;
1611 u32 u32tmp;
1612 u8 u8tmpa, u8tmpb;
1613
1614 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 15);
1615 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1616
1617 btc8723b2ant_sw_mechanism(btcoexist, false, false, false, false);
1618
1619 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
1620 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
1621 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x76e);
1622
1623 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1624 "[BTCoex], 0x948 = 0x%x, 0x765 = 0x%x, 0x76e = 0x%x\n",
1625 u32tmp, u8tmpa, u8tmpb);
1626 }
1627
btc8723b2ant_action_wifi_idle_process(struct btc_coexist * btcoexist)1628 static bool btc8723b2ant_action_wifi_idle_process(struct btc_coexist *btcoexist)
1629 {
1630 struct rtl_priv *rtlpriv = btcoexist->adapter;
1631 u8 wifi_rssi_state1;
1632 u8 ap_num = 0;
1633 u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
1634 coex_dm->switch_thres_offset - coex_dm->switch_thres_offset;
1635
1636 btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
1637 wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
1638 tmp, 0);
1639 tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
1640 coex_dm->switch_thres_offset - coex_dm->switch_thres_offset;
1641 btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
1642
1643 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
1644
1645 /* office environment */
1646 if (BTC_RSSI_HIGH(wifi_rssi_state1) && (coex_sta->hid_exist) &&
1647 (coex_sta->a2dp_exist)) {
1648 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1649 "[BTCoex], Wifi idle process for BT HID+A2DP exist!!\n");
1650
1651 btc8723b2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x6);
1652 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1653
1654 /* sw all off */
1655 btc8723b2ant_sw_mechanism(btcoexist, false, false, false,
1656 false);
1657 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1658 btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
1659 0x0, 0x0);
1660 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1661
1662 return true;
1663 }
1664
1665 btc8723b2ant_dac_swing(btcoexist, NORMAL_EXEC, true, 0x18);
1666 return false;
1667 }
1668
btc8723b2ant_is_common_action(struct btc_coexist * btcoexist)1669 static bool btc8723b2ant_is_common_action(struct btc_coexist *btcoexist)
1670 {
1671 struct rtl_priv *rtlpriv = btcoexist->adapter;
1672 bool common = false, wifi_connected = false;
1673 bool wifi_busy = false;
1674 bool bt_hs_on = false, low_pwr_disable = false;
1675
1676 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
1677 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1678 &wifi_connected);
1679 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1680
1681 if (!wifi_connected) {
1682 low_pwr_disable = false;
1683 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
1684 &low_pwr_disable);
1685 btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC,
1686 false, false, 0x8);
1687
1688 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1689 "[BTCoex], Wifi non-connected idle!!\n");
1690
1691 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
1692 0x0);
1693 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1694 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1695 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
1696 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1697
1698 btc8723b2ant_sw_mechanism(btcoexist, false, false, false,
1699 false);
1700
1701 common = true;
1702 } else {
1703 if (BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
1704 coex_dm->bt_status) {
1705 low_pwr_disable = false;
1706 btcoexist->btc_set(btcoexist,
1707 BTC_SET_ACT_DISABLE_LOW_POWER,
1708 &low_pwr_disable);
1709 btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC,
1710 false, false, 0x8);
1711
1712 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1713 "[BTCoex], Wifi connected + BT non connected-idle!!\n");
1714
1715 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
1716 0xfffff, 0x0);
1717 btc8723b2ant_coex_table_with_type(btcoexist,
1718 NORMAL_EXEC, 0);
1719 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1720 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
1721 0xb);
1722 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1723
1724 btc8723b2ant_sw_mechanism(btcoexist, false, false,
1725 false, false);
1726
1727 common = true;
1728 } else if (BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE ==
1729 coex_dm->bt_status) {
1730 low_pwr_disable = true;
1731 btcoexist->btc_set(btcoexist,
1732 BTC_SET_ACT_DISABLE_LOW_POWER,
1733 &low_pwr_disable);
1734
1735 if (bt_hs_on)
1736 return false;
1737 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1738 "[BTCoex], Wifi connected + BT connected-idle!!\n");
1739 btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC,
1740 false, false, 0x8);
1741
1742 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
1743 0xfffff, 0x0);
1744 btc8723b2ant_coex_table_with_type(btcoexist,
1745 NORMAL_EXEC, 0);
1746 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
1747 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
1748 0xb);
1749 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
1750
1751 btc8723b2ant_sw_mechanism(btcoexist, true, false,
1752 false, false);
1753
1754 common = true;
1755 } else {
1756 low_pwr_disable = true;
1757 btcoexist->btc_set(btcoexist,
1758 BTC_SET_ACT_DISABLE_LOW_POWER,
1759 &low_pwr_disable);
1760
1761 if (wifi_busy) {
1762 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1763 "[BTCoex], Wifi Connected-Busy + BT Busy!!\n");
1764 common = false;
1765 } else {
1766 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1767 "[BTCoex], Wifi Connected-Idle + BT Busy!!\n");
1768
1769 common =
1770 btc8723b2ant_action_wifi_idle_process(
1771 btcoexist);
1772 }
1773 }
1774 }
1775
1776 return common;
1777 }
1778
btc8723b2ant_tdma_duration_adjust(struct btc_coexist * btcoexist,bool sco_hid,bool tx_pause,u8 max_interval)1779 static void btc8723b2ant_tdma_duration_adjust(struct btc_coexist *btcoexist,
1780 bool sco_hid, bool tx_pause,
1781 u8 max_interval)
1782 {
1783 struct rtl_priv *rtlpriv = btcoexist->adapter;
1784 static s32 up, dn, m, n, wait_count;
1785 /*0: no change, +1: increase WiFi duration, -1: decrease WiFi duration*/
1786 s32 result;
1787 u8 retry_count = 0;
1788
1789 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1790 "[BTCoex], TdmaDurationAdjust()\n");
1791
1792 if (!coex_dm->auto_tdma_adjust) {
1793 coex_dm->auto_tdma_adjust = true;
1794 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1795 "[BTCoex], first run TdmaDurationAdjust()!!\n");
1796 if (sco_hid) {
1797 if (tx_pause) {
1798 if (max_interval == 1) {
1799 btc8723b2ant_ps_tdma(btcoexist,
1800 NORMAL_EXEC,
1801 true, 13);
1802 coex_dm->ps_tdma_du_adj_type = 13;
1803 } else if (max_interval == 2) {
1804 btc8723b2ant_ps_tdma(btcoexist,
1805 NORMAL_EXEC,
1806 true, 14);
1807 coex_dm->ps_tdma_du_adj_type = 14;
1808 } else if (max_interval == 3) {
1809 btc8723b2ant_ps_tdma(btcoexist,
1810 NORMAL_EXEC,
1811 true, 15);
1812 coex_dm->ps_tdma_du_adj_type = 15;
1813 } else {
1814 btc8723b2ant_ps_tdma(btcoexist,
1815 NORMAL_EXEC,
1816 true, 15);
1817 coex_dm->ps_tdma_du_adj_type = 15;
1818 }
1819 } else {
1820 if (max_interval == 1) {
1821 btc8723b2ant_ps_tdma(btcoexist,
1822 NORMAL_EXEC,
1823 true, 9);
1824 coex_dm->ps_tdma_du_adj_type = 9;
1825 } else if (max_interval == 2) {
1826 btc8723b2ant_ps_tdma(btcoexist,
1827 NORMAL_EXEC,
1828 true, 10);
1829 coex_dm->ps_tdma_du_adj_type = 10;
1830 } else if (max_interval == 3) {
1831 btc8723b2ant_ps_tdma(btcoexist,
1832 NORMAL_EXEC,
1833 true, 11);
1834 coex_dm->ps_tdma_du_adj_type = 11;
1835 } else {
1836 btc8723b2ant_ps_tdma(btcoexist,
1837 NORMAL_EXEC,
1838 true, 11);
1839 coex_dm->ps_tdma_du_adj_type = 11;
1840 }
1841 }
1842 } else {
1843 if (tx_pause) {
1844 if (max_interval == 1) {
1845 btc8723b2ant_ps_tdma(btcoexist,
1846 NORMAL_EXEC,
1847 true, 5);
1848 coex_dm->ps_tdma_du_adj_type = 5;
1849 } else if (max_interval == 2) {
1850 btc8723b2ant_ps_tdma(btcoexist,
1851 NORMAL_EXEC,
1852 true, 6);
1853 coex_dm->ps_tdma_du_adj_type = 6;
1854 } else if (max_interval == 3) {
1855 btc8723b2ant_ps_tdma(btcoexist,
1856 NORMAL_EXEC,
1857 true, 7);
1858 coex_dm->ps_tdma_du_adj_type = 7;
1859 } else {
1860 btc8723b2ant_ps_tdma(btcoexist,
1861 NORMAL_EXEC,
1862 true, 7);
1863 coex_dm->ps_tdma_du_adj_type = 7;
1864 }
1865 } else {
1866 if (max_interval == 1) {
1867 btc8723b2ant_ps_tdma(btcoexist,
1868 NORMAL_EXEC,
1869 true, 1);
1870 coex_dm->ps_tdma_du_adj_type = 1;
1871 } else if (max_interval == 2) {
1872 btc8723b2ant_ps_tdma(btcoexist,
1873 NORMAL_EXEC,
1874 true, 2);
1875 coex_dm->ps_tdma_du_adj_type = 2;
1876 } else if (max_interval == 3) {
1877 btc8723b2ant_ps_tdma(btcoexist,
1878 NORMAL_EXEC,
1879 true, 3);
1880 coex_dm->ps_tdma_du_adj_type = 3;
1881 } else {
1882 btc8723b2ant_ps_tdma(btcoexist,
1883 NORMAL_EXEC,
1884 true, 3);
1885 coex_dm->ps_tdma_du_adj_type = 3;
1886 }
1887 }
1888 }
1889
1890 up = 0;
1891 dn = 0;
1892 m = 1;
1893 n = 3;
1894 result = 0;
1895 wait_count = 0;
1896 } else {
1897 /*accquire the BT TRx retry count from BT_Info byte2*/
1898 retry_count = coex_sta->bt_retry_cnt;
1899
1900 if ((coex_sta->low_priority_tx) > 1050 ||
1901 (coex_sta->low_priority_rx) > 1250)
1902 retry_count++;
1903
1904 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1905 "[BTCoex], retry_count = %d\n", retry_count);
1906 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1907 "[BTCoex], up=%d, dn=%d, m=%d, n=%d, wait_count=%d\n",
1908 up, dn, m, n, wait_count);
1909 result = 0;
1910 wait_count++;
1911 /* no retry in the last 2-second duration*/
1912 if (retry_count == 0) {
1913 up++;
1914 dn--;
1915
1916 if (dn <= 0)
1917 dn = 0;
1918
1919 if (up >= n) {
1920 /* if retry count during continuous n*2
1921 * seconds is 0, enlarge WiFi duration
1922 */
1923 wait_count = 0;
1924 n = 3;
1925 up = 0;
1926 dn = 0;
1927 result = 1;
1928 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1929 "[BTCoex], Increase wifi duration!!\n");
1930 } /* <=3 retry in the last 2-second duration*/
1931 } else if (retry_count <= 3) {
1932 up--;
1933 dn++;
1934
1935 if (up <= 0)
1936 up = 0;
1937
1938 if (dn == 2) {
1939 /* if continuous 2 retry count(every 2
1940 * seconds) >0 and < 3, reduce WiFi duration
1941 */
1942 if (wait_count <= 2)
1943 /* avoid loop between the two levels */
1944 m++;
1945 else
1946 m = 1;
1947
1948 if (m >= 20)
1949 /* maximum of m = 20 ' will recheck if
1950 * need to adjust wifi duration in
1951 * maximum time interval 120 seconds
1952 */
1953 m = 20;
1954
1955 n = 3 * m;
1956 up = 0;
1957 dn = 0;
1958 wait_count = 0;
1959 result = -1;
1960 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1961 "[BTCoex], Decrease wifi duration for retry_counter<3!!\n");
1962 }
1963 } else {
1964 /* retry count > 3, once retry count > 3, to reduce
1965 * WiFi duration
1966 */
1967 if (wait_count == 1)
1968 /* to avoid loop between the two levels */
1969 m++;
1970 else
1971 m = 1;
1972
1973 if (m >= 20)
1974 /* maximum of m = 20 ' will recheck if need to
1975 * adjust wifi duration in maximum time interval
1976 * 120 seconds
1977 */
1978 m = 20;
1979
1980 n = 3 * m;
1981 up = 0;
1982 dn = 0;
1983 wait_count = 0;
1984 result = -1;
1985 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1986 "[BTCoex], Decrease wifi duration for retry_counter>3!!\n");
1987 }
1988
1989 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1990 "[BTCoex], max Interval = %d\n", max_interval);
1991 if (max_interval == 1) {
1992 if (tx_pause) {
1993 if (coex_dm->cur_ps_tdma == 71) {
1994 btc8723b2ant_ps_tdma(btcoexist,
1995 NORMAL_EXEC,
1996 true, 5);
1997 coex_dm->ps_tdma_du_adj_type = 5;
1998 } else if (coex_dm->cur_ps_tdma == 1) {
1999 btc8723b2ant_ps_tdma(btcoexist,
2000 NORMAL_EXEC,
2001 true, 5);
2002 coex_dm->ps_tdma_du_adj_type = 5;
2003 } else if (coex_dm->cur_ps_tdma == 2) {
2004 btc8723b2ant_ps_tdma(btcoexist,
2005 NORMAL_EXEC,
2006 true, 6);
2007 coex_dm->ps_tdma_du_adj_type = 6;
2008 } else if (coex_dm->cur_ps_tdma == 3) {
2009 btc8723b2ant_ps_tdma(btcoexist,
2010 NORMAL_EXEC,
2011 true, 7);
2012 coex_dm->ps_tdma_du_adj_type = 7;
2013 } else if (coex_dm->cur_ps_tdma == 4) {
2014 btc8723b2ant_ps_tdma(btcoexist,
2015 NORMAL_EXEC,
2016 true, 8);
2017 coex_dm->ps_tdma_du_adj_type = 8;
2018 }
2019 if (coex_dm->cur_ps_tdma == 9) {
2020 btc8723b2ant_ps_tdma(btcoexist,
2021 NORMAL_EXEC,
2022 true, 13);
2023 coex_dm->ps_tdma_du_adj_type = 13;
2024 } else if (coex_dm->cur_ps_tdma == 10) {
2025 btc8723b2ant_ps_tdma(btcoexist,
2026 NORMAL_EXEC,
2027 true, 14);
2028 coex_dm->ps_tdma_du_adj_type = 14;
2029 } else if (coex_dm->cur_ps_tdma == 11) {
2030 btc8723b2ant_ps_tdma(btcoexist,
2031 NORMAL_EXEC,
2032 true, 15);
2033 coex_dm->ps_tdma_du_adj_type = 15;
2034 } else if (coex_dm->cur_ps_tdma == 12) {
2035 btc8723b2ant_ps_tdma(btcoexist,
2036 NORMAL_EXEC,
2037 true, 16);
2038 coex_dm->ps_tdma_du_adj_type = 16;
2039 }
2040
2041 if (result == -1) {
2042 if (coex_dm->cur_ps_tdma == 5) {
2043 btc8723b2ant_ps_tdma(
2044 btcoexist, NORMAL_EXEC,
2045 true, 6);
2046 coex_dm->ps_tdma_du_adj_type =
2047 6;
2048 } else if (coex_dm->cur_ps_tdma == 6) {
2049 btc8723b2ant_ps_tdma(
2050 btcoexist, NORMAL_EXEC,
2051 true, 7);
2052 coex_dm->ps_tdma_du_adj_type =
2053 7;
2054 } else if (coex_dm->cur_ps_tdma == 7) {
2055 btc8723b2ant_ps_tdma(
2056 btcoexist, NORMAL_EXEC,
2057 true, 8);
2058 coex_dm->ps_tdma_du_adj_type =
2059 8;
2060 } else if (coex_dm->cur_ps_tdma == 13) {
2061 btc8723b2ant_ps_tdma(
2062 btcoexist, NORMAL_EXEC,
2063 true, 14);
2064 coex_dm->ps_tdma_du_adj_type =
2065 14;
2066 } else if (coex_dm->cur_ps_tdma == 14) {
2067 btc8723b2ant_ps_tdma(
2068 btcoexist, NORMAL_EXEC,
2069 true, 15);
2070 coex_dm->ps_tdma_du_adj_type =
2071 15;
2072 } else if (coex_dm->cur_ps_tdma == 15) {
2073 btc8723b2ant_ps_tdma(
2074 btcoexist, NORMAL_EXEC,
2075 true, 16);
2076 coex_dm->ps_tdma_du_adj_type =
2077 16;
2078 }
2079 } else if (result == 1) {
2080 if (coex_dm->cur_ps_tdma == 8) {
2081 btc8723b2ant_ps_tdma(
2082 btcoexist, NORMAL_EXEC,
2083 true, 7);
2084 coex_dm->ps_tdma_du_adj_type =
2085 7;
2086 } else if (coex_dm->cur_ps_tdma == 7) {
2087 btc8723b2ant_ps_tdma(
2088 btcoexist, NORMAL_EXEC,
2089 true, 6);
2090 coex_dm->ps_tdma_du_adj_type =
2091 6;
2092 } else if (coex_dm->cur_ps_tdma == 6) {
2093 btc8723b2ant_ps_tdma(
2094 btcoexist, NORMAL_EXEC,
2095 true, 5);
2096 coex_dm->ps_tdma_du_adj_type =
2097 5;
2098 } else if (coex_dm->cur_ps_tdma == 16) {
2099 btc8723b2ant_ps_tdma(
2100 btcoexist, NORMAL_EXEC,
2101 true, 15);
2102 coex_dm->ps_tdma_du_adj_type =
2103 15;
2104 } else if (coex_dm->cur_ps_tdma == 15) {
2105 btc8723b2ant_ps_tdma(
2106 btcoexist, NORMAL_EXEC,
2107 true, 14);
2108 coex_dm->ps_tdma_du_adj_type =
2109 14;
2110 } else if (coex_dm->cur_ps_tdma == 14) {
2111 btc8723b2ant_ps_tdma(
2112 btcoexist, NORMAL_EXEC,
2113 true, 13);
2114 coex_dm->ps_tdma_du_adj_type =
2115 13;
2116 }
2117 }
2118 } else {
2119 if (coex_dm->cur_ps_tdma == 5) {
2120 btc8723b2ant_ps_tdma(btcoexist,
2121 NORMAL_EXEC,
2122 true, 71);
2123 coex_dm->ps_tdma_du_adj_type = 71;
2124 } else if (coex_dm->cur_ps_tdma == 6) {
2125 btc8723b2ant_ps_tdma(btcoexist,
2126 NORMAL_EXEC,
2127 true, 2);
2128 coex_dm->ps_tdma_du_adj_type = 2;
2129 } else if (coex_dm->cur_ps_tdma == 7) {
2130 btc8723b2ant_ps_tdma(btcoexist,
2131 NORMAL_EXEC,
2132 true, 3);
2133 coex_dm->ps_tdma_du_adj_type = 3;
2134 } else if (coex_dm->cur_ps_tdma == 8) {
2135 btc8723b2ant_ps_tdma(btcoexist,
2136 NORMAL_EXEC,
2137 true, 4);
2138 coex_dm->ps_tdma_du_adj_type = 4;
2139 }
2140 if (coex_dm->cur_ps_tdma == 13) {
2141 btc8723b2ant_ps_tdma(btcoexist,
2142 NORMAL_EXEC,
2143 true, 9);
2144 coex_dm->ps_tdma_du_adj_type = 9;
2145 } else if (coex_dm->cur_ps_tdma == 14) {
2146 btc8723b2ant_ps_tdma(btcoexist,
2147 NORMAL_EXEC,
2148 true, 10);
2149 coex_dm->ps_tdma_du_adj_type = 10;
2150 } else if (coex_dm->cur_ps_tdma == 15) {
2151 btc8723b2ant_ps_tdma(btcoexist,
2152 NORMAL_EXEC,
2153 true, 11);
2154 coex_dm->ps_tdma_du_adj_type = 11;
2155 } else if (coex_dm->cur_ps_tdma == 16) {
2156 btc8723b2ant_ps_tdma(btcoexist,
2157 NORMAL_EXEC,
2158 true, 12);
2159 coex_dm->ps_tdma_du_adj_type = 12;
2160 }
2161
2162 if (result == -1) {
2163 if (coex_dm->cur_ps_tdma == 71) {
2164 btc8723b2ant_ps_tdma(
2165 btcoexist, NORMAL_EXEC,
2166 true, 1);
2167 coex_dm->ps_tdma_du_adj_type =
2168 1;
2169 } else if (coex_dm->cur_ps_tdma == 1) {
2170 btc8723b2ant_ps_tdma(
2171 btcoexist, NORMAL_EXEC,
2172 true, 2);
2173 coex_dm->ps_tdma_du_adj_type =
2174 2;
2175 } else if (coex_dm->cur_ps_tdma == 2) {
2176 btc8723b2ant_ps_tdma(
2177 btcoexist, NORMAL_EXEC,
2178 true, 3);
2179 coex_dm->ps_tdma_du_adj_type =
2180 3;
2181 } else if (coex_dm->cur_ps_tdma == 3) {
2182 btc8723b2ant_ps_tdma(
2183 btcoexist, NORMAL_EXEC,
2184 true, 4);
2185 coex_dm->ps_tdma_du_adj_type =
2186 4;
2187 } else if (coex_dm->cur_ps_tdma == 9) {
2188 btc8723b2ant_ps_tdma(
2189 btcoexist, NORMAL_EXEC,
2190 true, 10);
2191 coex_dm->ps_tdma_du_adj_type =
2192 10;
2193 } else if (coex_dm->cur_ps_tdma == 10) {
2194 btc8723b2ant_ps_tdma(
2195 btcoexist, NORMAL_EXEC,
2196 true, 11);
2197 coex_dm->ps_tdma_du_adj_type =
2198 11;
2199 } else if (coex_dm->cur_ps_tdma == 11) {
2200 btc8723b2ant_ps_tdma(
2201 btcoexist, NORMAL_EXEC,
2202 true, 12);
2203 coex_dm->ps_tdma_du_adj_type =
2204 12;
2205 }
2206 } else if (result == 1) {
2207 if (coex_dm->cur_ps_tdma == 4) {
2208 btc8723b2ant_ps_tdma(
2209 btcoexist, NORMAL_EXEC,
2210 true, 3);
2211 coex_dm->ps_tdma_du_adj_type =
2212 3;
2213 } else if (coex_dm->cur_ps_tdma == 3) {
2214 btc8723b2ant_ps_tdma(
2215 btcoexist, NORMAL_EXEC,
2216 true, 2);
2217 coex_dm->ps_tdma_du_adj_type =
2218 2;
2219 } else if (coex_dm->cur_ps_tdma == 2) {
2220 btc8723b2ant_ps_tdma(
2221 btcoexist, NORMAL_EXEC,
2222 true, 1);
2223 coex_dm->ps_tdma_du_adj_type =
2224 1;
2225 } else if (coex_dm->cur_ps_tdma == 1) {
2226 btc8723b2ant_ps_tdma(
2227 btcoexist, NORMAL_EXEC,
2228 true, 71);
2229 coex_dm->ps_tdma_du_adj_type =
2230 71;
2231 } else if (coex_dm->cur_ps_tdma == 12) {
2232 btc8723b2ant_ps_tdma(
2233 btcoexist, NORMAL_EXEC,
2234 true, 11);
2235 coex_dm->ps_tdma_du_adj_type =
2236 11;
2237 } else if (coex_dm->cur_ps_tdma == 11) {
2238 btc8723b2ant_ps_tdma(
2239 btcoexist, NORMAL_EXEC,
2240 true, 10);
2241 coex_dm->ps_tdma_du_adj_type =
2242 10;
2243 } else if (coex_dm->cur_ps_tdma == 10) {
2244 btc8723b2ant_ps_tdma(
2245 btcoexist, NORMAL_EXEC,
2246 true, 9);
2247 coex_dm->ps_tdma_du_adj_type =
2248 9;
2249 }
2250 }
2251 }
2252 } else if (max_interval == 2) {
2253 if (tx_pause) {
2254 if (coex_dm->cur_ps_tdma == 1) {
2255 btc8723b2ant_ps_tdma(btcoexist,
2256 NORMAL_EXEC,
2257 true, 6);
2258 coex_dm->ps_tdma_du_adj_type = 6;
2259 } else if (coex_dm->cur_ps_tdma == 2) {
2260 btc8723b2ant_ps_tdma(btcoexist,
2261 NORMAL_EXEC,
2262 true, 6);
2263 coex_dm->ps_tdma_du_adj_type = 6;
2264 } else if (coex_dm->cur_ps_tdma == 3) {
2265 btc8723b2ant_ps_tdma(btcoexist,
2266 NORMAL_EXEC,
2267 true, 7);
2268 coex_dm->ps_tdma_du_adj_type = 7;
2269 } else if (coex_dm->cur_ps_tdma == 4) {
2270 btc8723b2ant_ps_tdma(btcoexist,
2271 NORMAL_EXEC,
2272 true, 8);
2273 coex_dm->ps_tdma_du_adj_type = 8;
2274 }
2275 if (coex_dm->cur_ps_tdma == 9) {
2276 btc8723b2ant_ps_tdma(btcoexist,
2277 NORMAL_EXEC,
2278 true, 14);
2279 coex_dm->ps_tdma_du_adj_type = 14;
2280 } else if (coex_dm->cur_ps_tdma == 10) {
2281 btc8723b2ant_ps_tdma(btcoexist,
2282 NORMAL_EXEC,
2283 true, 14);
2284 coex_dm->ps_tdma_du_adj_type = 14;
2285 } else if (coex_dm->cur_ps_tdma == 11) {
2286 btc8723b2ant_ps_tdma(btcoexist,
2287 NORMAL_EXEC,
2288 true, 15);
2289 coex_dm->ps_tdma_du_adj_type = 15;
2290 } else if (coex_dm->cur_ps_tdma == 12) {
2291 btc8723b2ant_ps_tdma(btcoexist,
2292 NORMAL_EXEC,
2293 true, 16);
2294 coex_dm->ps_tdma_du_adj_type = 16;
2295 }
2296 if (result == -1) {
2297 if (coex_dm->cur_ps_tdma == 5) {
2298 btc8723b2ant_ps_tdma(
2299 btcoexist, NORMAL_EXEC,
2300 true, 6);
2301 coex_dm->ps_tdma_du_adj_type =
2302 6;
2303 } else if (coex_dm->cur_ps_tdma == 6) {
2304 btc8723b2ant_ps_tdma(
2305 btcoexist, NORMAL_EXEC,
2306 true, 7);
2307 coex_dm->ps_tdma_du_adj_type =
2308 7;
2309 } else if (coex_dm->cur_ps_tdma == 7) {
2310 btc8723b2ant_ps_tdma(
2311 btcoexist, NORMAL_EXEC,
2312 true, 8);
2313 coex_dm->ps_tdma_du_adj_type =
2314 8;
2315 } else if (coex_dm->cur_ps_tdma == 13) {
2316 btc8723b2ant_ps_tdma(
2317 btcoexist, NORMAL_EXEC,
2318 true, 14);
2319 coex_dm->ps_tdma_du_adj_type =
2320 14;
2321 } else if (coex_dm->cur_ps_tdma == 14) {
2322 btc8723b2ant_ps_tdma(
2323 btcoexist, NORMAL_EXEC,
2324 true, 15);
2325 coex_dm->ps_tdma_du_adj_type =
2326 15;
2327 } else if (coex_dm->cur_ps_tdma == 15) {
2328 btc8723b2ant_ps_tdma(
2329 btcoexist, NORMAL_EXEC,
2330 true, 16);
2331 coex_dm->ps_tdma_du_adj_type =
2332 16;
2333 }
2334 } else if (result == 1) {
2335 if (coex_dm->cur_ps_tdma == 8) {
2336 btc8723b2ant_ps_tdma(
2337 btcoexist, NORMAL_EXEC,
2338 true, 7);
2339 coex_dm->ps_tdma_du_adj_type =
2340 7;
2341 } else if (coex_dm->cur_ps_tdma == 7) {
2342 btc8723b2ant_ps_tdma(
2343 btcoexist, NORMAL_EXEC,
2344 true, 6);
2345 coex_dm->ps_tdma_du_adj_type =
2346 6;
2347 } else if (coex_dm->cur_ps_tdma == 6) {
2348 btc8723b2ant_ps_tdma(
2349 btcoexist, NORMAL_EXEC,
2350 true, 6);
2351 coex_dm->ps_tdma_du_adj_type =
2352 6;
2353 } else if (coex_dm->cur_ps_tdma == 16) {
2354 btc8723b2ant_ps_tdma(
2355 btcoexist, NORMAL_EXEC,
2356 true, 15);
2357 coex_dm->ps_tdma_du_adj_type =
2358 15;
2359 } else if (coex_dm->cur_ps_tdma == 15) {
2360 btc8723b2ant_ps_tdma(
2361 btcoexist, NORMAL_EXEC,
2362 true, 14);
2363 coex_dm->ps_tdma_du_adj_type =
2364 14;
2365 } else if (coex_dm->cur_ps_tdma == 14) {
2366 btc8723b2ant_ps_tdma(
2367 btcoexist, NORMAL_EXEC,
2368 true, 14);
2369 coex_dm->ps_tdma_du_adj_type =
2370 14;
2371 }
2372 }
2373 } else {
2374 if (coex_dm->cur_ps_tdma == 5) {
2375 btc8723b2ant_ps_tdma(btcoexist,
2376 NORMAL_EXEC,
2377 true, 2);
2378 coex_dm->ps_tdma_du_adj_type = 2;
2379 } else if (coex_dm->cur_ps_tdma == 6) {
2380 btc8723b2ant_ps_tdma(btcoexist,
2381 NORMAL_EXEC,
2382 true, 2);
2383 coex_dm->ps_tdma_du_adj_type = 2;
2384 } else if (coex_dm->cur_ps_tdma == 7) {
2385 btc8723b2ant_ps_tdma(btcoexist,
2386 NORMAL_EXEC,
2387 true, 3);
2388 coex_dm->ps_tdma_du_adj_type = 3;
2389 } else if (coex_dm->cur_ps_tdma == 8) {
2390 btc8723b2ant_ps_tdma(btcoexist,
2391 NORMAL_EXEC,
2392 true, 4);
2393 coex_dm->ps_tdma_du_adj_type = 4;
2394 }
2395 if (coex_dm->cur_ps_tdma == 13) {
2396 btc8723b2ant_ps_tdma(btcoexist,
2397 NORMAL_EXEC,
2398 true, 10);
2399 coex_dm->ps_tdma_du_adj_type = 10;
2400 } else if (coex_dm->cur_ps_tdma == 14) {
2401 btc8723b2ant_ps_tdma(btcoexist,
2402 NORMAL_EXEC,
2403 true, 10);
2404 coex_dm->ps_tdma_du_adj_type = 10;
2405 } else if (coex_dm->cur_ps_tdma == 15) {
2406 btc8723b2ant_ps_tdma(btcoexist,
2407 NORMAL_EXEC,
2408 true, 11);
2409 coex_dm->ps_tdma_du_adj_type = 11;
2410 } else if (coex_dm->cur_ps_tdma == 16) {
2411 btc8723b2ant_ps_tdma(btcoexist,
2412 NORMAL_EXEC,
2413 true, 12);
2414 coex_dm->ps_tdma_du_adj_type = 12;
2415 }
2416 if (result == -1) {
2417 if (coex_dm->cur_ps_tdma == 1) {
2418 btc8723b2ant_ps_tdma(
2419 btcoexist, NORMAL_EXEC,
2420 true, 2);
2421 coex_dm->ps_tdma_du_adj_type =
2422 2;
2423 } else if (coex_dm->cur_ps_tdma == 2) {
2424 btc8723b2ant_ps_tdma(
2425 btcoexist, NORMAL_EXEC,
2426 true, 3);
2427 coex_dm->ps_tdma_du_adj_type =
2428 3;
2429 } else if (coex_dm->cur_ps_tdma == 3) {
2430 btc8723b2ant_ps_tdma(
2431 btcoexist, NORMAL_EXEC,
2432 true, 4);
2433 coex_dm->ps_tdma_du_adj_type =
2434 4;
2435 } else if (coex_dm->cur_ps_tdma == 9) {
2436 btc8723b2ant_ps_tdma(
2437 btcoexist, NORMAL_EXEC,
2438 true, 10);
2439 coex_dm->ps_tdma_du_adj_type =
2440 10;
2441 } else if (coex_dm->cur_ps_tdma == 10) {
2442 btc8723b2ant_ps_tdma(
2443 btcoexist, NORMAL_EXEC,
2444 true, 11);
2445 coex_dm->ps_tdma_du_adj_type =
2446 11;
2447 } else if (coex_dm->cur_ps_tdma == 11) {
2448 btc8723b2ant_ps_tdma(
2449 btcoexist, NORMAL_EXEC,
2450 true, 12);
2451 coex_dm->ps_tdma_du_adj_type =
2452 12;
2453 }
2454 } else if (result == 1) {
2455 if (coex_dm->cur_ps_tdma == 4) {
2456 btc8723b2ant_ps_tdma(
2457 btcoexist, NORMAL_EXEC,
2458 true, 3);
2459 coex_dm->ps_tdma_du_adj_type =
2460 3;
2461 } else if (coex_dm->cur_ps_tdma == 3) {
2462 btc8723b2ant_ps_tdma(
2463 btcoexist, NORMAL_EXEC,
2464 true, 2);
2465 coex_dm->ps_tdma_du_adj_type =
2466 2;
2467 } else if (coex_dm->cur_ps_tdma == 2) {
2468 btc8723b2ant_ps_tdma(
2469 btcoexist, NORMAL_EXEC,
2470 true, 2);
2471 coex_dm->ps_tdma_du_adj_type =
2472 2;
2473 } else if (coex_dm->cur_ps_tdma == 12) {
2474 btc8723b2ant_ps_tdma(
2475 btcoexist, NORMAL_EXEC,
2476 true, 11);
2477 coex_dm->ps_tdma_du_adj_type =
2478 11;
2479 } else if (coex_dm->cur_ps_tdma == 11) {
2480 btc8723b2ant_ps_tdma(
2481 btcoexist, NORMAL_EXEC,
2482 true, 10);
2483 coex_dm->ps_tdma_du_adj_type =
2484 10;
2485 } else if (coex_dm->cur_ps_tdma == 10) {
2486 btc8723b2ant_ps_tdma(
2487 btcoexist, NORMAL_EXEC,
2488 true, 10);
2489 coex_dm->ps_tdma_du_adj_type =
2490 10;
2491 }
2492 }
2493 }
2494 } else if (max_interval == 3) {
2495 if (tx_pause) {
2496 if (coex_dm->cur_ps_tdma == 1) {
2497 btc8723b2ant_ps_tdma(btcoexist,
2498 NORMAL_EXEC,
2499 true, 7);
2500 coex_dm->ps_tdma_du_adj_type = 7;
2501 } else if (coex_dm->cur_ps_tdma == 2) {
2502 btc8723b2ant_ps_tdma(btcoexist,
2503 NORMAL_EXEC,
2504 true, 7);
2505 coex_dm->ps_tdma_du_adj_type = 7;
2506 } else if (coex_dm->cur_ps_tdma == 3) {
2507 btc8723b2ant_ps_tdma(btcoexist,
2508 NORMAL_EXEC,
2509 true, 7);
2510 coex_dm->ps_tdma_du_adj_type = 7;
2511 } else if (coex_dm->cur_ps_tdma == 4) {
2512 btc8723b2ant_ps_tdma(btcoexist,
2513 NORMAL_EXEC,
2514 true, 8);
2515 coex_dm->ps_tdma_du_adj_type = 8;
2516 }
2517 if (coex_dm->cur_ps_tdma == 9) {
2518 btc8723b2ant_ps_tdma(btcoexist,
2519 NORMAL_EXEC,
2520 true, 15);
2521 coex_dm->ps_tdma_du_adj_type = 15;
2522 } else if (coex_dm->cur_ps_tdma == 10) {
2523 btc8723b2ant_ps_tdma(btcoexist,
2524 NORMAL_EXEC,
2525 true, 15);
2526 coex_dm->ps_tdma_du_adj_type = 15;
2527 } else if (coex_dm->cur_ps_tdma == 11) {
2528 btc8723b2ant_ps_tdma(btcoexist,
2529 NORMAL_EXEC,
2530 true, 15);
2531 coex_dm->ps_tdma_du_adj_type = 15;
2532 } else if (coex_dm->cur_ps_tdma == 12) {
2533 btc8723b2ant_ps_tdma(btcoexist,
2534 NORMAL_EXEC,
2535 true, 16);
2536 coex_dm->ps_tdma_du_adj_type = 16;
2537 }
2538 if (result == -1) {
2539 if (coex_dm->cur_ps_tdma == 5) {
2540 btc8723b2ant_ps_tdma(
2541 btcoexist, NORMAL_EXEC,
2542 true, 7);
2543 coex_dm->ps_tdma_du_adj_type =
2544 7;
2545 } else if (coex_dm->cur_ps_tdma == 6) {
2546 btc8723b2ant_ps_tdma(
2547 btcoexist, NORMAL_EXEC,
2548 true, 7);
2549 coex_dm->ps_tdma_du_adj_type =
2550 7;
2551 } else if (coex_dm->cur_ps_tdma == 7) {
2552 btc8723b2ant_ps_tdma(
2553 btcoexist, NORMAL_EXEC,
2554 true, 8);
2555 coex_dm->ps_tdma_du_adj_type =
2556 8;
2557 } else if (coex_dm->cur_ps_tdma == 13) {
2558 btc8723b2ant_ps_tdma(
2559 btcoexist, NORMAL_EXEC,
2560 true, 15);
2561 coex_dm->ps_tdma_du_adj_type =
2562 15;
2563 } else if (coex_dm->cur_ps_tdma == 14) {
2564 btc8723b2ant_ps_tdma(
2565 btcoexist, NORMAL_EXEC,
2566 true, 15);
2567 coex_dm->ps_tdma_du_adj_type =
2568 15;
2569 } else if (coex_dm->cur_ps_tdma == 15) {
2570 btc8723b2ant_ps_tdma(
2571 btcoexist, NORMAL_EXEC,
2572 true, 16);
2573 coex_dm->ps_tdma_du_adj_type =
2574 16;
2575 }
2576 } else if (result == 1) {
2577 if (coex_dm->cur_ps_tdma == 8) {
2578 btc8723b2ant_ps_tdma(
2579 btcoexist, NORMAL_EXEC,
2580 true, 7);
2581 coex_dm->ps_tdma_du_adj_type =
2582 7;
2583 } else if (coex_dm->cur_ps_tdma == 7) {
2584 btc8723b2ant_ps_tdma(
2585 btcoexist, NORMAL_EXEC,
2586 true, 7);
2587 coex_dm->ps_tdma_du_adj_type =
2588 7;
2589 } else if (coex_dm->cur_ps_tdma == 6) {
2590 btc8723b2ant_ps_tdma(
2591 btcoexist, NORMAL_EXEC,
2592 true, 7);
2593 coex_dm->ps_tdma_du_adj_type =
2594 7;
2595 } else if (coex_dm->cur_ps_tdma == 16) {
2596 btc8723b2ant_ps_tdma(
2597 btcoexist, NORMAL_EXEC,
2598 true, 15);
2599 coex_dm->ps_tdma_du_adj_type =
2600 15;
2601 } else if (coex_dm->cur_ps_tdma == 15) {
2602 btc8723b2ant_ps_tdma(
2603 btcoexist, NORMAL_EXEC,
2604 true, 15);
2605 coex_dm->ps_tdma_du_adj_type =
2606 15;
2607 } else if (coex_dm->cur_ps_tdma == 14) {
2608 btc8723b2ant_ps_tdma(
2609 btcoexist, NORMAL_EXEC,
2610 true, 15);
2611 coex_dm->ps_tdma_du_adj_type =
2612 15;
2613 }
2614 }
2615 } else {
2616 if (coex_dm->cur_ps_tdma == 5) {
2617 btc8723b2ant_ps_tdma(btcoexist,
2618 NORMAL_EXEC,
2619 true, 3);
2620 coex_dm->ps_tdma_du_adj_type = 3;
2621 } else if (coex_dm->cur_ps_tdma == 6) {
2622 btc8723b2ant_ps_tdma(btcoexist,
2623 NORMAL_EXEC,
2624 true, 3);
2625 coex_dm->ps_tdma_du_adj_type = 3;
2626 } else if (coex_dm->cur_ps_tdma == 7) {
2627 btc8723b2ant_ps_tdma(btcoexist,
2628 NORMAL_EXEC,
2629 true, 3);
2630 coex_dm->ps_tdma_du_adj_type = 3;
2631 } else if (coex_dm->cur_ps_tdma == 8) {
2632 btc8723b2ant_ps_tdma(btcoexist,
2633 NORMAL_EXEC,
2634 true, 4);
2635 coex_dm->ps_tdma_du_adj_type = 4;
2636 }
2637 if (coex_dm->cur_ps_tdma == 13) {
2638 btc8723b2ant_ps_tdma(btcoexist,
2639 NORMAL_EXEC,
2640 true, 11);
2641 coex_dm->ps_tdma_du_adj_type = 11;
2642 } else if (coex_dm->cur_ps_tdma == 14) {
2643 btc8723b2ant_ps_tdma(btcoexist,
2644 NORMAL_EXEC,
2645 true, 11);
2646 coex_dm->ps_tdma_du_adj_type = 11;
2647 } else if (coex_dm->cur_ps_tdma == 15) {
2648 btc8723b2ant_ps_tdma(btcoexist,
2649 NORMAL_EXEC,
2650 true, 11);
2651 coex_dm->ps_tdma_du_adj_type = 11;
2652 } else if (coex_dm->cur_ps_tdma == 16) {
2653 btc8723b2ant_ps_tdma(btcoexist,
2654 NORMAL_EXEC,
2655 true, 12);
2656 coex_dm->ps_tdma_du_adj_type = 12;
2657 }
2658 if (result == -1) {
2659 if (coex_dm->cur_ps_tdma == 1) {
2660 btc8723b2ant_ps_tdma(
2661 btcoexist, NORMAL_EXEC,
2662 true, 3);
2663 coex_dm->ps_tdma_du_adj_type =
2664 3;
2665 } else if (coex_dm->cur_ps_tdma == 2) {
2666 btc8723b2ant_ps_tdma(
2667 btcoexist, NORMAL_EXEC,
2668 true, 3);
2669 coex_dm->ps_tdma_du_adj_type =
2670 3;
2671 } else if (coex_dm->cur_ps_tdma == 3) {
2672 btc8723b2ant_ps_tdma(
2673 btcoexist, NORMAL_EXEC,
2674 true, 4);
2675 coex_dm->ps_tdma_du_adj_type =
2676 4;
2677 } else if (coex_dm->cur_ps_tdma == 9) {
2678 btc8723b2ant_ps_tdma(
2679 btcoexist, NORMAL_EXEC,
2680 true, 11);
2681 coex_dm->ps_tdma_du_adj_type =
2682 11;
2683 } else if (coex_dm->cur_ps_tdma == 10) {
2684 btc8723b2ant_ps_tdma(
2685 btcoexist, NORMAL_EXEC,
2686 true, 11);
2687 coex_dm->ps_tdma_du_adj_type =
2688 11;
2689 } else if (coex_dm->cur_ps_tdma == 11) {
2690 btc8723b2ant_ps_tdma(
2691 btcoexist, NORMAL_EXEC,
2692 true, 12);
2693 coex_dm->ps_tdma_du_adj_type =
2694 12;
2695 }
2696 } else if (result == 1) {
2697 if (coex_dm->cur_ps_tdma == 4) {
2698 btc8723b2ant_ps_tdma(
2699 btcoexist, NORMAL_EXEC,
2700 true, 3);
2701 coex_dm->ps_tdma_du_adj_type =
2702 3;
2703 } else if (coex_dm->cur_ps_tdma == 3) {
2704 btc8723b2ant_ps_tdma(
2705 btcoexist, NORMAL_EXEC,
2706 true, 3);
2707 coex_dm->ps_tdma_du_adj_type =
2708 3;
2709 } else if (coex_dm->cur_ps_tdma == 2) {
2710 btc8723b2ant_ps_tdma(
2711 btcoexist, NORMAL_EXEC,
2712 true, 3);
2713 coex_dm->ps_tdma_du_adj_type =
2714 3;
2715 } else if (coex_dm->cur_ps_tdma == 12) {
2716 btc8723b2ant_ps_tdma(
2717 btcoexist, NORMAL_EXEC,
2718 true, 11);
2719 coex_dm->ps_tdma_du_adj_type =
2720 11;
2721 } else if (coex_dm->cur_ps_tdma == 11) {
2722 btc8723b2ant_ps_tdma(
2723 btcoexist, NORMAL_EXEC,
2724 true, 11);
2725 coex_dm->ps_tdma_du_adj_type =
2726 11;
2727 } else if (coex_dm->cur_ps_tdma == 10) {
2728 btc8723b2ant_ps_tdma(
2729 btcoexist, NORMAL_EXEC,
2730 true, 11);
2731 coex_dm->ps_tdma_du_adj_type =
2732 11;
2733 }
2734 }
2735 }
2736 }
2737 }
2738
2739 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2740 "[BTCoex], max Interval = %d\n", max_interval);
2741
2742 /* if current PsTdma not match with the recorded one (scan, dhcp, ...),
2743 * then we have to adjust it back to the previous recorded one.
2744 */
2745 if (coex_dm->cur_ps_tdma != coex_dm->ps_tdma_du_adj_type) {
2746 bool scan = false, link = false, roam = false;
2747 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2748 "[BTCoex], PsTdma type mismatch!!!, curPsTdma=%d, recordPsTdma=%d\n",
2749 coex_dm->cur_ps_tdma, coex_dm->ps_tdma_du_adj_type);
2750
2751 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2752 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2753 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2754
2755 if (!scan && !link && !roam)
2756 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
2757 coex_dm->ps_tdma_du_adj_type);
2758 else
2759 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
2760 "[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n");
2761 }
2762 }
2763
2764 /* SCO only or SCO+PAN(HS) */
btc8723b2ant_action_sco(struct btc_coexist * btcoexist)2765 static void btc8723b2ant_action_sco(struct btc_coexist *btcoexist)
2766 {
2767 u8 bt_rssi_state;
2768 u32 wifi_bw;
2769
2770 btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2771 bt_rssi_state = btc8723b2ant_bt_rssi_state(
2772 btcoexist, 2, BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
2773 coex_dm->switch_thres_offset,
2774 0);
2775
2776 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2777
2778 btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2779 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 4);
2780
2781 if (BTC_RSSI_HIGH(bt_rssi_state))
2782 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2783 else
2784 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2785
2786 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2787
2788 if (BTC_WIFI_BW_LEGACY == wifi_bw)
2789 /* for SCO quality at 11b/g mode */
2790 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
2791 else
2792 /* for SCO quality & wifi performance balance at 11n mode */
2793 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
2794
2795 /* for voice quality */
2796 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
2797
2798 /* sw mechanism */
2799 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2800 btc8723b2ant_sw_mechanism(btcoexist, true, true,
2801 false, false);
2802 } else {
2803 btc8723b2ant_sw_mechanism(btcoexist, false, true,
2804 false, false);
2805 }
2806 }
2807
btc8723b2ant_action_hid(struct btc_coexist * btcoexist)2808 static void btc8723b2ant_action_hid(struct btc_coexist *btcoexist)
2809 {
2810 u8 bt_rssi_state;
2811 u32 wifi_bw;
2812 u8 tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
2813 coex_dm->switch_thres_offset;
2814
2815 btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2816 bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
2817
2818 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2819
2820 btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2821 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2822
2823 if (BTC_RSSI_HIGH(bt_rssi_state))
2824 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2825 else
2826 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2827
2828 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2829
2830 if (wifi_bw == BTC_WIFI_BW_LEGACY)
2831 /* for HID at 11b/g mode */
2832 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2833 else
2834 /* for HID quality & wifi performance balance at 11n mode */
2835 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 9);
2836
2837 btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
2838
2839 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2840 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
2841 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
2842 else
2843 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
2844
2845 /* sw mechanism */
2846 if (wifi_bw == BTC_WIFI_BW_HT40)
2847 btc8723b2ant_sw_mechanism(btcoexist, true, true, false, false);
2848 else
2849 btc8723b2ant_sw_mechanism(btcoexist, false, true, false, false);
2850 }
2851
2852 /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
btc8723b2ant_action_a2dp(struct btc_coexist * btcoexist)2853 static void btc8723b2ant_action_a2dp(struct btc_coexist *btcoexist)
2854 {
2855 u8 wifi_rssi_state1, bt_rssi_state;
2856 u32 wifi_bw;
2857 u8 ap_num = 0;
2858 u8 tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
2859 coex_dm->switch_thres_offset;
2860
2861 btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2862 wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2, 40, 0);
2863 bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
2864
2865 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
2866
2867 /* define the office environment */
2868 /* driver don't know AP num in Linux, so we will never enter this if */
2869 if (ap_num >= 10 && BTC_RSSI_HIGH(wifi_rssi_state1)) {
2870 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
2871 0x0);
2872 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2873 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
2874 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2875 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
2876
2877 /* sw mechanism */
2878 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2879 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2880 btc8723b2ant_sw_mechanism(btcoexist, true, false,
2881 false, false);
2882 } else {
2883 btc8723b2ant_sw_mechanism(btcoexist, false, false,
2884 false, false);
2885 }
2886 return;
2887 }
2888
2889 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2890 btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2891
2892 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2893
2894 if (BTC_RSSI_HIGH(bt_rssi_state))
2895 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2896 else
2897 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2898
2899 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
2900 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2901 btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2902 0x0, 0x0);
2903 } else {
2904 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
2905 btc8723b2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
2906 0x4);
2907 }
2908
2909 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
2910 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
2911 btc8723b2ant_tdma_duration_adjust(btcoexist, false,
2912 false, 1);
2913 else
2914 btc8723b2ant_tdma_duration_adjust(btcoexist, false, true, 1);
2915
2916 /* sw mechanism */
2917 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2918 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2919 btc8723b2ant_sw_mechanism(btcoexist, true, false,
2920 false, false);
2921 } else {
2922 btc8723b2ant_sw_mechanism(btcoexist, false, false,
2923 false, false);
2924 }
2925 }
2926
btc8723b2ant_action_a2dp_pan_hs(struct btc_coexist * btcoexist)2927 static void btc8723b2ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)
2928 {
2929 u8 wifi_rssi_state1, bt_rssi_state;
2930 u32 wifi_bw;
2931 u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
2932 coex_dm->switch_thres_offset;
2933
2934 btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2935 wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
2936 tmp, 0);
2937 tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
2938 coex_dm->switch_thres_offset;
2939 bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
2940
2941 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2942
2943 btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2944 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2945
2946 if (BTC_RSSI_HIGH(bt_rssi_state))
2947 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2948 else
2949 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2950
2951 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
2952 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
2953 btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2954 0x0, 0x0);
2955 } else {
2956 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
2957 btc8723b2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
2958 0x4);
2959 }
2960
2961 btc8723b2ant_tdma_duration_adjust(btcoexist, false, true, 2);
2962
2963 /* sw mechanism */
2964 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2965 if (BTC_WIFI_BW_HT40 == wifi_bw) {
2966 btc8723b2ant_sw_mechanism(btcoexist, true, false,
2967 false, false);
2968 } else {
2969 btc8723b2ant_sw_mechanism(btcoexist, false, false,
2970 false, false);
2971 }
2972 }
2973
btc8723b2ant_action_pan_edr(struct btc_coexist * btcoexist)2974 static void btc8723b2ant_action_pan_edr(struct btc_coexist *btcoexist)
2975 {
2976 u8 wifi_rssi_state1, bt_rssi_state;
2977 u32 wifi_bw;
2978 u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
2979 coex_dm->switch_thres_offset;
2980
2981 btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
2982 wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
2983 tmp, 0);
2984 tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
2985 coex_dm->switch_thres_offset;
2986 bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
2987
2988 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2989
2990 btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
2991 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
2992
2993 if (BTC_RSSI_HIGH(bt_rssi_state))
2994 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
2995 else
2996 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
2997
2998 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
2999 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 10);
3000 btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3001 0x0, 0x0);
3002 } else {
3003 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 13);
3004 btc8723b2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3005 0x4);
3006 }
3007
3008 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3009 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
3010 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1);
3011 else
3012 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
3013
3014 /* sw mechanism */
3015 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3016 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3017 btc8723b2ant_sw_mechanism(btcoexist, true, false,
3018 false, false);
3019 } else {
3020 btc8723b2ant_sw_mechanism(btcoexist, false, false,
3021 false, false);
3022 }
3023 }
3024
3025 /* PAN(HS) only */
btc8723b2ant_action_pan_hs(struct btc_coexist * btcoexist)3026 static void btc8723b2ant_action_pan_hs(struct btc_coexist *btcoexist)
3027 {
3028 u8 bt_rssi_state;
3029 u32 wifi_bw;
3030 u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
3031 coex_dm->switch_thres_offset;
3032
3033 btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3034 btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
3035 tmp, 0);
3036 tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
3037 coex_dm->switch_thres_offset;
3038 bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
3039
3040 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3041
3042 btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3043 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3044
3045 if (BTC_RSSI_HIGH(bt_rssi_state))
3046 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3047 else
3048 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3049
3050 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3051 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3052
3053 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3054 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3055 btc8723b2ant_sw_mechanism(btcoexist, true, false,
3056 false, false);
3057 } else {
3058 btc8723b2ant_sw_mechanism(btcoexist, false, false,
3059 false, false);
3060 }
3061 }
3062
3063 /* PAN(EDR) + A2DP */
btc8723b2ant_action_pan_edr_a2dp(struct btc_coexist * btcoexist)3064 static void btc8723b2ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)
3065 {
3066 u8 wifi_rssi_state1, bt_rssi_state;
3067 u32 wifi_bw;
3068 u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
3069 coex_dm->switch_thres_offset;
3070
3071 btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3072 wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
3073 tmp, 0);
3074 tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
3075 coex_dm->switch_thres_offset;
3076 bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
3077
3078 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3079
3080 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3081
3082 if (BTC_RSSI_HIGH(bt_rssi_state))
3083 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3084 else
3085 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3086
3087 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state))
3088 btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3089 0x0, 0x0);
3090 else
3091 btc8723b2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3092 0x4);
3093 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3094
3095 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3096 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3097 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 12);
3098 if (BTC_WIFI_BW_HT40 == wifi_bw)
3099 btc8723b2ant_tdma_duration_adjust(btcoexist, false,
3100 true, 3);
3101 else
3102 btc8723b2ant_tdma_duration_adjust(btcoexist, false,
3103 false, 3);
3104 } else {
3105 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3106 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
3107 }
3108
3109 /* sw mechanism */
3110 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3111 btc8723b2ant_sw_mechanism(btcoexist, true, false,
3112 false, false);
3113 } else {
3114 btc8723b2ant_sw_mechanism(btcoexist, false, false,
3115 false, false);
3116 }
3117 }
3118
btc8723b2ant_action_pan_edr_hid(struct btc_coexist * btcoexist)3119 static void btc8723b2ant_action_pan_edr_hid(struct btc_coexist *btcoexist)
3120 {
3121 u8 wifi_rssi_state1, bt_rssi_state;
3122 u32 wifi_bw;
3123 u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
3124 coex_dm->switch_thres_offset;
3125
3126 btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3127 wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
3128 tmp, 0);
3129 tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
3130 coex_dm->switch_thres_offset;
3131 bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
3132 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3133
3134 btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3135
3136 if (BTC_RSSI_HIGH(bt_rssi_state))
3137 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3138 else
3139 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3140
3141 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
3142 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3143 btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3144 0x0, 0x0);
3145 } else {
3146 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 14);
3147 btc8723b2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3148 0x4);
3149 }
3150
3151 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3152 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3153 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3154 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
3155 3);
3156 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
3157 0xfffff, 0x780);
3158 } else {
3159 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
3160 6);
3161 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
3162 0xfffff, 0x0);
3163 }
3164 btc8723b2ant_tdma_duration_adjust(btcoexist, true, false, 2);
3165 } else {
3166 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3167 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
3168 0x0);
3169 btc8723b2ant_tdma_duration_adjust(btcoexist, true, true, 2);
3170 }
3171
3172 /* sw mechanism */
3173 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3174 btc8723b2ant_sw_mechanism(btcoexist, true, true,
3175 false, false);
3176 } else {
3177 btc8723b2ant_sw_mechanism(btcoexist, false, true,
3178 false, false);
3179 }
3180 }
3181
3182 /* HID + A2DP + PAN(EDR) */
btc8723b2ant_action_hid_a2dp_pan_edr(struct btc_coexist * btcoexist)3183 static void btc8723b2ant_action_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)
3184 {
3185 u8 wifi_rssi_state1, bt_rssi_state;
3186 u32 wifi_bw;
3187 u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
3188 coex_dm->switch_thres_offset;
3189
3190 btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3191 wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
3192 tmp, 0);
3193 tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
3194 coex_dm->switch_thres_offset;
3195 bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 2, tmp, 0);
3196
3197 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3198
3199 btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 0x8);
3200 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3201
3202 if (BTC_RSSI_HIGH(bt_rssi_state))
3203 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3204 else
3205 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3206
3207 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
3208 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3209 btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3210 0x0, 0x0);
3211 } else {
3212 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 14);
3213 btc8723b2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3214 0x4);
3215 }
3216
3217 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3218
3219
3220 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
3221 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
3222 if (BTC_WIFI_BW_HT40 == wifi_bw)
3223 btc8723b2ant_tdma_duration_adjust(btcoexist, true,
3224 true, 2);
3225 else
3226 btc8723b2ant_tdma_duration_adjust(btcoexist, true,
3227 false, 3);
3228 } else {
3229 btc8723b2ant_tdma_duration_adjust(btcoexist, true, true, 3);
3230 }
3231
3232 /* sw mechanism */
3233 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3234 btc8723b2ant_sw_mechanism(btcoexist, true, true,
3235 false, false);
3236 } else {
3237 btc8723b2ant_sw_mechanism(btcoexist, false, true,
3238 false, false);
3239 }
3240 }
3241
btc8723b2ant_action_hid_a2dp(struct btc_coexist * btcoexist)3242 static void btc8723b2ant_action_hid_a2dp(struct btc_coexist *btcoexist)
3243 {
3244 u8 wifi_rssi_state1, bt_rssi_state;
3245 u32 wifi_bw;
3246 u8 ap_num = 0;
3247 u8 tmp = BT_8723B_2ANT_WIFI_RSSI_COEXSWITCH_THRES -
3248 coex_dm->switch_thres_offset;
3249
3250 btc8723b2ant_wifi_rssi_state(btcoexist, 0, 2, 15, 0);
3251 wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist, 1, 2,
3252 tmp, 0);
3253 tmp = BT_8723B_2ANT_BT_RSSI_COEXSWITCH_THRES -
3254 coex_dm->switch_thres_offset;
3255 bt_rssi_state = btc8723b2ant_bt_rssi_state(btcoexist, 3, tmp, 37);
3256
3257 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
3258
3259 btc8723b2ant_limited_rx(btcoexist, NORMAL_EXEC, false, true, 0x5);
3260 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3261
3262 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3263
3264 if (wifi_bw == BTC_WIFI_BW_LEGACY) {
3265 if (BTC_RSSI_HIGH(bt_rssi_state))
3266 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3267 else if (BTC_RSSI_MEDIUM(bt_rssi_state))
3268 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3269 else
3270 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3271 } else {
3272 /* only 802.11N mode we have to dec bt power to 4 degree */
3273 if (BTC_RSSI_HIGH(bt_rssi_state)) {
3274 /* need to check ap Number of Not */
3275 if (ap_num < 10)
3276 btc8723b2ant_dec_bt_pwr(btcoexist,
3277 NORMAL_EXEC, 4);
3278 else
3279 btc8723b2ant_dec_bt_pwr(btcoexist,
3280 NORMAL_EXEC, 2);
3281 } else if (BTC_RSSI_MEDIUM(bt_rssi_state)) {
3282 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
3283 } else {
3284 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3285 }
3286 }
3287
3288 if (BTC_RSSI_HIGH(wifi_rssi_state1) && BTC_RSSI_HIGH(bt_rssi_state)) {
3289 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 7);
3290 btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
3291 0x0, 0x0);
3292 } else {
3293 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 14);
3294 btc8723b2ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50,
3295 0x4);
3296 }
3297
3298 if (BTC_RSSI_HIGH(bt_rssi_state)) {
3299 if (ap_num < 10)
3300 btc8723b2ant_tdma_duration_adjust(btcoexist, true,
3301 false, 1);
3302 else
3303 btc8723b2ant_tdma_duration_adjust(btcoexist, true,
3304 false, 3);
3305 } else {
3306 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 18);
3307 btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);
3308 btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);
3309 btcoexist->btc_write_4byte(btcoexist, 0x430, 0x0);
3310 btcoexist->btc_write_4byte(btcoexist, 0x434, 0x01010000);
3311
3312 if (ap_num < 10)
3313 btc8723b2ant_tdma_duration_adjust(btcoexist, true,
3314 true, 1);
3315 else
3316 btc8723b2ant_tdma_duration_adjust(btcoexist, true,
3317 true, 3);
3318 }
3319
3320 /* sw mechanism */
3321 if (BTC_WIFI_BW_HT40 == wifi_bw) {
3322 btc8723b2ant_sw_mechanism(btcoexist, true, true,
3323 false, false);
3324 } else {
3325 btc8723b2ant_sw_mechanism(btcoexist, false, true,
3326 false, false);
3327 }
3328 }
3329
btc8723b2ant_action_wifi_multi_port(struct btc_coexist * btcoexist)3330 static void btc8723b2ant_action_wifi_multi_port(struct btc_coexist *btcoexist)
3331 {
3332 btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
3333 btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
3334
3335 /* sw all off */
3336 btc8723b2ant_sw_mechanism(btcoexist, false, false, false, false);
3337
3338 /* hw all off */
3339 btc8723b2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
3340
3341 btc8723b2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
3342 btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
3343 }
3344
btc8723b2ant_run_coexist_mechanism(struct btc_coexist * btcoexist)3345 static void btc8723b2ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
3346 {
3347 struct rtl_priv *rtlpriv = btcoexist->adapter;
3348 u8 algorithm = 0;
3349 u32 num_of_wifi_link = 0;
3350 u32 wifi_link_status = 0;
3351 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3352 bool miracast_plus_bt = false;
3353 bool scan = false, link = false, roam = false;
3354
3355 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3356 "[BTCoex], RunCoexistMechanism()===>\n");
3357
3358 if (btcoexist->manual_control) {
3359 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3360 "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
3361 return;
3362 }
3363
3364 if (coex_sta->under_ips) {
3365 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3366 "[BTCoex], wifi is under IPS !!!\n");
3367 return;
3368 }
3369
3370 algorithm = btc8723b2ant_action_algorithm(btcoexist);
3371 if (coex_sta->c2h_bt_inquiry_page &&
3372 (BT_8723B_2ANT_COEX_ALGO_PANHS != algorithm)) {
3373 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3374 "[BTCoex], BT is under inquiry/page scan !!\n");
3375 btc8723b2ant_action_bt_inquiry(btcoexist);
3376 return;
3377 }
3378
3379 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3380 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3381 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3382
3383 if (scan || link || roam) {
3384 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3385 "[BTCoex], WiFi is under Link Process !!\n");
3386 btc8723b2ant_action_wifi_link_process(btcoexist);
3387 return;
3388 }
3389
3390 /* for P2P */
3391 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
3392 &wifi_link_status);
3393 num_of_wifi_link = wifi_link_status >> 16;
3394
3395 if ((num_of_wifi_link >= 2) ||
3396 (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {
3397 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3398 "############# [BTCoex], Multi-Port num_of_wifi_link = %d, wifi_link_status = 0x%x\n",
3399 num_of_wifi_link, wifi_link_status);
3400
3401 if (bt_link_info->bt_link_exist)
3402 miracast_plus_bt = true;
3403 else
3404 miracast_plus_bt = false;
3405
3406 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3407 &miracast_plus_bt);
3408 btc8723b2ant_action_wifi_multi_port(btcoexist);
3409
3410 return;
3411 }
3412
3413 miracast_plus_bt = false;
3414 btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
3415 &miracast_plus_bt);
3416
3417 coex_dm->cur_algorithm = algorithm;
3418 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3419 "[BTCoex], Algorithm = %d\n",
3420 coex_dm->cur_algorithm);
3421
3422 if (btc8723b2ant_is_common_action(btcoexist)) {
3423 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3424 "[BTCoex], Action 2-Ant common\n");
3425 coex_dm->auto_tdma_adjust = false;
3426 } else {
3427 if (coex_dm->cur_algorithm != coex_dm->pre_algorithm) {
3428 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3429 "[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n",
3430 coex_dm->pre_algorithm,
3431 coex_dm->cur_algorithm);
3432 coex_dm->auto_tdma_adjust = false;
3433 }
3434 switch (coex_dm->cur_algorithm) {
3435 case BT_8723B_2ANT_COEX_ALGO_SCO:
3436 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3437 "[BTCoex], Action 2-Ant, algorithm = SCO\n");
3438 btc8723b2ant_action_sco(btcoexist);
3439 break;
3440 case BT_8723B_2ANT_COEX_ALGO_HID:
3441 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3442 "[BTCoex], Action 2-Ant, algorithm = HID\n");
3443 btc8723b2ant_action_hid(btcoexist);
3444 break;
3445 case BT_8723B_2ANT_COEX_ALGO_A2DP:
3446 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3447 "[BTCoex], Action 2-Ant, algorithm = A2DP\n");
3448 btc8723b2ant_action_a2dp(btcoexist);
3449 break;
3450 case BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS:
3451 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3452 "[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS)\n");
3453 btc8723b2ant_action_a2dp_pan_hs(btcoexist);
3454 break;
3455 case BT_8723B_2ANT_COEX_ALGO_PANEDR:
3456 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3457 "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)\n");
3458 btc8723b2ant_action_pan_edr(btcoexist);
3459 break;
3460 case BT_8723B_2ANT_COEX_ALGO_PANHS:
3461 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3462 "[BTCoex], Action 2-Ant, algorithm = HS mode\n");
3463 btc8723b2ant_action_pan_hs(btcoexist);
3464 break;
3465 case BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP:
3466 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3467 "[BTCoex], Action 2-Ant, algorithm = PAN+A2DP\n");
3468 btc8723b2ant_action_pan_edr_a2dp(btcoexist);
3469 break;
3470 case BT_8723B_2ANT_COEX_ALGO_PANEDR_HID:
3471 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3472 "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID\n");
3473 btc8723b2ant_action_pan_edr_hid(btcoexist);
3474 break;
3475 case BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
3476 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3477 "[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN\n");
3478 btc8723b2ant_action_hid_a2dp_pan_edr(btcoexist);
3479 break;
3480 case BT_8723B_2ANT_COEX_ALGO_HID_A2DP:
3481 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3482 "[BTCoex], Action 2-Ant, algorithm = HID+A2DP\n");
3483 btc8723b2ant_action_hid_a2dp(btcoexist);
3484 break;
3485 default:
3486 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3487 "[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n");
3488 btc8723b2ant_coex_alloff(btcoexist);
3489 break;
3490 }
3491 coex_dm->pre_algorithm = coex_dm->cur_algorithm;
3492 }
3493 }
3494
btc8723b2ant_wifioff_hwcfg(struct btc_coexist * btcoexist)3495 static void btc8723b2ant_wifioff_hwcfg(struct btc_coexist *btcoexist)
3496 {
3497 bool is_in_mp_mode = false;
3498 u8 h2c_parameter[2] = {0};
3499 u32 fw_ver = 0;
3500
3501 /* set wlan_act to low */
3502 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
3503
3504 /* WiFi standby while GNT_BT 0 -> 1 */
3505 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);
3506
3507 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3508 if (fw_ver >= 0x180000) {
3509 /* Use H2C to set GNT_BT to HIGH */
3510 h2c_parameter[0] = 1;
3511 btcoexist->btc_fill_h2c(btcoexist, 0x6E, 1, h2c_parameter);
3512 } else {
3513 btcoexist->btc_write_1byte(btcoexist, 0x765, 0x18);
3514 }
3515
3516 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE,
3517 &is_in_mp_mode);
3518 if (!is_in_mp_mode)
3519 /* BT select s0/s1 is controlled by BT */
3520 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x0);
3521 else
3522 /* BT select s0/s1 is controlled by WiFi */
3523 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x1);
3524 }
3525
3526 /*********************************************************************
3527 * extern function start with ex_btc8723b2ant_
3528 *********************************************************************/
ex_btc8723b2ant_init_hwconfig(struct btc_coexist * btcoexist)3529 void ex_btc8723b2ant_init_hwconfig(struct btc_coexist *btcoexist)
3530 {
3531 struct rtl_priv *rtlpriv = btcoexist->adapter;
3532 u8 u8tmp = 0;
3533
3534 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3535 "[BTCoex], 2Ant Init HW Config!!\n");
3536 coex_dm->bt_rf0x1e_backup =
3537 btcoexist->btc_get_rf_reg(btcoexist, BTC_RF_A, 0x1e, 0xfffff);
3538
3539 /* 0x790[5:0] = 0x5 */
3540 u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
3541 u8tmp &= 0xc0;
3542 u8tmp |= 0x5;
3543 btcoexist->btc_write_1byte(btcoexist, 0x790, u8tmp);
3544
3545 /* Antenna config */
3546 btc8723b2ant_set_ant_path(btcoexist, BTC_ANT_WIFI_AT_MAIN,
3547 true, false);
3548 coex_sta->dis_ver_info_cnt = 0;
3549
3550 /* PTA parameter */
3551 btc8723b2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
3552
3553 /* Enable counter statistics */
3554 /* 0x76e[3] = 1, WLAN_ACT controlled by PTA */
3555 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
3556 btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
3557 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
3558 btcoexist->auto_report_2ant = true;
3559 }
3560
ex_btc8723b2ant_power_on_setting(struct btc_coexist * btcoexist)3561 void ex_btc8723b2ant_power_on_setting(struct btc_coexist *btcoexist)
3562 {
3563 struct btc_board_info *board_info = &btcoexist->board_info;
3564 u16 u16tmp = 0x0;
3565 u32 value = 0;
3566
3567 btcoexist->btc_write_1byte(btcoexist, 0x67, 0x20);
3568
3569 /* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly */
3570 u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2);
3571 btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT0 | BIT1);
3572
3573 btcoexist->btc_write_4byte(btcoexist, 0x948, 0x0);
3574
3575 if (btcoexist->chip_interface == BTC_INTF_USB) {
3576 /* fixed at S0 for USB interface */
3577 board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
3578 } else {
3579 /* for PCIE and SDIO interface, we check efuse 0xc3[6] */
3580 if (board_info->single_ant_path == 0) {
3581 /* set to S1 */
3582 board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
3583 } else if (board_info->single_ant_path == 1) {
3584 /* set to S0 */
3585 board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
3586 }
3587 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ANTPOSREGRISTRY_CTRL,
3588 &value);
3589 }
3590 }
3591
ex_btc8723b2ant_pre_load_firmware(struct btc_coexist * btcoexist)3592 void ex_btc8723b2ant_pre_load_firmware(struct btc_coexist *btcoexist)
3593 {
3594 struct btc_board_info *board_info = &btcoexist->board_info;
3595 u8 u8tmp = 0x4; /* Set BIT2 by default since it's 2ant case */
3596
3597 /**
3598 * S0 or S1 setting and Local register setting(By this fw can get
3599 * ant number, S0/S1, ... info)
3600 *
3601 * Local setting bit define
3602 * BIT0: "0" : no antenna inverse; "1" : antenna inverse
3603 * BIT1: "0" : internal switch; "1" : external switch
3604 * BIT2: "0" : one antenna; "1" : two antennas
3605 *
3606 * NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and
3607 * BIT2 = 0
3608 */
3609 if (btcoexist->chip_interface == BTC_INTF_USB) {
3610 /* fixed at S0 for USB interface */
3611 u8tmp |= 0x1; /* antenna inverse */
3612 btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
3613 } else {
3614 /* for PCIE and SDIO interface, we check efuse 0xc3[6] */
3615 if (board_info->single_ant_path == 0) {
3616 } else if (board_info->single_ant_path == 1) {
3617 /* set to S0 */
3618 u8tmp |= 0x1; /* antenna inverse */
3619 }
3620
3621 if (btcoexist->chip_interface == BTC_INTF_PCI)
3622 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x384,
3623 u8tmp);
3624 else if (btcoexist->chip_interface == BTC_INTF_SDIO)
3625 btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60,
3626 u8tmp);
3627 }
3628 }
3629
ex_btc8723b2ant_init_coex_dm(struct btc_coexist * btcoexist)3630 void ex_btc8723b2ant_init_coex_dm(struct btc_coexist *btcoexist)
3631 {
3632 struct rtl_priv *rtlpriv = btcoexist->adapter;
3633
3634 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3635 "[BTCoex], Coex Mechanism Init!!\n");
3636 btc8723b2ant_init_coex_dm(btcoexist);
3637 }
3638
ex_btc8723b2ant_display_coex_info(struct btc_coexist * btcoexist,struct seq_file * m)3639 void ex_btc8723b2ant_display_coex_info(struct btc_coexist *btcoexist,
3640 struct seq_file *m)
3641 {
3642 struct btc_board_info *board_info = &btcoexist->board_info;
3643 struct btc_stack_info *stack_info = &btcoexist->stack_info;
3644 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
3645 u8 u8tmp[4], i, bt_info_ext, ps_tdma_case = 0;
3646 u32 u32tmp[4];
3647 bool roam = false, scan = false;
3648 bool link = false, wifi_under_5g = false;
3649 bool bt_hs_on = false, wifi_busy = false;
3650 s32 wifi_rssi = 0, bt_hs_rssi = 0;
3651 u32 wifi_bw, wifi_traffic_dir, fa_ofdm, fa_cck;
3652 u8 wifi_dot11_chnl, wifi_hs_chnl;
3653 u32 fw_ver = 0, bt_patch_ver = 0;
3654 u8 ap_num = 0;
3655
3656 seq_puts(m, "\n ============[BT Coexist info]============");
3657
3658 if (btcoexist->manual_control) {
3659 seq_puts(m, "\n ==========[Under Manual Control]============");
3660 seq_puts(m, "\n ==========================================");
3661 }
3662
3663 seq_printf(m, "\n %-35s = %d/ %d ",
3664 "Ant PG number/ Ant mechanism:",
3665 board_info->pg_ant_num, board_info->btdm_ant_num);
3666
3667 seq_printf(m, "\n %-35s = %s / %d",
3668 "BT stack/ hci ext ver",
3669 ((stack_info->profile_notified) ? "Yes" : "No"),
3670 stack_info->hci_version);
3671
3672 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
3673 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
3674 seq_printf(m, "\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
3675 "CoexVer/ FwVer/ PatchVer",
3676 glcoex_ver_date_8723b_2ant, glcoex_ver_8723b_2ant,
3677 fw_ver, bt_patch_ver, bt_patch_ver);
3678
3679 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3680 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
3681 &wifi_dot11_chnl);
3682 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);
3683
3684 seq_printf(m, "\n %-35s = %d / %d(%d)",
3685 "Dot11 channel / HsChnl(HsMode)",
3686 wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);
3687
3688 seq_printf(m, "\n %-35s = %3ph ",
3689 "H2C Wifi inform bt chnl Info", coex_dm->wifi_chnl_info);
3690
3691 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
3692 btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
3693 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
3694 seq_printf(m, "\n %-35s = %d/ %d/ %d",
3695 "Wifi rssi/ HS rssi/ AP#", wifi_rssi, bt_hs_rssi, ap_num);
3696
3697 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3698 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3699 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3700 seq_printf(m, "\n %-35s = %d/ %d/ %d ",
3701 "Wifi link/ roam/ scan", link, roam, scan);
3702
3703 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
3704 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3705 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3706 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
3707 &wifi_traffic_dir);
3708 seq_printf(m, "\n %-35s = %s / %s/ %s ",
3709 "Wifi status", (wifi_under_5g ? "5G" : "2.4G"),
3710 ((wifi_bw == BTC_WIFI_BW_LEGACY) ? "Legacy" :
3711 (((wifi_bw == BTC_WIFI_BW_HT40) ? "HT40" : "HT20"))),
3712 ((!wifi_busy) ? "idle" :
3713 ((wifi_traffic_dir == BTC_WIFI_TRAFFIC_TX) ?
3714 "uplink" : "downlink")));
3715
3716 seq_printf(m, "\n %-35s = %d / %d / %d / %d",
3717 "SCO/HID/PAN/A2DP",
3718 bt_link_info->sco_exist, bt_link_info->hid_exist,
3719 bt_link_info->pan_exist, bt_link_info->a2dp_exist);
3720 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO, m);
3721
3722 bt_info_ext = coex_sta->bt_info_ext;
3723 seq_printf(m, "\n %-35s = %s",
3724 "BT Info A2DP rate",
3725 (bt_info_ext & BIT0) ? "Basic rate" : "EDR rate");
3726
3727 for (i = 0; i < BT_INFO_SRC_8723B_2ANT_MAX; i++) {
3728 if (coex_sta->bt_info_c2h_cnt[i]) {
3729 seq_printf(m, "\n %-35s = %7ph(%d)",
3730 glbt_info_src_8723b_2ant[i],
3731 coex_sta->bt_info_c2h[i],
3732 coex_sta->bt_info_c2h_cnt[i]);
3733 }
3734 }
3735
3736 seq_printf(m, "\n %-35s = %s/%s",
3737 "PS state, IPS/LPS",
3738 ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
3739 ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")));
3740 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD, m);
3741
3742 /* Sw mechanism */
3743 seq_printf(m,
3744 "\n %-35s", "============[Sw mechanism]============");
3745 seq_printf(m, "\n %-35s = %d/ %d/ %d ",
3746 "SM1[ShRf/ LpRA/ LimDig]", coex_dm->cur_rf_rx_lpf_shrink,
3747 coex_dm->cur_low_penalty_ra, coex_dm->limited_dig);
3748 seq_printf(m, "\n %-35s = %d/ %d/ %d(0x%x) ",
3749 "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]",
3750 coex_dm->cur_agc_table_en, coex_dm->cur_adc_back_off,
3751 coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl);
3752
3753 /* Fw mechanism */
3754 seq_printf(m, "\n %-35s",
3755 "============[Fw mechanism]============");
3756
3757 ps_tdma_case = coex_dm->cur_ps_tdma;
3758 seq_printf(m, "\n %-35s = %5ph case-%d (auto:%d)",
3759 "PS TDMA", coex_dm->ps_tdma_para,
3760 ps_tdma_case, coex_dm->auto_tdma_adjust);
3761
3762 seq_printf(m, "\n %-35s = %d/ %d ",
3763 "DecBtPwr/ IgnWlanAct", coex_dm->cur_dec_bt_pwr_lvl,
3764 coex_dm->cur_ignore_wlan_act);
3765
3766 /* Hw setting */
3767 seq_printf(m, "\n %-35s",
3768 "============[Hw setting]============");
3769
3770 seq_printf(m, "\n %-35s = 0x%x",
3771 "RF-A, 0x1e initVal", coex_dm->bt_rf0x1e_backup);
3772
3773 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
3774 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x880);
3775 seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3776 "0x778/0x880[29:25]", u8tmp[0],
3777 (u32tmp[0] & 0x3e000000) >> 25);
3778
3779 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x948);
3780 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x67);
3781 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x765);
3782 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
3783 "0x948/ 0x67[5] / 0x765",
3784 u32tmp[0], ((u8tmp[0] & 0x20) >> 5), u8tmp[1]);
3785
3786 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x92c);
3787 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x930);
3788 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x944);
3789 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
3790 "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]",
3791 u32tmp[0] & 0x3, u32tmp[1] & 0xff, u32tmp[2] & 0x3);
3792
3793 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x39);
3794 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
3795 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
3796 u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64);
3797 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
3798 "0x38[11]/0x40/0x4c[24:23]/0x64[0]",
3799 ((u8tmp[0] & 0x8) >> 3), u8tmp[1],
3800 ((u32tmp[0] & 0x01800000) >> 23), u8tmp[2] & 0x1);
3801
3802 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
3803 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
3804 seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3805 "0x550(bcn ctrl)/0x522", u32tmp[0], u8tmp[0]);
3806
3807 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
3808 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x49c);
3809 seq_printf(m, "\n %-35s = 0x%x/ 0x%x",
3810 "0xc50(dig)/0x49c(null-drop)", u32tmp[0] & 0xff, u8tmp[0]);
3811
3812 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xda0);
3813 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xda4);
3814 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0xda8);
3815 u32tmp[3] = btcoexist->btc_read_4byte(btcoexist, 0xcf0);
3816
3817 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);
3818 u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
3819
3820 fa_ofdm = ((u32tmp[0]&0xffff0000) >> 16) +
3821 ((u32tmp[1]&0xffff0000) >> 16) +
3822 (u32tmp[1] & 0xffff) +
3823 (u32tmp[2] & 0xffff) +
3824 ((u32tmp[3]&0xffff0000) >> 16) +
3825 (u32tmp[3] & 0xffff);
3826 fa_cck = (u8tmp[0] << 8) + u8tmp[1];
3827
3828 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
3829 "OFDM-CCA/OFDM-FA/CCK-FA",
3830 u32tmp[0] & 0xffff, fa_ofdm, fa_cck);
3831
3832 u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
3833 u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
3834 u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
3835 u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
3836 seq_printf(m, "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
3837 "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)",
3838 u32tmp[0], u32tmp[1], u32tmp[2], u8tmp[0]);
3839
3840 seq_printf(m, "\n %-35s = %d/ %d",
3841 "0x770(high-pri rx/tx)",
3842 coex_sta->high_priority_rx, coex_sta->high_priority_tx);
3843 seq_printf(m, "\n %-35s = %d/ %d",
3844 "0x774(low-pri rx/tx)", coex_sta->low_priority_rx,
3845 coex_sta->low_priority_tx);
3846 if (btcoexist->auto_report_2ant)
3847 btc8723b2ant_monitor_bt_ctr(btcoexist);
3848 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS, m);
3849 }
3850
ex_btc8723b2ant_ips_notify(struct btc_coexist * btcoexist,u8 type)3851 void ex_btc8723b2ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
3852 {
3853 struct rtl_priv *rtlpriv = btcoexist->adapter;
3854
3855 if (BTC_IPS_ENTER == type) {
3856 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3857 "[BTCoex], IPS ENTER notify\n");
3858 coex_sta->under_ips = true;
3859 btc8723b2ant_wifioff_hwcfg(btcoexist);
3860 btc8723b2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
3861 btc8723b2ant_coex_alloff(btcoexist);
3862 } else if (BTC_IPS_LEAVE == type) {
3863 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3864 "[BTCoex], IPS LEAVE notify\n");
3865 coex_sta->under_ips = false;
3866 ex_btc8723b2ant_init_hwconfig(btcoexist);
3867 btc8723b2ant_init_coex_dm(btcoexist);
3868 btc8723b2ant_query_bt_info(btcoexist);
3869 }
3870 }
3871
ex_btc8723b2ant_lps_notify(struct btc_coexist * btcoexist,u8 type)3872 void ex_btc8723b2ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
3873 {
3874 struct rtl_priv *rtlpriv = btcoexist->adapter;
3875
3876 if (BTC_LPS_ENABLE == type) {
3877 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3878 "[BTCoex], LPS ENABLE notify\n");
3879 coex_sta->under_lps = true;
3880 } else if (BTC_LPS_DISABLE == type) {
3881 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3882 "[BTCoex], LPS DISABLE notify\n");
3883 coex_sta->under_lps = false;
3884 }
3885 }
3886
ex_btc8723b2ant_scan_notify(struct btc_coexist * btcoexist,u8 type)3887 void ex_btc8723b2ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
3888 {
3889 struct rtl_priv *rtlpriv = btcoexist->adapter;
3890 u32 u32tmp;
3891 u8 u8tmpa, u8tmpb;
3892
3893 u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x948);
3894 u8tmpa = btcoexist->btc_read_1byte(btcoexist, 0x765);
3895 u8tmpb = btcoexist->btc_read_1byte(btcoexist, 0x76e);
3896
3897 if (BTC_SCAN_START == type)
3898 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3899 "[BTCoex], SCAN START notify\n");
3900 else if (BTC_SCAN_FINISH == type)
3901 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3902 "[BTCoex], SCAN FINISH notify\n");
3903 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
3904 &coex_sta->scan_ap_num);
3905
3906 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3907 "############# [BTCoex], 0x948=0x%x, 0x765=0x%x, 0x76e=0x%x\n",
3908 u32tmp, u8tmpa, u8tmpb);
3909 }
3910
ex_btc8723b2ant_connect_notify(struct btc_coexist * btcoexist,u8 type)3911 void ex_btc8723b2ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
3912 {
3913 struct rtl_priv *rtlpriv = btcoexist->adapter;
3914
3915 if (BTC_ASSOCIATE_START == type)
3916 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3917 "[BTCoex], CONNECT START notify\n");
3918 else if (BTC_ASSOCIATE_FINISH == type)
3919 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3920 "[BTCoex], CONNECT FINISH notify\n");
3921 }
3922
ex_btc8723b2ant_media_status_notify(struct btc_coexist * btcoexist,u8 type)3923 void ex_btc8723b2ant_media_status_notify(struct btc_coexist *btcoexist,
3924 u8 type)
3925 {
3926 struct rtl_priv *rtlpriv = btcoexist->adapter;
3927 u8 h2c_parameter[3] = {0};
3928 u32 wifi_bw;
3929 u8 wifi_central_chnl;
3930 u8 ap_num = 0;
3931
3932 if (BTC_MEDIA_CONNECT == type)
3933 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3934 "[BTCoex], MEDIA connect notify\n");
3935 else
3936 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3937 "[BTCoex], MEDIA disconnect notify\n");
3938
3939 /* only 2.4G we need to inform bt the chnl mask */
3940 btcoexist->btc_get(btcoexist,
3941 BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifi_central_chnl);
3942 if ((BTC_MEDIA_CONNECT == type) &&
3943 (wifi_central_chnl <= 14)) {
3944 h2c_parameter[0] = 0x1;
3945 h2c_parameter[1] = wifi_central_chnl;
3946 btcoexist->btc_get(btcoexist,
3947 BTC_GET_U4_WIFI_BW, &wifi_bw);
3948 if (wifi_bw == BTC_WIFI_BW_HT40) {
3949 h2c_parameter[2] = 0x30;
3950 } else {
3951 btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
3952 &ap_num);
3953 if (ap_num < 10)
3954 h2c_parameter[2] = 0x30;
3955 else
3956 h2c_parameter[2] = 0x20;
3957 }
3958 }
3959
3960 coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
3961 coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
3962 coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
3963
3964 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3965 "[BTCoex], FW write 0x66=0x%x\n",
3966 h2c_parameter[0] << 16 | h2c_parameter[1] << 8 |
3967 h2c_parameter[2]);
3968
3969 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
3970 }
3971
ex_btc8723b2ant_special_packet_notify(struct btc_coexist * btcoexist,u8 type)3972 void ex_btc8723b2ant_special_packet_notify(struct btc_coexist *btcoexist,
3973 u8 type)
3974 {
3975 struct rtl_priv *rtlpriv = btcoexist->adapter;
3976
3977 if (type == BTC_PACKET_DHCP)
3978 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3979 "[BTCoex], DHCP Packet notify\n");
3980 }
3981
ex_btc8723b2ant_bt_info_notify(struct btc_coexist * btcoexist,u8 * tmpbuf,u8 length)3982 void ex_btc8723b2ant_bt_info_notify(struct btc_coexist *btcoexist,
3983 u8 *tmpbuf, u8 length)
3984 {
3985 struct rtl_priv *rtlpriv = btcoexist->adapter;
3986 u8 bt_info = 0;
3987 u8 i, rsp_source = 0;
3988 bool bt_busy = false, limited_dig = false;
3989 bool wifi_connected = false;
3990
3991 coex_sta->c2h_bt_info_req_sent = false;
3992
3993 rsp_source = tmpbuf[0]&0xf;
3994 if (rsp_source >= BT_INFO_SRC_8723B_2ANT_MAX)
3995 rsp_source = BT_INFO_SRC_8723B_2ANT_WIFI_FW;
3996 coex_sta->bt_info_c2h_cnt[rsp_source]++;
3997
3998 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
3999 "[BTCoex], Bt info[%d], length=%d, hex data=[",
4000 rsp_source, length);
4001 for (i = 0; i < length; i++) {
4002 coex_sta->bt_info_c2h[rsp_source][i] = tmpbuf[i];
4003 if (i == 1)
4004 bt_info = tmpbuf[i];
4005 if (i == length - 1)
4006 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4007 "0x%02x]\n", tmpbuf[i]);
4008 else
4009 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4010 "0x%02x, ", tmpbuf[i]);
4011 }
4012
4013 if (btcoexist->manual_control) {
4014 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4015 "[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n");
4016 return;
4017 }
4018
4019 if (BT_INFO_SRC_8723B_2ANT_WIFI_FW != rsp_source) {
4020 coex_sta->bt_retry_cnt =
4021 coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
4022
4023 if (coex_sta->bt_retry_cnt >= 1)
4024 coex_sta->pop_event_cnt++;
4025
4026 coex_sta->bt_rssi =
4027 coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;
4028
4029 coex_sta->bt_info_ext = coex_sta->bt_info_c2h[rsp_source][4];
4030
4031 if (coex_sta->bt_info_c2h[rsp_source][2] & 0x20)
4032 coex_sta->c2h_bt_remote_name_req = true;
4033 else
4034 coex_sta->c2h_bt_remote_name_req = false;
4035
4036 if (coex_sta->bt_info_c2h[rsp_source][1] == 0x49)
4037 coex_sta->a2dp_bit_pool =
4038 coex_sta->bt_info_c2h[rsp_source][6];
4039 else
4040 coex_sta->a2dp_bit_pool = 0;
4041
4042 /* Here we need to resend some wifi info to BT
4043 * because BT is reset and loss of the info.
4044 */
4045 if ((coex_sta->bt_info_ext & BIT1)) {
4046 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4047 "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
4048 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
4049 &wifi_connected);
4050 if (wifi_connected)
4051 ex_btc8723b2ant_media_status_notify(
4052 btcoexist,
4053 BTC_MEDIA_CONNECT);
4054 else
4055 ex_btc8723b2ant_media_status_notify(
4056 btcoexist,
4057 BTC_MEDIA_DISCONNECT);
4058 }
4059
4060 if ((coex_sta->bt_info_ext & BIT3)) {
4061 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4062 "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
4063 btc8723b2ant_ignore_wlan_act(btcoexist, FORCE_EXEC,
4064 false);
4065 } else {
4066 /* BT already NOT ignore Wlan active, do nothing here.*/
4067 }
4068 if (!btcoexist->auto_report_2ant) {
4069 if (!(coex_sta->bt_info_ext & BIT4))
4070 btc8723b2ant_bt_auto_report(btcoexist,
4071 FORCE_EXEC, true);
4072 }
4073 }
4074
4075 /* check BIT2 first ==> check if bt is under inquiry or page scan */
4076 if (bt_info & BT_INFO_8723B_2ANT_B_INQ_PAGE)
4077 coex_sta->c2h_bt_inquiry_page = true;
4078 else
4079 coex_sta->c2h_bt_inquiry_page = false;
4080
4081 if (!(bt_info & BT_INFO_8723B_2ANT_B_CONNECTION)) {
4082 /* set link exist status */
4083 coex_sta->bt_link_exist = false;
4084 coex_sta->pan_exist = false;
4085 coex_sta->a2dp_exist = false;
4086 coex_sta->hid_exist = false;
4087 coex_sta->sco_exist = false;
4088 } else {
4089 /* connection exists */
4090 coex_sta->bt_link_exist = true;
4091 if (bt_info & BT_INFO_8723B_2ANT_B_FTP)
4092 coex_sta->pan_exist = true;
4093 else
4094 coex_sta->pan_exist = false;
4095 if (bt_info & BT_INFO_8723B_2ANT_B_A2DP)
4096 coex_sta->a2dp_exist = true;
4097 else
4098 coex_sta->a2dp_exist = false;
4099 if (bt_info & BT_INFO_8723B_2ANT_B_HID)
4100 coex_sta->hid_exist = true;
4101 else
4102 coex_sta->hid_exist = false;
4103 if (bt_info & BT_INFO_8723B_2ANT_B_SCO_ESCO)
4104 coex_sta->sco_exist = true;
4105 else
4106 coex_sta->sco_exist = false;
4107
4108 if ((!coex_sta->hid_exist) &&
4109 (!coex_sta->c2h_bt_inquiry_page) &&
4110 (!coex_sta->sco_exist)) {
4111 if (coex_sta->high_priority_tx +
4112 coex_sta->high_priority_rx >= 160) {
4113 coex_sta->hid_exist = true;
4114 bt_info = bt_info | 0x28;
4115 }
4116 }
4117 }
4118
4119 btc8723b2ant_update_bt_link_info(btcoexist);
4120
4121 if (!(bt_info & BT_INFO_8723B_2ANT_B_CONNECTION)) {
4122 coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE;
4123 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4124 "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
4125 /* connection exists but no busy */
4126 } else if (bt_info == BT_INFO_8723B_2ANT_B_CONNECTION) {
4127 coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE;
4128 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4129 "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
4130 } else if ((bt_info & BT_INFO_8723B_2ANT_B_SCO_ESCO) ||
4131 (bt_info & BT_INFO_8723B_2ANT_B_SCO_BUSY)) {
4132 coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_SCO_BUSY;
4133 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4134 "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
4135 } else if (bt_info&BT_INFO_8723B_2ANT_B_ACL_BUSY) {
4136 coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_ACL_BUSY;
4137 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4138 "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
4139 } else {
4140 coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_MAX;
4141 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4142 "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
4143 }
4144
4145 if ((BT_8723B_2ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
4146 (BT_8723B_2ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
4147 (BT_8723B_2ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) {
4148 bt_busy = true;
4149 limited_dig = true;
4150 } else {
4151 bt_busy = false;
4152 limited_dig = false;
4153 }
4154
4155 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
4156
4157 coex_dm->limited_dig = limited_dig;
4158 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig);
4159
4160 btc8723b2ant_run_coexist_mechanism(btcoexist);
4161 }
4162
ex_btc8723b2ant_halt_notify(struct btc_coexist * btcoexist)4163 void ex_btc8723b2ant_halt_notify(struct btc_coexist *btcoexist)
4164 {
4165 struct rtl_priv *rtlpriv = btcoexist->adapter;
4166
4167 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Halt notify\n");
4168
4169 btc8723b2ant_wifioff_hwcfg(btcoexist);
4170 btc8723b2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
4171 ex_btc8723b2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
4172 }
4173
ex_btc8723b2ant_pnp_notify(struct btc_coexist * btcoexist,u8 pnp_state)4174 void ex_btc8723b2ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
4175 {
4176 struct rtl_priv *rtlpriv = btcoexist->adapter;
4177
4178 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, "[BTCoex], Pnp notify\n");
4179
4180 if (pnp_state == BTC_WIFI_PNP_SLEEP) {
4181 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4182 "[BTCoex], Pnp notify to SLEEP\n");
4183
4184 /* Driver do not leave IPS/LPS when driver is going to sleep, so
4185 * BTCoexistence think wifi is still under IPS/LPS
4186 *
4187 * BT should clear UnderIPS/UnderLPS state to avoid mismatch
4188 * state after wakeup.
4189 */
4190 coex_sta->under_ips = false;
4191 coex_sta->under_lps = false;
4192 } else if (pnp_state == BTC_WIFI_PNP_WAKE_UP) {
4193 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4194 "[BTCoex], Pnp notify to WAKE UP\n");
4195 ex_btc8723b2ant_init_hwconfig(btcoexist);
4196 btc8723b2ant_init_coex_dm(btcoexist);
4197 btc8723b2ant_query_bt_info(btcoexist);
4198 }
4199 }
4200
ex_btc8723b2ant_periodical(struct btc_coexist * btcoexist)4201 void ex_btc8723b2ant_periodical(struct btc_coexist *btcoexist)
4202 {
4203 struct rtl_priv *rtlpriv = btcoexist->adapter;
4204 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
4205
4206 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4207 "[BTCoex], ==========================Periodical===========================\n");
4208
4209 if (coex_sta->dis_ver_info_cnt <= 5) {
4210 coex_sta->dis_ver_info_cnt += 1;
4211 if (coex_sta->dis_ver_info_cnt == 3) {
4212 /* Antenna config to set 0x765 = 0x0 (GNT_BT control by
4213 * PTA) after initial
4214 */
4215 rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
4216 "[BTCoex], Set GNT_BT control by PTA\n");
4217 btc8723b2ant_set_ant_path(
4218 btcoexist, BTC_ANT_WIFI_AT_MAIN, false, false);
4219 }
4220 }
4221
4222 if (!btcoexist->auto_report_2ant) {
4223 btc8723b2ant_query_bt_info(btcoexist);
4224 } else {
4225 btc8723b2ant_monitor_bt_ctr(btcoexist);
4226 btc8723b2ant_monitor_wifi_ctr(btcoexist);
4227
4228 /* for some BT speakers that High-Priority pkts appear before
4229 * playing, this will cause HID exist
4230 */
4231 if ((coex_sta->high_priority_tx +
4232 coex_sta->high_priority_rx < 50) &&
4233 (bt_link_info->hid_exist))
4234 bt_link_info->hid_exist = false;
4235
4236 if (btc8723b2ant_is_wifi_status_changed(btcoexist) ||
4237 coex_dm->auto_tdma_adjust)
4238 btc8723b2ant_run_coexist_mechanism(btcoexist);
4239 }
4240 }
4241