2 /* This file is for RTL8821A Co-exist mechanism */
4 /* 2012/08/22 Cosa first check in. */
5 /* 2012/11/14 Cosa Revise for 8821A 2Ant out sourcing. */
8 #include "halbt_precomp.h"
9 /* Global variables, these are static variables */
10 static struct coex_dm_8821a_2ant glcoex_dm_8821a_2ant
;
11 static struct coex_dm_8821a_2ant
*coex_dm
= &glcoex_dm_8821a_2ant
;
12 static struct coex_sta_8821a_2ant glcoex_sta_8821a_2ant
;
13 static struct coex_sta_8821a_2ant
*coex_sta
= &glcoex_sta_8821a_2ant
;
15 static const char *const glbt_info_src_8821a_2ant
[] = {
18 "BT Info[bt auto report]",
21 static u32 glcoex_ver_date_8821a_2ant
= 20130618;
22 static u32 glcoex_ver_8821a_2ant
= 0x5050;
24 /* local function proto type if needed */
25 /* local function start with halbtc8821a2ant_ */
26 static u8
halbtc8821a2ant_bt_rssi_state(u8 level_num
, u8 rssi_thresh
,
30 u8 bt_rssi_state
= coex_sta
->pre_bt_rssi_state
;
32 bt_rssi
= coex_sta
->bt_rssi
;
35 if ((coex_sta
->pre_bt_rssi_state
== BTC_RSSI_STATE_LOW
) ||
36 (coex_sta
->pre_bt_rssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
37 if (bt_rssi
>= (rssi_thresh
+
38 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT
)) {
39 bt_rssi_state
= BTC_RSSI_STATE_HIGH
;
40 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
41 "[BTCoex], BT Rssi state switch to High\n");
43 bt_rssi_state
= BTC_RSSI_STATE_STAY_LOW
;
44 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
45 "[BTCoex], BT Rssi state stay at Low\n");
48 if (bt_rssi
< rssi_thresh
) {
49 bt_rssi_state
= BTC_RSSI_STATE_LOW
;
50 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
51 "[BTCoex], BT Rssi state switch to Low\n");
53 bt_rssi_state
= BTC_RSSI_STATE_STAY_HIGH
;
54 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
55 "[BTCoex], BT Rssi state stay at High\n");
58 } else if (level_num
== 3) {
59 if (rssi_thresh
> rssi_thresh1
) {
60 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
61 "[BTCoex], BT Rssi thresh error!!\n");
62 return coex_sta
->pre_bt_rssi_state
;
65 if ((coex_sta
->pre_bt_rssi_state
== BTC_RSSI_STATE_LOW
) ||
66 (coex_sta
->pre_bt_rssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
67 if (bt_rssi
>= (rssi_thresh
+
68 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT
)) {
69 bt_rssi_state
= BTC_RSSI_STATE_MEDIUM
;
70 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
71 "[BTCoex], BT Rssi state switch to Medium\n");
73 bt_rssi_state
= BTC_RSSI_STATE_STAY_LOW
;
74 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
75 "[BTCoex], BT Rssi state stay at Low\n");
77 } else if ((coex_sta
->pre_bt_rssi_state
==
78 BTC_RSSI_STATE_MEDIUM
) ||
79 (coex_sta
->pre_bt_rssi_state
==
80 BTC_RSSI_STATE_STAY_MEDIUM
)) {
81 if (bt_rssi
>= (rssi_thresh1
+
82 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT
)) {
83 bt_rssi_state
= BTC_RSSI_STATE_HIGH
;
84 BTC_PRINT(BTC_MSG_ALGORITHM
,
86 "[BTCoex], BT Rssi state switch to High\n");
87 } else if (bt_rssi
< rssi_thresh
) {
88 bt_rssi_state
= BTC_RSSI_STATE_LOW
;
89 BTC_PRINT(BTC_MSG_ALGORITHM
,
91 "[BTCoex], BT Rssi state switch to Low\n");
93 bt_rssi_state
= BTC_RSSI_STATE_STAY_MEDIUM
;
94 BTC_PRINT(BTC_MSG_ALGORITHM
,
96 "[BTCoex], BT Rssi state stay at Medium\n");
99 if (bt_rssi
< rssi_thresh1
) {
100 bt_rssi_state
= BTC_RSSI_STATE_MEDIUM
;
101 BTC_PRINT(BTC_MSG_ALGORITHM
,
103 "[BTCoex], BT Rssi state switch to Medium\n");
105 bt_rssi_state
= BTC_RSSI_STATE_STAY_HIGH
;
106 BTC_PRINT(BTC_MSG_ALGORITHM
,
108 "[BTCoex], BT Rssi state stay at High\n");
113 coex_sta
->pre_bt_rssi_state
= bt_rssi_state
;
115 return bt_rssi_state
;
118 static u8
wifi21a_rssi_state(struct btc_coexist
*btcoexist
,
119 u8 index
, u8 level_num
,
120 u8 rssi_thresh
, u8 rssi_thresh1
)
123 u8 wifi_rssi_state
= coex_sta
->pre_wifi_rssi_state
[index
];
125 btcoexist
->btc_get(btcoexist
, BTC_GET_S4_WIFI_RSSI
, &wifi_rssi
);
127 if (level_num
== 2) {
128 if ((coex_sta
->pre_wifi_rssi_state
[index
] ==
129 BTC_RSSI_STATE_LOW
) ||
130 (coex_sta
->pre_wifi_rssi_state
[index
] ==
131 BTC_RSSI_STATE_STAY_LOW
)) {
132 if (wifi_rssi
>= (rssi_thresh
+
133 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT
)) {
134 wifi_rssi_state
= BTC_RSSI_STATE_HIGH
;
135 BTC_PRINT(BTC_MSG_ALGORITHM
,
136 ALGO_WIFI_RSSI_STATE
,
137 "[BTCoex], wifi RSSI state switch to High\n");
139 wifi_rssi_state
= BTC_RSSI_STATE_STAY_LOW
;
140 BTC_PRINT(BTC_MSG_ALGORITHM
,
141 ALGO_WIFI_RSSI_STATE
,
142 "[BTCoex], wifi RSSI state stay at Low\n");
145 if (wifi_rssi
< rssi_thresh
) {
146 wifi_rssi_state
= BTC_RSSI_STATE_LOW
;
147 BTC_PRINT(BTC_MSG_ALGORITHM
,
148 ALGO_WIFI_RSSI_STATE
,
149 "[BTCoex], wifi RSSI state switch to Low\n");
151 wifi_rssi_state
= BTC_RSSI_STATE_STAY_HIGH
;
152 BTC_PRINT(BTC_MSG_ALGORITHM
,
153 ALGO_WIFI_RSSI_STATE
,
154 "[BTCoex], wifi RSSI state stay at High\n");
157 } else if (level_num
== 3) {
158 if (rssi_thresh
> rssi_thresh1
) {
159 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_WIFI_RSSI_STATE
,
160 "[BTCoex], wifi RSSI thresh error!!\n");
161 return coex_sta
->pre_wifi_rssi_state
[index
];
164 if ((coex_sta
->pre_wifi_rssi_state
[index
] ==
165 BTC_RSSI_STATE_LOW
) ||
166 (coex_sta
->pre_wifi_rssi_state
[index
] ==
167 BTC_RSSI_STATE_STAY_LOW
)) {
168 if (wifi_rssi
>= (rssi_thresh
+
169 BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT
)) {
170 wifi_rssi_state
= BTC_RSSI_STATE_MEDIUM
;
171 BTC_PRINT(BTC_MSG_ALGORITHM
,
172 ALGO_WIFI_RSSI_STATE
,
173 "[BTCoex], wifi RSSI state switch to Medium\n");
175 wifi_rssi_state
= BTC_RSSI_STATE_STAY_LOW
;
176 BTC_PRINT(BTC_MSG_ALGORITHM
,
177 ALGO_WIFI_RSSI_STATE
,
178 "[BTCoex], wifi RSSI state stay at Low\n");
180 } else if ((coex_sta
->pre_wifi_rssi_state
[index
] ==
181 BTC_RSSI_STATE_MEDIUM
) ||
182 (coex_sta
->pre_wifi_rssi_state
[index
] ==
183 BTC_RSSI_STATE_STAY_MEDIUM
)) {
184 if (wifi_rssi
>= (rssi_thresh1
+BTC_RSSI_COEX_THRESH_TOL_8821A_2ANT
)) {
185 wifi_rssi_state
= BTC_RSSI_STATE_HIGH
;
186 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_WIFI_RSSI_STATE
,
187 "[BTCoex], wifi RSSI state switch to High\n");
188 } else if (wifi_rssi
< rssi_thresh
) {
189 wifi_rssi_state
= BTC_RSSI_STATE_LOW
;
190 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_WIFI_RSSI_STATE
,
191 "[BTCoex], wifi RSSI state switch to Low\n");
193 wifi_rssi_state
= BTC_RSSI_STATE_STAY_MEDIUM
;
194 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_WIFI_RSSI_STATE
,
195 "[BTCoex], wifi RSSI state stay at Medium\n");
198 if (wifi_rssi
< rssi_thresh1
) {
199 wifi_rssi_state
= BTC_RSSI_STATE_MEDIUM
;
200 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_WIFI_RSSI_STATE
,
201 "[BTCoex], wifi RSSI state switch to Medium\n");
203 wifi_rssi_state
= BTC_RSSI_STATE_STAY_HIGH
;
204 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_WIFI_RSSI_STATE
,
205 "[BTCoex], wifi RSSI state stay at High\n");
210 coex_sta
->pre_wifi_rssi_state
[index
] = wifi_rssi_state
;
212 return wifi_rssi_state
;
215 static void monitor_bt_enable_disable(struct btc_coexist
*btcoexist
)
217 static bool pre_bt_disabled
;
218 static u32 bt_disable_cnt
;
219 bool bt_active
= true, bt_disabled
= false;
221 /* This function check if bt is disabled */
223 if (coex_sta
->high_priority_tx
== 0 &&
224 coex_sta
->high_priority_rx
== 0 &&
225 coex_sta
->low_priority_tx
== 0 &&
226 coex_sta
->low_priority_rx
== 0)
228 if (coex_sta
->high_priority_tx
== 0xffff &&
229 coex_sta
->high_priority_rx
== 0xffff &&
230 coex_sta
->low_priority_tx
== 0xffff &&
231 coex_sta
->low_priority_rx
== 0xffff)
236 btcoexist
->btc_set(btcoexist
, BTC_SET_BL_BT_DISABLE
,
238 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_MONITOR
,
239 "[BTCoex], BT is enabled !!\n");
242 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_MONITOR
,
243 "[BTCoex], bt all counters = 0, %d times!!\n",
245 if (bt_disable_cnt
>= 2) {
247 btcoexist
->btc_set(btcoexist
, BTC_SET_BL_BT_DISABLE
,
249 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_MONITOR
,
250 "[BTCoex], BT is disabled !!\n");
253 if (pre_bt_disabled
!= bt_disabled
) {
254 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_MONITOR
,
255 "[BTCoex], BT is from %s to %s!!\n",
256 (pre_bt_disabled
? "disabled" : "enabled"),
257 (bt_disabled
? "disabled" : "enabled"));
258 pre_bt_disabled
= bt_disabled
;
262 static void halbtc8821a2ant_monitor_bt_ctr(struct btc_coexist
*btcoexist
)
264 u32 reg_hp_txrx
, reg_lp_txrx
, u4tmp
;
265 u32 reg_hp_tx
= 0, reg_hp_rx
= 0, reg_lp_tx
= 0, reg_lp_rx
= 0;
270 u4tmp
= btcoexist
->btc_read_4byte(btcoexist
, reg_hp_txrx
);
271 reg_hp_tx
= u4tmp
& MASKLWORD
;
272 reg_hp_rx
= (u4tmp
& MASKHWORD
)>>16;
274 u4tmp
= btcoexist
->btc_read_4byte(btcoexist
, reg_lp_txrx
);
275 reg_lp_tx
= u4tmp
& MASKLWORD
;
276 reg_lp_rx
= (u4tmp
& MASKHWORD
)>>16;
278 coex_sta
->high_priority_tx
= reg_hp_tx
;
279 coex_sta
->high_priority_rx
= reg_hp_rx
;
280 coex_sta
->low_priority_tx
= reg_lp_tx
;
281 coex_sta
->low_priority_rx
= reg_lp_rx
;
283 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_MONITOR
,
284 "[BTCoex], High Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",
285 reg_hp_txrx
, reg_hp_tx
, reg_hp_tx
, reg_hp_rx
, reg_hp_rx
);
286 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_MONITOR
,
287 "[BTCoex], Low Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",
288 reg_lp_txrx
, reg_lp_tx
, reg_lp_tx
, reg_lp_rx
, reg_lp_rx
);
291 btcoexist
->btc_write_1byte(btcoexist
, 0x76e, 0xc);
294 static void halbtc8821a2ant_query_bt_info(struct btc_coexist
*btcoexist
)
296 u8 h2c_parameter
[1] = {0};
298 coex_sta
->c2h_bt_info_req_sent
= true;
300 h2c_parameter
[0] |= BIT(0); /* trigger */
302 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
303 "[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n",
306 btcoexist
->btc_fill_h2c(btcoexist
, 0x61, 1, h2c_parameter
);
309 static u8
halbtc8821a2ant_action_algorithm(struct btc_coexist
*btcoexist
)
311 struct btc_stack_info
*stack_info
= &btcoexist
->stack_info
;
312 bool bt_hs_on
= false;
313 u8 algorithm
= BT_8821A_2ANT_COEX_ALGO_UNDEFINED
;
314 u8 num_of_diff_profile
= 0;
316 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_HS_OPERATION
, &bt_hs_on
);
318 /* for win-8 stack HID report error */
319 if (!stack_info
->hid_exist
) {
320 /* sync BTInfo with BT firmware and stack */
321 stack_info
->hid_exist
= coex_sta
->hid_exist
;
323 /* when stack HID report error, here we use the info from bt fw. */
324 if (!stack_info
->bt_link_exist
)
325 stack_info
->bt_link_exist
= coex_sta
->bt_link_exist
;
327 if (!coex_sta
->bt_link_exist
) {
328 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
329 "[BTCoex], No profile exists!!!\n");
333 if (coex_sta
->sco_exist
)
334 num_of_diff_profile
++;
335 if (coex_sta
->hid_exist
)
336 num_of_diff_profile
++;
337 if (coex_sta
->pan_exist
)
338 num_of_diff_profile
++;
339 if (coex_sta
->a2dp_exist
)
340 num_of_diff_profile
++;
342 if (num_of_diff_profile
== 1) {
343 if (coex_sta
->sco_exist
) {
344 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
345 "[BTCoex], SCO only\n");
346 algorithm
= BT_8821A_2ANT_COEX_ALGO_SCO
;
348 if (coex_sta
->hid_exist
) {
349 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
350 "[BTCoex], HID only\n");
351 algorithm
= BT_8821A_2ANT_COEX_ALGO_HID
;
352 } else if (coex_sta
->a2dp_exist
) {
353 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
354 "[BTCoex], A2DP only\n");
355 algorithm
= BT_8821A_2ANT_COEX_ALGO_A2DP
;
356 } else if (coex_sta
->pan_exist
) {
358 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
359 "[BTCoex], PAN(HS) only\n");
360 algorithm
= BT_8821A_2ANT_COEX_ALGO_PANHS
;
362 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
363 "[BTCoex], PAN(EDR) only\n");
364 algorithm
= BT_8821A_2ANT_COEX_ALGO_PANEDR
;
368 } else if (num_of_diff_profile
== 2) {
369 if (coex_sta
->sco_exist
) {
370 if (coex_sta
->hid_exist
) {
371 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
, "[BTCoex], SCO + HID\n");
372 algorithm
= BT_8821A_2ANT_COEX_ALGO_PANEDR_HID
;
373 } else if (coex_sta
->a2dp_exist
) {
374 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
375 "[BTCoex], SCO + A2DP ==> SCO\n");
376 algorithm
= BT_8821A_2ANT_COEX_ALGO_PANEDR_HID
;
377 } else if (coex_sta
->pan_exist
) {
379 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
380 "[BTCoex], SCO + PAN(HS)\n");
381 algorithm
= BT_8821A_2ANT_COEX_ALGO_SCO
;
383 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
384 "[BTCoex], SCO + PAN(EDR)\n");
385 algorithm
= BT_8821A_2ANT_COEX_ALGO_PANEDR_HID
;
389 if (coex_sta
->hid_exist
&&
390 coex_sta
->a2dp_exist
) {
391 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
392 "[BTCoex], HID + A2DP\n");
393 algorithm
= BT_8821A_2ANT_COEX_ALGO_HID_A2DP
;
394 } else if (coex_sta
->hid_exist
&&
395 coex_sta
->pan_exist
) {
397 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
398 "[BTCoex], HID + PAN(HS)\n");
399 algorithm
= BT_8821A_2ANT_COEX_ALGO_HID
;
401 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
402 "[BTCoex], HID + PAN(EDR)\n");
403 algorithm
= BT_8821A_2ANT_COEX_ALGO_PANEDR_HID
;
405 } else if (coex_sta
->pan_exist
&&
406 coex_sta
->a2dp_exist
) {
408 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
409 "[BTCoex], A2DP + PAN(HS)\n");
410 algorithm
= BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS
;
412 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
413 "[BTCoex], A2DP + PAN(EDR)\n");
414 algorithm
= BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP
;
418 } else if (num_of_diff_profile
== 3) {
419 if (coex_sta
->sco_exist
) {
420 if (coex_sta
->hid_exist
&&
421 coex_sta
->a2dp_exist
) {
422 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
423 "[BTCoex], SCO + HID + A2DP ==> HID\n");
424 algorithm
= BT_8821A_2ANT_COEX_ALGO_PANEDR_HID
;
425 } else if (coex_sta
->hid_exist
&&
426 coex_sta
->pan_exist
) {
428 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
429 "[BTCoex], SCO + HID + PAN(HS)\n");
430 algorithm
= BT_8821A_2ANT_COEX_ALGO_PANEDR_HID
;
432 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
433 "[BTCoex], SCO + HID + PAN(EDR)\n");
434 algorithm
= BT_8821A_2ANT_COEX_ALGO_PANEDR_HID
;
436 } else if (coex_sta
->pan_exist
&&
437 coex_sta
->a2dp_exist
) {
439 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
440 "[BTCoex], SCO + A2DP + PAN(HS)\n");
441 algorithm
= BT_8821A_2ANT_COEX_ALGO_PANEDR_HID
;
443 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
444 "[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n");
445 algorithm
= BT_8821A_2ANT_COEX_ALGO_PANEDR_HID
;
449 if (coex_sta
->hid_exist
&&
450 coex_sta
->pan_exist
&&
451 coex_sta
->a2dp_exist
) {
453 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
454 "[BTCoex], HID + A2DP + PAN(HS)\n");
455 algorithm
= BT_8821A_2ANT_COEX_ALGO_HID_A2DP
;
457 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
458 "[BTCoex], HID + A2DP + PAN(EDR)\n");
459 algorithm
= BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR
;
463 } else if (num_of_diff_profile
>= 3) {
464 if (coex_sta
->sco_exist
) {
465 if (coex_sta
->hid_exist
&&
466 coex_sta
->pan_exist
&&
467 coex_sta
->a2dp_exist
) {
469 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
470 "[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n");
473 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
474 "[BTCoex], SCO + HID + A2DP + PAN(EDR) ==>PAN(EDR)+HID\n");
475 algorithm
= BT_8821A_2ANT_COEX_ALGO_PANEDR_HID
;
483 static bool halbtc8821a2ant_need_to_dec_bt_pwr(struct btc_coexist
*btcoexist
)
486 bool bt_hs_on
= false, wifi_connected
= false;
490 if (!btcoexist
->btc_get(btcoexist
, BTC_GET_BL_HS_OPERATION
, &bt_hs_on
))
492 if (!btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_CONNECTED
,
495 if (!btcoexist
->btc_get(btcoexist
, BTC_GET_S4_HS_RSSI
, &bt_hs_rssi
))
498 bt_rssi_state
= halbtc8821a2ant_bt_rssi_state(2, 35, 0);
500 if (wifi_connected
) {
502 if (bt_hs_rssi
> 37) {
503 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
504 "[BTCoex], Need to decrease bt power for HS mode!!\n");
508 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
509 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
510 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
511 "[BTCoex], Need to decrease bt power for Wifi is connected!!\n");
519 static void set_fw_dac_swing_level(struct btc_coexist
*btcoexist
,
522 u8 h2c_parameter
[1] = {0};
524 /* There are several type of dacswing */
525 /* 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 */
526 h2c_parameter
[0] = dac_swing_lvl
;
528 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
529 "[BTCoex], Set Dac Swing Level = 0x%x\n", dac_swing_lvl
);
530 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
531 "[BTCoex], FW write 0x64 = 0x%x\n", h2c_parameter
[0]);
533 btcoexist
->btc_fill_h2c(btcoexist
, 0x64, 1, h2c_parameter
);
536 static void halbtc8821a2ant_set_fw_dec_bt_pwr(struct btc_coexist
*btcoexist
,
539 u8 h2c_parameter
[1] = {0};
541 h2c_parameter
[0] = 0;
544 h2c_parameter
[0] |= BIT(1);
546 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
547 "[BTCoex], decrease Bt Power : %s, FW write 0x62 = 0x%x\n",
548 (dec_bt_pwr
? "Yes!!" : "No!!"), h2c_parameter
[0]);
550 btcoexist
->btc_fill_h2c(btcoexist
, 0x62, 1, h2c_parameter
);
553 static void halbtc8821a2ant_dec_bt_pwr(struct btc_coexist
*btcoexist
,
554 bool force_exec
, bool dec_bt_pwr
)
556 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
557 "[BTCoex], %s Dec BT power = %s\n",
558 (force_exec
? "force to" : ""),
559 ((dec_bt_pwr
) ? "ON" : "OFF"));
560 coex_dm
->cur_dec_bt_pwr
= dec_bt_pwr
;
563 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
564 "[BTCoex], pre_dec_bt_pwr =%d, cur_dec_bt_pwr =%d\n",
565 coex_dm
->pre_dec_bt_pwr
, coex_dm
->cur_dec_bt_pwr
);
567 if (coex_dm
->pre_dec_bt_pwr
== coex_dm
->cur_dec_bt_pwr
)
570 halbtc8821a2ant_set_fw_dec_bt_pwr(btcoexist
, coex_dm
->cur_dec_bt_pwr
);
572 coex_dm
->pre_dec_bt_pwr
= coex_dm
->cur_dec_bt_pwr
;
575 static void set_fw_bt_lna_constrain(struct btc_coexist
*btcoexist
,
578 u8 h2c_parameter
[2] = {0};
580 h2c_parameter
[0] = 0x3; /* opCode, 0x3 = BT_SET_LNA_CONSTRAIN */
583 h2c_parameter
[1] |= BIT(0);
585 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
586 "[BTCoex], set BT LNA Constrain: %s, FW write 0x69 = 0x%x\n",
587 (bt_lna_cons_on
? "ON!!" : "OFF!!"),
588 h2c_parameter
[0]<<8|h2c_parameter
[1]);
590 btcoexist
->btc_fill_h2c(btcoexist
, 0x69, 2, h2c_parameter
);
593 static void set_bt_lna_constrain(struct btc_coexist
*btcoexist
, bool force_exec
,
596 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
597 "[BTCoex], %s BT Constrain = %s\n",
598 (force_exec
? "force" : ""),
599 ((bt_lna_cons_on
) ? "ON" : "OFF"));
600 coex_dm
->cur_bt_lna_constrain
= bt_lna_cons_on
;
603 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
604 "[BTCoex], pre_bt_lna_constrain =%d, cur_bt_lna_constrain =%d\n",
605 coex_dm
->pre_bt_lna_constrain
,
606 coex_dm
->cur_bt_lna_constrain
);
608 if (coex_dm
->pre_bt_lna_constrain
==
609 coex_dm
->cur_bt_lna_constrain
)
612 set_fw_bt_lna_constrain(btcoexist
, coex_dm
->cur_bt_lna_constrain
);
614 coex_dm
->pre_bt_lna_constrain
= coex_dm
->cur_bt_lna_constrain
;
617 static void halbtc8821a2ant_set_fw_bt_psd_mode(struct btc_coexist
*btcoexist
,
620 u8 h2c_parameter
[2] = {0};
622 h2c_parameter
[0] = 0x2; /* opCode, 0x2 = BT_SET_PSD_MODE */
624 h2c_parameter
[1] = bt_psd_mode
;
626 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
627 "[BTCoex], set BT PSD mode = 0x%x, FW write 0x69 = 0x%x\n",
629 h2c_parameter
[0] << 8 | h2c_parameter
[1]);
631 btcoexist
->btc_fill_h2c(btcoexist
, 0x69, 2, h2c_parameter
);
634 static void halbtc8821a2ant_set_bt_psd_mode(struct btc_coexist
*btcoexist
,
635 bool force_exec
, u8 bt_psd_mode
)
637 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
638 "[BTCoex], %s BT PSD mode = 0x%x\n",
639 (force_exec
? "force" : ""), bt_psd_mode
);
640 coex_dm
->cur_bt_psd_mode
= bt_psd_mode
;
643 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
644 "[BTCoex], pre_bt_psd_mode = 0x%x, cur_bt_psd_mode = 0x%x\n",
645 coex_dm
->pre_bt_psd_mode
, coex_dm
->cur_bt_psd_mode
);
647 if (coex_dm
->pre_bt_psd_mode
== coex_dm
->cur_bt_psd_mode
)
650 halbtc8821a2ant_set_fw_bt_psd_mode(btcoexist
, coex_dm
->cur_bt_psd_mode
);
652 coex_dm
->pre_bt_psd_mode
= coex_dm
->cur_bt_psd_mode
;
655 static void halbtc8821a2ant_set_bt_auto_report(struct btc_coexist
*btcoexist
,
656 bool enable_auto_report
)
658 u8 h2c_parameter
[1] = {0};
660 h2c_parameter
[0] = 0;
662 if (enable_auto_report
)
663 h2c_parameter
[0] |= BIT(0);
665 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
666 "[BTCoex], BT FW auto report : %s, FW write 0x68 = 0x%x\n",
667 (enable_auto_report
? "Enabled!!" : "Disabled!!"),
670 btcoexist
->btc_fill_h2c(btcoexist
, 0x68, 1, h2c_parameter
);
673 static void halbtc8821a2ant_bt_auto_report(struct btc_coexist
*btcoexist
,
675 bool enable_auto_report
)
677 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
678 "[BTCoex], %s BT Auto report = %s\n",
679 (force_exec
? "force to" : ""),
680 ((enable_auto_report
) ? "Enabled" : "Disabled"));
681 coex_dm
->cur_bt_auto_report
= enable_auto_report
;
684 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
685 "[BTCoex], pre_bt_auto_report =%d, cur_bt_auto_report =%d\n",
686 coex_dm
->pre_bt_auto_report
,
687 coex_dm
->cur_bt_auto_report
);
689 if (coex_dm
->pre_bt_auto_report
== coex_dm
->cur_bt_auto_report
)
692 halbtc8821a2ant_set_bt_auto_report(btcoexist
,
693 coex_dm
->cur_bt_auto_report
);
695 coex_dm
->pre_bt_auto_report
= coex_dm
->cur_bt_auto_report
;
698 static void halbtc8821a2ant_fw_dac_swing_lvl(struct btc_coexist
*btcoexist
,
702 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
703 "[BTCoex], %s set FW Dac Swing level = %d\n",
704 (force_exec
? "force to" : ""), fw_dac_swing_lvl
);
705 coex_dm
->cur_fw_dac_swing_lvl
= fw_dac_swing_lvl
;
708 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
709 "[BTCoex], pre_fw_dac_swing_lvl =%d, cur_fw_dac_swing_lvl =%d\n",
710 coex_dm
->pre_fw_dac_swing_lvl
,
711 coex_dm
->cur_fw_dac_swing_lvl
);
713 if (coex_dm
->pre_fw_dac_swing_lvl
==
714 coex_dm
->cur_fw_dac_swing_lvl
)
718 set_fw_dac_swing_level(btcoexist
, coex_dm
->cur_fw_dac_swing_lvl
);
720 coex_dm
->pre_fw_dac_swing_lvl
= coex_dm
->cur_fw_dac_swing_lvl
;
723 static void set_sw_rf_rx_lpf_corner(struct btc_coexist
*btcoexist
,
724 bool rx_rf_shrink_on
)
726 if (rx_rf_shrink_on
) {
727 /* Shrink RF Rx LPF corner */
728 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
729 "[BTCoex], Shrink RF Rx LPF corner!!\n");
730 btcoexist
->btc_set_rf_reg(btcoexist
, BTC_RF_A
, 0x1e,
733 /* Resume RF Rx LPF corner */
734 /* After initialized, we can use coex_dm->bt_rf0x1e_backup */
735 if (btcoexist
->initilized
) {
736 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
737 "[BTCoex], Resume RF Rx LPF corner!!\n");
738 btcoexist
->btc_set_rf_reg(btcoexist
, BTC_RF_A
, 0x1e,
740 coex_dm
->bt_rf0x1e_backup
);
745 static void halbtc8821a2ant_RfShrink(struct btc_coexist
*btcoexist
,
746 bool force_exec
, bool rx_rf_shrink_on
)
748 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW
,
749 "[BTCoex], %s turn Rx RF Shrink = %s\n",
750 (force_exec
? "force to" : ""),
751 ((rx_rf_shrink_on
) ? "ON" : "OFF"));
752 coex_dm
->cur_rf_rx_lpf_shrink
= rx_rf_shrink_on
;
755 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_DETAIL
,
756 "[BTCoex], pre_rf_rx_lpf_shrink =%d, cur_rf_rx_lpf_shrink =%d\n",
757 coex_dm
->pre_rf_rx_lpf_shrink
,
758 coex_dm
->cur_rf_rx_lpf_shrink
);
760 if (coex_dm
->pre_rf_rx_lpf_shrink
==
761 coex_dm
->cur_rf_rx_lpf_shrink
)
764 set_sw_rf_rx_lpf_corner(btcoexist
, coex_dm
->cur_rf_rx_lpf_shrink
);
766 coex_dm
->pre_rf_rx_lpf_shrink
= coex_dm
->cur_rf_rx_lpf_shrink
;
769 static void set_sw_penalty_tx_rate_adap(struct btc_coexist
*btcoexist
,
772 u8 h2c_parameter
[6] = {0};
774 h2c_parameter
[0] = 0x6; /* opCode, 0x6 = Retry_Penalty */
776 if (low_penalty_ra
) {
777 h2c_parameter
[1] |= BIT(0);
778 /* normal rate except MCS7/6/5, OFDM54/48/36 */
779 h2c_parameter
[2] = 0x00;
780 h2c_parameter
[3] = 0xf7; /* MCS7 or OFDM54 */
781 h2c_parameter
[4] = 0xf8; /* MCS6 or OFDM48 */
782 h2c_parameter
[5] = 0xf9; /* MCS5 or OFDM36 */
785 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
786 "[BTCoex], set WiFi Low-Penalty Retry: %s",
787 (low_penalty_ra
? "ON!!" : "OFF!!"));
789 btcoexist
->btc_fill_h2c(btcoexist
, 0x69, 6, h2c_parameter
);
792 static void halbtc8821a2ant_low_penalty_ra(struct btc_coexist
*btcoexist
,
793 bool force_exec
, bool low_penalty_ra
)
796 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW
,
797 "[BTCoex], %s turn LowPenaltyRA = %s\n",
798 (force_exec
? "force to" : ""),
799 ((low_penalty_ra
) ? "ON" : "OFF"));
800 coex_dm
->cur_low_penalty_ra
= low_penalty_ra
;
803 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_DETAIL
,
804 "[BTCoex], pre_low_penalty_ra =%d, cur_low_penalty_ra =%d\n",
805 coex_dm
->pre_low_penalty_ra
,
806 coex_dm
->cur_low_penalty_ra
);
808 if (coex_dm
->pre_low_penalty_ra
== coex_dm
->cur_low_penalty_ra
)
811 set_sw_penalty_tx_rate_adap(btcoexist
, coex_dm
->cur_low_penalty_ra
);
813 coex_dm
->pre_low_penalty_ra
= coex_dm
->cur_low_penalty_ra
;
816 static void halbtc8821a2ant_set_dac_swing_reg(struct btc_coexist
*btcoexist
,
821 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
822 "[BTCoex], Write SwDacSwing = 0x%x\n", level
);
823 btcoexist
->btc_write_1byte_bitmask(btcoexist
, 0xc5b, 0x3e, val
);
826 static void set_sw_fulltime_dac_swing(struct btc_coexist
*btcoexist
,
827 bool sw_dac_swing_on
,
828 u32 sw_dac_swing_lvl
)
831 halbtc8821a2ant_set_dac_swing_reg(btcoexist
, sw_dac_swing_lvl
);
833 halbtc8821a2ant_set_dac_swing_reg(btcoexist
, 0x18);
836 static void halbtc8821a2ant_dac_swing(struct btc_coexist
*btcoexist
,
837 bool force_exec
, bool dac_swing_on
,
840 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW
,
841 "[BTCoex], %s turn DacSwing =%s, dac_swing_lvl = 0x%x\n",
842 (force_exec
? "force to" : ""),
843 ((dac_swing_on
) ? "ON" : "OFF"), dac_swing_lvl
);
844 coex_dm
->cur_dac_swing_on
= dac_swing_on
;
845 coex_dm
->cur_dac_swing_lvl
= dac_swing_lvl
;
848 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_DETAIL
,
849 "[BTCoex], pre_dac_swing_on =%d, pre_dac_swing_lvl = 0x%x, cur_dac_swing_on =%d, cur_dac_swing_lvl = 0x%x\n",
850 coex_dm
->pre_dac_swing_on
,
851 coex_dm
->pre_dac_swing_lvl
,
852 coex_dm
->cur_dac_swing_on
,
853 coex_dm
->cur_dac_swing_lvl
);
855 if ((coex_dm
->pre_dac_swing_on
== coex_dm
->cur_dac_swing_on
) &&
856 (coex_dm
->pre_dac_swing_lvl
== coex_dm
->cur_dac_swing_lvl
))
860 set_sw_fulltime_dac_swing(btcoexist
, dac_swing_on
, dac_swing_lvl
);
862 coex_dm
->pre_dac_swing_on
= coex_dm
->cur_dac_swing_on
;
863 coex_dm
->pre_dac_swing_lvl
= coex_dm
->cur_dac_swing_lvl
;
866 static void halbtc8821a2ant_set_adc_back_off(struct btc_coexist
*btcoexist
,
870 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
871 "[BTCoex], BB BackOff Level On!\n");
872 btcoexist
->btc_write_1byte_bitmask(btcoexist
, 0x8db, 0x60, 0x3);
874 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
875 "[BTCoex], BB BackOff Level Off!\n");
876 btcoexist
->btc_write_1byte_bitmask(btcoexist
, 0x8db, 0x60, 0x1);
880 static void halbtc8821a2ant_adc_back_off(struct btc_coexist
*btcoexist
,
881 bool force_exec
, bool adc_back_off
)
883 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW
,
884 "[BTCoex], %s turn AdcBackOff = %s\n",
885 (force_exec
? "force to" : ""),
886 ((adc_back_off
) ? "ON" : "OFF"));
887 coex_dm
->cur_adc_back_off
= adc_back_off
;
890 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_DETAIL
,
891 "[BTCoex], pre_adc_back_off =%d, cur_adc_back_off =%d\n",
892 coex_dm
->pre_adc_back_off
, coex_dm
->cur_adc_back_off
);
894 if (coex_dm
->pre_adc_back_off
== coex_dm
->cur_adc_back_off
)
897 halbtc8821a2ant_set_adc_back_off(btcoexist
, coex_dm
->cur_adc_back_off
);
899 coex_dm
->pre_adc_back_off
= coex_dm
->cur_adc_back_off
;
902 static void halbtc8821a2ant_set_coex_table(struct btc_coexist
*btcoexist
,
903 u32 val0x6c0
, u32 val0x6c4
,
904 u32 val0x6c8
, u8 val0x6cc
)
906 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
907 "[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0
);
908 btcoexist
->btc_write_4byte(btcoexist
, 0x6c0, val0x6c0
);
910 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
911 "[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4
);
912 btcoexist
->btc_write_4byte(btcoexist
, 0x6c4, val0x6c4
);
914 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
915 "[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8
);
916 btcoexist
->btc_write_4byte(btcoexist
, 0x6c8, val0x6c8
);
918 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
919 "[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc
);
920 btcoexist
->btc_write_1byte(btcoexist
, 0x6cc, val0x6cc
);
923 static void halbtc8821a2ant_coex_table(struct btc_coexist
*btcoexist
,
924 bool force_exec
, u32 val0x6c0
,
925 u32 val0x6c4
, u32 val0x6c8
, u8 val0x6cc
)
927 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW
,
928 "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6c8 = 0x%x, 0x6cc = 0x%x\n",
929 (force_exec
? "force to" : ""),
930 val0x6c0
, val0x6c4
, val0x6c8
, val0x6cc
);
931 coex_dm
->cur_val0x6c0
= val0x6c0
;
932 coex_dm
->cur_val0x6c4
= val0x6c4
;
933 coex_dm
->cur_val0x6c8
= val0x6c8
;
934 coex_dm
->cur_val0x6cc
= val0x6cc
;
937 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_DETAIL
,
938 "[BTCoex], pre_val0x6c0 = 0x%x, pre_val0x6c4 = 0x%x, pre_val0x6c8 = 0x%x, pre_val0x6cc = 0x%x !!\n",
939 coex_dm
->pre_val0x6c0
, coex_dm
->pre_val0x6c4
,
940 coex_dm
->pre_val0x6c8
, coex_dm
->pre_val0x6cc
);
941 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_DETAIL
,
942 "[BTCoex], cur_val0x6c0 = 0x%x, cur_val0x6c4 = 0x%x, cur_val0x6c8 = 0x%x, cur_val0x6cc = 0x%x !!\n",
943 coex_dm
->cur_val0x6c0
, coex_dm
->cur_val0x6c4
,
944 coex_dm
->cur_val0x6c8
, coex_dm
->cur_val0x6cc
);
946 if ((coex_dm
->pre_val0x6c0
== coex_dm
->cur_val0x6c0
) &&
947 (coex_dm
->pre_val0x6c4
== coex_dm
->cur_val0x6c4
) &&
948 (coex_dm
->pre_val0x6c8
== coex_dm
->cur_val0x6c8
) &&
949 (coex_dm
->pre_val0x6cc
== coex_dm
->cur_val0x6cc
))
952 halbtc8821a2ant_set_coex_table(btcoexist
, val0x6c0
, val0x6c4
,
955 coex_dm
->pre_val0x6c0
= coex_dm
->cur_val0x6c0
;
956 coex_dm
->pre_val0x6c4
= coex_dm
->cur_val0x6c4
;
957 coex_dm
->pre_val0x6c8
= coex_dm
->cur_val0x6c8
;
958 coex_dm
->pre_val0x6cc
= coex_dm
->cur_val0x6cc
;
961 static void set_fw_ignore_wlan_act(struct btc_coexist
*btcoexist
, bool enable
)
963 u8 h2c_parameter
[1] = {0};
966 h2c_parameter
[0] |= BIT(0); /* function enable */
968 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
969 "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
972 btcoexist
->btc_fill_h2c(btcoexist
, 0x63, 1, h2c_parameter
);
975 static void halbtc8821a2ant_ignore_wlan_act(struct btc_coexist
*btcoexist
,
976 bool force_exec
, bool enable
)
978 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
979 "[BTCoex], %s turn Ignore WlanAct %s\n",
980 (force_exec
? "force to" : ""), (enable
? "ON" : "OFF"));
981 coex_dm
->cur_ignore_wlan_act
= enable
;
984 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
985 "[BTCoex], pre_ignore_wlan_act = %d, cur_ignore_wlan_act = %d!!\n",
986 coex_dm
->pre_ignore_wlan_act
,
987 coex_dm
->cur_ignore_wlan_act
);
988 if (coex_dm
->pre_ignore_wlan_act
==
989 coex_dm
->cur_ignore_wlan_act
)
992 set_fw_ignore_wlan_act(btcoexist
, enable
);
994 coex_dm
->pre_ignore_wlan_act
= coex_dm
->cur_ignore_wlan_act
;
997 static void halbtc8821a2ant_set_fw_pstdma(struct btc_coexist
*btcoexist
,
998 u8 byte1
, u8 byte2
, u8 byte3
,
1001 u8 h2c_parameter
[5] = {0};
1003 h2c_parameter
[0] = byte1
;
1004 h2c_parameter
[1] = byte2
;
1005 h2c_parameter
[2] = byte3
;
1006 h2c_parameter
[3] = byte4
;
1007 h2c_parameter
[4] = byte5
;
1009 coex_dm
->ps_tdma_para
[0] = byte1
;
1010 coex_dm
->ps_tdma_para
[1] = byte2
;
1011 coex_dm
->ps_tdma_para
[2] = byte3
;
1012 coex_dm
->ps_tdma_para
[3] = byte4
;
1013 coex_dm
->ps_tdma_para
[4] = byte5
;
1015 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
1016 "[BTCoex], FW write 0x60(5bytes) = 0x%x%08x\n",
1018 h2c_parameter
[1] << 24 | h2c_parameter
[2] << 16 |
1019 h2c_parameter
[3]<<8|h2c_parameter
[4]);
1021 btcoexist
->btc_fill_h2c(btcoexist
, 0x60, 5, h2c_parameter
);
1024 static void sw_mechanism1(struct btc_coexist
*btcoexist
, bool shrink_rx_lpf
,
1025 bool low_penalty_ra
, bool limited_dig
,
1026 bool bt_lna_constrain
)
1030 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
1032 if (BTC_WIFI_BW_HT40
!= wifi_bw
) { /* only shrink RF Rx LPF for HT40 */
1034 shrink_rx_lpf
= false;
1037 halbtc8821a2ant_RfShrink(btcoexist
, NORMAL_EXEC
, shrink_rx_lpf
);
1038 halbtc8821a2ant_low_penalty_ra(btcoexist
, NORMAL_EXEC
, low_penalty_ra
);
1040 /* no limited DIG */
1041 /* set_bt_lna_constrain(btcoexist, NORMAL_EXEC, bBTLNAConstrain); */
1044 static void sw_mechanism2(struct btc_coexist
*btcoexist
, bool agc_table_shift
,
1045 bool adc_back_off
, bool sw_dac_swing
,
1048 /* halbtc8821a2ant_AgcTable(btcoexist, NORMAL_EXEC, bAGCTableShift); */
1049 halbtc8821a2ant_adc_back_off(btcoexist
, NORMAL_EXEC
, adc_back_off
);
1050 halbtc8821a2ant_dac_swing(btcoexist
, NORMAL_EXEC
, sw_dac_swing
,
1054 static void halbtc8821a2ant_set_ant_path(struct btc_coexist
*btcoexist
,
1055 u8 ant_pos_type
, bool init_hw_cfg
,
1058 struct btc_board_info
*board_info
= &btcoexist
->board_info
;
1060 u8 h2c_parameter
[2] = {0};
1063 /* 0x4c[23] = 0, 0x4c[24] = 1 Antenna control by WL/BT */
1064 u4tmp
= btcoexist
->btc_read_4byte(btcoexist
, 0x4c);
1067 btcoexist
->btc_write_4byte(btcoexist
, 0x4c, u4tmp
);
1069 btcoexist
->btc_write_4byte(btcoexist
, 0x974, 0x3ff);
1070 btcoexist
->btc_write_1byte(btcoexist
, 0xcb4, 0x77);
1072 if (board_info
->btdm_ant_pos
== BTC_ANTENNA_AT_MAIN_PORT
) {
1073 /* tell firmware "antenna inverse" ==> WRONG firmware
1074 * antenna control code.==>need fw to fix */
1075 h2c_parameter
[0] = 1;
1076 h2c_parameter
[1] = 1;
1077 btcoexist
->btc_fill_h2c(btcoexist
, 0x65, 2, h2c_parameter
);
1079 /* tell firmware "no antenna inverse" ==> WRONG firmware
1080 * antenna control code.==>need fw to fix */
1081 h2c_parameter
[0] = 0;
1082 h2c_parameter
[1] = 1;
1083 btcoexist
->btc_fill_h2c(btcoexist
, 0x65, 2,
1088 /* ext switch setting */
1089 switch (ant_pos_type
) {
1090 case BTC_ANT_WIFI_AT_MAIN
:
1091 btcoexist
->btc_write_1byte_bitmask(btcoexist
, 0xcb7, 0x30, 0x1);
1093 case BTC_ANT_WIFI_AT_AUX
:
1094 btcoexist
->btc_write_1byte_bitmask(btcoexist
, 0xcb7, 0x30, 0x2);
1099 static void ps21a_tdma(struct btc_coexist
*btcoexist
, bool force_exec
,
1100 bool turn_on
, u8 type
)
1102 /* bool turn_on_by_cnt = false; */
1103 /* u8 ps_tdma_type_by_cnt = 0; */
1105 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
1106 "[BTCoex], %s turn %s PS TDMA, type =%d\n",
1107 (force_exec
? "force to" : ""),
1108 (turn_on
? "ON" : "OFF"), type
);
1109 coex_dm
->cur_ps_tdma_on
= turn_on
;
1110 coex_dm
->cur_ps_tdma
= type
;
1113 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1114 "[BTCoex], pre_ps_tdma_on = %d, cur_ps_tdma_on = %d!!\n",
1115 coex_dm
->pre_ps_tdma_on
, coex_dm
->cur_ps_tdma_on
);
1116 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1117 "[BTCoex], pre_ps_tdma = %d, cur_ps_tdma = %d!!\n",
1118 coex_dm
->pre_ps_tdma
, coex_dm
->cur_ps_tdma
);
1120 if ((coex_dm
->pre_ps_tdma_on
== coex_dm
->cur_ps_tdma_on
) &&
1121 (coex_dm
->pre_ps_tdma
== coex_dm
->cur_ps_tdma
))
1128 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x1a,
1132 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x12,
1136 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x1c,
1140 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x10,
1144 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x1a,
1148 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x12,
1152 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x1c,
1156 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xa3, 0x10,
1160 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x1a,
1164 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x12,
1168 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0xa,
1172 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x5,
1176 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x1a,
1180 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x12,
1184 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0xa,
1188 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x5,
1192 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xa3, 0x2f,
1196 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x5,
1200 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x25,
1204 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x25,
1208 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x15,
1212 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0xe3, 0x1a,
1217 /* disable PS tdma */
1220 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0x0, 0x0, 0x0,
1224 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0x0, 0x0, 0x0,
1228 halbtc8821a2ant_set_fw_pstdma(btcoexist
, 0x0, 0x0, 0x0,
1234 /* update pre state */
1235 coex_dm
->pre_ps_tdma_on
= coex_dm
->cur_ps_tdma_on
;
1236 coex_dm
->pre_ps_tdma
= coex_dm
->cur_ps_tdma
;
1239 static void halbtc8821a2ant_coex_all_off(struct btc_coexist
*btcoexist
)
1242 ps21a_tdma(btcoexist
, NORMAL_EXEC
, false, 1);
1243 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 6);
1244 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
1247 sw_mechanism1(btcoexist
, false, false, false, false);
1248 sw_mechanism2(btcoexist
, false, false, false, 0x18);
1251 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55555555,
1252 0x55555555, 0xffff, 0x3);
1255 static void halbtc8821a2ant_coex_under_5g(struct btc_coexist
*btcoexist
)
1257 halbtc8821a2ant_coex_all_off(btcoexist
);
1260 static void halbtc8821a2ant_init_coex_dm(struct btc_coexist
*btcoexist
)
1262 /* force to reset coex mechanism */
1263 halbtc8821a2ant_coex_table(btcoexist
, FORCE_EXEC
, 0x55555555,
1264 0x55555555, 0xffff, 0x3);
1266 ps21a_tdma(btcoexist
, FORCE_EXEC
, false, 1);
1267 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, FORCE_EXEC
, 6);
1268 halbtc8821a2ant_dec_bt_pwr(btcoexist
, FORCE_EXEC
, false);
1270 sw_mechanism1(btcoexist
, false, false, false, false);
1271 sw_mechanism2(btcoexist
, false, false, false, 0x18);
1274 static void halbtc8821a2ant_bt_inquiry_page(struct btc_coexist
*btcoexist
)
1276 bool low_pwr_disable
= true;
1278 btcoexist
->btc_set(btcoexist
, BTC_SET_ACT_DISABLE_LOW_POWER
,
1281 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55ff55ff,
1282 0x5afa5afa, 0xffff, 0x3);
1283 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 3);
1286 static bool halbtc8821a2ant_is_common_action(struct btc_coexist
*btcoexist
)
1288 bool common
= false, wifi_connected
= false, wifi_busy
= false;
1289 bool low_pwr_disable
= false;
1291 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_CONNECTED
,
1293 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_BUSY
, &wifi_busy
);
1295 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55ff55ff,
1296 0x5afa5afa, 0xffff, 0x3);
1298 if (!wifi_connected
&&
1299 BT_8821A_2ANT_BT_STATUS_IDLE
== coex_dm
->bt_status
) {
1300 low_pwr_disable
= false;
1301 btcoexist
->btc_set(btcoexist
, BTC_SET_ACT_DISABLE_LOW_POWER
,
1304 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1305 "[BTCoex], Wifi IPS + BT IPS!!\n");
1307 ps21a_tdma(btcoexist
, NORMAL_EXEC
, false, 1);
1308 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 6);
1309 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
1311 sw_mechanism1(btcoexist
, false, false, false, false);
1312 sw_mechanism2(btcoexist
, false, false, false, 0x18);
1315 } else if (wifi_connected
&&
1316 (BT_8821A_2ANT_BT_STATUS_IDLE
== coex_dm
->bt_status
)) {
1317 low_pwr_disable
= false;
1318 btcoexist
->btc_set(btcoexist
, BTC_SET_ACT_DISABLE_LOW_POWER
,
1322 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1323 "[BTCoex], Wifi Busy + BT IPS!!\n");
1324 ps21a_tdma(btcoexist
, NORMAL_EXEC
, false, 1);
1326 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1327 "[BTCoex], Wifi LPS + BT IPS!!\n");
1328 ps21a_tdma(btcoexist
, NORMAL_EXEC
, false, 1);
1331 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 6);
1332 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
1334 sw_mechanism1(btcoexist
, false, false, false, false);
1335 sw_mechanism2(btcoexist
, false, false, false, 0x18);
1338 } else if (!wifi_connected
&&
1339 (BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE
==
1340 coex_dm
->bt_status
)) {
1341 low_pwr_disable
= true;
1342 btcoexist
->btc_set(btcoexist
, BTC_SET_ACT_DISABLE_LOW_POWER
,
1345 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1346 "[BTCoex], Wifi IPS + BT LPS!!\n");
1348 ps21a_tdma(btcoexist
, NORMAL_EXEC
, false, 1);
1349 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 6);
1350 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
1352 sw_mechanism1(btcoexist
, false, false, false, false);
1353 sw_mechanism2(btcoexist
, false, false, false, 0x18);
1356 } else if (wifi_connected
&&
1357 (BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE
==
1358 coex_dm
->bt_status
)) {
1359 low_pwr_disable
= true;
1360 btcoexist
->btc_set(btcoexist
, BTC_SET_ACT_DISABLE_LOW_POWER
,
1364 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1365 "[BTCoex], Wifi Busy + BT LPS!!\n");
1366 ps21a_tdma(btcoexist
, NORMAL_EXEC
, false, 1);
1368 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1369 "[BTCoex], Wifi LPS + BT LPS!!\n");
1370 ps21a_tdma(btcoexist
, NORMAL_EXEC
, false, 1);
1373 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 6);
1374 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
1376 sw_mechanism1(btcoexist
, true, true, true, true);
1377 sw_mechanism2(btcoexist
, false, false, false, 0x18);
1380 } else if (!wifi_connected
&&
1381 (BT_8821A_2ANT_BT_STATUS_NON_IDLE
== coex_dm
->bt_status
)) {
1382 low_pwr_disable
= false;
1383 btcoexist
->btc_set(btcoexist
, BTC_SET_ACT_DISABLE_LOW_POWER
,
1386 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1387 "[BTCoex], Wifi IPS + BT Busy!!\n");
1389 ps21a_tdma(btcoexist
, NORMAL_EXEC
, false, 1);
1390 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 6);
1391 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
1393 sw_mechanism1(btcoexist
, false, false, false, false);
1394 sw_mechanism2(btcoexist
, false, false, false, 0x18);
1398 low_pwr_disable
= true;
1399 btcoexist
->btc_set(btcoexist
, BTC_SET_ACT_DISABLE_LOW_POWER
,
1403 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1404 "[BTCoex], Wifi Busy + BT Busy!!\n");
1407 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1408 "[BTCoex], Wifi LPS + BT Busy!!\n");
1409 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 21);
1411 if (halbtc8821a2ant_need_to_dec_bt_pwr(btcoexist
))
1412 halbtc8821a2ant_dec_bt_pwr(btcoexist
,
1415 halbtc8821a2ant_dec_bt_pwr(btcoexist
,
1416 NORMAL_EXEC
, false);
1420 sw_mechanism1(btcoexist
, true, true, true, true);
1425 static void tdma_duration_adjust(struct btc_coexist
*btcoexist
,
1426 bool sco_hid
, bool tx_pause
, u8 max_interval
)
1428 static long up
, dn
, m
, n
, wait_count
;
1430 /* 0: no change, +1: incr WiFi duration, -1: decr WiFi duration */
1433 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
1434 "[BTCoex], TdmaDurationAdjust()\n");
1436 if (coex_dm
->reset_tdma_adjust
) {
1437 coex_dm
->reset_tdma_adjust
= false;
1438 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1439 "[BTCoex], first run TdmaDurationAdjust()!!\n");
1442 if (max_interval
== 1) {
1443 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 13);
1444 coex_dm
->ps_tdma_du_adj_type
= 13;
1445 } else if (max_interval
== 2) {
1446 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 14);
1447 coex_dm
->ps_tdma_du_adj_type
= 14;
1448 } else if (max_interval
== 3) {
1449 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1450 coex_dm
->ps_tdma_du_adj_type
= 15;
1452 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1453 coex_dm
->ps_tdma_du_adj_type
= 15;
1456 if (max_interval
== 1) {
1457 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 9);
1458 coex_dm
->ps_tdma_du_adj_type
= 9;
1459 } else if (max_interval
== 2) {
1460 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
1461 coex_dm
->ps_tdma_du_adj_type
= 10;
1462 } else if (max_interval
== 3) {
1463 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 11);
1464 coex_dm
->ps_tdma_du_adj_type
= 11;
1466 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 11);
1467 coex_dm
->ps_tdma_du_adj_type
= 11;
1472 if (max_interval
== 1) {
1473 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 5);
1474 coex_dm
->ps_tdma_du_adj_type
= 5;
1475 } else if (max_interval
== 2) {
1476 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 6);
1477 coex_dm
->ps_tdma_du_adj_type
= 6;
1478 } else if (max_interval
== 3) {
1479 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1480 coex_dm
->ps_tdma_du_adj_type
= 7;
1482 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1483 coex_dm
->ps_tdma_du_adj_type
= 7;
1486 if (max_interval
== 1) {
1487 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 1);
1488 coex_dm
->ps_tdma_du_adj_type
= 1;
1489 } else if (max_interval
== 2) {
1490 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 2);
1491 coex_dm
->ps_tdma_du_adj_type
= 2;
1492 } else if (max_interval
== 3) {
1493 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 3);
1494 coex_dm
->ps_tdma_du_adj_type
= 3;
1496 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 3);
1497 coex_dm
->ps_tdma_du_adj_type
= 3;
1508 /* accquire the BT TRx retry count from BT_Info byte2 */
1509 retry_count
= coex_sta
->bt_retry_cnt
;
1510 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1511 "[BTCoex], retry_count = %d\n", retry_count
);
1512 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1513 "[BTCoex], up =%d, dn =%d, m =%d, n =%d, wait_count =%d\n",
1514 (int)up
, (int)dn
, (int)m
, (int)n
, (int)wait_count
);
1518 if (retry_count
== 0) {
1519 /* no retry in the last 2-second duration */
1532 BTC_PRINT(BTC_MSG_ALGORITHM
,
1533 ALGO_TRACE_FW_DETAIL
,
1534 "[BTCoex], Increase wifi duration!!\n");
1536 } else if (retry_count
<= 3) {
1537 /* <= 3 retry in the last 2-second duration */
1545 if (wait_count
<= 2)
1558 BTC_PRINT(BTC_MSG_ALGORITHM
,
1559 ALGO_TRACE_FW_DETAIL
,
1560 "[BTCoex], Decrease wifi duration for retryCounter<3!!\n");
1563 if (wait_count
== 1)
1576 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1577 "[BTCoex], Decrease wifi duration for retryCounter>3!!\n");
1580 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1581 "[BTCoex], max Interval = %d\n", max_interval
);
1582 if (max_interval
== 1) {
1584 /* TODO: refactor here */
1585 BTC_PRINT(BTC_MSG_ALGORITHM
,
1586 ALGO_TRACE_FW_DETAIL
,
1587 "[BTCoex], TxPause = 1\n");
1588 if (coex_dm
->cur_ps_tdma
== 71) {
1589 ps21a_tdma(btcoexist
,
1592 coex_dm
->ps_tdma_du_adj_type
= 5;
1593 } else if (coex_dm
->cur_ps_tdma
== 1) {
1594 ps21a_tdma(btcoexist
,
1597 coex_dm
->ps_tdma_du_adj_type
= 5;
1598 } else if (coex_dm
->cur_ps_tdma
== 2) {
1599 ps21a_tdma(btcoexist
,
1602 coex_dm
->ps_tdma_du_adj_type
= 6;
1603 } else if (coex_dm
->cur_ps_tdma
== 3) {
1604 ps21a_tdma(btcoexist
,
1607 coex_dm
->ps_tdma_du_adj_type
= 7;
1608 } else if (coex_dm
->cur_ps_tdma
== 4) {
1609 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 8);
1610 coex_dm
->ps_tdma_du_adj_type
= 8;
1612 if (coex_dm
->cur_ps_tdma
== 9) {
1613 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 13);
1614 coex_dm
->ps_tdma_du_adj_type
= 13;
1615 } else if (coex_dm
->cur_ps_tdma
== 10) {
1616 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 14);
1617 coex_dm
->ps_tdma_du_adj_type
= 14;
1618 } else if (coex_dm
->cur_ps_tdma
== 11) {
1619 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1620 coex_dm
->ps_tdma_du_adj_type
= 15;
1621 } else if (coex_dm
->cur_ps_tdma
== 12) {
1622 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 16);
1623 coex_dm
->ps_tdma_du_adj_type
= 16;
1627 if (coex_dm
->cur_ps_tdma
== 5) {
1628 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 6);
1629 coex_dm
->ps_tdma_du_adj_type
= 6;
1630 } else if (coex_dm
->cur_ps_tdma
== 6) {
1631 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1632 coex_dm
->ps_tdma_du_adj_type
= 7;
1633 } else if (coex_dm
->cur_ps_tdma
== 7) {
1634 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 8);
1635 coex_dm
->ps_tdma_du_adj_type
= 8;
1636 } else if (coex_dm
->cur_ps_tdma
== 13) {
1637 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 14);
1638 coex_dm
->ps_tdma_du_adj_type
= 14;
1639 } else if (coex_dm
->cur_ps_tdma
== 14) {
1640 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1641 coex_dm
->ps_tdma_du_adj_type
= 15;
1642 } else if (coex_dm
->cur_ps_tdma
== 15) {
1643 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 16);
1644 coex_dm
->ps_tdma_du_adj_type
= 16;
1646 } else if (result
== 1) {
1647 if (coex_dm
->cur_ps_tdma
== 8) {
1648 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1649 coex_dm
->ps_tdma_du_adj_type
= 7;
1650 } else if (coex_dm
->cur_ps_tdma
== 7) {
1651 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 6);
1652 coex_dm
->ps_tdma_du_adj_type
= 6;
1653 } else if (coex_dm
->cur_ps_tdma
== 6) {
1654 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 5);
1655 coex_dm
->ps_tdma_du_adj_type
= 5;
1656 } else if (coex_dm
->cur_ps_tdma
== 16) {
1657 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1658 coex_dm
->ps_tdma_du_adj_type
= 15;
1659 } else if (coex_dm
->cur_ps_tdma
== 15) {
1660 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 14);
1661 coex_dm
->ps_tdma_du_adj_type
= 14;
1662 } else if (coex_dm
->cur_ps_tdma
== 14) {
1663 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 13);
1664 coex_dm
->ps_tdma_du_adj_type
= 13;
1668 /* TODO: refactor here */
1669 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
, "[BTCoex], TxPause = 0\n");
1670 if (coex_dm
->cur_ps_tdma
== 5) {
1671 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 71);
1672 coex_dm
->ps_tdma_du_adj_type
= 71;
1673 } else if (coex_dm
->cur_ps_tdma
== 6) {
1674 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 2);
1675 coex_dm
->ps_tdma_du_adj_type
= 2;
1676 } else if (coex_dm
->cur_ps_tdma
== 7) {
1677 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 3);
1678 coex_dm
->ps_tdma_du_adj_type
= 3;
1679 } else if (coex_dm
->cur_ps_tdma
== 8) {
1680 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 4);
1681 coex_dm
->ps_tdma_du_adj_type
= 4;
1683 if (coex_dm
->cur_ps_tdma
== 13) {
1684 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 9);
1685 coex_dm
->ps_tdma_du_adj_type
= 9;
1686 } else if (coex_dm
->cur_ps_tdma
== 14) {
1687 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
1688 coex_dm
->ps_tdma_du_adj_type
= 10;
1689 } else if (coex_dm
->cur_ps_tdma
== 15) {
1690 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 11);
1691 coex_dm
->ps_tdma_du_adj_type
= 11;
1692 } else if (coex_dm
->cur_ps_tdma
== 16) {
1693 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 12);
1694 coex_dm
->ps_tdma_du_adj_type
= 12;
1698 if (coex_dm
->cur_ps_tdma
== 71) {
1699 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 1);
1700 coex_dm
->ps_tdma_du_adj_type
= 1;
1701 } else if (coex_dm
->cur_ps_tdma
== 1) {
1702 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 2);
1703 coex_dm
->ps_tdma_du_adj_type
= 2;
1704 } else if (coex_dm
->cur_ps_tdma
== 2) {
1705 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 3);
1706 coex_dm
->ps_tdma_du_adj_type
= 3;
1707 } else if (coex_dm
->cur_ps_tdma
== 3) {
1708 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 4);
1709 coex_dm
->ps_tdma_du_adj_type
= 4;
1710 } else if (coex_dm
->cur_ps_tdma
== 9) {
1711 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
1712 coex_dm
->ps_tdma_du_adj_type
= 10;
1713 } else if (coex_dm
->cur_ps_tdma
== 10) {
1714 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 11);
1715 coex_dm
->ps_tdma_du_adj_type
= 11;
1716 } else if (coex_dm
->cur_ps_tdma
== 11) {
1717 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 12);
1718 coex_dm
->ps_tdma_du_adj_type
= 12;
1720 } else if (result
== 1) {
1721 if (coex_dm
->cur_ps_tdma
== 4) {
1722 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 3);
1723 coex_dm
->ps_tdma_du_adj_type
= 3;
1724 } else if (coex_dm
->cur_ps_tdma
== 3) {
1725 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 2);
1726 coex_dm
->ps_tdma_du_adj_type
= 2;
1727 } else if (coex_dm
->cur_ps_tdma
== 2) {
1728 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 1);
1729 coex_dm
->ps_tdma_du_adj_type
= 1;
1730 } else if (coex_dm
->cur_ps_tdma
== 1) {
1731 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 71);
1732 coex_dm
->ps_tdma_du_adj_type
= 71;
1733 } else if (coex_dm
->cur_ps_tdma
== 12) {
1734 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 11);
1735 coex_dm
->ps_tdma_du_adj_type
= 11;
1736 } else if (coex_dm
->cur_ps_tdma
== 11) {
1737 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
1738 coex_dm
->ps_tdma_du_adj_type
= 10;
1739 } else if (coex_dm
->cur_ps_tdma
== 10) {
1740 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 9);
1741 coex_dm
->ps_tdma_du_adj_type
= 9;
1745 } else if (max_interval
== 2) {
1747 /* TODO: refactor here */
1748 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
, "[BTCoex], TxPause = 1\n");
1749 if (coex_dm
->cur_ps_tdma
== 1) {
1750 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 6);
1751 coex_dm
->ps_tdma_du_adj_type
= 6;
1752 } else if (coex_dm
->cur_ps_tdma
== 2) {
1753 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 6);
1754 coex_dm
->ps_tdma_du_adj_type
= 6;
1755 } else if (coex_dm
->cur_ps_tdma
== 3) {
1756 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1757 coex_dm
->ps_tdma_du_adj_type
= 7;
1758 } else if (coex_dm
->cur_ps_tdma
== 4) {
1759 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 8);
1760 coex_dm
->ps_tdma_du_adj_type
= 8;
1762 if (coex_dm
->cur_ps_tdma
== 9) {
1763 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 14);
1764 coex_dm
->ps_tdma_du_adj_type
= 14;
1765 } else if (coex_dm
->cur_ps_tdma
== 10) {
1766 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 14);
1767 coex_dm
->ps_tdma_du_adj_type
= 14;
1768 } else if (coex_dm
->cur_ps_tdma
== 11) {
1769 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1770 coex_dm
->ps_tdma_du_adj_type
= 15;
1771 } else if (coex_dm
->cur_ps_tdma
== 12) {
1772 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 16);
1773 coex_dm
->ps_tdma_du_adj_type
= 16;
1776 if (coex_dm
->cur_ps_tdma
== 5) {
1777 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 6);
1778 coex_dm
->ps_tdma_du_adj_type
= 6;
1779 } else if (coex_dm
->cur_ps_tdma
== 6) {
1780 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1781 coex_dm
->ps_tdma_du_adj_type
= 7;
1782 } else if (coex_dm
->cur_ps_tdma
== 7) {
1783 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 8);
1784 coex_dm
->ps_tdma_du_adj_type
= 8;
1785 } else if (coex_dm
->cur_ps_tdma
== 13) {
1786 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 14);
1787 coex_dm
->ps_tdma_du_adj_type
= 14;
1788 } else if (coex_dm
->cur_ps_tdma
== 14) {
1789 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1790 coex_dm
->ps_tdma_du_adj_type
= 15;
1791 } else if (coex_dm
->cur_ps_tdma
== 15) {
1792 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 16);
1793 coex_dm
->ps_tdma_du_adj_type
= 16;
1795 } else if (result
== 1) {
1796 if (coex_dm
->cur_ps_tdma
== 8) {
1797 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1798 coex_dm
->ps_tdma_du_adj_type
= 7;
1799 } else if (coex_dm
->cur_ps_tdma
== 7) {
1800 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 6);
1801 coex_dm
->ps_tdma_du_adj_type
= 6;
1802 } else if (coex_dm
->cur_ps_tdma
== 6) {
1803 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 6);
1804 coex_dm
->ps_tdma_du_adj_type
= 6;
1805 } else if (coex_dm
->cur_ps_tdma
== 16) {
1806 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1807 coex_dm
->ps_tdma_du_adj_type
= 15;
1808 } else if (coex_dm
->cur_ps_tdma
== 15) {
1809 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 14);
1810 coex_dm
->ps_tdma_du_adj_type
= 14;
1811 } else if (coex_dm
->cur_ps_tdma
== 14) {
1812 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 14);
1813 coex_dm
->ps_tdma_du_adj_type
= 14;
1817 /* TODO: refactor here */
1818 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1819 "[BTCoex], TxPause = 0\n");
1820 if (coex_dm
->cur_ps_tdma
== 5) {
1821 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 2);
1822 coex_dm
->ps_tdma_du_adj_type
= 2;
1823 } else if (coex_dm
->cur_ps_tdma
== 6) {
1824 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 2);
1825 coex_dm
->ps_tdma_du_adj_type
= 2;
1826 } else if (coex_dm
->cur_ps_tdma
== 7) {
1827 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 3);
1828 coex_dm
->ps_tdma_du_adj_type
= 3;
1829 } else if (coex_dm
->cur_ps_tdma
== 8) {
1830 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 4);
1831 coex_dm
->ps_tdma_du_adj_type
= 4;
1833 if (coex_dm
->cur_ps_tdma
== 13) {
1834 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
1835 coex_dm
->ps_tdma_du_adj_type
= 10;
1836 } else if (coex_dm
->cur_ps_tdma
== 14) {
1837 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
1838 coex_dm
->ps_tdma_du_adj_type
= 10;
1839 } else if (coex_dm
->cur_ps_tdma
== 15) {
1840 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 11);
1841 coex_dm
->ps_tdma_du_adj_type
= 11;
1842 } else if (coex_dm
->cur_ps_tdma
== 16) {
1843 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 12);
1844 coex_dm
->ps_tdma_du_adj_type
= 12;
1847 if (coex_dm
->cur_ps_tdma
== 1) {
1848 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 2);
1849 coex_dm
->ps_tdma_du_adj_type
= 2;
1850 } else if (coex_dm
->cur_ps_tdma
== 2) {
1851 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 3);
1852 coex_dm
->ps_tdma_du_adj_type
= 3;
1853 } else if (coex_dm
->cur_ps_tdma
== 3) {
1854 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 4);
1855 coex_dm
->ps_tdma_du_adj_type
= 4;
1856 } else if (coex_dm
->cur_ps_tdma
== 9) {
1857 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
1858 coex_dm
->ps_tdma_du_adj_type
= 10;
1859 } else if (coex_dm
->cur_ps_tdma
== 10) {
1860 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 11);
1861 coex_dm
->ps_tdma_du_adj_type
= 11;
1862 } else if (coex_dm
->cur_ps_tdma
== 11) {
1863 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 12);
1864 coex_dm
->ps_tdma_du_adj_type
= 12;
1866 } else if (result
== 1) {
1867 if (coex_dm
->cur_ps_tdma
== 4) {
1868 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 3);
1869 coex_dm
->ps_tdma_du_adj_type
= 3;
1870 } else if (coex_dm
->cur_ps_tdma
== 3) {
1871 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 2);
1872 coex_dm
->ps_tdma_du_adj_type
= 2;
1873 } else if (coex_dm
->cur_ps_tdma
== 2) {
1874 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 2);
1875 coex_dm
->ps_tdma_du_adj_type
= 2;
1876 } else if (coex_dm
->cur_ps_tdma
== 12) {
1877 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 11);
1878 coex_dm
->ps_tdma_du_adj_type
= 11;
1879 } else if (coex_dm
->cur_ps_tdma
== 11) {
1880 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
1881 coex_dm
->ps_tdma_du_adj_type
= 10;
1882 } else if (coex_dm
->cur_ps_tdma
== 10) {
1883 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
1884 coex_dm
->ps_tdma_du_adj_type
= 10;
1888 } else if (max_interval
== 3) {
1890 /* TODO: refactor here */
1891 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1892 "[BTCoex], TxPause = 1\n");
1893 if (coex_dm
->cur_ps_tdma
== 1) {
1894 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1895 coex_dm
->ps_tdma_du_adj_type
= 7;
1896 } else if (coex_dm
->cur_ps_tdma
== 2) {
1897 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1898 coex_dm
->ps_tdma_du_adj_type
= 7;
1899 } else if (coex_dm
->cur_ps_tdma
== 3) {
1900 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1901 coex_dm
->ps_tdma_du_adj_type
= 7;
1902 } else if (coex_dm
->cur_ps_tdma
== 4) {
1903 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 8);
1904 coex_dm
->ps_tdma_du_adj_type
= 8;
1906 if (coex_dm
->cur_ps_tdma
== 9) {
1907 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1908 coex_dm
->ps_tdma_du_adj_type
= 15;
1909 } else if (coex_dm
->cur_ps_tdma
== 10) {
1910 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1911 coex_dm
->ps_tdma_du_adj_type
= 15;
1912 } else if (coex_dm
->cur_ps_tdma
== 11) {
1913 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1914 coex_dm
->ps_tdma_du_adj_type
= 15;
1915 } else if (coex_dm
->cur_ps_tdma
== 12) {
1916 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 16);
1917 coex_dm
->ps_tdma_du_adj_type
= 16;
1920 if (coex_dm
->cur_ps_tdma
== 5) {
1921 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1922 coex_dm
->ps_tdma_du_adj_type
= 7;
1923 } else if (coex_dm
->cur_ps_tdma
== 6) {
1924 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1925 coex_dm
->ps_tdma_du_adj_type
= 7;
1926 } else if (coex_dm
->cur_ps_tdma
== 7) {
1927 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 8);
1928 coex_dm
->ps_tdma_du_adj_type
= 8;
1929 } else if (coex_dm
->cur_ps_tdma
== 13) {
1930 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1931 coex_dm
->ps_tdma_du_adj_type
= 15;
1932 } else if (coex_dm
->cur_ps_tdma
== 14) {
1933 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1934 coex_dm
->ps_tdma_du_adj_type
= 15;
1935 } else if (coex_dm
->cur_ps_tdma
== 15) {
1936 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 16);
1937 coex_dm
->ps_tdma_du_adj_type
= 16;
1939 } else if (result
== 1) {
1940 if (coex_dm
->cur_ps_tdma
== 8) {
1941 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1942 coex_dm
->ps_tdma_du_adj_type
= 7;
1943 } else if (coex_dm
->cur_ps_tdma
== 7) {
1944 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1945 coex_dm
->ps_tdma_du_adj_type
= 7;
1946 } else if (coex_dm
->cur_ps_tdma
== 6) {
1947 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 7);
1948 coex_dm
->ps_tdma_du_adj_type
= 7;
1949 } else if (coex_dm
->cur_ps_tdma
== 16) {
1950 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1951 coex_dm
->ps_tdma_du_adj_type
= 15;
1952 } else if (coex_dm
->cur_ps_tdma
== 15) {
1953 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1954 coex_dm
->ps_tdma_du_adj_type
= 15;
1955 } else if (coex_dm
->cur_ps_tdma
== 14) {
1956 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 15);
1957 coex_dm
->ps_tdma_du_adj_type
= 15;
1961 BTC_PRINT(BTC_MSG_ALGORITHM
,
1962 ALGO_TRACE_FW_DETAIL
,
1963 "[BTCoex], TxPause = 0\n");
1964 if (coex_dm
->cur_ps_tdma
== 5) {
1965 ps21a_tdma(btcoexist
, NORMAL_EXEC
,
1967 coex_dm
->ps_tdma_du_adj_type
= 3;
1968 } else if (coex_dm
->cur_ps_tdma
== 6) {
1969 ps21a_tdma(btcoexist
, NORMAL_EXEC
,
1971 coex_dm
->ps_tdma_du_adj_type
= 3;
1972 } else if (coex_dm
->cur_ps_tdma
== 7) {
1973 ps21a_tdma(btcoexist
, NORMAL_EXEC
,
1975 coex_dm
->ps_tdma_du_adj_type
= 3;
1976 } else if (coex_dm
->cur_ps_tdma
== 8) {
1977 ps21a_tdma(btcoexist
, NORMAL_EXEC
,
1979 coex_dm
->ps_tdma_du_adj_type
= 4;
1981 if (coex_dm
->cur_ps_tdma
== 13) {
1982 ps21a_tdma(btcoexist
, NORMAL_EXEC
,
1984 coex_dm
->ps_tdma_du_adj_type
= 11;
1985 } else if (coex_dm
->cur_ps_tdma
== 14) {
1986 ps21a_tdma(btcoexist
, NORMAL_EXEC
,
1988 coex_dm
->ps_tdma_du_adj_type
= 11;
1989 } else if (coex_dm
->cur_ps_tdma
== 15) {
1990 ps21a_tdma(btcoexist
, NORMAL_EXEC
,
1992 coex_dm
->ps_tdma_du_adj_type
= 11;
1993 } else if (coex_dm
->cur_ps_tdma
== 16) {
1994 ps21a_tdma(btcoexist
, NORMAL_EXEC
,
1996 coex_dm
->ps_tdma_du_adj_type
= 12;
1999 if (coex_dm
->cur_ps_tdma
== 1) {
2000 ps21a_tdma(btcoexist
,
2003 coex_dm
->ps_tdma_du_adj_type
= 3;
2004 } else if (coex_dm
->cur_ps_tdma
== 2) {
2005 ps21a_tdma(btcoexist
,
2008 coex_dm
->ps_tdma_du_adj_type
= 3;
2009 } else if (coex_dm
->cur_ps_tdma
== 3) {
2010 ps21a_tdma(btcoexist
,
2013 coex_dm
->ps_tdma_du_adj_type
= 4;
2014 } else if (coex_dm
->cur_ps_tdma
== 9) {
2015 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 11);
2016 coex_dm
->ps_tdma_du_adj_type
= 11;
2017 } else if (coex_dm
->cur_ps_tdma
== 10) {
2018 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 11);
2019 coex_dm
->ps_tdma_du_adj_type
= 11;
2020 } else if (coex_dm
->cur_ps_tdma
== 11) {
2021 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 12);
2022 coex_dm
->ps_tdma_du_adj_type
= 12;
2024 } else if (result
== 1) {
2025 if (coex_dm
->cur_ps_tdma
== 4) {
2026 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 3);
2027 coex_dm
->ps_tdma_du_adj_type
= 3;
2028 } else if (coex_dm
->cur_ps_tdma
== 3) {
2029 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 3);
2030 coex_dm
->ps_tdma_du_adj_type
= 3;
2031 } else if (coex_dm
->cur_ps_tdma
== 2) {
2032 ps21a_tdma(btcoexist
,
2033 NORMAL_EXEC
, true, 3);
2034 coex_dm
->ps_tdma_du_adj_type
= 3;
2035 } else if (coex_dm
->cur_ps_tdma
== 12) {
2036 ps21a_tdma(btcoexist
, NORMAL_EXEC
,
2038 coex_dm
->ps_tdma_du_adj_type
= 11;
2039 } else if (coex_dm
->cur_ps_tdma
== 11) {
2040 ps21a_tdma(btcoexist
,
2041 NORMAL_EXEC
, true, 11);
2042 coex_dm
->ps_tdma_du_adj_type
= 11;
2043 } else if (coex_dm
->cur_ps_tdma
== 10) {
2044 ps21a_tdma(btcoexist
,
2045 NORMAL_EXEC
, true, 11);
2046 coex_dm
->ps_tdma_du_adj_type
= 11;
2053 /* if current PsTdma not match with the recorded one
2054 * (when scan, dhcp...),
2055 * then we have to adjust it back to the previous record one. */
2056 if (coex_dm
->cur_ps_tdma
!= coex_dm
->ps_tdma_du_adj_type
) {
2057 bool scan
= false, link
= false, roam
= false;
2058 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
2059 "[BTCoex], PsTdma type dismatch!!!, cur_ps_tdma =%d, recordPsTdma =%d\n",
2060 coex_dm
->cur_ps_tdma
, coex_dm
->ps_tdma_du_adj_type
);
2062 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_SCAN
, &scan
);
2063 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_LINK
, &link
);
2064 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_ROAM
, &roam
);
2066 if (!scan
&& !link
&& !roam
)
2067 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true,
2068 coex_dm
->ps_tdma_du_adj_type
);
2070 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
2071 "[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n");
2074 /* when tdma_duration_adjust() is called, fw dac swing is
2075 * included in the function. */
2076 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 0x6);
2079 /* SCO only or SCO+PAN(HS) */
2080 static void halbtc8821a2ant_action_sco(struct btc_coexist
*btcoexist
)
2082 u8 wifi_rssi_state
, bt_rssi_state
;
2085 wifi_rssi_state
= wifi21a_rssi_state(btcoexist
, 0, 2, 15, 0);
2086 bt_rssi_state
= halbtc8821a2ant_bt_rssi_state(2, 35, 0);
2088 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 4);
2090 if (halbtc8821a2ant_need_to_dec_bt_pwr(btcoexist
))
2091 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, true);
2093 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
2095 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2097 if (BTC_WIFI_BW_LEGACY
== wifi_bw
) /* for SCO quality at 11b/g mode */
2098 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x5a5a5a5a,
2099 0x5a5a5a5a, 0xffff, 0x3);
2100 else /* for SCO quality & wifi performance balance at 11n mode */
2101 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x5aea5aea,
2102 0x5aea5aea, 0xffff, 0x3);
2104 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2106 /* ps21a_tdma(btcoexist, NORMAL_EXEC, true, 5); */
2108 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2109 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
))
2110 ps21a_tdma(btcoexist
, NORMAL_EXEC
,
2111 false, 0); /* for voice qual */
2113 ps21a_tdma(btcoexist
, NORMAL_EXEC
,
2114 false, 0); /* for voice qual */
2117 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2118 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2119 sw_mechanism1(btcoexist
, true, true, false, false);
2120 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2122 sw_mechanism1(btcoexist
, true, true, false, false);
2123 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2128 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2129 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
))
2130 ps21a_tdma(btcoexist
, NORMAL_EXEC
,
2131 false, 0); /* for voice qual */
2133 ps21a_tdma(btcoexist
, NORMAL_EXEC
,
2134 false, 0); /* for voice qual */
2137 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2138 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2139 sw_mechanism1(btcoexist
, false, true, false, false);
2140 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2142 sw_mechanism1(btcoexist
, false, true, false, false);
2143 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2148 static void halbtc8821a2ant_action_hid(struct btc_coexist
*btcoexist
)
2150 u8 wifi_rssi_state
, bt_rssi_state
;
2153 wifi_rssi_state
= wifi21a_rssi_state(btcoexist
, 0, 2, 15, 0);
2154 bt_rssi_state
= halbtc8821a2ant_bt_rssi_state(2, 35, 0);
2156 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 6);
2158 if (halbtc8821a2ant_need_to_dec_bt_pwr(btcoexist
))
2159 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, true);
2161 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
2163 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2165 if (BTC_WIFI_BW_LEGACY
== wifi_bw
) /* for HID at 11b/g mode */
2166 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55ff55ff,
2167 0x5a5a5a5a, 0xffff, 0x3);
2168 else /* for HID quality & wifi performance balance at 11n mode */
2169 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55ff55ff,
2170 0x5aea5aea, 0xffff, 0x3);
2172 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2174 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2175 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
))
2176 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 9);
2178 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 13);
2180 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2181 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2182 sw_mechanism1(btcoexist
, true, true, false, false);
2183 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2185 sw_mechanism1(btcoexist
, true, true, false, false);
2186 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2190 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2191 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
))
2192 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 9);
2194 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 13);
2197 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2198 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2199 sw_mechanism1(btcoexist
, false, true, false, false);
2200 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2202 sw_mechanism1(btcoexist
, false, true, false, false);
2203 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2208 /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
2209 static void halbtc8821a2ant_action_a2dp(struct btc_coexist
*btcoexist
)
2211 u8 wifi_rssi_state
, bt_rssi_state
;
2214 wifi_rssi_state
= wifi21a_rssi_state(btcoexist
, 0, 2, 15, 0);
2215 bt_rssi_state
= halbtc8821a2ant_bt_rssi_state(2, 35, 0);
2217 /* fw dac swing is called in tdma_duration_adjust() */
2218 /* halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); */
2220 if (halbtc8821a2ant_need_to_dec_bt_pwr(btcoexist
))
2221 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, true);
2223 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
2225 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2227 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2229 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2230 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
))
2231 tdma_duration_adjust(btcoexist
, false, false, 1);
2233 tdma_duration_adjust(btcoexist
, false, true, 1);
2236 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2237 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2238 sw_mechanism1(btcoexist
, true, false, false, false);
2239 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2241 sw_mechanism1(btcoexist
, true, false, false, false);
2242 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2246 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2247 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
))
2248 tdma_duration_adjust(btcoexist
, false, false, 1);
2250 tdma_duration_adjust(btcoexist
, false, true, 1);
2253 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2254 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2255 sw_mechanism1(btcoexist
, false, false, false, false);
2256 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2258 sw_mechanism1(btcoexist
, false, false, false, false);
2259 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2264 static void halbtc8821a2ant_action_a2dp_pan_hs(struct btc_coexist
*btcoexist
)
2266 u8 wifi_rssi_state
, bt_rssi_state
, bt_info_ext
;
2269 bt_info_ext
= coex_sta
->bt_info_ext
;
2270 wifi_rssi_state
= wifi21a_rssi_state(btcoexist
, 0, 2, 15, 0);
2271 bt_rssi_state
= halbtc8821a2ant_bt_rssi_state(2, 35, 0);
2273 /* fw dac swing is called in tdma_duration_adjust() */
2274 /* halbtc8821a2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6); */
2276 if (halbtc8821a2ant_need_to_dec_bt_pwr(btcoexist
))
2277 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, true);
2279 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
2281 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2283 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2285 if (bt_info_ext
& BIT(0)) /* a2dp basic rate */
2286 tdma_duration_adjust(btcoexist
, false, true, 2);
2287 else /* a2dp edr rate */
2288 tdma_duration_adjust(btcoexist
, false, true, 1);
2291 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2292 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2293 sw_mechanism1(btcoexist
, true, false, false, false);
2294 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2296 sw_mechanism1(btcoexist
, true, false, false, false);
2297 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2301 if (bt_info_ext
& BIT(0)) /* a2dp basic rate */
2302 tdma_duration_adjust(btcoexist
, false, true, 2);
2303 else /* a2dp edr rate */
2304 tdma_duration_adjust(btcoexist
, false, true, 1);
2307 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2308 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2309 sw_mechanism1(btcoexist
, false, false, false, false);
2310 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2312 sw_mechanism1(btcoexist
, false, false, false, false);
2313 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2318 static void halbtc8821a2ant_action_pan_edr(struct btc_coexist
*btcoexist
)
2320 u8 wifi_rssi_state
, bt_rssi_state
;
2323 wifi_rssi_state
= wifi21a_rssi_state(btcoexist
, 0, 2, 15, 0);
2324 bt_rssi_state
= halbtc8821a2ant_bt_rssi_state(2, 35, 0);
2326 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 6);
2328 if (halbtc8821a2ant_need_to_dec_bt_pwr(btcoexist
))
2329 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, true);
2331 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
2333 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2335 if (BTC_WIFI_BW_LEGACY
== wifi_bw
) /* for HID at 11b/g mode */
2336 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55ff55ff,
2337 0x5aff5aff, 0xffff, 0x3);
2338 else /* for HID quality & wifi performance balance at 11n mode */
2339 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55ff55ff,
2340 0x5aff5aff, 0xffff, 0x3);
2342 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2344 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2345 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
))
2346 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 1);
2348 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 5);
2351 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2352 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2353 sw_mechanism1(btcoexist
, true, false, false, false);
2354 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2356 sw_mechanism1(btcoexist
, true, false, false, false);
2357 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2361 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2362 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
))
2363 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 1);
2365 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 5);
2368 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2369 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2370 sw_mechanism1(btcoexist
, false, false, false, false);
2371 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2373 sw_mechanism1(btcoexist
, false, false, false, false);
2374 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2380 static void halbtc8821a2ant_action_pan_hs(struct btc_coexist
*btcoexist
)
2382 u8 wifi_rssi_state
, bt_rssi_state
;
2385 wifi_rssi_state
= wifi21a_rssi_state(btcoexist
, 0, 2, 15, 0);
2386 bt_rssi_state
= halbtc8821a2ant_bt_rssi_state(2, 35, 0);
2388 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 6);
2390 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2392 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2394 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2395 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
))
2396 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
,
2399 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
,
2401 ps21a_tdma(btcoexist
, NORMAL_EXEC
, false, 1);
2404 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2405 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2406 sw_mechanism1(btcoexist
, true, false, false, false);
2407 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2409 sw_mechanism1(btcoexist
, true, false, false, false);
2410 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2414 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2415 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
))
2416 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
,
2419 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
,
2422 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2423 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
))
2424 ps21a_tdma(btcoexist
, NORMAL_EXEC
, false, 1);
2426 ps21a_tdma(btcoexist
, NORMAL_EXEC
, false, 1);
2429 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2430 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2431 sw_mechanism1(btcoexist
, false, false, false, false);
2432 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2434 sw_mechanism1(btcoexist
, false, false, false, false);
2435 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2441 static void halbtc8821a2ant_action_pan_edr_a2dp(struct btc_coexist
*btcoexist
)
2443 u8 wifi_rssi_state
, bt_rssi_state
, bt_info_ext
;
2446 bt_info_ext
= coex_sta
->bt_info_ext
;
2447 wifi_rssi_state
= wifi21a_rssi_state(btcoexist
, 0, 2, 15, 0);
2448 bt_rssi_state
= halbtc8821a2ant_bt_rssi_state(2, 35, 0);
2450 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 6);
2452 if (halbtc8821a2ant_need_to_dec_bt_pwr(btcoexist
))
2453 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, true);
2455 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
2457 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2459 if (BTC_WIFI_BW_LEGACY
== wifi_bw
) /* for HID at 11b/g mode */
2460 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55ff55ff,
2461 0x5afa5afa, 0xffff, 0x3);
2462 else /* for HID quality & wifi performance balance at 11n mode */
2463 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55ff55ff,
2464 0x5afa5afa, 0xffff, 0x3);
2466 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2468 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2469 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2470 if (bt_info_ext
& BIT(0)) /* a2dp basic rate */
2471 tdma_duration_adjust(btcoexist
, false,
2473 else /* a2dp edr rate */
2474 tdma_duration_adjust(btcoexist
, false,
2477 if (bt_info_ext
& BIT(0)) /* a2dp basic rate */
2478 tdma_duration_adjust(btcoexist
, false, true, 3);
2479 else /* a2dp edr rate */
2480 tdma_duration_adjust(btcoexist
, false, true, 3);
2484 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2485 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2486 sw_mechanism1(btcoexist
, true, false, false, false);
2487 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2489 sw_mechanism1(btcoexist
, true, false, false, false);
2490 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2494 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2495 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2496 if (bt_info_ext
& BIT(0)) /* a2dp basic rate */
2497 tdma_duration_adjust(btcoexist
, false,
2499 else /* a2dp edr rate */
2500 tdma_duration_adjust(btcoexist
, false,
2503 if (bt_info_ext
& BIT(0)) /* a2dp basic rate */
2504 tdma_duration_adjust(btcoexist
, false, true, 3);
2505 else /* a2dp edr rate */
2506 tdma_duration_adjust(btcoexist
, false, true, 3);
2510 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2511 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2512 sw_mechanism1(btcoexist
, false, false, false, false);
2513 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2515 sw_mechanism1(btcoexist
, false, false, false, false);
2516 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2521 static void halbtc8821a2ant_action_pan_edr_hid(struct btc_coexist
*btcoexist
)
2523 u8 wifi_rssi_state
, bt_rssi_state
;
2526 wifi_rssi_state
= wifi21a_rssi_state(btcoexist
, 0, 2, 15, 0);
2527 bt_rssi_state
= halbtc8821a2ant_bt_rssi_state(2, 35, 0);
2529 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 6);
2531 if (halbtc8821a2ant_need_to_dec_bt_pwr(btcoexist
))
2532 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, true);
2534 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
2536 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2538 if (BTC_WIFI_BW_LEGACY
== wifi_bw
) /* for HID at 11b/g mode */
2539 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55ff55ff,
2540 0x5a5f5a5f, 0xffff, 0x3);
2541 else /* for HID quality & wifi performance balance at 11n mode */
2542 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55ff55ff,
2543 0x5a5f5a5f, 0xffff, 0x3);
2545 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2546 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 3);
2548 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2549 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
))
2550 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
2552 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 14);
2555 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2556 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2557 sw_mechanism1(btcoexist
, true, true, false, false);
2558 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2560 sw_mechanism1(btcoexist
, true, true, false, false);
2561 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2564 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 6);
2566 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2567 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
))
2568 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
2570 ps21a_tdma(btcoexist
, NORMAL_EXEC
, true, 14);
2573 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2574 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2575 sw_mechanism1(btcoexist
, false, true, false, false);
2576 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2578 sw_mechanism1(btcoexist
, false, true, false, false);
2579 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2584 /* HID+A2DP+PAN(EDR) */
2585 static void action_hid_a2dp_pan_edr(struct btc_coexist
*btcoexist
)
2587 u8 wifi_rssi_state
, bt_rssi_state
, bt_info_ext
;
2590 bt_info_ext
= coex_sta
->bt_info_ext
;
2591 wifi_rssi_state
= wifi21a_rssi_state(btcoexist
, 0, 2, 15, 0);
2592 bt_rssi_state
= halbtc8821a2ant_bt_rssi_state(2, 35, 0);
2594 halbtc8821a2ant_fw_dac_swing_lvl(btcoexist
, NORMAL_EXEC
, 6);
2596 if (halbtc8821a2ant_need_to_dec_bt_pwr(btcoexist
))
2597 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, true);
2599 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
2601 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2603 if (BTC_WIFI_BW_LEGACY
== wifi_bw
) /* for HID at 11b/g mode */
2604 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55ff55ff,
2605 0x5a5a5a5a, 0xffff, 0x3);
2606 else /* for HID quality & wifi performance balance at 11n mode */
2607 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55ff55ff,
2608 0x5a5a5a5a, 0xffff, 0x3);
2610 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2612 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2613 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2614 if (bt_info_ext
& BIT(0)) { /* a2dp basic rate */
2615 tdma_duration_adjust(btcoexist
, true, true, 3);
2618 tdma_duration_adjust(btcoexist
, true, true, 3);
2621 if (bt_info_ext
& BIT(0)) /* a2dp basic rate */
2622 tdma_duration_adjust(btcoexist
, true, true, 3);
2623 else /* a2dp edr rate */
2624 tdma_duration_adjust(btcoexist
, true, true, 3);
2628 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2629 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2630 sw_mechanism1(btcoexist
, true, true, false, false);
2631 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2633 sw_mechanism1(btcoexist
, true, true, false, false);
2634 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2638 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2639 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2640 if (bt_info_ext
& BIT(0)) /* a2dp basic rate */
2641 tdma_duration_adjust(btcoexist
, true, false, 3);
2642 else /* a2dp edr rate */
2643 tdma_duration_adjust(btcoexist
, true, false, 3);
2645 if (bt_info_ext
& BIT(0)) {
2646 /* a2dp basic rate */
2647 tdma_duration_adjust(btcoexist
, true, true, 3);
2648 } else /* a2dp edr rate */ {
2649 tdma_duration_adjust(btcoexist
, true, true, 3);
2654 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2655 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2656 sw_mechanism1(btcoexist
, false, true, false, false);
2657 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2659 sw_mechanism1(btcoexist
, false, true, false, false);
2660 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2665 static void halbtc8821a2ant_action_hid_a2dp(struct btc_coexist
*btcoexist
)
2667 u8 wifi_rssi_state
, bt_rssi_state
, bt_info_ext
;
2670 bt_info_ext
= coex_sta
->bt_info_ext
;
2671 wifi_rssi_state
= wifi21a_rssi_state(btcoexist
, 0, 2, 15, 0);
2672 bt_rssi_state
= halbtc8821a2ant_bt_rssi_state(2, 35, 0);
2674 if (halbtc8821a2ant_need_to_dec_bt_pwr(btcoexist
))
2675 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, true);
2677 halbtc8821a2ant_dec_bt_pwr(btcoexist
, NORMAL_EXEC
, false);
2679 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2681 if (BTC_WIFI_BW_LEGACY
== wifi_bw
) /* for HID at 11b/g mode */
2682 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55ff55ff,
2683 0x5f5b5f5b, 0xffffff, 0x3);
2684 else /* for HID quality & wifi performance balance at 11n mode */
2685 halbtc8821a2ant_coex_table(btcoexist
, NORMAL_EXEC
, 0x55ff55ff,
2686 0x5f5b5f5b, 0xffffff, 0x3);
2688 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2690 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2691 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2692 if (bt_info_ext
& BIT(0)) /* a2dp basic rate */
2693 tdma_duration_adjust(btcoexist
, true, true, 2);
2694 else /* a2dp edr rate */
2695 tdma_duration_adjust(btcoexist
, true, true, 2);
2697 if (bt_info_ext
& BIT(0)) /* a2dp basic rate */
2698 tdma_duration_adjust(btcoexist
, true, true, 2);
2699 else /* a2dp edr rate */
2700 tdma_duration_adjust(btcoexist
, true, true, 2);
2704 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2705 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2706 sw_mechanism1(btcoexist
, true, true, false, false);
2707 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2709 sw_mechanism1(btcoexist
, true, true, false, false);
2710 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2714 if ((bt_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2715 (bt_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2716 if (bt_info_ext
& BIT(0)) /* a2dp basic rate */
2717 tdma_duration_adjust(btcoexist
, true, true, 2);
2718 else /* a2dp edr rate */
2719 tdma_duration_adjust(btcoexist
, true, true, 2);
2721 if (bt_info_ext
& BIT(0)) /* a2dp basic rate */
2722 tdma_duration_adjust(btcoexist
, true, true, 2);
2723 else /* a2dp edr rate */
2724 tdma_duration_adjust(btcoexist
, true, true, 2);
2728 if ((wifi_rssi_state
== BTC_RSSI_STATE_HIGH
) ||
2729 (wifi_rssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2730 sw_mechanism1(btcoexist
, false, true, false, false);
2731 sw_mechanism2(btcoexist
, true, false, false, 0x18);
2733 sw_mechanism1(btcoexist
, false, true, false, false);
2734 sw_mechanism2(btcoexist
, false, false, false, 0x18);
2739 static void halbtc8821a2ant_run_coexist_mechanism(struct btc_coexist
*btcoexist
)
2741 bool wifi_under_5g
= false;
2744 if (btcoexist
->manual_control
) {
2745 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2746 "[BTCoex], Manual control!!!\n");
2750 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_UNDER_5G
, &wifi_under_5g
);
2752 if (wifi_under_5g
) {
2753 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2754 "[BTCoex], RunCoexistMechanism(), run 5G coex setting!!<===\n");
2755 halbtc8821a2ant_coex_under_5g(btcoexist
);
2759 algorithm
= halbtc8821a2ant_action_algorithm(btcoexist
);
2760 if (coex_sta
->c2h_bt_inquiry_page
&&
2761 (BT_8821A_2ANT_COEX_ALGO_PANHS
!= algorithm
)) {
2762 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2763 "[BTCoex], BT is under inquiry/page scan !!\n");
2764 halbtc8821a2ant_bt_inquiry_page(btcoexist
);
2768 coex_dm
->cur_algorithm
= algorithm
;
2769 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2770 "[BTCoex], Algorithm = %d\n", coex_dm
->cur_algorithm
);
2772 if (halbtc8821a2ant_is_common_action(btcoexist
)) {
2773 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2774 "[BTCoex], Action 2-Ant common.\n");
2775 coex_dm
->reset_tdma_adjust
= true;
2777 if (coex_dm
->cur_algorithm
!= coex_dm
->pre_algorithm
) {
2778 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2779 "[BTCoex], pre_algorithm =%d, cur_algorithm =%d\n",
2780 coex_dm
->pre_algorithm
,
2781 coex_dm
->cur_algorithm
);
2782 coex_dm
->reset_tdma_adjust
= true;
2784 switch (coex_dm
->cur_algorithm
) {
2785 case BT_8821A_2ANT_COEX_ALGO_SCO
:
2786 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2787 "[BTCoex], Action 2-Ant, algorithm = SCO.\n");
2788 halbtc8821a2ant_action_sco(btcoexist
);
2790 case BT_8821A_2ANT_COEX_ALGO_HID
:
2791 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2792 "[BTCoex], Action 2-Ant, algorithm = HID.\n");
2793 halbtc8821a2ant_action_hid(btcoexist
);
2795 case BT_8821A_2ANT_COEX_ALGO_A2DP
:
2796 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2797 "[BTCoex], Action 2-Ant, algorithm = A2DP.\n");
2798 halbtc8821a2ant_action_a2dp(btcoexist
);
2800 case BT_8821A_2ANT_COEX_ALGO_A2DP_PANHS
:
2801 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2802 "[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n");
2803 halbtc8821a2ant_action_a2dp_pan_hs(btcoexist
);
2805 case BT_8821A_2ANT_COEX_ALGO_PANEDR
:
2806 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2807 "[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n");
2808 halbtc8821a2ant_action_pan_edr(btcoexist
);
2810 case BT_8821A_2ANT_COEX_ALGO_PANHS
:
2811 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2812 "[BTCoex], Action 2-Ant, algorithm = HS mode.\n");
2813 halbtc8821a2ant_action_pan_hs(btcoexist
);
2815 case BT_8821A_2ANT_COEX_ALGO_PANEDR_A2DP
:
2816 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2817 "[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n");
2818 halbtc8821a2ant_action_pan_edr_a2dp(btcoexist
);
2820 case BT_8821A_2ANT_COEX_ALGO_PANEDR_HID
:
2821 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2822 "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n");
2823 halbtc8821a2ant_action_pan_edr_hid(btcoexist
);
2825 case BT_8821A_2ANT_COEX_ALGO_HID_A2DP_PANEDR
:
2826 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2827 "[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n");
2828 action_hid_a2dp_pan_edr(btcoexist
);
2830 case BT_8821A_2ANT_COEX_ALGO_HID_A2DP
:
2831 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2832 "[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n");
2833 halbtc8821a2ant_action_hid_a2dp(btcoexist
);
2836 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2837 "[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n");
2838 halbtc8821a2ant_coex_all_off(btcoexist
);
2841 coex_dm
->pre_algorithm
= coex_dm
->cur_algorithm
;
2845 /* work around function start with wa_halbtc8821a2ant_ */
2846 /* extern function start with EXhalbtc8821a2ant_ */
2847 void ex_halbtc8821a2ant_init_hwconfig(struct btc_coexist
*btcoexist
)
2851 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_INIT
,
2852 "[BTCoex], 2Ant Init HW Config!!\n");
2854 /* backup rf 0x1e value */
2855 coex_dm
->bt_rf0x1e_backup
=
2856 btcoexist
->btc_get_rf_reg(btcoexist
, BTC_RF_A
, 0x1e, 0xfffff);
2858 /* 0x790[5:0] = 0x5 */
2859 u1tmp
= btcoexist
->btc_read_1byte(btcoexist
, 0x790);
2862 btcoexist
->btc_write_1byte(btcoexist
, 0x790, u1tmp
);
2864 /* Antenna config */
2865 halbtc8821a2ant_set_ant_path(btcoexist
, BTC_ANT_WIFI_AT_MAIN
,
2869 halbtc8821a2ant_coex_table(btcoexist
, FORCE_EXEC
,
2870 0x55555555, 0x55555555,
2873 /* Enable counter statistics */
2874 /* 0x76e[3] = 1, WLAN_Act control by PTA */
2875 btcoexist
->btc_write_1byte(btcoexist
, 0x76e, 0xc);
2876 btcoexist
->btc_write_1byte(btcoexist
, 0x778, 0x3);
2877 btcoexist
->btc_write_1byte_bitmask(btcoexist
, 0x40, 0x20, 0x1);
2880 void ex_halbtc8821a2ant_init_coex_dm(struct btc_coexist
*btcoexist
)
2882 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_INIT
,
2883 "[BTCoex], Coex Mechanism Init!!\n");
2885 halbtc8821a2ant_init_coex_dm(btcoexist
);
2888 void ex_halbtc8821a2ant_display_coex_info(struct btc_coexist
*btcoexist
)
2890 struct btc_board_info
*board_info
= &btcoexist
->board_info
;
2891 struct btc_stack_info
*stack_info
= &btcoexist
->stack_info
;
2892 u8
*cli_buf
= btcoexist
->cli_buf
;
2893 u8 u1tmp
[4], i
, bt_info_ext
, ps_tdma_case
= 0;
2895 bool roam
= false, scan
= false, link
= false, wifi_under_5g
= false;
2896 bool bt_hs_on
= false, wifi_busy
= false;
2897 long wifi_rssi
= 0, bt_hs_rssi
= 0;
2898 u32 wifi_bw
, wifi_traffic_dir
;
2899 u8 wifi_dot_11_chnl
, wifi_hs_chnl
;
2900 u32 fw_ver
= 0, bt_patch_ver
= 0;
2902 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
2903 "\n ============[BT Coexist info] ============");
2906 if (!board_info
->bt_exist
) {
2907 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n BT not exists !!!");
2912 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = %d/ %d ",
2913 "Ant PG number/ Ant mechanism: ",
2914 board_info
->pg_ant_num
, board_info
->btdm_ant_num
);
2917 if (btcoexist
->manual_control
) {
2918 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s",
2919 "[Action Manual control]!!");
2923 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = %s / %d",
2924 "BT stack/ hci ext ver",
2925 ((stack_info
->profile_notified
) ? "Yes" : "No"),
2926 stack_info
->hci_version
);
2929 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_BT_PATCH_VER
, &bt_patch_ver
);
2930 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_FW_VER
, &fw_ver
);
2931 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)",
2932 "CoexVer/ FwVer/ PatchVer",
2933 glcoex_ver_date_8821a_2ant
, glcoex_ver_8821a_2ant
,
2934 fw_ver
, bt_patch_ver
, bt_patch_ver
);
2937 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_HS_OPERATION
, &bt_hs_on
);
2938 btcoexist
->btc_get(btcoexist
, BTC_GET_U1_WIFI_DOT11_CHNL
,
2940 btcoexist
->btc_get(btcoexist
, BTC_GET_U1_WIFI_HS_CHNL
, &wifi_hs_chnl
);
2941 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = %d / %d(%d)",
2942 "Dot11 channel / HsMode(HsChnl)",
2943 wifi_dot_11_chnl
, bt_hs_on
, wifi_hs_chnl
);
2946 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
2947 "\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info",
2948 coex_dm
->wifi_chnl_info
[0], coex_dm
->wifi_chnl_info
[1],
2949 coex_dm
->wifi_chnl_info
[2]);
2952 btcoexist
->btc_get(btcoexist
, BTC_GET_S4_WIFI_RSSI
, &wifi_rssi
);
2953 btcoexist
->btc_get(btcoexist
, BTC_GET_S4_HS_RSSI
, &bt_hs_rssi
);
2954 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
2955 "\n %-35s = %ld/ %ld", "Wifi rssi/ HS rssi",
2956 wifi_rssi
, bt_hs_rssi
);
2959 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_SCAN
, &scan
);
2960 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_LINK
, &link
);
2961 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_ROAM
, &roam
);
2962 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = %d/ %d/ %d ",
2963 "Wifi link/ roam/ scan",
2967 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_UNDER_5G
, &wifi_under_5g
);
2968 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2969 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_BUSY
, &wifi_busy
);
2970 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION
,
2972 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = %s / %s/ %s ",
2974 (wifi_under_5g
? "5G" : "2.4G"),
2975 ((BTC_WIFI_BW_LEGACY
== wifi_bw
) ? "Legacy" :
2976 (((BTC_WIFI_BW_HT40
== wifi_bw
) ? "HT40" : "HT20"))),
2977 ((!wifi_busy
) ? "idle" :
2978 ((BTC_WIFI_TRAFFIC_TX
== wifi_traffic_dir
) ? "uplink" :
2982 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = [%s/ %d/ %d] ",
2983 "BT [status/ rssi/ retryCnt]",
2984 ((coex_sta
->c2h_bt_inquiry_page
) ? ("inquiry/page scan") :
2985 ((BT_8821A_2ANT_BT_STATUS_IDLE
== coex_dm
->bt_status
) ?
2986 "idle" : ((BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE
==
2987 coex_dm
->bt_status
) ? "connected-idle" : "busy"))),
2988 coex_sta
->bt_rssi
, coex_sta
->bt_retry_cnt
);
2991 if (stack_info
->profile_notified
) {
2992 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
2993 "\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP",
2994 stack_info
->sco_exist
, stack_info
->hid_exist
,
2995 stack_info
->pan_exist
, stack_info
->a2dp_exist
);
2998 btcoexist
->btc_disp_dbg_msg(btcoexist
,
2999 BTC_DBG_DISP_BT_LINK_INFO
);
3002 bt_info_ext
= coex_sta
->bt_info_ext
;
3003 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = %s",
3004 "BT Info A2DP rate",
3005 (bt_info_ext
& BIT(0)) ? "Basic rate" : "EDR rate");
3008 for (i
= 0; i
< BT_INFO_SRC_8821A_2ANT_MAX
; i
++) {
3009 if (coex_sta
->bt_info_c2h_cnt
[i
]) {
3010 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
3011 "\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)",
3012 glbt_info_src_8821a_2ant
[i
],
3013 coex_sta
->bt_info_c2h
[i
][0],
3014 coex_sta
->bt_info_c2h
[i
][1],
3015 coex_sta
->bt_info_c2h
[i
][2],
3016 coex_sta
->bt_info_c2h
[i
][3],
3017 coex_sta
->bt_info_c2h
[i
][4],
3018 coex_sta
->bt_info_c2h
[i
][5],
3019 coex_sta
->bt_info_c2h
[i
][6],
3020 coex_sta
->bt_info_c2h_cnt
[i
]);
3025 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = %s/%s",
3026 "PS state, IPS/LPS",
3027 ((coex_sta
->under_ips
? "IPS ON" : "IPS OFF")),
3028 ((coex_sta
->under_lps
? "LPS ON" : "LPS OFF")));
3030 btcoexist
->btc_disp_dbg_msg(btcoexist
, BTC_DBG_DISP_FW_PWR_MODE_CMD
);
3033 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s",
3034 "============[Sw mechanism] ============");
3036 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = %d/ %d/ %d/ %d ",
3037 "SM1[ShRf/ LpRA/ LimDig/ btLna]",
3038 coex_dm
->cur_rf_rx_lpf_shrink
, coex_dm
->cur_low_penalty_ra
,
3039 coex_dm
->limited_dig
, coex_dm
->cur_bt_lna_constrain
);
3041 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = %d/ %d/ %d(0x%x) ",
3042 "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]",
3043 coex_dm
->cur_agc_table_en
, coex_dm
->cur_adc_back_off
,
3044 coex_dm
->cur_dac_swing_on
, coex_dm
->cur_dac_swing_lvl
);
3048 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s",
3049 "============[Fw mechanism] ============");
3052 if (!btcoexist
->manual_control
) {
3053 ps_tdma_case
= coex_dm
->cur_ps_tdma
;
3054 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
3055 "\n %-35s = %02x %02x %02x %02x %02x case-%d",
3057 coex_dm
->ps_tdma_para
[0], coex_dm
->ps_tdma_para
[1],
3058 coex_dm
->ps_tdma_para
[2], coex_dm
->ps_tdma_para
[3],
3059 coex_dm
->ps_tdma_para
[4], ps_tdma_case
);
3062 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = %d/ %d ",
3063 "DecBtPwr/ IgnWlanAct",
3064 coex_dm
->cur_dec_bt_pwr
,
3065 coex_dm
->cur_ignore_wlan_act
);
3070 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
3071 "\n %-35s", "============[Hw setting] ============");
3074 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = 0x%x",
3075 "RF-A, 0x1e initVal",
3076 coex_dm
->bt_rf0x1e_backup
);
3079 u1tmp
[0] = btcoexist
->btc_read_1byte(btcoexist
, 0x778);
3080 u1tmp
[1] = btcoexist
->btc_read_1byte(btcoexist
, 0x6cc);
3081 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = 0x%x/ 0x%x ",
3082 "0x778 (W_Act)/ 0x6cc (CoTab Sel)",
3083 u1tmp
[0], u1tmp
[1]);
3086 u1tmp
[0] = btcoexist
->btc_read_1byte(btcoexist
, 0x8db);
3087 u1tmp
[1] = btcoexist
->btc_read_1byte(btcoexist
, 0xc5b);
3088 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = 0x%x/ 0x%x",
3089 "0x8db(ADC)/0xc5b[29:25](DAC)",
3090 ((u1tmp
[0]&0x60)>>5), ((u1tmp
[1]&0x3e)>>1));
3093 u4tmp
[0] = btcoexist
->btc_read_4byte(btcoexist
, 0xcb4);
3094 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = 0x%x/ 0x%x",
3095 "0xcb4[7:0](ctrl)/ 0xcb4[29:28](val)",
3096 u4tmp
[0]&0xff, ((u4tmp
[0]&0x30000000)>>28));
3099 u1tmp
[0] = btcoexist
->btc_read_1byte(btcoexist
, 0x40);
3100 u4tmp
[0] = btcoexist
->btc_read_4byte(btcoexist
, 0x4c);
3101 u4tmp
[1] = btcoexist
->btc_read_4byte(btcoexist
, 0x974);
3102 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
3103 "0x40/ 0x4c[24:23]/ 0x974",
3104 u1tmp
[0], ((u4tmp
[0]&0x01800000)>>23), u4tmp
[1]);
3107 u4tmp
[0] = btcoexist
->btc_read_4byte(btcoexist
, 0x550);
3108 u1tmp
[0] = btcoexist
->btc_read_1byte(btcoexist
, 0x522);
3109 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = 0x%x/ 0x%x",
3110 "0x550(bcn ctrl)/0x522",
3111 u4tmp
[0], u1tmp
[0]);
3114 u4tmp
[0] = btcoexist
->btc_read_4byte(btcoexist
, 0xc50);
3115 u1tmp
[0] = btcoexist
->btc_read_1byte(btcoexist
, 0xa0a);
3116 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = 0x%x/ 0x%x",
3117 "0xc50(DIG)/0xa0a(CCK-TH)",
3118 u4tmp
[0], u1tmp
[0]);
3121 u4tmp
[0] = btcoexist
->btc_read_4byte(btcoexist
, 0xf48);
3122 u1tmp
[0] = btcoexist
->btc_read_1byte(btcoexist
, 0xa5b);
3123 u1tmp
[1] = btcoexist
->btc_read_1byte(btcoexist
, 0xa5c);
3124 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
3125 "\n %-35s = 0x%x/ 0x%x", "OFDM-FA/ CCK-FA",
3126 u4tmp
[0], (u1tmp
[0]<<8) + u1tmp
[1]);
3129 u4tmp
[0] = btcoexist
->btc_read_4byte(btcoexist
, 0x6c0);
3130 u4tmp
[1] = btcoexist
->btc_read_4byte(btcoexist
, 0x6c4);
3131 u4tmp
[2] = btcoexist
->btc_read_4byte(btcoexist
, 0x6c8);
3132 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = 0x%x/ 0x%x/ 0x%x",
3133 "0x6c0/0x6c4/0x6c8",
3134 u4tmp
[0], u4tmp
[1], u4tmp
[2]);
3137 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = %d/ %d",
3138 "0x770 (hi-pri Rx/Tx)",
3139 coex_sta
->high_priority_rx
, coex_sta
->high_priority_tx
);
3141 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = %d/ %d",
3142 "0x774(low-pri Rx/Tx)",
3143 coex_sta
->low_priority_rx
, coex_sta
->low_priority_tx
);
3146 /* Tx mgnt queue hang or not, 0x41b should = 0xf, ex: 0xd ==>hang */
3147 u1tmp
[0] = btcoexist
->btc_read_1byte(btcoexist
, 0x41b);
3148 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\n %-35s = 0x%x",
3149 "0x41b (mgntQ hang chk == 0xf)",
3153 btcoexist
->btc_disp_dbg_msg(btcoexist
, BTC_DBG_DISP_COEX_STATISTICS
);
3156 void ex_halbtc8821a2ant_ips_notify(struct btc_coexist
*btcoexist
, u8 type
)
3158 if (BTC_IPS_ENTER
== type
) {
3159 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3160 "[BTCoex], IPS ENTER notify\n");
3161 coex_sta
->under_ips
= true;
3162 halbtc8821a2ant_coex_all_off(btcoexist
);
3163 } else if (BTC_IPS_LEAVE
== type
) {
3164 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3165 "[BTCoex], IPS LEAVE notify\n");
3166 coex_sta
->under_ips
= false;
3170 void ex_halbtc8821a2ant_lps_notify(struct btc_coexist
*btcoexist
, u8 type
)
3172 if (BTC_LPS_ENABLE
== type
) {
3173 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3174 "[BTCoex], LPS ENABLE notify\n");
3175 coex_sta
->under_lps
= true;
3176 } else if (BTC_LPS_DISABLE
== type
) {
3177 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3178 "[BTCoex], LPS DISABLE notify\n");
3179 coex_sta
->under_lps
= false;
3183 void ex_halbtc8821a2ant_scan_notify(struct btc_coexist
*btcoexist
, u8 type
)
3185 if (BTC_SCAN_START
== type
)
3186 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3187 "[BTCoex], SCAN START notify\n");
3188 else if (BTC_SCAN_FINISH
== type
)
3189 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3190 "[BTCoex], SCAN FINISH notify\n");
3193 void ex_halbtc8821a2ant_connect_notify(struct btc_coexist
*btcoexist
, u8 type
)
3195 if (BTC_ASSOCIATE_START
== type
)
3196 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3197 "[BTCoex], CONNECT START notify\n");
3198 else if (BTC_ASSOCIATE_FINISH
== type
)
3199 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3200 "[BTCoex], CONNECT FINISH notify\n");
3203 void ex_halbtc8821a2ant_media_status_notify(struct btc_coexist
*btcoexist
,
3206 u8 h2c_parameter
[3] = {0};
3208 u8 wifi_central_chnl
;
3210 if (BTC_MEDIA_CONNECT
== type
)
3211 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3212 "[BTCoex], MEDIA connect notify\n");
3214 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3215 "[BTCoex], MEDIA disconnect notify\n");
3217 /* only 2.4G we need to inform bt the chnl mask */
3218 btcoexist
->btc_get(btcoexist
, BTC_GET_U1_WIFI_CENTRAL_CHNL
,
3219 &wifi_central_chnl
);
3220 if ((BTC_MEDIA_CONNECT
== type
) &&
3221 (wifi_central_chnl
<= 14)) {
3222 h2c_parameter
[0] = 0x1;
3223 h2c_parameter
[1] = wifi_central_chnl
;
3224 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
3225 if (BTC_WIFI_BW_HT40
== wifi_bw
)
3226 h2c_parameter
[2] = 0x30;
3228 h2c_parameter
[2] = 0x20;
3231 coex_dm
->wifi_chnl_info
[0] = h2c_parameter
[0];
3232 coex_dm
->wifi_chnl_info
[1] = h2c_parameter
[1];
3233 coex_dm
->wifi_chnl_info
[2] = h2c_parameter
[2];
3235 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
3236 "[BTCoex], FW write 0x66 = 0x%x\n",
3237 h2c_parameter
[0] << 16 |
3238 h2c_parameter
[1] << 8 | h2c_parameter
[2]);
3240 btcoexist
->btc_fill_h2c(btcoexist
, 0x66, 3, h2c_parameter
);
3243 void ex_halbtc8821a2ant_special_packet_notify(struct btc_coexist
*btcoexist
,
3246 if (type
== BTC_PACKET_DHCP
)
3247 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3248 "[BTCoex], DHCP Packet notify\n");
3251 void ex_halbtc8821a2ant_bt_info_notify(struct btc_coexist
*btcoexist
,
3252 u8
*tmp_buf
, u8 length
)
3255 u8 i
, rsp_source
= 0;
3256 static u32 set_bt_lna_cnt
, set_bt_psd_mode
;
3257 bool bt_busy
= false, limited_dig
= false;
3258 bool wifi_connected
= false, bt_hs_on
= false;
3260 coex_sta
->c2h_bt_info_req_sent
= false;
3261 rsp_source
= tmp_buf
[0]&0xf;
3262 if (rsp_source
>= BT_INFO_SRC_8821A_2ANT_MAX
)
3263 rsp_source
= BT_INFO_SRC_8821A_2ANT_WIFI_FW
;
3264 coex_sta
->bt_info_c2h_cnt
[rsp_source
]++;
3266 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3267 "[BTCoex], Bt info[%d], length =%d, hex data =[",
3268 rsp_source
, length
);
3269 for (i
= 0; i
< length
; i
++) {
3270 coex_sta
->bt_info_c2h
[rsp_source
][i
] = tmp_buf
[i
];
3272 bt_info
= tmp_buf
[i
];
3274 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
, "0x%02x]\n",
3277 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
, "0x%02x, ",
3281 if (BT_INFO_SRC_8821A_2ANT_WIFI_FW
!= rsp_source
) {
3282 coex_sta
->bt_retry_cnt
= /* [3:0] */
3283 coex_sta
->bt_info_c2h
[rsp_source
][2]&0xf;
3285 coex_sta
->bt_info_c2h
[rsp_source
][3]*2+10;
3286 coex_sta
->bt_info_ext
=
3287 coex_sta
->bt_info_c2h
[rsp_source
][4];
3289 /* Here we need to resend some wifi info to BT */
3290 /* because bt is reset and loss of the info. */
3291 if ((coex_sta
->bt_info_ext
& BIT(1))) {
3292 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_CONNECTED
,
3295 ex_halbtc8821a2ant_media_status_notify(btcoexist
,
3298 ex_halbtc8821a2ant_media_status_notify(btcoexist
,
3299 BTC_MEDIA_DISCONNECT
);
3301 set_bt_psd_mode
= 0;
3303 if (set_bt_psd_mode
<= 3) {
3304 /* fix CH-BW mode */
3305 halbtc8821a2ant_set_bt_psd_mode(btcoexist
,
3310 if (coex_dm
->cur_bt_lna_constrain
) {
3311 if (!(coex_sta
->bt_info_ext
& BIT(2))) {
3312 if (set_bt_lna_cnt
<= 3) {
3313 set_bt_lna_constrain(btcoexist
,
3322 if ((coex_sta
->bt_info_ext
& BIT(3)))
3323 halbtc8821a2ant_ignore_wlan_act(btcoexist
,
3326 /* BT already NOT ignore Wlan active, do nothing here */
3328 if (!(coex_sta
->bt_info_ext
& BIT(4)))
3329 halbtc8821a2ant_bt_auto_report(btcoexist
,
3333 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_HS_OPERATION
, &bt_hs_on
);
3334 /* check BIT(2) first ==> check if bt is under inquiry or page scan */
3335 if (bt_info
& BT_INFO_8821A_2ANT_B_INQ_PAGE
) {
3336 coex_sta
->c2h_bt_inquiry_page
= true;
3337 coex_dm
->bt_status
= BT_8821A_2ANT_BT_STATUS_NON_IDLE
;
3339 coex_sta
->c2h_bt_inquiry_page
= false;
3340 if (bt_info
== 0x1) { /* connection exists but not busy */
3341 coex_sta
->bt_link_exist
= true;
3342 coex_dm
->bt_status
=
3343 BT_8821A_2ANT_BT_STATUS_CONNECTED_IDLE
;
3344 } else if (bt_info
& BT_INFO_8821A_2ANT_B_CONNECTION
) {
3345 /* connection exists and some link is busy */
3346 coex_sta
->bt_link_exist
= true;
3347 if (bt_info
& BT_INFO_8821A_2ANT_B_FTP
)
3348 coex_sta
->pan_exist
= true;
3350 coex_sta
->pan_exist
= false;
3351 if (bt_info
& BT_INFO_8821A_2ANT_B_A2DP
)
3352 coex_sta
->a2dp_exist
= true;
3354 coex_sta
->a2dp_exist
= false;
3355 if (bt_info
& BT_INFO_8821A_2ANT_B_HID
)
3356 coex_sta
->hid_exist
= true;
3358 coex_sta
->hid_exist
= false;
3359 if (bt_info
& BT_INFO_8821A_2ANT_B_SCO_ESCO
)
3360 coex_sta
->sco_exist
= true;
3362 coex_sta
->sco_exist
= false;
3363 coex_dm
->bt_status
= BT_8821A_2ANT_BT_STATUS_NON_IDLE
;
3365 coex_sta
->bt_link_exist
= false;
3366 coex_sta
->pan_exist
= false;
3367 coex_sta
->a2dp_exist
= false;
3368 coex_sta
->hid_exist
= false;
3369 coex_sta
->sco_exist
= false;
3370 coex_dm
->bt_status
= BT_8821A_2ANT_BT_STATUS_IDLE
;
3374 coex_dm
->bt_status
= BT_8821A_2ANT_BT_STATUS_NON_IDLE
;
3377 if (BT_8821A_2ANT_BT_STATUS_NON_IDLE
== coex_dm
->bt_status
)
3381 btcoexist
->btc_set(btcoexist
, BTC_SET_BL_BT_TRAFFIC_BUSY
, &bt_busy
);
3383 if (BT_8821A_2ANT_BT_STATUS_IDLE
!= coex_dm
->bt_status
)
3386 limited_dig
= false;
3387 coex_dm
->limited_dig
= limited_dig
;
3388 btcoexist
->btc_set(btcoexist
, BTC_SET_BL_BT_LIMITED_DIG
, &limited_dig
);
3390 halbtc8821a2ant_run_coexist_mechanism(btcoexist
);
3393 void ex_halbtc8821a2ant_halt_notify(struct btc_coexist
*btcoexist
)
3395 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
, "[BTCoex], Halt notify\n");
3397 halbtc8821a2ant_ignore_wlan_act(btcoexist
, FORCE_EXEC
, true);
3398 ex_halbtc8821a2ant_media_status_notify(btcoexist
, BTC_MEDIA_DISCONNECT
);
3401 void ex_halbtc8821a2ant_periodical(struct btc_coexist
*btcoexist
)
3403 static u8 dis_ver_info_cnt
;
3404 u32 fw_ver
= 0, bt_patch_ver
= 0;
3405 struct btc_board_info
*board_info
= &btcoexist
->board_info
;
3406 struct btc_stack_info
*stack_info
= &btcoexist
->stack_info
;
3408 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3409 "[BTCoex], ========================== Periodical ===========================\n");
3411 if (dis_ver_info_cnt
<= 5) {
3412 dis_ver_info_cnt
+= 1;
3413 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_INIT
,
3414 "[BTCoex], ****************************************************************\n");
3415 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_INIT
,
3416 "[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n",
3417 board_info
->pg_ant_num
, board_info
->btdm_ant_num
,
3418 board_info
->btdm_ant_pos
);
3419 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_INIT
,
3420 "[BTCoex], BT stack/ hci ext ver = %s / %d\n",
3421 ((stack_info
->profile_notified
) ? "Yes" : "No"),
3422 stack_info
->hci_version
);
3423 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_BT_PATCH_VER
,
3425 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_FW_VER
, &fw_ver
);
3426 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_INIT
,
3427 "[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n",
3428 glcoex_ver_date_8821a_2ant
,
3429 glcoex_ver_8821a_2ant
,
3430 fw_ver
, bt_patch_ver
, bt_patch_ver
);
3431 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_INIT
,
3432 "[BTCoex], ****************************************************************\n");
3435 halbtc8821a2ant_query_bt_info(btcoexist
);
3436 halbtc8821a2ant_monitor_bt_ctr(btcoexist
);
3437 monitor_bt_enable_disable(btcoexist
);