1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
6 ******************************************************************************/
8 #include "Mp_Precomp.h"
11 #define HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(val) \
13 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, val); \
14 pCoexDm->psTdmaDuAdjType = val; \
17 /* Global variables, these are static variables */
18 static COEX_DM_8723B_2ANT GLCoexDm8723b2Ant;
19 static PCOEX_DM_8723B_2ANT pCoexDm = &GLCoexDm8723b2Ant;
20 static COEX_STA_8723B_2ANT GLCoexSta8723b2Ant;
21 static PCOEX_STA_8723B_2ANT pCoexSta = &GLCoexSta8723b2Ant;
23 static const char *const GLBtInfoSrc8723b2Ant[] = {
26 "BT Info[bt auto report]",
29 static u32 GLCoexVerDate8723b2Ant = 20131211;
30 static u32 GLCoexVer8723b2Ant = 0x40;
32 /* local function start with halbtc8723b2ant_ */
33 static u8 halbtc8723b2ant_BtRssiState(
34 u8 levelNum, u8 rssiThresh, u8 rssiThresh1
38 u8 btRssiState = pCoexSta->preBtRssiState;
40 btRssi = pCoexSta->btRssi;
44 (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||
45 (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW)
47 if (btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) {
48 btRssiState = BTC_RSSI_STATE_HIGH;
49 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n"));
51 btRssiState = BTC_RSSI_STATE_STAY_LOW;
52 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n"));
55 if (btRssi < rssiThresh) {
56 btRssiState = BTC_RSSI_STATE_LOW;
57 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n"));
59 btRssiState = BTC_RSSI_STATE_STAY_HIGH;
60 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n"));
63 } else if (levelNum == 3) {
64 if (rssiThresh > rssiThresh1) {
65 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n"));
66 return pCoexSta->preBtRssiState;
70 (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||
71 (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW)
73 if (btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) {
74 btRssiState = BTC_RSSI_STATE_MEDIUM;
75 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n"));
77 btRssiState = BTC_RSSI_STATE_STAY_LOW;
78 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n"));
81 (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||
82 (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM)
84 if (btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) {
85 btRssiState = BTC_RSSI_STATE_HIGH;
86 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n"));
87 } else if (btRssi < rssiThresh) {
88 btRssiState = BTC_RSSI_STATE_LOW;
89 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n"));
91 btRssiState = BTC_RSSI_STATE_STAY_MEDIUM;
92 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n"));
95 if (btRssi < rssiThresh1) {
96 btRssiState = BTC_RSSI_STATE_MEDIUM;
97 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n"));
99 btRssiState = BTC_RSSI_STATE_STAY_HIGH;
100 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n"));
105 pCoexSta->preBtRssiState = btRssiState;
110 static u8 halbtc8723b2ant_WifiRssiState(
111 PBTC_COEXIST pBtCoexist,
119 u8 wifiRssiState = pCoexSta->preWifiRssiState[index];
121 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);
125 (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||
126 (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW)
128 if (wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) {
129 wifiRssiState = BTC_RSSI_STATE_HIGH;
130 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n"));
132 wifiRssiState = BTC_RSSI_STATE_STAY_LOW;
133 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n"));
136 if (wifiRssi < rssiThresh) {
137 wifiRssiState = BTC_RSSI_STATE_LOW;
138 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n"));
140 wifiRssiState = BTC_RSSI_STATE_STAY_HIGH;
141 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n"));
144 } else if (levelNum == 3) {
145 if (rssiThresh > rssiThresh1) {
146 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n"));
147 return pCoexSta->preWifiRssiState[index];
151 (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||
152 (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW)
154 if (wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) {
155 wifiRssiState = BTC_RSSI_STATE_MEDIUM;
156 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n"));
158 wifiRssiState = BTC_RSSI_STATE_STAY_LOW;
159 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n"));
162 (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||
163 (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM)
165 if (wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) {
166 wifiRssiState = BTC_RSSI_STATE_HIGH;
167 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n"));
168 } else if (wifiRssi < rssiThresh) {
169 wifiRssiState = BTC_RSSI_STATE_LOW;
170 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n"));
172 wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;
173 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n"));
176 if (wifiRssi < rssiThresh1) {
177 wifiRssiState = BTC_RSSI_STATE_MEDIUM;
178 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n"));
180 wifiRssiState = BTC_RSSI_STATE_STAY_HIGH;
181 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n"));
186 pCoexSta->preWifiRssiState[index] = wifiRssiState;
188 return wifiRssiState;
191 static void halbtc8723b2ant_LimitedRx(
192 PBTC_COEXIST pBtCoexist,
195 bool bBtCtrlAggBufSize,
199 bool bRejectRxAgg = bRejApAggPkt;
200 bool bBtCtrlRxAggSize = bBtCtrlAggBufSize;
201 u8 rxAggSize = aggBufSize;
204 /* Rx Aggregation related setting */
206 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);
207 /* decide BT control aggregation buf size or not */
208 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);
209 /* aggregation buf size, only work when BT control Rx aggregation size. */
210 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);
211 /* real update aggregation setting */
212 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
215 static void halbtc8723b2ant_MonitorBtCtr(PBTC_COEXIST pBtCoexist)
217 u32 regHPTxRx, regLPTxRx, u4Tmp;
218 u32 regHPTx = 0, regHPRx = 0, regLPTx = 0, regLPRx = 0;
223 u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);
224 regHPTx = u4Tmp & bMaskLWord;
225 regHPRx = (u4Tmp & bMaskHWord)>>16;
227 u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);
228 regLPTx = u4Tmp & bMaskLWord;
229 regLPRx = (u4Tmp & bMaskHWord)>>16;
231 pCoexSta->highPriorityTx = regHPTx;
232 pCoexSta->highPriorityRx = regHPRx;
233 pCoexSta->lowPriorityTx = regLPTx;
234 pCoexSta->lowPriorityRx = regLPRx;
240 "[BTCoex], High Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",
252 "[BTCoex], Low Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",
262 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);
265 static void halbtc8723b2ant_QueryBtInfo(PBTC_COEXIST pBtCoexist)
267 u8 H2C_Parameter[1] = {0};
269 pCoexSta->bC2hBtInfoReqSent = true;
271 H2C_Parameter[0] |= BIT0; /* trigger */
276 ("[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n", H2C_Parameter[0])
279 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);
282 static bool halbtc8723b2ant_IsWifiStatusChanged(PBTC_COEXIST pBtCoexist)
284 static bool bPreWifiBusy, bPreUnder4way, bPreBtHsOn;
285 bool bWifiBusy = false, bUnder4way = false, bBtHsOn = false;
286 bool bWifiConnected = false;
288 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
289 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
290 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
291 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);
293 if (bWifiConnected) {
294 if (bWifiBusy != bPreWifiBusy) {
295 bPreWifiBusy = bWifiBusy;
299 if (bUnder4way != bPreUnder4way) {
300 bPreUnder4way = bUnder4way;
304 if (bBtHsOn != bPreBtHsOn) {
305 bPreBtHsOn = bBtHsOn;
313 static void halbtc8723b2ant_UpdateBtLinkInfo(PBTC_COEXIST pBtCoexist)
315 PBTC_BT_LINK_INFO pBtLinkInfo = &pBtCoexist->btLinkInfo;
316 bool bBtHsOn = false;
318 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
320 pBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist;
321 pBtLinkInfo->bScoExist = pCoexSta->bScoExist;
322 pBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist;
323 pBtLinkInfo->bPanExist = pCoexSta->bPanExist;
324 pBtLinkInfo->bHidExist = pCoexSta->bHidExist;
326 /* work around for HS mode. */
328 pBtLinkInfo->bPanExist = true;
329 pBtLinkInfo->bBtLinkExist = true;
332 /* check if Sco only */
334 pBtLinkInfo->bScoExist &&
335 !pBtLinkInfo->bA2dpExist &&
336 !pBtLinkInfo->bPanExist &&
337 !pBtLinkInfo->bHidExist
339 pBtLinkInfo->bScoOnly = true;
341 pBtLinkInfo->bScoOnly = false;
343 /* check if A2dp only */
345 !pBtLinkInfo->bScoExist &&
346 pBtLinkInfo->bA2dpExist &&
347 !pBtLinkInfo->bPanExist &&
348 !pBtLinkInfo->bHidExist
350 pBtLinkInfo->bA2dpOnly = true;
352 pBtLinkInfo->bA2dpOnly = false;
354 /* check if Pan only */
356 !pBtLinkInfo->bScoExist &&
357 !pBtLinkInfo->bA2dpExist &&
358 pBtLinkInfo->bPanExist &&
359 !pBtLinkInfo->bHidExist
361 pBtLinkInfo->bPanOnly = true;
363 pBtLinkInfo->bPanOnly = false;
365 /* check if Hid only */
367 !pBtLinkInfo->bScoExist &&
368 !pBtLinkInfo->bA2dpExist &&
369 !pBtLinkInfo->bPanExist &&
370 pBtLinkInfo->bHidExist
372 pBtLinkInfo->bHidOnly = true;
374 pBtLinkInfo->bHidOnly = false;
377 static u8 halbtc8723b2ant_ActionAlgorithm(PBTC_COEXIST pBtCoexist)
379 PBTC_BT_LINK_INFO pBtLinkInfo = &pBtCoexist->btLinkInfo;
380 bool bBtHsOn = false;
381 u8 algorithm = BT_8723B_2ANT_COEX_ALGO_UNDEFINED;
382 u8 numOfDiffProfile = 0;
384 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
386 if (!pBtLinkInfo->bBtLinkExist) {
387 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No BT link exists!!!\n"));
391 if (pBtLinkInfo->bScoExist)
394 if (pBtLinkInfo->bHidExist)
397 if (pBtLinkInfo->bPanExist)
400 if (pBtLinkInfo->bA2dpExist)
403 if (numOfDiffProfile == 1) {
404 if (pBtLinkInfo->bScoExist) {
405 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO only\n"));
406 algorithm = BT_8723B_2ANT_COEX_ALGO_SCO;
408 if (pBtLinkInfo->bHidExist) {
409 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n"));
410 algorithm = BT_8723B_2ANT_COEX_ALGO_HID;
411 } else if (pBtLinkInfo->bA2dpExist) {
412 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n"));
413 algorithm = BT_8723B_2ANT_COEX_ALGO_A2DP;
414 } else if (pBtLinkInfo->bPanExist) {
416 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(HS) only\n"));
417 algorithm = BT_8723B_2ANT_COEX_ALGO_PANHS;
419 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(EDR) only\n"));
420 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR;
424 } else if (numOfDiffProfile == 2) {
425 if (pBtLinkInfo->bScoExist) {
426 if (pBtLinkInfo->bHidExist) {
427 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID\n"));
428 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
429 } else if (pBtLinkInfo->bA2dpExist) {
430 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP ==> SCO\n"));
431 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
432 } else if (pBtLinkInfo->bPanExist) {
434 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(HS)\n"));
435 algorithm = BT_8723B_2ANT_COEX_ALGO_SCO;
437 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(EDR)\n"));
438 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
443 pBtLinkInfo->bHidExist &&
444 pBtLinkInfo->bA2dpExist
446 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n"));
447 algorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP;
449 pBtLinkInfo->bHidExist &&
450 pBtLinkInfo->bPanExist
453 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(HS)\n"));
454 algorithm = BT_8723B_2ANT_COEX_ALGO_HID;
456 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));
457 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
460 pBtLinkInfo->bPanExist &&
461 pBtLinkInfo->bA2dpExist
464 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));
465 algorithm = BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS;
467 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));
468 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP;
472 } else if (numOfDiffProfile == 3) {
473 if (pBtLinkInfo->bScoExist) {
475 pBtLinkInfo->bHidExist &&
476 pBtLinkInfo->bA2dpExist
481 ("[BTCoex], SCO + HID + A2DP ==> HID\n")
483 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
485 pBtLinkInfo->bHidExist &&
486 pBtLinkInfo->bPanExist
492 ("[BTCoex], SCO + HID + PAN(HS)\n")
494 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
499 ("[BTCoex], SCO + HID + PAN(EDR)\n")
501 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
504 pBtLinkInfo->bPanExist &&
505 pBtLinkInfo->bA2dpExist
508 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(HS)\n"));
509 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
511 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n"));
512 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
517 pBtLinkInfo->bHidExist &&
518 pBtLinkInfo->bPanExist &&
519 pBtLinkInfo->bA2dpExist
522 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));
523 algorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP;
525 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));
526 algorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
530 } else if (numOfDiffProfile >= 3) {
531 if (pBtLinkInfo->bScoExist) {
533 pBtLinkInfo->bHidExist &&
534 pBtLinkInfo->bPanExist &&
535 pBtLinkInfo->bA2dpExist
538 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n"));
541 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP + PAN(EDR) ==>PAN(EDR)+HID\n"));
542 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
551 static void halbtc8723b2ant_SetFwDacSwingLevel(
552 PBTC_COEXIST pBtCoexist, u8 dacSwingLvl
555 u8 H2C_Parameter[1] = {0};
557 /* There are several type of dacswing */
558 /* 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 */
559 H2C_Parameter[0] = dacSwingLvl;
564 ("[BTCoex], Set Dac Swing Level = 0x%x\n", dacSwingLvl)
569 ("[BTCoex], FW write 0x64 = 0x%x\n", H2C_Parameter[0])
572 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter);
575 static void halbtc8723b2ant_SetFwDecBtPwr(
576 PBTC_COEXIST pBtCoexist, u8 decBtPwrLvl
579 u8 H2C_Parameter[1] = {0};
581 H2C_Parameter[0] = decBtPwrLvl;
587 "[BTCoex], decrease Bt Power level = %d, FW write 0x62 = 0x%x\n",
593 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter);
596 static void halbtc8723b2ant_DecBtPwr(
597 PBTC_COEXIST pBtCoexist, bool bForceExec, u8 decBtPwrLvl
604 "[BTCoex], %s Dec BT power level = %d\n",
605 (bForceExec ? "force to" : ""),
609 pCoexDm->curBtDecPwrLvl = decBtPwrLvl;
614 ALGO_TRACE_FW_DETAIL,
616 "[BTCoex], preBtDecPwrLvl =%d, curBtDecPwrLvl =%d\n",
617 pCoexDm->preBtDecPwrLvl,
618 pCoexDm->curBtDecPwrLvl
622 if (pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl)
625 halbtc8723b2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->curBtDecPwrLvl);
627 pCoexDm->preBtDecPwrLvl = pCoexDm->curBtDecPwrLvl;
630 static void halbtc8723b2ant_FwDacSwingLvl(
631 PBTC_COEXIST pBtCoexist, bool bForceExec, u8 fwDacSwingLvl
638 "[BTCoex], %s set FW Dac Swing level = %d\n",
639 (bForceExec ? "force to" : ""),
643 pCoexDm->curFwDacSwingLvl = fwDacSwingLvl;
648 ALGO_TRACE_FW_DETAIL,
650 "[BTCoex], preFwDacSwingLvl =%d, curFwDacSwingLvl =%d\n",
651 pCoexDm->preFwDacSwingLvl,
652 pCoexDm->curFwDacSwingLvl
656 if (pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl)
660 halbtc8723b2ant_SetFwDacSwingLevel(pBtCoexist, pCoexDm->curFwDacSwingLvl);
662 pCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl;
665 static void halbtc8723b2ant_SetSwRfRxLpfCorner(
666 PBTC_COEXIST pBtCoexist,
671 /* Shrink RF Rx LPF corner */
675 ("[BTCoex], Shrink RF Rx LPF corner!!\n")
677 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc);
679 /* Resume RF Rx LPF corner */
680 /* After initialized, we can use pCoexDm->btRf0x1eBackup */
681 if (pBtCoexist->bInitilized) {
682 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n"));
683 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup);
688 static void halbtc8723b2ant_RfShrink(
689 PBTC_COEXIST pBtCoexist, bool bForceExec, bool bRxRfShrinkOn
696 "[BTCoex], %s turn Rx RF Shrink = %s\n",
697 (bForceExec ? "force to" : ""),
698 (bRxRfShrinkOn ? "ON" : "OFF")
701 pCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;
706 ALGO_TRACE_SW_DETAIL,
708 "[BTCoex], bPreRfRxLpfShrink =%d, bCurRfRxLpfShrink =%d\n",
709 pCoexDm->bPreRfRxLpfShrink,
710 pCoexDm->bCurRfRxLpfShrink
714 if (pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink)
717 halbtc8723b2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);
719 pCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;
722 static void halbtc8723b2ant_SetSwPenaltyTxRateAdaptive(
723 PBTC_COEXIST pBtCoexist, bool bLowPenaltyRa
726 u8 H2C_Parameter[6] = {0};
728 H2C_Parameter[0] = 0x6; /* opCode, 0x6 = Retry_Penalty */
731 H2C_Parameter[1] |= BIT0;
732 H2C_Parameter[2] = 0x00; /* normal rate except MCS7/6/5, OFDM54/48/36 */
733 H2C_Parameter[3] = 0xf7; /* MCS7 or OFDM54 */
734 H2C_Parameter[4] = 0xf8; /* MCS6 or OFDM48 */
735 H2C_Parameter[5] = 0xf9; /* MCS5 or OFDM36 */
742 "[BTCoex], set WiFi Low-Penalty Retry: %s",
743 (bLowPenaltyRa ? "ON!!" : "OFF!!")
747 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);
750 static void halbtc8723b2ant_LowPenaltyRa(
751 PBTC_COEXIST pBtCoexist, bool bForceExec, bool bLowPenaltyRa
759 "[BTCoex], %s turn LowPenaltyRA = %s\n",
760 (bForceExec ? "force to" : ""),
761 (bLowPenaltyRa ? "ON" : "OFF")
764 pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;
769 ALGO_TRACE_SW_DETAIL,
771 "[BTCoex], bPreLowPenaltyRa =%d, bCurLowPenaltyRa =%d\n",
772 pCoexDm->bPreLowPenaltyRa,
773 pCoexDm->bCurLowPenaltyRa
777 if (pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa)
780 halbtc8723b2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);
782 pCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;
785 static void halbtc8723b2ant_SetDacSwingReg(PBTC_COEXIST pBtCoexist, u32 level)
792 ("[BTCoex], Write SwDacSwing = 0x%x\n", level)
794 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x883, 0x3e, val);
797 static void halbtc8723b2ant_SetSwFullTimeDacSwing(
798 PBTC_COEXIST pBtCoexist, bool bSwDacSwingOn, u32 swDacSwingLvl
802 halbtc8723b2ant_SetDacSwingReg(pBtCoexist, swDacSwingLvl);
804 halbtc8723b2ant_SetDacSwingReg(pBtCoexist, 0x18);
808 static void halbtc8723b2ant_DacSwing(
809 PBTC_COEXIST pBtCoexist,
819 "[BTCoex], %s turn DacSwing =%s, dacSwingLvl = 0x%x\n",
820 (bForceExec ? "force to" : ""),
821 (bDacSwingOn ? "ON" : "OFF"),
825 pCoexDm->bCurDacSwingOn = bDacSwingOn;
826 pCoexDm->curDacSwingLvl = dacSwingLvl;
831 ALGO_TRACE_SW_DETAIL,
833 "[BTCoex], bPreDacSwingOn =%d, preDacSwingLvl = 0x%x, bCurDacSwingOn =%d, curDacSwingLvl = 0x%x\n",
834 pCoexDm->bPreDacSwingOn,
835 pCoexDm->preDacSwingLvl,
836 pCoexDm->bCurDacSwingOn,
837 pCoexDm->curDacSwingLvl
841 if ((pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) &&
842 (pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl))
846 halbtc8723b2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl);
848 pCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn;
849 pCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl;
852 static void halbtc8723b2ant_SetAgcTable(
853 PBTC_COEXIST pBtCoexist, bool bAgcTableEn
856 u8 rssiAdjustVal = 0;
858 /* BB AGC Gain Table */
860 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB Agc Table On!\n"));
861 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6e1A0001);
862 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6d1B0001);
863 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6c1C0001);
864 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6b1D0001);
865 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6a1E0001);
866 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x691F0001);
867 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x68200001);
869 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB Agc Table Off!\n"));
870 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xaa1A0001);
871 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa91B0001);
872 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa81C0001);
873 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa71D0001);
874 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa61E0001);
875 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa51F0001);
876 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa4200001);
881 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);
883 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n"));
884 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38fff);
885 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38ffe);
887 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n"));
888 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x380c3);
889 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x28ce6);
891 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);
893 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x1);
895 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n"));
896 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38fff);
897 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38ffe);
899 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n"));
900 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x380c3);
901 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x28ce6);
903 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x0);
905 /* set rssiAdjustVal for wifi module. */
909 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal);
912 static void halbtc8723b2ant_AgcTable(
913 PBTC_COEXIST pBtCoexist, bool bForceExec, bool bAgcTableEn
920 "[BTCoex], %s %s Agc Table\n",
921 (bForceExec ? "force to" : ""),
922 (bAgcTableEn ? "Enable" : "Disable")
925 pCoexDm->bCurAgcTableEn = bAgcTableEn;
930 ALGO_TRACE_SW_DETAIL,
932 "[BTCoex], bPreAgcTableEn =%d, bCurAgcTableEn =%d\n",
933 pCoexDm->bPreAgcTableEn,
934 pCoexDm->bCurAgcTableEn
938 if (pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn)
941 halbtc8723b2ant_SetAgcTable(pBtCoexist, bAgcTableEn);
943 pCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn;
946 static void halbtc8723b2ant_SetCoexTable(
947 PBTC_COEXIST pBtCoexist,
957 ("[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0)
959 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);
964 ("[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4)
966 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);
971 ("[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8)
973 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);
978 ("[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc)
980 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);
983 static void halbtc8723b2ant_CoexTable(
984 PBTC_COEXIST pBtCoexist,
996 "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6c8 = 0x%x, 0x6cc = 0x%x\n",
997 (bForceExec ? "force to" : ""),
1004 pCoexDm->curVal0x6c0 = val0x6c0;
1005 pCoexDm->curVal0x6c4 = val0x6c4;
1006 pCoexDm->curVal0x6c8 = val0x6c8;
1007 pCoexDm->curVal0x6cc = val0x6cc;
1012 ALGO_TRACE_SW_DETAIL,
1014 "[BTCoex], preVal0x6c0 = 0x%x, preVal0x6c4 = 0x%x, preVal0x6c8 = 0x%x, preVal0x6cc = 0x%x !!\n",
1015 pCoexDm->preVal0x6c0,
1016 pCoexDm->preVal0x6c4,
1017 pCoexDm->preVal0x6c8,
1018 pCoexDm->preVal0x6cc
1023 ALGO_TRACE_SW_DETAIL,
1025 "[BTCoex], curVal0x6c0 = 0x%x, curVal0x6c4 = 0x%x, curVal0x6c8 = 0x%x, curVal0x6cc = 0x%x !!\n",
1026 pCoexDm->curVal0x6c0,
1027 pCoexDm->curVal0x6c4,
1028 pCoexDm->curVal0x6c8,
1029 pCoexDm->curVal0x6cc
1034 (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&
1035 (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&
1036 (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&
1037 (pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc)
1041 halbtc8723b2ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);
1043 pCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;
1044 pCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;
1045 pCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;
1046 pCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;
1049 static void halbtc8723b2ant_CoexTableWithType(
1050 PBTC_COEXIST pBtCoexist, bool bForceExec, u8 type
1055 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffff, 0x3);
1058 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
1061 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffff, 0x3);
1064 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffff, 0x3);
1067 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xffffffff, 0xffff, 0x3);
1070 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5fff5fff, 0xffff, 0x3);
1073 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);
1076 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0xfafafafa, 0xffff, 0x3);
1079 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5aea5aea, 0x5aea5aea, 0xffff, 0x3);
1082 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5aea5aea, 0xffff, 0x3);
1085 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5aff5aff, 0xffff, 0x3);
1088 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5f5a5f, 0xffff, 0x3);
1091 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5f5f5f5f, 0xffff, 0x3);
1098 static void halbtc8723b2ant_SetFwIgnoreWlanAct(
1099 PBTC_COEXIST pBtCoexist, bool bEnable
1102 u8 H2C_Parameter[1] = {0};
1105 H2C_Parameter[0] |= BIT0; /* function enable */
1111 "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
1116 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);
1119 static void halbtc8723b2ant_IgnoreWlanAct(
1120 PBTC_COEXIST pBtCoexist, bool bForceExec, bool bEnable
1127 "[BTCoex], %s turn Ignore WlanAct %s\n",
1128 (bForceExec ? "force to" : ""),
1129 (bEnable ? "ON" : "OFF")
1133 pCoexDm->bCurIgnoreWlanAct = bEnable;
1136 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n",
1137 pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct));
1139 if (pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)
1142 halbtc8723b2ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);
1144 pCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;
1147 static void halbtc8723b2ant_SetFwPstdma(
1148 PBTC_COEXIST pBtCoexist,
1156 u8 H2C_Parameter[5] = {0};
1158 H2C_Parameter[0] = byte1;
1159 H2C_Parameter[1] = byte2;
1160 H2C_Parameter[2] = byte3;
1161 H2C_Parameter[3] = byte4;
1162 H2C_Parameter[4] = byte5;
1164 pCoexDm->psTdmaPara[0] = byte1;
1165 pCoexDm->psTdmaPara[1] = byte2;
1166 pCoexDm->psTdmaPara[2] = byte3;
1167 pCoexDm->psTdmaPara[3] = byte4;
1168 pCoexDm->psTdmaPara[4] = byte5;
1174 "[BTCoex], FW write 0x60(5bytes) = 0x%x%08x\n",
1176 H2C_Parameter[1]<<24|
1177 H2C_Parameter[2]<<16|
1178 H2C_Parameter[3]<<8|
1183 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);
1186 static void halbtc8723b2ant_SwMechanism1(
1187 PBTC_COEXIST pBtCoexist,
1191 bool bBTLNAConstrain
1194 halbtc8723b2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF);
1195 halbtc8723b2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);
1198 static void halbtc8723b2ant_SwMechanism2(
1199 PBTC_COEXIST pBtCoexist,
1200 bool bAGCTableShift,
1206 halbtc8723b2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift);
1207 halbtc8723b2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl);
1210 static void halbtc8723b2ant_SetAntPath(
1211 PBTC_COEXIST pBtCoexist, u8 antPosType, bool bInitHwCfg, bool bWifiOff
1214 PBTC_BOARD_INFO pBoardInfo = &pBtCoexist->boardInfo;
1215 u32 fwVer = 0, u4Tmp = 0;
1216 bool bPgExtSwitch = false;
1217 bool bUseExtSwitch = false;
1218 u8 H2C_Parameter[2] = {0};
1220 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_EXT_SWITCH, &bPgExtSwitch);
1221 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); /* [31:16]=fw ver, [15:0]=fw sub ver */
1223 if ((fwVer > 0 && fwVer < 0xc0000) || bPgExtSwitch)
1224 bUseExtSwitch = true;
1227 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x39, 0x8, 0x1);
1228 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);
1229 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);
1230 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);
1231 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1);
1233 if (fwVer >= 0x180000) {
1234 /* Use H2C to set GNT_BT to LOW */
1235 H2C_Parameter[0] = 0;
1236 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);
1238 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x0);
1241 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
1243 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); /* WiFi TRx Mask off */
1244 pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01); /* BT TRx Mask off */
1246 if (pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) {
1247 /* tell firmware "no antenna inverse" */
1248 H2C_Parameter[0] = 0;
1250 /* tell firmware "antenna inverse" */
1251 H2C_Parameter[0] = 1;
1254 if (bUseExtSwitch) {
1255 /* ext switch type */
1256 H2C_Parameter[1] = 1;
1258 /* int switch type */
1259 H2C_Parameter[1] = 0;
1261 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);
1264 /* ext switch setting */
1265 if (bUseExtSwitch) {
1267 /* 0x4c[23]= 0, 0x4c[24]= 1 Antenna control by WL/BT */
1268 u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);
1271 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
1274 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); /* fixed internal switch S1->WiFi, S0->BT */
1275 switch (antPosType) {
1276 case BTC_ANT_WIFI_AT_MAIN:
1277 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1); /* ext switch main at wifi */
1279 case BTC_ANT_WIFI_AT_AUX:
1280 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2); /* ext switch aux at wifi */
1283 } else { /* internal switch */
1285 /* 0x4c[23]= 0, 0x4c[24]= 1 Antenna control by WL/BT */
1286 u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);
1289 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
1292 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); /* fixed external switch S1->Main, S0->Aux */
1293 switch (antPosType) {
1294 case BTC_ANT_WIFI_AT_MAIN:
1295 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); /* fixed internal switch S1->WiFi, S0->BT */
1297 case BTC_ANT_WIFI_AT_AUX:
1298 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280); /* fixed internal switch S0->WiFi, S1->BT */
1304 static void halbtc8723b2ant_PsTdma(
1305 PBTC_COEXIST pBtCoexist, bool bForceExec, bool bTurnOn, u8 type
1312 "[BTCoex], %s turn %s PS TDMA, type =%d\n",
1313 (bForceExec ? "force to" : ""),
1314 (bTurnOn ? "ON" : "OFF"),
1318 pCoexDm->bCurPsTdmaOn = bTurnOn;
1319 pCoexDm->curPsTdma = type;
1324 ALGO_TRACE_FW_DETAIL,
1326 "[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n",
1327 pCoexDm->bPrePsTdmaOn,
1328 pCoexDm->bCurPsTdmaOn
1333 ALGO_TRACE_FW_DETAIL,
1335 "[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n",
1336 pCoexDm->prePsTdma, pCoexDm->curPsTdma
1341 (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&
1342 (pCoexDm->prePsTdma == pCoexDm->curPsTdma)
1351 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);
1354 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);
1357 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90);
1360 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xf1, 0x90);
1363 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);
1366 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);
1369 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90);
1372 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x10, 0x3, 0x70, 0x90);
1375 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);
1378 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);
1381 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x90);
1384 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);
1387 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);
1390 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);
1393 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x90);
1396 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0x60, 0x90);
1399 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x2f, 0x2f, 0x60, 0x90);
1402 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);
1405 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0xe1, 0x90);
1408 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90);
1411 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90);
1414 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);
1418 /* disable PS tdma */
1421 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);
1424 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x48, 0x0);
1427 halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);
1432 /* update pre state */
1433 pCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;
1434 pCoexDm->prePsTdma = pCoexDm->curPsTdma;
1437 static void halbtc8723b2ant_CoexAllOff(PBTC_COEXIST pBtCoexist)
1440 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
1441 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
1442 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
1445 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
1446 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
1449 /* pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); */
1450 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
1453 static void halbtc8723b2ant_InitCoexDm(PBTC_COEXIST pBtCoexist)
1455 /* force to reset coex mechanism */
1457 halbtc8723b2ant_PsTdma(pBtCoexist, FORCE_EXEC, false, 1);
1458 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);
1459 halbtc8723b2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, 0);
1461 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
1462 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
1465 static void halbtc8723b2ant_ActionBtInquiry(PBTC_COEXIST pBtCoexist)
1467 bool bWifiConnected = false;
1468 bool bLowPwrDisable = true;
1470 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
1471 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
1473 if (bWifiConnected) {
1474 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
1475 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
1477 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
1478 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
1481 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);
1482 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
1484 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
1485 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
1487 pCoexDm->bNeedRecover0x948 = true;
1488 pCoexDm->backup0x948 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);
1490 halbtc8723b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_AUX, false, false);
1493 static bool halbtc8723b2ant_IsCommonAction(PBTC_COEXIST pBtCoexist)
1495 u8 btRssiState = BTC_RSSI_STATE_HIGH;
1496 bool bCommon = false, bWifiConnected = false, bWifiBusy = false;
1497 bool bBtHsOn = false, bLowPwrDisable = false;
1499 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
1500 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
1501 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
1503 if (!bWifiConnected) {
1504 bLowPwrDisable = false;
1505 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
1506 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
1508 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non-connected idle!!\n"));
1510 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
1511 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
1512 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
1513 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
1514 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
1516 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
1517 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
1521 if (BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) {
1522 bLowPwrDisable = false;
1523 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
1524 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
1526 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n"));
1528 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
1529 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
1530 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
1531 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);
1532 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
1534 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
1535 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
1538 } else if (BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) {
1539 bLowPwrDisable = true;
1540 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
1545 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n"));
1546 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
1548 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
1549 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
1550 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
1551 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);
1552 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
1554 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
1555 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
1559 bLowPwrDisable = true;
1560 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
1563 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n"));
1569 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n"));
1570 btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
1571 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
1573 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
1574 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
1575 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 21);
1576 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);
1578 if (BTC_RSSI_HIGH(btRssiState))
1579 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
1581 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
1583 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
1584 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
1593 static void halbtc8723b2ant_TdmaDurationAdjust(
1594 PBTC_COEXIST pBtCoexist, bool bScoHid, bool bTxPause, u8 maxInterval
1597 static s32 up, dn, m, n, WaitCount;
1598 s32 result; /* 0: no change, +1: increase WiFi duration, -1: decrease WiFi duration */
1601 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjust()\n"));
1603 if (!pCoexDm->bAutoTdmaAdjust) {
1604 pCoexDm->bAutoTdmaAdjust = true;
1605 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n"));
1609 if (maxInterval == 1)
1610 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(13);
1611 else if (maxInterval == 2)
1612 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(14);
1613 else if (maxInterval == 3)
1614 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1616 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1618 if (maxInterval == 1)
1619 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(9);
1620 else if (maxInterval == 2)
1621 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(10);
1622 else if (maxInterval == 3)
1623 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
1625 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
1629 if (maxInterval == 1)
1630 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(5);
1631 else if (maxInterval == 2)
1632 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(6);
1633 else if (maxInterval == 3)
1634 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1636 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1638 if (maxInterval == 1)
1639 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(1);
1640 else if (maxInterval == 2)
1641 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(2);
1642 else if (maxInterval == 3)
1643 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
1645 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
1657 /* accquire the BT TRx retry count from BT_Info byte2 */
1658 retryCount = pCoexSta->btRetryCnt;
1659 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount));
1662 ALGO_TRACE_FW_DETAIL,
1664 "[BTCoex], up =%d, dn =%d, m =%d, n =%d, WaitCount =%d\n",
1665 up, dn, m, n, WaitCount
1671 if (retryCount == 0) { /* no retry in the last 2-second duration */
1678 if (up >= n) { /* if 連續 n 個2秒 retry count為0, 則調寬WiFi duration */
1684 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n"));
1686 } else if (retryCount <= 3) { /* <=3 retry in the last 2-second duration */
1693 if (dn == 2) { /* if 連續 2 個2秒 retry count< 3, 則調窄WiFi duration */
1695 m++; /* 避免一直在兩個level中來回 */
1699 if (m >= 20) /* m 最大值 = 20 ' 最大120秒 recheck是否調整 WiFi duration. */
1707 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n"));
1709 } else { /* retry count > 3, 只要1次 retry count > 3, 則調窄WiFi duration */
1711 m++; /* 避免一直在兩個level中來回 */
1715 if (m >= 20) /* m 最大值 = 20 ' 最大120秒 recheck是否調整 WiFi duration. */
1723 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n"));
1726 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], max Interval = %d\n", maxInterval));
1727 if (maxInterval == 1) {
1729 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));
1731 if (pCoexDm->curPsTdma == 71)
1732 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(5);
1733 else if (pCoexDm->curPsTdma == 1)
1734 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(5);
1735 else if (pCoexDm->curPsTdma == 2)
1736 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(6);
1737 else if (pCoexDm->curPsTdma == 3)
1738 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1739 else if (pCoexDm->curPsTdma == 4)
1740 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(8);
1742 if (pCoexDm->curPsTdma == 9)
1743 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(13);
1744 else if (pCoexDm->curPsTdma == 10)
1745 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(14);
1746 else if (pCoexDm->curPsTdma == 11)
1747 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1748 else if (pCoexDm->curPsTdma == 12)
1749 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(16);
1752 if (pCoexDm->curPsTdma == 5)
1753 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(6);
1754 else if (pCoexDm->curPsTdma == 6)
1755 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1756 else if (pCoexDm->curPsTdma == 7)
1757 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(8);
1758 else if (pCoexDm->curPsTdma == 13)
1759 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(14);
1760 else if (pCoexDm->curPsTdma == 14)
1761 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1762 else if (pCoexDm->curPsTdma == 15)
1763 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(16);
1764 } else if (result == 1) {
1765 if (pCoexDm->curPsTdma == 8)
1766 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1767 else if (pCoexDm->curPsTdma == 7)
1768 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(6);
1769 else if (pCoexDm->curPsTdma == 6)
1770 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(5);
1771 else if (pCoexDm->curPsTdma == 16)
1772 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1773 else if (pCoexDm->curPsTdma == 15)
1774 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(14);
1775 else if (pCoexDm->curPsTdma == 14)
1776 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(13);
1779 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));
1780 if (pCoexDm->curPsTdma == 5)
1781 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(71);
1782 else if (pCoexDm->curPsTdma == 6)
1783 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(2);
1784 else if (pCoexDm->curPsTdma == 7)
1785 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
1786 else if (pCoexDm->curPsTdma == 8)
1787 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(4);
1789 if (pCoexDm->curPsTdma == 13)
1790 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(9);
1791 else if (pCoexDm->curPsTdma == 14)
1792 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(10);
1793 else if (pCoexDm->curPsTdma == 15)
1794 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
1795 else if (pCoexDm->curPsTdma == 16)
1796 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(12);
1799 if (pCoexDm->curPsTdma == 71)
1800 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(1);
1801 else if (pCoexDm->curPsTdma == 1)
1802 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(2);
1803 else if (pCoexDm->curPsTdma == 2)
1804 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
1805 else if (pCoexDm->curPsTdma == 3)
1806 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(4);
1807 else if (pCoexDm->curPsTdma == 9)
1808 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(10);
1809 else if (pCoexDm->curPsTdma == 10)
1810 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
1811 else if (pCoexDm->curPsTdma == 11)
1812 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(12);
1813 } else if (result == 1) {
1814 if (pCoexDm->curPsTdma == 4)
1815 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
1816 else if (pCoexDm->curPsTdma == 3)
1817 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(2);
1818 else if (pCoexDm->curPsTdma == 2)
1819 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(1);
1820 else if (pCoexDm->curPsTdma == 1)
1821 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(71);
1822 else if (pCoexDm->curPsTdma == 12)
1823 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
1824 else if (pCoexDm->curPsTdma == 11)
1825 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(10);
1826 else if (pCoexDm->curPsTdma == 10)
1827 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(9);
1830 } else if (maxInterval == 2) {
1832 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));
1833 if (pCoexDm->curPsTdma == 1)
1834 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(6);
1835 else if (pCoexDm->curPsTdma == 2)
1836 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(6);
1837 else if (pCoexDm->curPsTdma == 3)
1838 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1839 else if (pCoexDm->curPsTdma == 4)
1840 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(8);
1842 if (pCoexDm->curPsTdma == 9)
1843 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(14);
1844 else if (pCoexDm->curPsTdma == 10)
1845 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(14);
1846 else if (pCoexDm->curPsTdma == 11)
1847 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1848 else if (pCoexDm->curPsTdma == 12)
1849 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(16);
1852 if (pCoexDm->curPsTdma == 5)
1853 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(6);
1854 else if (pCoexDm->curPsTdma == 6)
1855 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1856 else if (pCoexDm->curPsTdma == 7)
1857 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(8);
1858 else if (pCoexDm->curPsTdma == 13)
1859 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(14);
1860 else if (pCoexDm->curPsTdma == 14)
1861 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1862 else if (pCoexDm->curPsTdma == 15)
1863 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(16);
1864 } else if (result == 1) {
1865 if (pCoexDm->curPsTdma == 8)
1866 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1867 else if (pCoexDm->curPsTdma == 7)
1868 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(6);
1869 else if (pCoexDm->curPsTdma == 6)
1870 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(6);
1871 else if (pCoexDm->curPsTdma == 16)
1872 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1873 else if (pCoexDm->curPsTdma == 15)
1874 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(14);
1875 else if (pCoexDm->curPsTdma == 14)
1876 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(14);
1879 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));
1880 if (pCoexDm->curPsTdma == 5)
1881 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(2);
1882 else if (pCoexDm->curPsTdma == 6)
1883 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(2);
1884 else if (pCoexDm->curPsTdma == 7)
1885 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
1886 else if (pCoexDm->curPsTdma == 8)
1887 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(4);
1889 if (pCoexDm->curPsTdma == 13)
1890 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(10);
1891 else if (pCoexDm->curPsTdma == 14)
1892 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(10);
1893 else if (pCoexDm->curPsTdma == 15)
1894 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
1895 else if (pCoexDm->curPsTdma == 16)
1896 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(12);
1899 if (pCoexDm->curPsTdma == 1)
1900 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(2);
1901 else if (pCoexDm->curPsTdma == 2)
1902 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
1903 else if (pCoexDm->curPsTdma == 3)
1904 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(4);
1905 else if (pCoexDm->curPsTdma == 9)
1906 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(10);
1907 else if (pCoexDm->curPsTdma == 10)
1908 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
1909 else if (pCoexDm->curPsTdma == 11)
1910 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(12);
1911 } else if (result == 1) {
1912 if (pCoexDm->curPsTdma == 4)
1913 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
1914 else if (pCoexDm->curPsTdma == 3)
1915 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(2);
1916 else if (pCoexDm->curPsTdma == 2)
1917 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(2);
1918 else if (pCoexDm->curPsTdma == 12)
1919 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
1920 else if (pCoexDm->curPsTdma == 11)
1921 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(10);
1922 else if (pCoexDm->curPsTdma == 10)
1923 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(10);
1926 } else if (maxInterval == 3) {
1928 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));
1929 if (pCoexDm->curPsTdma == 1)
1930 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1931 else if (pCoexDm->curPsTdma == 2)
1932 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1933 else if (pCoexDm->curPsTdma == 3)
1934 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1935 else if (pCoexDm->curPsTdma == 4)
1936 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(8);
1938 if (pCoexDm->curPsTdma == 9)
1939 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1940 else if (pCoexDm->curPsTdma == 10)
1941 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1942 else if (pCoexDm->curPsTdma == 11)
1943 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1944 else if (pCoexDm->curPsTdma == 12)
1945 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(16);
1948 if (pCoexDm->curPsTdma == 5)
1949 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1950 else if (pCoexDm->curPsTdma == 6)
1951 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1952 else if (pCoexDm->curPsTdma == 7)
1953 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(8);
1954 else if (pCoexDm->curPsTdma == 13)
1955 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1956 else if (pCoexDm->curPsTdma == 14)
1957 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1958 else if (pCoexDm->curPsTdma == 15)
1959 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(16);
1960 } else if (result == 1) {
1961 if (pCoexDm->curPsTdma == 8)
1962 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1963 else if (pCoexDm->curPsTdma == 7)
1964 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1965 else if (pCoexDm->curPsTdma == 6)
1966 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(7);
1967 else if (pCoexDm->curPsTdma == 16)
1968 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1969 else if (pCoexDm->curPsTdma == 15)
1970 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1971 else if (pCoexDm->curPsTdma == 14)
1972 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(15);
1975 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));
1976 if (pCoexDm->curPsTdma == 5)
1977 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
1978 else if (pCoexDm->curPsTdma == 6)
1979 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
1980 else if (pCoexDm->curPsTdma == 7)
1981 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
1982 else if (pCoexDm->curPsTdma == 8)
1983 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(4);
1985 if (pCoexDm->curPsTdma == 13)
1986 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
1987 else if (pCoexDm->curPsTdma == 14)
1988 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
1989 else if (pCoexDm->curPsTdma == 15)
1990 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
1991 else if (pCoexDm->curPsTdma == 16)
1992 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(12);
1995 if (pCoexDm->curPsTdma == 1)
1996 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
1997 else if (pCoexDm->curPsTdma == 2)
1998 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
1999 else if (pCoexDm->curPsTdma == 3)
2000 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(4);
2001 else if (pCoexDm->curPsTdma == 9)
2002 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
2003 else if (pCoexDm->curPsTdma == 10)
2004 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
2005 else if (pCoexDm->curPsTdma == 11)
2006 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(12);
2007 } else if (result == 1) {
2008 if (pCoexDm->curPsTdma == 4)
2009 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
2010 else if (pCoexDm->curPsTdma == 3)
2011 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
2012 else if (pCoexDm->curPsTdma == 2)
2013 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(3);
2014 else if (pCoexDm->curPsTdma == 12)
2015 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
2016 else if (pCoexDm->curPsTdma == 11)
2017 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
2018 else if (pCoexDm->curPsTdma == 10)
2019 HAL_BTC8723B2ANT_DMA_DURATION_ADJUST(11);
2025 /* if current PsTdma not match with the recorded one (when scan, dhcp...), */
2026 /* then we have to adjust it back to the previous record one. */
2027 if (pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType) {
2028 bool bScan = false, bLink = false, bRoam = false;
2031 ALGO_TRACE_FW_DETAIL,
2033 "[BTCoex], PsTdma type mismatch!!!, curPsTdma =%d, recordPsTdma =%d\n",
2035 pCoexDm->psTdmaDuAdjType
2039 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);
2040 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);
2041 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);
2043 if (!bScan && !bLink && !bRoam)
2044 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, pCoexDm->psTdmaDuAdjType);
2046 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n"));
2051 /* SCO only or SCO+PAN(HS) */
2052 static void halbtc8723b2ant_ActionSco(PBTC_COEXIST pBtCoexist)
2054 u8 wifiRssiState, btRssiState;
2057 wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2058 btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2060 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2062 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2064 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 4);
2066 if (BTC_RSSI_HIGH(btRssiState))
2067 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2069 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2071 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2073 if (BTC_WIFI_BW_LEGACY == wifiBw) /* for SCO quality at 11b/g mode */
2074 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
2075 else /* for SCO quality & wifi performance balance at 11n mode */
2076 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);
2078 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 0); /* for voice quality */
2081 if (BTC_WIFI_BW_HT40 == wifiBw) {
2083 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2084 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2086 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2087 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, true, 0x4);
2089 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2090 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, true, 0x4);
2094 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2095 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2097 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2098 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, true, 0x4);
2100 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2101 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, true, 0x4);
2107 static void halbtc8723b2ant_ActionHid(PBTC_COEXIST pBtCoexist)
2109 u8 wifiRssiState, btRssiState;
2112 wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2113 btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2115 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2117 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2119 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2121 if (BTC_RSSI_HIGH(btRssiState))
2122 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2124 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2126 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2128 if (BTC_WIFI_BW_LEGACY == wifiBw) /* for HID at 11b/g mode */
2129 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2130 else /* for HID quality & wifi performance balance at 11n mode */
2131 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 9);
2134 (btRssiState == BTC_RSSI_STATE_HIGH) ||
2135 (btRssiState == BTC_RSSI_STATE_STAY_HIGH)
2137 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 9);
2139 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 13);
2142 if (BTC_WIFI_BW_HT40 == wifiBw) {
2144 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2145 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2147 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2148 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2150 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2151 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2155 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2156 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2158 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2159 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2161 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2162 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2167 /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
2168 static void halbtc8723b2ant_ActionA2dp(PBTC_COEXIST pBtCoexist)
2170 u8 wifiRssiState, wifiRssiState1, btRssiState;
2174 wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2175 wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, 40, 0);
2176 btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2178 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);
2180 /* define the office environment */
2181 if (apNum >= 10 && BTC_RSSI_HIGH(wifiRssiState1)) {
2182 /* DbgPrint(" AP#>10(%d)\n", apNum); */
2183 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2184 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2185 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2186 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2187 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
2188 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
2191 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2192 if (BTC_WIFI_BW_HT40 == wifiBw) {
2193 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2194 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, true, 0x18);
2196 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2197 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, true, 0x18);
2202 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2203 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2205 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2207 if (BTC_RSSI_HIGH(btRssiState))
2208 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2210 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2212 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2215 (btRssiState == BTC_RSSI_STATE_HIGH) ||
2216 (btRssiState == BTC_RSSI_STATE_STAY_HIGH)
2218 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, false, false, 1);
2220 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, false, true, 1);
2223 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2224 if (BTC_WIFI_BW_HT40 == wifiBw) {
2226 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2227 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2229 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2230 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2232 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2233 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2237 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2238 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2240 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2241 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2243 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2244 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2249 static void halbtc8723b2ant_ActionA2dpPanHs(PBTC_COEXIST pBtCoexist)
2251 u8 wifiRssiState, btRssiState;
2254 wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2255 btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2257 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2259 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2261 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2263 if (BTC_RSSI_HIGH(btRssiState))
2264 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2266 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2268 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2270 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, false, true, 2);
2273 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2274 if (BTC_WIFI_BW_HT40 == wifiBw) {
2276 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2277 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2279 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2280 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2282 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2283 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2287 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2288 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2290 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2291 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2293 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2294 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2299 static void halbtc8723b2ant_ActionPanEdr(PBTC_COEXIST pBtCoexist)
2301 u8 wifiRssiState, btRssiState;
2304 wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2305 btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2307 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2309 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2311 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2313 if (BTC_RSSI_HIGH(btRssiState))
2314 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2316 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2318 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 10);
2321 (btRssiState == BTC_RSSI_STATE_HIGH) ||
2322 (btRssiState == BTC_RSSI_STATE_STAY_HIGH)
2324 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 1);
2326 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 5);
2329 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2330 if (BTC_WIFI_BW_HT40 == wifiBw) {
2332 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2333 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2335 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2336 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2338 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2339 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2343 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2344 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2346 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2347 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2349 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2350 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2357 static void halbtc8723b2ant_ActionPanHs(PBTC_COEXIST pBtCoexist)
2359 u8 wifiRssiState, btRssiState;
2362 wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2363 btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2365 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2367 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2369 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2371 if (BTC_RSSI_HIGH(btRssiState))
2372 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2374 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2376 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2378 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
2380 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2381 if (BTC_WIFI_BW_HT40 == wifiBw) {
2383 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2384 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2386 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2387 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2389 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2390 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2394 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2395 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2397 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2398 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2400 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2401 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2407 static void halbtc8723b2ant_ActionPanEdrA2dp(PBTC_COEXIST pBtCoexist)
2409 u8 wifiRssiState, btRssiState;
2412 wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2413 btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2415 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2417 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2419 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2421 if (BTC_RSSI_HIGH(btRssiState))
2422 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2424 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2426 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2429 (btRssiState == BTC_RSSI_STATE_HIGH) ||
2430 (btRssiState == BTC_RSSI_STATE_STAY_HIGH)
2432 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 12);
2433 if (BTC_WIFI_BW_HT40 == wifiBw)
2434 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, false, true, 3);
2436 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, false, false, 3);
2438 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2439 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, false, true, 3);
2443 if (BTC_WIFI_BW_HT40 == wifiBw) {
2445 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2446 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2448 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2449 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2451 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2452 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2456 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2457 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2459 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2460 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2462 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2463 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2468 static void halbtc8723b2ant_ActionPanEdrHid(PBTC_COEXIST pBtCoexist)
2470 u8 wifiRssiState, btRssiState;
2473 wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2474 btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2475 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2477 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2479 if (BTC_RSSI_HIGH(btRssiState))
2480 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2482 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2485 (btRssiState == BTC_RSSI_STATE_HIGH) ||
2486 (btRssiState == BTC_RSSI_STATE_STAY_HIGH)
2488 if (BTC_WIFI_BW_HT40 == wifiBw) {
2489 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 3);
2490 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 11);
2491 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);
2493 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2494 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2495 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2497 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, false, 2);
2499 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2500 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 11);
2501 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2502 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, true, 2);
2506 if (BTC_WIFI_BW_HT40 == wifiBw) {
2508 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2509 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2511 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2512 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2514 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2515 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2519 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2520 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2522 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2523 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2525 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2526 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2531 /* HID+A2DP+PAN(EDR) */
2532 static void halbtc8723b2ant_ActionHidA2dpPanEdr(PBTC_COEXIST pBtCoexist)
2534 u8 wifiRssiState, btRssiState;
2537 wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2538 btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2540 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2542 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2544 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2546 if (BTC_RSSI_HIGH(btRssiState))
2547 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2549 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2551 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2553 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2556 (btRssiState == BTC_RSSI_STATE_HIGH) ||
2557 (btRssiState == BTC_RSSI_STATE_STAY_HIGH)
2559 if (BTC_WIFI_BW_HT40 == wifiBw)
2560 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, true, 2);
2562 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, false, 3);
2564 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, true, 3);
2567 if (BTC_WIFI_BW_HT40 == wifiBw) {
2569 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2570 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2572 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2573 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2575 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2576 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2580 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2581 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2583 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2584 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2586 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2587 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2592 static void halbtc8723b2ant_ActionHidA2dp(PBTC_COEXIST pBtCoexist)
2594 u8 wifiRssiState, btRssiState;
2598 wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2599 /* btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0); */
2600 btRssiState = halbtc8723b2ant_BtRssiState(3, 29, 37);
2602 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2604 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, true, 0x5);
2606 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2608 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2609 if (BTC_WIFI_BW_LEGACY == wifiBw) {
2610 if (BTC_RSSI_HIGH(btRssiState))
2611 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2612 else if (BTC_RSSI_MEDIUM(btRssiState))
2613 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2615 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2617 /* only 802.11N mode we have to dec bt power to 4 degree */
2618 if (BTC_RSSI_HIGH(btRssiState)) {
2619 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);
2620 /* need to check ap Number of Not */
2622 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);
2624 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2625 } else if (BTC_RSSI_MEDIUM(btRssiState))
2626 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2628 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2631 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2634 (btRssiState == BTC_RSSI_STATE_HIGH) ||
2635 (btRssiState == BTC_RSSI_STATE_STAY_HIGH)
2637 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, false, 2);
2639 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, true, 2);
2642 if (BTC_WIFI_BW_HT40 == wifiBw) {
2644 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2645 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2647 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2648 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2650 halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2651 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2655 (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2656 (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2658 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2659 halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2661 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2662 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2667 static void halbtc8723b2ant_RunCoexistMechanism(PBTC_COEXIST pBtCoexist)
2671 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism() ===>\n"));
2673 if (pBtCoexist->bManualControl) {
2674 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n"));
2678 if (pCoexSta->bUnderIps) {
2679 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is under IPS !!!\n"));
2683 algorithm = halbtc8723b2ant_ActionAlgorithm(pBtCoexist);
2684 if (pCoexSta->bC2hBtInquiryPage && (BT_8723B_2ANT_COEX_ALGO_PANHS != algorithm)) {
2685 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT is under inquiry/page scan !!\n"));
2686 halbtc8723b2ant_ActionBtInquiry(pBtCoexist);
2689 if (pCoexDm->bNeedRecover0x948) {
2690 pCoexDm->bNeedRecover0x948 = false;
2691 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, pCoexDm->backup0x948);
2695 pCoexDm->curAlgorithm = algorithm;
2696 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Algorithm = %d\n", pCoexDm->curAlgorithm));
2698 if (halbtc8723b2ant_IsCommonAction(pBtCoexist)) {
2699 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant common.\n"));
2700 pCoexDm->bAutoTdmaAdjust = false;
2702 if (pCoexDm->curAlgorithm != pCoexDm->preAlgorithm) {
2707 "[BTCoex], preAlgorithm =%d, curAlgorithm =%d\n",
2708 pCoexDm->preAlgorithm,
2709 pCoexDm->curAlgorithm
2712 pCoexDm->bAutoTdmaAdjust = false;
2716 switch (pCoexDm->curAlgorithm) {
2717 case BT_8723B_2ANT_COEX_ALGO_SCO:
2718 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n"));
2719 halbtc8723b2ant_ActionSco(pBtCoexist);
2721 case BT_8723B_2ANT_COEX_ALGO_HID:
2722 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID.\n"));
2723 halbtc8723b2ant_ActionHid(pBtCoexist);
2725 case BT_8723B_2ANT_COEX_ALGO_A2DP:
2726 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n"));
2727 halbtc8723b2ant_ActionA2dp(pBtCoexist);
2729 case BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS:
2730 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n"));
2731 halbtc8723b2ant_ActionA2dpPanHs(pBtCoexist);
2733 case BT_8723B_2ANT_COEX_ALGO_PANEDR:
2734 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n"));
2735 halbtc8723b2ant_ActionPanEdr(pBtCoexist);
2737 case BT_8723B_2ANT_COEX_ALGO_PANHS:
2738 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n"));
2739 halbtc8723b2ant_ActionPanHs(pBtCoexist);
2741 case BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP:
2742 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n"));
2743 halbtc8723b2ant_ActionPanEdrA2dp(pBtCoexist);
2745 case BT_8723B_2ANT_COEX_ALGO_PANEDR_HID:
2746 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n"));
2747 halbtc8723b2ant_ActionPanEdrHid(pBtCoexist);
2749 case BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
2750 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n"));
2751 halbtc8723b2ant_ActionHidA2dpPanEdr(pBtCoexist);
2753 case BT_8723B_2ANT_COEX_ALGO_HID_A2DP:
2754 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n"));
2755 halbtc8723b2ant_ActionHidA2dp(pBtCoexist);
2758 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n"));
2759 halbtc8723b2ant_CoexAllOff(pBtCoexist);
2762 pCoexDm->preAlgorithm = pCoexDm->curAlgorithm;
2766 static void halbtc8723b2ant_WifiOffHwCfg(PBTC_COEXIST pBtCoexist)
2768 bool bIsInMpMode = false;
2769 u8 H2C_Parameter[2] = {0};
2772 /* set wlan_act to low */
2773 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
2775 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); /* WiFi goto standby while GNT_BT 0-->1 */
2776 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);
2777 if (fwVer >= 0x180000) {
2778 /* Use H2C to set GNT_BT to HIGH */
2779 H2C_Parameter[0] = 1;
2780 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);
2782 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);
2784 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode);
2786 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); /* BT select s0/s1 is controlled by BT */
2788 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); /* BT select s0/s1 is controlled by WiFi */
2791 static void halbtc8723b2ant_InitHwConfig(PBTC_COEXIST pBtCoexist, bool bBackUp)
2795 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n"));
2797 /* backup rf 0x1e value */
2798 pCoexDm->btRf0x1eBackup =
2799 pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);
2801 /* 0x790[5:0]= 0x5 */
2802 u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);
2805 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);
2807 /* Antenna config */
2808 halbtc8723b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, true, false);
2811 halbtc8723b2ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);
2813 /* Enable counter statistics */
2814 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); /* 0x76e[3] = 1, WLAN_Act control by PTA */
2815 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);
2816 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);
2820 /* work around function start with wa_halbtc8723b2ant_ */
2823 /* extern function start with EXhalbtc8723b2ant_ */
2825 void EXhalbtc8723b2ant_PowerOnSetting(PBTC_COEXIST pBtCoexist)
2827 PBTC_BOARD_INFO pBoardInfo = &pBtCoexist->boardInfo;
2828 u8 u1Tmp = 0x4; /* Set BIT2 by default since it's 2ant case */
2831 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20);
2833 /* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. */
2834 u2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2);
2835 pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp|BIT0|BIT1);
2837 /* set GRAN_BT = 1 */
2838 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);
2839 /* set WLAN_ACT = 0 */
2840 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
2843 /* S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info) */
2844 /* Local setting bit define */
2845 /* BIT0: "0" for no antenna inverse; "1" for antenna inverse */
2846 /* BIT1: "0" for internal switch; "1" for external switch */
2847 /* BIT2: "0" for one antenna; "1" for two antenna */
2848 /* NOTE: here default all internal switch and 1-antenna ==> BIT1 = 0 and BIT2 = 0 */
2849 if (pBtCoexist->chipInterface == BTC_INTF_USB) {
2850 /* fixed at S0 for USB interface */
2851 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
2853 u1Tmp |= 0x1; /* antenna inverse */
2854 pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);
2856 pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;
2858 /* for PCIE and SDIO interface, we check efuse 0xc3[6] */
2859 if (pBoardInfo->singleAntPath == 0) {
2861 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);
2862 pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
2863 } else if (pBoardInfo->singleAntPath == 1) {
2865 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
2866 u1Tmp |= 0x1; /* antenna inverse */
2867 pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;
2870 if (pBtCoexist->chipInterface == BTC_INTF_PCI)
2871 pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);
2872 else if (pBtCoexist->chipInterface == BTC_INTF_SDIO)
2873 pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);
2877 void EXhalbtc8723b2ant_InitHwConfig(PBTC_COEXIST pBtCoexist, bool bWifiOnly)
2879 halbtc8723b2ant_InitHwConfig(pBtCoexist, true);
2882 void EXhalbtc8723b2ant_InitCoexDm(PBTC_COEXIST pBtCoexist)
2884 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n"));
2886 halbtc8723b2ant_InitCoexDm(pBtCoexist);
2889 void EXhalbtc8723b2ant_DisplayCoexInfo(PBTC_COEXIST pBtCoexist)
2891 PBTC_BOARD_INFO pBoardInfo = &pBtCoexist->boardInfo;
2892 PBTC_STACK_INFO pStackInfo = &pBtCoexist->stackInfo;
2893 PBTC_BT_LINK_INFO pBtLinkInfo = &pBtCoexist->btLinkInfo;
2894 u8 *cliBuf = pBtCoexist->cliBuf;
2895 u8 u1Tmp[4], i, btInfoExt, psTdmaCase = 0;
2897 bool bRoam = false, bScan = false, bLink = false, bWifiUnder5G = false;
2898 bool bBtHsOn = false, bWifiBusy = false;
2899 s32 wifiRssi = 0, btHsRssi = 0;
2900 u32 wifiBw, wifiTrafficDir, faOfdm, faCck;
2901 u8 wifiDot11Chnl, wifiHsChnl;
2902 u32 fwVer = 0, btPatchVer = 0;
2905 CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");
2908 if (pBtCoexist->bManualControl) {
2909 CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[Under Manual Control]============");
2911 CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ==========================================");
2918 "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \
2919 pBoardInfo->pgAntNum,
2920 pBoardInfo->btdmAntNum
2927 "\r\n %-35s = %s / %d", "BT stack/ hci ext ver", \
2928 (pStackInfo->bProfileNotified ? "Yes" : "No"),
2929 pStackInfo->hciVersion
2933 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);
2934 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);
2935 CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)", "CoexVer/ FwVer/ PatchVer", \
2936 GLCoexVerDate8723b2Ant, GLCoexVer8723b2Ant, fwVer, btPatchVer, btPatchVer);
2939 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
2940 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);
2941 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);
2945 "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsChnl(HsMode)", \
2955 "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \
2956 pCoexDm->wifiChnlInfo[0],
2957 pCoexDm->wifiChnlInfo[1],
2958 pCoexDm->wifiChnlInfo[2]
2962 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);
2963 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);
2964 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);
2968 "\r\n %-35s = %d/ %d/ %d", "Wifi rssi/ HS rssi/ AP#", \
2975 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);
2976 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);
2977 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);
2981 "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \
2988 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);
2989 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2990 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
2991 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);
2995 "\r\n %-35s = %s / %s/ %s ", "Wifi status", \
2996 (bWifiUnder5G ? "5G" : "2.4G"),
2997 ((BTC_WIFI_BW_LEGACY == wifiBw) ? "Legacy" : (((BTC_WIFI_BW_HT40 == wifiBw) ? "HT40" : "HT20"))),
2998 ((!bWifiBusy) ? "idle" : ((BTC_WIFI_TRAFFIC_TX == wifiTrafficDir) ? "uplink" : "downlink"))
3005 "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \
3006 ((pBtCoexist->btInfo.bBtDisabled) ? ("disabled") : ((pCoexSta->bC2hBtInquiryPage) ? ("inquiry/page scan") : ((BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) ? "non-connected idle" :
3007 ((BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ? "connected-idle" : "busy")))),
3009 pCoexSta->btRetryCnt
3016 "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \
3017 pBtLinkInfo->bScoExist,
3018 pBtLinkInfo->bHidExist,
3019 pBtLinkInfo->bPanExist,
3020 pBtLinkInfo->bA2dpExist
3023 pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);
3025 btInfoExt = pCoexSta->btInfoExt;
3029 "\r\n %-35s = %s", "BT Info A2DP rate", \
3030 (btInfoExt&BIT0) ? "Basic rate" : "EDR rate"
3034 for (i = 0; i < BT_INFO_SRC_8723B_2ANT_MAX; i++) {
3035 if (pCoexSta->btInfoC2hCnt[i]) {
3039 "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)", GLBtInfoSrc8723b2Ant[i], \
3040 pCoexSta->btInfoC2h[i][0],
3041 pCoexSta->btInfoC2h[i][1],
3042 pCoexSta->btInfoC2h[i][2],
3043 pCoexSta->btInfoC2h[i][3],
3044 pCoexSta->btInfoC2h[i][4],
3045 pCoexSta->btInfoC2h[i][5],
3046 pCoexSta->btInfoC2h[i][6],
3047 pCoexSta->btInfoC2hCnt[i]
3056 "\r\n %-35s = %s/%s", "PS state, IPS/LPS", \
3057 ((pCoexSta->bUnderIps ? "IPS ON" : "IPS OFF")),
3058 ((pCoexSta->bUnderLps ? "LPS ON" : "LPS OFF"))
3061 pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);
3067 "\r\n %-35s", "============[Sw mechanism]============"
3073 "\r\n %-35s = %d/ %d/ %d ", "SM1[ShRf/ LpRA/ LimDig]", \
3074 pCoexDm->bCurRfRxLpfShrink,
3075 pCoexDm->bCurLowPenaltyRa,
3076 pCoexDm->bLimitedDig
3082 "\r\n %-35s = %d/ %d/ %d(0x%x) ",
3083 "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]", \
3084 pCoexDm->bCurAgcTableEn,
3085 pCoexDm->bCurAdcBackOff,
3086 pCoexDm->bCurDacSwingOn,
3087 pCoexDm->curDacSwingLvl
3092 CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw mechanism]============");
3095 psTdmaCase = pCoexDm->curPsTdma;
3099 "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)", "PS TDMA", \
3100 pCoexDm->psTdmaPara[0],
3101 pCoexDm->psTdmaPara[1],
3102 pCoexDm->psTdmaPara[2],
3103 pCoexDm->psTdmaPara[3],
3104 pCoexDm->psTdmaPara[4],
3105 psTdmaCase, pCoexDm->bAutoTdmaAdjust
3112 "\r\n %-35s = %d/ %d ", "DecBtPwr/ IgnWlanAct", \
3113 pCoexDm->curBtDecPwrLvl,
3114 pCoexDm->bCurIgnoreWlanAct
3119 CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw setting]============");
3125 "\r\n %-35s = 0x%x", "RF-A, 0x1e initVal", \
3126 pCoexDm->btRf0x1eBackup
3130 u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);
3131 u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x880);
3135 "\r\n %-35s = 0x%x/ 0x%x", "0x778/0x880[29:25]", \
3137 (u4Tmp[0]&0x3e000000) >> 25
3142 u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);
3143 u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);
3144 u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);
3148 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x948/ 0x67[5] / 0x765", \
3150 ((u1Tmp[0]&0x20)>>5),
3155 u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x92c);
3156 u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x930);
3157 u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x944);
3161 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]", \
3169 u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x39);
3170 u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);
3171 u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);
3172 u1Tmp[2] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x64);
3176 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x38[11]/0x40/0x4c[24:23]/0x64[0]", \
3177 ((u1Tmp[0] & 0x8)>>3),
3179 ((u4Tmp[0]&0x01800000)>>23),
3184 u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);
3185 u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);
3189 "\r\n %-35s = 0x%x/ 0x%x", "0x550(bcn ctrl)/0x522", \
3195 u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);
3196 u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49c);
3200 "\r\n %-35s = 0x%x/ 0x%x", "0xc50(dig)/0x49c(null-drop)", \
3206 u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda0);
3207 u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda4);
3208 u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda8);
3209 u4Tmp[3] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcf0);
3211 u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5b);
3212 u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5c);
3215 ((u4Tmp[0]&0xffff0000) >> 16) +
3216 ((u4Tmp[1]&0xffff0000) >> 16) +
3217 (u4Tmp[1] & 0xffff) + (u4Tmp[2] & 0xffff) + \
3218 ((u4Tmp[3]&0xffff0000) >> 16) +
3219 (u4Tmp[3] & 0xffff);
3221 faCck = (u1Tmp[0] << 8) + u1Tmp[1];
3226 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "OFDM-CCA/OFDM-FA/CCK-FA", \
3233 u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);
3234 u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);
3235 u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);
3236 u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);
3240 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)", \
3251 "\r\n %-35s = %d/ %d", "0x770(high-pri rx/tx)", \
3252 pCoexSta->highPriorityRx,
3253 pCoexSta->highPriorityTx
3259 "\r\n %-35s = %d/ %d", "0x774(low-pri rx/tx)", \
3260 pCoexSta->lowPriorityRx,
3261 pCoexSta->lowPriorityTx
3265 halbtc8723b2ant_MonitorBtCtr(pBtCoexist);
3266 pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);
3270 void EXhalbtc8723b2ant_IpsNotify(PBTC_COEXIST pBtCoexist, u8 type)
3272 if (BTC_IPS_ENTER == type) {
3273 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n"));
3274 pCoexSta->bUnderIps = true;
3275 halbtc8723b2ant_WifiOffHwCfg(pBtCoexist);
3276 halbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, true);
3277 halbtc8723b2ant_CoexAllOff(pBtCoexist);
3278 } else if (BTC_IPS_LEAVE == type) {
3279 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));
3280 pCoexSta->bUnderIps = false;
3281 halbtc8723b2ant_InitHwConfig(pBtCoexist, false);
3282 halbtc8723b2ant_InitCoexDm(pBtCoexist);
3283 halbtc8723b2ant_QueryBtInfo(pBtCoexist);
3287 void EXhalbtc8723b2ant_LpsNotify(PBTC_COEXIST pBtCoexist, u8 type)
3289 if (BTC_LPS_ENABLE == type) {
3290 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n"));
3291 pCoexSta->bUnderLps = true;
3292 } else if (BTC_LPS_DISABLE == type) {
3293 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n"));
3294 pCoexSta->bUnderLps = false;
3298 void EXhalbtc8723b2ant_ScanNotify(PBTC_COEXIST pBtCoexist, u8 type)
3300 if (BTC_SCAN_START == type) {
3301 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));
3302 } else if (BTC_SCAN_FINISH == type) {
3303 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));
3307 void EXhalbtc8723b2ant_ConnectNotify(PBTC_COEXIST pBtCoexist, u8 type)
3309 if (BTC_ASSOCIATE_START == type) {
3310 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));
3311 } else if (BTC_ASSOCIATE_FINISH == type) {
3312 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));
3316 void EXhalbtc8723b2ant_MediaStatusNotify(PBTC_COEXIST pBtCoexist, u8 type)
3318 u8 H2C_Parameter[3] = {0};
3323 if (BTC_MEDIA_CONNECT == type) {
3324 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n"));
3326 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n"));
3329 /* only 2.4G we need to inform bt the chnl mask */
3330 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);
3331 if ((BTC_MEDIA_CONNECT == type) && (wifiCentralChnl <= 14)) {
3332 H2C_Parameter[0] = 0x1;
3333 H2C_Parameter[1] = wifiCentralChnl;
3334 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
3335 if (BTC_WIFI_BW_HT40 == wifiBw)
3336 H2C_Parameter[2] = 0x30;
3338 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);
3340 H2C_Parameter[2] = 0x30;
3342 H2C_Parameter[2] = 0x20;
3346 pCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];
3347 pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];
3348 pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];
3354 "[BTCoex], FW write 0x66 = 0x%x\n",
3355 H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]
3359 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);
3362 void EXhalbtc8723b2ant_SpecialPacketNotify(PBTC_COEXIST pBtCoexist, u8 type)
3364 if (type == BTC_PACKET_DHCP) {
3365 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], DHCP Packet notify\n"));
3369 void EXhalbtc8723b2ant_BtInfoNotify(
3370 PBTC_COEXIST pBtCoexist, u8 *tmpBuf, u8 length
3374 u8 i, rspSource = 0;
3375 bool bBtBusy = false, bLimitedDig = false;
3376 bool bWifiConnected = false;
3378 pCoexSta->bC2hBtInfoReqSent = false;
3380 rspSource = tmpBuf[0]&0xf;
3381 if (rspSource >= BT_INFO_SRC_8723B_2ANT_MAX)
3382 rspSource = BT_INFO_SRC_8723B_2ANT_WIFI_FW;
3384 pCoexSta->btInfoC2hCnt[rspSource]++;
3386 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length =%d, hex data =[", rspSource, length));
3387 for (i = 0; i < length; i++) {
3388 pCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];
3392 if (i == length-1) {
3393 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i]));
3395 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i]));
3399 if (pBtCoexist->bManualControl) {
3400 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n"));
3404 if (BT_INFO_SRC_8723B_2ANT_WIFI_FW != rspSource) {
3405 pCoexSta->btRetryCnt = pCoexSta->btInfoC2h[rspSource][2]&0xf; /* [3:0] */
3407 pCoexSta->btRssi = pCoexSta->btInfoC2h[rspSource][3]*2+10;
3409 pCoexSta->btInfoExt = pCoexSta->btInfoC2h[rspSource][4];
3411 pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);
3412 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);
3413 if (pCoexSta->bBtTxRxMask) {
3414 /* BT into is responded by BT FW and BT RF REG 0x3C != 0x01 => Need to switch BT TRx Mask */
3415 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\n"));
3416 pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01);
3419 /* Here we need to resend some wifi info to BT */
3420 /* because bt is reset and loss of the info. */
3421 if ((pCoexSta->btInfoExt & BIT1)) {
3422 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n"));
3423 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
3426 EXhalbtc8723b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);
3428 EXhalbtc8723b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);
3431 if ((pCoexSta->btInfoExt & BIT3)) {
3432 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n"));
3433 halbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, false);
3435 /* BT already NOT ignore Wlan active, do nothing here. */
3439 /* check BIT2 first ==> check if bt is under inquiry or page scan */
3440 if (btInfo & BT_INFO_8723B_2ANT_B_INQ_PAGE)
3441 pCoexSta->bC2hBtInquiryPage = true;
3443 pCoexSta->bC2hBtInquiryPage = false;
3445 /* set link exist status */
3446 if (!(btInfo&BT_INFO_8723B_2ANT_B_CONNECTION)) {
3447 pCoexSta->bBtLinkExist = false;
3448 pCoexSta->bPanExist = false;
3449 pCoexSta->bA2dpExist = false;
3450 pCoexSta->bHidExist = false;
3451 pCoexSta->bScoExist = false;
3452 } else { /* connection exists */
3453 pCoexSta->bBtLinkExist = true;
3454 if (btInfo & BT_INFO_8723B_2ANT_B_FTP)
3455 pCoexSta->bPanExist = true;
3457 pCoexSta->bPanExist = false;
3458 if (btInfo & BT_INFO_8723B_2ANT_B_A2DP)
3459 pCoexSta->bA2dpExist = true;
3461 pCoexSta->bA2dpExist = false;
3462 if (btInfo & BT_INFO_8723B_2ANT_B_HID)
3463 pCoexSta->bHidExist = true;
3465 pCoexSta->bHidExist = false;
3466 if (btInfo & BT_INFO_8723B_2ANT_B_SCO_ESCO)
3467 pCoexSta->bScoExist = true;
3469 pCoexSta->bScoExist = false;
3472 halbtc8723b2ant_UpdateBtLinkInfo(pBtCoexist);
3474 if (!(btInfo&BT_INFO_8723B_2ANT_B_CONNECTION)) {
3475 pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE;
3476 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n"));
3477 } else if (btInfo == BT_INFO_8723B_2ANT_B_CONNECTION) { /* connection exists but no busy */
3478 pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE;
3479 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n"));
3481 (btInfo&BT_INFO_8723B_2ANT_B_SCO_ESCO) ||
3482 (btInfo&BT_INFO_8723B_2ANT_B_SCO_BUSY)
3484 pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_SCO_BUSY;
3485 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n"));
3486 } else if (btInfo&BT_INFO_8723B_2ANT_B_ACL_BUSY) {
3487 pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_ACL_BUSY;
3488 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n"));
3490 pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_MAX;
3491 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n"));
3495 (BT_8723B_2ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||
3496 (BT_8723B_2ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||
3497 (BT_8723B_2ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus)
3503 bLimitedDig = false;
3506 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);
3508 pCoexDm->bLimitedDig = bLimitedDig;
3509 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &bLimitedDig);
3511 halbtc8723b2ant_RunCoexistMechanism(pBtCoexist);
3514 void EXhalbtc8723b2ant_HaltNotify(PBTC_COEXIST pBtCoexist)
3516 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));
3518 halbtc8723b2ant_WifiOffHwCfg(pBtCoexist);
3519 pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); /* BT goto standby while GNT_BT 1-->0 */
3520 halbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, true);
3522 EXhalbtc8723b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);
3525 void EXhalbtc8723b2ant_PnpNotify(PBTC_COEXIST pBtCoexist, u8 pnpState)
3527 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n"));
3529 if (BTC_WIFI_PNP_SLEEP == pnpState) {
3530 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));
3531 } else if (BTC_WIFI_PNP_WAKE_UP == pnpState) {
3532 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));
3533 halbtc8723b2ant_InitHwConfig(pBtCoexist, false);
3534 halbtc8723b2ant_InitCoexDm(pBtCoexist);
3535 halbtc8723b2ant_QueryBtInfo(pBtCoexist);
3539 void EXhalbtc8723b2ant_Periodical(PBTC_COEXIST pBtCoexist)
3541 static u8 disVerInfoCnt;
3542 u32 fwVer = 0, btPatchVer = 0;
3544 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ==========================Periodical ===========================\n"));
3546 if (disVerInfoCnt <= 5) {
3548 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n"));
3549 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);
3550 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);
3551 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \
3552 GLCoexVerDate8723b2Ant, GLCoexVer8723b2Ant, fwVer, btPatchVer, btPatchVer));
3553 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n"));
3557 halbtc8723b2ant_IsWifiStatusChanged(pBtCoexist) ||
3558 pCoexDm->bAutoTdmaAdjust
3560 halbtc8723b2ant_RunCoexistMechanism(pBtCoexist);