Merge tag 'locks-v3.16' of git://git.samba.org/jlayton/linux into next
[deliverable/linux.git] / drivers / staging / rtl8192ee / btcoexist / halbtc8821a1ant.c
1 /* */
2 /* Description: */
3 /* */
4 /* This file is for RTL8821A Co-exist mechanism */
5 /* */
6 /* History */
7 /* 2012/11/15 Cosa first check in. */
8 /* */
9 /* */
10
11 /* */
12 /* include files */
13 /* */
14 #include "halbt_precomp.h"
15 /* */
16 /* Global variables, these are static variables */
17 /* */
18 static struct coex_dm_8821a_1ant glcoex_dm_8821a_1ant;
19 static struct coex_dm_8821a_1ant *coex_dm = &glcoex_dm_8821a_1ant;
20 static struct coex_sta_8821a_1ant glcoex_sta_8821a_1ant;
21 static struct coex_sta_8821a_1ant *coex_sta = &glcoex_sta_8821a_1ant;
22
23 static const char *const glbt_info_src_8821a_1ant[] = {
24 "BT Info[wifi fw]",
25 "BT Info[bt rsp]",
26 "BT Info[bt auto report]",
27 };
28
29 static u32 glcoex_ver_date_8821a_1ant = 20130816;
30 static u32 glcoex_ver_8821a_1ant = 0x41;
31
32 /* local function proto type if needed */
33 /* local function start with halbtc8821a1ant_ */
34 static u8 halbtc8821a1ant_bt_rssi_state(u8 level_num, u8 rssi_thresh,
35 u8 rssi_thresh1)
36 {
37 long bt_rssi = 0;
38 u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;
39
40 bt_rssi = coex_sta->bt_rssi;
41
42 if (level_num == 2) {
43 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
44 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
45 if (bt_rssi >= (rssi_thresh+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
46 bt_rssi_state = BTC_RSSI_STATE_HIGH;
47 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
48 "[BTCoex], BT Rssi state switch to High\n");
49 } else {
50 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
51 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
52 "[BTCoex], BT Rssi state stay at Low\n");
53 }
54 } else {
55 if (bt_rssi < rssi_thresh) {
56 bt_rssi_state = BTC_RSSI_STATE_LOW;
57 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
58 "[BTCoex], BT Rssi state switch to Low\n");
59 } else {
60 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
61 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
62 "[BTCoex], BT Rssi state stay at High\n");
63 }
64 }
65 } else if (level_num == 3) {
66 if (rssi_thresh > rssi_thresh1) {
67 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
68 "[BTCoex], BT Rssi thresh error!!\n");
69 return coex_sta->pre_bt_rssi_state;
70 }
71
72 if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
73 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
74 if (bt_rssi >= (rssi_thresh+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
75 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
76 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
77 "[BTCoex], BT Rssi state switch to Medium\n");
78 } else {
79 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
80 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
81 "[BTCoex], BT Rssi state stay at Low\n");
82 }
83 } else if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
84 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
85 if (bt_rssi >= (rssi_thresh1+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
86 bt_rssi_state = BTC_RSSI_STATE_HIGH;
87 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
88 "[BTCoex], BT Rssi state switch to High\n");
89 } else if (bt_rssi < rssi_thresh) {
90 bt_rssi_state = BTC_RSSI_STATE_LOW;
91 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
92 "[BTCoex], BT Rssi state switch to Low\n");
93 } else {
94 bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
95 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
96 "[BTCoex], BT Rssi state stay at Medium\n");
97 }
98 } else {
99 if (bt_rssi < rssi_thresh1) {
100 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
101 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
102 "[BTCoex], BT Rssi state switch to Medium\n");
103 } else {
104 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
105 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE,
106 "[BTCoex], BT Rssi state stay at High\n");
107 }
108 }
109 }
110
111 coex_sta->pre_bt_rssi_state = bt_rssi_state;
112
113 return bt_rssi_state;
114 }
115
116 static u8 Wifi_rssi_state(struct btc_coexist *btcoexist, u8 index,
117 u8 level_num, u8 rssi_thresh,
118 u8 rssi_thresh1)
119 {
120 long wifi_rssi = 0;
121 u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
122
123 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
124
125 if (level_num == 2) {
126 if ((coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW) ||
127 (coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_STAY_LOW)) {
128 if (wifi_rssi >= (rssi_thresh+BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
129 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
130 BTC_PRINT(BTC_MSG_ALGORITHM,
131 ALGO_WIFI_RSSI_STATE,
132 "[BTCoex], wifi RSSI state switch to High\n");
133 } else {
134 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
135 BTC_PRINT(BTC_MSG_ALGORITHM,
136 ALGO_WIFI_RSSI_STATE,
137 "[BTCoex], wifi RSSI state stay at Low\n");
138 }
139 } else {
140 if (wifi_rssi < rssi_thresh) {
141 wifi_rssi_state = BTC_RSSI_STATE_LOW;
142 BTC_PRINT(BTC_MSG_ALGORITHM,
143 ALGO_WIFI_RSSI_STATE,
144 "[BTCoex], wifi RSSI state switch to Low\n");
145 } else {
146 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
147 BTC_PRINT(BTC_MSG_ALGORITHM,
148 ALGO_WIFI_RSSI_STATE,
149 "[BTCoex], wifi RSSI state stay at High\n");
150 }
151 }
152 } else if (level_num == 3) {
153 if (rssi_thresh > rssi_thresh1) {
154 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE,
155 "[BTCoex], wifi RSSI thresh error!!\n");
156 return coex_sta->pre_wifi_rssi_state[index];
157 }
158
159 if ((coex_sta->pre_wifi_rssi_state[index] ==
160 BTC_RSSI_STATE_LOW) ||
161 (coex_sta->pre_wifi_rssi_state[index] ==
162 BTC_RSSI_STATE_STAY_LOW)) {
163 if (wifi_rssi >= (rssi_thresh +
164 BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
165 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
166 BTC_PRINT(BTC_MSG_ALGORITHM,
167 ALGO_WIFI_RSSI_STATE,
168 "[BTCoex], wifi RSSI state switch to Medium\n");
169 } else {
170 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
171 BTC_PRINT(BTC_MSG_ALGORITHM,
172 ALGO_WIFI_RSSI_STATE,
173 "[BTCoex], wifi RSSI state stay at Low\n");
174 }
175 } else if ((coex_sta->pre_wifi_rssi_state[index] ==
176 BTC_RSSI_STATE_MEDIUM) ||
177 (coex_sta->pre_wifi_rssi_state[index] ==
178 BTC_RSSI_STATE_STAY_MEDIUM)) {
179 if (wifi_rssi >= (rssi_thresh1 +
180 BTC_RSSI_COEX_THRESH_TOL_8821A_1ANT)) {
181 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
182 BTC_PRINT(BTC_MSG_ALGORITHM,
183 ALGO_WIFI_RSSI_STATE,
184 "[BTCoex], wifi RSSI state switch to High\n");
185 } else if (wifi_rssi < rssi_thresh) {
186 wifi_rssi_state = BTC_RSSI_STATE_LOW;
187 BTC_PRINT(BTC_MSG_ALGORITHM,
188 ALGO_WIFI_RSSI_STATE,
189 "[BTCoex], wifi RSSI state switch to Low\n");
190 } else {
191 wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
192 BTC_PRINT(BTC_MSG_ALGORITHM,
193 ALGO_WIFI_RSSI_STATE,
194 "[BTCoex], wifi RSSI state stay at Medium\n");
195 }
196 } else {
197 if (wifi_rssi < rssi_thresh1) {
198 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
199 BTC_PRINT(BTC_MSG_ALGORITHM,
200 ALGO_WIFI_RSSI_STATE,
201 "[BTCoex], wifi RSSI state switch to Medium\n");
202 } else {
203 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
204 BTC_PRINT(BTC_MSG_ALGORITHM,
205 ALGO_WIFI_RSSI_STATE,
206 "[BTCoex], wifi RSSI state stay at High\n");
207 }
208 }
209 }
210
211 coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
212
213 return wifi_rssi_state;
214 }
215
216 static void update_ra_mask(struct btc_coexist *btcoexist,
217 bool force_exec, u32 dis_rate_mask)
218 {
219 coex_dm->cur_ra_mask = dis_rate_mask;
220
221 if (force_exec || (coex_dm->pre_ra_mask != coex_dm->cur_ra_mask)) {
222 btcoexist->btc_set(btcoexist, BTC_SET_ACT_UPDATE_ra_mask,
223 &coex_dm->cur_ra_mask);
224 }
225 coex_dm->pre_ra_mask = coex_dm->cur_ra_mask;
226 }
227
228 static void auto_rate_fallback_retry(struct btc_coexist *btcoexist,
229 bool force_exec, u8 type)
230 {
231 bool wifi_under_b_mode = false;
232
233 coex_dm->cur_arfr_type = type;
234
235 if (force_exec || (coex_dm->pre_arfr_type != coex_dm->cur_arfr_type)) {
236 switch (coex_dm->cur_arfr_type) {
237 case 0: /* normal mode */
238 btcoexist->btc_write_4byte(btcoexist, 0x430,
239 coex_dm->backup_arfr_cnt1);
240 btcoexist->btc_write_4byte(btcoexist, 0x434,
241 coex_dm->backup_arfr_cnt2);
242 break;
243 case 1:
244 btcoexist->btc_get(btcoexist,
245 BTC_GET_BL_WIFI_UNDER_B_MODE,
246 &wifi_under_b_mode);
247 if (wifi_under_b_mode) {
248 btcoexist->btc_write_4byte(btcoexist,
249 0x430, 0x0);
250 btcoexist->btc_write_4byte(btcoexist,
251 0x434,
252 0x01010101);
253 } else {
254 btcoexist->btc_write_4byte(btcoexist,
255 0x430, 0x0);
256 btcoexist->btc_write_4byte(btcoexist,
257 0x434,
258 0x04030201);
259 }
260 break;
261 default:
262 break;
263 }
264 }
265
266 coex_dm->pre_arfr_type = coex_dm->cur_arfr_type;
267 }
268
269 static void halbtc8821a1ant_retry_limit(struct btc_coexist *btcoexist,
270 bool force_exec, u8 type)
271 {
272 coex_dm->cur_retry_limit_type = type;
273
274 if (force_exec || (coex_dm->pre_retry_limit_type !=
275 coex_dm->cur_retry_limit_type)) {
276 switch (coex_dm->cur_retry_limit_type) {
277 case 0: /* normal mode */
278 btcoexist->btc_write_2byte(btcoexist, 0x42a, coex_dm->backup_retry_limit);
279 break;
280 case 1: /* retry limit = 8 */
281 btcoexist->btc_write_2byte(btcoexist, 0x42a, 0x0808);
282 break;
283 default:
284 break;
285 }
286 }
287
288 coex_dm->pre_retry_limit_type = coex_dm->cur_retry_limit_type;
289 }
290
291 static void halbtc8821a1ant_ampdu_max_time(struct btc_coexist *btcoexist,
292 bool force_exec, u8 type)
293 {
294 coex_dm->cur_ampdu_time_type = type;
295
296 if (force_exec ||
297 (coex_dm->pre_ampdu_time_type != coex_dm->cur_ampdu_time_type)) {
298 switch (coex_dm->cur_ampdu_time_type) {
299 case 0: /* normal mode */
300 btcoexist->btc_write_1byte(btcoexist, 0x456, coex_dm->backup_ampdu_max_time);
301 break;
302 case 1: /* AMPDU timw = 0x38 * 32us */
303 btcoexist->btc_write_1byte(btcoexist, 0x456, 0x38);
304 break;
305 default:
306 break;
307 }
308 }
309
310 coex_dm->pre_ampdu_time_type = coex_dm->cur_ampdu_time_type;
311 }
312
313 static void halbtc8821a1ant_limited_tx(struct btc_coexist *btcoexist,
314 bool force_exec, u8 ra_mask_type,
315 u8 arfr_type, u8 retry_limit_type,
316 u8 ampdu_time_type)
317 {
318 switch (ra_mask_type) {
319 case 0: /* normal mode */
320 update_ra_mask(btcoexist, force_exec, 0x0);
321 break;
322 case 1: /* disable cck 1/2 */
323 update_ra_mask(btcoexist, force_exec, 0x00000003);
324 break;
325 case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
326 update_ra_mask(btcoexist, force_exec, 0x0001f1f7);
327 break;
328 default:
329 break;
330 }
331
332 auto_rate_fallback_retry(btcoexist, force_exec, arfr_type);
333 halbtc8821a1ant_retry_limit(btcoexist, force_exec, retry_limit_type);
334 halbtc8821a1ant_ampdu_max_time(btcoexist, force_exec, ampdu_time_type);
335 }
336
337 static void halbtc8821a1ant_limited_rx(struct btc_coexist *btcoexist,
338 bool force_exec, bool rej_ap_agg_pkt,
339 bool bt_ctrl_agg_buf_size,
340 u8 agg_buf_size)
341 {
342 bool reject_rx_agg = rej_ap_agg_pkt;
343 bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
344 u8 rx_agg_size = agg_buf_size;
345
346 /* */
347 /* Rx Aggregation related setting */
348 /* */
349 btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &reject_rx_agg);
350 /* decide BT control aggregation buf size or not */
351 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bt_ctrl_rx_agg_size);
352 /* aggregation buf size, only work when BT control Rx aggregation size. */
353 btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
354 /* real update aggregation setting */
355 btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
356
357 }
358
359 static void halbtc8821a1ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
360 {
361 u32 reg_hp_tx_rx, reg_lp_tx_rx, u4_tmp;
362 u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
363
364 reg_hp_tx_rx = 0x770;
365 reg_lp_tx_rx = 0x774;
366
367 u4_tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_tx_rx);
368 reg_hp_tx = u4_tmp & MASKLWORD;
369 reg_hp_rx = (u4_tmp & MASKHWORD)>>16;
370
371 u4_tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_tx_rx);
372 reg_lp_tx = u4_tmp & MASKLWORD;
373 reg_lp_rx = (u4_tmp & MASKHWORD)>>16;
374
375 coex_sta->high_priority_tx = reg_hp_tx;
376 coex_sta->high_priority_rx = reg_hp_rx;
377 coex_sta->low_priority_tx = reg_lp_tx;
378 coex_sta->low_priority_rx = reg_lp_rx;
379
380 /* reset counter */
381 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
382 }
383
384 static void halbtc8821a1ant_query_bt_info(struct btc_coexist *btcoexist)
385 {
386 u8 h2c_parameter[1] = {0};
387
388 coex_sta->c2h_bt_info_req_sent = true;
389
390 h2c_parameter[0] |= BIT(0); /* trigger */
391
392 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
393 "[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n",
394 h2c_parameter[0]);
395
396 btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
397 }
398
399 static void halbtc8821a1ant_update_bt_link_info(struct btc_coexist *btcoexist)
400 {
401 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
402 bool bt_hs_on = false;
403
404 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
405
406 bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
407 bt_link_info->sco_exist = coex_sta->sco_exist;
408 bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
409 bt_link_info->pan_exist = coex_sta->pan_exist;
410 bt_link_info->hid_exist = coex_sta->hid_exist;
411
412 /* work around for HS mode. */
413 if (bt_hs_on) {
414 bt_link_info->pan_exist = true;
415 bt_link_info->bt_link_exist = true;
416 }
417
418 /* check if Sco only */
419 if (bt_link_info->sco_exist &&
420 !bt_link_info->a2dp_exist &&
421 !bt_link_info->pan_exist &&
422 !bt_link_info->hid_exist)
423 bt_link_info->sco_only = true;
424 else
425 bt_link_info->sco_only = false;
426
427 /* check if A2dp only */
428 if (!bt_link_info->sco_exist &&
429 bt_link_info->a2dp_exist &&
430 !bt_link_info->pan_exist &&
431 !bt_link_info->hid_exist)
432 bt_link_info->a2dp_only = true;
433 else
434 bt_link_info->a2dp_only = false;
435
436 /* check if Pan only */
437 if (!bt_link_info->sco_exist &&
438 !bt_link_info->a2dp_exist &&
439 bt_link_info->pan_exist &&
440 !bt_link_info->hid_exist)
441 bt_link_info->pan_only = true;
442 else
443 bt_link_info->pan_only = false;
444
445 /* check if Hid only */
446 if (!bt_link_info->sco_exist &&
447 !bt_link_info->a2dp_exist &&
448 !bt_link_info->pan_exist &&
449 bt_link_info->hid_exist)
450 bt_link_info->hid_only = true;
451 else
452 bt_link_info->hid_only = false;
453 }
454
455 static u8 halbtc8821a1ant_action_algorithm(struct btc_coexist *btcoexist)
456 {
457 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
458 bool bt_hs_on = false;
459 u8 algorithm = BT_8821A_1ANT_COEX_ALGO_UNDEFINED;
460 u8 num_of_diff_profile = 0;
461
462 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
463
464 if (!bt_link_info->bt_link_exist) {
465 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], No BT link exists!!!\n");
466 return algorithm;
467 }
468
469 if (bt_link_info->sco_exist)
470 num_of_diff_profile++;
471 if (bt_link_info->hid_exist)
472 num_of_diff_profile++;
473 if (bt_link_info->pan_exist)
474 num_of_diff_profile++;
475 if (bt_link_info->a2dp_exist)
476 num_of_diff_profile++;
477
478 if (num_of_diff_profile == 1) {
479 if (bt_link_info->sco_exist) {
480 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = SCO only\n");
481 algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
482 } else {
483 if (bt_link_info->hid_exist) {
484 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = HID only\n");
485 algorithm = BT_8821A_1ANT_COEX_ALGO_HID;
486 } else if (bt_link_info->a2dp_exist) {
487 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = A2DP only\n");
488 algorithm = BT_8821A_1ANT_COEX_ALGO_A2DP;
489 } else if (bt_link_info->pan_exist) {
490 if (bt_hs_on) {
491 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = PAN(HS) only\n");
492 algorithm = BT_8821A_1ANT_COEX_ALGO_PANHS;
493 } else {
494 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = PAN(EDR) only\n");
495 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR;
496 }
497 }
498 }
499 } else if (num_of_diff_profile == 2) {
500 if (bt_link_info->sco_exist) {
501 if (bt_link_info->hid_exist) {
502 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = SCO + HID\n");
503 algorithm = BT_8821A_1ANT_COEX_ALGO_HID;
504 } else if (bt_link_info->a2dp_exist) {
505 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = SCO + A2DP ==> SCO\n");
506 algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
507 } else if (bt_link_info->pan_exist) {
508 if (bt_hs_on) {
509 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = SCO + PAN(HS)\n");
510 algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
511 } else {
512 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = SCO + PAN(EDR)\n");
513 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
514 }
515 }
516 } else {
517 if (bt_link_info->hid_exist &&
518 bt_link_info->a2dp_exist) {
519 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = HID + A2DP\n");
520 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
521 } else if (bt_link_info->hid_exist &&
522 bt_link_info->pan_exist) {
523 if (bt_hs_on) {
524 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = HID + PAN(HS)\n");
525 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
526 } else {
527 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = HID + PAN(EDR)\n");
528 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
529 }
530 } else if (bt_link_info->pan_exist &&
531 bt_link_info->a2dp_exist) {
532 if (bt_hs_on) {
533 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = A2DP + PAN(HS)\n");
534 algorithm = BT_8821A_1ANT_COEX_ALGO_A2DP_PANHS;
535 } else {
536 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = A2DP + PAN(EDR)\n");
537 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP;
538 }
539 }
540 }
541 } else if (num_of_diff_profile == 3) {
542 if (bt_link_info->sco_exist) {
543 if (bt_link_info->hid_exist &&
544 bt_link_info->a2dp_exist) {
545 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n");
546 algorithm = BT_8821A_1ANT_COEX_ALGO_HID;
547 } else if (bt_link_info->hid_exist &&
548 bt_link_info->pan_exist) {
549 if (bt_hs_on) {
550 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = SCO + HID + PAN(HS)\n");
551 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
552 } else {
553 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n");
554 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
555 }
556 } else if (bt_link_info->pan_exist &&
557 bt_link_info->a2dp_exist) {
558 if (bt_hs_on) {
559 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n");
560 algorithm = BT_8821A_1ANT_COEX_ALGO_SCO;
561 } else {
562 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n");
563 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
564 }
565 }
566 } else {
567 if (bt_link_info->hid_exist &&
568 bt_link_info->pan_exist &&
569 bt_link_info->a2dp_exist) {
570 if (bt_hs_on) {
571 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n");
572 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP;
573 } else {
574 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n");
575 algorithm = BT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR;
576 }
577 }
578 }
579 } else if (num_of_diff_profile >= 3) {
580 if (bt_link_info->sco_exist) {
581 if (bt_link_info->hid_exist &&
582 bt_link_info->pan_exist &&
583 bt_link_info->a2dp_exist) {
584 if (bt_hs_on) {
585 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n");
586 } else {
587 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR) ==>PAN(EDR)+HID\n");
588 algorithm = BT_8821A_1ANT_COEX_ALGO_PANEDR_HID;
589 }
590 }
591 }
592 }
593
594 return algorithm;
595 }
596
597 static void halbtc8821a1ant_set_bt_auto_report(struct btc_coexist *btcoexist,
598 bool enable_auto_report)
599 {
600 u8 h2c_parameter[1] = {0};
601
602 h2c_parameter[0] = 0;
603
604 if (enable_auto_report)
605 h2c_parameter[0] |= BIT(0);
606
607 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
608 "[BTCoex], BT FW auto report : %s, FW write 0x68 = 0x%x\n",
609 (enable_auto_report ? "Enabled!!" : "Disabled!!"),
610 h2c_parameter[0]);
611
612 btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
613 }
614
615 static void halbtc8821a1ant_bt_auto_report(struct btc_coexist *btcoexist,
616 bool force_exec,
617 bool enable_auto_report)
618 {
619 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, "[BTCoex], %s BT Auto report = %s\n",
620 (force_exec ? "force to" : ""), ((enable_auto_report) ? "Enabled" : "Disabled"));
621 coex_dm->cur_bt_auto_report = enable_auto_report;
622
623 if (!force_exec) {
624 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, "[BTCoex], pre_bt_auto_report =%d, cur_bt_auto_report =%d\n",
625 coex_dm->pre_bt_auto_report, coex_dm->cur_bt_auto_report);
626
627 if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
628 return;
629 }
630 halbtc8821a1ant_set_bt_auto_report(btcoexist, coex_dm->cur_bt_auto_report);
631
632 coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
633 }
634
635 static void set_sw_penalty_tx_rate_adaptive(struct btc_coexist *btcoexist,
636 bool low_penalty_ra)
637 {
638 u8 h2c_parameter[6] = {0};
639
640 h2c_parameter[0] = 0x6; /* opCode, 0x6 = Retry_Penalty */
641
642 if (low_penalty_ra) {
643 h2c_parameter[1] |= BIT(0);
644 h2c_parameter[2] = 0x00; /* normal rate except MCS7/6/5,
645 * OFDM54/48/36 */
646 h2c_parameter[3] = 0xf7; /* MCS7 or OFDM54 */
647 h2c_parameter[4] = 0xf8; /* MCS6 or OFDM48 */
648 h2c_parameter[5] = 0xf9; /* MCS5 or OFDM36 */
649 }
650
651 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
652 "[BTCoex], set WiFi Low-Penalty Retry: %s",
653 (low_penalty_ra ? "ON!!" : "OFF!!"));
654
655 btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
656 }
657
658 static void halbtc8821a1ant_low_penalty_ra(struct btc_coexist *btcoexist,
659 bool force_exec, bool low_penalty_ra)
660 {
661 coex_dm->cur_low_penalty_ra = low_penalty_ra;
662
663 if (!force_exec) {
664 if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
665 return;
666 }
667 set_sw_penalty_tx_rate_adaptive(btcoexist, coex_dm->cur_low_penalty_ra);
668
669 coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
670 }
671
672 static void halbtc8821a1ant_set_coex_table(struct btc_coexist *btcoexist,
673 u32 val0x6c0, u32 val0x6c4,
674 u32 val0x6c8, u8 val0x6cc)
675 {
676 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
677 "[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0);
678 btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
679
680 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
681 "[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4);
682 btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
683
684 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
685 "[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8);
686 btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
687
688 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC,
689 "[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc);
690 btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
691 }
692
693 static void halbtc8821a1ant_coex_table(struct btc_coexist *btcoexist,
694 bool force_exec, u32 val0x6c0,
695 u32 val0x6c4, u32 val0x6c8, u8 val0x6cc)
696 {
697 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW,
698 "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6c8 = 0x%x, 0x6cc = 0x%x\n",
699 (force_exec ? "force to" : ""), val0x6c0, val0x6c4,
700 val0x6c8, val0x6cc);
701 coex_dm->cur_val_0x6c0 = val0x6c0;
702 coex_dm->cur_val_0x6c4 = val0x6c4;
703 coex_dm->cur_val_0x6c8 = val0x6c8;
704 coex_dm->cur_val_0x6cc = val0x6cc;
705
706 if (!force_exec) {
707 if ((coex_dm->pre_val_0x6c0 == coex_dm->cur_val_0x6c0) &&
708 (coex_dm->pre_val_0x6c4 == coex_dm->cur_val_0x6c4) &&
709 (coex_dm->pre_val_0x6c8 == coex_dm->cur_val_0x6c8) &&
710 (coex_dm->pre_val_0x6cc == coex_dm->cur_val_0x6cc))
711 return;
712 }
713 halbtc8821a1ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,
714 val0x6c8, val0x6cc);
715
716 coex_dm->pre_val_0x6c0 = coex_dm->cur_val_0x6c0;
717 coex_dm->pre_val_0x6c4 = coex_dm->cur_val_0x6c4;
718 coex_dm->pre_val_0x6c8 = coex_dm->cur_val_0x6c8;
719 coex_dm->pre_val_0x6cc = coex_dm->cur_val_0x6cc;
720 }
721
722 static void halbtc8821a1ant_coex_table_with_type(struct btc_coexist *btcoexist,
723 bool force_exec, u8 type)
724 {
725 switch (type) {
726 case 0:
727 halbtc8821a1ant_coex_table(btcoexist, force_exec,
728 0x55555555, 0x55555555,
729 0xffffff, 0x3);
730 break;
731 case 1:
732 halbtc8821a1ant_coex_table(btcoexist, force_exec,
733 0x55555555, 0x5a5a5a5a,
734 0xffffff, 0x3);
735 break;
736 case 2:
737 halbtc8821a1ant_coex_table(btcoexist, force_exec,
738 0x5a5a5a5a, 0x5a5a5a5a,
739 0xffffff, 0x3);
740 break;
741 case 3:
742 halbtc8821a1ant_coex_table(btcoexist, force_exec,
743 0x55555555, 0xaaaaaaaa,
744 0xffffff, 0x3);
745 break;
746 case 4:
747 halbtc8821a1ant_coex_table(btcoexist, force_exec,
748 0xffffffff, 0xffffffff,
749 0xffffff, 0x3);
750 break;
751 case 5:
752 halbtc8821a1ant_coex_table(btcoexist, force_exec,
753 0x5fff5fff, 0x5fff5fff,
754 0xffffff, 0x3);
755 break;
756 case 6:
757 halbtc8821a1ant_coex_table(btcoexist, force_exec,
758 0x55ff55ff, 0x5a5a5a5a,
759 0xffffff, 0x3);
760 break;
761 case 7:
762 halbtc8821a1ant_coex_table(btcoexist, force_exec,
763 0x5afa5afa, 0x5afa5afa,
764 0xffffff, 0x3);
765 break;
766 default:
767 break;
768 }
769 }
770
771 static void halbtc8821a1ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,
772 bool enable)
773 {
774 u8 h2c_parameter[1] = {0};
775
776 if (enable)
777 h2c_parameter[0] |= BIT(0); /* function enable */
778
779 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
780 "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
781 h2c_parameter[0]);
782
783 btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
784 }
785
786 static void halbtc8821a1ant_ignore_wlan_act(struct btc_coexist *btcoexist,
787 bool force_exec, bool enable)
788 {
789 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW,
790 "[BTCoex], %s turn Ignore WlanAct %s\n",
791 (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
792 coex_dm->cur_ignore_wlan_act = enable;
793
794 if (!force_exec) {
795 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL,
796 "[BTCoex], pre_ignore_wlan_act = %d, cur_ignore_wlan_act = %d!!\n",
797 coex_dm->pre_ignore_wlan_act,
798 coex_dm->cur_ignore_wlan_act);
799
800 if (coex_dm->pre_ignore_wlan_act ==
801 coex_dm->cur_ignore_wlan_act)
802 return;
803 }
804 halbtc8821a1ant_set_fw_ignore_wlan_act(btcoexist, enable);
805
806 coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
807 }
808
809 static void
810 halbtc8821a1ant_set_fw_pstdma(
811 struct btc_coexist *btcoexist,
812 u8 byte1,
813 u8 byte2,
814 u8 byte3,
815 u8 byte4,
816 u8 byte5
817 )
818 {
819 u8 h2c_parameter[5] = {0};
820
821 h2c_parameter[0] = byte1;
822 h2c_parameter[1] = byte2;
823 h2c_parameter[2] = byte3;
824 h2c_parameter[3] = byte4;
825 h2c_parameter[4] = byte5;
826
827 coex_dm->ps_tdma_para[0] = byte1;
828 coex_dm->ps_tdma_para[1] = byte2;
829 coex_dm->ps_tdma_para[2] = byte3;
830 coex_dm->ps_tdma_para[3] = byte4;
831 coex_dm->ps_tdma_para[4] = byte5;
832
833 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, "[BTCoex], PS-TDMA H2C cmd = 0x%x%08x\n",
834 h2c_parameter[0],
835 h2c_parameter[1]<<24|h2c_parameter[2]<<16|h2c_parameter[3]<<8|h2c_parameter[4]);
836
837 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
838 }
839
840 static void
841 halbtc8821a1ant_set_lps_rpwm(
842 struct btc_coexist *btcoexist,
843 u8 lps_val,
844 u8 rpwm_val
845 )
846 {
847 u8 lps = lps_val;
848 u8 rpwm = rpwm_val;
849
850 btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
851 btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
852 }
853
854 static void
855 halbtc8821a1ant_lps_rpwm(
856 struct btc_coexist *btcoexist,
857 bool force_exec,
858 u8 lps_val,
859 u8 rpwm_val
860 )
861 {
862 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, "[BTCoex], %s set lps/rpwm = 0x%x/0x%x\n",
863 (force_exec ? "force to" : ""), lps_val, rpwm_val);
864 coex_dm->cur_lps = lps_val;
865 coex_dm->cur_rpwm = rpwm_val;
866
867 if (!force_exec) {
868 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, "[BTCoex], LPS-RxBeaconMode = 0x%x , LPS-RPWM = 0x%x!!\n",
869 coex_dm->cur_lps, coex_dm->cur_rpwm);
870
871 if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
872 (coex_dm->pre_rpwm == coex_dm->cur_rpwm)) {
873 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, "[BTCoex], LPS-RPWM_Last = 0x%x , LPS-RPWM_Now = 0x%x!!\n",
874 coex_dm->pre_rpwm, coex_dm->cur_rpwm);
875
876 return;
877 }
878 }
879 halbtc8821a1ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
880
881 coex_dm->pre_lps = coex_dm->cur_lps;
882 coex_dm->pre_rpwm = coex_dm->cur_rpwm;
883 }
884
885 static void
886 halbtc8821a1ant_sw_mechanism(
887 struct btc_coexist *btcoexist,
888 bool low_penalty_ra
889 )
890 {
891 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, "[BTCoex], SM[LpRA] = %d\n", low_penalty_ra);
892
893 halbtc8821a1ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
894 }
895
896 static void
897 halbtc8821a1ant_set_ant_path(
898 struct btc_coexist *btcoexist,
899 u8 ant_pos_type,
900 bool init_hw_cfg,
901 bool wifi_off
902 )
903 {
904 struct btc_board_info *board_info = &btcoexist->board_info;
905 u32 u4_tmp = 0;
906 u8 h2c_parameter[2] = {0};
907
908 if (init_hw_cfg) {
909 /* 0x4c[23] = 0, 0x4c[24] = 1 Antenna control by WL/BT */
910 u4_tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
911 u4_tmp &= ~BIT(23);
912 u4_tmp |= BIT(24);
913 btcoexist->btc_write_4byte(btcoexist, 0x4c, u4_tmp);
914
915 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x975, 0x3, 0x3);
916 btcoexist->btc_write_1byte(btcoexist, 0xcb4, 0x77);
917
918 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {
919 /* tell firmware "antenna inverse" ==> WRONG firmware antenna control code.==>need fw to fix */
920 h2c_parameter[0] = 1;
921 h2c_parameter[1] = 1;
922 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2, h2c_parameter);
923
924 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x64, 0x1, 0x1); /* Main Ant to BT for IPS case 0x4c[23] = 1 */
925 } else {
926 /* tell firmware "no antenna inverse" ==> WRONG firmware antenna control code.==>need fw to fix */
927 h2c_parameter[0] = 0;
928 h2c_parameter[1] = 1;
929 btcoexist->btc_fill_h2c(btcoexist, 0x65, 2, h2c_parameter);
930
931 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x64, 0x1, 0x0); /* Aux Ant to BT for IPS case 0x4c[23] = 1 */
932 }
933 } else if (wifi_off) {
934 /* 0x4c[24:23] = 00, Set Antenna control by BT_RFE_CTRL BT Vendor 0xac = 0xf002 */
935 u4_tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
936 u4_tmp &= ~BIT(23);
937 u4_tmp &= ~BIT(24);
938 btcoexist->btc_write_4byte(btcoexist, 0x4c, u4_tmp);
939 }
940
941 /* ext switch setting */
942 switch (ant_pos_type) {
943 case BTC_ANT_PATH_WIFI:
944 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
945 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7, 0x30, 0x1);
946 else
947 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7, 0x30, 0x2);
948 break;
949 case BTC_ANT_PATH_BT:
950 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
951 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7, 0x30, 0x2);
952 else
953 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7, 0x30, 0x1);
954 break;
955 case BTC_ANT_PATH_PTA:
956 default:
957 if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
958 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7, 0x30, 0x1);
959 else
960 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7, 0x30, 0x2);
961 break;
962 }
963 }
964
965 static void
966 halbtc8821a1ant_ps_tdma(
967 struct btc_coexist *btcoexist,
968 bool force_exec,
969 bool turn_on,
970 u8 type
971 )
972 {
973 u8 rssi_adjust_val = 0;
974
975 coex_dm->cur_ps_tdma_on = turn_on;
976 coex_dm->cur_ps_tdma = type;
977
978 if (!force_exec) {
979 if (coex_dm->cur_ps_tdma_on) {
980 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, "[BTCoex], ********** TDMA(on, %d) **********\n",
981 coex_dm->cur_ps_tdma);
982 } else {
983 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, "[BTCoex], ********** TDMA(off, %d) **********\n",
984 coex_dm->cur_ps_tdma);
985 }
986
987 if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
988 (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
989 return;
990 }
991 if (turn_on) {
992 switch (type) {
993 default:
994 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x51, 0x1a, 0x1a, 0x0, 0x50);
995 break;
996 case 1:
997 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x51, 0x3a, 0x03, 0x10, 0x50);
998 rssi_adjust_val = 11;
999 break;
1000 case 2:
1001 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x51, 0x2b, 0x03, 0x10, 0x50);
1002 rssi_adjust_val = 14;
1003 break;
1004 case 3:
1005 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x51, 0x1d, 0x1d, 0x0, 0x10);
1006 break;
1007 case 4:
1008 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x93, 0x15, 0x3, 0x14, 0x0);
1009 rssi_adjust_val = 17;
1010 break;
1011 case 5:
1012 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x61, 0x15, 0x3, 0x11, 0x10);
1013 break;
1014 case 6:
1015 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x13, 0xa, 0x3, 0x0, 0x0);
1016 break;
1017 case 7:
1018 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x13, 0xc, 0x5, 0x0, 0x0);
1019 break;
1020 case 8:
1021 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x93, 0x25, 0x3, 0x10, 0x0);
1022 break;
1023 case 9:
1024 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x51, 0x21, 0x3, 0x10, 0x50);
1025 rssi_adjust_val = 18;
1026 break;
1027 case 10:
1028 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x13, 0xa, 0xa, 0x0, 0x40);
1029 break;
1030 case 11:
1031 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x51, 0x14, 0x03, 0x10, 0x10);
1032 rssi_adjust_val = 20;
1033 break;
1034 case 12:
1035 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50);
1036 break;
1037 case 13:
1038 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x51, 0x18, 0x18, 0x0, 0x10);
1039 break;
1040 case 14:
1041 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x51, 0x21, 0x3, 0x10, 0x10);
1042 break;
1043 case 15:
1044 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x13, 0xa, 0x3, 0x8, 0x0);
1045 break;
1046 case 16:
1047 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x93, 0x15, 0x3, 0x10, 0x0);
1048 rssi_adjust_val = 18;
1049 break;
1050 case 18:
1051 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x93, 0x25, 0x3, 0x10, 0x0);
1052 rssi_adjust_val = 14;
1053 break;
1054 case 20:
1055 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x61, 0x35, 0x03, 0x11, 0x10);
1056 break;
1057 case 21:
1058 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x61, 0x15, 0x03, 0x11, 0x10);
1059 break;
1060 case 22:
1061 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x61, 0x25, 0x03, 0x11, 0x10);
1062 break;
1063 case 23:
1064 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0xe3, 0x25, 0x3, 0x31, 0x18);
1065 rssi_adjust_val = 22;
1066 break;
1067 case 24:
1068 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0xe3, 0x15, 0x3, 0x31, 0x18);
1069 rssi_adjust_val = 22;
1070 break;
1071 case 25:
1072 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);
1073 rssi_adjust_val = 22;
1074 break;
1075 case 26:
1076 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);
1077 rssi_adjust_val = 22;
1078 break;
1079 case 27:
1080 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0xe3, 0x25, 0x3, 0x31, 0x98);
1081 rssi_adjust_val = 22;
1082 break;
1083 case 28:
1084 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x69, 0x25, 0x3, 0x31, 0x0);
1085 break;
1086 case 29:
1087 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10);
1088 break;
1089 case 30:
1090 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x51, 0x14, 0x3, 0x10, 0x50);
1091 break;
1092 case 31:
1093 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0xd3, 0x1a, 0x1a, 0, 0x58);
1094 break;
1095 case 32:
1096 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x61, 0xa, 0x3, 0x10, 0x0);
1097 break;
1098 case 33:
1099 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0xa3, 0x25, 0x3, 0x30, 0x90);
1100 break;
1101 case 34:
1102 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x53, 0x1a, 0x1a, 0x0, 0x10);
1103 break;
1104 case 35:
1105 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x63, 0x1a, 0x1a, 0x0, 0x10);
1106 break;
1107 case 36:
1108 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0xd3, 0x12, 0x3, 0x14, 0x50);
1109 break;
1110 }
1111 } else {
1112 /* disable PS tdma */
1113 switch (type) {
1114 case 8: /* PTA Control */
1115 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x8, 0x0, 0x0, 0x0, 0x0);
1116 halbtc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA, false, false);
1117 break;
1118 case 0:
1119 default: /* Software control, Antenna at BT side */
1120 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x0, 0x0, 0x0, 0x0, 0x0);
1121 halbtc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, false);
1122 break;
1123 case 9: /* Software control, Antenna at WiFi side */
1124 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x0, 0x0, 0x0, 0x0, 0x0);
1125 halbtc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_WIFI, false, false);
1126 break;
1127 case 10: /* under 5G */
1128 halbtc8821a1ant_set_fw_pstdma(btcoexist, 0x0, 0x0, 0x0, 0x8, 0x0);
1129 halbtc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, false);
1130 break;
1131 }
1132 }
1133 rssi_adjust_val = 0;
1134 btcoexist->btc_set(btcoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssi_adjust_val);
1135
1136 /* update pre state */
1137 coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1138 coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1139 }
1140
1141 static bool
1142 halbtc8821a1ant_is_common_action(
1143 struct btc_coexist *btcoexist
1144 )
1145 {
1146 bool bCommon = false, wifi_connected = false, wifi_busy = false;
1147
1148 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
1149 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1150
1151 if (!wifi_connected &&
1152 BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == coex_dm->bt_status) {
1153 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n");
1154 halbtc8821a1ant_sw_mechanism(btcoexist, false);
1155
1156 bCommon = true;
1157 } else if (wifi_connected &&
1158 (BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == coex_dm->bt_status)) {
1159 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], Wifi connected + BT non connected-idle!!\n");
1160 halbtc8821a1ant_sw_mechanism(btcoexist, false);
1161
1162 bCommon = true;
1163 } else if (!wifi_connected &&
1164 (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)) {
1165 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], Wifi non connected-idle + BT connected-idle!!\n");
1166 halbtc8821a1ant_sw_mechanism(btcoexist, false);
1167
1168 bCommon = true;
1169 } else if (wifi_connected &&
1170 (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)) {
1171 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], Wifi connected + BT connected-idle!!\n");
1172 halbtc8821a1ant_sw_mechanism(btcoexist, false);
1173
1174 bCommon = true;
1175 } else if (!wifi_connected &&
1176 (BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE != coex_dm->bt_status)) {
1177 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], Wifi non connected-idle + BT Busy!!\n");
1178 halbtc8821a1ant_sw_mechanism(btcoexist, false);
1179
1180 bCommon = true;
1181 } else {
1182 if (wifi_busy) {
1183 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], Wifi Connected-Busy + BT Busy!!\n");
1184 } else {
1185 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], Wifi Connected-Idle + BT Busy!!\n");
1186 }
1187
1188 bCommon = false;
1189 }
1190
1191 return bCommon;
1192 }
1193
1194 static void
1195 halbtc8821a1ant_tdma_duration_adjust_for_acl(
1196 struct btc_coexist *btcoexist,
1197 u8 wifi_status
1198 )
1199 {
1200 static long up, dn, m, n, wait_count;
1201 long result; /* 0: no change, +1: increase WiFi duration, -1: decrease WiFi duration */
1202 u8 retry_count = 0, bt_info_ext;
1203
1204 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, "[BTCoex], TdmaDurationAdjustForAcl()\n");
1205
1206 if ((BT_8821A_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifi_status) ||
1207 (BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN == wifi_status) ||
1208 (BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT == wifi_status)) {
1209 if (coex_dm->cur_ps_tdma != 1 &&
1210 coex_dm->cur_ps_tdma != 2 &&
1211 coex_dm->cur_ps_tdma != 3 &&
1212 coex_dm->cur_ps_tdma != 9) {
1213 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
1214 coex_dm->ps_tdma_du_adj_type = 9;
1215
1216 up = 0;
1217 dn = 0;
1218 m = 1;
1219 n = 3;
1220 result = 0;
1221 wait_count = 0;
1222 }
1223 return;
1224 }
1225
1226 if (!coex_dm->auto_tdma_adjust) {
1227 coex_dm->auto_tdma_adjust = true;
1228 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, "[BTCoex], first run TdmaDurationAdjust()!!\n");
1229
1230 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2);
1231 coex_dm->ps_tdma_du_adj_type = 2;
1232 /* */
1233 up = 0;
1234 dn = 0;
1235 m = 1;
1236 n = 3;
1237 result = 0;
1238 wait_count = 0;
1239 } else {
1240 /* accquire the BT TRx retry count from BT_Info byte2 */
1241 retry_count = coex_sta->bt_retry_cnt;
1242 bt_info_ext = coex_sta->bt_info_ext;
1243 /* BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, "[BTCoex], retry_count = %d\n", retry_count)); */
1244 /* BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, "[BTCoex], up =%d, dn =%d, m =%d, n =%d, wait_count =%d\n", */
1245 /* up, dn, m, n, wait_count)); */
1246 result = 0;
1247 wait_count++;
1248
1249 if (retry_count == 0) {
1250 /* no retry in the last 2-second duration */
1251 up++;
1252 dn--;
1253
1254 if (dn <= 0)
1255 dn = 0;
1256
1257 if (up >= n) {
1258 wait_count = 0;
1259 n = 3;
1260 up = 0;
1261 dn = 0;
1262 result = 1;
1263 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, "[BTCoex], Increase wifi duration!!\n");
1264 }
1265 } else if (retry_count <= 3) {
1266 up--;
1267 dn++;
1268
1269 if (up <= 0)
1270 up = 0;
1271
1272 if (dn == 2) {
1273 if (wait_count <= 2)
1274 m++;
1275 else
1276 m = 1;
1277 if (m >= 20)
1278 m = 20;
1279
1280 n = 3*m;
1281 up = 0;
1282 dn = 0;
1283 wait_count = 0;
1284 result = -1;
1285 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, "[BTCoex], Decrease wifi duration for retryCounter<3!!\n");
1286 }
1287 } else {
1288 if (wait_count == 1)
1289 m++;
1290 else
1291 m = 1;
1292 if (m >= 20)
1293 m = 20;
1294
1295 n = 3*m;
1296 up = 0;
1297 dn = 0;
1298 wait_count = 0;
1299 result = -1;
1300 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, "[BTCoex], Decrease wifi duration for retryCounter>3!!\n");
1301 }
1302
1303 if (result == -1) {
1304 if ((BT_INFO_8821A_1ANT_A2DP_BASIC_RATE(bt_info_ext)) &&
1305 ((coex_dm->cur_ps_tdma == 1) || (coex_dm->cur_ps_tdma == 2))) {
1306 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
1307 coex_dm->ps_tdma_du_adj_type = 9;
1308 } else if (coex_dm->cur_ps_tdma == 1) {
1309 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2);
1310 coex_dm->ps_tdma_du_adj_type = 2;
1311 } else if (coex_dm->cur_ps_tdma == 2) {
1312 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
1313 coex_dm->ps_tdma_du_adj_type = 9;
1314 } else if (coex_dm->cur_ps_tdma == 9) {
1315 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
1316 coex_dm->ps_tdma_du_adj_type = 11;
1317 }
1318 } else if (result == 1) {
1319 if ((BT_INFO_8821A_1ANT_A2DP_BASIC_RATE(bt_info_ext)) &&
1320 ((coex_dm->cur_ps_tdma == 1) || (coex_dm->cur_ps_tdma == 2))) {
1321 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
1322 coex_dm->ps_tdma_du_adj_type = 9;
1323 } else if (coex_dm->cur_ps_tdma == 11) {
1324 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
1325 coex_dm->ps_tdma_du_adj_type = 9;
1326 } else if (coex_dm->cur_ps_tdma == 9) {
1327 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2);
1328 coex_dm->ps_tdma_du_adj_type = 2;
1329 } else if (coex_dm->cur_ps_tdma == 2) {
1330 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1);
1331 coex_dm->ps_tdma_du_adj_type = 1;
1332 }
1333 } else {
1334 /* no change */
1335 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, "[BTCoex], ********** TDMA(on, %d) **********\n",
1336 coex_dm->cur_ps_tdma);
1337 }
1338
1339 if (coex_dm->cur_ps_tdma != 1 &&
1340 coex_dm->cur_ps_tdma != 2 &&
1341 coex_dm->cur_ps_tdma != 9 &&
1342 coex_dm->cur_ps_tdma != 11) {
1343 /* recover to previous adjust type */
1344 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, coex_dm->ps_tdma_du_adj_type);
1345 }
1346 }
1347 }
1348
1349 static void
1350 halbtc8821a1ant_ps_tdma_check_for_power_save_state(
1351 struct btc_coexist *btcoexist,
1352 bool new_ps_state
1353 )
1354 {
1355 u8 lps_mode = 0x0;
1356
1357 btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1358
1359 if (lps_mode) {
1360 /* already under LPS state */
1361 if (!new_ps_state) {
1362 /* will leave LPS state, turn off psTdma first */
1363 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
1364 }
1365 } else {
1366 /* NO PS state */
1367 if (new_ps_state) {
1368 /* will enter LPS state, turn off psTdma first */
1369 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
1370 } else {
1371 /* keep state under NO PS state, do nothing. */
1372 }
1373 }
1374 }
1375
1376 static void
1377 halbtc8821a1ant_power_save_state(
1378 struct btc_coexist *btcoexist,
1379 u8 ps_type,
1380 u8 lps_val,
1381 u8 rpwm_val
1382 )
1383 {
1384 bool low_pwr_disable = false;
1385
1386 switch (ps_type) {
1387 case BTC_PS_WIFI_NATIVE:
1388 /* recover to original 32k low power setting */
1389 low_pwr_disable = false;
1390 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &low_pwr_disable);
1391 btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
1392 break;
1393 case BTC_PS_LPS_ON:
1394 halbtc8821a1ant_ps_tdma_check_for_power_save_state(btcoexist, true);
1395 halbtc8821a1ant_lps_rpwm(btcoexist, NORMAL_EXEC, lps_val, rpwm_val);
1396 /* when coex force to enter LPS, do not enter 32k low power. */
1397 low_pwr_disable = true;
1398 btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &low_pwr_disable);
1399 /* power save must executed before psTdma. */
1400 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
1401 break;
1402 case BTC_PS_LPS_OFF:
1403 halbtc8821a1ant_ps_tdma_check_for_power_save_state(btcoexist, false);
1404 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
1405 break;
1406 default:
1407 break;
1408 }
1409 }
1410
1411 static void
1412 halbtc8821a1ant_coex_under_5g(
1413 struct btc_coexist *btcoexist
1414 )
1415 {
1416 halbtc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1417
1418 halbtc8821a1ant_ignore_wlan_act(btcoexist, NORMAL_EXEC, true);
1419
1420 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 10);
1421
1422 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1423
1424 halbtc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
1425
1426 halbtc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false, false, 5);
1427 }
1428
1429 static void
1430 halbtc8821a1ant_action_wifi_only(
1431 struct btc_coexist *btcoexist
1432 )
1433 {
1434 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1435 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 9);
1436 }
1437
1438 static void
1439 halbtc8821a1ant_monitor_bt_enable_disable(
1440 struct btc_coexist *btcoexist
1441 )
1442 {
1443 static bool pre_bt_disabled;
1444 static u32 bt_disable_cnt;
1445 bool bt_active = true, bt_disabled = false;
1446
1447 /* This function check if bt is disabled */
1448
1449 if (coex_sta->high_priority_tx == 0 &&
1450 coex_sta->high_priority_rx == 0 &&
1451 coex_sta->low_priority_tx == 0 &&
1452 coex_sta->low_priority_rx == 0) {
1453 bt_active = false;
1454 }
1455 if (coex_sta->high_priority_tx == 0xffff &&
1456 coex_sta->high_priority_rx == 0xffff &&
1457 coex_sta->low_priority_tx == 0xffff &&
1458 coex_sta->low_priority_rx == 0xffff) {
1459 bt_active = false;
1460 }
1461 if (bt_active) {
1462 bt_disable_cnt = 0;
1463 bt_disabled = false;
1464 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
1465 &bt_disabled);
1466 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
1467 "[BTCoex], BT is enabled !!\n");
1468 } else {
1469 bt_disable_cnt++;
1470 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
1471 "[BTCoex], bt all counters = 0, %d times!!\n",
1472 bt_disable_cnt);
1473 if (bt_disable_cnt >= 2) {
1474 bt_disabled = true;
1475 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
1476 &bt_disabled);
1477 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
1478 "[BTCoex], BT is disabled !!\n");
1479 halbtc8821a1ant_action_wifi_only(btcoexist);
1480 }
1481 }
1482 if (pre_bt_disabled != bt_disabled) {
1483 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR,
1484 "[BTCoex], BT is from %s to %s!!\n",
1485 (pre_bt_disabled ? "disabled" : "enabled"),
1486 (bt_disabled ? "disabled" : "enabled"));
1487 pre_bt_disabled = bt_disabled;
1488 if (bt_disabled) {
1489 btcoexist->btc_set(btcoexist,
1490 BTC_SET_ACT_LEAVE_LPS, NULL);
1491 btcoexist->btc_set(btcoexist,
1492 BTC_SET_ACT_NORMAL_LPS, NULL);
1493 }
1494 }
1495 }
1496
1497 /* Software Coex Mechanism start */
1498 static void halbtc8821a1ant_action_sco(struct btc_coexist *btcoexist)
1499 {
1500 halbtc8821a1ant_sw_mechanism(btcoexist, true);
1501 }
1502
1503 static void halbtc8821a1ant_action_hid(struct btc_coexist *btcoexist)
1504 {
1505 halbtc8821a1ant_sw_mechanism(btcoexist, true);
1506 }
1507
1508 /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
1509 static void halbtc8821a1ant_action_a2dp(struct btc_coexist *btcoexist)
1510 {
1511 halbtc8821a1ant_sw_mechanism(btcoexist, false);
1512 }
1513
1514 static void halbtc8821a1ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)
1515 {
1516 halbtc8821a1ant_sw_mechanism(btcoexist, false);
1517 }
1518
1519 static void halbtc8821a1ant_action_pan_edr(struct btc_coexist *btcoexist)
1520 {
1521 halbtc8821a1ant_sw_mechanism(btcoexist, false);
1522 }
1523
1524 /* PAN(HS) only */
1525 static void halbtc8821a1ant_action_pan_hs(struct btc_coexist *btcoexist)
1526 {
1527 halbtc8821a1ant_sw_mechanism(btcoexist, false);
1528 }
1529
1530 /* PAN(EDR)+A2DP */
1531 static void halbtc8821a1ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)
1532 {
1533 halbtc8821a1ant_sw_mechanism(btcoexist, false);
1534 }
1535
1536 static void halbtc8821a1ant_action_pan_edr_hid(struct btc_coexist *btcoexist)
1537 {
1538 halbtc8821a1ant_sw_mechanism(btcoexist, true);
1539 }
1540
1541 /* HID+A2DP+PAN(EDR) */
1542 static void halbtc8821a1ant_action_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)
1543 {
1544 halbtc8821a1ant_sw_mechanism(btcoexist, true);
1545 }
1546
1547 static void halbtc8821a1ant_action_hid_a2dp(struct btc_coexist *btcoexist)
1548 {
1549 halbtc8821a1ant_sw_mechanism(btcoexist, true);
1550 }
1551
1552 /* Non-Software Coex Mechanism start */
1553 static void halbtc8821a1ant_action_hs(struct btc_coexist *btcoexist)
1554 {
1555 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1556 halbtc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 2);
1557 }
1558
1559 static void halbtc8821a1ant_action_bt_inquiry(struct btc_coexist *btcoexist)
1560 {
1561 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1562 bool wifi_connected = false;
1563
1564 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
1565
1566 if (!wifi_connected) {
1567 halbtc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1568 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1569 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1570 } else if ((bt_link_info->sco_exist) ||
1571 (bt_link_info->hid_only)) {
1572 /* SCO/HID-only busy */
1573 halbtc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1574 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 32);
1575 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1576 } else {
1577 halbtc8821a1ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50, 0x4);
1578 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 30);
1579 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1580 }
1581 }
1582
1583 static void
1584 halbtc8821a1ant_action_bt_sco_hid_only_busy(
1585 struct btc_coexist *btcoexist,
1586 u8 wifi_status
1587 )
1588 {
1589 /* tdma and coex table */
1590 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1591
1592 if (BT_8821A_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN == wifi_status)
1593 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1594 else
1595 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1596 }
1597
1598 static void action_wifi_connected_bt_acl_busy(struct btc_coexist *btcoexist, u8 wifi_status)
1599 {
1600 u8 bt_rssi_state;
1601
1602 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1603 bt_rssi_state = halbtc8821a1ant_bt_rssi_state(2, 28, 0);
1604
1605 if (bt_link_info->hid_only) {
1606 /* HID */
1607 halbtc8821a1ant_action_bt_sco_hid_only_busy(btcoexist, wifi_status);
1608 coex_dm->auto_tdma_adjust = false;
1609 return;
1610 } else if (bt_link_info->a2dp_only) { /* A2DP */
1611 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
1612 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1613 halbtc8821a1ant_tdma_duration_adjust_for_acl(btcoexist, wifi_status);
1614 } else { /* for low BT RSSI */
1615 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
1616 coex_dm->auto_tdma_adjust = false;
1617 }
1618
1619 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1620 } else if (bt_link_info->hid_exist && bt_link_info->a2dp_exist) {
1621 /* HID+A2DP */
1622 if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
1623 (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
1624 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
1625 coex_dm->auto_tdma_adjust = false;
1626 } else /* for low BT RSSI */ {
1627 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
1628 coex_dm->auto_tdma_adjust = false;
1629 }
1630
1631 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1632 } else if ((bt_link_info->pan_only) || (bt_link_info->hid_exist && bt_link_info->pan_exist)) {
1633 /* PAN(OPP, FTP), HID+PAN(OPP, FTP) */
1634 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
1635 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1636 coex_dm->auto_tdma_adjust = false;
1637 } else if (((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) ||
1638 (bt_link_info->hid_exist && bt_link_info->a2dp_exist &&
1639 bt_link_info->pan_exist)) {
1640 /* A2DP+PAN(OPP, FTP), HID+A2DP+PAN(OPP, FTP) */
1641 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
1642 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1643 coex_dm->auto_tdma_adjust = false;
1644 } else {
1645 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
1646 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1647 coex_dm->auto_tdma_adjust = false;
1648 }
1649 }
1650
1651 static void
1652 halbtc8821a1ant_action_wifi_not_connected(
1653 struct btc_coexist *btcoexist
1654 )
1655 {
1656 /* power save state */
1657 halbtc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1658
1659 /* tdma and coex table */
1660 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
1661 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
1662 }
1663
1664 static void wifi_not_connected_asso_auth_scan(struct btc_coexist *btcoexist)
1665 {
1666 halbtc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1667
1668 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1669 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1670 }
1671
1672 static void
1673 halbtc8821a1ant_action_wifi_connected_scan(
1674 struct btc_coexist *btcoexist
1675 )
1676 {
1677 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1678
1679 /* power save state */
1680 halbtc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1681
1682 /* tdma and coex table */
1683 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
1684 if (bt_link_info->a2dp_exist && bt_link_info->pan_exist) {
1685 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1686 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1687 } else {
1688 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1689 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1690 }
1691 } else if ((BT_8821A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
1692 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) {
1693 halbtc8821a1ant_action_bt_sco_hid_only_busy(btcoexist,
1694 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_SCAN);
1695 } else {
1696 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1697 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1698 }
1699 }
1700
1701 static void action_wifi_connected_special_packet(struct btc_coexist *btcoexist)
1702 {
1703 bool hs_connecting = false;
1704 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1705
1706 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_CONNECTING, &hs_connecting);
1707
1708 halbtc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1709
1710 /* tdma and coex table */
1711 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
1712 if (bt_link_info->a2dp_exist && bt_link_info->pan_exist) {
1713 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 22);
1714 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1715 } else {
1716 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1717 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1718 }
1719 } else {
1720 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 20);
1721 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
1722 }
1723 }
1724
1725 static void halbtc8821a1ant_action_wifi_connected(struct btc_coexist *btcoexist)
1726 {
1727 bool wifi_busy = false;
1728 bool scan = false, link = false, roam = false;
1729 bool under_4way = false;
1730
1731 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], CoexForWifiConnect() ===>\n");
1732
1733 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &under_4way);
1734 if (under_4way) {
1735 action_wifi_connected_special_packet(btcoexist);
1736 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n");
1737 return;
1738 }
1739
1740 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
1741 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
1742 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
1743 if (scan || link || roam) {
1744 halbtc8821a1ant_action_wifi_connected_scan(btcoexist);
1745 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n");
1746 return;
1747 }
1748
1749 /* power save state */
1750 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status && !btcoexist->bt_link_info.hid_only)
1751 halbtc8821a1ant_power_save_state(btcoexist, BTC_PS_LPS_ON, 0x50, 0x4);
1752 else
1753 halbtc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0);
1754
1755 /* tdma and coex table */
1756 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1757 if (!wifi_busy) {
1758 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
1759 action_wifi_connected_bt_acl_busy(btcoexist,
1760 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE);
1761 } else if ((BT_8821A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
1762 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) {
1763 halbtc8821a1ant_action_bt_sco_hid_only_busy(btcoexist,
1764 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_IDLE);
1765 } else {
1766 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
1767 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 2);
1768 }
1769 } else {
1770 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) {
1771 action_wifi_connected_bt_acl_busy(btcoexist,
1772 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_BUSY);
1773 } else if ((BT_8821A_1ANT_BT_STATUS_SCO_BUSY ==
1774 coex_dm->bt_status) ||
1775 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY ==
1776 coex_dm->bt_status)) {
1777 halbtc8821a1ant_action_bt_sco_hid_only_busy(btcoexist,
1778 BT_8821A_1ANT_WIFI_STATUS_CONNECTED_BUSY);
1779 } else {
1780 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC,
1781 true, 5);
1782 halbtc8821a1ant_coex_table_with_type(btcoexist,
1783 NORMAL_EXEC, 2);
1784 }
1785 }
1786 }
1787
1788 static void run_sw_coexist_mechanism(struct btc_coexist *btcoexist)
1789 {
1790 u8 algorithm = 0;
1791
1792 algorithm = halbtc8821a1ant_action_algorithm(btcoexist);
1793 coex_dm->cur_algorithm = algorithm;
1794
1795 if (!halbtc8821a1ant_is_common_action(btcoexist)) {
1796 switch (coex_dm->cur_algorithm) {
1797 case BT_8821A_1ANT_COEX_ALGO_SCO:
1798 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1799 "[BTCoex], Action algorithm = SCO.\n");
1800 halbtc8821a1ant_action_sco(btcoexist);
1801 break;
1802 case BT_8821A_1ANT_COEX_ALGO_HID:
1803 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1804 "[BTCoex], Action algorithm = HID.\n");
1805 halbtc8821a1ant_action_hid(btcoexist);
1806 break;
1807 case BT_8821A_1ANT_COEX_ALGO_A2DP:
1808 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1809 "[BTCoex], Action algorithm = A2DP.\n");
1810 halbtc8821a1ant_action_a2dp(btcoexist);
1811 break;
1812 case BT_8821A_1ANT_COEX_ALGO_A2DP_PANHS:
1813 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1814 "[BTCoex], Action algorithm = A2DP+PAN(HS).\n");
1815 halbtc8821a1ant_action_a2dp_pan_hs(btcoexist);
1816 break;
1817 case BT_8821A_1ANT_COEX_ALGO_PANEDR:
1818 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1819 "[BTCoex], Action algorithm = PAN(EDR).\n");
1820 halbtc8821a1ant_action_pan_edr(btcoexist);
1821 break;
1822 case BT_8821A_1ANT_COEX_ALGO_PANHS:
1823 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1824 "[BTCoex], Action algorithm = HS mode.\n");
1825 halbtc8821a1ant_action_pan_hs(btcoexist);
1826 break;
1827 case BT_8821A_1ANT_COEX_ALGO_PANEDR_A2DP:
1828 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1829 "[BTCoex], Action algorithm = PAN+A2DP.\n");
1830 halbtc8821a1ant_action_pan_edr_a2dp(btcoexist);
1831 break;
1832 case BT_8821A_1ANT_COEX_ALGO_PANEDR_HID:
1833 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1834 "[BTCoex], Action algorithm = PAN(EDR)+HID.\n");
1835 halbtc8821a1ant_action_pan_edr_hid(btcoexist);
1836 break;
1837 case BT_8821A_1ANT_COEX_ALGO_HID_A2DP_PANEDR:
1838 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1839 "[BTCoex], Action algorithm = HID+A2DP+PAN.\n");
1840 halbtc8821a1ant_action_hid_a2dp_pan_edr(btcoexist);
1841 break;
1842 case BT_8821A_1ANT_COEX_ALGO_HID_A2DP:
1843 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1844 "[BTCoex], Action algorithm = HID+A2DP.\n");
1845 halbtc8821a1ant_action_hid_a2dp(btcoexist);
1846 break;
1847 default:
1848 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1849 "[BTCoex], Action algorithm = coexist All Off!!\n");
1850 break;
1851 }
1852 coex_dm->pre_algorithm = coex_dm->cur_algorithm;
1853 }
1854 }
1855
1856 static void halbtc8821a1ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
1857 {
1858 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
1859 bool wifi_connected = false, bt_hs_on = false;
1860 bool increase_scan_dev_num = false;
1861 bool bt_ctrl_agg_buf_size = false;
1862 u8 agg_buf_size = 5;
1863 u8 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
1864 bool wifi_under_5g = false;
1865
1866 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1867 "[BTCoex], RunCoexistMechanism() ===>\n");
1868
1869 if (btcoexist->manual_control) {
1870 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1871 "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
1872 return;
1873 }
1874
1875 if (btcoexist->stop_coex_dm) {
1876 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1877 "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");
1878 return;
1879 }
1880
1881 if (coex_sta->under_ips) {
1882 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1883 "[BTCoex], wifi is under IPS !!!\n");
1884 return;
1885 }
1886
1887 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G,
1888 &wifi_under_5g);
1889 if (wifi_under_5g) {
1890 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
1891 "[BTCoex], RunCoexistMechanism(), return for 5G <===\n");
1892 halbtc8821a1ant_coex_under_5g(btcoexist);
1893 return;
1894 }
1895
1896 if ((BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
1897 (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
1898 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) {
1899 increase_scan_dev_num = true;
1900 }
1901
1902 btcoexist->btc_set(btcoexist, BTC_SET_BL_INC_SCAN_DEV_NUM,
1903 &increase_scan_dev_num);
1904
1905 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
1906 &wifi_connected);
1907
1908 if (!bt_link_info->sco_exist && !bt_link_info->hid_exist) {
1909 halbtc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC, 0, 0, 0, 0);
1910 } else {
1911 if (wifi_connected) {
1912 wifi_rssi_state = Wifi_rssi_state(btcoexist, 1, 2,
1913 30, 0);
1914 if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
1915 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
1916 halbtc8821a1ant_limited_tx(btcoexist,
1917 NORMAL_EXEC, 1, 1,
1918 1, 1);
1919 else
1920 halbtc8821a1ant_limited_tx(btcoexist,
1921 NORMAL_EXEC, 1, 1,
1922 1, 1);
1923 } else {
1924 halbtc8821a1ant_limited_tx(btcoexist, NORMAL_EXEC,
1925 0, 0, 0, 0);
1926 }
1927 }
1928
1929 if (bt_link_info->sco_exist) {
1930 bt_ctrl_agg_buf_size = true;
1931 agg_buf_size = 0x3;
1932 } else if (bt_link_info->hid_exist) {
1933 bt_ctrl_agg_buf_size = true;
1934 agg_buf_size = 0x5;
1935 } else if (bt_link_info->a2dp_exist || bt_link_info->pan_exist) {
1936 bt_ctrl_agg_buf_size = true;
1937 agg_buf_size = 0x8;
1938 }
1939 halbtc8821a1ant_limited_rx(btcoexist, NORMAL_EXEC, false,
1940 bt_ctrl_agg_buf_size, agg_buf_size);
1941
1942 run_sw_coexist_mechanism(btcoexist);
1943
1944 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
1945 if (coex_sta->c2h_bt_inquiry_page) {
1946 halbtc8821a1ant_action_bt_inquiry(btcoexist);
1947 return;
1948 } else if (bt_hs_on) {
1949 halbtc8821a1ant_action_hs(btcoexist);
1950 return;
1951 }
1952
1953 if (!wifi_connected) {
1954 bool scan = false, link = false, roam = false;
1955
1956 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, "[BTCoex], wifi is non connected-idle !!!\n");
1957
1958 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
1959 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
1960 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
1961
1962 if (scan || link || roam)
1963 wifi_not_connected_asso_auth_scan(btcoexist);
1964 else
1965 halbtc8821a1ant_action_wifi_not_connected(btcoexist);
1966 } else {
1967 /* wifi LPS/Busy */
1968 halbtc8821a1ant_action_wifi_connected(btcoexist);
1969 }
1970 }
1971
1972 static void halbtc8821a1ant_init_coex_dm(struct btc_coexist *btcoexist)
1973 {
1974 /* force to reset coex mechanism */
1975 /* sw all off */
1976 halbtc8821a1ant_sw_mechanism(btcoexist, false);
1977
1978 halbtc8821a1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 8);
1979 halbtc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
1980 }
1981
1982 static void halbtc8821a1ant_init_hw_config(struct btc_coexist *btcoexist,
1983 bool back_up)
1984 {
1985 u8 u1_tmp = 0;
1986 bool wifi_under_5g = false;
1987
1988 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
1989 "[BTCoex], 1Ant Init HW Config!!\n");
1990
1991 if (back_up) {
1992 coex_dm->backup_arfr_cnt1 =
1993 btcoexist->btc_read_4byte(btcoexist, 0x430);
1994 coex_dm->backup_arfr_cnt2 =
1995 btcoexist->btc_read_4byte(btcoexist, 0x434);
1996 coex_dm->backup_retry_limit =
1997 btcoexist->btc_read_2byte(btcoexist, 0x42a);
1998 coex_dm->backup_ampdu_max_time =
1999 btcoexist->btc_read_1byte(btcoexist, 0x456);
2000 }
2001
2002 /* 0x790[5:0] = 0x5 */
2003 u1_tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
2004 u1_tmp &= 0xc0;
2005 u1_tmp |= 0x5;
2006 btcoexist->btc_write_1byte(btcoexist, 0x790, u1_tmp);
2007
2008 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2009
2010 /* Antenna config */
2011 if (wifi_under_5g)
2012 halbtc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
2013 true, false);
2014 else
2015 halbtc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_PTA,
2016 true, false);
2017 /* PTA parameter */
2018 halbtc8821a1ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
2019
2020 /* Enable counter statistics */
2021 /* 0x76e[3] = 1, WLAN_Act control by PTA */
2022 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
2023 btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
2024 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
2025 }
2026
2027 /* */
2028 /* work around function start with wa_halbtc8821a1ant_ */
2029 /* */
2030 /* */
2031 /* extern function start with EXhalbtc8821a1ant_ */
2032 /* */
2033 void
2034 ex_halbtc8821a1ant_init_hwconfig(
2035 struct btc_coexist *btcoexist
2036 )
2037 {
2038 halbtc8821a1ant_init_hw_config(btcoexist, true);
2039 }
2040
2041 void
2042 ex_halbtc8821a1ant_init_coex_dm(
2043 struct btc_coexist *btcoexist
2044 )
2045 {
2046 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, "[BTCoex], Coex Mechanism Init!!\n");
2047
2048 btcoexist->stop_coex_dm = false;
2049
2050 halbtc8821a1ant_init_coex_dm(btcoexist);
2051
2052 halbtc8821a1ant_query_bt_info(btcoexist);
2053 }
2054
2055 void ex_halbtc8821a1ant_display_coex_info(struct btc_coexist *btcoexist)
2056 {
2057 struct btc_board_info *board_info = &btcoexist->board_info;
2058 struct btc_stack_info *stack_info = &btcoexist->stack_info;
2059 struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
2060 u8 *cli_buf = btcoexist->cli_buf;
2061 u8 u1_tmp[4], i, bt_info_ext, ps_tdma_case = 0;
2062 u16 u2_tmp[4];
2063 u32 u4_tmp[4];
2064 bool roam = false, scan = false, link = false, wifi_under_5g = false;
2065 bool bt_hs_on = false, wifi_busy = false;
2066 long wifi_rssi = 0, bt_hs_rssi = 0;
2067 u32 wifi_bw, wifi_traffic_dir;
2068 u8 wifi_dot11_chnl, wifi_hs_chnl;
2069 u32 fw_ver = 0, bt_patch_ver = 0;
2070
2071 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2072 "\n ============[BT Coexist info] ============");
2073 CL_PRINTF(cli_buf);
2074
2075 if (btcoexist->manual_control) {
2076 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2077 "\n ============[Under Manual Control] ============");
2078 CL_PRINTF(cli_buf);
2079 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2080 "\n ==========================================");
2081 CL_PRINTF(cli_buf);
2082 }
2083 if (btcoexist->stop_coex_dm) {
2084 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2085 "\n ============[Coex is STOPPED] ============");
2086 CL_PRINTF(cli_buf);
2087 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2088 "\n ==========================================");
2089 CL_PRINTF(cli_buf);
2090 }
2091
2092 if (!board_info->bt_exist) {
2093 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n BT not exists !!!");
2094 CL_PRINTF(cli_buf);
2095 return;
2096 }
2097
2098 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = %d/ %d/ %d",
2099 "Ant PG Num/ Ant Mech/ Ant Pos: ",
2100 board_info->pg_ant_num, board_info->btdm_ant_num,
2101 board_info->btdm_ant_pos);
2102 CL_PRINTF(cli_buf);
2103
2104 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = %s / %d",
2105 "BT stack/ hci ext ver",
2106 ((stack_info->profile_notified) ? "Yes" : "No"),
2107 stack_info->hci_version);
2108 CL_PRINTF(cli_buf);
2109
2110 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
2111 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
2112 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
2113 "CoexVer/ FwVer/ PatchVer",
2114 glcoex_ver_date_8821a_1ant, glcoex_ver_8821a_1ant, fw_ver,
2115 bt_patch_ver, bt_patch_ver);
2116 CL_PRINTF(cli_buf);
2117
2118 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2119 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
2120 &wifi_dot11_chnl);
2121 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);
2122 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = %d / %d(%d)",
2123 "Dot11 channel / HsChnl(HsMode)",
2124 wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);
2125 CL_PRINTF(cli_buf);
2126
2127 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = %02x %02x %02x ",
2128 "H2C Wifi inform bt chnl Info",
2129 coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1],
2130 coex_dm->wifi_chnl_info[2]);
2131 CL_PRINTF(cli_buf);
2132
2133 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
2134 btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
2135 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = %d/ %d",
2136 "Wifi rssi/ HS rssi",
2137 (int)wifi_rssi, (int)bt_hs_rssi);
2138 CL_PRINTF(cli_buf);
2139
2140 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2141 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2142 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2143 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = %d/ %d/ %d ",
2144 "Wifi link/ roam/ scan",
2145 link, roam, scan);
2146 CL_PRINTF(cli_buf);
2147
2148 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2149 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2150 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2151 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
2152 &wifi_traffic_dir);
2153 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = %s / %s/ %s ",
2154 "Wifi status",
2155 (wifi_under_5g ? "5G" : "2.4G"),
2156 ((BTC_WIFI_BW_LEGACY == wifi_bw) ? "Legacy" :
2157 (((BTC_WIFI_BW_HT40 == wifi_bw) ? "HT40" : "HT20"))),
2158 ((!wifi_busy) ? "idle" :
2159 ((BTC_WIFI_TRAFFIC_TX == wifi_traffic_dir) ?
2160 "uplink" : "downlink")));
2161 CL_PRINTF(cli_buf);
2162 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2163 "\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]",
2164 ((btcoexist->bt_info.bt_disabled) ? ("disabled") :
2165 ((coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page scan") :
2166 ((BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
2167 coex_dm->bt_status) ? "non-connected idle" :
2168 ((BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE ==
2169 coex_dm->bt_status) ? "connected-idle" : "busy")))),
2170 coex_sta->bt_rssi, coex_sta->bt_retry_cnt);
2171 CL_PRINTF(cli_buf);
2172
2173 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = %d / %d / %d / %d",
2174 "SCO/HID/PAN/A2DP",
2175 bt_link_info->sco_exist, bt_link_info->hid_exist,
2176 bt_link_info->pan_exist, bt_link_info->a2dp_exist);
2177 CL_PRINTF(cli_buf);
2178 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO);
2179
2180 bt_info_ext = coex_sta->bt_info_ext;
2181 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = %s",
2182 "BT Info A2DP rate",
2183 (bt_info_ext & BIT(0)) ? "Basic rate" : "EDR rate");
2184 CL_PRINTF(cli_buf);
2185
2186 for (i = 0; i < BT_INFO_SRC_8821A_1ANT_MAX; i++) {
2187 if (coex_sta->bt_info_c2h_cnt[i]) {
2188 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2189 "\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)",
2190 glbt_info_src_8821a_1ant[i],
2191 coex_sta->bt_info_c2h[i][0],
2192 coex_sta->bt_info_c2h[i][1],
2193 coex_sta->bt_info_c2h[i][2],
2194 coex_sta->bt_info_c2h[i][3],
2195 coex_sta->bt_info_c2h[i][4],
2196 coex_sta->bt_info_c2h[i][5],
2197 coex_sta->bt_info_c2h[i][6],
2198 coex_sta->bt_info_c2h_cnt[i]);
2199 CL_PRINTF(cli_buf);
2200 }
2201 }
2202 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = %s/%s, (0x%x/0x%x)",
2203 "PS state, IPS/LPS, (lps/rpwm)",
2204 ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
2205 ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")),
2206 btcoexist->bt_info.lps_val,
2207 btcoexist->bt_info.rpwm_val);
2208 CL_PRINTF(cli_buf);
2209 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);
2210
2211 if (!btcoexist->manual_control) {
2212 /* Sw mechanism */
2213 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2214 "\n %-35s", "============[Sw mechanism] ============");
2215 CL_PRINTF(cli_buf);
2216
2217 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2218 "\n %-35s = %d", "SM[LowPenaltyRA]",
2219 coex_dm->cur_low_penalty_ra);
2220 CL_PRINTF(cli_buf);
2221
2222 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2223 "\n %-35s = %s/ %s/ %d ", "DelBA/ BtCtrlAgg/ AggSize",
2224 (btcoexist->bt_info.reject_agg_pkt ? "Yes" : "No"),
2225 (btcoexist->bt_info.b_bt_ctrl_buf_size ?
2226 "Yes" : "No"),
2227 btcoexist->bt_info.agg_buf_size);
2228 CL_PRINTF(cli_buf);
2229 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2230 "\n %-35s = 0x%x ", "Rate Mask",
2231 btcoexist->bt_info.ra_mask);
2232 CL_PRINTF(cli_buf);
2233
2234 /* Fw mechanism */
2235 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s",
2236 "============[Fw mechanism] ============");
2237 CL_PRINTF(cli_buf);
2238
2239 ps_tdma_case = coex_dm->cur_ps_tdma;
2240 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2241 "\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)",
2242 "PS TDMA",
2243 coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1],
2244 coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3],
2245 coex_dm->ps_tdma_para[4], ps_tdma_case,
2246 coex_dm->auto_tdma_adjust);
2247 CL_PRINTF(cli_buf);
2248
2249 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = 0x%x ",
2250 "Latest error condition(should be 0)",
2251 coex_dm->error_condition);
2252 CL_PRINTF(cli_buf);
2253
2254 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = %d ",
2255 "IgnWlanAct",
2256 coex_dm->cur_ignore_wlan_act);
2257 CL_PRINTF(cli_buf);
2258 }
2259
2260 /* Hw setting */
2261 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s",
2262 "============[Hw setting] ============");
2263 CL_PRINTF(cli_buf);
2264
2265 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2266 "backup ARFR1/ARFR2/RL/AMaxTime",
2267 coex_dm->backup_arfr_cnt1, coex_dm->backup_arfr_cnt2,
2268 coex_dm->backup_retry_limit, coex_dm->backup_ampdu_max_time);
2269 CL_PRINTF(cli_buf);
2270
2271 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x430);
2272 u4_tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x434);
2273 u2_tmp[0] = btcoexist->btc_read_2byte(btcoexist, 0x42a);
2274 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x456);
2275 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = 0x%x/0x%x/0x%x/0x%x",
2276 "0x430/0x434/0x42a/0x456",
2277 u4_tmp[0], u4_tmp[1], u2_tmp[0], u1_tmp[0]);
2278 CL_PRINTF(cli_buf);
2279
2280 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
2281 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc58);
2282 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2283 "\n %-35s = 0x%x/ 0x%x", "0x778/ 0xc58[29:25]",
2284 u1_tmp[0], (u4_tmp[0]&0x3e000000) >> 25);
2285 CL_PRINTF(cli_buf);
2286
2287 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x8db);
2288 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = 0x%x", "0x8db[6:5]",
2289 ((u1_tmp[0]&0x60)>>5));
2290 CL_PRINTF(cli_buf);
2291
2292 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x975);
2293 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
2294 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2295 "0xcb4[29:28]/0xcb4[7:0]/0x974[9:8]",
2296 (u4_tmp[0]&0x30000000)>>28, u4_tmp[0]&0xff, u1_tmp[0] & 0x3);
2297 CL_PRINTF(cli_buf);
2298
2299 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40);
2300 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
2301 u1_tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x64);
2302 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
2303 "0x40/0x4c[24:23]/0x64[0]",
2304 u1_tmp[0], ((u4_tmp[0]&0x01800000)>>23), u1_tmp[1]&0x1);
2305 CL_PRINTF(cli_buf);
2306
2307 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
2308 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
2309 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = 0x%x/ 0x%x",
2310 "0x550(bcn ctrl)/0x522",
2311 u4_tmp[0], u1_tmp[0]);
2312 CL_PRINTF(cli_buf);
2313
2314 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
2315 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = 0x%x", "0xc50(dig)",
2316 u4_tmp[0]&0xff);
2317 CL_PRINTF(cli_buf);
2318
2319 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xf48);
2320 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5d);
2321 u1_tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
2322 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = 0x%x/ 0x%x",
2323 "OFDM-FA/ CCK-FA",
2324 u4_tmp[0], (u1_tmp[0]<<8) + u1_tmp[1]);
2325 CL_PRINTF(cli_buf);
2326
2327 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
2328 u4_tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
2329 u4_tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
2330 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
2331 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
2332 "\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
2333 "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)",
2334 u4_tmp[0], u4_tmp[1], u4_tmp[2], u1_tmp[0]);
2335 CL_PRINTF(cli_buf);
2336
2337 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = %d/ %d",
2338 "0x770(high-pri rx/tx)",
2339 coex_sta->high_priority_rx, coex_sta->high_priority_tx);
2340 CL_PRINTF(cli_buf);
2341 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\n %-35s = %d/ %d",
2342 "0x774(low-pri rx/tx)",
2343 coex_sta->low_priority_rx, coex_sta->low_priority_tx);
2344 CL_PRINTF(cli_buf);
2345 #if (BT_AUTO_REPORT_ONLY_8821A_1ANT == 1)
2346 halbtc8821a1ant_monitor_bt_ctr(btcoexist);
2347 #endif
2348 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS);
2349 }
2350
2351 void ex_halbtc8821a1ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
2352 {
2353 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2354 return;
2355
2356 if (BTC_IPS_ENTER == type) {
2357 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2358 "[BTCoex], IPS ENTER notify\n");
2359 coex_sta->under_ips = true;
2360 halbtc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT,
2361 false, true);
2362 /* set PTA control */
2363 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 8);
2364 halbtc8821a1ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
2365 } else if (BTC_IPS_LEAVE == type) {
2366 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2367 "[BTCoex], IPS LEAVE notify\n");
2368 coex_sta->under_ips = false;
2369
2370 halbtc8821a1ant_run_coexist_mechanism(btcoexist);
2371 }
2372 }
2373
2374 void ex_halbtc8821a1ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
2375 {
2376 if (btcoexist->manual_control || btcoexist->stop_coex_dm)
2377 return;
2378
2379 if (BTC_LPS_ENABLE == type) {
2380 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2381 "[BTCoex], LPS ENABLE notify\n");
2382 coex_sta->under_lps = true;
2383 } else if (BTC_LPS_DISABLE == type) {
2384 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2385 "[BTCoex], LPS DISABLE notify\n");
2386 coex_sta->under_lps = false;
2387 }
2388 }
2389
2390 void ex_halbtc8821a1ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
2391 {
2392 bool wifi_connected = false, bt_hs_on = false;
2393
2394 if (btcoexist->manual_control ||
2395 btcoexist->stop_coex_dm ||
2396 btcoexist->bt_info.bt_disabled)
2397 return;
2398
2399 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2400 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2401 &wifi_connected);
2402
2403 halbtc8821a1ant_query_bt_info(btcoexist);
2404
2405 if (coex_sta->c2h_bt_inquiry_page) {
2406 halbtc8821a1ant_action_bt_inquiry(btcoexist);
2407 return;
2408 } else if (bt_hs_on) {
2409 halbtc8821a1ant_action_hs(btcoexist);
2410 return;
2411 }
2412
2413 if (BTC_SCAN_START == type) {
2414 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2415 "[BTCoex], SCAN START notify\n");
2416 if (!wifi_connected) {
2417 /* non-connected scan */
2418 wifi_not_connected_asso_auth_scan(btcoexist);
2419 } else {
2420 /* wifi is connected */
2421 halbtc8821a1ant_action_wifi_connected_scan(btcoexist);
2422 }
2423 } else if (BTC_SCAN_FINISH == type) {
2424 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2425 "[BTCoex], SCAN FINISH notify\n");
2426 if (!wifi_connected) /* non-connected scan */
2427 halbtc8821a1ant_action_wifi_not_connected(btcoexist);
2428 else
2429 halbtc8821a1ant_action_wifi_connected(btcoexist);
2430 }
2431 }
2432
2433 void ex_halbtc8821a1ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
2434 {
2435 bool wifi_connected = false, bt_hs_on = false;
2436
2437 if (btcoexist->manual_control ||
2438 btcoexist->stop_coex_dm ||
2439 btcoexist->bt_info.bt_disabled)
2440 return;
2441
2442 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2443 if (coex_sta->c2h_bt_inquiry_page) {
2444 halbtc8821a1ant_action_bt_inquiry(btcoexist);
2445 return;
2446 } else if (bt_hs_on) {
2447 halbtc8821a1ant_action_hs(btcoexist);
2448 return;
2449 }
2450
2451 if (BTC_ASSOCIATE_START == type) {
2452 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2453 "[BTCoex], CONNECT START notify\n");
2454 wifi_not_connected_asso_auth_scan(btcoexist);
2455 } else if (BTC_ASSOCIATE_FINISH == type) {
2456 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2457 "[BTCoex], CONNECT FINISH notify\n");
2458
2459 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2460 &wifi_connected);
2461 if (!wifi_connected) /* non-connected scan */
2462 halbtc8821a1ant_action_wifi_not_connected(btcoexist);
2463 else
2464 halbtc8821a1ant_action_wifi_connected(btcoexist);
2465 }
2466 }
2467
2468 void ex_halbtc8821a1ant_media_status_notify(struct btc_coexist *btcoexist,
2469 u8 type)
2470 {
2471 u8 h2c_parameter[3] = {0};
2472 u32 wifi_bw;
2473 u8 wifi_central_chnl;
2474
2475 if (btcoexist->manual_control ||
2476 btcoexist->stop_coex_dm ||
2477 btcoexist->bt_info.bt_disabled)
2478 return;
2479
2480 if (BTC_MEDIA_CONNECT == type)
2481 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2482 "[BTCoex], MEDIA connect notify\n");
2483 else
2484 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2485 "[BTCoex], MEDIA disconnect notify\n");
2486
2487 /* only 2.4G we need to inform bt the chnl mask */
2488 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
2489 &wifi_central_chnl);
2490 if ((BTC_MEDIA_CONNECT == type) &&
2491 (wifi_central_chnl <= 14)) {
2492 /* h2c_parameter[0] = 0x1; */
2493 h2c_parameter[0] = 0x0;
2494 h2c_parameter[1] = wifi_central_chnl;
2495 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2496 if (BTC_WIFI_BW_HT40 == wifi_bw)
2497 h2c_parameter[2] = 0x30;
2498 else
2499 h2c_parameter[2] = 0x20;
2500 }
2501
2502 coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
2503 coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
2504 coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
2505
2506 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC,
2507 "[BTCoex], FW write 0x66 = 0x%x\n",
2508 h2c_parameter[0]<<16|h2c_parameter[1]<<8|h2c_parameter[2]);
2509
2510 btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
2511 }
2512
2513 void ex_halbtc8821a1ant_special_packet_notify(struct btc_coexist *btcoexist,
2514 u8 type)
2515 {
2516 bool bt_hs_on = false;
2517
2518 if (btcoexist->manual_control ||
2519 btcoexist->stop_coex_dm ||
2520 btcoexist->bt_info.bt_disabled)
2521 return;
2522
2523 coex_sta->special_pkt_period_cnt = 0;
2524
2525 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2526 if (coex_sta->c2h_bt_inquiry_page) {
2527 halbtc8821a1ant_action_bt_inquiry(btcoexist);
2528 return;
2529 } else if (bt_hs_on) {
2530 halbtc8821a1ant_action_hs(btcoexist);
2531 return;
2532 }
2533
2534 if (BTC_PACKET_DHCP == type ||
2535 BTC_PACKET_EAPOL == type) {
2536 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2537 "[BTCoex], special Packet(%d) notify\n", type);
2538 action_wifi_connected_special_packet(btcoexist);
2539 }
2540 }
2541
2542 void ex_halbtc8821a1ant_bt_info_notify(struct btc_coexist *btcoexist,
2543 u8 *tmp_buf, u8 length)
2544 {
2545 u8 bt_info = 0;
2546 u8 i, rsp_source = 0;
2547 bool wifi_connected = false;
2548 bool bt_busy = false;
2549 bool wifi_under_5g = false;
2550
2551 coex_sta->c2h_bt_info_req_sent = false;
2552
2553 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
2554
2555 rsp_source = tmp_buf[0]&0xf;
2556 if (rsp_source >= BT_INFO_SRC_8821A_1ANT_MAX)
2557 rsp_source = BT_INFO_SRC_8821A_1ANT_WIFI_FW;
2558 coex_sta->bt_info_c2h_cnt[rsp_source]++;
2559
2560 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2561 "[BTCoex], Bt info[%d], length =%d, hex data =[",
2562 rsp_source, length);
2563 for (i = 0; i < length; i++) {
2564 coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
2565 if (i == 1)
2566 bt_info = tmp_buf[i];
2567 if (i == length-1)
2568 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2569 "0x%02x]\n", tmp_buf[i]);
2570 else
2571 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2572 "0x%02x, ", tmp_buf[i]);
2573 }
2574
2575 if (BT_INFO_SRC_8821A_1ANT_WIFI_FW != rsp_source) {
2576 coex_sta->bt_retry_cnt = /* [3:0] */
2577 coex_sta->bt_info_c2h[rsp_source][2]&0xf;
2578
2579 coex_sta->bt_rssi =
2580 coex_sta->bt_info_c2h[rsp_source][3]*2+10;
2581
2582 coex_sta->bt_info_ext =
2583 coex_sta->bt_info_c2h[rsp_source][4];
2584
2585 /* Here we need to resend some wifi info to BT */
2586 /* because bt is reset and loss of the info. */
2587 if (coex_sta->bt_info_ext & BIT(1)) {
2588 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
2589 "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
2590 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
2591 &wifi_connected);
2592 if (wifi_connected)
2593 ex_halbtc8821a1ant_media_status_notify(btcoexist,
2594 BTC_MEDIA_CONNECT);
2595 else
2596 ex_halbtc8821a1ant_media_status_notify(btcoexist,
2597 BTC_MEDIA_DISCONNECT);
2598 }
2599
2600 if ((coex_sta->bt_info_ext & BIT(3)) && !wifi_under_5g) {
2601 if (!btcoexist->manual_control &&
2602 !btcoexist->stop_coex_dm) {
2603 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
2604 "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
2605 halbtc8821a1ant_ignore_wlan_act(btcoexist,
2606 FORCE_EXEC, false);
2607 }
2608 } else {
2609 /* BT already NOT ignore Wlan active, do nothing here. */
2610 }
2611 #if (BT_AUTO_REPORT_ONLY_8821A_1ANT == 0)
2612 if ((coex_sta->bt_info_ext & BIT(4))) {
2613 /* BT auto report already enabled, do nothing */
2614 } else {
2615 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
2616 "[BTCoex], BT ext info bit4 check, set BT to enable Auto Report!!\n");
2617 halbtc8821a1ant_bt_auto_report(btcoexist,
2618 FORCE_EXEC, true);
2619 }
2620 #endif
2621 }
2622
2623 /* check BIT(2) first ==> check if bt is under inquiry or page scan */
2624 if (bt_info & BT_INFO_8821A_1ANT_B_INQ_PAGE)
2625 coex_sta->c2h_bt_inquiry_page = true;
2626 else
2627 coex_sta->c2h_bt_inquiry_page = false;
2628
2629 /* set link exist status */
2630 if (!(bt_info&BT_INFO_8821A_1ANT_B_CONNECTION)) {
2631 coex_sta->bt_link_exist = false;
2632 coex_sta->pan_exist = false;
2633 coex_sta->a2dp_exist = false;
2634 coex_sta->hid_exist = false;
2635 coex_sta->sco_exist = false;
2636 } else {
2637 /* connection exists */
2638 coex_sta->bt_link_exist = true;
2639 if (bt_info & BT_INFO_8821A_1ANT_B_FTP)
2640 coex_sta->pan_exist = true;
2641 else
2642 coex_sta->pan_exist = false;
2643 if (bt_info & BT_INFO_8821A_1ANT_B_A2DP)
2644 coex_sta->a2dp_exist = true;
2645 else
2646 coex_sta->a2dp_exist = false;
2647 if (bt_info & BT_INFO_8821A_1ANT_B_HID)
2648 coex_sta->hid_exist = true;
2649 else
2650 coex_sta->hid_exist = false;
2651 if (bt_info & BT_INFO_8821A_1ANT_B_SCO_ESCO)
2652 coex_sta->sco_exist = true;
2653 else
2654 coex_sta->sco_exist = false;
2655 }
2656
2657 halbtc8821a1ant_update_bt_link_info(btcoexist);
2658
2659 if (!(bt_info&BT_INFO_8821A_1ANT_B_CONNECTION)) {
2660 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
2661 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
2662 "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
2663 } else if (bt_info == BT_INFO_8821A_1ANT_B_CONNECTION) {
2664 /* connection exists but not busy */
2665 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_CONNECTED_IDLE;
2666 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
2667 "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
2668 } else if ((bt_info&BT_INFO_8821A_1ANT_B_SCO_ESCO) ||
2669 (bt_info&BT_INFO_8821A_1ANT_B_SCO_BUSY)) {
2670 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_SCO_BUSY;
2671 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
2672 "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
2673 } else if (bt_info&BT_INFO_8821A_1ANT_B_ACL_BUSY) {
2674 if (BT_8821A_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)
2675 coex_dm->auto_tdma_adjust = false;
2676 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_ACL_BUSY;
2677 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
2678 "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
2679 } else {
2680 coex_dm->bt_status = BT_8821A_1ANT_BT_STATUS_MAX;
2681 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
2682 "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
2683 }
2684
2685 if ((BT_8821A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
2686 (BT_8821A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
2687 (BT_8821A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
2688 bt_busy = true;
2689 else
2690 bt_busy = false;
2691 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
2692
2693 halbtc8821a1ant_run_coexist_mechanism(btcoexist);
2694 }
2695
2696 void ex_halbtc8821a1ant_halt_notify(struct btc_coexist *btcoexist)
2697 {
2698 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, "[BTCoex], Halt notify\n");
2699
2700 btcoexist->stop_coex_dm = true;
2701
2702 halbtc8821a1ant_set_ant_path(btcoexist, BTC_ANT_PATH_BT, false, true);
2703 halbtc8821a1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
2704
2705 halbtc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2706 0x0, 0x0);
2707 halbtc8821a1ant_ps_tdma(btcoexist, FORCE_EXEC, false, 0);
2708
2709 ex_halbtc8821a1ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
2710 }
2711
2712 void ex_halbtc8821a1ant_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)
2713 {
2714 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, "[BTCoex], Pnp notify\n");
2715
2716 if (BTC_WIFI_PNP_SLEEP == pnp_state) {
2717 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2718 "[BTCoex], Pnp notify to SLEEP\n");
2719 btcoexist->stop_coex_dm = true;
2720 halbtc8821a1ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
2721 halbtc8821a1ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
2722 0x0, 0x0);
2723 halbtc8821a1ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 9);
2724 } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
2725 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY,
2726 "[BTCoex], Pnp notify to WAKE UP\n");
2727 btcoexist->stop_coex_dm = false;
2728 halbtc8821a1ant_init_hw_config(btcoexist, false);
2729 halbtc8821a1ant_init_coex_dm(btcoexist);
2730 halbtc8821a1ant_query_bt_info(btcoexist);
2731 }
2732 }
2733
2734 void ex_halbtc8821a1ant_periodical(struct btc_coexist *btcoexist)
2735 {
2736 static u8 dis_ver_info_cnt;
2737 u32 fw_ver = 0, bt_patch_ver = 0;
2738 struct btc_board_info *board_info = &btcoexist->board_info;
2739 struct btc_stack_info *stack_info = &btcoexist->stack_info;
2740
2741 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE,
2742 "[BTCoex], ========================== Periodical ===========================\n");
2743
2744 if (dis_ver_info_cnt <= 5) {
2745 dis_ver_info_cnt += 1;
2746 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
2747 "[BTCoex], ****************************************************************\n");
2748 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
2749 "[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n",
2750 board_info->pg_ant_num, board_info->btdm_ant_num,
2751 board_info->btdm_ant_pos);
2752 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
2753 "[BTCoex], BT stack/ hci ext ver = %s / %d\n",
2754 ((stack_info->profile_notified) ? "Yes" : "No"),
2755 stack_info->hci_version);
2756 btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
2757 &bt_patch_ver);
2758 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
2759 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
2760 "[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n",
2761 glcoex_ver_date_8821a_1ant, glcoex_ver_8821a_1ant,
2762 fw_ver, bt_patch_ver, bt_patch_ver);
2763 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT,
2764 "[BTCoex], ****************************************************************\n");
2765 }
2766
2767 #if (BT_AUTO_REPORT_ONLY_8821A_1ANT == 0)
2768 halbtc8821a1ant_query_bt_info(btcoexist);
2769 halbtc8821a1ant_monitor_bt_ctr(btcoexist);
2770 halbtc8821a1ant_monitor_bt_enable_disable(btcoexist);
2771 #else
2772 if (halbtc8821a1ant_Is_wifi_status_changed(btcoexist) ||
2773 coex_dm->auto_tdma_adjust) {
2774 if (coex_sta->special_pkt_period_cnt > 2)
2775 halbtc8821a1ant_run_coexist_mechanism(btcoexist);
2776 }
2777
2778 coex_sta->special_pkt_period_cnt++;
2779 #endif
2780 }
This page took 0.118676 seconds and 6 git commands to generate.