1 //============================================================
4 // This file is for 8812a1ant 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 COEX_DM_8812A_1ANT GLCoexDm8812a1Ant;
20 static PCOEX_DM_8812A_1ANT coex_dm=&GLCoexDm8812a1Ant;
21 static COEX_STA_8812A_1ANT GLCoexSta8812a1Ant;
22 static PCOEX_STA_8812A_1ANT coex_sta=&GLCoexSta8812a1Ant;
24 const char *const GLBtInfoSrc8812a1Ant[]={
27 "BT Info[bt auto report]",
30 //============================================================
31 // local function proto type if needed
32 //============================================================
33 //============================================================
34 // local function start with halbtc8812a1ant_
35 //============================================================
38 halbtc8812a1ant_Reg0x550Bit3(
39 PBTC_COEXIST btcoexist,
45 u1tmp = btcoexist->btc_read_1byte(btcoexist, 0x550);
54 btcoexist->btc_write_1byte(btcoexist, 0x550, u1tmp);
55 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], set 0x550[3]=%d\n", (bSet? 1:0)));
59 halbtc8812a1ant_BtRssiState(
68 bt_rssi = coex_sta->bt_rssi;
72 if( (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
73 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW))
75 if(bt_rssi >= (rssi_thresh+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT))
77 bt_rssi_state = BTC_RSSI_STATE_HIGH;
78 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n"));
82 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
83 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n"));
88 if(bt_rssi < rssi_thresh)
90 bt_rssi_state = BTC_RSSI_STATE_LOW;
91 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n"));
95 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
96 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n"));
100 else if(level_num == 3)
102 if(rssi_thresh > rssi_thresh1)
104 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n"));
105 return coex_sta->pre_bt_rssi_state;
108 if( (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
109 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW))
111 if(bt_rssi >= (rssi_thresh+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT))
113 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
114 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n"));
118 bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
119 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n"));
122 else if( (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
123 (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM))
125 if(bt_rssi >= (rssi_thresh1+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT))
127 bt_rssi_state = BTC_RSSI_STATE_HIGH;
128 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n"));
130 else if(bt_rssi < rssi_thresh)
132 bt_rssi_state = BTC_RSSI_STATE_LOW;
133 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n"));
137 bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
138 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n"));
143 if(bt_rssi < rssi_thresh1)
145 bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
146 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n"));
150 bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
151 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n"));
156 coex_sta->pre_bt_rssi_state = bt_rssi_state;
158 return bt_rssi_state;
162 halbtc8812a1ant_WifiRssiState(
163 PBTC_COEXIST btcoexist,
171 u1Byte wifi_rssi_state;
173 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
177 if( (coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW) ||
178 (coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_STAY_LOW))
180 if(wifi_rssi >= (rssi_thresh+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT))
182 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
183 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n"));
187 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
188 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n"));
193 if(wifi_rssi < rssi_thresh)
195 wifi_rssi_state = BTC_RSSI_STATE_LOW;
196 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n"));
200 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
201 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n"));
205 else if(level_num == 3)
207 if(rssi_thresh > rssi_thresh1)
209 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n"));
210 return coex_sta->pre_wifi_rssi_state[index];
213 if( (coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_LOW) ||
214 (coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_STAY_LOW))
216 if(wifi_rssi >= (rssi_thresh+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT))
218 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
219 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n"));
223 wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
224 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n"));
227 else if( (coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_MEDIUM) ||
228 (coex_sta->pre_wifi_rssi_state[index] == BTC_RSSI_STATE_STAY_MEDIUM))
230 if(wifi_rssi >= (rssi_thresh1+BTC_RSSI_COEX_THRESH_TOL_8812A_1ANT))
232 wifi_rssi_state = BTC_RSSI_STATE_HIGH;
233 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n"));
235 else if(wifi_rssi < rssi_thresh)
237 wifi_rssi_state = BTC_RSSI_STATE_LOW;
238 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n"));
242 wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
243 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n"));
248 if(wifi_rssi < rssi_thresh1)
250 wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
251 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n"));
255 wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
256 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n"));
261 coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
263 return wifi_rssi_state;
267 halbtc8812a1ant_MonitorBtEnableDisable(
268 PBTC_COEXIST btcoexist
271 static BOOLEAN pre_bt_disabled=false;
272 static u4Byte bt_disable_cnt=0;
273 BOOLEAN bt_active=true, bt_disable_by68=false, bt_disabled=false;
276 // This function check if bt is disabled
278 if( coex_sta->high_priority_tx == 0 &&
279 coex_sta->high_priority_rx == 0 &&
280 coex_sta->low_priority_tx == 0 &&
281 coex_sta->low_priority_rx == 0)
285 if( coex_sta->high_priority_tx == 0xffff &&
286 coex_sta->high_priority_rx == 0xffff &&
287 coex_sta->low_priority_tx == 0xffff &&
288 coex_sta->low_priority_rx == 0xffff)
296 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE, &bt_disabled);
297 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is enabled !!\n"));
302 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], bt all counters=0, %d times!!\n",
304 if(bt_disable_cnt >= 2 ||bt_disable_by68)
307 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE, &bt_disabled);
308 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is disabled !!\n"));
311 if(pre_bt_disabled != bt_disabled)
313 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], BT is from %s to %s!!\n",
314 (pre_bt_disabled ? "disabled":"enabled"),
315 (bt_disabled ? "disabled":"enabled")));
316 pre_bt_disabled = bt_disabled;
327 halbtc8812a1ant_MonitorBtCtr(
328 PBTC_COEXIST btcoexist
331 u4Byte reg_hp_tx_rx, reg_lp_tx_rx, u4_tmp;
332 u4Byte reg_hp_tx=0, reg_hp_rx=0, reg_lp_tx=0, reg_lp_rx=0;
335 reg_hp_tx_rx = 0x770;
336 reg_lp_tx_rx = 0x774;
338 u4_tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_tx_rx);
339 reg_hp_tx = u4_tmp & bMaskLWord;
340 reg_hp_rx = (u4_tmp & bMaskHWord)>>16;
342 u4_tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_tx_rx);
343 reg_lp_tx = u4_tmp & bMaskLWord;
344 reg_lp_rx = (u4_tmp & bMaskHWord)>>16;
346 coex_sta->high_priority_tx = reg_hp_tx;
347 coex_sta->high_priority_rx = reg_hp_rx;
348 coex_sta->low_priority_tx = reg_lp_tx;
349 coex_sta->low_priority_rx = reg_lp_rx;
351 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], High Priority Tx/Rx (reg 0x%x)=%x(%d)/%x(%d)\n",
352 reg_hp_tx_rx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx));
353 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_MONITOR, ("[BTCoex], Low Priority Tx/Rx (reg 0x%x)=%x(%d)/%x(%d)\n",
354 reg_lp_tx_rx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx));
357 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
361 halbtc8812a1ant_QueryBtInfo(
362 PBTC_COEXIST btcoexist
367 static u4Byte btInfoCnt=0;
370 (coex_sta->bt_info_c2h_cnt[BT_INFO_SRC_8812A_1ANT_BT_RSP]-btInfoCnt)>2)
373 buf[1] = 0x1; // polling enable, 1=enable, 0=disable
374 buf[2] = 0x2; // polling time in seconds
375 buf[3] = 0x1; // auto report enable, 1=enable, 0=disable
377 btcoexist->btc_set(btcoexist, BTC_SET_ACT_CTRL_BT_INFO, (PVOID)&buf[0]);
379 btInfoCnt = coex_sta->bt_info_c2h_cnt[BT_INFO_SRC_8812A_1ANT_BT_RSP];
382 halbtc8812a1ant_ActionAlgorithm(
383 PBTC_COEXIST btcoexist
386 PBTC_STACK_INFO stack_info=&btcoexist->stack_info;
387 BOOLEAN bt_hs_on=false;
388 u1Byte algorithm=BT_8812A_1ANT_COEX_ALGO_UNDEFINED;
389 u1Byte num_of_diff_profile=0;
391 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
393 if(!stack_info->bt_link_exist)
395 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No profile exists!!!\n"));
399 if(stack_info->sco_exist)
400 num_of_diff_profile++;
401 if(stack_info->hid_exist)
402 num_of_diff_profile++;
403 if(stack_info->pan_exist)
404 num_of_diff_profile++;
405 if(stack_info->a2dp_exist)
406 num_of_diff_profile++;
408 if(num_of_diff_profile == 1)
410 if(stack_info->sco_exist)
412 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO only\n"));
413 algorithm = BT_8812A_1ANT_COEX_ALGO_SCO;
417 if(stack_info->hid_exist)
419 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n"));
420 algorithm = BT_8812A_1ANT_COEX_ALGO_HID;
422 else if(stack_info->a2dp_exist)
424 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n"));
425 algorithm = BT_8812A_1ANT_COEX_ALGO_A2DP;
427 else if(stack_info->pan_exist)
431 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(HS) only\n"));
432 algorithm = BT_8812A_1ANT_COEX_ALGO_PANHS;
436 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(EDR) only\n"));
437 algorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR;
442 else if(num_of_diff_profile == 2)
444 if(stack_info->sco_exist)
446 if(stack_info->hid_exist)
448 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID\n"));
449 algorithm = BT_8812A_1ANT_COEX_ALGO_HID;
451 else if(stack_info->a2dp_exist)
453 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP ==> SCO\n"));
454 algorithm = BT_8812A_1ANT_COEX_ALGO_SCO;
456 else if(stack_info->pan_exist)
460 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(HS)\n"));
461 algorithm = BT_8812A_1ANT_COEX_ALGO_SCO;
465 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(EDR)\n"));
466 algorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID;
472 if( stack_info->hid_exist &&
473 stack_info->a2dp_exist )
475 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n"));
476 algorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP;
478 else if( stack_info->hid_exist &&
479 stack_info->pan_exist )
483 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(HS)\n"));
484 algorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP;
488 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));
489 algorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID;
492 else if( stack_info->pan_exist &&
493 stack_info->a2dp_exist )
497 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));
498 algorithm = BT_8812A_1ANT_COEX_ALGO_A2DP_PANHS;
502 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));
503 algorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_A2DP;
508 else if(num_of_diff_profile == 3)
510 if(stack_info->sco_exist)
512 if( stack_info->hid_exist &&
513 stack_info->a2dp_exist )
515 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP ==> HID\n"));
516 algorithm = BT_8812A_1ANT_COEX_ALGO_HID;
518 else if( stack_info->hid_exist &&
519 stack_info->pan_exist )
523 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(HS)\n"));
524 algorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP;
528 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + PAN(EDR)\n"));
529 algorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID;
532 else if( stack_info->pan_exist &&
533 stack_info->a2dp_exist )
537 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(HS)\n"));
538 algorithm = BT_8812A_1ANT_COEX_ALGO_SCO;
542 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n"));
543 algorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID;
549 if( stack_info->hid_exist &&
550 stack_info->pan_exist &&
551 stack_info->a2dp_exist )
555 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));
556 algorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP;
560 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));
561 algorithm = BT_8812A_1ANT_COEX_ALGO_HID_A2DP_PANEDR;
566 else if(num_of_diff_profile >= 3)
568 if(stack_info->sco_exist)
570 if( stack_info->hid_exist &&
571 stack_info->pan_exist &&
572 stack_info->a2dp_exist )
576 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n"));
581 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n"));
582 algorithm = BT_8812A_1ANT_COEX_ALGO_PANEDR_HID;
592 halbtc8812a1ant_NeedToDecBtPwr(
593 PBTC_COEXIST btcoexist
597 BOOLEAN bt_hs_on=false, wifi_connected=false;
600 if(!btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on))
602 if(!btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, &wifi_connected))
604 if(!btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi))
613 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for HS mode!!\n"));
619 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], Need to decrease bt power for Wifi is connected!!\n"));
628 halbtc8812a1ant_SetFwDacSwingLevel(
629 PBTC_COEXIST btcoexist,
633 u1Byte h2c_parameter[1] ={0};
635 // There are several type of dacswing
636 // 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6
637 h2c_parameter[0] = dac_swing_lvl;
639 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], Set Dac Swing Level=0x%x\n", dac_swing_lvl));
640 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x64=0x%x\n", h2c_parameter[0]));
642 btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);
646 halbtc8812a1ant_SetFwDecBtPwr(
647 PBTC_COEXIST btcoexist,
654 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], decrease Bt Power : %s\n",
655 (dec_bt_pwr? "Yes!!":"No!!")));
658 buf[1] = 0x3; // OP_Code
659 buf[2] = 0x1; // OP_Code_Length
661 buf[3] = 0x1; // OP_Code_Content
665 btcoexist->btc_set(btcoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);
669 halbtc8812a1ant_DecBtPwr(
670 PBTC_COEXIST btcoexist,
676 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s Dec BT power = %s\n",
677 (force_exec? "force to":""), ((dec_bt_pwr)? "ON":"OFF")));
678 coex_dm->cur_dec_bt_pwr = dec_bt_pwr;
682 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], pre_dec_bt_pwr=%d, cur_dec_bt_pwr=%d\n",
683 coex_dm->pre_dec_bt_pwr, coex_dm->cur_dec_bt_pwr));
685 if(coex_dm->pre_dec_bt_pwr == coex_dm->cur_dec_bt_pwr)
688 halbtc8812a1ant_SetFwDecBtPwr(btcoexist, coex_dm->cur_dec_bt_pwr);
690 coex_dm->pre_dec_bt_pwr = coex_dm->cur_dec_bt_pwr;
694 halbtc8812a1ant_SetFwBtLnaConstrain(
695 PBTC_COEXIST btcoexist,
696 BOOLEAN bt_lna_cons_on
702 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set BT LNA Constrain: %s\n",
703 (bt_lna_cons_on? "ON!!":"OFF!!")));
706 buf[1] = 0x2; // OP_Code
707 buf[2] = 0x1; // OP_Code_Length
709 buf[3] = 0x1; // OP_Code_Content
713 btcoexist->btc_set(btcoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);
717 halbtc8812a1ant_SetBtLnaConstrain(
718 PBTC_COEXIST btcoexist,
720 BOOLEAN bt_lna_cons_on
723 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Constrain = %s\n",
724 (force_exec? "force":""), ((bt_lna_cons_on)? "ON":"OFF")));
725 coex_dm->bCurBtLnaConstrain = bt_lna_cons_on;
729 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtLnaConstrain=%d, bCurBtLnaConstrain=%d\n",
730 coex_dm->bPreBtLnaConstrain, coex_dm->bCurBtLnaConstrain));
732 if(coex_dm->bPreBtLnaConstrain == coex_dm->bCurBtLnaConstrain)
735 halbtc8812a1ant_SetFwBtLnaConstrain(btcoexist, coex_dm->bCurBtLnaConstrain);
737 coex_dm->bPreBtLnaConstrain = coex_dm->bCurBtLnaConstrain;
741 halbtc8812a1ant_SetFwBtPsdMode(
742 PBTC_COEXIST btcoexist,
749 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], set BT PSD mode=0x%x\n",
753 buf[1] = 0x4; // OP_Code
754 buf[2] = 0x1; // OP_Code_Length
755 buf[3] = bt_psd_mode; // OP_Code_Content
757 btcoexist->btc_set(btcoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);
762 halbtc8812a1ant_SetBtPsdMode(
763 PBTC_COEXIST btcoexist,
768 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT PSD mode = 0x%x\n",
769 (force_exec? "force":""), bt_psd_mode));
770 coex_dm->bCurBtPsdMode = bt_psd_mode;
774 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreBtPsdMode=0x%x, bCurBtPsdMode=0x%x\n",
775 coex_dm->bPreBtPsdMode, coex_dm->bCurBtPsdMode));
777 if(coex_dm->bPreBtPsdMode == coex_dm->bCurBtPsdMode)
780 halbtc8812a1ant_SetFwBtPsdMode(btcoexist, coex_dm->bCurBtPsdMode);
782 coex_dm->bPreBtPsdMode = coex_dm->bCurBtPsdMode;
787 halbtc8812a1ant_SetBtAutoReport(
788 PBTC_COEXIST btcoexist,
789 BOOLEAN enable_auto_report
793 u1Byte h2c_parameter[1] ={0};
795 h2c_parameter[0] = 0;
797 if(enable_auto_report)
799 h2c_parameter[0] |= BIT0;
802 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], BT FW auto report : %s, FW write 0x68=0x%x\n",
803 (enable_auto_report? "Enabled!!":"Disabled!!"), h2c_parameter[0]));
805 btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
812 halbtc8812a1ant_BtAutoReport(
813 PBTC_COEXIST btcoexist,
815 BOOLEAN enable_auto_report
818 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s BT Auto report = %s\n",
819 (force_exec? "force to":""), ((enable_auto_report)? "Enabled":"Disabled")));
820 coex_dm->cur_bt_auto_report = enable_auto_report;
824 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], pre_bt_auto_report=%d, cur_bt_auto_report=%d\n",
825 coex_dm->pre_bt_auto_report, coex_dm->cur_bt_auto_report));
827 if(coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
830 halbtc8812a1ant_SetBtAutoReport(btcoexist, coex_dm->cur_bt_auto_report);
832 coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
836 halbtc8812a1ant_FwDacSwingLvl(
837 PBTC_COEXIST btcoexist,
839 u1Byte fw_dac_swing_lvl
843 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set FW Dac Swing level = %d\n",
844 (force_exec? "force to":""), fw_dac_swing_lvl));
845 coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl;
849 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], pre_fw_dac_swing_lvl=%d, cur_fw_dac_swing_lvl=%d\n",
850 coex_dm->pre_fw_dac_swing_lvl, coex_dm->cur_fw_dac_swing_lvl));
852 if(coex_dm->pre_fw_dac_swing_lvl == coex_dm->cur_fw_dac_swing_lvl)
856 halbtc8812a1ant_SetFwDacSwingLevel(btcoexist, coex_dm->cur_fw_dac_swing_lvl);
858 coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;
862 halbtc8812a1ant_SetSwRfRxLpfCorner(
863 PBTC_COEXIST btcoexist,
864 BOOLEAN rx_rf_shrink_on
869 //Shrink RF Rx LPF corner
870 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Shrink RF Rx LPF corner!!\n"));
871 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e, 0xfffff, 0xf0ff7);
875 //Resume RF Rx LPF corner
876 // After initialized, we can use coex_dm->bt_rf0x1e_backup
877 if(btcoexist->bInitilized)
879 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n"));
880 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e, 0xfffff, coex_dm->bt_rf0x1e_backup);
886 halbtc8812a1ant_RfShrink(
887 PBTC_COEXIST btcoexist,
889 BOOLEAN rx_rf_shrink_on
892 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn Rx RF Shrink = %s\n",
893 (force_exec? "force to":""), ((rx_rf_shrink_on)? "ON":"OFF")));
894 coex_dm->cur_rf_rx_lpf_shrink = rx_rf_shrink_on;
898 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], pre_rf_rx_lpf_shrink=%d, cur_rf_rx_lpf_shrink=%d\n",
899 coex_dm->pre_rf_rx_lpf_shrink, coex_dm->cur_rf_rx_lpf_shrink));
901 if(coex_dm->pre_rf_rx_lpf_shrink == coex_dm->cur_rf_rx_lpf_shrink)
904 halbtc8812a1ant_SetSwRfRxLpfCorner(btcoexist, coex_dm->cur_rf_rx_lpf_shrink);
906 coex_dm->pre_rf_rx_lpf_shrink = coex_dm->cur_rf_rx_lpf_shrink;
910 halbtc8812a1ant_SetSwPenaltyTxRateAdaptive(
911 PBTC_COEXIST btcoexist,
912 BOOLEAN low_penalty_ra
917 u1_tmp = btcoexist->btc_read_1byte(btcoexist, 0x4fd);
921 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set low penalty!!\n"));
926 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Tx rate adaptive, set normal!!\n"));
930 btcoexist->btc_write_1byte(btcoexist, 0x4fd, u1_tmp);
934 halbtc8812a1ant_LowPenaltyRa(
935 PBTC_COEXIST btcoexist,
937 BOOLEAN low_penalty_ra
941 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn LowPenaltyRA = %s\n",
942 (force_exec? "force to":""), ((low_penalty_ra)? "ON":"OFF")));
943 coex_dm->cur_low_penalty_ra = low_penalty_ra;
947 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], pre_low_penalty_ra=%d, cur_low_penalty_ra=%d\n",
948 coex_dm->pre_low_penalty_ra, coex_dm->cur_low_penalty_ra));
950 if(coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
953 halbtc8812a1ant_SetSwPenaltyTxRateAdaptive(btcoexist, coex_dm->cur_low_penalty_ra);
955 coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
959 halbtc8812a1ant_SetDacSwingReg(
960 PBTC_COEXIST btcoexist,
964 u1Byte val=(u1Byte)level;
966 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Write SwDacSwing = 0x%x\n", level));
967 btcoexist->btc_write_1byte_bitmask(btcoexist, 0xc5b, 0x3e, val);
971 halbtc8812a1ant_SetSwFullTimeDacSwing(
972 PBTC_COEXIST btcoexist,
973 BOOLEAN sw_dac_swing_on,
974 u4Byte sw_dac_swing_lvl
979 halbtc8812a1ant_SetDacSwingReg(btcoexist, sw_dac_swing_lvl);
983 halbtc8812a1ant_SetDacSwingReg(btcoexist, 0x18);
989 halbtc8812a1ant_DacSwing(
990 PBTC_COEXIST btcoexist,
992 BOOLEAN dac_swing_on,
996 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn DacSwing=%s, dac_swing_lvl=0x%x\n",
997 (force_exec? "force to":""), ((dac_swing_on)? "ON":"OFF"), dac_swing_lvl));
998 coex_dm->cur_dac_swing_on = dac_swing_on;
999 coex_dm->cur_dac_swing_lvl = dac_swing_lvl;
1003 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], pre_dac_swing_on=%d, pre_dac_swing_lvl=0x%x, cur_dac_swing_on=%d, cur_dac_swing_lvl=0x%x\n",
1004 coex_dm->pre_dac_swing_on, coex_dm->pre_dac_swing_lvl,
1005 coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl));
1007 if( (coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) &&
1008 (coex_dm->pre_dac_swing_lvl == coex_dm->cur_dac_swing_lvl) )
1012 halbtc8812a1ant_SetSwFullTimeDacSwing(btcoexist, dac_swing_on, dac_swing_lvl);
1014 coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on;
1015 coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl;
1019 halbtc8812a1ant_SetAdcBackOff(
1020 PBTC_COEXIST btcoexist,
1021 BOOLEAN adc_back_off
1026 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level On!\n"));
1027 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x8db, 0x60, 0x3);
1031 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB BackOff Level Off!\n"));
1032 btcoexist->btc_write_1byte_bitmask(btcoexist, 0x8db, 0x60, 0x1);
1037 halbtc8812a1ant_AdcBackOff(
1038 PBTC_COEXIST btcoexist,
1040 BOOLEAN adc_back_off
1043 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s turn AdcBackOff = %s\n",
1044 (force_exec? "force to":""), ((adc_back_off)? "ON":"OFF")));
1045 coex_dm->cur_adc_back_off = adc_back_off;
1049 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], pre_adc_back_off=%d, cur_adc_back_off=%d\n",
1050 coex_dm->pre_adc_back_off, coex_dm->cur_adc_back_off));
1052 if(coex_dm->pre_adc_back_off == coex_dm->cur_adc_back_off)
1055 halbtc8812a1ant_SetAdcBackOff(btcoexist, coex_dm->cur_adc_back_off);
1057 coex_dm->pre_adc_back_off = coex_dm->cur_adc_back_off;
1061 halbtc8812a1ant_SetAgcTable(
1062 PBTC_COEXIST btcoexist,
1063 BOOLEAN agc_table_en
1066 u1Byte rssi_adjust_val=0;
1068 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);
1071 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n"));
1072 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b, 0xfffff, 0x3fa58);
1073 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b, 0xfffff, 0x37a58);
1074 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b, 0xfffff, 0x2fa58);
1075 rssi_adjust_val = 8;
1079 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n"));
1080 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b, 0xfffff, 0x39258);
1081 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b, 0xfffff, 0x31258);
1082 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b, 0xfffff, 0x29258);
1084 btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);
1086 // set rssi_adjust_val for wifi module.
1087 btcoexist->btc_set(btcoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssi_adjust_val);
1092 halbtc8812a1ant_AgcTable(
1093 PBTC_COEXIST btcoexist,
1095 BOOLEAN agc_table_en
1098 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s %s Agc Table\n",
1099 (force_exec? "force to":""), ((agc_table_en)? "Enable":"Disable")));
1100 coex_dm->cur_agc_table_en = agc_table_en;
1104 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], pre_agc_table_en=%d, cur_agc_table_en=%d\n",
1105 coex_dm->pre_agc_table_en, coex_dm->cur_agc_table_en));
1107 if(coex_dm->pre_agc_table_en == coex_dm->cur_agc_table_en)
1110 halbtc8812a1ant_SetAgcTable(btcoexist, agc_table_en);
1112 coex_dm->pre_agc_table_en = coex_dm->cur_agc_table_en;
1116 halbtc8812a1ant_SetCoexTable(
1117 PBTC_COEXIST btcoexist,
1124 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0));
1125 btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
1127 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4));
1128 btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
1130 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8));
1131 btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
1133 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc));
1134 btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
1138 halbtc8812a1ant_CoexTable(
1139 PBTC_COEXIST btcoexist,
1147 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW, ("[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n",
1148 (force_exec? "force to":""), val0x6c0, val0x6c4, val0x6c8, val0x6cc));
1149 coex_dm->cur_val0x6c0 = val0x6c0;
1150 coex_dm->cur_val0x6c4 = val0x6c4;
1151 coex_dm->cur_val0x6c8 = val0x6c8;
1152 coex_dm->cur_val0x6cc = val0x6cc;
1156 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], pre_val0x6c0=0x%x, pre_val0x6c4=0x%x, pre_val0x6c8=0x%x, pre_val0x6cc=0x%x !!\n",
1157 coex_dm->pre_val0x6c0, coex_dm->pre_val0x6c4, coex_dm->pre_val0x6c8, coex_dm->pre_val0x6cc));
1158 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_DETAIL, ("[BTCoex], cur_val0x6c0=0x%x, cur_val0x6c4=0x%x, cur_val0x6c8=0x%x, cur_val0x6cc=0x%x !!\n",
1159 coex_dm->cur_val0x6c0, coex_dm->cur_val0x6c4, coex_dm->cur_val0x6c8, coex_dm->cur_val0x6cc));
1161 if( (coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
1162 (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
1163 (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
1164 (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc) )
1167 halbtc8812a1ant_SetCoexTable(btcoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);
1169 coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
1170 coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
1171 coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
1172 coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
1176 halbtc8812a1ant_SetFwIgnoreWlanAct(
1177 PBTC_COEXIST btcoexist,
1182 u1Byte buf[5] = {0};
1184 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], %s BT Ignore Wlan_Act\n",
1185 (enable? "Enable":"Disable")));
1188 buf[1] = 0x1; // OP_Code
1189 buf[2] = 0x1; // OP_Code_Length
1191 buf[3] = 0x1; // OP_Code_Content
1195 btcoexist->btc_set(btcoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);
1199 halbtc8812a1ant_IgnoreWlanAct(
1200 PBTC_COEXIST btcoexist,
1205 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn Ignore WlanAct %s\n",
1206 (force_exec? "force to":""), (enable? "ON":"OFF")));
1207 coex_dm->cur_ignore_wlan_act = enable;
1211 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], pre_ignore_wlan_act = %d, cur_ignore_wlan_act = %d!!\n",
1212 coex_dm->pre_ignore_wlan_act, coex_dm->cur_ignore_wlan_act));
1214 if(coex_dm->pre_ignore_wlan_act == coex_dm->cur_ignore_wlan_act)
1217 halbtc8812a1ant_SetFwIgnoreWlanAct(btcoexist, enable);
1219 coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
1223 halbtc8812a1ant_SetFwPstdma(
1224 PBTC_COEXIST btcoexist,
1232 u1Byte h2c_parameter[5] ={0};
1234 h2c_parameter[0] = byte1;
1235 h2c_parameter[1] = byte2;
1236 h2c_parameter[2] = byte3;
1237 h2c_parameter[3] = byte4;
1238 h2c_parameter[4] = byte5;
1240 coex_dm->ps_tdma_para[0] = byte1;
1241 coex_dm->ps_tdma_para[1] = byte2;
1242 coex_dm->ps_tdma_para[2] = byte3;
1243 coex_dm->ps_tdma_para[3] = byte4;
1244 coex_dm->ps_tdma_para[4] = byte5;
1246 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_EXEC, ("[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n",
1248 h2c_parameter[1]<<24|h2c_parameter[2]<<16|h2c_parameter[3]<<8|h2c_parameter[4]));
1250 btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
1254 halbtc8812a1ant_SetLpsRpwm(
1255 PBTC_COEXIST btcoexist,
1261 u1Byte rpwm=rpwm_val;
1263 btcoexist->btc_set(btcoexist, BTC_SET_U1_1ANT_LPS, &lps);
1264 btcoexist->btc_set(btcoexist, BTC_SET_U1_1ANT_RPWM, &rpwm);
1266 btcoexist->btc_set(btcoexist, BTC_SET_ACT_INC_FORCE_EXEC_PWR_CMD_CNT, NULL);
1270 halbtc8812a1ant_LpsRpwm(
1271 PBTC_COEXIST btcoexist,
1277 BOOLEAN bForceExecPwrCmd=false;
1279 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s set lps/rpwm=0x%x/0x%x \n",
1280 (force_exec? "force to":""), lps_val, rpwm_val));
1281 coex_dm->cur_lps = lps_val;
1282 coex_dm->cur_rpwm = rpwm_val;
1286 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], pre_lps/cur_lps=0x%x/0x%x, pre_rpwm/cur_rpwm=0x%x/0x%x!!\n",
1287 coex_dm->pre_lps, coex_dm->cur_lps, coex_dm->pre_rpwm, coex_dm->cur_rpwm));
1289 if( (coex_dm->pre_lps == coex_dm->cur_lps) &&
1290 (coex_dm->pre_rpwm == coex_dm->cur_rpwm) )
1295 halbtc8812a1ant_SetLpsRpwm(btcoexist, lps_val, rpwm_val);
1297 coex_dm->pre_lps = coex_dm->cur_lps;
1298 coex_dm->pre_rpwm = coex_dm->cur_rpwm;
1302 halbtc8812a1ant_SwMechanism1(
1303 PBTC_COEXIST btcoexist,
1304 BOOLEAN shrink_rx_lpf,
1305 BOOLEAN low_penalty_ra,
1306 BOOLEAN limited_dig,
1307 BOOLEAN bt_lna_constrain
1310 //halbtc8812a1ant_RfShrink(btcoexist, NORMAL_EXEC, shrink_rx_lpf);
1311 //halbtc8812a1ant_LowPenaltyRa(btcoexist, NORMAL_EXEC, low_penalty_ra);
1314 //halbtc8812a1ant_SetBtLnaConstrain(btcoexist, NORMAL_EXEC, bt_lna_constrain);
1318 halbtc8812a1ant_SwMechanism2(
1319 PBTC_COEXIST btcoexist,
1320 BOOLEAN agc_table_shift,
1321 BOOLEAN adc_back_off,
1322 BOOLEAN sw_dac_swing,
1323 u4Byte dac_swing_lvl
1326 //halbtc8812a1ant_AgcTable(btcoexist, NORMAL_EXEC, agc_table_shift);
1327 //halbtc8812a1ant_AdcBackOff(btcoexist, NORMAL_EXEC, adc_back_off);
1328 //halbtc8812a1ant_DacSwing(btcoexist, NORMAL_EXEC, sw_dac_swing, dac_swing_lvl);
1332 halbtc8812a1ant_PsTdma(
1333 PBTC_COEXIST btcoexist,
1339 BOOLEAN bTurnOnByCnt=false;
1340 u1Byte psTdmaTypeByCnt=0, rssi_adjust_val=0;
1342 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], %s turn %s PS TDMA, type=%d\n",
1343 (force_exec? "force to":""), (turn_on? "ON":"OFF"), type));
1344 coex_dm->cur_ps_tdma_on = turn_on;
1345 coex_dm->cur_ps_tdma = type;
1349 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], pre_ps_tdma_on = %d, cur_ps_tdma_on = %d!!\n",
1350 coex_dm->pre_ps_tdma_on, coex_dm->cur_ps_tdma_on));
1351 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], pre_ps_tdma = %d, cur_ps_tdma = %d!!\n",
1352 coex_dm->pre_ps_tdma, coex_dm->cur_ps_tdma));
1354 if( (coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
1355 (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma) )
1363 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xd3, 0x1a, 0x1a, 0x0, 0x58);
1366 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xd3, 0x1a, 0x1a, 0x0, 0x48);
1367 rssi_adjust_val = 11;
1370 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xd3, 0x12, 0x12, 0x0, 0x48);
1371 rssi_adjust_val = 14;
1374 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x93, 0x25, 0x3, 0x10, 0x40);
1377 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x93, 0x15, 0x3, 0x14, 0x0);
1378 rssi_adjust_val = 17;
1381 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x61, 0x15, 0x3, 0x31, 0x0);
1384 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x13, 0xa, 0x3, 0x0, 0x0);
1387 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x13, 0xc, 0x5, 0x0, 0x0);
1390 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x93, 0x25, 0x3, 0x10, 0x0);
1393 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xd3, 0xa, 0xa, 0x0, 0x48);
1394 rssi_adjust_val = 18;
1397 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x13, 0xa, 0xa, 0x0, 0x40);
1400 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xd3, 0x5, 0x5, 0x0, 0x48);
1401 rssi_adjust_val = 20;
1404 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xeb, 0xa, 0x3, 0x31, 0x18);
1408 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x13, 0xa, 0x3, 0x8, 0x0);
1411 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x93, 0x15, 0x3, 0x10, 0x0);
1412 rssi_adjust_val = 18;
1416 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x93, 0x25, 0x3, 0x10, 0x0);
1417 rssi_adjust_val = 14;
1421 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x13, 0x25, 0x25, 0x0, 0x0);
1424 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x93, 0x20, 0x3, 0x10, 0x40);
1427 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x13, 0x8, 0x8, 0x0, 0x40);
1430 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xe3, 0x25, 0x3, 0x31, 0x18);
1431 rssi_adjust_val = 22;
1434 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xe3, 0x15, 0x3, 0x31, 0x18);
1435 rssi_adjust_val = 22;
1438 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);
1439 rssi_adjust_val = 22;
1442 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xe3, 0xa, 0x3, 0x31, 0x18);
1443 rssi_adjust_val = 22;
1446 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xe3, 0x25, 0x3, 0x31, 0x98);
1447 rssi_adjust_val = 22;
1450 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x69, 0x25, 0x3, 0x31, 0x0);
1453 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xab, 0x1a, 0x1a, 0x1, 0x8);
1456 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x93, 0x15, 0x3, 0x14, 0x0);
1459 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xd3, 0x1a, 0x1a, 0, 0x58);
1462 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xab, 0xa, 0x3, 0x31, 0x88);
1465 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xa3, 0x25, 0x3, 0x30, 0x88);
1468 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xd3, 0x1a, 0x1a, 0x0, 0x8);
1471 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xe3, 0x1a, 0x1a, 0x0, 0x8);
1474 halbtc8812a1ant_SetFwPstdma(btcoexist, 0xd3, 0x12, 0x3, 0x14, 0x58);
1484 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x8, 0x0, 0x0, 0x0, 0x0);
1485 btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x4);
1489 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x0, 0x0, 0x0, 0x0, 0x0);
1491 btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x20);
1494 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x0, 0x0, 0x0, 0x0, 0x0);
1495 btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x4);
1498 halbtc8812a1ant_SetFwPstdma(btcoexist, 0x0, 0x0, 0x0, 0x8, 0x0);
1500 btcoexist->btc_write_1byte(btcoexist, 0x92c, 0x20);
1505 btcoexist->btc_set(btcoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssi_adjust_val);
1508 coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
1509 coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
1513 halbtc8812a1ant_CoexAllOff(
1514 PBTC_COEXIST btcoexist
1518 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 6);
1519 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
1522 halbtc8812a1ant_SwMechanism1(btcoexist,false,false,false,false);
1523 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
1527 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
1531 halbtc8812a1ant_WifiParaAdjust(
1532 PBTC_COEXIST btcoexist,
1538 halbtc8812a1ant_LowPenaltyRa(btcoexist, NORMAL_EXEC, true);
1542 halbtc8812a1ant_LowPenaltyRa(btcoexist, NORMAL_EXEC, false);
1547 halbtc8812a1ant_IsCommonAction(
1548 PBTC_COEXIST btcoexist
1551 BOOLEAN common=false, wifi_connected=false, wifi_busy=false;
1553 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
1554 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
1556 //halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
1558 if(!wifi_connected &&
1559 BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == coex_dm->bt_status)
1561 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n"));
1562 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 6);
1563 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
1565 halbtc8812a1ant_SwMechanism1(btcoexist,false,false,false,false);
1566 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
1570 else if(wifi_connected &&
1571 (BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == coex_dm->bt_status) )
1573 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n"));
1574 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 6);
1575 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, true);
1577 halbtc8812a1ant_SwMechanism1(btcoexist,false,false,false,false);
1578 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
1582 else if(!wifi_connected &&
1583 (BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status) )
1585 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT connected-idle!!\n"));
1586 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 6);
1587 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
1589 halbtc8812a1ant_SwMechanism1(btcoexist,false,false,false,false);
1590 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
1594 else if(wifi_connected &&
1595 (BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status) )
1597 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n"));
1598 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 6);
1599 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
1601 halbtc8812a1ant_SwMechanism1(btcoexist,true,true,true,true);
1602 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
1606 else if(!wifi_connected &&
1607 (BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE != coex_dm->bt_status) )
1609 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non connected-idle + BT Busy!!\n"));
1610 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 6);
1611 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
1613 halbtc8812a1ant_SwMechanism1(btcoexist,false,false,false,false);
1614 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
1620 halbtc8812a1ant_SwMechanism1(btcoexist,true,true,true,true);
1630 halbtc8812a1ant_TdmaDurationAdjustForAcl(
1631 PBTC_COEXIST btcoexist
1634 static s4Byte up,dn,m,n,wait_count;
1635 s4Byte result; //0: no change, +1: increase WiFi duration, -1: decrease WiFi duration
1636 u1Byte retry_count=0, bt_info_ext;
1638 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], halbtc8812a1ant_TdmaDurationAdjustForAcl()\n"));
1639 if(coex_dm->reset_tdma_adjust)
1641 coex_dm->reset_tdma_adjust = false;
1642 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n"));
1644 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 2);
1645 coex_dm->ps_tdma_du_adj_type = 2;
1656 //accquire the BT TRx retry count from BT_Info byte2
1657 retry_count = coex_sta->bt_retry_cnt;
1658 bt_info_ext = coex_sta->bt_info_ext;
1659 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retry_count = %d\n", retry_count));
1660 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], up=%d, dn=%d, m=%d, n=%d, wait_count=%d\n",
1661 up, dn, m, n, wait_count));
1665 if(retry_count == 0) // no retry in the last 2-second duration
1673 if(up >= n) // if ³sÄò n Ó2¬í retry count¬°0, «h½Õ¼eWiFi duration
1680 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n"));
1683 else if (retry_count <= 3) // <=3 retry in the last 2-second duration
1691 if (dn == 2) // if ³sÄò 2 Ó2¬í retry count< 3, «h½Õ¯¶WiFi duration
1693 if (wait_count <= 2)
1694 m++; // ÁקK¤@ª½¦b¨âÓlevel¤¤¨Ó¦^
1698 if ( m >= 20) //m ³Ì¤jÈ = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration.
1706 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n"));
1709 else //retry count > 3, ¥un1¦¸ retry count > 3, «h½Õ¯¶WiFi duration
1711 if (wait_count == 1)
1712 m++; // ÁקK¤@ª½¦b¨âÓlevel¤¤¨Ó¦^
1716 if ( m >= 20) //m ³Ì¤jÈ = 20 ' ³Ì¤j120¬í recheck¬O§_½Õ¾ã WiFi duration.
1724 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n"));
1729 if( (BT_INFO_8812A_1ANT_A2DP_BASIC_RATE(bt_info_ext)) &&
1730 ((coex_dm->cur_ps_tdma == 1) ||(coex_dm->cur_ps_tdma == 2)) )
1732 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 9);
1733 coex_dm->ps_tdma_du_adj_type = 9;
1735 else if(coex_dm->cur_ps_tdma == 1)
1737 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 2);
1738 coex_dm->ps_tdma_du_adj_type = 2;
1740 else if(coex_dm->cur_ps_tdma == 2)
1742 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 9);
1743 coex_dm->ps_tdma_du_adj_type = 9;
1745 else if(coex_dm->cur_ps_tdma == 9)
1747 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 11);
1748 coex_dm->ps_tdma_du_adj_type = 11;
1751 else if(result == 1)
1753 if( (BT_INFO_8812A_1ANT_A2DP_BASIC_RATE(bt_info_ext)) &&
1754 ((coex_dm->cur_ps_tdma == 1) ||(coex_dm->cur_ps_tdma == 2)) )
1756 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 9);
1757 coex_dm->ps_tdma_du_adj_type = 9;
1759 else if(coex_dm->cur_ps_tdma == 11)
1761 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 9);
1762 coex_dm->ps_tdma_du_adj_type = 9;
1764 else if(coex_dm->cur_ps_tdma == 9)
1766 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 2);
1767 coex_dm->ps_tdma_du_adj_type = 2;
1769 else if(coex_dm->cur_ps_tdma == 2)
1771 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 1);
1772 coex_dm->ps_tdma_du_adj_type = 1;
1776 if( coex_dm->cur_ps_tdma != 1 &&
1777 coex_dm->cur_ps_tdma != 2 &&
1778 coex_dm->cur_ps_tdma != 9 &&
1779 coex_dm->cur_ps_tdma != 11 )
1781 // recover to previous adjust type
1782 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, coex_dm->ps_tdma_du_adj_type);
1788 halbtc8812a1ant_PsTdmaTypeByWifiRssi(
1790 s4Byte pre_wifi_rssi,
1791 u1Byte wifi_rssi_thresh
1794 u1Byte ps_tdma_type=0;
1796 if(wifi_rssi > pre_wifi_rssi)
1798 if(wifi_rssi > (wifi_rssi_thresh+5))
1809 if(wifi_rssi > wifi_rssi_thresh)
1819 return ps_tdma_type;
1823 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(
1824 PBTC_COEXIST btcoexist,
1825 BOOLEAN new_ps_state
1828 u1Byte lps_mode=0x0;
1830 btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
1832 if(lps_mode) // already under LPS state
1836 // keep state under LPS, do nothing.
1840 // will leave LPS state, turn off psTdma first
1841 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 0);
1848 // will enter LPS state, turn off psTdma first
1849 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 0);
1853 // keep state under NO PS state, do nothing.
1858 // SCO only or SCO+PAN(HS)
1860 halbtc8812a1ant_ActionSco(
1861 PBTC_COEXIST btcoexist
1864 u1Byte wifi_rssi_state;
1867 wifi_rssi_state = halbtc8812a1ant_WifiRssiState(btcoexist, 0, 2, 25, 0);
1869 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 4);
1871 if(halbtc8812a1ant_NeedToDecBtPwr(btcoexist))
1872 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, true);
1874 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
1876 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
1878 if(BTC_WIFI_BW_HT40 == wifi_bw)
1881 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
1882 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
1884 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
1888 halbtc8812a1ant_SwMechanism2(btcoexist,false,true,false,0x18);
1894 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
1895 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
1897 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
1901 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
1908 halbtc8812a1ant_ActionHid(
1909 PBTC_COEXIST btcoexist
1912 u1Byte wifi_rssi_state, bt_rssi_state;
1915 wifi_rssi_state = halbtc8812a1ant_WifiRssiState(btcoexist, 0, 2, 25, 0);
1916 bt_rssi_state = halbtc8812a1ant_BtRssiState(2, 50, 0);
1918 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 6);
1920 if(halbtc8812a1ant_NeedToDecBtPwr(btcoexist))
1921 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, true);
1923 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
1925 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
1927 if(BTC_WIFI_BW_HT40 == wifi_bw)
1930 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
1931 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
1933 halbtc8812a1ant_SwMechanism2(btcoexist,true,false,false,0x18);
1937 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
1943 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
1944 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
1946 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
1950 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
1955 //A2DP only / PAN(EDR) only/ A2DP+PAN(HS)
1957 halbtc8812a1ant_ActionA2dp(
1958 PBTC_COEXIST btcoexist
1961 u1Byte wifi_rssi_state, bt_rssi_state;
1964 wifi_rssi_state = halbtc8812a1ant_WifiRssiState(btcoexist, 0, 2, 25, 0);
1965 bt_rssi_state = halbtc8812a1ant_BtRssiState(2, 50, 0);
1967 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 6);
1969 if(halbtc8812a1ant_NeedToDecBtPwr(btcoexist))
1970 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, true);
1972 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
1974 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
1976 if(BTC_WIFI_BW_HT40 == wifi_bw)
1979 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
1980 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
1982 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
1986 halbtc8812a1ant_SwMechanism2(btcoexist,false,true,false,0x18);
1992 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
1993 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
1995 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
1999 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
2005 halbtc8812a1ant_ActionA2dpPanHs(
2006 PBTC_COEXIST btcoexist
2009 u1Byte wifi_rssi_state, bt_rssi_state, bt_info_ext;
2012 bt_info_ext = coex_sta->bt_info_ext;
2013 wifi_rssi_state = halbtc8812a1ant_WifiRssiState(btcoexist, 0, 2, 25, 0);
2014 bt_rssi_state = halbtc8812a1ant_BtRssiState(2, 50, 0);
2016 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 6);
2018 if(halbtc8812a1ant_NeedToDecBtPwr(btcoexist))
2019 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, true);
2021 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
2023 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2025 if(BTC_WIFI_BW_HT40 == wifi_bw)
2028 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2029 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2031 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
2035 halbtc8812a1ant_SwMechanism2(btcoexist,false,true,false,0x18);
2041 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2042 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2044 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
2048 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
2054 halbtc8812a1ant_ActionPanEdr(
2055 PBTC_COEXIST btcoexist
2058 u1Byte wifi_rssi_state, bt_rssi_state;
2061 wifi_rssi_state = halbtc8812a1ant_WifiRssiState(btcoexist, 0, 2, 25, 0);
2062 bt_rssi_state = halbtc8812a1ant_BtRssiState(2, 50, 0);
2064 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 6);
2066 if(halbtc8812a1ant_NeedToDecBtPwr(btcoexist))
2067 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, true);
2069 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
2071 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2073 if(BTC_WIFI_BW_HT40 == wifi_bw)
2076 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2077 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2079 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
2083 halbtc8812a1ant_SwMechanism2(btcoexist,false,true,false,0x18);
2089 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2090 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2092 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
2096 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
2104 halbtc8812a1ant_ActionPanHs(
2105 PBTC_COEXIST btcoexist
2108 u1Byte wifi_rssi_state, bt_rssi_state;
2111 wifi_rssi_state = halbtc8812a1ant_WifiRssiState(btcoexist, 0, 2, 25, 0);
2112 bt_rssi_state = halbtc8812a1ant_BtRssiState(2, 50, 0);
2114 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 6);
2116 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2118 if(BTC_WIFI_BW_HT40 == wifi_bw)
2121 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2122 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2124 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, true);
2128 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
2132 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2133 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2135 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
2139 halbtc8812a1ant_SwMechanism2(btcoexist,false,true,false,0x18);
2145 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2146 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2148 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, true);
2152 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
2156 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2157 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2159 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
2163 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
2170 halbtc8812a1ant_ActionPanEdrA2dp(
2171 PBTC_COEXIST btcoexist
2174 u1Byte wifi_rssi_state, bt_rssi_state, bt_info_ext;
2177 bt_info_ext = coex_sta->bt_info_ext;
2178 wifi_rssi_state = halbtc8812a1ant_WifiRssiState(btcoexist, 0, 2, 25, 0);
2179 bt_rssi_state = halbtc8812a1ant_BtRssiState(2, 50, 0);
2181 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 6);
2183 if(halbtc8812a1ant_NeedToDecBtPwr(btcoexist))
2184 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, true);
2186 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
2188 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2190 if(BTC_WIFI_BW_HT40 == wifi_bw)
2193 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2194 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2196 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
2200 halbtc8812a1ant_SwMechanism2(btcoexist,false,true,false,0x18);
2206 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2207 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2209 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
2213 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
2219 halbtc8812a1ant_ActionPanEdrHid(
2220 PBTC_COEXIST btcoexist
2223 u1Byte wifi_rssi_state, bt_rssi_state;
2226 wifi_rssi_state = halbtc8812a1ant_WifiRssiState(btcoexist, 0, 2, 25, 0);
2227 bt_rssi_state = halbtc8812a1ant_BtRssiState(2, 50, 0);
2229 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 6);
2231 if(halbtc8812a1ant_NeedToDecBtPwr(btcoexist))
2232 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, true);
2234 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
2236 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2238 if(BTC_WIFI_BW_HT40 == wifi_bw)
2241 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2242 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2244 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
2248 halbtc8812a1ant_SwMechanism2(btcoexist,false,true,false,0x18);
2254 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2255 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2257 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
2261 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
2266 // HID+A2DP+PAN(EDR)
2268 halbtc8812a1ant_ActionHidA2dpPanEdr(
2269 PBTC_COEXIST btcoexist
2272 u1Byte wifi_rssi_state, bt_rssi_state, bt_info_ext;
2275 bt_info_ext = coex_sta->bt_info_ext;
2276 wifi_rssi_state = halbtc8812a1ant_WifiRssiState(btcoexist, 0, 2, 25, 0);
2277 bt_rssi_state = halbtc8812a1ant_BtRssiState(2, 50, 0);
2279 halbtc8812a1ant_FwDacSwingLvl(btcoexist, NORMAL_EXEC, 6);
2281 if(halbtc8812a1ant_NeedToDecBtPwr(btcoexist))
2282 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, true);
2284 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
2286 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2288 if(BTC_WIFI_BW_HT40 == wifi_bw)
2291 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2292 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2294 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
2298 halbtc8812a1ant_SwMechanism2(btcoexist,false,true,false,0x18);
2304 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2305 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2307 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
2311 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
2317 halbtc8812a1ant_ActionHidA2dp(
2318 PBTC_COEXIST btcoexist
2321 u1Byte wifi_rssi_state, bt_rssi_state, bt_info_ext;
2324 bt_info_ext = coex_sta->bt_info_ext;
2325 wifi_rssi_state = halbtc8812a1ant_WifiRssiState(btcoexist, 0, 2, 25, 0);
2326 bt_rssi_state = halbtc8812a1ant_BtRssiState(2, 50, 0);
2328 if(halbtc8812a1ant_NeedToDecBtPwr(btcoexist))
2329 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, true);
2331 halbtc8812a1ant_DecBtPwr(btcoexist, NORMAL_EXEC, false);
2333 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
2335 if(BTC_WIFI_BW_HT40 == wifi_bw)
2338 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2339 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2341 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
2345 halbtc8812a1ant_SwMechanism2(btcoexist,false,true,false,0x18);
2351 if( (wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
2352 (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH) )
2354 halbtc8812a1ant_SwMechanism2(btcoexist,true,true,false,0x18);
2358 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
2364 halbtc8812a1ant_ActionHs(
2365 PBTC_COEXIST btcoexist,
2366 BOOLEAN hs_connecting
2369 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action for HS, hs_connecting=%d!!!\n", hs_connecting));
2370 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 8);
2374 halbtc8812a1ant_CoexTable(btcoexist, FORCE_EXEC, 0xaaaaaaaa, 0xaaaaaaaa, 0xffff, 0x3);
2378 if((coex_sta->high_priority_tx+coex_sta->high_priority_rx+
2379 coex_sta->low_priority_tx+coex_sta->low_priority_rx)<=1200)
2380 halbtc8812a1ant_CoexTable(btcoexist, FORCE_EXEC, 0xaaaaaaaa, 0xaaaaaaaa, 0xffff, 0x3);
2382 halbtc8812a1ant_CoexTable(btcoexist, FORCE_EXEC, 0xffffffff, 0xffffffff, 0xffff, 0x3);
2388 halbtc8812a1ant_ActionWifiNotConnected(
2389 PBTC_COEXIST btcoexist
2392 BOOLEAN hs_connecting=false;
2394 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_CONNECTING, &hs_connecting);
2396 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
2397 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
2401 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HS is connecting!!!\n"));
2402 halbtc8812a1ant_ActionHs(btcoexist, hs_connecting);
2406 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 8);
2407 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2412 halbtc8812a1ant_ActionWifiNotConnectedAssoAuthScan(
2413 PBTC_COEXIST btcoexist
2416 PBTC_STACK_INFO stack_info=&btcoexist->stack_info;
2417 BOOLEAN hs_connecting=false;
2419 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_CONNECTING, &hs_connecting);
2420 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
2421 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
2425 halbtc8812a1ant_ActionHs(btcoexist, hs_connecting);
2427 else if(btcoexist->bt_info.bt_disabled)
2429 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 9);
2430 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2432 else if(BT_8812A_1ANT_BT_STATUS_INQ_PAGE == coex_dm->bt_status)
2434 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 30);
2435 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2437 else if( (BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == coex_dm->bt_status) ||
2438 (BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status) )
2440 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 28);
2441 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2443 else if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status)
2445 if(stack_info->hid_exist)
2446 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 35);
2448 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 29);
2449 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2451 else if( (BT_8812A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
2452 (BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status) )
2454 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 8);
2455 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x5aea5aea, 0x5aea5aea, 0xffff, 0x3);
2459 //error condition, should not reach here, record error number for debugging.
2460 coex_dm->error_condition = 1;
2465 halbtc8812a1ant_ActionWifiConnectedScan(
2466 PBTC_COEXIST btcoexist
2469 PBTC_STACK_INFO stack_info=&btcoexist->stack_info;
2471 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ActionConnectedScan()===>\n"));
2473 if(btcoexist->bt_info.bt_disabled)
2475 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
2476 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
2477 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 9);
2478 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2482 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, true);
2483 halbtc8812a1ant_LpsRpwm(btcoexist, NORMAL_EXEC, 0x0, 0x4);
2484 // power save must executed before psTdma.
2485 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
2488 if(BT_8812A_1ANT_BT_STATUS_INQ_PAGE == coex_dm->bt_status)
2490 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ActionConnectedScan(), bt is under inquiry/page scan\n"));
2491 if(stack_info->sco_exist)
2493 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 32);
2494 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2498 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 30);
2499 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2502 else if( (BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == coex_dm->bt_status) ||
2503 (BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status) )
2505 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 5);
2506 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2508 else if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status)
2510 if(stack_info->hid_exist)
2512 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 34);
2513 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2517 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 4);
2518 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2521 else if( (BT_8812A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
2522 (BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status) )
2524 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 33);
2525 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2529 //error condition, should not reach here
2530 coex_dm->error_condition = 2;
2533 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ActionConnectedScan()<===\n"));
2537 halbtc8812a1ant_ActionWifiConnectedSpecialPacket(
2538 PBTC_COEXIST btcoexist
2541 PBTC_STACK_INFO stack_info=&btcoexist->stack_info;
2543 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
2544 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
2546 if(btcoexist->bt_info.bt_disabled)
2548 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 9);
2549 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2553 if(BT_8812A_1ANT_BT_STATUS_INQ_PAGE == coex_dm->bt_status)
2555 if(stack_info->sco_exist)
2557 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 32);
2558 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2562 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 30);
2563 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2566 else if( (BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == coex_dm->bt_status) ||
2567 (BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status) )
2569 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 28);
2570 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2572 else if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status)
2574 if(stack_info->hid_exist)
2575 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 35);
2577 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 29);
2578 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2580 else if( (BT_8812A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
2581 (BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status) )
2583 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 8);
2584 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x5aea5aea, 0x5aea5aea, 0xffff, 0x3);
2588 //error condition, should not reach here
2589 coex_dm->error_condition = 3;
2595 halbtc8812a1ant_ActionWifiConnected(
2596 PBTC_COEXIST btcoexist
2599 PBTC_STACK_INFO stack_info=&btcoexist->stack_info;
2600 BOOLEAN wifi_connected=false, wifi_busy=false, bt_hs_on=false;
2601 BOOLEAN scan=false, link=false, roam=false;
2602 BOOLEAN hs_connecting=false, under4way=false;
2605 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect()===>\n"));
2607 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
2610 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi not connected<===\n"));
2614 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &under4way);
2617 halbtc8812a1ant_ActionWifiConnectedSpecialPacket(btcoexist);
2618 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi is under 4way<===\n"));
2622 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_CONNECTING, &hs_connecting);
2623 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
2624 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
2625 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
2626 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
2627 if(scan || link || roam)
2629 halbtc8812a1ant_ActionWifiConnectedScan(btcoexist);
2630 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect(), return for wifi is under scan<===\n"));
2634 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
2637 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi associated-idle!!!\n"));
2638 if(btcoexist->bt_info.bt_disabled)
2640 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, true);
2641 halbtc8812a1ant_LpsRpwm(btcoexist, NORMAL_EXEC, 0x0, 0x4);
2642 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
2643 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 9);
2644 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2648 if(BT_8812A_1ANT_BT_STATUS_INQ_PAGE == coex_dm->bt_status)
2650 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], bt is under inquiry/page scan!!!\n"));
2651 if(stack_info->sco_exist)
2653 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 32);
2654 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2658 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, true);
2659 halbtc8812a1ant_LpsRpwm(btcoexist, NORMAL_EXEC, 0x0, 0x4);
2660 // power save must executed before psTdma.
2661 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
2662 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 30);
2663 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2666 else if(BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == coex_dm->bt_status)
2668 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, true);
2669 halbtc8812a1ant_LpsRpwm(btcoexist, NORMAL_EXEC, 0x26, 0x0);
2670 // power save must executed before psTdma.
2671 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
2672 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 9);
2673 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2675 else if(BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)
2677 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, true);
2678 halbtc8812a1ant_LpsRpwm(btcoexist, NORMAL_EXEC, 0x26, 0x0);
2679 // power save must executed before psTdma.
2680 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
2681 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 0);
2682 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2684 else if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status)
2686 if(stack_info->hid_exist && stack_info->numOfLink==1)
2689 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
2690 // power save must executed before psTdma.
2691 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
2693 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 8);
2694 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x5fff5fff, 0x5fff5fff, 0xffff, 0x3);
2695 coex_dm->reset_tdma_adjust = true;
2699 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, true);
2700 halbtc8812a1ant_LpsRpwm(btcoexist, NORMAL_EXEC, 0x0, 0x4);
2701 // power save must executed before psTdma.
2702 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
2704 if(stack_info->hid_exist)
2706 if(stack_info->a2dp_exist)
2709 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 2);
2710 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2712 else if(stack_info->pan_exist)
2717 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 2);
2722 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 2);
2724 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2728 coex_dm->error_condition = 4;
2730 coex_dm->reset_tdma_adjust = true;
2732 else if(stack_info->a2dp_exist)
2734 if(stack_info->pan_exist)
2739 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 2);
2744 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 36);
2746 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2747 coex_dm->reset_tdma_adjust = true;
2752 halbtc8812a1ant_TdmaDurationAdjustForAcl(btcoexist);
2753 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2756 else if(stack_info->pan_exist)
2761 coex_dm->error_condition = 5;
2765 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 2);
2766 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2768 coex_dm->reset_tdma_adjust = true;
2772 // temp state, do nothing!!!
2773 //DbgPrint("error 6, coex_dm->bt_status=%d\n", coex_dm->bt_status);
2774 //DbgPrint("error 6, stack_info->numOfLink=%d, stack_info->hid_exist=%d, stack_info->a2dp_exist=%d, stack_info->pan_exist=%d, stack_info->sco_exist=%d\n",
2775 //stack_info->numOfLink, stack_info->hid_exist, stack_info->a2dp_exist, stack_info->pan_exist, stack_info->sco_exist);
2776 //coex_dm->error_condition = 6;
2780 else if( (BT_8812A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
2781 (BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status) )
2783 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
2784 // power save must executed before psTdma.
2785 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
2787 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 8);
2788 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x5aea5aea, 0x5aea5aea, 0xffff, 0x3);
2792 //error condition, should not reach here
2793 coex_dm->error_condition = 7;
2799 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi busy!!!\n"));
2800 if(btcoexist->bt_info.bt_disabled)
2802 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
2803 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
2804 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 9);
2805 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2811 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HS is under progress!!!\n"));
2812 //DbgPrint("coex_dm->bt_status = 0x%x\n", coex_dm->bt_status);
2813 halbtc8812a1ant_ActionHs(btcoexist, hs_connecting);
2815 else if(BT_8812A_1ANT_BT_STATUS_INQ_PAGE == coex_dm->bt_status)
2817 if(stack_info->sco_exist)
2819 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 32);
2820 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2824 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, true);
2825 halbtc8812a1ant_LpsRpwm(btcoexist, NORMAL_EXEC, 0x0, 0x4);
2826 // power save must executed before psTdma.
2827 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
2828 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 30);
2829 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
2832 else if(BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == coex_dm->bt_status)
2834 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
2835 // power save must executed before psTdma.
2836 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
2837 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 5);
2838 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x5a5a5a5a, 0x5a5a5a5a, 0xffff, 0x3);
2840 else if(BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)
2842 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
2843 // power save must executed before psTdma.
2844 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
2847 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HS is under progress!!!\n"));
2848 halbtc8812a1ant_ActionHs(btcoexist, hs_connecting);
2852 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 5);
2853 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x5a5a5a5a, 0x5a5a5a5a, 0xffff, 0x3);
2856 else if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status)
2858 if(stack_info->hid_exist && stack_info->numOfLink==1)
2861 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
2862 // power save must executed before psTdma.
2863 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
2865 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 8);
2866 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x5fff5fff, 0x5fff5fff, 0xffff, 0x3);
2867 coex_dm->reset_tdma_adjust = true;
2871 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, true);
2872 halbtc8812a1ant_LpsRpwm(btcoexist, NORMAL_EXEC, 0x0, 0x4);
2873 // power save must executed before psTdma.
2874 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
2876 if(stack_info->hid_exist)
2878 if(stack_info->a2dp_exist)
2881 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 2);
2882 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2884 else if(stack_info->pan_exist)
2889 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 2);
2894 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 2);
2896 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2900 coex_dm->error_condition = 8;
2902 coex_dm->reset_tdma_adjust = true;
2904 else if(stack_info->a2dp_exist)
2906 if(stack_info->pan_exist)
2911 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 2);
2916 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 36);
2918 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2919 coex_dm->reset_tdma_adjust = true;
2924 halbtc8812a1ant_TdmaDurationAdjustForAcl(btcoexist);
2925 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2928 else if(stack_info->pan_exist)
2933 coex_dm->error_condition = 9;
2937 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, true, 2);
2938 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
2940 coex_dm->reset_tdma_adjust = true;
2944 //DbgPrint("error 10, stack_info->numOfLink=%d, stack_info->hid_exist=%d, stack_info->a2dp_exist=%d, stack_info->pan_exist=%d, stack_info->sco_exist=%d\n",
2945 //stack_info->numOfLink, stack_info->hid_exist, stack_info->a2dp_exist, stack_info->pan_exist, stack_info->sco_exist);
2946 coex_dm->error_condition = 10;
2950 else if( (BT_8812A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
2951 (BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status) )
2953 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
2954 // power save must executed before psTdma.
2955 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
2957 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 8);
2958 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x5aea5aea, 0x5aea5aea, 0xffff, 0x3);
2962 //DbgPrint("error 11, coex_dm->bt_status=%d\n", coex_dm->bt_status);
2963 //DbgPrint("error 11, stack_info->numOfLink=%d, stack_info->hid_exist=%d, stack_info->a2dp_exist=%d, stack_info->pan_exist=%d, stack_info->sco_exist=%d\n",
2964 //stack_info->numOfLink, stack_info->hid_exist, stack_info->a2dp_exist, stack_info->pan_exist, stack_info->sco_exist);
2965 //error condition, should not reach here
2966 coex_dm->error_condition = 11;
2970 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], CoexForWifiConnect()<===\n"));
2974 halbtc8812a1ant_RunSwCoexistMechanism(
2975 PBTC_COEXIST btcoexist
2978 PBTC_STACK_INFO stack_info=&btcoexist->stack_info;
2979 BOOLEAN wifi_under5g=false, wifi_busy=false, wifi_connected=false;
2980 u1Byte bt_info_original=0, bt_retry_cnt=0;
2984 if(stack_info->bProfileNotified)
2986 algorithm = halbtc8812a1ant_ActionAlgorithm(btcoexist);
2987 coex_dm->cur_algorithm = algorithm;
2988 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Algorithm = %d \n", coex_dm->cur_algorithm));
2990 if(halbtc8812a1ant_IsCommonAction(btcoexist))
2992 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action common.\n"));
2996 switch(coex_dm->cur_algorithm)
2998 case BT_8812A_1ANT_COEX_ALGO_SCO:
2999 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = SCO.\n"));
3000 halbtc8812a1ant_ActionSco(btcoexist);
3002 case BT_8812A_1ANT_COEX_ALGO_HID:
3003 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID.\n"));
3004 halbtc8812a1ant_ActionHid(btcoexist);
3006 case BT_8812A_1ANT_COEX_ALGO_A2DP:
3007 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP.\n"));
3008 halbtc8812a1ant_ActionA2dp(btcoexist);
3010 case BT_8812A_1ANT_COEX_ALGO_A2DP_PANHS:
3011 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = A2DP+PAN(HS).\n"));
3012 halbtc8812a1ant_ActionA2dpPanHs(btcoexist);
3014 case BT_8812A_1ANT_COEX_ALGO_PANEDR:
3015 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR).\n"));
3016 halbtc8812a1ant_ActionPanEdr(btcoexist);
3018 case BT_8812A_1ANT_COEX_ALGO_PANHS:
3019 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HS mode.\n"));
3020 halbtc8812a1ant_ActionPanHs(btcoexist);
3022 case BT_8812A_1ANT_COEX_ALGO_PANEDR_A2DP:
3023 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN+A2DP.\n"));
3024 halbtc8812a1ant_ActionPanEdrA2dp(btcoexist);
3026 case BT_8812A_1ANT_COEX_ALGO_PANEDR_HID:
3027 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = PAN(EDR)+HID.\n"));
3028 halbtc8812a1ant_ActionPanEdrHid(btcoexist);
3030 case BT_8812A_1ANT_COEX_ALGO_HID_A2DP_PANEDR:
3031 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP+PAN.\n"));
3032 halbtc8812a1ant_ActionHidA2dpPanEdr(btcoexist);
3034 case BT_8812A_1ANT_COEX_ALGO_HID_A2DP:
3035 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = HID+A2DP.\n"));
3036 halbtc8812a1ant_ActionHidA2dp(btcoexist);
3039 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action algorithm = coexist All Off!!\n"));
3040 halbtc8812a1ant_CoexAllOff(btcoexist);
3043 coex_dm->pre_algorithm = coex_dm->cur_algorithm;
3049 halbtc8812a1ant_RunCoexistMechanism(
3050 PBTC_COEXIST btcoexist
3053 PBTC_STACK_INFO stack_info=&btcoexist->stack_info;
3054 BOOLEAN wifi_under5g=false, wifi_busy=false, wifi_connected=false;
3056 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism()===>\n"));
3058 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under5g);
3062 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for 5G <===\n"));
3066 if(btcoexist->manual_control)
3068 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n"));
3072 if(btcoexist->stop_coex_dm)
3074 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n"));
3078 halbtc8812a1ant_RunSwCoexistMechanism(btcoexist);
3080 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
3081 if(btcoexist->bt_info.bt_disabled)
3083 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], bt is disabled!!!\n"));
3084 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3087 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
3088 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
3089 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 9);
3093 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, true);
3094 halbtc8812a1ant_LpsRpwm(btcoexist, NORMAL_EXEC, 0x0, 0x4);
3095 // power save must executed before psTdma.
3096 btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS, NULL);
3097 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 9);
3099 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
3101 else if(coex_sta->under_ips)
3103 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is under IPS !!!\n"));
3104 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 0);
3105 halbtc8812a1ant_CoexTable(btcoexist, NORMAL_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
3106 halbtc8812a1ant_WifiParaAdjust(btcoexist, false);
3108 else if(!wifi_connected)
3110 BOOLEAN scan=false, link=false, roam=false;
3112 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is non connected-idle !!!\n"));
3114 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3115 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3116 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3118 if(scan || link || roam)
3119 halbtc8812a1ant_ActionWifiNotConnectedAssoAuthScan(btcoexist);
3121 halbtc8812a1ant_ActionWifiNotConnected(btcoexist);
3123 else // wifi LPS/Busy
3125 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is NOT under IPS!!!\n"));
3126 halbtc8812a1ant_WifiParaAdjust(btcoexist, true);
3127 halbtc8812a1ant_ActionWifiConnected(btcoexist);
3129 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism()<===\n"));
3133 halbtc8812a1ant_InitCoexDm(
3134 PBTC_COEXIST btcoexist
3137 BOOLEAN wifi_connected=false;
3138 // force to reset coex mechanism
3140 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
3141 if(!wifi_connected) // non-connected scan
3143 halbtc8812a1ant_ActionWifiNotConnected(btcoexist);
3145 else // wifi is connected
3147 halbtc8812a1ant_ActionWifiConnected(btcoexist);
3150 halbtc8812a1ant_FwDacSwingLvl(btcoexist, FORCE_EXEC, 6);
3151 halbtc8812a1ant_DecBtPwr(btcoexist, FORCE_EXEC, false);
3154 halbtc8812a1ant_SwMechanism1(btcoexist,false,false,false,false);
3155 halbtc8812a1ant_SwMechanism2(btcoexist,false,false,false,0x18);
3157 halbtc8812a1ant_CoexTable(btcoexist, FORCE_EXEC, 0x55555555, 0x55555555, 0xffff, 0x3);
3160 //============================================================
3161 // work around function start with wa_halbtc8812a1ant_
3162 //============================================================
3163 //============================================================
3164 // extern function start with EXhalbtc8812a1ant_
3165 //============================================================
3167 EXhalbtc8812a1ant_InitHwConfig(
3168 PBTC_COEXIST btcoexist
3175 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 1Ant Init HW Config!!\n"));
3177 // backup rf 0x1e value
3178 coex_dm->bt_rf0x1e_backup =
3179 btcoexist->btc_get_rf_reg(btcoexist, BTC_RF_A, 0x1e, 0xfffff);
3181 //ant sw control to BT
3182 btcoexist->btc_write_4byte(btcoexist, 0x900, 0x00000400);
3183 btcoexist->btc_write_1byte(btcoexist, 0x76d, 0x1);
3184 btcoexist->btc_write_1byte(btcoexist, 0xcb3, 0x77);
3185 btcoexist->btc_write_1byte(btcoexist, 0xcb7, 0x40);
3188 u1_tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
3191 btcoexist->btc_write_1byte(btcoexist, 0x790, u1_tmp);
3194 btcoexist->btc_write_1byte(btcoexist, 0x6cc, 0x0);
3195 btcoexist->btc_write_4byte(btcoexist, 0x6c8, 0xffff);
3196 btcoexist->btc_write_4byte(btcoexist, 0x6c4, 0x55555555);
3197 btcoexist->btc_write_4byte(btcoexist, 0x6c0, 0x55555555);
3200 btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1);
3202 // enable counter statistics
3203 btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
3206 btcoexist->btc_write_1byte(btcoexist, 0x40, 0x20);
3209 u1_tmp = btcoexist->btc_read_1byte(btcoexist, 0x4);
3211 btcoexist->btc_write_1byte(btcoexist, 0x4, u1_tmp);
3214 u1_tmp = btcoexist->btc_read_1byte(btcoexist, 0x7);
3216 btcoexist->btc_write_1byte(btcoexist, 0x7, u1_tmp);
3220 EXhalbtc8812a1ant_InitCoexDm(
3221 PBTC_COEXIST btcoexist
3224 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n"));
3226 btcoexist->stop_coex_dm = false;
3228 halbtc8812a1ant_InitCoexDm(btcoexist);
3232 EXhalbtc8812a1ant_DisplayCoexInfo(
3233 PBTC_COEXIST btcoexist
3236 PBTC_BOARD_INFO board_info=&btcoexist->boardInfo;
3237 PBTC_STACK_INFO stack_info=&btcoexist->stack_info;
3238 pu1Byte cli_buf=btcoexist->cli_buf;
3239 u1Byte u1_tmp[4], i, bt_info_ext, psTdmaCase=0;
3241 BOOLEAN roam=false, scan=false, link=false, wifi_under5g=false;
3242 BOOLEAN bt_hs_on=false, wifi_busy=false;
3243 s4Byte wifi_rssi=0, bt_hs_rssi=0;
3244 u4Byte wifi_bw, wifiTrafficDir;
3245 u1Byte wifiDot11Chnl, wifiHsChnl;
3247 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");
3250 if(btcoexist->manual_control)
3252 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n ============[Under Manual Control]============");
3254 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n ==========================================");
3257 if(btcoexist->stop_coex_dm)
3259 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n ============[Coex is STOPPED]============");
3261 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n ==========================================");
3265 if(!board_info->bBtExist)
3267 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n BT not exists !!!");
3272 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \
3273 board_info->pgAntNum, board_info->btdmAntNum);
3276 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %d", "BT stack/ hci ext ver", \
3277 ((stack_info->bProfileNotified)? "Yes":"No"), stack_info->hciVersion);
3279 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_FW_VER);
3281 btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
3282 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);
3283 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);
3284 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsChnl(HsMode)", \
3285 wifiDot11Chnl, wifiHsChnl, bt_hs_on);
3288 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \
3289 coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1],
3290 coex_dm->wifi_chnl_info[2]);
3293 btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
3294 btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
3295 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "Wifi rssi/ HS rssi", \
3296 wifi_rssi, bt_hs_rssi);
3299 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
3300 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
3301 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
3302 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d ", "Wifi link/ roam/ scan", \
3306 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under5g);
3307 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3308 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
3309 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);
3310 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s / %s/ %s ", "Wifi status", \
3311 (wifi_under5g? "5G":"2.4G"),
3312 ((BTC_WIFI_BW_LEGACY==wifi_bw)? "Legacy": (((BTC_WIFI_BW_HT40==wifi_bw)? "HT40":"HT20"))),
3313 ((!wifi_busy)? "idle": ((BTC_WIFI_TRAFFIC_TX==wifiTrafficDir)? "uplink":"downlink")));
3315 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \
3316 ((coex_sta->c2h_bt_inquiry_page)?("inquiry/page scan"):((BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE == coex_dm->bt_status)? "non-connected idle":
3317 ( (BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)? "connected-idle":"busy"))),
3318 coex_sta->bt_rssi, coex_sta->bt_retry_cnt);
3321 if(stack_info->bProfileNotified)
3323 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \
3324 stack_info->sco_exist, stack_info->hid_exist, stack_info->pan_exist, stack_info->a2dp_exist);
3327 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO);
3330 bt_info_ext = coex_sta->bt_info_ext;
3331 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s", "BT Info A2DP rate", \
3332 (bt_info_ext&BIT0)? "Basic rate":"EDR rate");
3335 for(i=0; i<BT_INFO_SRC_8812A_1ANT_MAX; i++)
3337 if(coex_sta->bt_info_c2h_cnt[i])
3339 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)", GLBtInfoSrc8812a1Ant[i], \
3340 coex_sta->bt_info_c2h[i][0], coex_sta->bt_info_c2h[i][1],
3341 coex_sta->bt_info_c2h[i][2], coex_sta->bt_info_c2h[i][3],
3342 coex_sta->bt_info_c2h[i][4], coex_sta->bt_info_c2h[i][5],
3343 coex_sta->bt_info_c2h[i][6], coex_sta->bt_info_c2h_cnt[i]);
3347 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/%s, (0x%x/0x%x)", "PS state, IPS/LPS, (lps/rpwm)", \
3348 ((coex_sta->under_ips? "IPS ON":"IPS OFF")),
3349 ((coex_sta->under_lps? "LPS ON":"LPS OFF")),
3350 btcoexist->bt_info.lps1Ant,
3351 btcoexist->bt_info.rpwm1Ant);
3353 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);
3355 if(!btcoexist->manual_control)
3358 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Sw mechanism]============");
3361 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d ", "SM1[ShRf/ LpRA/ LimDig/ btLna]", \
3362 coex_dm->cur_rf_rx_lpf_shrink, coex_dm->cur_low_penalty_ra, coex_dm->limited_dig, coex_dm->bCurBtLnaConstrain);
3364 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d(0x%x) ", "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]", \
3365 coex_dm->cur_agc_table_en, coex_dm->cur_adc_back_off, coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl);
3369 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw mechanism]============");
3372 psTdmaCase = coex_dm->cur_ps_tdma;
3373 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x %02x %02x case-%d", "PS TDMA", \
3374 coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1],
3375 coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3],
3376 coex_dm->ps_tdma_para[4], psTdmaCase);
3379 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x ", "Latest error condition(should be 0)", \
3380 coex_dm->error_condition);
3383 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d ", "DecBtPwr/ IgnWlanAct", \
3384 coex_dm->cur_dec_bt_pwr, coex_dm->cur_ignore_wlan_act);
3389 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw setting]============");
3392 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "RF-A, 0x1e initVal", \
3393 coex_dm->bt_rf0x1e_backup);
3396 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
3397 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0x778", \
3401 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x92c);
3402 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x930);
3403 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x92c/ 0x930", \
3404 (u1_tmp[0]), u4_tmp[0]);
3407 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x40);
3408 u1_tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x4f);
3409 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x40/ 0x4f", \
3410 u1_tmp[0], u1_tmp[1]);
3413 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
3414 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
3415 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0x550(bcn ctrl)/0x522", \
3416 u4_tmp[0], u1_tmp[0]);
3419 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
3420 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x", "0xc50(dig)", \
3425 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xf48);
3426 u4_tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xf4c);
3427 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x", "0xf48/ 0xf4c (FA cnt)", \
3428 u4_tmp[0], u4_tmp[1]);
3432 u4_tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
3433 u4_tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
3434 u4_tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
3435 u1_tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
3436 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)", \
3437 u4_tmp[0], u4_tmp[1], u4_tmp[2], u1_tmp[0]);
3440 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x770(hp rx[31:16]/tx[15:0])", \
3441 coex_sta->high_priority_rx, coex_sta->high_priority_tx);
3443 CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d", "0x774(lp rx[31:16]/tx[15:0])", \
3444 coex_sta->low_priority_rx, coex_sta->low_priority_tx);
3447 btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS);
3452 EXhalbtc8812a1ant_IpsNotify(
3453 PBTC_COEXIST btcoexist,
3459 if(btcoexist->manual_control || btcoexist->stop_coex_dm)
3462 if(BTC_IPS_ENTER == type)
3464 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n"));
3465 coex_sta->under_ips = true;
3468 u4_tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
3470 btcoexist->btc_write_4byte(btcoexist, 0x4c, u4_tmp);
3472 halbtc8812a1ant_CoexAllOff(btcoexist);
3474 else if(BTC_IPS_LEAVE == type)
3476 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));
3477 coex_sta->under_ips = false;
3478 //halbtc8812a1ant_InitCoexDm(btcoexist);
3483 EXhalbtc8812a1ant_LpsNotify(
3484 PBTC_COEXIST btcoexist,
3488 if(btcoexist->manual_control || btcoexist->stop_coex_dm)
3491 if(BTC_LPS_ENABLE == type)
3493 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n"));
3494 coex_sta->under_lps = true;
3496 else if(BTC_IPS_LEAVE == type)
3498 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n"));
3499 coex_sta->under_lps = false;
3504 EXhalbtc8812a1ant_ScanNotify(
3505 PBTC_COEXIST btcoexist,
3509 PBTC_STACK_INFO stack_info=&btcoexist->stack_info;
3510 BOOLEAN wifi_connected=false;
3512 if(btcoexist->manual_control ||btcoexist->stop_coex_dm)
3515 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
3516 if(BTC_SCAN_START == type)
3518 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));
3519 if(!wifi_connected) // non-connected scan
3521 //set 0x550[3]=1 before PsTdma
3522 //halbtc8812a1ant_Reg0x550Bit3(btcoexist, true);
3523 halbtc8812a1ant_ActionWifiNotConnectedAssoAuthScan(btcoexist);
3525 else // wifi is connected
3527 halbtc8812a1ant_ActionWifiConnectedScan(btcoexist);
3530 else if(BTC_SCAN_FINISH == type)
3532 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));
3533 if(!wifi_connected) // non-connected scan
3535 //halbtc8812a1ant_Reg0x550Bit3(btcoexist, false);
3536 halbtc8812a1ant_ActionWifiNotConnected(btcoexist);
3540 halbtc8812a1ant_ActionWifiConnected(btcoexist);
3546 EXhalbtc8812a1ant_ConnectNotify(
3547 PBTC_COEXIST btcoexist,
3551 PBTC_STACK_INFO stack_info=&btcoexist->stack_info;
3552 BOOLEAN wifi_connected=false;
3554 if(btcoexist->manual_control ||btcoexist->stop_coex_dm)
3557 if(BTC_ASSOCIATE_START == type)
3559 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));
3560 if(btcoexist->bt_info.bt_disabled)
3562 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
3563 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
3564 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 9);
3568 halbtc8812a1ant_ActionWifiNotConnectedAssoAuthScan(btcoexist);
3571 else if(BTC_ASSOCIATE_FINISH == type)
3573 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));
3575 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
3576 if(!wifi_connected) // non-connected scan
3578 //halbtc8812a1ant_Reg0x550Bit3(btcoexist, false);
3579 halbtc8812a1ant_ActionWifiNotConnected(btcoexist);
3583 halbtc8812a1ant_ActionWifiConnected(btcoexist);
3589 EXhalbtc8812a1ant_MediaStatusNotify(
3590 PBTC_COEXIST btcoexist,
3595 u1Byte buf[6] = {0};
3596 u1Byte h2c_parameter[3] ={0};
3597 BOOLEAN wifi_under5g=false;
3599 u1Byte wifi_central_chnl;
3601 if(btcoexist->manual_control ||btcoexist->stop_coex_dm)
3604 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under5g);
3606 // only 2.4G we need to inform bt the chnl mask
3609 if(BTC_MEDIA_CONNECT == type)
3611 h2c_parameter[0] = 0x1;
3613 btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
3614 btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifi_central_chnl);
3615 h2c_parameter[1] = wifi_central_chnl;
3616 if(BTC_WIFI_BW_HT40 == wifi_bw)
3617 h2c_parameter[2] = 0x30;
3619 h2c_parameter[2] = 0x20;
3622 coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
3623 coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
3624 coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
3627 buf[1] = 0x5; // OP_Code
3628 buf[2] = 0x3; // OP_Code_Length
3629 buf[3] = h2c_parameter[0]; // OP_Code_Content
3630 buf[4] = h2c_parameter[1];
3631 buf[5] = h2c_parameter[2];
3633 btcoexist->btc_set(btcoexist, BTC_SET_ACT_CTRL_BT_COEX, (PVOID)&buf[0]);
3637 EXhalbtc8812a1ant_SpecialPacketNotify(
3638 PBTC_COEXIST btcoexist,
3642 BOOLEAN bSecurityLink=false;
3644 if(btcoexist->manual_control ||btcoexist->stop_coex_dm)
3647 //if(type == BTC_PACKET_DHCP)
3649 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], special Packet(%d) notify\n", type));
3650 if(btcoexist->bt_info.bt_disabled)
3652 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
3653 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
3654 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 9);
3658 halbtc8812a1ant_ActionWifiConnectedSpecialPacket(btcoexist);
3664 EXhalbtc8812a1ant_BtInfoNotify(
3665 PBTC_COEXIST btcoexist,
3671 u1Byte i, rsp_source=0;
3672 static u4Byte set_bt_lna_cnt=0, set_bt_psd_mode=0;
3673 BOOLEAN bt_busy=false, limited_dig=false;
3674 BOOLEAN wifi_connected=false;
3675 BOOLEAN bRejApAggPkt=false;
3677 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify()===>\n"));
3680 rsp_source = tmp_buf[0]&0xf;
3681 if(rsp_source >= BT_INFO_SRC_8812A_1ANT_MAX)
3682 rsp_source = BT_INFO_SRC_8812A_1ANT_WIFI_FW;
3683 coex_sta->bt_info_c2h_cnt[rsp_source]++;
3685 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length=%d, hex data=[", rsp_source, length));
3686 for(i=0; i<length; i++)
3688 coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
3690 bt_info = tmp_buf[i];
3693 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%2x]\n", tmp_buf[i]));
3697 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%2x, ", tmp_buf[i]));
3701 if(btcoexist->manual_control)
3703 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n"));
3706 if(btcoexist->stop_coex_dm)
3708 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), return for Coex STOPPED!!<===\n"));
3712 if(BT_INFO_SRC_8812A_1ANT_WIFI_FW != rsp_source)
3714 coex_sta->bt_retry_cnt =
3715 coex_sta->bt_info_c2h[rsp_source][2];
3718 coex_sta->bt_info_c2h[rsp_source][3]*2+10;
3720 coex_sta->bt_info_ext =
3721 coex_sta->bt_info_c2h[rsp_source][4];
3723 // Here we need to resend some wifi info to BT
3724 // because bt is reset and loss of the info.
3725 if( (coex_sta->bt_info_ext & BIT1) )
3727 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED, &wifi_connected);
3730 EXhalbtc8812a1ant_MediaStatusNotify(btcoexist, BTC_MEDIA_CONNECT);
3734 EXhalbtc8812a1ant_MediaStatusNotify(btcoexist, BTC_MEDIA_DISCONNECT);
3737 set_bt_psd_mode = 0;
3740 // test-chip bt patch doesn't support, temporary remove.
3741 // need to add back when mp-chip. 12/20/2012
3743 if(set_bt_psd_mode <= 3)
3745 halbtc8812a1ant_SetBtPsdMode(btcoexist, FORCE_EXEC, 0xd);
3749 if(coex_dm->bCurBtLnaConstrain)
3751 if( (coex_sta->bt_info_ext & BIT2) )
3756 if(set_bt_lna_cnt <= 3)
3758 halbtc8812a1ant_SetBtLnaConstrain(btcoexist, FORCE_EXEC, true);
3768 // test-chip bt patch only rsp the status for BT_RSP,
3769 // so temporary we consider the following only under BT_RSP
3770 if(BT_INFO_SRC_8812A_1ANT_BT_RSP == rsp_source)
3772 if( (coex_sta->bt_info_ext & BIT3) )
3774 #if 0// temp disable because bt patch report the wrong value.
3775 halbtc8812a1ant_IgnoreWlanAct(btcoexist, FORCE_EXEC, false);
3780 // BT already NOT ignore Wlan active, do nothing here.
3783 if( (coex_sta->bt_info_ext & BIT4) )
3785 // BT auto report already enabled, do nothing
3789 halbtc8812a1ant_BtAutoReport(btcoexist, FORCE_EXEC, true);
3794 // check BIT2 first ==> check if bt is under inquiry or page scan
3795 if(bt_info & BT_INFO_8812A_1ANT_B_INQ_PAGE)
3797 coex_sta->c2h_bt_inquiry_page = true;
3798 coex_dm->bt_status = BT_8812A_1ANT_BT_STATUS_INQ_PAGE;
3802 coex_sta->c2h_bt_inquiry_page = false;
3803 if(!(bt_info&BT_INFO_8812A_1ANT_B_CONNECTION))
3805 coex_dm->bt_status = BT_8812A_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
3806 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt non-connected idle!!!\n"));
3808 else if(bt_info == BT_INFO_8812A_1ANT_B_CONNECTION) // connection exists but no busy
3810 coex_dm->bt_status = BT_8812A_1ANT_BT_STATUS_CONNECTED_IDLE;
3811 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt connected-idle!!!\n"));
3813 else if((bt_info&BT_INFO_8812A_1ANT_B_SCO_ESCO) ||
3814 (bt_info&BT_INFO_8812A_1ANT_B_SCO_BUSY))
3816 coex_dm->bt_status = BT_8812A_1ANT_BT_STATUS_SCO_BUSY;
3817 bRejApAggPkt = true;
3818 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt sco busy!!!\n"));
3820 else if(bt_info&BT_INFO_8812A_1ANT_B_ACL_BUSY)
3822 if(BT_8812A_1ANT_BT_STATUS_ACL_BUSY != coex_dm->bt_status)
3823 coex_dm->reset_tdma_adjust = true;
3824 coex_dm->bt_status = BT_8812A_1ANT_BT_STATUS_ACL_BUSY;
3825 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt acl busy!!!\n"));
3828 else if(bt_info&BT_INFO_8812A_1ANT_B_SCO_ESCO)
3830 coex_dm->bt_status = BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY;
3831 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt acl/sco busy!!!\n"));
3836 //DbgPrint("error, undefined bt_info=0x%x\n", bt_info);
3837 coex_dm->bt_status = BT_8812A_1ANT_BT_STATUS_MAX;
3838 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), bt non-defined state!!!\n"));
3841 // send delete BA to disable aggregation
3842 //btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejApAggPkt);
3845 if( (BT_8812A_1ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
3846 (BT_8812A_1ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
3847 (BT_8812A_1ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status) )
3855 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
3863 limited_dig = false;
3865 coex_dm->limited_dig = limited_dig;
3866 btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig);
3868 halbtc8812a1ant_RunCoexistMechanism(btcoexist);
3869 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify()<===\n"));
3873 EXhalbtc8812a1ant_StackOperationNotify(
3874 PBTC_COEXIST btcoexist,
3878 if(BTC_STACK_OP_INQ_PAGE_PAIR_START == type)
3880 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], StackOP Inquiry/page/pair start notify\n"));
3882 else if(BTC_STACK_OP_INQ_PAGE_PAIR_FINISH == type)
3884 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], StackOP Inquiry/page/pair finish notify\n"));
3889 EXhalbtc8812a1ant_HaltNotify(
3890 PBTC_COEXIST btcoexist
3893 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));
3895 halbtc8812a1ant_IgnoreWlanAct(btcoexist, FORCE_EXEC, true);
3896 halbtc8812a1ant_PsTdma(btcoexist, FORCE_EXEC, false, 0);
3897 btcoexist->btc_write_1byte(btcoexist, 0x4f, 0xf);
3898 halbtc8812a1ant_WifiParaAdjust(btcoexist, false);
3902 EXhalbtc8812a1ant_PnpNotify(
3903 PBTC_COEXIST btcoexist,
3907 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n"));
3909 if(BTC_WIFI_PNP_SLEEP == pnpState)
3911 btcoexist->stop_coex_dm = true;
3912 halbtc8812a1ant_IgnoreWlanAct(btcoexist, FORCE_EXEC, true);
3913 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
3914 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
3915 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 9);
3917 else if(BTC_WIFI_PNP_WAKE_UP == pnpState)
3924 EXhalbtc8812a1ant_Periodical(
3925 PBTC_COEXIST btcoexist
3928 BOOLEAN wifi_under5g=false;
3930 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Periodical()===>\n"));
3931 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], 1Ant Periodical!!\n"));
3933 btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under5g);
3937 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Periodical(), return for 5G<===\n"));
3938 halbtc8812a1ant_CoexAllOff(btcoexist);
3942 halbtc8812a1ant_QueryBtInfo(btcoexist);
3943 halbtc8812a1ant_MonitorBtCtr(btcoexist);
3944 halbtc8812a1ant_MonitorBtEnableDisable(btcoexist);
3945 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Periodical()<===\n"));
3949 EXhalbtc8812a1ant_DbgControl(
3950 PBTC_COEXIST btcoexist,
3958 case BTC_DBG_SET_COEX_NORMAL:
3959 btcoexist->manual_control = false;
3960 halbtc8812a1ant_InitCoexDm(btcoexist);
3962 case BTC_DBG_SET_COEX_WIFI_ONLY:
3963 btcoexist->manual_control = true;
3964 halbtc8812a1ant_PsTdmaCheckForPowerSaveState(btcoexist, false);
3965 btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
3966 halbtc8812a1ant_PsTdma(btcoexist, NORMAL_EXEC, false, 9);
3968 case BTC_DBG_SET_COEX_BT_ONLY: