1 /**************************************************************
4 * This file is for RTL8192E Co-exist mechanism
7 * 2012/11/15 Cosa first check in.
9 **************************************************************/
11 /**************************************************************
13 **************************************************************/
14 #include "halbt_precomp.h"
16 /**************************************************************
17 * Global variables, these are static variables
18 **************************************************************/
19 static struct coex_dm_8192e_2ant glcoex_dm_8192e_2ant
;
20 static struct coex_dm_8192e_2ant
*coex_dm
= &glcoex_dm_8192e_2ant
;
21 static struct coex_sta_8192e_2ant glcoex_sta_8192e_2ant
;
22 static struct coex_sta_8192e_2ant
*coex_sta
= &glcoex_sta_8192e_2ant
;
24 static const char *const GLBtInfoSrc8192e2Ant
[] = {
27 "BT Info[bt auto report]",
30 static u32 glcoex_ver_date_8192e_2ant
= 20130902;
31 static u32 glcoex_ver_8192e_2ant
= 0x34;
33 /**************************************************************
34 * local function proto type if needed
35 **************************************************************/
36 /**************************************************************
37 * local function start with halbtc8192e2ant_
38 **************************************************************/
39 static u8
halbtc8192e2ant_btrssi_state(u8 level_num
, u8 rssi_thresh
,
42 int btrssi
= coex_sta
->bt_rssi
;
43 u8 btrssi_state
= coex_sta
->pre_bt_rssi_state
;
46 if ((coex_sta
->pre_bt_rssi_state
== BTC_RSSI_STATE_LOW
) ||
47 (coex_sta
->pre_bt_rssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
48 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
49 "BT Rssi pre state=LOW\n");
50 if (btrssi
>= (rssi_thresh
+
51 BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT
)) {
52 btrssi_state
= BTC_RSSI_STATE_HIGH
;
53 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
54 "BT Rssi state switch to High\n");
56 btrssi_state
= BTC_RSSI_STATE_STAY_LOW
;
57 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
58 "BT Rssi state stay at Low\n");
61 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
62 "BT Rssi pre state=HIGH\n");
63 if (btrssi
< rssi_thresh
) {
64 btrssi_state
= BTC_RSSI_STATE_LOW
;
65 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
66 "BT Rssi state switch to Low\n");
68 btrssi_state
= BTC_RSSI_STATE_STAY_HIGH
;
69 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
70 "BT Rssi state stay at High\n");
73 } else if (level_num
== 3) {
74 if (rssi_thresh
> rssi_thresh1
) {
75 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
76 "BT Rssi thresh error!!\n");
77 return coex_sta
->pre_bt_rssi_state
;
80 if ((coex_sta
->pre_bt_rssi_state
== BTC_RSSI_STATE_LOW
) ||
81 (coex_sta
->pre_bt_rssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
82 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
83 "BT Rssi pre state=LOW\n");
84 if (btrssi
>= (rssi_thresh
+
85 BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT
)) {
86 btrssi_state
= BTC_RSSI_STATE_MEDIUM
;
87 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
88 "BT Rssi state switch to Medium\n");
90 btrssi_state
= BTC_RSSI_STATE_STAY_LOW
;
91 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
92 "BT Rssi state stay at Low\n");
94 } else if ((coex_sta
->pre_bt_rssi_state
==
95 BTC_RSSI_STATE_MEDIUM
) ||
96 (coex_sta
->pre_bt_rssi_state
==
97 BTC_RSSI_STATE_STAY_MEDIUM
)) {
98 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
99 "[BTCoex], BT Rssi pre state=MEDIUM\n");
100 if (btrssi
>= (rssi_thresh1
+
101 BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT
)) {
102 btrssi_state
= BTC_RSSI_STATE_HIGH
;
103 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
104 "BT Rssi state switch to High\n");
105 } else if (btrssi
< rssi_thresh
) {
106 btrssi_state
= BTC_RSSI_STATE_LOW
;
107 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
108 "BT Rssi state switch to Low\n");
110 btrssi_state
= BTC_RSSI_STATE_STAY_MEDIUM
;
111 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
112 "BT Rssi state stay at Medium\n");
115 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
116 "BT Rssi pre state=HIGH\n");
117 if (btrssi
< rssi_thresh1
) {
118 btrssi_state
= BTC_RSSI_STATE_MEDIUM
;
119 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
120 "BT Rssi state switch to Medium\n");
122 btrssi_state
= BTC_RSSI_STATE_STAY_HIGH
;
123 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_RSSI_STATE
,
124 "BT Rssi state stay at High\n");
129 coex_sta
->pre_bt_rssi_state
= btrssi_state
;
134 static u8
halbtc8192e2ant_wifirssi_state(struct btc_coexist
*btcoexist
,
135 u8 index
, u8 level_num
,
136 u8 rssi_thresh
, u8 rssi_thresh1
)
139 u8 wifirssi_state
= coex_sta
->pre_wifi_rssi_state
[index
];
141 btcoexist
->btc_get(btcoexist
, BTC_GET_S4_WIFI_RSSI
, &wifirssi
);
143 if (level_num
== 2) {
144 if ((coex_sta
->pre_wifi_rssi_state
[index
] ==
145 BTC_RSSI_STATE_LOW
) ||
146 (coex_sta
->pre_wifi_rssi_state
[index
] ==
147 BTC_RSSI_STATE_STAY_LOW
)) {
148 if (wifirssi
>= (rssi_thresh
+
149 BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT
)) {
150 wifirssi_state
= BTC_RSSI_STATE_HIGH
;
151 BTC_PRINT(BTC_MSG_ALGORITHM
,
152 ALGO_WIFI_RSSI_STATE
,
153 "wifi RSSI state switch to High\n");
155 wifirssi_state
= BTC_RSSI_STATE_STAY_LOW
;
156 BTC_PRINT(BTC_MSG_ALGORITHM
,
157 ALGO_WIFI_RSSI_STATE
,
158 "wifi RSSI state stay at Low\n");
161 if (wifirssi
< rssi_thresh
) {
162 wifirssi_state
= BTC_RSSI_STATE_LOW
;
163 BTC_PRINT(BTC_MSG_ALGORITHM
,
164 ALGO_WIFI_RSSI_STATE
,
165 "wifi RSSI state switch to Low\n");
167 wifirssi_state
= BTC_RSSI_STATE_STAY_HIGH
;
168 BTC_PRINT(BTC_MSG_ALGORITHM
,
169 ALGO_WIFI_RSSI_STATE
,
170 "wifi RSSI state stay at High\n");
173 } else if (level_num
== 3) {
174 if (rssi_thresh
> rssi_thresh1
) {
175 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_WIFI_RSSI_STATE
,
176 "wifi RSSI thresh error!!\n");
177 return coex_sta
->pre_wifi_rssi_state
[index
];
180 if ((coex_sta
->pre_wifi_rssi_state
[index
] ==
181 BTC_RSSI_STATE_LOW
) ||
182 (coex_sta
->pre_wifi_rssi_state
[index
] ==
183 BTC_RSSI_STATE_STAY_LOW
)) {
184 if (wifirssi
>= (rssi_thresh
+
185 BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT
)) {
186 wifirssi_state
= BTC_RSSI_STATE_MEDIUM
;
187 BTC_PRINT(BTC_MSG_ALGORITHM
,
188 ALGO_WIFI_RSSI_STATE
,
189 "wifi RSSI state switch to Medium\n");
191 wifirssi_state
= BTC_RSSI_STATE_STAY_LOW
;
192 BTC_PRINT(BTC_MSG_ALGORITHM
,
193 ALGO_WIFI_RSSI_STATE
,
194 "wifi RSSI state stay at Low\n");
196 } else if ((coex_sta
->pre_wifi_rssi_state
[index
] ==
197 BTC_RSSI_STATE_MEDIUM
) ||
198 (coex_sta
->pre_wifi_rssi_state
[index
] ==
199 BTC_RSSI_STATE_STAY_MEDIUM
)) {
200 if (wifirssi
>= (rssi_thresh1
+
201 BTC_RSSI_COEX_THRESH_TOL_8192E_2ANT
)) {
202 wifirssi_state
= BTC_RSSI_STATE_HIGH
;
203 BTC_PRINT(BTC_MSG_ALGORITHM
,
204 ALGO_WIFI_RSSI_STATE
,
205 "wifi RSSI state switch to High\n");
206 } else if (wifirssi
< rssi_thresh
) {
207 wifirssi_state
= BTC_RSSI_STATE_LOW
;
208 BTC_PRINT(BTC_MSG_ALGORITHM
,
209 ALGO_WIFI_RSSI_STATE
,
210 "wifi RSSI state switch to Low\n");
212 wifirssi_state
= BTC_RSSI_STATE_STAY_MEDIUM
;
213 BTC_PRINT(BTC_MSG_ALGORITHM
,
214 ALGO_WIFI_RSSI_STATE
,
215 "wifi RSSI state stay at Medium\n");
218 if (wifirssi
< rssi_thresh1
) {
219 wifirssi_state
= BTC_RSSI_STATE_MEDIUM
;
220 BTC_PRINT(BTC_MSG_ALGORITHM
,
221 ALGO_WIFI_RSSI_STATE
,
222 "wifi RSSI state switch to Medium\n");
224 wifirssi_state
= BTC_RSSI_STATE_STAY_HIGH
;
225 BTC_PRINT(BTC_MSG_ALGORITHM
,
226 ALGO_WIFI_RSSI_STATE
,
227 "wifi RSSI state stay at High\n");
232 coex_sta
->pre_wifi_rssi_state
[index
] = wifirssi_state
;
234 return wifirssi_state
;
237 static void halbtc8192e2ant_monitor_bt_enable_disable(struct btc_coexist
*btcoexist
)
239 static bool pre_bt_disabled
= false;
240 static u32 bt_disable_cnt
= 0;
241 bool bt_active
= true, bt_disabled
= false;
243 /* This function check if bt is disabled */
245 if (coex_sta
->high_priority_tx
== 0 &&
246 coex_sta
->high_priority_rx
== 0 &&
247 coex_sta
->low_priority_tx
== 0 &&
248 coex_sta
->low_priority_rx
== 0)
251 if (coex_sta
->high_priority_tx
== 0xffff &&
252 coex_sta
->high_priority_rx
== 0xffff &&
253 coex_sta
->low_priority_tx
== 0xffff &&
254 coex_sta
->low_priority_rx
== 0xffff)
260 btcoexist
->btc_set(btcoexist
, BTC_SET_BL_BT_DISABLE
,
262 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_MONITOR
,
263 "[BTCoex], BT is enabled !!\n");
266 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_MONITOR
,
267 "[BTCoex], bt all counters=0, %d times!!\n",
269 if (bt_disable_cnt
>= 2) {
271 btcoexist
->btc_set(btcoexist
, BTC_SET_BL_BT_DISABLE
,
273 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_MONITOR
,
274 "[BTCoex], BT is disabled !!\n");
277 if (pre_bt_disabled
!= bt_disabled
) {
278 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_MONITOR
,
279 "[BTCoex], BT is from %s to %s!!\n",
280 (pre_bt_disabled
? "disabled":"enabled"),
281 (bt_disabled
? "disabled":"enabled"));
282 pre_bt_disabled
= bt_disabled
;
286 static u32
halbtc8192e2ant_decidera_mask(struct btc_coexist
*btcoexist
,
287 u8 sstype
, u32 ra_masktype
)
289 u32 disra_mask
= 0x0;
291 switch (ra_masktype
) {
292 case 0: /* normal mode */
294 disra_mask
= 0x0; /* enable 2ss */
296 disra_mask
= 0xfff00000;/* disable 2ss */
298 case 1: /* disable cck 1/2 */
300 disra_mask
= 0x00000003;/* enable 2ss */
302 disra_mask
= 0xfff00003;/* disable 2ss */
304 case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
306 disra_mask
= 0x0001f1f7;/* enable 2ss */
308 disra_mask
= 0xfff1f1f7;/* disable 2ss */
317 static void halbtc8192e2ant_Updatera_mask(struct btc_coexist
*btcoexist
,
318 bool force_exec
, u32 dis_ratemask
)
320 coex_dm
->curra_mask
= dis_ratemask
;
322 if (force_exec
|| (coex_dm
->prera_mask
!= coex_dm
->curra_mask
))
323 btcoexist
->btc_set(btcoexist
, BTC_SET_ACT_UPDATE_ra_mask
,
324 &coex_dm
->curra_mask
);
325 coex_dm
->prera_mask
= coex_dm
->curra_mask
;
328 static void halbtc8192e2ant_autorate_fallback_retry(struct btc_coexist
*btcoexist
,
329 bool force_exec
, u8 type
)
331 bool wifi_under_bmode
= false;
333 coex_dm
->cur_arfrtype
= type
;
335 if (force_exec
|| (coex_dm
->pre_arfrtype
!= coex_dm
->cur_arfrtype
)) {
336 switch (coex_dm
->cur_arfrtype
) {
337 case 0: /* normal mode */
338 btcoexist
->btc_write_4byte(btcoexist
, 0x430,
339 coex_dm
->backup_arfr_cnt1
);
340 btcoexist
->btc_write_4byte(btcoexist
, 0x434,
341 coex_dm
->backup_arfr_cnt2
);
344 btcoexist
->btc_get(btcoexist
,
345 BTC_GET_BL_WIFI_UNDER_B_MODE
,
347 if (wifi_under_bmode
) {
348 btcoexist
->btc_write_4byte(btcoexist
, 0x430,
350 btcoexist
->btc_write_4byte(btcoexist
, 0x434,
353 btcoexist
->btc_write_4byte(btcoexist
, 0x430,
355 btcoexist
->btc_write_4byte(btcoexist
, 0x434,
364 coex_dm
->pre_arfrtype
= coex_dm
->cur_arfrtype
;
367 static void halbtc8192e2ant_retrylimit(struct btc_coexist
*btcoexist
,
368 bool force_exec
, u8 type
)
370 coex_dm
->cur_retrylimit_type
= type
;
372 if (force_exec
|| (coex_dm
->pre_retrylimit_type
!=
373 coex_dm
->cur_retrylimit_type
)) {
374 switch (coex_dm
->cur_retrylimit_type
) {
375 case 0: /* normal mode */
376 btcoexist
->btc_write_2byte(btcoexist
, 0x42a,
377 coex_dm
->backup_retrylimit
);
379 case 1: /* retry limit=8 */
380 btcoexist
->btc_write_2byte(btcoexist
, 0x42a,
388 coex_dm
->pre_retrylimit_type
= coex_dm
->cur_retrylimit_type
;
391 static void halbtc8192e2ant_ampdu_maxtime(struct btc_coexist
*btcoexist
,
392 bool force_exec
, u8 type
)
394 coex_dm
->cur_ampdutime_type
= type
;
396 if (force_exec
|| (coex_dm
->pre_ampdutime_type
!=
397 coex_dm
->cur_ampdutime_type
)) {
398 switch (coex_dm
->cur_ampdutime_type
) {
399 case 0: /* normal mode */
400 btcoexist
->btc_write_1byte(btcoexist
, 0x456,
401 coex_dm
->backup_ampdu_maxtime
);
403 case 1: /* AMPDU timw = 0x38 * 32us */
404 btcoexist
->btc_write_1byte(btcoexist
, 0x456, 0x38);
411 coex_dm
->pre_ampdutime_type
= coex_dm
->cur_ampdutime_type
;
414 static void halbtc8192e2ant_limited_tx(struct btc_coexist
*btcoexist
,
415 bool force_exec
, u8 ra_masktype
,
416 u8 arfr_type
, u8 retrylimit_type
,
419 u32 disra_mask
= 0x0;
421 coex_dm
->curra_masktype
= ra_masktype
;
422 disra_mask
= halbtc8192e2ant_decidera_mask(btcoexist
,
425 halbtc8192e2ant_Updatera_mask(btcoexist
, force_exec
, disra_mask
);
427 halbtc8192e2ant_autorate_fallback_retry(btcoexist
, force_exec
,
429 halbtc8192e2ant_retrylimit(btcoexist
, force_exec
, retrylimit_type
);
430 halbtc8192e2ant_ampdu_maxtime(btcoexist
, force_exec
, ampdutime_type
);
433 static void halbtc8192e2ant_limited_rx(struct btc_coexist
*btcoexist
,
434 bool force_exec
, bool rej_ap_agg_pkt
,
435 bool b_bt_ctrl_agg_buf_size
,
438 bool reject_rx_agg
= rej_ap_agg_pkt
;
439 bool bt_ctrl_rx_agg_size
= b_bt_ctrl_agg_buf_size
;
440 u8 rx_agg_size
= agg_buf_size
;
442 /*********************************************
443 * Rx Aggregation related setting
444 *********************************************/
445 btcoexist
->btc_set(btcoexist
, BTC_SET_BL_TO_REJ_AP_AGG_PKT
,
447 /* decide BT control aggregation buf size or not */
448 btcoexist
->btc_set(btcoexist
, BTC_SET_BL_BT_CTRL_AGG_SIZE
,
449 &bt_ctrl_rx_agg_size
);
450 /* aggregation buf size, only work
451 * when BT control Rx aggregation size. */
452 btcoexist
->btc_set(btcoexist
, BTC_SET_U1_AGG_BUF_SIZE
, &rx_agg_size
);
453 /* real update aggregation setting */
454 btcoexist
->btc_set(btcoexist
, BTC_SET_ACT_AGGREGATE_CTRL
, NULL
);
459 static void halbtc8192e2ant_monitor_bt_ctr(struct btc_coexist
*btcoexist
)
461 u32 reg_hp_txrx
, reg_lp_txrx
, u32tmp
;
462 u32 reg_hp_tx
= 0, reg_hp_rx
= 0, reg_lp_tx
= 0, reg_lp_rx
= 0;
467 u32tmp
= btcoexist
->btc_read_4byte(btcoexist
, reg_hp_txrx
);
468 reg_hp_tx
= u32tmp
& MASKLWORD
;
469 reg_hp_rx
= (u32tmp
& MASKHWORD
)>>16;
471 u32tmp
= btcoexist
->btc_read_4byte(btcoexist
, reg_lp_txrx
);
472 reg_lp_tx
= u32tmp
& MASKLWORD
;
473 reg_lp_rx
= (u32tmp
& MASKHWORD
)>>16;
475 coex_sta
->high_priority_tx
= reg_hp_tx
;
476 coex_sta
->high_priority_rx
= reg_hp_rx
;
477 coex_sta
->low_priority_tx
= reg_lp_tx
;
478 coex_sta
->low_priority_rx
= reg_lp_rx
;
480 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_MONITOR
,
481 "[BTCoex] High Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
482 reg_hp_txrx
, reg_hp_tx
, reg_hp_tx
, reg_hp_rx
, reg_hp_rx
);
483 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_BT_MONITOR
,
484 "[BTCoex] Low Priority Tx/Rx (reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
485 reg_lp_txrx
, reg_lp_tx
, reg_lp_tx
, reg_lp_rx
, reg_lp_rx
);
488 btcoexist
->btc_write_1byte(btcoexist
, 0x76e, 0xc);
491 static void halbtc8192e2ant_querybt_info(struct btc_coexist
*btcoexist
)
493 u8 h2c_parameter
[1] = {0};
495 coex_sta
->c2h_bt_info_req_sent
= true;
497 h2c_parameter
[0] |= BIT0
; /* trigger */
499 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
500 "[BTCoex], Query Bt Info, FW write 0x61=0x%x\n",
503 btcoexist
->btc_fill_h2c(btcoexist
, 0x61, 1, h2c_parameter
);
506 static bool halbtc8192e2ant_iswifi_status_changed(struct btc_coexist
*btcoexist
)
508 static bool pre_wifi_busy
= false;
509 static bool pre_under_4way
= false, pre_bt_hson
= false;
510 bool wifi_busy
= false, under_4way
= false, bt_hson
= false;
511 bool wifi_connected
= false;
513 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_CONNECTED
,
515 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_BUSY
, &wifi_busy
);
516 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_HS_OPERATION
, &bt_hson
);
517 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_4_WAY_PROGRESS
,
520 if (wifi_connected
) {
521 if (wifi_busy
!= pre_wifi_busy
) {
522 pre_wifi_busy
= wifi_busy
;
525 if (under_4way
!= pre_under_4way
) {
526 pre_under_4way
= under_4way
;
529 if (bt_hson
!= pre_bt_hson
) {
530 pre_bt_hson
= bt_hson
;
538 static void halbtc8192e2ant_update_btlink_info(struct btc_coexist
*btcoexist
)
540 struct btc_bt_link_info
*bt_link_info
= &btcoexist
->bt_link_info
;
541 bool bt_hson
= false;
543 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_HS_OPERATION
, &bt_hson
);
545 bt_link_info
->bt_link_exist
= coex_sta
->bt_link_exist
;
546 bt_link_info
->sco_exist
= coex_sta
->sco_exist
;
547 bt_link_info
->a2dp_exist
= coex_sta
->a2dp_exist
;
548 bt_link_info
->pan_exist
= coex_sta
->pan_exist
;
549 bt_link_info
->hid_exist
= coex_sta
->hid_exist
;
551 /* work around for HS mode. */
553 bt_link_info
->pan_exist
= true;
554 bt_link_info
->bt_link_exist
= true;
557 /* check if Sco only */
558 if (bt_link_info
->sco_exist
&&
559 !bt_link_info
->a2dp_exist
&&
560 !bt_link_info
->pan_exist
&&
561 !bt_link_info
->hid_exist
)
562 bt_link_info
->sco_only
= true;
564 bt_link_info
->sco_only
= false;
566 /* check if A2dp only */
567 if (!bt_link_info
->sco_exist
&&
568 bt_link_info
->a2dp_exist
&&
569 !bt_link_info
->pan_exist
&&
570 !bt_link_info
->hid_exist
)
571 bt_link_info
->a2dp_only
= true;
573 bt_link_info
->a2dp_only
= false;
575 /* check if Pan only */
576 if (!bt_link_info
->sco_exist
&&
577 !bt_link_info
->a2dp_exist
&&
578 bt_link_info
->pan_exist
&&
579 !bt_link_info
->hid_exist
)
580 bt_link_info
->pan_only
= true;
582 bt_link_info
->pan_only
= false;
584 /* check if Hid only */
585 if (!bt_link_info
->sco_exist
&&
586 !bt_link_info
->a2dp_exist
&&
587 !bt_link_info
->pan_exist
&&
588 bt_link_info
->hid_exist
)
589 bt_link_info
->hid_only
= true;
591 bt_link_info
->hid_only
= false;
594 static u8
halbtc8192e2ant_action_algorithm(struct btc_coexist
*btcoexist
)
596 struct btc_bt_link_info
*bt_link_info
= &btcoexist
->bt_link_info
;
597 struct btc_stack_info
*stack_info
= &btcoexist
->stack_info
;
598 bool bt_hson
= false;
599 u8 algorithm
= BT_8192E_2ANT_COEX_ALGO_UNDEFINED
;
600 u8 numOfDiffProfile
= 0;
602 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_HS_OPERATION
, &bt_hson
);
604 if (!bt_link_info
->bt_link_exist
) {
605 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
606 "No BT link exists!!!\n");
610 if (bt_link_info
->sco_exist
)
612 if (bt_link_info
->hid_exist
)
614 if (bt_link_info
->pan_exist
)
616 if (bt_link_info
->a2dp_exist
)
619 if (numOfDiffProfile
== 1) {
620 if (bt_link_info
->sco_exist
) {
621 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
623 algorithm
= BT_8192E_2ANT_COEX_ALGO_SCO
;
625 if (bt_link_info
->hid_exist
) {
626 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
628 algorithm
= BT_8192E_2ANT_COEX_ALGO_HID
;
629 } else if (bt_link_info
->a2dp_exist
) {
630 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
632 algorithm
= BT_8192E_2ANT_COEX_ALGO_A2DP
;
633 } else if (bt_link_info
->pan_exist
) {
635 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
638 BT_8192E_2ANT_COEX_ALGO_PANHS
;
640 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
643 BT_8192E_2ANT_COEX_ALGO_PANEDR
;
647 } else if (numOfDiffProfile
== 2) {
648 if (bt_link_info
->sco_exist
) {
649 if (bt_link_info
->hid_exist
) {
650 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
652 algorithm
= BT_8192E_2ANT_COEX_ALGO_SCO
;
653 } else if (bt_link_info
->a2dp_exist
) {
654 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
655 "SCO + A2DP ==> SCO\n");
656 algorithm
= BT_8192E_2ANT_COEX_ALGO_PANEDR_HID
;
657 } else if (bt_link_info
->pan_exist
) {
659 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
661 algorithm
= BT_8192E_2ANT_COEX_ALGO_SCO
;
663 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
666 BT_8192E_2ANT_COEX_ALGO_SCO_PAN
;
670 if (bt_link_info
->hid_exist
&&
671 bt_link_info
->a2dp_exist
) {
672 if (stack_info
->num_of_hid
>= 2) {
673 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
676 BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR
;
678 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
681 BT_8192E_2ANT_COEX_ALGO_HID_A2DP
;
683 } else if (bt_link_info
->hid_exist
&&
684 bt_link_info
->pan_exist
) {
686 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
688 algorithm
= BT_8192E_2ANT_COEX_ALGO_HID
;
690 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
693 BT_8192E_2ANT_COEX_ALGO_PANEDR_HID
;
695 } else if (bt_link_info
->pan_exist
&&
696 bt_link_info
->a2dp_exist
) {
698 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
701 BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS
;
703 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
704 "A2DP + PAN(EDR)\n");
706 BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP
;
710 } else if (numOfDiffProfile
== 3) {
711 if (bt_link_info
->sco_exist
) {
712 if (bt_link_info
->hid_exist
&&
713 bt_link_info
->a2dp_exist
) {
714 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
715 "SCO + HID + A2DP ==> HID\n");
716 algorithm
= BT_8192E_2ANT_COEX_ALGO_PANEDR_HID
;
717 } else if (bt_link_info
->hid_exist
&&
718 bt_link_info
->pan_exist
) {
720 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
721 "SCO + HID + PAN(HS)\n");
722 algorithm
= BT_8192E_2ANT_COEX_ALGO_SCO
;
724 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
725 "SCO + HID + PAN(EDR)\n");
727 BT_8192E_2ANT_COEX_ALGO_SCO_PAN
;
729 } else if (bt_link_info
->pan_exist
&&
730 bt_link_info
->a2dp_exist
) {
732 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
733 "SCO + A2DP + PAN(HS)\n");
734 algorithm
= BT_8192E_2ANT_COEX_ALGO_SCO
;
736 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
737 "SCO + A2DP + PAN(EDR)\n");
739 BT_8192E_2ANT_COEX_ALGO_PANEDR_HID
;
743 if (bt_link_info
->hid_exist
&&
744 bt_link_info
->pan_exist
&&
745 bt_link_info
->a2dp_exist
) {
747 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
748 "HID + A2DP + PAN(HS)\n");
750 BT_8192E_2ANT_COEX_ALGO_HID_A2DP
;
752 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
753 "HID + A2DP + PAN(EDR)\n");
755 BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR
;
759 } else if (numOfDiffProfile
>= 3) {
760 if (bt_link_info
->sco_exist
) {
761 if (bt_link_info
->hid_exist
&&
762 bt_link_info
->pan_exist
&&
763 bt_link_info
->a2dp_exist
) {
765 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
766 "ErrorSCO+HID+A2DP+PAN(HS)\n");
769 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
770 "SCO+HID+A2DP+PAN(EDR)\n");
772 BT_8192E_2ANT_COEX_ALGO_PANEDR_HID
;
781 static void halbtc8192e2ant_setfw_dac_swinglevel(struct btc_coexist
*btcoexist
,
784 u8 h2c_parameter
[1] = {0};
786 /* There are several type of dacswing
787 * 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 */
788 h2c_parameter
[0] = dac_swinglvl
;
790 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
791 "[BTCoex], Set Dac Swing Level=0x%x\n", dac_swinglvl
);
792 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
793 "[BTCoex], FW write 0x64=0x%x\n", h2c_parameter
[0]);
795 btcoexist
->btc_fill_h2c(btcoexist
, 0x64, 1, h2c_parameter
);
798 static void halbtc8192e2ant_set_fwdec_btpwr(struct btc_coexist
*btcoexist
,
801 u8 h2c_parameter
[1] = {0};
803 h2c_parameter
[0] = dec_btpwr_lvl
;
805 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
806 "[BTCoex] decrease Bt Power level = %d, FW write 0x62=0x%x\n",
807 dec_btpwr_lvl
, h2c_parameter
[0]);
809 btcoexist
->btc_fill_h2c(btcoexist
, 0x62, 1, h2c_parameter
);
812 static void halbtc8192e2ant_dec_btpwr(struct btc_coexist
*btcoexist
,
813 bool force_exec
, u8 dec_btpwr_lvl
)
815 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
816 "[BTCoex], %s Dec BT power level = %d\n",
817 (force_exec
? "force to":""), dec_btpwr_lvl
);
818 coex_dm
->cur_dec_bt_pwr
= dec_btpwr_lvl
;
821 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
822 "[BTCoex], preBtDecPwrLvl=%d, curBtDecPwrLvl=%d\n",
823 coex_dm
->pre_dec_bt_pwr
, coex_dm
->cur_dec_bt_pwr
);
825 halbtc8192e2ant_set_fwdec_btpwr(btcoexist
, coex_dm
->cur_dec_bt_pwr
);
827 coex_dm
->pre_dec_bt_pwr
= coex_dm
->cur_dec_bt_pwr
;
830 static void halbtc8192e2ant_set_bt_autoreport(struct btc_coexist
*btcoexist
,
831 bool enable_autoreport
)
833 u8 h2c_parameter
[1] = {0};
835 h2c_parameter
[0] = 0;
837 if (enable_autoreport
)
838 h2c_parameter
[0] |= BIT0
;
840 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
841 "[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n",
842 (enable_autoreport
? "Enabled!!":"Disabled!!"),
845 btcoexist
->btc_fill_h2c(btcoexist
, 0x68, 1, h2c_parameter
);
848 static void halbtc8192e2ant_bt_autoreport(struct btc_coexist
*btcoexist
,
850 bool enable_autoreport
)
852 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
853 "[BTCoex], %s BT Auto report = %s\n",
854 (force_exec
? "force to":""),
855 ((enable_autoreport
) ? "Enabled":"Disabled"));
856 coex_dm
->cur_bt_auto_report
= enable_autoreport
;
859 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
860 "[BTCoex] bPreBtAutoReport=%d, bCurBtAutoReport=%d\n",
861 coex_dm
->pre_bt_auto_report
,
862 coex_dm
->cur_bt_auto_report
);
864 if (coex_dm
->pre_bt_auto_report
== coex_dm
->cur_bt_auto_report
)
867 halbtc8192e2ant_set_bt_autoreport(btcoexist
,
868 coex_dm
->cur_bt_auto_report
);
870 coex_dm
->pre_bt_auto_report
= coex_dm
->cur_bt_auto_report
;
873 static void halbtc8192e2ant_fw_dac_swinglvl(struct btc_coexist
*btcoexist
,
874 bool force_exec
, u8 fw_dac_swinglvl
)
876 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
877 "[BTCoex], %s set FW Dac Swing level = %d\n",
878 (force_exec
? "force to":""), fw_dac_swinglvl
);
879 coex_dm
->cur_fw_dac_swing_lvl
= fw_dac_swinglvl
;
882 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
883 "[BTCoex] preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n",
884 coex_dm
->pre_fw_dac_swing_lvl
,
885 coex_dm
->cur_fw_dac_swing_lvl
);
887 if (coex_dm
->pre_fw_dac_swing_lvl
==
888 coex_dm
->cur_fw_dac_swing_lvl
)
892 halbtc8192e2ant_setfw_dac_swinglevel(btcoexist
,
893 coex_dm
->cur_fw_dac_swing_lvl
);
895 coex_dm
->pre_fw_dac_swing_lvl
= coex_dm
->cur_fw_dac_swing_lvl
;
898 static void halbtc8192e2ant_set_sw_rf_rx_lpf_corner(struct btc_coexist
*btcoexist
,
899 bool rx_rf_shrink_on
)
901 if (rx_rf_shrink_on
) {
902 /* Shrink RF Rx LPF corner */
903 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
904 "[BTCoex], Shrink RF Rx LPF corner!!\n");
905 btcoexist
->btc_set_rf_reg(btcoexist
, BTC_RF_A
, 0x1e,
908 /* Resume RF Rx LPF corner
909 * After initialized, we can use coex_dm->btRf0x1eBackup */
910 if (btcoexist
->initilized
) {
911 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
912 "[BTCoex], Resume RF Rx LPF corner!!\n");
913 btcoexist
->btc_set_rf_reg(btcoexist
, BTC_RF_A
, 0x1e,
915 coex_dm
->bt_rf0x1e_backup
);
920 static void halbtc8192e2ant_rf_shrink(struct btc_coexist
*btcoexist
,
921 bool force_exec
, bool rx_rf_shrink_on
)
923 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW
,
924 "[BTCoex], %s turn Rx RF Shrink = %s\n",
925 (force_exec
? "force to":""), ((rx_rf_shrink_on
) ? "ON":"OFF"));
926 coex_dm
->cur_rf_rx_lpf_shrink
= rx_rf_shrink_on
;
929 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_DETAIL
,
930 "[BTCoex]bPreRfRxLpfShrink=%d,bCurRfRxLpfShrink=%d\n",
931 coex_dm
->pre_rf_rx_lpf_shrink
,
932 coex_dm
->cur_rf_rx_lpf_shrink
);
934 if (coex_dm
->pre_rf_rx_lpf_shrink
==
935 coex_dm
->cur_rf_rx_lpf_shrink
)
938 halbtc8192e2ant_set_sw_rf_rx_lpf_corner(btcoexist
,
939 coex_dm
->cur_rf_rx_lpf_shrink
);
941 coex_dm
->pre_rf_rx_lpf_shrink
= coex_dm
->cur_rf_rx_lpf_shrink
;
944 static void halbtc8192e2ant_set_dac_swingreg(struct btc_coexist
*btcoexist
,
949 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
950 "[BTCoex], Write SwDacSwing = 0x%x\n", level
);
951 btcoexist
->btc_write_1byte_bitmask(btcoexist
, 0x883, 0x3e, val
);
954 static void halbtc8192e2ant_setsw_fulltime_dacswing(struct btc_coexist
*btcoexist
,
959 halbtc8192e2ant_set_dac_swingreg(btcoexist
, sw_dac_swinglvl
);
961 halbtc8192e2ant_set_dac_swingreg(btcoexist
, 0x18);
964 static void halbtc8192e2ant_DacSwing(struct btc_coexist
*btcoexist
,
965 bool force_exec
, bool dac_swingon
,
968 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW
,
969 "[BTCoex], %s turn DacSwing=%s, dac_swinglvl=0x%x\n",
970 (force_exec
? "force to":""),
971 ((dac_swingon
) ? "ON":"OFF"), dac_swinglvl
);
972 coex_dm
->cur_dac_swing_on
= dac_swingon
;
973 coex_dm
->cur_dac_swing_lvl
= dac_swinglvl
;
976 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_DETAIL
,
977 "[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, ",
978 coex_dm
->pre_dac_swing_on
,
979 coex_dm
->pre_dac_swing_lvl
);
980 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_DETAIL
,
981 "bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n",
982 coex_dm
->cur_dac_swing_on
,
983 coex_dm
->cur_dac_swing_lvl
);
985 if ((coex_dm
->pre_dac_swing_on
== coex_dm
->cur_dac_swing_on
) &&
986 (coex_dm
->pre_dac_swing_lvl
== coex_dm
->cur_dac_swing_lvl
))
990 halbtc8192e2ant_setsw_fulltime_dacswing(btcoexist
, dac_swingon
,
993 coex_dm
->pre_dac_swing_on
= coex_dm
->cur_dac_swing_on
;
994 coex_dm
->pre_dac_swing_lvl
= coex_dm
->cur_dac_swing_lvl
;
997 static void halbtc8192e2ant_set_agc_table(struct btc_coexist
*btcoexist
,
1001 /* BB AGC Gain Table */
1003 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
1004 "[BTCoex], BB Agc Table On!\n");
1005 btcoexist
->btc_write_4byte(btcoexist
, 0xc78, 0x0a1A0001);
1006 btcoexist
->btc_write_4byte(btcoexist
, 0xc78, 0x091B0001);
1007 btcoexist
->btc_write_4byte(btcoexist
, 0xc78, 0x081C0001);
1008 btcoexist
->btc_write_4byte(btcoexist
, 0xc78, 0x071D0001);
1009 btcoexist
->btc_write_4byte(btcoexist
, 0xc78, 0x061E0001);
1010 btcoexist
->btc_write_4byte(btcoexist
, 0xc78, 0x051F0001);
1012 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
1013 "[BTCoex], BB Agc Table Off!\n");
1014 btcoexist
->btc_write_4byte(btcoexist
, 0xc78, 0xaa1A0001);
1015 btcoexist
->btc_write_4byte(btcoexist
, 0xc78, 0xa91B0001);
1016 btcoexist
->btc_write_4byte(btcoexist
, 0xc78, 0xa81C0001);
1017 btcoexist
->btc_write_4byte(btcoexist
, 0xc78, 0xa71D0001);
1018 btcoexist
->btc_write_4byte(btcoexist
, 0xc78, 0xa61E0001);
1019 btcoexist
->btc_write_4byte(btcoexist
, 0xc78, 0xa51F0001);
1023 static void halbtc8192e2ant_AgcTable(struct btc_coexist
*btcoexist
,
1024 bool force_exec
, bool agc_table_en
)
1026 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW
,
1027 "[BTCoex], %s %s Agc Table\n",
1028 (force_exec
? "force to":""),
1029 ((agc_table_en
) ? "Enable":"Disable"));
1030 coex_dm
->cur_agc_table_en
= agc_table_en
;
1033 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_DETAIL
,
1034 "[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n",
1035 coex_dm
->pre_agc_table_en
, coex_dm
->cur_agc_table_en
);
1037 if (coex_dm
->pre_agc_table_en
== coex_dm
->cur_agc_table_en
)
1040 halbtc8192e2ant_set_agc_table(btcoexist
, agc_table_en
);
1042 coex_dm
->pre_agc_table_en
= coex_dm
->cur_agc_table_en
;
1045 static void halbtc8192e2ant_set_coex_table(struct btc_coexist
*btcoexist
,
1046 u32 val0x6c0
, u32 val0x6c4
,
1047 u32 val0x6c8
, u8 val0x6cc
)
1049 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
1050 "[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0
);
1051 btcoexist
->btc_write_4byte(btcoexist
, 0x6c0, val0x6c0
);
1053 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
1054 "[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4
);
1055 btcoexist
->btc_write_4byte(btcoexist
, 0x6c4, val0x6c4
);
1057 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
1058 "[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8
);
1059 btcoexist
->btc_write_4byte(btcoexist
, 0x6c8, val0x6c8
);
1061 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_EXEC
,
1062 "[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc
);
1063 btcoexist
->btc_write_1byte(btcoexist
, 0x6cc, val0x6cc
);
1066 static void halbtc8192e2ant_coex_table(struct btc_coexist
*btcoexist
,
1068 u32 val0x6c0
, u32 val0x6c4
,
1069 u32 val0x6c8
, u8 val0x6cc
)
1071 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW
,
1072 "[BTCoex], %s write Coex Table 0x6c0=0x%x, ",
1073 (force_exec
? "force to":""), val0x6c0
);
1074 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW
,
1075 "0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n",
1076 val0x6c4
, val0x6c8
, val0x6cc
);
1077 coex_dm
->cur_val0x6c0
= val0x6c0
;
1078 coex_dm
->cur_val0x6c4
= val0x6c4
;
1079 coex_dm
->cur_val0x6c8
= val0x6c8
;
1080 coex_dm
->cur_val0x6cc
= val0x6cc
;
1083 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_DETAIL
,
1084 "[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, ",
1085 coex_dm
->pre_val0x6c0
, coex_dm
->pre_val0x6c4
);
1086 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_DETAIL
,
1087 "preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n",
1088 coex_dm
->pre_val0x6c8
, coex_dm
->pre_val0x6cc
);
1089 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_DETAIL
,
1090 "[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x,\n",
1091 coex_dm
->cur_val0x6c0
, coex_dm
->cur_val0x6c4
);
1092 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_SW_DETAIL
,
1093 "curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n",
1094 coex_dm
->cur_val0x6c8
, coex_dm
->cur_val0x6cc
);
1096 if ((coex_dm
->pre_val0x6c0
== coex_dm
->cur_val0x6c0
) &&
1097 (coex_dm
->pre_val0x6c4
== coex_dm
->cur_val0x6c4
) &&
1098 (coex_dm
->pre_val0x6c8
== coex_dm
->cur_val0x6c8
) &&
1099 (coex_dm
->pre_val0x6cc
== coex_dm
->cur_val0x6cc
))
1102 halbtc8192e2ant_set_coex_table(btcoexist
, val0x6c0
, val0x6c4
,
1103 val0x6c8
, val0x6cc
);
1105 coex_dm
->pre_val0x6c0
= coex_dm
->cur_val0x6c0
;
1106 coex_dm
->pre_val0x6c4
= coex_dm
->cur_val0x6c4
;
1107 coex_dm
->pre_val0x6c8
= coex_dm
->cur_val0x6c8
;
1108 coex_dm
->pre_val0x6cc
= coex_dm
->cur_val0x6cc
;
1111 static void halbtc8192e2ant_coex_table_with_type(struct btc_coexist
*btcoexist
,
1112 bool force_exec
, u8 type
)
1116 halbtc8192e2ant_coex_table(btcoexist
, force_exec
, 0x55555555,
1117 0x5a5a5a5a, 0xffffff, 0x3);
1120 halbtc8192e2ant_coex_table(btcoexist
, force_exec
, 0x5a5a5a5a,
1121 0x5a5a5a5a, 0xffffff, 0x3);
1124 halbtc8192e2ant_coex_table(btcoexist
, force_exec
, 0x55555555,
1125 0x5ffb5ffb, 0xffffff, 0x3);
1128 halbtc8192e2ant_coex_table(btcoexist
, force_exec
, 0xdfffdfff,
1129 0x5fdb5fdb, 0xffffff, 0x3);
1132 halbtc8192e2ant_coex_table(btcoexist
, force_exec
, 0xdfffdfff,
1133 0x5ffb5ffb, 0xffffff, 0x3);
1140 static void halbtc8192e2ant_set_fw_ignore_wlanact(struct btc_coexist
*btcoexist
,
1143 u8 h2c_parameter
[1] = {0};
1146 h2c_parameter
[0] |= BIT0
; /* function enable */
1148 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
1149 "[BTCoex]set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n",
1152 btcoexist
->btc_fill_h2c(btcoexist
, 0x63, 1, h2c_parameter
);
1155 static void halbtc8192e2ant_IgnoreWlanAct(struct btc_coexist
*btcoexist
,
1156 bool force_exec
, bool enable
)
1158 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
1159 "[BTCoex], %s turn Ignore WlanAct %s\n",
1160 (force_exec
? "force to":""), (enable
? "ON":"OFF"));
1161 coex_dm
->cur_ignore_wlan_act
= enable
;
1164 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1165 "[BTCoex], bPreIgnoreWlanAct = %d ",
1166 coex_dm
->pre_ignore_wlan_act
);
1167 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1168 "bCurIgnoreWlanAct = %d!!\n",
1169 coex_dm
->cur_ignore_wlan_act
);
1171 if (coex_dm
->pre_ignore_wlan_act
==
1172 coex_dm
->cur_ignore_wlan_act
)
1175 halbtc8192e2ant_set_fw_ignore_wlanact(btcoexist
, enable
);
1177 coex_dm
->pre_ignore_wlan_act
= coex_dm
->cur_ignore_wlan_act
;
1180 static void halbtc8192e2ant_SetFwPstdma(struct btc_coexist
*btcoexist
, u8 byte1
,
1181 u8 byte2
, u8 byte3
, u8 byte4
, u8 byte5
)
1183 u8 h2c_parameter
[5] = {0};
1185 h2c_parameter
[0] = byte1
;
1186 h2c_parameter
[1] = byte2
;
1187 h2c_parameter
[2] = byte3
;
1188 h2c_parameter
[3] = byte4
;
1189 h2c_parameter
[4] = byte5
;
1191 coex_dm
->ps_tdma_para
[0] = byte1
;
1192 coex_dm
->ps_tdma_para
[1] = byte2
;
1193 coex_dm
->ps_tdma_para
[2] = byte3
;
1194 coex_dm
->ps_tdma_para
[3] = byte4
;
1195 coex_dm
->ps_tdma_para
[4] = byte5
;
1197 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
1198 "[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n",
1200 h2c_parameter
[1] << 24 | h2c_parameter
[2] << 16 |
1201 h2c_parameter
[3] << 8 | h2c_parameter
[4]);
1203 btcoexist
->btc_fill_h2c(btcoexist
, 0x60, 5, h2c_parameter
);
1206 static void halbtc8192e2ant_sw_mechanism1(struct btc_coexist
*btcoexist
,
1208 bool low_penalty_ra
,
1210 bool btlan_constrain
)
1212 halbtc8192e2ant_rf_shrink(btcoexist
, NORMAL_EXEC
, shrink_rx_lpf
);
1215 static void halbtc8192e2ant_sw_mechanism2(struct btc_coexist
*btcoexist
,
1216 bool agc_table_shift
,
1221 halbtc8192e2ant_AgcTable(btcoexist
, NORMAL_EXEC
, agc_table_shift
);
1222 halbtc8192e2ant_DacSwing(btcoexist
, NORMAL_EXEC
, sw_dac_swing
,
1226 static void halbtc8192e2ant_ps_tdma(struct btc_coexist
*btcoexist
,
1227 bool force_exec
, bool turn_on
, u8 type
)
1230 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
1231 "[BTCoex], %s turn %s PS TDMA, type=%d\n",
1232 (force_exec
? "force to":""), (turn_on
? "ON":"OFF"), type
);
1233 coex_dm
->cur_ps_tdma_on
= turn_on
;
1234 coex_dm
->cur_ps_tdma
= type
;
1237 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1238 "[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n",
1239 coex_dm
->pre_ps_tdma_on
, coex_dm
->cur_ps_tdma_on
);
1240 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1241 "[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n",
1242 coex_dm
->pre_ps_tdma
, coex_dm
->cur_ps_tdma
);
1244 if ((coex_dm
->pre_ps_tdma_on
== coex_dm
->cur_ps_tdma_on
) &&
1245 (coex_dm
->pre_ps_tdma
== coex_dm
->cur_ps_tdma
))
1252 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x1a,
1256 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x12,
1260 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x1c,
1264 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x10,
1268 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x1a,
1272 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x12,
1276 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x1c,
1280 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xa3, 0x10,
1284 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x1a,
1288 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x12,
1292 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x1c,
1296 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x10,
1300 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x1a,
1304 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x12,
1308 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x1c,
1312 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x12,
1316 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0x61, 0x20,
1320 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x5,
1324 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x25,
1328 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x25,
1332 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x15,
1336 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0xe3, 0x1a,
1341 /* disable PS tdma */
1345 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0x8, 0x0, 0x0,
1347 btcoexist
->btc_write_1byte(btcoexist
, 0x92c, 0x4);
1350 halbtc8192e2ant_SetFwPstdma(btcoexist
, 0x0, 0x0, 0x0,
1353 btcoexist
->btc_write_1byte(btcoexist
, 0x92c, 0x20);
1358 /* update pre state */
1359 coex_dm
->pre_ps_tdma_on
= coex_dm
->cur_ps_tdma_on
;
1360 coex_dm
->pre_ps_tdma
= coex_dm
->cur_ps_tdma
;
1363 static void halbtc8192e2ant_set_switch_sstype(struct btc_coexist
*btcoexist
,
1366 u8 mimops
= BTC_MIMO_PS_DYNAMIC
;
1367 u32 disra_mask
= 0x0;
1369 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1370 "[BTCoex], REAL set SS Type = %d\n", sstype
);
1372 disra_mask
= halbtc8192e2ant_decidera_mask(btcoexist
, sstype
,
1373 coex_dm
->curra_masktype
);
1374 halbtc8192e2ant_Updatera_mask(btcoexist
, FORCE_EXEC
, disra_mask
);
1377 halbtc8192e2ant_ps_tdma(btcoexist
, FORCE_EXEC
, false, 1);
1378 /* switch ofdm path */
1379 btcoexist
->btc_write_1byte(btcoexist
, 0xc04, 0x11);
1380 btcoexist
->btc_write_1byte(btcoexist
, 0xd04, 0x1);
1381 btcoexist
->btc_write_4byte(btcoexist
, 0x90c, 0x81111111);
1382 /* switch cck patch */
1383 btcoexist
->btc_write_1byte_bitmask(btcoexist
, 0xe77, 0x4, 0x1);
1384 btcoexist
->btc_write_1byte(btcoexist
, 0xa07, 0x81);
1385 mimops
= BTC_MIMO_PS_STATIC
;
1386 } else if (sstype
== 2) {
1387 halbtc8192e2ant_ps_tdma(btcoexist
, FORCE_EXEC
, false, 0);
1388 btcoexist
->btc_write_1byte(btcoexist
, 0xc04, 0x33);
1389 btcoexist
->btc_write_1byte(btcoexist
, 0xd04, 0x3);
1390 btcoexist
->btc_write_4byte(btcoexist
, 0x90c, 0x81121313);
1391 btcoexist
->btc_write_1byte_bitmask(btcoexist
, 0xe77, 0x4, 0x0);
1392 btcoexist
->btc_write_1byte(btcoexist
, 0xa07, 0x41);
1393 mimops
= BTC_MIMO_PS_DYNAMIC
;
1395 /* set rx 1ss or 2ss */
1396 btcoexist
->btc_set(btcoexist
, BTC_SET_ACT_SEND_MIMO_PS
, &mimops
);
1399 static void halbtc8192e2ant_switch_sstype(struct btc_coexist
*btcoexist
,
1400 bool force_exec
, u8 new_sstype
)
1402 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1403 "[BTCoex], %s Switch SS Type = %d\n",
1404 (force_exec
? "force to":""), new_sstype
);
1405 coex_dm
->cur_sstype
= new_sstype
;
1408 if (coex_dm
->pre_sstype
== coex_dm
->cur_sstype
)
1411 halbtc8192e2ant_set_switch_sstype(btcoexist
, coex_dm
->cur_sstype
);
1413 coex_dm
->pre_sstype
= coex_dm
->cur_sstype
;
1416 static void halbtc8192e2ant_coex_alloff(struct btc_coexist
*btcoexist
)
1419 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, false, 1);
1420 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
, 6);
1421 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
1424 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false, false, false);
1425 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false, false, 0x18);
1428 halbtc8192e2ant_coex_table_with_type(btcoexist
, NORMAL_EXEC
, 0);
1431 static void halbtc8192e2ant_init_coex_dm(struct btc_coexist
*btcoexist
)
1433 /* force to reset coex mechanism */
1435 halbtc8192e2ant_ps_tdma(btcoexist
, FORCE_EXEC
, false, 1);
1436 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, FORCE_EXEC
, 6);
1437 halbtc8192e2ant_dec_btpwr(btcoexist
, FORCE_EXEC
, 0);
1439 halbtc8192e2ant_coex_table_with_type(btcoexist
, FORCE_EXEC
, 0);
1440 halbtc8192e2ant_switch_sstype(btcoexist
, FORCE_EXEC
, 2);
1442 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false, false, false);
1443 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false, false, 0x18);
1446 static void halbtc8192e2ant_action_bt_inquiry(struct btc_coexist
*btcoexist
)
1448 bool low_pwr_disable
= true;
1450 btcoexist
->btc_set(btcoexist
, BTC_SET_ACT_DISABLE_LOW_POWER
,
1453 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
, 1);
1455 halbtc8192e2ant_coex_table_with_type(btcoexist
, NORMAL_EXEC
, 2);
1456 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 3);
1457 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
, 6);
1458 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
1460 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false, false, false);
1461 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false, false, 0x18);
1464 static bool halbtc8192e2ant_is_common_action(struct btc_coexist
*btcoexist
)
1466 struct btc_bt_link_info
*bt_link_info
= &btcoexist
->bt_link_info
;
1467 bool common
= false, wifi_connected
= false, wifi_busy
= false;
1468 bool bt_hson
= false, low_pwr_disable
= false;
1470 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_HS_OPERATION
, &bt_hson
);
1471 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_CONNECTED
,
1473 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_BUSY
, &wifi_busy
);
1475 if (bt_link_info
->sco_exist
|| bt_link_info
->hid_exist
)
1476 halbtc8192e2ant_limited_tx(btcoexist
, NORMAL_EXEC
, 1, 0, 0, 0);
1478 halbtc8192e2ant_limited_tx(btcoexist
, NORMAL_EXEC
, 0, 0, 0, 0);
1480 if (!wifi_connected
) {
1481 low_pwr_disable
= false;
1482 btcoexist
->btc_set(btcoexist
, BTC_SET_ACT_DISABLE_LOW_POWER
,
1485 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1486 "[BTCoex], Wifi non-connected idle!!\n");
1488 if ((BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE
==
1489 coex_dm
->bt_status
) ||
1490 (BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE
==
1491 coex_dm
->bt_status
)) {
1492 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
,
1494 halbtc8192e2ant_coex_table_with_type(btcoexist
,
1496 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, false,
1499 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
,
1501 halbtc8192e2ant_coex_table_with_type(btcoexist
,
1503 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, false,
1507 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
, 6);
1508 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
1510 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false, false,
1512 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false, false,
1517 if (BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE
==
1518 coex_dm
->bt_status
) {
1519 low_pwr_disable
= false;
1520 btcoexist
->btc_set(btcoexist
,
1521 BTC_SET_ACT_DISABLE_LOW_POWER
,
1524 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1525 "Wifi connected + BT non connected-idle!!\n");
1527 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
,
1529 halbtc8192e2ant_coex_table_with_type(btcoexist
,
1531 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, false,
1533 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
,
1535 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
1537 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false,
1539 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
1543 } else if (BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE
==
1544 coex_dm
->bt_status
) {
1545 low_pwr_disable
= true;
1546 btcoexist
->btc_set(btcoexist
,
1547 BTC_SET_ACT_DISABLE_LOW_POWER
,
1552 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1553 "Wifi connected + BT connected-idle!!\n");
1555 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
,
1557 halbtc8192e2ant_coex_table_with_type(btcoexist
,
1559 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, false,
1561 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
,
1563 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
1565 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, false,
1567 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
1572 low_pwr_disable
= true;
1573 btcoexist
->btc_set(btcoexist
,
1574 BTC_SET_ACT_DISABLE_LOW_POWER
,
1578 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1579 "Wifi Connected-Busy + BT Busy!!\n");
1582 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
1583 "Wifi Connected-Idle + BT Busy!!\n");
1585 halbtc8192e2ant_switch_sstype(btcoexist
,
1587 halbtc8192e2ant_coex_table_with_type(btcoexist
,
1590 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
,
1592 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
,
1594 halbtc8192e2ant_dec_btpwr(btcoexist
,
1596 halbtc8192e2ant_sw_mechanism1(btcoexist
, false,
1599 halbtc8192e2ant_sw_mechanism2(btcoexist
, false,
1609 static void halbtc8192e2ant_tdma_duration_adjust(struct btc_coexist
*btcoexist
,
1610 bool sco_hid
, bool tx_pause
,
1613 static int up
, dn
, m
, n
, wait_cnt
;
1614 /* 0: no change, +1: increase WiFi duration,
1615 * -1: decrease WiFi duration */
1619 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW
,
1620 "[BTCoex], TdmaDurationAdjust()\n");
1622 if (!coex_dm
->auto_tdma_adjust
) {
1623 coex_dm
->auto_tdma_adjust
= true;
1624 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1625 "[BTCoex], first run TdmaDurationAdjust()!!\n");
1628 if (max_interval
== 1) {
1629 halbtc8192e2ant_ps_tdma(btcoexist
,
1632 coex_dm
->ps_tdma_du_adj_type
= 13;
1633 } else if (max_interval
== 2) {
1634 halbtc8192e2ant_ps_tdma(btcoexist
,
1637 coex_dm
->ps_tdma_du_adj_type
= 14;
1638 } else if (max_interval
== 3) {
1639 halbtc8192e2ant_ps_tdma(btcoexist
,
1642 coex_dm
->ps_tdma_du_adj_type
= 15;
1644 halbtc8192e2ant_ps_tdma(btcoexist
,
1647 coex_dm
->ps_tdma_du_adj_type
= 15;
1650 if (max_interval
== 1) {
1651 halbtc8192e2ant_ps_tdma(btcoexist
,
1654 coex_dm
->ps_tdma_du_adj_type
= 9;
1655 } else if (max_interval
== 2) {
1656 halbtc8192e2ant_ps_tdma(btcoexist
,
1659 coex_dm
->ps_tdma_du_adj_type
= 10;
1660 } else if (max_interval
== 3) {
1661 halbtc8192e2ant_ps_tdma(btcoexist
,
1664 coex_dm
->ps_tdma_du_adj_type
= 11;
1666 halbtc8192e2ant_ps_tdma(btcoexist
,
1669 coex_dm
->ps_tdma_du_adj_type
= 11;
1674 if (max_interval
== 1) {
1675 halbtc8192e2ant_ps_tdma(btcoexist
,
1678 coex_dm
->ps_tdma_du_adj_type
= 5;
1679 } else if (max_interval
== 2) {
1680 halbtc8192e2ant_ps_tdma(btcoexist
,
1683 coex_dm
->ps_tdma_du_adj_type
= 6;
1684 } else if (max_interval
== 3) {
1685 halbtc8192e2ant_ps_tdma(btcoexist
,
1688 coex_dm
->ps_tdma_du_adj_type
= 7;
1690 halbtc8192e2ant_ps_tdma(btcoexist
,
1693 coex_dm
->ps_tdma_du_adj_type
= 7;
1696 if (max_interval
== 1) {
1697 halbtc8192e2ant_ps_tdma(btcoexist
,
1700 coex_dm
->ps_tdma_du_adj_type
= 1;
1701 } else if (max_interval
== 2) {
1702 halbtc8192e2ant_ps_tdma(btcoexist
,
1705 coex_dm
->ps_tdma_du_adj_type
= 2;
1706 } else if (max_interval
== 3) {
1707 halbtc8192e2ant_ps_tdma(btcoexist
,
1710 coex_dm
->ps_tdma_du_adj_type
= 3;
1712 halbtc8192e2ant_ps_tdma(btcoexist
,
1715 coex_dm
->ps_tdma_du_adj_type
= 3;
1727 /* acquire the BT TRx retry count from BT_Info byte2 */
1728 retry_cnt
= coex_sta
->bt_retry_cnt
;
1729 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1730 "[BTCoex], retry_cnt = %d\n", retry_cnt
);
1731 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1732 "[BTCoex], up=%d, dn=%d, m=%d, n=%d, wait_cnt=%d\n",
1733 up
, dn
, m
, n
, wait_cnt
);
1736 /* no retry in the last 2-second duration */
1737 if (retry_cnt
== 0) {
1750 BTC_PRINT(BTC_MSG_ALGORITHM
,
1751 ALGO_TRACE_FW_DETAIL
,
1752 "[BTCoex]Increase wifi duration!!\n");
1754 } else if (retry_cnt
<= 3) {
1775 BTC_PRINT(BTC_MSG_ALGORITHM
,
1776 ALGO_TRACE_FW_DETAIL
,
1777 "Reduce wifi duration for retry<3\n");
1793 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1794 "Decrease wifi duration for retryCounter>3!!\n");
1797 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1798 "[BTCoex], max Interval = %d\n", max_interval
);
1799 if (max_interval
== 1) {
1801 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
1802 "[BTCoex], TxPause = 1\n");
1804 if (coex_dm
->cur_ps_tdma
== 71) {
1805 halbtc8192e2ant_ps_tdma(btcoexist
,
1808 coex_dm
->ps_tdma_du_adj_type
= 5;
1809 } else if (coex_dm
->cur_ps_tdma
== 1) {
1810 halbtc8192e2ant_ps_tdma(btcoexist
,
1813 coex_dm
->ps_tdma_du_adj_type
= 5;
1814 } else if (coex_dm
->cur_ps_tdma
== 2) {
1815 halbtc8192e2ant_ps_tdma(btcoexist
,
1818 coex_dm
->ps_tdma_du_adj_type
= 6;
1819 } else if (coex_dm
->cur_ps_tdma
== 3) {
1820 halbtc8192e2ant_ps_tdma(btcoexist
,
1823 coex_dm
->ps_tdma_du_adj_type
= 7;
1824 } else if (coex_dm
->cur_ps_tdma
== 4) {
1825 halbtc8192e2ant_ps_tdma(btcoexist
,
1828 coex_dm
->ps_tdma_du_adj_type
= 8;
1830 if (coex_dm
->cur_ps_tdma
== 9) {
1831 halbtc8192e2ant_ps_tdma(btcoexist
,
1834 coex_dm
->ps_tdma_du_adj_type
= 13;
1835 } else if (coex_dm
->cur_ps_tdma
== 10) {
1836 halbtc8192e2ant_ps_tdma(btcoexist
,
1839 coex_dm
->ps_tdma_du_adj_type
= 14;
1840 } else if (coex_dm
->cur_ps_tdma
== 11) {
1841 halbtc8192e2ant_ps_tdma(btcoexist
,
1844 coex_dm
->ps_tdma_du_adj_type
= 15;
1845 } else if (coex_dm
->cur_ps_tdma
== 12) {
1846 halbtc8192e2ant_ps_tdma(btcoexist
,
1849 coex_dm
->ps_tdma_du_adj_type
= 16;
1853 if (coex_dm
->cur_ps_tdma
== 5) {
1854 halbtc8192e2ant_ps_tdma(
1858 coex_dm
->ps_tdma_du_adj_type
=
1860 } else if (coex_dm
->cur_ps_tdma
== 6) {
1861 halbtc8192e2ant_ps_tdma(
1865 coex_dm
->ps_tdma_du_adj_type
=
1867 } else if (coex_dm
->cur_ps_tdma
== 7) {
1868 halbtc8192e2ant_ps_tdma(
1872 coex_dm
->ps_tdma_du_adj_type
=
1874 } else if (coex_dm
->cur_ps_tdma
== 13) {
1875 halbtc8192e2ant_ps_tdma(
1879 coex_dm
->ps_tdma_du_adj_type
=
1881 } else if (coex_dm
->cur_ps_tdma
== 14) {
1882 halbtc8192e2ant_ps_tdma(
1886 coex_dm
->ps_tdma_du_adj_type
=
1888 } else if (coex_dm
->cur_ps_tdma
== 15) {
1889 halbtc8192e2ant_ps_tdma(
1893 coex_dm
->ps_tdma_du_adj_type
=
1896 } else if (result
== 1) {
1897 if (coex_dm
->cur_ps_tdma
== 8) {
1898 halbtc8192e2ant_ps_tdma(
1902 coex_dm
->ps_tdma_du_adj_type
=
1904 } else if (coex_dm
->cur_ps_tdma
== 7) {
1905 halbtc8192e2ant_ps_tdma(
1909 coex_dm
->ps_tdma_du_adj_type
=
1911 } else if (coex_dm
->cur_ps_tdma
== 6) {
1912 halbtc8192e2ant_ps_tdma(
1916 coex_dm
->ps_tdma_du_adj_type
=
1918 } else if (coex_dm
->cur_ps_tdma
== 16) {
1919 halbtc8192e2ant_ps_tdma(
1923 coex_dm
->ps_tdma_du_adj_type
=
1925 } else if (coex_dm
->cur_ps_tdma
== 15) {
1926 halbtc8192e2ant_ps_tdma(
1930 coex_dm
->ps_tdma_du_adj_type
=
1932 } else if (coex_dm
->cur_ps_tdma
== 14) {
1933 halbtc8192e2ant_ps_tdma(
1937 coex_dm
->ps_tdma_du_adj_type
=
1942 BTC_PRINT(BTC_MSG_ALGORITHM
,
1943 ALGO_TRACE_FW_DETAIL
,
1944 "[BTCoex], TxPause = 0\n");
1945 if (coex_dm
->cur_ps_tdma
== 5) {
1946 halbtc8192e2ant_ps_tdma(btcoexist
,
1949 coex_dm
->ps_tdma_du_adj_type
= 71;
1950 } else if (coex_dm
->cur_ps_tdma
== 6) {
1951 halbtc8192e2ant_ps_tdma(btcoexist
,
1954 coex_dm
->ps_tdma_du_adj_type
= 2;
1955 } else if (coex_dm
->cur_ps_tdma
== 7) {
1956 halbtc8192e2ant_ps_tdma(btcoexist
,
1959 coex_dm
->ps_tdma_du_adj_type
= 3;
1960 } else if (coex_dm
->cur_ps_tdma
== 8) {
1961 halbtc8192e2ant_ps_tdma(btcoexist
,
1964 coex_dm
->ps_tdma_du_adj_type
= 4;
1966 if (coex_dm
->cur_ps_tdma
== 13) {
1967 halbtc8192e2ant_ps_tdma(btcoexist
,
1970 coex_dm
->ps_tdma_du_adj_type
= 9;
1971 } else if (coex_dm
->cur_ps_tdma
== 14) {
1972 halbtc8192e2ant_ps_tdma(btcoexist
,
1975 coex_dm
->ps_tdma_du_adj_type
= 10;
1976 } else if (coex_dm
->cur_ps_tdma
== 15) {
1977 halbtc8192e2ant_ps_tdma(btcoexist
,
1980 coex_dm
->ps_tdma_du_adj_type
= 11;
1981 } else if (coex_dm
->cur_ps_tdma
== 16) {
1982 halbtc8192e2ant_ps_tdma(btcoexist
,
1985 coex_dm
->ps_tdma_du_adj_type
= 12;
1989 if (coex_dm
->cur_ps_tdma
== 71) {
1990 halbtc8192e2ant_ps_tdma(
1994 coex_dm
->ps_tdma_du_adj_type
=
1996 } else if (coex_dm
->cur_ps_tdma
== 1) {
1997 halbtc8192e2ant_ps_tdma(
2001 coex_dm
->ps_tdma_du_adj_type
=
2003 } else if (coex_dm
->cur_ps_tdma
== 2) {
2004 halbtc8192e2ant_ps_tdma(
2008 coex_dm
->ps_tdma_du_adj_type
=
2010 } else if (coex_dm
->cur_ps_tdma
== 3) {
2011 halbtc8192e2ant_ps_tdma(
2015 coex_dm
->ps_tdma_du_adj_type
=
2017 } else if (coex_dm
->cur_ps_tdma
== 9) {
2018 halbtc8192e2ant_ps_tdma(
2022 coex_dm
->ps_tdma_du_adj_type
=
2024 } else if (coex_dm
->cur_ps_tdma
== 10) {
2025 halbtc8192e2ant_ps_tdma(
2029 coex_dm
->ps_tdma_du_adj_type
=
2031 } else if (coex_dm
->cur_ps_tdma
== 11) {
2032 halbtc8192e2ant_ps_tdma(
2036 coex_dm
->ps_tdma_du_adj_type
=
2039 } else if (result
== 1) {
2040 if (coex_dm
->cur_ps_tdma
== 4) {
2041 halbtc8192e2ant_ps_tdma(
2045 coex_dm
->ps_tdma_du_adj_type
=
2047 } else if (coex_dm
->cur_ps_tdma
== 3) {
2048 halbtc8192e2ant_ps_tdma(
2052 coex_dm
->ps_tdma_du_adj_type
=
2054 } else if (coex_dm
->cur_ps_tdma
== 2) {
2055 halbtc8192e2ant_ps_tdma(
2059 coex_dm
->ps_tdma_du_adj_type
=
2061 } else if (coex_dm
->cur_ps_tdma
== 1) {
2062 halbtc8192e2ant_ps_tdma(
2066 coex_dm
->ps_tdma_du_adj_type
=
2068 } else if (coex_dm
->cur_ps_tdma
== 12) {
2069 halbtc8192e2ant_ps_tdma(
2073 coex_dm
->ps_tdma_du_adj_type
=
2075 } else if (coex_dm
->cur_ps_tdma
== 11) {
2076 halbtc8192e2ant_ps_tdma(
2080 coex_dm
->ps_tdma_du_adj_type
=
2082 } else if (coex_dm
->cur_ps_tdma
== 10) {
2083 halbtc8192e2ant_ps_tdma(
2087 coex_dm
->ps_tdma_du_adj_type
=
2092 } else if (max_interval
== 2) {
2094 BTC_PRINT(BTC_MSG_ALGORITHM
,
2095 ALGO_TRACE_FW_DETAIL
,
2096 "[BTCoex], TxPause = 1\n");
2097 if (coex_dm
->cur_ps_tdma
== 1) {
2098 halbtc8192e2ant_ps_tdma(btcoexist
,
2101 coex_dm
->ps_tdma_du_adj_type
= 6;
2102 } else if (coex_dm
->cur_ps_tdma
== 2) {
2103 halbtc8192e2ant_ps_tdma(btcoexist
,
2106 coex_dm
->ps_tdma_du_adj_type
= 6;
2107 } else if (coex_dm
->cur_ps_tdma
== 3) {
2108 halbtc8192e2ant_ps_tdma(btcoexist
,
2111 coex_dm
->ps_tdma_du_adj_type
= 7;
2112 } else if (coex_dm
->cur_ps_tdma
== 4) {
2113 halbtc8192e2ant_ps_tdma(btcoexist
,
2116 coex_dm
->ps_tdma_du_adj_type
= 8;
2118 if (coex_dm
->cur_ps_tdma
== 9) {
2119 halbtc8192e2ant_ps_tdma(btcoexist
,
2122 coex_dm
->ps_tdma_du_adj_type
= 14;
2123 } else if (coex_dm
->cur_ps_tdma
== 10) {
2124 halbtc8192e2ant_ps_tdma(btcoexist
,
2127 coex_dm
->ps_tdma_du_adj_type
= 14;
2128 } else if (coex_dm
->cur_ps_tdma
== 11) {
2129 halbtc8192e2ant_ps_tdma(btcoexist
,
2132 coex_dm
->ps_tdma_du_adj_type
= 15;
2133 } else if (coex_dm
->cur_ps_tdma
== 12) {
2134 halbtc8192e2ant_ps_tdma(btcoexist
,
2137 coex_dm
->ps_tdma_du_adj_type
= 16;
2140 if (coex_dm
->cur_ps_tdma
== 5) {
2141 halbtc8192e2ant_ps_tdma(
2145 coex_dm
->ps_tdma_du_adj_type
=
2147 } else if (coex_dm
->cur_ps_tdma
== 6) {
2148 halbtc8192e2ant_ps_tdma(
2152 coex_dm
->ps_tdma_du_adj_type
=
2154 } else if (coex_dm
->cur_ps_tdma
== 7) {
2155 halbtc8192e2ant_ps_tdma(
2159 coex_dm
->ps_tdma_du_adj_type
=
2161 } else if (coex_dm
->cur_ps_tdma
== 13) {
2162 halbtc8192e2ant_ps_tdma(
2166 coex_dm
->ps_tdma_du_adj_type
=
2168 } else if (coex_dm
->cur_ps_tdma
== 14) {
2169 halbtc8192e2ant_ps_tdma(
2173 coex_dm
->ps_tdma_du_adj_type
=
2175 } else if (coex_dm
->cur_ps_tdma
== 15) {
2176 halbtc8192e2ant_ps_tdma(
2180 coex_dm
->ps_tdma_du_adj_type
=
2183 } else if (result
== 1) {
2184 if (coex_dm
->cur_ps_tdma
== 8) {
2185 halbtc8192e2ant_ps_tdma(
2189 coex_dm
->ps_tdma_du_adj_type
=
2191 } else if (coex_dm
->cur_ps_tdma
== 7) {
2192 halbtc8192e2ant_ps_tdma(
2196 coex_dm
->ps_tdma_du_adj_type
=
2198 } else if (coex_dm
->cur_ps_tdma
== 6) {
2199 halbtc8192e2ant_ps_tdma(
2203 coex_dm
->ps_tdma_du_adj_type
=
2205 } else if (coex_dm
->cur_ps_tdma
== 16) {
2206 halbtc8192e2ant_ps_tdma(
2210 coex_dm
->ps_tdma_du_adj_type
=
2212 } else if (coex_dm
->cur_ps_tdma
== 15) {
2213 halbtc8192e2ant_ps_tdma(
2217 coex_dm
->ps_tdma_du_adj_type
=
2219 } else if (coex_dm
->cur_ps_tdma
== 14) {
2220 halbtc8192e2ant_ps_tdma(
2224 coex_dm
->ps_tdma_du_adj_type
=
2229 BTC_PRINT(BTC_MSG_ALGORITHM
,
2230 ALGO_TRACE_FW_DETAIL
,
2231 "[BTCoex], TxPause = 0\n");
2232 if (coex_dm
->cur_ps_tdma
== 5) {
2233 halbtc8192e2ant_ps_tdma(btcoexist
,
2236 coex_dm
->ps_tdma_du_adj_type
= 2;
2237 } else if (coex_dm
->cur_ps_tdma
== 6) {
2238 halbtc8192e2ant_ps_tdma(btcoexist
,
2241 coex_dm
->ps_tdma_du_adj_type
= 2;
2242 } else if (coex_dm
->cur_ps_tdma
== 7) {
2243 halbtc8192e2ant_ps_tdma(btcoexist
,
2246 coex_dm
->ps_tdma_du_adj_type
= 3;
2247 } else if (coex_dm
->cur_ps_tdma
== 8) {
2248 halbtc8192e2ant_ps_tdma(btcoexist
,
2251 coex_dm
->ps_tdma_du_adj_type
= 4;
2253 if (coex_dm
->cur_ps_tdma
== 13) {
2254 halbtc8192e2ant_ps_tdma(btcoexist
,
2257 coex_dm
->ps_tdma_du_adj_type
= 10;
2258 } else if (coex_dm
->cur_ps_tdma
== 14) {
2259 halbtc8192e2ant_ps_tdma(btcoexist
,
2262 coex_dm
->ps_tdma_du_adj_type
= 10;
2263 } else if (coex_dm
->cur_ps_tdma
== 15) {
2264 halbtc8192e2ant_ps_tdma(btcoexist
,
2267 coex_dm
->ps_tdma_du_adj_type
= 11;
2268 } else if (coex_dm
->cur_ps_tdma
== 16) {
2269 halbtc8192e2ant_ps_tdma(btcoexist
,
2272 coex_dm
->ps_tdma_du_adj_type
= 12;
2275 if (coex_dm
->cur_ps_tdma
== 1) {
2276 halbtc8192e2ant_ps_tdma(
2280 coex_dm
->ps_tdma_du_adj_type
=
2282 } else if (coex_dm
->cur_ps_tdma
== 2) {
2283 halbtc8192e2ant_ps_tdma(
2287 coex_dm
->ps_tdma_du_adj_type
=
2289 } else if (coex_dm
->cur_ps_tdma
== 3) {
2290 halbtc8192e2ant_ps_tdma(
2294 coex_dm
->ps_tdma_du_adj_type
=
2296 } else if (coex_dm
->cur_ps_tdma
== 9) {
2297 halbtc8192e2ant_ps_tdma(
2301 coex_dm
->ps_tdma_du_adj_type
=
2303 } else if (coex_dm
->cur_ps_tdma
== 10) {
2304 halbtc8192e2ant_ps_tdma(
2308 coex_dm
->ps_tdma_du_adj_type
=
2310 } else if (coex_dm
->cur_ps_tdma
== 11) {
2311 halbtc8192e2ant_ps_tdma(
2315 coex_dm
->ps_tdma_du_adj_type
=
2318 } else if (result
== 1) {
2319 if (coex_dm
->cur_ps_tdma
== 4) {
2320 halbtc8192e2ant_ps_tdma(
2324 coex_dm
->ps_tdma_du_adj_type
=
2326 } else if (coex_dm
->cur_ps_tdma
== 3) {
2327 halbtc8192e2ant_ps_tdma(
2331 coex_dm
->ps_tdma_du_adj_type
=
2333 } else if (coex_dm
->cur_ps_tdma
== 2) {
2334 halbtc8192e2ant_ps_tdma(
2338 coex_dm
->ps_tdma_du_adj_type
=
2340 } else if (coex_dm
->cur_ps_tdma
== 12) {
2341 halbtc8192e2ant_ps_tdma(
2345 coex_dm
->ps_tdma_du_adj_type
=
2347 } else if (coex_dm
->cur_ps_tdma
== 11) {
2348 halbtc8192e2ant_ps_tdma(
2352 coex_dm
->ps_tdma_du_adj_type
=
2354 } else if (coex_dm
->cur_ps_tdma
== 10) {
2355 halbtc8192e2ant_ps_tdma(
2359 coex_dm
->ps_tdma_du_adj_type
=
2364 } else if (max_interval
== 3) {
2366 BTC_PRINT(BTC_MSG_ALGORITHM
,
2367 ALGO_TRACE_FW_DETAIL
,
2368 "[BTCoex], TxPause = 1\n");
2369 if (coex_dm
->cur_ps_tdma
== 1) {
2370 halbtc8192e2ant_ps_tdma(btcoexist
,
2373 coex_dm
->ps_tdma_du_adj_type
= 7;
2374 } else if (coex_dm
->cur_ps_tdma
== 2) {
2375 halbtc8192e2ant_ps_tdma(btcoexist
,
2378 coex_dm
->ps_tdma_du_adj_type
= 7;
2379 } else if (coex_dm
->cur_ps_tdma
== 3) {
2380 halbtc8192e2ant_ps_tdma(btcoexist
,
2383 coex_dm
->ps_tdma_du_adj_type
= 7;
2384 } else if (coex_dm
->cur_ps_tdma
== 4) {
2385 halbtc8192e2ant_ps_tdma(btcoexist
,
2388 coex_dm
->ps_tdma_du_adj_type
= 8;
2390 if (coex_dm
->cur_ps_tdma
== 9) {
2391 halbtc8192e2ant_ps_tdma(btcoexist
,
2394 coex_dm
->ps_tdma_du_adj_type
= 15;
2395 } else if (coex_dm
->cur_ps_tdma
== 10) {
2396 halbtc8192e2ant_ps_tdma(btcoexist
,
2399 coex_dm
->ps_tdma_du_adj_type
= 15;
2400 } else if (coex_dm
->cur_ps_tdma
== 11) {
2401 halbtc8192e2ant_ps_tdma(btcoexist
,
2404 coex_dm
->ps_tdma_du_adj_type
= 15;
2405 } else if (coex_dm
->cur_ps_tdma
== 12) {
2406 halbtc8192e2ant_ps_tdma(btcoexist
,
2409 coex_dm
->ps_tdma_du_adj_type
= 16;
2412 if (coex_dm
->cur_ps_tdma
== 5) {
2413 halbtc8192e2ant_ps_tdma(
2417 coex_dm
->ps_tdma_du_adj_type
=
2419 } else if (coex_dm
->cur_ps_tdma
== 6) {
2420 halbtc8192e2ant_ps_tdma(
2424 coex_dm
->ps_tdma_du_adj_type
=
2426 } else if (coex_dm
->cur_ps_tdma
== 7) {
2427 halbtc8192e2ant_ps_tdma(
2431 coex_dm
->ps_tdma_du_adj_type
=
2433 } else if (coex_dm
->cur_ps_tdma
== 13) {
2434 halbtc8192e2ant_ps_tdma(
2438 coex_dm
->ps_tdma_du_adj_type
=
2440 } else if (coex_dm
->cur_ps_tdma
== 14) {
2441 halbtc8192e2ant_ps_tdma(
2445 coex_dm
->ps_tdma_du_adj_type
=
2447 } else if (coex_dm
->cur_ps_tdma
== 15) {
2448 halbtc8192e2ant_ps_tdma(
2452 coex_dm
->ps_tdma_du_adj_type
=
2455 } else if (result
== 1) {
2456 if (coex_dm
->cur_ps_tdma
== 8) {
2457 halbtc8192e2ant_ps_tdma(
2461 coex_dm
->ps_tdma_du_adj_type
=
2463 } else if (coex_dm
->cur_ps_tdma
== 7) {
2464 halbtc8192e2ant_ps_tdma(
2468 coex_dm
->ps_tdma_du_adj_type
=
2470 } else if (coex_dm
->cur_ps_tdma
== 6) {
2471 halbtc8192e2ant_ps_tdma(
2475 coex_dm
->ps_tdma_du_adj_type
=
2477 } else if (coex_dm
->cur_ps_tdma
== 16) {
2478 halbtc8192e2ant_ps_tdma(
2482 coex_dm
->ps_tdma_du_adj_type
=
2484 } else if (coex_dm
->cur_ps_tdma
== 15) {
2485 halbtc8192e2ant_ps_tdma(
2489 coex_dm
->ps_tdma_du_adj_type
=
2491 } else if (coex_dm
->cur_ps_tdma
== 14) {
2492 halbtc8192e2ant_ps_tdma(
2496 coex_dm
->ps_tdma_du_adj_type
=
2501 BTC_PRINT(BTC_MSG_ALGORITHM
,
2502 ALGO_TRACE_FW_DETAIL
,
2503 "[BTCoex], TxPause = 0\n");
2504 if (coex_dm
->cur_ps_tdma
== 5) {
2505 halbtc8192e2ant_ps_tdma(btcoexist
,
2508 coex_dm
->ps_tdma_du_adj_type
= 3;
2509 } else if (coex_dm
->cur_ps_tdma
== 6) {
2510 halbtc8192e2ant_ps_tdma(btcoexist
,
2513 coex_dm
->ps_tdma_du_adj_type
= 3;
2514 } else if (coex_dm
->cur_ps_tdma
== 7) {
2515 halbtc8192e2ant_ps_tdma(btcoexist
,
2518 coex_dm
->ps_tdma_du_adj_type
= 3;
2519 } else if (coex_dm
->cur_ps_tdma
== 8) {
2520 halbtc8192e2ant_ps_tdma(btcoexist
,
2523 coex_dm
->ps_tdma_du_adj_type
= 4;
2525 if (coex_dm
->cur_ps_tdma
== 13) {
2526 halbtc8192e2ant_ps_tdma(btcoexist
,
2529 coex_dm
->ps_tdma_du_adj_type
= 11;
2530 } else if (coex_dm
->cur_ps_tdma
== 14) {
2531 halbtc8192e2ant_ps_tdma(btcoexist
,
2534 coex_dm
->ps_tdma_du_adj_type
= 11;
2535 } else if (coex_dm
->cur_ps_tdma
== 15) {
2536 halbtc8192e2ant_ps_tdma(btcoexist
,
2539 coex_dm
->ps_tdma_du_adj_type
= 11;
2540 } else if (coex_dm
->cur_ps_tdma
== 16) {
2541 halbtc8192e2ant_ps_tdma(btcoexist
,
2544 coex_dm
->ps_tdma_du_adj_type
= 12;
2547 if (coex_dm
->cur_ps_tdma
== 1) {
2548 halbtc8192e2ant_ps_tdma(
2552 coex_dm
->ps_tdma_du_adj_type
=
2554 } else if (coex_dm
->cur_ps_tdma
== 2) {
2555 halbtc8192e2ant_ps_tdma(
2559 coex_dm
->ps_tdma_du_adj_type
=
2561 } else if (coex_dm
->cur_ps_tdma
== 3) {
2562 halbtc8192e2ant_ps_tdma(
2566 coex_dm
->ps_tdma_du_adj_type
=
2568 } else if (coex_dm
->cur_ps_tdma
== 9) {
2569 halbtc8192e2ant_ps_tdma(
2573 coex_dm
->ps_tdma_du_adj_type
=
2575 } else if (coex_dm
->cur_ps_tdma
== 10) {
2576 halbtc8192e2ant_ps_tdma(
2580 coex_dm
->ps_tdma_du_adj_type
=
2582 } else if (coex_dm
->cur_ps_tdma
== 11) {
2583 halbtc8192e2ant_ps_tdma(
2587 coex_dm
->ps_tdma_du_adj_type
=
2590 } else if (result
== 1) {
2591 if (coex_dm
->cur_ps_tdma
== 4) {
2592 halbtc8192e2ant_ps_tdma(
2596 coex_dm
->ps_tdma_du_adj_type
=
2598 } else if (coex_dm
->cur_ps_tdma
== 3) {
2599 halbtc8192e2ant_ps_tdma(
2603 coex_dm
->ps_tdma_du_adj_type
=
2605 } else if (coex_dm
->cur_ps_tdma
== 2) {
2606 halbtc8192e2ant_ps_tdma(
2610 coex_dm
->ps_tdma_du_adj_type
=
2612 } else if (coex_dm
->cur_ps_tdma
== 12) {
2613 halbtc8192e2ant_ps_tdma(
2617 coex_dm
->ps_tdma_du_adj_type
=
2619 } else if (coex_dm
->cur_ps_tdma
== 11) {
2620 halbtc8192e2ant_ps_tdma(
2624 coex_dm
->ps_tdma_du_adj_type
=
2626 } else if (coex_dm
->cur_ps_tdma
== 10) {
2627 halbtc8192e2ant_ps_tdma(
2631 coex_dm
->ps_tdma_du_adj_type
=
2639 /* if current PsTdma not match with
2640 * the recorded one (when scan, dhcp...),
2641 * then we have to adjust it back to the previous record one. */
2642 if (coex_dm
->cur_ps_tdma
!= coex_dm
->ps_tdma_du_adj_type
) {
2643 bool scan
= false, link
= false, roam
= false;
2644 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
2645 "[BTCoex], PsTdma type dismatch!!!, ");
2646 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_DETAIL
,
2647 "curPsTdma=%d, recordPsTdma=%d\n",
2648 coex_dm
->cur_ps_tdma
, coex_dm
->ps_tdma_du_adj_type
);
2650 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_SCAN
, &scan
);
2651 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_LINK
, &link
);
2652 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_ROAM
, &roam
);
2654 if (!scan
&& !link
&& !roam
)
2655 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
,
2657 coex_dm
->ps_tdma_du_adj_type
);
2659 BTC_PRINT(BTC_MSG_ALGORITHM
,
2660 ALGO_TRACE_FW_DETAIL
,
2661 "[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n");
2665 /* SCO only or SCO+PAN(HS) */
2666 static void halbtc8192e2ant_action_sco(struct btc_coexist
*btcoexist
)
2668 u8 wifirssi_state
, btrssi_state
= BTC_RSSI_STATE_STAY_LOW
;
2671 wifirssi_state
= halbtc8192e2ant_wifirssi_state(btcoexist
, 0, 2, 15, 0);
2673 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
, 1);
2674 halbtc8192e2ant_limited_rx(btcoexist
, NORMAL_EXEC
, false, false, 0x8);
2676 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
, 6);
2678 halbtc8192e2ant_coex_table_with_type(btcoexist
, NORMAL_EXEC
, 4);
2680 btrssi_state
= halbtc8192e2ant_btrssi_state(3, 34, 42);
2682 if ((btrssi_state
== BTC_RSSI_STATE_LOW
) ||
2683 (btrssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
2684 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
2685 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 13);
2686 } else if ((btrssi_state
== BTC_RSSI_STATE_MEDIUM
) ||
2687 (btrssi_state
== BTC_RSSI_STATE_STAY_MEDIUM
)) {
2688 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 2);
2689 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 9);
2690 } else if ((btrssi_state
== BTC_RSSI_STATE_HIGH
) ||
2691 (btrssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2692 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 4);
2693 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 9);
2696 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2699 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2700 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
2701 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2702 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, true,
2704 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
2707 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, true,
2709 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
2713 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
2714 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2715 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, true,
2717 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
2720 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, true,
2722 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
2728 static void halbtc8192e2ant_action_sco_pan(struct btc_coexist
*btcoexist
)
2730 u8 wifirssi_state
, btrssi_state
= BTC_RSSI_STATE_STAY_LOW
;
2733 wifirssi_state
= halbtc8192e2ant_wifirssi_state(btcoexist
, 0, 2, 15, 0);
2735 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
, 1);
2736 halbtc8192e2ant_limited_rx(btcoexist
, NORMAL_EXEC
, false, false, 0x8);
2738 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
, 6);
2740 halbtc8192e2ant_coex_table_with_type(btcoexist
, NORMAL_EXEC
, 4);
2742 btrssi_state
= halbtc8192e2ant_btrssi_state(3, 34, 42);
2744 if ((btrssi_state
== BTC_RSSI_STATE_LOW
) ||
2745 (btrssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
2746 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
2747 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 14);
2748 } else if ((btrssi_state
== BTC_RSSI_STATE_MEDIUM
) ||
2749 (btrssi_state
== BTC_RSSI_STATE_STAY_MEDIUM
)) {
2750 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 2);
2751 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
2752 } else if ((btrssi_state
== BTC_RSSI_STATE_HIGH
) ||
2753 (btrssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2754 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 4);
2755 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
2758 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2761 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2762 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
2763 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2764 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, true,
2766 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
2769 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, true,
2771 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
2775 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
2776 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2777 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, true,
2779 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
2782 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, true,
2784 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
2790 static void halbtc8192e2ant_action_hid(struct btc_coexist
*btcoexist
)
2792 u8 wifirssi_state
, btrssi_state
= BTC_RSSI_STATE_HIGH
;
2795 wifirssi_state
= halbtc8192e2ant_wifirssi_state(btcoexist
, 0, 2, 15, 0);
2796 btrssi_state
= halbtc8192e2ant_btrssi_state(3, 34, 42);
2798 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
, 1);
2799 halbtc8192e2ant_limited_rx(btcoexist
, NORMAL_EXEC
, false, false, 0x8);
2801 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
, 6);
2803 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2805 halbtc8192e2ant_coex_table_with_type(btcoexist
, NORMAL_EXEC
, 3);
2807 if ((btrssi_state
== BTC_RSSI_STATE_LOW
) ||
2808 (btrssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
2809 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
2810 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 13);
2811 } else if ((btrssi_state
== BTC_RSSI_STATE_MEDIUM
) ||
2812 (btrssi_state
== BTC_RSSI_STATE_STAY_MEDIUM
)) {
2813 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 2);
2814 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 9);
2815 } else if ((btrssi_state
== BTC_RSSI_STATE_HIGH
) ||
2816 (btrssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2817 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 4);
2818 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 9);
2822 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2823 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
2824 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2825 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, true,
2827 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
2830 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, true,
2832 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
2836 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
2837 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2838 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, true,
2840 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
2843 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, true,
2845 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
2851 /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
2852 static void halbtc8192e2ant_action_a2dp(struct btc_coexist
*btcoexist
)
2854 u8 wifirssi_state
, btrssi_state
= BTC_RSSI_STATE_HIGH
;
2856 bool long_dist
= false;
2858 wifirssi_state
= halbtc8192e2ant_wifirssi_state(btcoexist
, 0, 2, 15, 0);
2859 btrssi_state
= halbtc8192e2ant_btrssi_state(3, 34, 42);
2861 if ((btrssi_state
== BTC_RSSI_STATE_LOW
||
2862 btrssi_state
== BTC_RSSI_STATE_STAY_LOW
) &&
2863 (wifirssi_state
== BTC_RSSI_STATE_LOW
||
2864 wifirssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
2865 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
2866 "[BTCoex], A2dp, wifi/bt rssi both LOW!!\n");
2870 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
, 2);
2871 halbtc8192e2ant_limited_rx(btcoexist
, NORMAL_EXEC
, false, true,
2874 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
, 1);
2875 halbtc8192e2ant_limited_rx(btcoexist
, NORMAL_EXEC
, false, false,
2879 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
, 6);
2882 halbtc8192e2ant_coex_table_with_type(btcoexist
, NORMAL_EXEC
, 0);
2884 halbtc8192e2ant_coex_table_with_type(btcoexist
, NORMAL_EXEC
, 2);
2888 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 17);
2889 coex_dm
->auto_tdma_adjust
= false;
2890 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
2892 if ((btrssi_state
== BTC_RSSI_STATE_LOW
) ||
2893 (btrssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
2894 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, false,
2896 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
2897 } else if ((btrssi_state
== BTC_RSSI_STATE_MEDIUM
) ||
2898 (btrssi_state
== BTC_RSSI_STATE_STAY_MEDIUM
)) {
2899 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, false,
2901 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 2);
2902 } else if ((btrssi_state
== BTC_RSSI_STATE_HIGH
) ||
2903 (btrssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2904 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, false,
2906 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 4);
2911 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2912 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2913 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
2914 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2915 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, false,
2917 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
2920 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, false,
2922 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
2926 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
2927 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2928 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false,
2930 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
2933 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false,
2935 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
2941 static void halbtc8192e2ant_action_a2dp_pan_hs(struct btc_coexist
*btcoexist
)
2943 u8 wifirssi_state
, btrssi_state
= BTC_RSSI_STATE_HIGH
;
2946 wifirssi_state
= halbtc8192e2ant_wifirssi_state(btcoexist
, 0, 2, 15, 0);
2947 btrssi_state
= halbtc8192e2ant_btrssi_state(3, 34, 42);
2949 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
, 1);
2950 halbtc8192e2ant_limited_rx(btcoexist
, NORMAL_EXEC
, false, false, 0x8);
2952 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
, 6);
2953 halbtc8192e2ant_coex_table_with_type(btcoexist
, NORMAL_EXEC
, 2);
2955 if ((btrssi_state
== BTC_RSSI_STATE_LOW
) ||
2956 (btrssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
2957 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, false, true, 2);
2958 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
2959 } else if ((btrssi_state
== BTC_RSSI_STATE_MEDIUM
) ||
2960 (btrssi_state
== BTC_RSSI_STATE_STAY_MEDIUM
)) {
2961 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, false, false,
2963 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 2);
2964 } else if ((btrssi_state
== BTC_RSSI_STATE_HIGH
) ||
2965 (btrssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2966 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, false, false,
2968 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 4);
2972 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
2973 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
2974 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
2975 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2976 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, false,
2978 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
2981 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, false,
2983 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
2987 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
2988 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
2989 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false,
2991 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
2994 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false,
2996 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
3002 static void halbtc8192e2ant_action_pan_edr(struct btc_coexist
*btcoexist
)
3004 u8 wifirssi_state
, btrssi_state
= BTC_RSSI_STATE_HIGH
;
3007 wifirssi_state
= halbtc8192e2ant_wifirssi_state(btcoexist
, 0, 2, 15, 0);
3008 btrssi_state
= halbtc8192e2ant_btrssi_state(3, 34, 42);
3010 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
, 1);
3011 halbtc8192e2ant_limited_rx(btcoexist
, NORMAL_EXEC
, false, false, 0x8);
3013 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
, 6);
3015 halbtc8192e2ant_coex_table_with_type(btcoexist
, NORMAL_EXEC
, 2);
3017 if ((btrssi_state
== BTC_RSSI_STATE_LOW
) ||
3018 (btrssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
3019 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
3020 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 5);
3021 } else if ((btrssi_state
== BTC_RSSI_STATE_MEDIUM
) ||
3022 (btrssi_state
== BTC_RSSI_STATE_STAY_MEDIUM
)) {
3023 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 2);
3024 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 1);
3025 } else if ((btrssi_state
== BTC_RSSI_STATE_HIGH
) ||
3026 (btrssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3027 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 4);
3028 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 1);
3032 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
3033 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
3034 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
3035 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3036 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, false,
3038 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
3041 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, false,
3043 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
3047 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
3048 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3049 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false,
3051 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
3054 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false,
3056 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
3063 static void halbtc8192e2ant_action_pan_hs(struct btc_coexist
*btcoexist
)
3065 u8 wifirssi_state
, btrssi_state
= BTC_RSSI_STATE_HIGH
;
3068 wifirssi_state
= halbtc8192e2ant_wifirssi_state(btcoexist
, 0, 2, 15, 0);
3069 btrssi_state
= halbtc8192e2ant_btrssi_state(3, 34, 42);
3071 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
, 1);
3072 halbtc8192e2ant_limited_rx(btcoexist
, NORMAL_EXEC
, false, false, 0x8);
3074 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
, 6);
3076 halbtc8192e2ant_coex_table_with_type(btcoexist
, NORMAL_EXEC
, 2);
3078 if ((btrssi_state
== BTC_RSSI_STATE_LOW
) ||
3079 (btrssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
3080 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
3081 } else if ((btrssi_state
== BTC_RSSI_STATE_MEDIUM
) ||
3082 (btrssi_state
== BTC_RSSI_STATE_STAY_MEDIUM
)) {
3083 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 2);
3084 } else if ((btrssi_state
== BTC_RSSI_STATE_HIGH
) ||
3085 (btrssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3086 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 4);
3088 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, false, 1);
3090 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
3091 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
3092 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
3093 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3094 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, false,
3096 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
3099 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, false,
3101 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
3105 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
3106 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3107 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false,
3109 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
3112 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false,
3114 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
3121 static void halbtc8192e2ant_action_pan_edr_a2dp(struct btc_coexist
*btcoexist
)
3123 u8 wifirssi_state
, btrssi_state
= BTC_RSSI_STATE_HIGH
;
3126 wifirssi_state
= halbtc8192e2ant_wifirssi_state(btcoexist
, 0, 2, 15, 0);
3127 btrssi_state
= halbtc8192e2ant_btrssi_state(3, 34, 42);
3129 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
, 1);
3130 halbtc8192e2ant_limited_rx(btcoexist
, NORMAL_EXEC
, false, false, 0x8);
3132 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
, 6);
3134 halbtc8192e2ant_coex_table_with_type(btcoexist
, NORMAL_EXEC
, 2);
3136 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
3138 if ((btrssi_state
== BTC_RSSI_STATE_LOW
) ||
3139 (btrssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
3140 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
3141 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, false, true, 3);
3142 } else if ((btrssi_state
== BTC_RSSI_STATE_MEDIUM
) ||
3143 (btrssi_state
== BTC_RSSI_STATE_STAY_MEDIUM
)) {
3144 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 2);
3145 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, false, false,
3147 } else if ((btrssi_state
== BTC_RSSI_STATE_HIGH
) ||
3148 (btrssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3149 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 4);
3150 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, false, false,
3155 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
3156 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
3157 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3158 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, false,
3160 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
3163 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, false,
3165 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
3169 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
3170 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3171 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false,
3173 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
3176 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, false,
3178 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
3184 static void halbtc8192e2ant_action_pan_edr_hid(struct btc_coexist
*btcoexist
)
3186 u8 wifirssi_state
, btrssi_state
= BTC_RSSI_STATE_HIGH
;
3189 wifirssi_state
= halbtc8192e2ant_wifirssi_state(btcoexist
, 0, 2, 15, 0);
3190 btrssi_state
= halbtc8192e2ant_btrssi_state(3, 34, 42);
3192 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
3194 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
, 1);
3195 halbtc8192e2ant_limited_rx(btcoexist
, NORMAL_EXEC
, false, false, 0x8);
3197 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
, 6);
3199 halbtc8192e2ant_coex_table_with_type(btcoexist
, NORMAL_EXEC
, 3);
3201 if ((btrssi_state
== BTC_RSSI_STATE_LOW
) ||
3202 (btrssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
3203 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
3204 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 14);
3205 } else if ((btrssi_state
== BTC_RSSI_STATE_MEDIUM
) ||
3206 (btrssi_state
== BTC_RSSI_STATE_STAY_MEDIUM
)) {
3207 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 2);
3208 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
3209 } else if ((btrssi_state
== BTC_RSSI_STATE_HIGH
) ||
3210 (btrssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3211 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 4);
3212 halbtc8192e2ant_ps_tdma(btcoexist
, NORMAL_EXEC
, true, 10);
3216 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
3217 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
3218 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3219 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, true,
3221 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
3224 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, true,
3226 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
3230 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
3231 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3232 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, true,
3234 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
3237 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, true,
3239 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
3245 /* HID+A2DP+PAN(EDR) */
3246 static void halbtc8192e2ant_action_hid_a2dp_pan_edr(struct btc_coexist
*btcoexist
)
3248 u8 wifirssi_state
, btrssi_state
= BTC_RSSI_STATE_HIGH
;
3251 wifirssi_state
= halbtc8192e2ant_wifirssi_state(btcoexist
, 0, 2, 15, 0);
3252 btrssi_state
= halbtc8192e2ant_btrssi_state(3, 34, 42);
3254 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
, 1);
3255 halbtc8192e2ant_limited_rx(btcoexist
, NORMAL_EXEC
, false, false, 0x8);
3257 halbtc8192e2ant_fw_dac_swinglvl(btcoexist
, NORMAL_EXEC
, 6);
3259 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
3261 halbtc8192e2ant_coex_table_with_type(btcoexist
, NORMAL_EXEC
, 3);
3263 if ((btrssi_state
== BTC_RSSI_STATE_LOW
) ||
3264 (btrssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
3265 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
3266 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, true, true, 3);
3267 } else if ((btrssi_state
== BTC_RSSI_STATE_MEDIUM
) ||
3268 (btrssi_state
== BTC_RSSI_STATE_STAY_MEDIUM
)) {
3269 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 2);
3270 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, true, false, 3);
3271 } else if ((btrssi_state
== BTC_RSSI_STATE_HIGH
) ||
3272 (btrssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3273 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 4);
3274 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, true, false, 3);
3278 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
3279 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
3280 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3281 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, true,
3283 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
3286 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, true,
3288 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
3292 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
3293 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3294 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, true,
3296 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
3299 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, true,
3301 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
3307 static void halbtc8192e2ant_action_hid_a2dp(struct btc_coexist
*btcoexist
)
3309 u8 wifirssi_state
, btrssi_state
= BTC_RSSI_STATE_HIGH
;
3312 wifirssi_state
= halbtc8192e2ant_wifirssi_state(btcoexist
, 0, 2, 15, 0);
3313 btrssi_state
= halbtc8192e2ant_btrssi_state(3, 34, 42);
3315 halbtc8192e2ant_switch_sstype(btcoexist
, NORMAL_EXEC
, 1);
3316 halbtc8192e2ant_limited_rx(btcoexist
, NORMAL_EXEC
, false, false, 0x8);
3318 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
3320 halbtc8192e2ant_coex_table_with_type(btcoexist
, NORMAL_EXEC
, 3);
3322 if ((btrssi_state
== BTC_RSSI_STATE_LOW
) ||
3323 (btrssi_state
== BTC_RSSI_STATE_STAY_LOW
)) {
3324 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 0);
3325 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, true, true, 2);
3326 } else if ((btrssi_state
== BTC_RSSI_STATE_MEDIUM
) ||
3327 (btrssi_state
== BTC_RSSI_STATE_STAY_MEDIUM
)) {
3328 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 2);
3329 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, true, false, 2);
3330 } else if ((btrssi_state
== BTC_RSSI_STATE_HIGH
) ||
3331 (btrssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3332 halbtc8192e2ant_dec_btpwr(btcoexist
, NORMAL_EXEC
, 4);
3333 halbtc8192e2ant_tdma_duration_adjust(btcoexist
, true, false, 2);
3337 if (BTC_WIFI_BW_HT40
== wifi_bw
) {
3338 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
3339 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3340 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, true,
3342 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
3345 halbtc8192e2ant_sw_mechanism1(btcoexist
, true, true,
3347 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
3351 if ((wifirssi_state
== BTC_RSSI_STATE_HIGH
) ||
3352 (wifirssi_state
== BTC_RSSI_STATE_STAY_HIGH
)) {
3353 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, true,
3355 halbtc8192e2ant_sw_mechanism2(btcoexist
, true, false,
3358 halbtc8192e2ant_sw_mechanism1(btcoexist
, false, true,
3360 halbtc8192e2ant_sw_mechanism2(btcoexist
, false, false,
3366 static void halbtc8192e2ant_run_coexist_mechanism(struct btc_coexist
*btcoexist
)
3370 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3371 "[BTCoex], RunCoexistMechanism()===>\n");
3373 if (btcoexist
->manual_control
) {
3374 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3375 "[BTCoex], return for Manual CTRL <===\n");
3379 if (coex_sta
->under_ips
) {
3380 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3381 "[BTCoex], wifi is under IPS !!!\n");
3385 algorithm
= halbtc8192e2ant_action_algorithm(btcoexist
);
3386 if (coex_sta
->c2h_bt_inquiry_page
&&
3387 (BT_8192E_2ANT_COEX_ALGO_PANHS
!= algorithm
)) {
3388 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3389 "[BTCoex], BT is under inquiry/page scan !!\n");
3390 halbtc8192e2ant_action_bt_inquiry(btcoexist
);
3394 coex_dm
->cur_algorithm
= algorithm
;
3395 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3396 "[BTCoex], Algorithm = %d\n", coex_dm
->cur_algorithm
);
3398 if (halbtc8192e2ant_is_common_action(btcoexist
)) {
3399 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3400 "[BTCoex], Action 2-Ant common.\n");
3401 coex_dm
->auto_tdma_adjust
= false;
3403 if (coex_dm
->cur_algorithm
!= coex_dm
->pre_algorithm
) {
3404 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3405 "[BTCoex] preAlgorithm=%d, curAlgorithm=%d\n",
3406 coex_dm
->pre_algorithm
,
3407 coex_dm
->cur_algorithm
);
3408 coex_dm
->auto_tdma_adjust
= false;
3410 switch (coex_dm
->cur_algorithm
) {
3411 case BT_8192E_2ANT_COEX_ALGO_SCO
:
3412 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3413 "Action 2-Ant, algorithm = SCO.\n");
3414 halbtc8192e2ant_action_sco(btcoexist
);
3416 case BT_8192E_2ANT_COEX_ALGO_SCO_PAN
:
3417 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3418 "Action 2-Ant, algorithm = SCO+PAN(EDR).\n");
3419 halbtc8192e2ant_action_sco_pan(btcoexist
);
3421 case BT_8192E_2ANT_COEX_ALGO_HID
:
3422 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3423 "Action 2-Ant, algorithm = HID.\n");
3424 halbtc8192e2ant_action_hid(btcoexist
);
3426 case BT_8192E_2ANT_COEX_ALGO_A2DP
:
3427 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3428 "Action 2-Ant, algorithm = A2DP.\n");
3429 halbtc8192e2ant_action_a2dp(btcoexist
);
3431 case BT_8192E_2ANT_COEX_ALGO_A2DP_PANHS
:
3432 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3433 "Action 2-Ant, algorithm = A2DP+PAN(HS).\n");
3434 halbtc8192e2ant_action_a2dp_pan_hs(btcoexist
);
3436 case BT_8192E_2ANT_COEX_ALGO_PANEDR
:
3437 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3438 "Action 2-Ant, algorithm = PAN(EDR).\n");
3439 halbtc8192e2ant_action_pan_edr(btcoexist
);
3441 case BT_8192E_2ANT_COEX_ALGO_PANHS
:
3442 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3443 "Action 2-Ant, algorithm = HS mode.\n");
3444 halbtc8192e2ant_action_pan_hs(btcoexist
);
3446 case BT_8192E_2ANT_COEX_ALGO_PANEDR_A2DP
:
3447 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3448 "Action 2-Ant, algorithm = PAN+A2DP.\n");
3449 halbtc8192e2ant_action_pan_edr_a2dp(btcoexist
);
3451 case BT_8192E_2ANT_COEX_ALGO_PANEDR_HID
:
3452 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3453 "Action 2-Ant, algorithm = PAN(EDR)+HID.\n");
3454 halbtc8192e2ant_action_pan_edr_hid(btcoexist
);
3456 case BT_8192E_2ANT_COEX_ALGO_HID_A2DP_PANEDR
:
3457 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3458 "Action 2-Ant, algorithm = HID+A2DP+PAN.\n");
3459 halbtc8192e2ant_action_hid_a2dp_pan_edr(btcoexist
);
3461 case BT_8192E_2ANT_COEX_ALGO_HID_A2DP
:
3462 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3463 "Action 2-Ant, algorithm = HID+A2DP.\n");
3464 halbtc8192e2ant_action_hid_a2dp(btcoexist
);
3467 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3468 "Action 2-Ant, algorithm = unknown!!\n");
3469 /* halbtc8192e2ant_coex_alloff(btcoexist); */
3472 coex_dm
->pre_algorithm
= coex_dm
->cur_algorithm
;
3476 static void halbtc8192e2ant_init_hwconfig(struct btc_coexist
*btcoexist
,
3482 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_INIT
,
3483 "[BTCoex], 2Ant Init HW Config!!\n");
3486 /* backup rf 0x1e value */
3487 coex_dm
->bt_rf0x1e_backup
=
3488 btcoexist
->btc_get_rf_reg(btcoexist
, BTC_RF_A
,
3491 coex_dm
->backup_arfr_cnt1
= btcoexist
->btc_read_4byte(btcoexist
,
3493 coex_dm
->backup_arfr_cnt2
= btcoexist
->btc_read_4byte(btcoexist
,
3495 coex_dm
->backup_retrylimit
= btcoexist
->btc_read_2byte(
3498 coex_dm
->backup_ampdu_maxtime
= btcoexist
->btc_read_1byte(
3503 /* antenna sw ctrl to bt */
3504 btcoexist
->btc_write_1byte(btcoexist
, 0x4f, 0x6);
3505 btcoexist
->btc_write_1byte(btcoexist
, 0x944, 0x24);
3506 btcoexist
->btc_write_4byte(btcoexist
, 0x930, 0x700700);
3507 btcoexist
->btc_write_1byte(btcoexist
, 0x92c, 0x20);
3508 if (btcoexist
->chip_interface
== BTC_INTF_USB
)
3509 btcoexist
->btc_write_4byte(btcoexist
, 0x64, 0x30430004);
3511 btcoexist
->btc_write_4byte(btcoexist
, 0x64, 0x30030004);
3513 halbtc8192e2ant_coex_table_with_type(btcoexist
, FORCE_EXEC
, 0);
3515 /* antenna switch control parameter */
3516 btcoexist
->btc_write_4byte(btcoexist
, 0x858, 0x55555555);
3518 /* coex parameters */
3519 btcoexist
->btc_write_1byte(btcoexist
, 0x778, 0x3);
3520 /* 0x790[5:0]=0x5 */
3521 u8tmp
= btcoexist
->btc_read_1byte(btcoexist
, 0x790);
3524 btcoexist
->btc_write_1byte(btcoexist
, 0x790, u8tmp
);
3526 /* enable counter statistics */
3527 btcoexist
->btc_write_1byte(btcoexist
, 0x76e, 0x4);
3530 btcoexist
->btc_write_1byte(btcoexist
, 0x40, 0x20);
3531 /* enable mailbox interface */
3532 u16tmp
= btcoexist
->btc_read_2byte(btcoexist
, 0x40);
3534 btcoexist
->btc_write_2byte(btcoexist
, 0x40, u16tmp
);
3536 /* enable PTA I2C mailbox */
3537 u8tmp
= btcoexist
->btc_read_1byte(btcoexist
, 0x101);
3539 btcoexist
->btc_write_1byte(btcoexist
, 0x101, u8tmp
);
3541 /* enable bt clock when wifi is disabled. */
3542 u8tmp
= btcoexist
->btc_read_1byte(btcoexist
, 0x93);
3544 btcoexist
->btc_write_1byte(btcoexist
, 0x93, u8tmp
);
3545 /* enable bt clock when suspend. */
3546 u8tmp
= btcoexist
->btc_read_1byte(btcoexist
, 0x7);
3548 btcoexist
->btc_write_1byte(btcoexist
, 0x7, u8tmp
);
3551 /*************************************************************
3552 * work around function start with wa_halbtc8192e2ant_
3553 *************************************************************/
3555 /************************************************************
3556 * extern function start with EXhalbtc8192e2ant_
3557 ************************************************************/
3559 void ex_halbtc8192e2ant_init_hwconfig(struct btc_coexist
*btcoexist
)
3561 halbtc8192e2ant_init_hwconfig(btcoexist
, true);
3564 void ex_halbtc8192e2ant_init_coex_dm(struct btc_coexist
*btcoexist
)
3566 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_INIT
,
3567 "[BTCoex], Coex Mechanism Init!!\n");
3568 halbtc8192e2ant_init_coex_dm(btcoexist
);
3571 void ex_halbtc8192e2ant_display_coex_info(struct btc_coexist
*btcoexist
)
3573 struct btc_board_info
*board_info
= &btcoexist
->board_info
;
3574 struct btc_stack_info
*stack_info
= &btcoexist
->stack_info
;
3575 u8
*cli_buf
= btcoexist
->cli_buf
;
3576 u8 u8tmp
[4], i
, bt_info_ext
, ps_tdma_case
= 0;
3579 bool roam
= false, scan
= false, link
= false, wifi_under_5g
= false;
3580 bool bt_hson
= false, wifi_busy
= false;
3581 int wifirssi
= 0, bt_hs_rssi
= 0;
3582 u32 wifi_bw
, wifi_traffic_dir
;
3583 u8 wifi_dot11_chnl
, wifi_hs_chnl
;
3584 u32 fw_ver
= 0, bt_patch_ver
= 0;
3586 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
3587 "\r\n ============[BT Coexist info]============");
3590 if (btcoexist
->manual_control
) {
3591 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
3592 "\r\n ===========[Under Manual Control]===========");
3594 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
3595 "\r\n ==========================================");
3599 if (!board_info
->bt_exist
) {
3600 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n BT not exists !!!");
3605 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
3606 "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:",
3607 board_info
->pg_ant_num
, board_info
->btdm_ant_num
);
3610 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = %s / %d",
3611 "BT stack/ hci ext ver",
3612 ((stack_info
->profile_notified
) ? "Yes" : "No"),
3613 stack_info
->hci_version
);
3616 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_BT_PATCH_VER
, &bt_patch_ver
);
3617 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_FW_VER
, &fw_ver
);
3618 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
3619 "\r\n %-35s = %d_%d/ 0x%x/ 0x%x(%d)",
3620 "CoexVer/ FwVer/ PatchVer",
3621 glcoex_ver_date_8192e_2ant
, glcoex_ver_8192e_2ant
,
3622 fw_ver
, bt_patch_ver
, bt_patch_ver
);
3625 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_HS_OPERATION
, &bt_hson
);
3626 btcoexist
->btc_get(btcoexist
, BTC_GET_U1_WIFI_DOT11_CHNL
,
3628 btcoexist
->btc_get(btcoexist
, BTC_GET_U1_WIFI_HS_CHNL
, &wifi_hs_chnl
);
3629 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = %d / %d(%d)",
3630 "Dot11 channel / HsMode(HsChnl)",
3631 wifi_dot11_chnl
, bt_hson
, wifi_hs_chnl
);
3634 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = %02x %02x %02x ",
3635 "H2C Wifi inform bt chnl Info", coex_dm
->wifi_chnl_info
[0],
3636 coex_dm
->wifi_chnl_info
[1], coex_dm
->wifi_chnl_info
[2]);
3639 btcoexist
->btc_get(btcoexist
, BTC_GET_S4_WIFI_RSSI
, &wifirssi
);
3640 btcoexist
->btc_get(btcoexist
, BTC_GET_S4_HS_RSSI
, &bt_hs_rssi
);
3641 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = %d/ %d",
3642 "Wifi rssi/ HS rssi", wifirssi
, bt_hs_rssi
);
3645 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_SCAN
, &scan
);
3646 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_LINK
, &link
);
3647 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_ROAM
, &roam
);
3648 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = %d/ %d/ %d ",
3649 "Wifi link/ roam/ scan", link
, roam
, scan
);
3652 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_UNDER_5G
, &wifi_under_5g
);
3653 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
3654 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_BUSY
, &wifi_busy
);
3655 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION
,
3657 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = %s / %s/ %s ",
3658 "Wifi status", (wifi_under_5g
? "5G" : "2.4G"),
3659 ((BTC_WIFI_BW_LEGACY
== wifi_bw
) ? "Legacy" :
3660 (((BTC_WIFI_BW_HT40
== wifi_bw
) ? "HT40" : "HT20"))),
3661 ((!wifi_busy
) ? "idle" :
3662 ((BTC_WIFI_TRAFFIC_TX
== wifi_traffic_dir
) ?
3663 "uplink" : "downlink")));
3666 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = [%s/ %d/ %d] ",
3667 "BT [status/ rssi/ retryCnt]",
3668 ((btcoexist
->bt_info
.bt_disabled
) ? ("disabled") :
3669 ((coex_sta
->c2h_bt_inquiry_page
) ?
3670 ("inquiry/page scan") :
3671 ((BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE
==
3672 coex_dm
->bt_status
) ? "non-connected idle" :
3673 ((BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE
==
3674 coex_dm
->bt_status
) ? "connected-idle" : "busy")))),
3675 coex_sta
->bt_rssi
, coex_sta
->bt_retry_cnt
);
3678 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = %d / %d / %d / %d",
3679 "SCO/HID/PAN/A2DP", stack_info
->sco_exist
,
3680 stack_info
->hid_exist
, stack_info
->pan_exist
,
3681 stack_info
->a2dp_exist
);
3683 btcoexist
->btc_disp_dbg_msg(btcoexist
, BTC_DBG_DISP_BT_LINK_INFO
);
3685 bt_info_ext
= coex_sta
->bt_info_ext
;
3686 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = %s",
3687 "BT Info A2DP rate",
3688 (bt_info_ext
&BIT0
) ? "Basic rate" : "EDR rate");
3691 for (i
= 0; i
< BT_INFO_SRC_8192E_2ANT_MAX
; i
++) {
3692 if (coex_sta
->bt_info_c2h_cnt
[i
]) {
3693 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
3694 "\r\n %-35s = %02x %02x %02x %02x ",
3695 GLBtInfoSrc8192e2Ant
[i
],
3696 coex_sta
->bt_info_c2h
[i
][0],
3697 coex_sta
->bt_info_c2h
[i
][1],
3698 coex_sta
->bt_info_c2h
[i
][2],
3699 coex_sta
->bt_info_c2h
[i
][3]);
3701 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
3702 "%02x %02x %02x(%d)",
3703 coex_sta
->bt_info_c2h
[i
][4],
3704 coex_sta
->bt_info_c2h
[i
][5],
3705 coex_sta
->bt_info_c2h
[i
][6],
3706 coex_sta
->bt_info_c2h_cnt
[i
]);
3711 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = %s/%s",
3712 "PS state, IPS/LPS",
3713 ((coex_sta
->under_ips
? "IPS ON" : "IPS OFF")),
3714 ((coex_sta
->under_lps
? "LPS ON" : "LPS OFF")));
3716 btcoexist
->btc_disp_dbg_msg(btcoexist
, BTC_DBG_DISP_FW_PWR_MODE_CMD
);
3718 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = 0x%x ", "SS Type",
3719 coex_dm
->cur_sstype
);
3723 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s",
3724 "============[Sw mechanism]============");
3726 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = %d/ %d/ %d ",
3727 "SM1[ShRf/ LpRA/ LimDig]", coex_dm
->cur_rf_rx_lpf_shrink
,
3728 coex_dm
->cur_low_penalty_ra
, coex_dm
->limited_dig
);
3730 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = %d/ %d/ %d(0x%x) ",
3731 "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]",
3732 coex_dm
->cur_agc_table_en
, coex_dm
->cur_adc_back_off
,
3733 coex_dm
->cur_dac_swing_on
, coex_dm
->cur_dac_swing_lvl
);
3736 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = 0x%x ", "Rate Mask",
3737 btcoexist
->bt_info
.ra_mask
);
3741 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s",
3742 "============[Fw mechanism]============");
3745 ps_tdma_case
= coex_dm
->cur_ps_tdma
;
3746 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
3747 "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)",
3748 "PS TDMA", coex_dm
->ps_tdma_para
[0],
3749 coex_dm
->ps_tdma_para
[1], coex_dm
->ps_tdma_para
[2],
3750 coex_dm
->ps_tdma_para
[3], coex_dm
->ps_tdma_para
[4],
3751 ps_tdma_case
, coex_dm
->auto_tdma_adjust
);
3754 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = %d/ %d ",
3755 "DecBtPwr/ IgnWlanAct",
3756 coex_dm
->cur_dec_bt_pwr
, coex_dm
->cur_ignore_wlan_act
);
3760 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s",
3761 "============[Hw setting]============");
3764 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = 0x%x",
3765 "RF-A, 0x1e initVal", coex_dm
->bt_rf0x1e_backup
);
3768 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
3769 "backup ARFR1/ARFR2/RL/AMaxTime", coex_dm
->backup_arfr_cnt1
,
3770 coex_dm
->backup_arfr_cnt2
, coex_dm
->backup_retrylimit
,
3771 coex_dm
->backup_ampdu_maxtime
);
3774 u32tmp
[0] = btcoexist
->btc_read_4byte(btcoexist
, 0x430);
3775 u32tmp
[1] = btcoexist
->btc_read_4byte(btcoexist
, 0x434);
3776 u16tmp
[0] = btcoexist
->btc_read_2byte(btcoexist
, 0x42a);
3777 u8tmp
[0] = btcoexist
->btc_read_1byte(btcoexist
, 0x456);
3778 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = 0x%x/0x%x/0x%x/0x%x",
3779 "0x430/0x434/0x42a/0x456",
3780 u32tmp
[0], u32tmp
[1], u16tmp
[0], u8tmp
[0]);
3783 u32tmp
[0] = btcoexist
->btc_read_4byte(btcoexist
, 0xc04);
3784 u32tmp
[1] = btcoexist
->btc_read_4byte(btcoexist
, 0xd04);
3785 u32tmp
[2] = btcoexist
->btc_read_4byte(btcoexist
, 0x90c);
3786 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
3787 "0xc04/ 0xd04/ 0x90c", u32tmp
[0], u32tmp
[1], u32tmp
[2]);
3790 u8tmp
[0] = btcoexist
->btc_read_1byte(btcoexist
, 0x778);
3791 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = 0x%x", "0x778",
3795 u8tmp
[0] = btcoexist
->btc_read_1byte(btcoexist
, 0x92c);
3796 u32tmp
[0] = btcoexist
->btc_read_4byte(btcoexist
, 0x930);
3797 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = 0x%x/ 0x%x",
3798 "0x92c/ 0x930", (u8tmp
[0]), u32tmp
[0]);
3801 u8tmp
[0] = btcoexist
->btc_read_1byte(btcoexist
, 0x40);
3802 u8tmp
[1] = btcoexist
->btc_read_1byte(btcoexist
, 0x4f);
3803 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = 0x%x/ 0x%x",
3804 "0x40/ 0x4f", u8tmp
[0], u8tmp
[1]);
3807 u32tmp
[0] = btcoexist
->btc_read_4byte(btcoexist
, 0x550);
3808 u8tmp
[0] = btcoexist
->btc_read_1byte(btcoexist
, 0x522);
3809 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = 0x%x/ 0x%x",
3810 "0x550(bcn ctrl)/0x522", u32tmp
[0], u8tmp
[0]);
3813 u32tmp
[0] = btcoexist
->btc_read_4byte(btcoexist
, 0xc50);
3814 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = 0x%x", "0xc50(dig)",
3818 u32tmp
[0] = btcoexist
->btc_read_4byte(btcoexist
, 0x6c0);
3819 u32tmp
[1] = btcoexist
->btc_read_4byte(btcoexist
, 0x6c4);
3820 u32tmp
[2] = btcoexist
->btc_read_4byte(btcoexist
, 0x6c8);
3821 u8tmp
[0] = btcoexist
->btc_read_1byte(btcoexist
, 0x6cc);
3822 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
,
3823 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
3824 "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)",
3825 u32tmp
[0], u32tmp
[1], u32tmp
[2], u8tmp
[0]);
3828 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = %d/ %d",
3829 "0x770(hp rx[31:16]/tx[15:0])",
3830 coex_sta
->high_priority_rx
, coex_sta
->high_priority_tx
);
3832 CL_SPRINTF(cli_buf
, BT_TMP_BUF_SIZE
, "\r\n %-35s = %d/ %d",
3833 "0x774(lp rx[31:16]/tx[15:0])",
3834 coex_sta
->low_priority_rx
, coex_sta
->low_priority_tx
);
3836 #if (BT_AUTO_REPORT_ONLY_8192E_2ANT == 1)
3837 halbtc8192e2ant_monitor_bt_ctr(btcoexist
);
3839 btcoexist
->btc_disp_dbg_msg(btcoexist
, BTC_DBG_DISP_COEX_STATISTICS
);
3843 void ex_halbtc8192e2ant_ips_notify(struct btc_coexist
*btcoexist
, u8 type
)
3845 if (BTC_IPS_ENTER
== type
) {
3846 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3847 "[BTCoex], IPS ENTER notify\n");
3848 coex_sta
->under_ips
= true;
3849 halbtc8192e2ant_coex_alloff(btcoexist
);
3850 } else if (BTC_IPS_LEAVE
== type
) {
3851 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3852 "[BTCoex], IPS LEAVE notify\n");
3853 coex_sta
->under_ips
= false;
3857 void ex_halbtc8192e2ant_lps_notify(struct btc_coexist
*btcoexist
, u8 type
)
3859 if (BTC_LPS_ENABLE
== type
) {
3860 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3861 "[BTCoex], LPS ENABLE notify\n");
3862 coex_sta
->under_lps
= true;
3863 } else if (BTC_LPS_DISABLE
== type
) {
3864 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3865 "[BTCoex], LPS DISABLE notify\n");
3866 coex_sta
->under_lps
= false;
3870 void ex_halbtc8192e2ant_scan_notify(struct btc_coexist
*btcoexist
, u8 type
)
3872 if (BTC_SCAN_START
== type
)
3873 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3874 "[BTCoex], SCAN START notify\n");
3875 else if (BTC_SCAN_FINISH
== type
)
3876 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3877 "[BTCoex], SCAN FINISH notify\n");
3880 void ex_halbtc8192e2ant_connect_notify(struct btc_coexist
*btcoexist
, u8 type
)
3882 if (BTC_ASSOCIATE_START
== type
)
3883 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3884 "[BTCoex], CONNECT START notify\n");
3885 else if (BTC_ASSOCIATE_FINISH
== type
)
3886 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3887 "[BTCoex], CONNECT FINISH notify\n");
3890 void ex_halbtc8192e2ant_media_status_notify(struct btc_coexist
*btcoexist
,
3893 u8 h2c_parameter
[3] = {0};
3895 u8 wifi_center_chnl
;
3897 if (btcoexist
->manual_control
||
3898 btcoexist
->stop_coex_dm
||
3899 btcoexist
->bt_info
.bt_disabled
)
3902 if (BTC_MEDIA_CONNECT
== type
)
3903 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3904 "[BTCoex], MEDIA connect notify\n");
3906 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3907 "[BTCoex], MEDIA disconnect notify\n");
3909 /* only 2.4G we need to inform bt the chnl mask */
3910 btcoexist
->btc_get(btcoexist
, BTC_GET_U1_WIFI_CENTRAL_CHNL
,
3912 if ((BTC_MEDIA_CONNECT
== type
) &&
3913 (wifi_center_chnl
<= 14)) {
3914 h2c_parameter
[0] = 0x1;
3915 h2c_parameter
[1] = wifi_center_chnl
;
3916 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_BW
, &wifi_bw
);
3917 if (BTC_WIFI_BW_HT40
== wifi_bw
)
3918 h2c_parameter
[2] = 0x30;
3920 h2c_parameter
[2] = 0x20;
3923 coex_dm
->wifi_chnl_info
[0] = h2c_parameter
[0];
3924 coex_dm
->wifi_chnl_info
[1] = h2c_parameter
[1];
3925 coex_dm
->wifi_chnl_info
[2] = h2c_parameter
[2];
3927 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE_FW_EXEC
,
3928 "[BTCoex], FW write 0x66=0x%x\n",
3929 h2c_parameter
[0] << 16 | h2c_parameter
[1] << 8 |
3932 btcoexist
->btc_fill_h2c(btcoexist
, 0x66, 3, h2c_parameter
);
3935 void ex_halbtc8192e2ant_special_packet_notify(struct btc_coexist
*btcoexist
,
3938 if (type
== BTC_PACKET_DHCP
)
3939 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3940 "[BTCoex], DHCP Packet notify\n");
3943 void ex_halbtc8192e2ant_bt_info_notify(struct btc_coexist
*btcoexist
,
3944 u8
*tmp_buf
, u8 length
)
3947 u8 i
, rspSource
= 0;
3948 bool bt_busy
= false, limited_dig
= false;
3949 bool wifi_connected
= false;
3951 coex_sta
->c2h_bt_info_req_sent
= false;
3953 rspSource
= tmp_buf
[0] & 0xf;
3954 if (rspSource
>= BT_INFO_SRC_8192E_2ANT_MAX
)
3955 rspSource
= BT_INFO_SRC_8192E_2ANT_WIFI_FW
;
3956 coex_sta
->bt_info_c2h_cnt
[rspSource
]++;
3958 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3959 "[BTCoex], Bt info[%d], length=%d, hex data=[",
3961 for (i
= 0; i
< length
; i
++) {
3962 coex_sta
->bt_info_c2h
[rspSource
][i
] = tmp_buf
[i
];
3964 bt_info
= tmp_buf
[i
];
3966 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3967 "0x%02x]\n", tmp_buf
[i
]);
3969 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
3970 "0x%02x, ", tmp_buf
[i
]);
3973 if (BT_INFO_SRC_8192E_2ANT_WIFI_FW
!= rspSource
) {
3974 coex_sta
->bt_retry_cnt
= /* [3:0] */
3975 coex_sta
->bt_info_c2h
[rspSource
][2] & 0xf;
3978 coex_sta
->bt_info_c2h
[rspSource
][3] * 2 + 10;
3980 coex_sta
->bt_info_ext
=
3981 coex_sta
->bt_info_c2h
[rspSource
][4];
3983 /* Here we need to resend some wifi info to BT
3984 * because bt is reset and loss of the info. */
3985 if ((coex_sta
->bt_info_ext
& BIT1
)) {
3986 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
3987 "bit1, send wifi BW&Chnl to BT!!\n");
3988 btcoexist
->btc_get(btcoexist
, BTC_GET_BL_WIFI_CONNECTED
,
3991 ex_halbtc8192e2ant_media_status_notify(
3995 ex_halbtc8192e2ant_media_status_notify(
3997 BTC_MEDIA_DISCONNECT
);
4000 if ((coex_sta
->bt_info_ext
& BIT3
)) {
4001 if (!btcoexist
->manual_control
&&
4002 !btcoexist
->stop_coex_dm
) {
4003 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
4004 "bit3, BT NOT ignore Wlan active!\n");
4005 halbtc8192e2ant_IgnoreWlanAct(btcoexist
,
4010 /* BT already NOT ignore Wlan active,
4011 * do nothing here. */
4014 #if (BT_AUTO_REPORT_ONLY_8192E_2ANT == 0)
4015 if ((coex_sta
->bt_info_ext
& BIT4
)) {
4016 /* BT auto report already enabled, do nothing */
4018 halbtc8192e2ant_bt_autoreport(btcoexist
, FORCE_EXEC
,
4024 /* check BIT2 first ==> check if bt is under inquiry or page scan */
4025 if (bt_info
& BT_INFO_8192E_2ANT_B_INQ_PAGE
)
4026 coex_sta
->c2h_bt_inquiry_page
= true;
4028 coex_sta
->c2h_bt_inquiry_page
= false;
4030 /* set link exist status */
4031 if (!(bt_info
&BT_INFO_8192E_2ANT_B_CONNECTION
)) {
4032 coex_sta
->bt_link_exist
= false;
4033 coex_sta
->pan_exist
= false;
4034 coex_sta
->a2dp_exist
= false;
4035 coex_sta
->hid_exist
= false;
4036 coex_sta
->sco_exist
= false;
4037 } else {/* connection exists */
4038 coex_sta
->bt_link_exist
= true;
4039 if (bt_info
& BT_INFO_8192E_2ANT_B_FTP
)
4040 coex_sta
->pan_exist
= true;
4042 coex_sta
->pan_exist
= false;
4043 if (bt_info
& BT_INFO_8192E_2ANT_B_A2DP
)
4044 coex_sta
->a2dp_exist
= true;
4046 coex_sta
->a2dp_exist
= false;
4047 if (bt_info
& BT_INFO_8192E_2ANT_B_HID
)
4048 coex_sta
->hid_exist
= true;
4050 coex_sta
->hid_exist
= false;
4051 if (bt_info
& BT_INFO_8192E_2ANT_B_SCO_ESCO
)
4052 coex_sta
->sco_exist
= true;
4054 coex_sta
->sco_exist
= false;
4057 halbtc8192e2ant_update_btlink_info(btcoexist
);
4059 if (!(bt_info
&BT_INFO_8192E_2ANT_B_CONNECTION
)) {
4060 coex_dm
->bt_status
= BT_8192E_2ANT_BT_STATUS_NON_CONNECTED_IDLE
;
4061 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
4062 "[BTCoex], BT Non-Connected idle!!!\n");
4063 } else if (bt_info
== BT_INFO_8192E_2ANT_B_CONNECTION
) {
4064 coex_dm
->bt_status
= BT_8192E_2ANT_BT_STATUS_CONNECTED_IDLE
;
4065 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
4066 "[BTCoex], bt_infoNotify(), BT Connected-idle!!!\n");
4067 } else if ((bt_info
&BT_INFO_8192E_2ANT_B_SCO_ESCO
) ||
4068 (bt_info
&BT_INFO_8192E_2ANT_B_SCO_BUSY
)) {
4069 coex_dm
->bt_status
= BT_8192E_2ANT_BT_STATUS_SCO_BUSY
;
4070 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
4071 "[BTCoex], bt_infoNotify(), BT SCO busy!!!\n");
4072 } else if (bt_info
&BT_INFO_8192E_2ANT_B_ACL_BUSY
) {
4073 coex_dm
->bt_status
= BT_8192E_2ANT_BT_STATUS_ACL_BUSY
;
4074 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
4075 "[BTCoex], bt_infoNotify(), BT ACL busy!!!\n");
4077 coex_dm
->bt_status
= BT_8192E_2ANT_BT_STATUS_MAX
;
4078 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
4079 "[BTCoex]bt_infoNotify(), BT Non-Defined state!!!\n");
4082 if ((BT_8192E_2ANT_BT_STATUS_ACL_BUSY
== coex_dm
->bt_status
) ||
4083 (BT_8192E_2ANT_BT_STATUS_SCO_BUSY
== coex_dm
->bt_status
) ||
4084 (BT_8192E_2ANT_BT_STATUS_ACL_SCO_BUSY
== coex_dm
->bt_status
)) {
4089 limited_dig
= false;
4092 btcoexist
->btc_set(btcoexist
, BTC_SET_BL_BT_TRAFFIC_BUSY
, &bt_busy
);
4094 coex_dm
->limited_dig
= limited_dig
;
4095 btcoexist
->btc_set(btcoexist
, BTC_SET_BL_BT_LIMITED_DIG
, &limited_dig
);
4097 halbtc8192e2ant_run_coexist_mechanism(btcoexist
);
4100 void ex_halbtc8192e2ant_stack_operation_notify(struct btc_coexist
*btcoexist
,
4103 if (BTC_STACK_OP_INQ_PAGE_PAIR_START
== type
)
4104 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
4105 "[BTCoex] StackOP Inquiry/page/pair start notify\n");
4106 else if (BTC_STACK_OP_INQ_PAGE_PAIR_FINISH
== type
)
4107 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
,
4108 "[BTCoex] StackOP Inquiry/page/pair finish notify\n");
4111 void ex_halbtc8192e2ant_halt_notify(struct btc_coexist
*btcoexist
)
4113 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_NOTIFY
, "[BTCoex], Halt notify\n");
4115 halbtc8192e2ant_IgnoreWlanAct(btcoexist
, FORCE_EXEC
, true);
4116 ex_halbtc8192e2ant_media_status_notify(btcoexist
, BTC_MEDIA_DISCONNECT
);
4119 void ex_halbtc8192e2ant_periodical(struct btc_coexist
*btcoexist
)
4121 static u8 dis_ver_info_cnt
= 0;
4122 u32 fw_ver
= 0, bt_patch_ver
= 0;
4123 struct btc_board_info
*board_info
= &btcoexist
->board_info
;
4124 struct btc_stack_info
*stack_info
= &btcoexist
->stack_info
;
4126 BTC_PRINT(BTC_MSG_ALGORITHM
, ALGO_TRACE
,
4127 "=======================Periodical=======================\n");
4128 if (dis_ver_info_cnt
<= 5) {
4129 dis_ver_info_cnt
+= 1;
4130 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_INIT
,
4131 "************************************************\n");
4132 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_INIT
,
4133 "Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n",
4134 board_info
->pg_ant_num
, board_info
->btdm_ant_num
,
4135 board_info
->btdm_ant_pos
);
4136 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_INIT
,
4137 "BT stack/ hci ext ver = %s / %d\n",
4138 ((stack_info
->profile_notified
) ? "Yes" : "No"),
4139 stack_info
->hci_version
);
4140 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_BT_PATCH_VER
,
4142 btcoexist
->btc_get(btcoexist
, BTC_GET_U4_WIFI_FW_VER
, &fw_ver
);
4143 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_INIT
,
4144 "CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n",
4145 glcoex_ver_date_8192e_2ant
, glcoex_ver_8192e_2ant
,
4146 fw_ver
, bt_patch_ver
, bt_patch_ver
);
4147 BTC_PRINT(BTC_MSG_INTERFACE
, INTF_INIT
,
4148 "************************************************\n");
4151 #if (BT_AUTO_REPORT_ONLY_8192E_2ANT == 0)
4152 halbtc8192e2ant_querybt_info(btcoexist
);
4153 halbtc8192e2ant_monitor_bt_ctr(btcoexist
);
4154 halbtc8192e2ant_monitor_bt_enable_disable(btcoexist
);
4156 if (halbtc8192e2ant_iswifi_status_changed(btcoexist
) ||
4157 coex_dm
->auto_tdma_adjust
)
4158 halbtc8192e2ant_run_coexist_mechanism(btcoexist
);