]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/staging/rtl8723bs/hal/HalBtc8723b2Ant.c
staging: Add rtl8723bs sdio wifi driver
[karo-tx-linux.git] / drivers / staging / rtl8723bs / hal / HalBtc8723b2Ant.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  ******************************************************************************/
15
16 #include "Mp_Precomp.h"
17
18 /*  Global variables, these are static variables */
19 static COEX_DM_8723B_2ANT GLCoexDm8723b2Ant;
20 static PCOEX_DM_8723B_2ANT pCoexDm = &GLCoexDm8723b2Ant;
21 static COEX_STA_8723B_2ANT GLCoexSta8723b2Ant;
22 static PCOEX_STA_8723B_2ANT pCoexSta = &GLCoexSta8723b2Ant;
23
24 static const char *const GLBtInfoSrc8723b2Ant[] = {
25         "BT Info[wifi fw]",
26         "BT Info[bt rsp]",
27         "BT Info[bt auto report]",
28 };
29
30 static u32 GLCoexVerDate8723b2Ant = 20131211;
31 static u32 GLCoexVer8723b2Ant = 0x40;
32
33 /*  local function start with halbtc8723b2ant_ */
34 static u8 halbtc8723b2ant_BtRssiState(
35         u8 levelNum, u8 rssiThresh, u8 rssiThresh1
36 )
37 {
38         s32 btRssi = 0;
39         u8 btRssiState = pCoexSta->preBtRssiState;
40
41         btRssi = pCoexSta->btRssi;
42
43         if (levelNum == 2) {
44                 if (
45                         (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||
46                         (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW)
47                 ) {
48                         if (btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) {
49                                 btRssiState = BTC_RSSI_STATE_HIGH;
50                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n"));
51                         } else {
52                                 btRssiState = BTC_RSSI_STATE_STAY_LOW;
53                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n"));
54                         }
55                 } else {
56                         if (btRssi < rssiThresh) {
57                                 btRssiState = BTC_RSSI_STATE_LOW;
58                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n"));
59                         } else {
60                                 btRssiState = BTC_RSSI_STATE_STAY_HIGH;
61                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n"));
62                         }
63                 }
64         } else if (levelNum == 3) {
65                 if (rssiThresh > rssiThresh1) {
66                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi thresh error!!\n"));
67                         return pCoexSta->preBtRssiState;
68                 }
69
70                 if (
71                         (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||
72                         (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW)
73                 ) {
74                         if (btRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) {
75                                 btRssiState = BTC_RSSI_STATE_MEDIUM;
76                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n"));
77                         } else {
78                                 btRssiState = BTC_RSSI_STATE_STAY_LOW;
79                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Low\n"));
80                         }
81                 } else if (
82                         (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||
83                         (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM)
84                 ) {
85                         if (btRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) {
86                                 btRssiState = BTC_RSSI_STATE_HIGH;
87                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to High\n"));
88                         } else if (btRssi < rssiThresh) {
89                                 btRssiState = BTC_RSSI_STATE_LOW;
90                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Low\n"));
91                         } else {
92                                 btRssiState = BTC_RSSI_STATE_STAY_MEDIUM;
93                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at Medium\n"));
94                         }
95                 } else {
96                         if (btRssi < rssiThresh1) {
97                                 btRssiState = BTC_RSSI_STATE_MEDIUM;
98                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state switch to Medium\n"));
99                         } else {
100                                 btRssiState = BTC_RSSI_STATE_STAY_HIGH;
101                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_BT_RSSI_STATE, ("[BTCoex], BT Rssi state stay at High\n"));
102                         }
103                 }
104         }
105
106         pCoexSta->preBtRssiState = btRssiState;
107
108         return btRssiState;
109 }
110
111 static u8 halbtc8723b2ant_WifiRssiState(
112         PBTC_COEXIST pBtCoexist,
113         u8 index,
114         u8 levelNum,
115         u8 rssiThresh,
116         u8 rssiThresh1
117 )
118 {
119         s32 wifiRssi = 0;
120         u8 wifiRssiState = pCoexSta->preWifiRssiState[index];
121
122         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);
123
124         if (levelNum == 2) {
125                 if (
126                         (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||
127                         (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW)
128                 ) {
129                         if (wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) {
130                                 wifiRssiState = BTC_RSSI_STATE_HIGH;
131                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n"));
132                         } else {
133                                 wifiRssiState = BTC_RSSI_STATE_STAY_LOW;
134                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n"));
135                         }
136                 } else {
137                         if (wifiRssi < rssiThresh) {
138                                 wifiRssiState = BTC_RSSI_STATE_LOW;
139                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n"));
140                         } else {
141                                 wifiRssiState = BTC_RSSI_STATE_STAY_HIGH;
142                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n"));
143                         }
144                 }
145         } else if (levelNum == 3) {
146                 if (rssiThresh > rssiThresh1) {
147                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI thresh error!!\n"));
148                         return pCoexSta->preWifiRssiState[index];
149                 }
150
151                 if (
152                         (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_LOW) ||
153                         (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_LOW)
154                 ) {
155                         if (wifiRssi >= (rssiThresh+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) {
156                                 wifiRssiState = BTC_RSSI_STATE_MEDIUM;
157                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n"));
158                         } else {
159                                 wifiRssiState = BTC_RSSI_STATE_STAY_LOW;
160                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Low\n"));
161                         }
162                 } else if (
163                         (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_MEDIUM) ||
164                         (pCoexSta->preWifiRssiState[index] == BTC_RSSI_STATE_STAY_MEDIUM)
165                 ) {
166                         if (wifiRssi >= (rssiThresh1+BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT)) {
167                                 wifiRssiState = BTC_RSSI_STATE_HIGH;
168                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to High\n"));
169                         } else if (wifiRssi < rssiThresh) {
170                                 wifiRssiState = BTC_RSSI_STATE_LOW;
171                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Low\n"));
172                         } else {
173                                 wifiRssiState = BTC_RSSI_STATE_STAY_MEDIUM;
174                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at Medium\n"));
175                         }
176                 } else {
177                         if (wifiRssi < rssiThresh1) {
178                                 wifiRssiState = BTC_RSSI_STATE_MEDIUM;
179                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state switch to Medium\n"));
180                         } else {
181                                 wifiRssiState = BTC_RSSI_STATE_STAY_HIGH;
182                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_WIFI_RSSI_STATE, ("[BTCoex], wifi RSSI state stay at High\n"));
183                         }
184                 }
185         }
186
187         pCoexSta->preWifiRssiState[index] = wifiRssiState;
188
189         return wifiRssiState;
190 }
191
192 static void halbtc8723b2ant_LimitedRx(
193         PBTC_COEXIST pBtCoexist,
194         bool bForceExec,
195         bool bRejApAggPkt,
196         bool bBtCtrlAggBufSize,
197         u8 aggBufSize
198 )
199 {
200         bool bRejectRxAgg = bRejApAggPkt;
201         bool bBtCtrlRxAggSize = bBtCtrlAggBufSize;
202         u8 rxAggSize = aggBufSize;
203
204         /*  */
205         /*      Rx Aggregation related setting */
206         /*  */
207         pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg);
208         /*  decide BT control aggregation buf size or not */
209         pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize);
210         /*  aggregation buf size, only work when BT control Rx aggregation size. */
211         pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);
212         /*  real update aggregation setting */
213         pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
214 }
215
216 static void halbtc8723b2ant_MonitorBtCtr(PBTC_COEXIST pBtCoexist)
217 {
218         u32 regHPTxRx, regLPTxRx, u4Tmp;
219         u32 regHPTx = 0, regHPRx = 0, regLPTx = 0, regLPRx = 0;
220
221         regHPTxRx = 0x770;
222         regLPTxRx = 0x774;
223
224         u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);
225         regHPTx = u4Tmp & bMaskLWord;
226         regHPRx = (u4Tmp & bMaskHWord)>>16;
227
228         u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);
229         regLPTx = u4Tmp & bMaskLWord;
230         regLPRx = (u4Tmp & bMaskHWord)>>16;
231
232         pCoexSta->highPriorityTx = regHPTx;
233         pCoexSta->highPriorityRx = regHPRx;
234         pCoexSta->lowPriorityTx = regLPTx;
235         pCoexSta->lowPriorityRx = regLPRx;
236
237         BTC_PRINT(
238                 BTC_MSG_ALGORITHM,
239                 ALGO_BT_MONITOR,
240                 (
241                         "[BTCoex], High Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",
242                         regHPTxRx,
243                         regHPTx,
244                         regHPTx,
245                         regHPRx,
246                         regHPRx
247                 )
248         );
249         BTC_PRINT(
250                 BTC_MSG_ALGORITHM,
251                 ALGO_BT_MONITOR,
252                 (
253                         "[BTCoex], Low Priority Tx/Rx (reg 0x%x) = 0x%x(%d)/0x%x(%d)\n",
254                         regLPTxRx,
255                         regLPTx,
256                         regLPTx,
257                         regLPRx,
258                         regLPRx
259                 )
260         );
261
262         /*  reset counter */
263         pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);
264 }
265
266 static void halbtc8723b2ant_QueryBtInfo(PBTC_COEXIST pBtCoexist)
267 {
268         u8      H2C_Parameter[1] = {0};
269
270         pCoexSta->bC2hBtInfoReqSent = true;
271
272         H2C_Parameter[0] |= BIT0;       /*  trigger */
273
274         BTC_PRINT(
275                 BTC_MSG_ALGORITHM,
276                 ALGO_TRACE_FW_EXEC,
277                 ("[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n", H2C_Parameter[0])
278         );
279
280         pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);
281 }
282
283 static bool halbtc8723b2ant_IsWifiStatusChanged(PBTC_COEXIST pBtCoexist)
284 {
285         static bool     bPreWifiBusy = false, bPreUnder4way = false, bPreBtHsOn = false;
286         bool bWifiBusy = false, bUnder4way = false, bBtHsOn = false;
287         bool bWifiConnected = false;
288
289         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
290         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
291         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
292         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);
293
294         if (bWifiConnected) {
295                 if (bWifiBusy != bPreWifiBusy) {
296                         bPreWifiBusy = bWifiBusy;
297                         return true;
298                 }
299
300                 if (bUnder4way != bPreUnder4way) {
301                         bPreUnder4way = bUnder4way;
302                         return true;
303                 }
304
305                 if (bBtHsOn != bPreBtHsOn) {
306                         bPreBtHsOn = bBtHsOn;
307                         return true;
308                 }
309         }
310
311         return false;
312 }
313
314 static void halbtc8723b2ant_UpdateBtLinkInfo(PBTC_COEXIST pBtCoexist)
315 {
316         PBTC_BT_LINK_INFO pBtLinkInfo = &pBtCoexist->btLinkInfo;
317         bool bBtHsOn = false;
318
319         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
320
321         pBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist;
322         pBtLinkInfo->bScoExist = pCoexSta->bScoExist;
323         pBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist;
324         pBtLinkInfo->bPanExist = pCoexSta->bPanExist;
325         pBtLinkInfo->bHidExist = pCoexSta->bHidExist;
326
327         /*  work around for HS mode. */
328         if (bBtHsOn) {
329                 pBtLinkInfo->bPanExist = true;
330                 pBtLinkInfo->bBtLinkExist = true;
331         }
332
333         /*  check if Sco only */
334         if (
335                 pBtLinkInfo->bScoExist &&
336                 !pBtLinkInfo->bA2dpExist &&
337                 !pBtLinkInfo->bPanExist &&
338                 !pBtLinkInfo->bHidExist
339         )
340                 pBtLinkInfo->bScoOnly = true;
341         else
342                 pBtLinkInfo->bScoOnly = false;
343
344         /*  check if A2dp only */
345         if (
346                 !pBtLinkInfo->bScoExist &&
347                 pBtLinkInfo->bA2dpExist &&
348                 !pBtLinkInfo->bPanExist &&
349                 !pBtLinkInfo->bHidExist
350         )
351                 pBtLinkInfo->bA2dpOnly = true;
352         else
353                 pBtLinkInfo->bA2dpOnly = false;
354
355         /*  check if Pan only */
356         if (
357                 !pBtLinkInfo->bScoExist &&
358                 !pBtLinkInfo->bA2dpExist &&
359                 pBtLinkInfo->bPanExist &&
360                 !pBtLinkInfo->bHidExist
361         )
362                 pBtLinkInfo->bPanOnly = true;
363         else
364                 pBtLinkInfo->bPanOnly = false;
365
366         /*  check if Hid only */
367         if (
368                 !pBtLinkInfo->bScoExist &&
369                 !pBtLinkInfo->bA2dpExist &&
370                 !pBtLinkInfo->bPanExist &&
371                 pBtLinkInfo->bHidExist
372         )
373                 pBtLinkInfo->bHidOnly = true;
374         else
375                 pBtLinkInfo->bHidOnly = false;
376 }
377
378 static u8 halbtc8723b2ant_ActionAlgorithm(PBTC_COEXIST pBtCoexist)
379 {
380         PBTC_BT_LINK_INFO pBtLinkInfo = &pBtCoexist->btLinkInfo;
381         bool bBtHsOn = false;
382         u8 algorithm = BT_8723B_2ANT_COEX_ALGO_UNDEFINED;
383         u8 numOfDiffProfile = 0;
384
385         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
386
387         if (!pBtLinkInfo->bBtLinkExist) {
388                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], No BT link exists!!!\n"));
389                 return algorithm;
390         }
391
392         if (pBtLinkInfo->bScoExist)
393                 numOfDiffProfile++;
394
395         if (pBtLinkInfo->bHidExist)
396                 numOfDiffProfile++;
397
398         if (pBtLinkInfo->bPanExist)
399                 numOfDiffProfile++;
400
401         if (pBtLinkInfo->bA2dpExist)
402                 numOfDiffProfile++;
403
404         if (numOfDiffProfile == 1) {
405                 if (pBtLinkInfo->bScoExist) {
406                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO only\n"));
407                         algorithm = BT_8723B_2ANT_COEX_ALGO_SCO;
408                 } else {
409                         if (pBtLinkInfo->bHidExist) {
410                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID only\n"));
411                                 algorithm = BT_8723B_2ANT_COEX_ALGO_HID;
412                         } else if (pBtLinkInfo->bA2dpExist) {
413                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP only\n"));
414                                 algorithm = BT_8723B_2ANT_COEX_ALGO_A2DP;
415                         } else if (pBtLinkInfo->bPanExist) {
416                                 if (bBtHsOn) {
417                                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(HS) only\n"));
418                                         algorithm = BT_8723B_2ANT_COEX_ALGO_PANHS;
419                                 } else {
420                                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], PAN(EDR) only\n"));
421                                         algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR;
422                                 }
423                         }
424                 }
425         } else if (numOfDiffProfile == 2) {
426                 if (pBtLinkInfo->bScoExist) {
427                         if (pBtLinkInfo->bHidExist) {
428                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID\n"));
429                                 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
430                         } else if (pBtLinkInfo->bA2dpExist) {
431                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP ==> SCO\n"));
432                                 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
433                         } else if (pBtLinkInfo->bPanExist) {
434                                 if (bBtHsOn) {
435                                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(HS)\n"));
436                                         algorithm = BT_8723B_2ANT_COEX_ALGO_SCO;
437                                 } else {
438                                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + PAN(EDR)\n"));
439                                         algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
440                                 }
441                         }
442                 } else {
443                         if (
444                                 pBtLinkInfo->bHidExist &&
445                                 pBtLinkInfo->bA2dpExist
446                         ) {
447                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP\n"));
448                                 algorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP;
449                         } else if (
450                                 pBtLinkInfo->bHidExist &&
451                                 pBtLinkInfo->bPanExist
452                         ) {
453                                 if (bBtHsOn) {
454                                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(HS)\n"));
455                                         algorithm = BT_8723B_2ANT_COEX_ALGO_HID;
456                                 } else {
457                                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + PAN(EDR)\n"));
458                                         algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
459                                 }
460                         } else if (
461                                 pBtLinkInfo->bPanExist &&
462                                 pBtLinkInfo->bA2dpExist
463                         ) {
464                                 if (bBtHsOn) {
465                                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(HS)\n"));
466                                         algorithm = BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS;
467                                 } else {
468                                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], A2DP + PAN(EDR)\n"));
469                                         algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP;
470                                 }
471                         }
472                 }
473         } else if (numOfDiffProfile == 3) {
474                 if (pBtLinkInfo->bScoExist) {
475                         if (
476                                 pBtLinkInfo->bHidExist &&
477                                 pBtLinkInfo->bA2dpExist
478                         ) {
479                                 BTC_PRINT(
480                                         BTC_MSG_ALGORITHM,
481                                         ALGO_TRACE,
482                                         ("[BTCoex], SCO + HID + A2DP ==> HID\n")
483                                 );
484                                 algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
485                         } else if (
486                                 pBtLinkInfo->bHidExist &&
487                                 pBtLinkInfo->bPanExist
488                         ) {
489                                 if (bBtHsOn) {
490                                         BTC_PRINT(
491                                                 BTC_MSG_ALGORITHM,
492                                                 ALGO_TRACE,
493                                                 ("[BTCoex], SCO + HID + PAN(HS)\n")
494                                         );
495                                         algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
496                                 } else {
497                                         BTC_PRINT(
498                                                 BTC_MSG_ALGORITHM,
499                                                 ALGO_TRACE,
500                                                 ("[BTCoex], SCO + HID + PAN(EDR)\n")
501                                         );
502                                         algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
503                                 }
504                         } else if (
505                                 pBtLinkInfo->bPanExist &&
506                                 pBtLinkInfo->bA2dpExist
507                         ) {
508                                 if (bBtHsOn) {
509                                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(HS)\n"));
510                                         algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
511                                 } else {
512                                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n"));
513                                         algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
514                                 }
515                         }
516                 } else {
517                         if (
518                                 pBtLinkInfo->bHidExist &&
519                                 pBtLinkInfo->bPanExist &&
520                                 pBtLinkInfo->bA2dpExist
521                         ) {
522                                 if (bBtHsOn) {
523                                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(HS)\n"));
524                                         algorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP;
525                                 } else {
526                                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], HID + A2DP + PAN(EDR)\n"));
527                                         algorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
528                                 }
529                         }
530                 }
531         } else if (numOfDiffProfile >= 3) {
532                 if (pBtLinkInfo->bScoExist) {
533                         if (
534                                 pBtLinkInfo->bHidExist &&
535                                 pBtLinkInfo->bPanExist &&
536                                 pBtLinkInfo->bA2dpExist
537                         ) {
538                                 if (bBtHsOn) {
539                                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n"));
540
541                                 } else {
542                                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], SCO + HID + A2DP + PAN(EDR) ==>PAN(EDR)+HID\n"));
543                                         algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
544                                 }
545                         }
546                 }
547         }
548
549         return algorithm;
550 }
551
552 static void halbtc8723b2ant_SetFwDacSwingLevel(
553         PBTC_COEXIST pBtCoexist, u8 dacSwingLvl
554 )
555 {
556         u8      H2C_Parameter[1] = {0};
557
558         /*  There are several type of dacswing */
559         /*  0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 */
560         H2C_Parameter[0] = dacSwingLvl;
561
562         BTC_PRINT(
563                 BTC_MSG_ALGORITHM,
564                 ALGO_TRACE_FW_EXEC,
565                 ("[BTCoex], Set Dac Swing Level = 0x%x\n", dacSwingLvl)
566         );
567         BTC_PRINT(
568                 BTC_MSG_ALGORITHM,
569                 ALGO_TRACE_FW_EXEC,
570                 ("[BTCoex], FW write 0x64 = 0x%x\n", H2C_Parameter[0])
571         );
572
573         pBtCoexist->fBtcFillH2c(pBtCoexist, 0x64, 1, H2C_Parameter);
574 }
575
576 static void halbtc8723b2ant_SetFwDecBtPwr(
577         PBTC_COEXIST pBtCoexist, u8 decBtPwrLvl
578 )
579 {
580         u8      H2C_Parameter[1] = {0};
581
582         H2C_Parameter[0] = decBtPwrLvl;
583
584         BTC_PRINT(
585                 BTC_MSG_ALGORITHM,
586                 ALGO_TRACE_FW_EXEC,
587                 (
588                         "[BTCoex], decrease Bt Power level = %d, FW write 0x62 = 0x%x\n",
589                         decBtPwrLvl,
590                         H2C_Parameter[0]
591                 )
592         );
593
594         pBtCoexist->fBtcFillH2c(pBtCoexist, 0x62, 1, H2C_Parameter);
595 }
596
597 static void halbtc8723b2ant_DecBtPwr(
598         PBTC_COEXIST pBtCoexist, bool bForceExec, u8 decBtPwrLvl
599 )
600 {
601         BTC_PRINT(
602                 BTC_MSG_ALGORITHM,
603                 ALGO_TRACE_FW,
604                 (
605                         "[BTCoex], %s Dec BT power level = %d\n",
606                         (bForceExec ? "force to" : ""),
607                         decBtPwrLvl
608                 )
609         );
610         pCoexDm->curBtDecPwrLvl = decBtPwrLvl;
611
612         if (!bForceExec) {
613                 BTC_PRINT(
614                         BTC_MSG_ALGORITHM,
615                         ALGO_TRACE_FW_DETAIL,
616                         (
617                                 "[BTCoex], preBtDecPwrLvl =%d, curBtDecPwrLvl =%d\n",
618                                 pCoexDm->preBtDecPwrLvl,
619                                 pCoexDm->curBtDecPwrLvl
620                         )
621                 );
622
623                 if (pCoexDm->preBtDecPwrLvl == pCoexDm->curBtDecPwrLvl)
624                         return;
625         }
626         halbtc8723b2ant_SetFwDecBtPwr(pBtCoexist, pCoexDm->curBtDecPwrLvl);
627
628         pCoexDm->preBtDecPwrLvl = pCoexDm->curBtDecPwrLvl;
629 }
630
631 static void halbtc8723b2ant_FwDacSwingLvl(
632         PBTC_COEXIST pBtCoexist, bool bForceExec, u8 fwDacSwingLvl
633 )
634 {
635         BTC_PRINT(
636                 BTC_MSG_ALGORITHM,
637                 ALGO_TRACE_FW,
638                 (
639                         "[BTCoex], %s set FW Dac Swing level = %d\n",
640                         (bForceExec ? "force to" : ""),
641                         fwDacSwingLvl
642                 )
643         );
644         pCoexDm->curFwDacSwingLvl = fwDacSwingLvl;
645
646         if (!bForceExec) {
647                 BTC_PRINT(
648                         BTC_MSG_ALGORITHM,
649                         ALGO_TRACE_FW_DETAIL,
650                         (
651                                 "[BTCoex], preFwDacSwingLvl =%d, curFwDacSwingLvl =%d\n",
652                                 pCoexDm->preFwDacSwingLvl,
653                                 pCoexDm->curFwDacSwingLvl
654                         )
655                 );
656
657                 if (pCoexDm->preFwDacSwingLvl == pCoexDm->curFwDacSwingLvl)
658                         return;
659         }
660
661         halbtc8723b2ant_SetFwDacSwingLevel(pBtCoexist, pCoexDm->curFwDacSwingLvl);
662
663         pCoexDm->preFwDacSwingLvl = pCoexDm->curFwDacSwingLvl;
664 }
665
666 static void halbtc8723b2ant_SetSwRfRxLpfCorner(
667         PBTC_COEXIST pBtCoexist,
668         bool bRxRfShrinkOn
669 )
670 {
671         if (bRxRfShrinkOn) {
672                 /* Shrink RF Rx LPF corner */
673                 BTC_PRINT(
674                         BTC_MSG_ALGORITHM,
675                         ALGO_TRACE_SW_EXEC,
676                         ("[BTCoex], Shrink RF Rx LPF corner!!\n")
677                 );
678                 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, 0xffffc);
679         } else {
680                 /* Resume RF Rx LPF corner */
681                 /*  After initialized, we can use pCoexDm->btRf0x1eBackup */
682                 if (pBtCoexist->bInitilized) {
683                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Resume RF Rx LPF corner!!\n"));
684                         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff, pCoexDm->btRf0x1eBackup);
685                 }
686         }
687 }
688
689 static void halbtc8723b2ant_RfShrink(
690         PBTC_COEXIST pBtCoexist, bool bForceExec, bool bRxRfShrinkOn
691 )
692 {
693         BTC_PRINT(
694                 BTC_MSG_ALGORITHM,
695                 ALGO_TRACE_SW,
696                 (
697                         "[BTCoex], %s turn Rx RF Shrink = %s\n",
698                         (bForceExec ? "force to" : ""),
699                         (bRxRfShrinkOn ? "ON" : "OFF")
700                 )
701         );
702         pCoexDm->bCurRfRxLpfShrink = bRxRfShrinkOn;
703
704         if (!bForceExec) {
705                 BTC_PRINT(
706                         BTC_MSG_ALGORITHM,
707                         ALGO_TRACE_SW_DETAIL,
708                         (
709                                 "[BTCoex], bPreRfRxLpfShrink =%d, bCurRfRxLpfShrink =%d\n",
710                                 pCoexDm->bPreRfRxLpfShrink,
711                                 pCoexDm->bCurRfRxLpfShrink
712                         )
713                 );
714
715                 if (pCoexDm->bPreRfRxLpfShrink == pCoexDm->bCurRfRxLpfShrink)
716                         return;
717         }
718         halbtc8723b2ant_SetSwRfRxLpfCorner(pBtCoexist, pCoexDm->bCurRfRxLpfShrink);
719
720         pCoexDm->bPreRfRxLpfShrink = pCoexDm->bCurRfRxLpfShrink;
721 }
722
723 static void halbtc8723b2ant_SetSwPenaltyTxRateAdaptive(
724         PBTC_COEXIST pBtCoexist, bool bLowPenaltyRa
725 )
726 {
727         u8      H2C_Parameter[6] = {0};
728
729         H2C_Parameter[0] = 0x6; /*  opCode, 0x6 = Retry_Penalty */
730
731         if (bLowPenaltyRa) {
732                 H2C_Parameter[1] |= BIT0;
733                 H2C_Parameter[2] = 0x00;  /* normal rate except MCS7/6/5, OFDM54/48/36 */
734                 H2C_Parameter[3] = 0xf7;  /* MCS7 or OFDM54 */
735                 H2C_Parameter[4] = 0xf8;  /* MCS6 or OFDM48 */
736                 H2C_Parameter[5] = 0xf9;        /* MCS5 or OFDM36 */
737         }
738
739         BTC_PRINT(
740                 BTC_MSG_ALGORITHM,
741                 ALGO_TRACE_FW_EXEC,
742                 (
743                         "[BTCoex], set WiFi Low-Penalty Retry: %s",
744                         (bLowPenaltyRa ? "ON!!" : "OFF!!")
745                 )
746         );
747
748         pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);
749 }
750
751 static void halbtc8723b2ant_LowPenaltyRa(
752         PBTC_COEXIST pBtCoexist, bool bForceExec, bool bLowPenaltyRa
753 )
754 {
755         /* return; */
756         BTC_PRINT(
757                 BTC_MSG_ALGORITHM,
758                 ALGO_TRACE_SW,
759                 (
760                         "[BTCoex], %s turn LowPenaltyRA = %s\n",
761                         (bForceExec ? "force to" : ""),
762                         (bLowPenaltyRa ? "ON" : "OFF")
763                 )
764         );
765         pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;
766
767         if (!bForceExec) {
768                 BTC_PRINT(
769                         BTC_MSG_ALGORITHM,
770                         ALGO_TRACE_SW_DETAIL,
771                         (
772                                 "[BTCoex], bPreLowPenaltyRa =%d, bCurLowPenaltyRa =%d\n",
773                                 pCoexDm->bPreLowPenaltyRa,
774                                 pCoexDm->bCurLowPenaltyRa
775                         )
776                 );
777
778                 if (pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa)
779                         return;
780         }
781         halbtc8723b2ant_SetSwPenaltyTxRateAdaptive(pBtCoexist, pCoexDm->bCurLowPenaltyRa);
782
783         pCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;
784 }
785
786 static void halbtc8723b2ant_SetDacSwingReg(PBTC_COEXIST pBtCoexist, u32 level)
787 {
788         u8 val = (u8)level;
789
790         BTC_PRINT(
791                 BTC_MSG_ALGORITHM,
792                 ALGO_TRACE_SW_EXEC,
793                 ("[BTCoex], Write SwDacSwing = 0x%x\n", level)
794         );
795         pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x883, 0x3e, val);
796 }
797
798 static void halbtc8723b2ant_SetSwFullTimeDacSwing(
799         PBTC_COEXIST pBtCoexist, bool bSwDacSwingOn, u32 swDacSwingLvl
800 )
801 {
802         if (bSwDacSwingOn)
803                 halbtc8723b2ant_SetDacSwingReg(pBtCoexist, swDacSwingLvl);
804         else
805                 halbtc8723b2ant_SetDacSwingReg(pBtCoexist, 0x18);
806 }
807
808
809 static void halbtc8723b2ant_DacSwing(
810         PBTC_COEXIST pBtCoexist,
811         bool bForceExec,
812         bool bDacSwingOn,
813         u32 dacSwingLvl
814 )
815 {
816         BTC_PRINT(
817                 BTC_MSG_ALGORITHM,
818                 ALGO_TRACE_SW,
819                 (
820                         "[BTCoex], %s turn DacSwing =%s, dacSwingLvl = 0x%x\n",
821                         (bForceExec ? "force to" : ""),
822                         (bDacSwingOn ? "ON" : "OFF"),
823                         dacSwingLvl
824                 )
825         );
826         pCoexDm->bCurDacSwingOn = bDacSwingOn;
827         pCoexDm->curDacSwingLvl = dacSwingLvl;
828
829         if (!bForceExec) {
830                 BTC_PRINT(
831                         BTC_MSG_ALGORITHM,
832                         ALGO_TRACE_SW_DETAIL,
833                         (
834                                 "[BTCoex], bPreDacSwingOn =%d, preDacSwingLvl = 0x%x, bCurDacSwingOn =%d, curDacSwingLvl = 0x%x\n",
835                                 pCoexDm->bPreDacSwingOn,
836                                 pCoexDm->preDacSwingLvl,
837                                 pCoexDm->bCurDacSwingOn,
838                                 pCoexDm->curDacSwingLvl
839                         )
840                 );
841
842                 if ((pCoexDm->bPreDacSwingOn == pCoexDm->bCurDacSwingOn) &&
843                         (pCoexDm->preDacSwingLvl == pCoexDm->curDacSwingLvl))
844                         return;
845         }
846         mdelay(30);
847         halbtc8723b2ant_SetSwFullTimeDacSwing(pBtCoexist, bDacSwingOn, dacSwingLvl);
848
849         pCoexDm->bPreDacSwingOn = pCoexDm->bCurDacSwingOn;
850         pCoexDm->preDacSwingLvl = pCoexDm->curDacSwingLvl;
851 }
852
853 static void halbtc8723b2ant_SetAgcTable(
854         PBTC_COEXIST pBtCoexist, bool bAgcTableEn
855 )
856 {
857         u8 rssiAdjustVal = 0;
858
859         /* BB AGC Gain Table */
860         if (bAgcTableEn) {
861                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB Agc Table On!\n"));
862                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6e1A0001);
863                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6d1B0001);
864                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6c1C0001);
865                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6b1D0001);
866                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x6a1E0001);
867                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x691F0001);
868                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0x68200001);
869         } else {
870                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], BB Agc Table Off!\n"));
871                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xaa1A0001);
872                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa91B0001);
873                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa81C0001);
874                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa71D0001);
875                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa61E0001);
876                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa51F0001);
877                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0xc78, 0xa4200001);
878         }
879
880
881         /* RF Gain */
882         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);
883         if (bAgcTableEn) {
884                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n"));
885                 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38fff);
886                 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x38ffe);
887         } else {
888                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n"));
889                 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x380c3);
890                 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x3b, 0xfffff, 0x28ce6);
891         }
892         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);
893
894         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x1);
895         if (bAgcTableEn) {
896                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table On!\n"));
897                 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38fff);
898                 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x38ffe);
899         } else {
900                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_SW_EXEC, ("[BTCoex], Agc Table Off!\n"));
901                 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x380c3);
902                 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x40, 0xfffff, 0x28ce6);
903         }
904         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0xed, 0xfffff, 0x0);
905
906         /*  set rssiAdjustVal for wifi module. */
907         if (bAgcTableEn)
908                 rssiAdjustVal = 8;
909
910         pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON, &rssiAdjustVal);
911 }
912
913 static void halbtc8723b2ant_AgcTable(
914         PBTC_COEXIST pBtCoexist, bool bForceExec, bool bAgcTableEn
915 )
916 {
917         BTC_PRINT(
918                 BTC_MSG_ALGORITHM,
919                 ALGO_TRACE_SW,
920                 (
921                         "[BTCoex], %s %s Agc Table\n",
922                         (bForceExec ? "force to" : ""),
923                         (bAgcTableEn ? "Enable" : "Disable")
924                 )
925         );
926         pCoexDm->bCurAgcTableEn = bAgcTableEn;
927
928         if (!bForceExec) {
929                 BTC_PRINT(
930                         BTC_MSG_ALGORITHM,
931                         ALGO_TRACE_SW_DETAIL,
932                         (
933                                 "[BTCoex], bPreAgcTableEn =%d, bCurAgcTableEn =%d\n",
934                                 pCoexDm->bPreAgcTableEn,
935                                 pCoexDm->bCurAgcTableEn
936                         )
937                 );
938
939                 if (pCoexDm->bPreAgcTableEn == pCoexDm->bCurAgcTableEn)
940                         return;
941         }
942         halbtc8723b2ant_SetAgcTable(pBtCoexist, bAgcTableEn);
943
944         pCoexDm->bPreAgcTableEn = pCoexDm->bCurAgcTableEn;
945 }
946
947 static void halbtc8723b2ant_SetCoexTable(
948         PBTC_COEXIST pBtCoexist,
949         u32 val0x6c0,
950         u32 val0x6c4,
951         u32 val0x6c8,
952         u8 val0x6cc
953 )
954 {
955         BTC_PRINT(
956                 BTC_MSG_ALGORITHM,
957                 ALGO_TRACE_SW_EXEC,
958                 ("[BTCoex], set coex table, set 0x6c0 = 0x%x\n", val0x6c0)
959         );
960         pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);
961
962         BTC_PRINT(
963                 BTC_MSG_ALGORITHM,
964                 ALGO_TRACE_SW_EXEC,
965                 ("[BTCoex], set coex table, set 0x6c4 = 0x%x\n", val0x6c4)
966         );
967         pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);
968
969         BTC_PRINT(
970                 BTC_MSG_ALGORITHM,
971                 ALGO_TRACE_SW_EXEC,
972                 ("[BTCoex], set coex table, set 0x6c8 = 0x%x\n", val0x6c8)
973         );
974         pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);
975
976         BTC_PRINT(
977                 BTC_MSG_ALGORITHM,
978                 ALGO_TRACE_SW_EXEC,
979                 ("[BTCoex], set coex table, set 0x6cc = 0x%x\n", val0x6cc)
980         );
981         pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);
982 }
983
984 static void halbtc8723b2ant_CoexTable(
985         PBTC_COEXIST pBtCoexist,
986         bool bForceExec,
987         u32 val0x6c0,
988         u32 val0x6c4,
989         u32 val0x6c8,
990         u8 val0x6cc
991 )
992 {
993         BTC_PRINT(
994                 BTC_MSG_ALGORITHM,
995                 ALGO_TRACE_SW,
996                 (
997                         "[BTCoex], %s write Coex Table 0x6c0 = 0x%x, 0x6c4 = 0x%x, 0x6c8 = 0x%x, 0x6cc = 0x%x\n",
998                         (bForceExec ? "force to" : ""),
999                         val0x6c0,
1000                         val0x6c4,
1001                         val0x6c8,
1002                         val0x6cc
1003                 )
1004         );
1005         pCoexDm->curVal0x6c0 = val0x6c0;
1006         pCoexDm->curVal0x6c4 = val0x6c4;
1007         pCoexDm->curVal0x6c8 = val0x6c8;
1008         pCoexDm->curVal0x6cc = val0x6cc;
1009
1010         if (!bForceExec) {
1011                 BTC_PRINT(
1012                         BTC_MSG_ALGORITHM,
1013                         ALGO_TRACE_SW_DETAIL,
1014                         (
1015                                 "[BTCoex], preVal0x6c0 = 0x%x, preVal0x6c4 = 0x%x, preVal0x6c8 = 0x%x, preVal0x6cc = 0x%x !!\n",
1016                                 pCoexDm->preVal0x6c0,
1017                                 pCoexDm->preVal0x6c4,
1018                                 pCoexDm->preVal0x6c8,
1019                                 pCoexDm->preVal0x6cc
1020                         )
1021                 );
1022                 BTC_PRINT(
1023                         BTC_MSG_ALGORITHM,
1024                         ALGO_TRACE_SW_DETAIL,
1025                         (
1026                                 "[BTCoex], curVal0x6c0 = 0x%x, curVal0x6c4 = 0x%x, curVal0x6c8 = 0x%x, curVal0x6cc = 0x%x !!\n",
1027                                 pCoexDm->curVal0x6c0,
1028                                 pCoexDm->curVal0x6c4,
1029                                 pCoexDm->curVal0x6c8,
1030                                 pCoexDm->curVal0x6cc
1031                         )
1032                 );
1033
1034                 if (
1035                         (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&
1036                         (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&
1037                         (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&
1038                         (pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc)
1039                 )
1040                         return;
1041         }
1042         halbtc8723b2ant_SetCoexTable(pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc);
1043
1044         pCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;
1045         pCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;
1046         pCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;
1047         pCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;
1048 }
1049
1050 static void halbtc8723b2ant_CoexTableWithType(
1051         PBTC_COEXIST pBtCoexist, bool bForceExec, u8 type
1052 )
1053 {
1054         switch (type) {
1055         case 0:
1056                 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x55555555, 0xffff, 0x3);
1057                 break;
1058         case 1:
1059                 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55555555, 0x5afa5afa, 0xffff, 0x3);
1060                 break;
1061         case 2:
1062                 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffff, 0x3);
1063                 break;
1064         case 3:
1065                 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffff, 0x3);
1066                 break;
1067         case 4:
1068                 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0xffffffff, 0xffffffff, 0xffff, 0x3);
1069                 break;
1070         case 5:
1071                 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5fff5fff, 0x5fff5fff, 0xffff, 0x3);
1072                 break;
1073         case 6:
1074                 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5a5a5a, 0xffff, 0x3);
1075                 break;
1076         case 7:
1077                 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0xfafafafa, 0xffff, 0x3);
1078                 break;
1079         case 8:
1080                 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x5aea5aea, 0x5aea5aea, 0xffff, 0x3);
1081                 break;
1082         case 9:
1083                 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5aea5aea, 0xffff, 0x3);
1084                 break;
1085         case 10:
1086                 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5aff5aff, 0xffff, 0x3);
1087                 break;
1088         case 11:
1089                 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5a5f5a5f, 0xffff, 0x3);
1090                 break;
1091         case 12:
1092                 halbtc8723b2ant_CoexTable(pBtCoexist, bForceExec, 0x55ff55ff, 0x5f5f5f5f, 0xffff, 0x3);
1093                 break;
1094         default:
1095                 break;
1096         }
1097 }
1098
1099 static void halbtc8723b2ant_SetFwIgnoreWlanAct(
1100         PBTC_COEXIST pBtCoexist, bool bEnable
1101 )
1102 {
1103         u8      H2C_Parameter[1] = {0};
1104
1105         if (bEnable)
1106                 H2C_Parameter[0] |= BIT0;               /*  function enable */
1107
1108         BTC_PRINT(
1109                 BTC_MSG_ALGORITHM,
1110                 ALGO_TRACE_FW_EXEC,
1111                 (
1112                         "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63 = 0x%x\n",
1113                         H2C_Parameter[0]
1114                 )
1115         );
1116
1117         pBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);
1118 }
1119
1120 static void halbtc8723b2ant_IgnoreWlanAct(
1121         PBTC_COEXIST pBtCoexist, bool bForceExec, bool bEnable
1122 )
1123 {
1124         BTC_PRINT(
1125                 BTC_MSG_ALGORITHM,
1126                 ALGO_TRACE_FW,
1127                 (
1128                         "[BTCoex], %s turn Ignore WlanAct %s\n",
1129                         (bForceExec ? "force to" : ""),
1130                         (bEnable ? "ON" : "OFF")
1131                 )
1132         );
1133
1134         pCoexDm->bCurIgnoreWlanAct = bEnable;
1135
1136         if (!bForceExec) {
1137                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n",
1138                         pCoexDm->bPreIgnoreWlanAct, pCoexDm->bCurIgnoreWlanAct));
1139
1140                 if (pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)
1141                         return;
1142         }
1143         halbtc8723b2ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);
1144
1145         pCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;
1146 }
1147
1148 static void halbtc8723b2ant_SetFwPstdma(
1149         PBTC_COEXIST pBtCoexist,
1150         u8 byte1,
1151         u8 byte2,
1152         u8 byte3,
1153         u8 byte4,
1154         u8 byte5
1155 )
1156 {
1157         u8      H2C_Parameter[5] = {0};
1158
1159         H2C_Parameter[0] = byte1;
1160         H2C_Parameter[1] = byte2;
1161         H2C_Parameter[2] = byte3;
1162         H2C_Parameter[3] = byte4;
1163         H2C_Parameter[4] = byte5;
1164
1165         pCoexDm->psTdmaPara[0] = byte1;
1166         pCoexDm->psTdmaPara[1] = byte2;
1167         pCoexDm->psTdmaPara[2] = byte3;
1168         pCoexDm->psTdmaPara[3] = byte4;
1169         pCoexDm->psTdmaPara[4] = byte5;
1170
1171         BTC_PRINT(
1172                 BTC_MSG_ALGORITHM,
1173                 ALGO_TRACE_FW_EXEC,
1174                 (
1175                         "[BTCoex], FW write 0x60(5bytes) = 0x%x%08x\n",
1176                         H2C_Parameter[0],
1177                         H2C_Parameter[1]<<24|
1178                         H2C_Parameter[2]<<16|
1179                         H2C_Parameter[3]<<8|
1180                         H2C_Parameter[4]
1181                 )
1182         );
1183
1184         pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);
1185 }
1186
1187 static void halbtc8723b2ant_SwMechanism1(
1188         PBTC_COEXIST pBtCoexist,
1189         bool bShrinkRxLPF,
1190         bool bLowPenaltyRA,
1191         bool bLimitedDIG,
1192         bool bBTLNAConstrain
1193 )
1194 {
1195         halbtc8723b2ant_RfShrink(pBtCoexist, NORMAL_EXEC, bShrinkRxLPF);
1196         halbtc8723b2ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRA);
1197 }
1198
1199 static void halbtc8723b2ant_SwMechanism2(
1200         PBTC_COEXIST pBtCoexist,
1201         bool bAGCTableShift,
1202         bool bADCBackOff,
1203         bool bSWDACSwing,
1204         u32 dacSwingLvl
1205 )
1206 {
1207         halbtc8723b2ant_AgcTable(pBtCoexist, NORMAL_EXEC, bAGCTableShift);
1208         halbtc8723b2ant_DacSwing(pBtCoexist, NORMAL_EXEC, bSWDACSwing, dacSwingLvl);
1209 }
1210
1211 static void halbtc8723b2ant_SetAntPath(
1212         PBTC_COEXIST pBtCoexist, u8 antPosType, bool bInitHwCfg, bool bWifiOff
1213 )
1214 {
1215         PBTC_BOARD_INFO pBoardInfo = &pBtCoexist->boardInfo;
1216         u32 fwVer = 0, u4Tmp = 0;
1217         bool bPgExtSwitch = false;
1218         bool bUseExtSwitch = false;
1219         u8      H2C_Parameter[2] = {0};
1220
1221         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_EXT_SWITCH, &bPgExtSwitch);
1222         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);        /*  [31:16]=fw ver, [15:0]=fw sub ver */
1223
1224         if ((fwVer > 0 && fwVer < 0xc0000) || bPgExtSwitch)
1225                 bUseExtSwitch = true;
1226
1227         if (bInitHwCfg) {
1228                 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x39, 0x8, 0x1);
1229                 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);
1230                 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);
1231                 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);
1232                 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1);
1233
1234                 if (fwVer >= 0x180000) {
1235                         /* Use H2C to set GNT_BT to LOW */
1236                         H2C_Parameter[0] = 0;
1237                         pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);
1238                 } else {
1239                         pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x0);
1240                 }
1241
1242                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
1243
1244                 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); /* WiFi TRx Mask off */
1245                 pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01); /* BT TRx Mask off */
1246
1247                 if (pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) {
1248                         /* tell firmware "no antenna inverse" */
1249                         H2C_Parameter[0] = 0;
1250                 } else {
1251                         /* tell firmware "antenna inverse" */
1252                         H2C_Parameter[0] = 1;
1253                 }
1254
1255                 if (bUseExtSwitch) {
1256                         /* ext switch type */
1257                         H2C_Parameter[1] = 1;
1258                 } else {
1259                         /* int switch type */
1260                         H2C_Parameter[1] = 0;
1261                 }
1262                 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);
1263         }
1264
1265         /*  ext switch setting */
1266         if (bUseExtSwitch) {
1267                 if (bInitHwCfg) {
1268                         /*  0x4c[23]= 0, 0x4c[24]= 1  Antenna control by WL/BT */
1269                         u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);
1270                         u4Tmp &= ~BIT23;
1271                         u4Tmp |= BIT24;
1272                         pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
1273                 }
1274
1275                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); /*  fixed internal switch S1->WiFi, S0->BT */
1276                 switch (antPosType) {
1277                 case BTC_ANT_WIFI_AT_MAIN:
1278                         pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1); /*  ext switch main at wifi */
1279                         break;
1280                 case BTC_ANT_WIFI_AT_AUX:
1281                         pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2); /*  ext switch aux at wifi */
1282                         break;
1283                 }
1284         } else { /*  internal switch */
1285                 if (bInitHwCfg) {
1286                         /*  0x4c[23]= 0, 0x4c[24]= 1  Antenna control by WL/BT */
1287                         u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);
1288                         u4Tmp |= BIT23;
1289                         u4Tmp &= ~BIT24;
1290                         pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
1291                 }
1292
1293                 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0); /* fixed external switch S1->Main, S0->Aux */
1294                 switch (antPosType) {
1295                 case BTC_ANT_WIFI_AT_MAIN:
1296                         pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); /*  fixed internal switch S1->WiFi, S0->BT */
1297                         break;
1298                 case BTC_ANT_WIFI_AT_AUX:
1299                         pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280); /*  fixed internal switch S0->WiFi, S1->BT */
1300                         break;
1301                 }
1302         }
1303 }
1304
1305 static void halbtc8723b2ant_PsTdma(
1306         PBTC_COEXIST pBtCoexist, bool bForceExec, bool bTurnOn, u8 type
1307 )
1308 {
1309         BTC_PRINT(
1310                 BTC_MSG_ALGORITHM,
1311                 ALGO_TRACE_FW,
1312                 (
1313                         "[BTCoex], %s turn %s PS TDMA, type =%d\n",
1314                         (bForceExec ? "force to" : ""),
1315                         (bTurnOn ? "ON" : "OFF"),
1316                         type
1317                 )
1318         );
1319         pCoexDm->bCurPsTdmaOn = bTurnOn;
1320         pCoexDm->curPsTdma = type;
1321
1322         if (!bForceExec) {
1323                 BTC_PRINT(
1324                         BTC_MSG_ALGORITHM,
1325                         ALGO_TRACE_FW_DETAIL,
1326                         (
1327                                 "[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n",
1328                                 pCoexDm->bPrePsTdmaOn,
1329                                 pCoexDm->bCurPsTdmaOn
1330                         )
1331                 );
1332                 BTC_PRINT(
1333                         BTC_MSG_ALGORITHM,
1334                         ALGO_TRACE_FW_DETAIL,
1335                         (
1336                                 "[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n",
1337                                 pCoexDm->prePsTdma, pCoexDm->curPsTdma
1338                         )
1339                 );
1340
1341                 if (
1342                         (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&
1343                         (pCoexDm->prePsTdma == pCoexDm->curPsTdma)
1344                 )
1345                         return;
1346         }
1347
1348         if (bTurnOn) {
1349                 switch (type) {
1350                 case 1:
1351                 default:
1352                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);
1353                         break;
1354                 case 2:
1355                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);
1356                         break;
1357                 case 3:
1358                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0xf1, 0x90);
1359                         break;
1360                 case 4:
1361                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x10, 0x03, 0xf1, 0x90);
1362                         break;
1363                 case 5:
1364                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);
1365                         break;
1366                 case 6:
1367                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);
1368                         break;
1369                 case 7:
1370                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1c, 0x3, 0x70, 0x90);
1371                         break;
1372                 case 8:
1373                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x10, 0x3, 0x70, 0x90);
1374                         break;
1375                 case 9:
1376                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);
1377                         break;
1378                 case 10:
1379                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0xe1, 0x90);
1380                         break;
1381                 case 11:
1382                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0xe1, 0x90);
1383                         break;
1384                 case 12:
1385                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);
1386                         break;
1387                 case 13:
1388                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0x60, 0x90);
1389                         break;
1390                 case 14:
1391                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x12, 0x12, 0x60, 0x90);
1392                         break;
1393                 case 15:
1394                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0xa, 0xa, 0x60, 0x90);
1395                         break;
1396                 case 16:
1397                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0x60, 0x90);
1398                         break;
1399                 case 17:
1400                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xa3, 0x2f, 0x2f, 0x60, 0x90);
1401                         break;
1402                 case 18:
1403                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x5, 0x5, 0xe1, 0x90);
1404                         break;
1405                 case 19:
1406                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0xe1, 0x90);
1407                         break;
1408                 case 20:
1409                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x25, 0x25, 0x60, 0x90);
1410                         break;
1411                 case 21:
1412                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x15, 0x03, 0x70, 0x90);
1413                         break;
1414                 case 71:
1415                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0xe3, 0x1a, 0x1a, 0xe1, 0x90);
1416                         break;
1417                 }
1418         } else {
1419                 /*  disable PS tdma */
1420                 switch (type) {
1421                 case 0:
1422                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);
1423                         break;
1424                 case 1:
1425                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x48, 0x0);
1426                         break;
1427                 default:
1428                         halbtc8723b2ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x40, 0x0);
1429                         break;
1430                 }
1431         }
1432
1433         /*  update pre state */
1434         pCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;
1435         pCoexDm->prePsTdma = pCoexDm->curPsTdma;
1436 }
1437
1438 static void halbtc8723b2ant_CoexAllOff(PBTC_COEXIST pBtCoexist)
1439 {
1440         /*  fw all off */
1441         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
1442         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
1443         halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
1444
1445         /*  sw all off */
1446         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
1447         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
1448
1449         /*  hw all off */
1450         /* pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0); */
1451         halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
1452 }
1453
1454 static void halbtc8723b2ant_InitCoexDm(PBTC_COEXIST pBtCoexist)
1455 {
1456         /*  force to reset coex mechanism */
1457
1458         halbtc8723b2ant_PsTdma(pBtCoexist, FORCE_EXEC, false, 1);
1459         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);
1460         halbtc8723b2ant_DecBtPwr(pBtCoexist, FORCE_EXEC, 0);
1461
1462         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
1463         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
1464 }
1465
1466 static void halbtc8723b2ant_ActionBtInquiry(PBTC_COEXIST pBtCoexist)
1467 {
1468         bool bWifiConnected = false;
1469         bool bLowPwrDisable = true;
1470
1471         pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
1472         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
1473
1474         if (bWifiConnected) {
1475                 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
1476                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
1477         } else {
1478                 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
1479                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
1480         }
1481
1482         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, FORCE_EXEC, 6);
1483         halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
1484
1485         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
1486         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
1487
1488         pCoexDm->bNeedRecover0x948 = true;
1489         pCoexDm->backup0x948 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);
1490
1491         halbtc8723b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_AUX, false, false);
1492 }
1493
1494 static bool halbtc8723b2ant_IsCommonAction(PBTC_COEXIST pBtCoexist)
1495 {
1496         u8 btRssiState = BTC_RSSI_STATE_HIGH;
1497         bool bCommon = false, bWifiConnected = false, bWifiBusy = false;
1498         bool bBtHsOn = false, bLowPwrDisable = false;
1499
1500         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
1501         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
1502         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
1503
1504         if (!bWifiConnected) {
1505                 bLowPwrDisable = false;
1506                 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
1507                 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
1508
1509                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi non-connected idle!!\n"));
1510
1511                 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
1512                 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
1513                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
1514                 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
1515                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
1516
1517                 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
1518                 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
1519
1520                 bCommon = true;
1521         } else {
1522                 if (BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) {
1523                         bLowPwrDisable = false;
1524                         pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
1525                         halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
1526
1527                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT non connected-idle!!\n"));
1528
1529                         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
1530                         halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
1531                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
1532                         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);
1533                         halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
1534
1535                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
1536                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
1537
1538                         bCommon = true;
1539                 } else if (BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) {
1540                         bLowPwrDisable = true;
1541                         pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
1542
1543                         if (bBtHsOn)
1544                                 return false;
1545
1546                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi connected + BT connected-idle!!\n"));
1547                         halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
1548
1549                         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
1550                         halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
1551                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
1552                         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);
1553                         halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
1554
1555                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
1556                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
1557
1558                         bCommon = true;
1559                 } else {
1560                         bLowPwrDisable = true;
1561                         pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable);
1562
1563                         if (bWifiBusy) {
1564                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Busy + BT Busy!!\n"));
1565                                 bCommon = false;
1566                         } else {
1567                                 if (bBtHsOn)
1568                                         return false;
1569
1570                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Wifi Connected-Idle + BT Busy!!\n"));
1571                                 btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
1572                                 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
1573
1574                                 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
1575                                 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
1576                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 21);
1577                                 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 0xb);
1578
1579                                 if (BTC_RSSI_HIGH(btRssiState))
1580                                         halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
1581                                 else
1582                                         halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
1583
1584                                 halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
1585                                 halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
1586                                 bCommon = true;
1587                         }
1588                 }
1589         }
1590
1591         return bCommon;
1592 }
1593
1594 static void halbtc8723b2ant_TdmaDurationAdjust(
1595         PBTC_COEXIST pBtCoexist, bool bScoHid, bool bTxPause, u8 maxInterval
1596 )
1597 {
1598         static s32 up, dn, m, n, WaitCount;
1599         s32 result;   /* 0: no change, +1: increase WiFi duration, -1: decrease WiFi duration */
1600         u8 retryCount = 0;
1601
1602         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW, ("[BTCoex], TdmaDurationAdjust()\n"));
1603
1604         if (!pCoexDm->bAutoTdmaAdjust) {
1605                 pCoexDm->bAutoTdmaAdjust = true;
1606                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], first run TdmaDurationAdjust()!!\n"));
1607                 {
1608                         if (bScoHid) {
1609                                 if (bTxPause) {
1610                                         if (maxInterval == 1) {
1611                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 13);
1612                                                 pCoexDm->psTdmaDuAdjType = 13;
1613                                         } else if (maxInterval == 2) {
1614                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 14);
1615                                                 pCoexDm->psTdmaDuAdjType = 14;
1616                                         } else if (maxInterval == 3) {
1617                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
1618                                                 pCoexDm->psTdmaDuAdjType = 15;
1619                                         } else {
1620                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
1621                                                 pCoexDm->psTdmaDuAdjType = 15;
1622                                         }
1623                                 } else {
1624                                         if (maxInterval == 1) {
1625                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 9);
1626                                                 pCoexDm->psTdmaDuAdjType = 9;
1627                                         } else if (maxInterval == 2) {
1628                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 10);
1629                                                 pCoexDm->psTdmaDuAdjType = 10;
1630                                         } else if (maxInterval == 3) {
1631                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
1632                                                 pCoexDm->psTdmaDuAdjType = 11;
1633                                         } else {
1634                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
1635                                                 pCoexDm->psTdmaDuAdjType = 11;
1636                                         }
1637                                 }
1638                         } else {
1639                                 if (bTxPause) {
1640                                         if (maxInterval == 1) {
1641                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 5);
1642                                                 pCoexDm->psTdmaDuAdjType = 5;
1643                                         } else if (maxInterval == 2) {
1644                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 6);
1645                                                 pCoexDm->psTdmaDuAdjType = 6;
1646                                         } else if (maxInterval == 3) {
1647                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
1648                                                 pCoexDm->psTdmaDuAdjType = 7;
1649                                         } else {
1650                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
1651                                                 pCoexDm->psTdmaDuAdjType = 7;
1652                                         }
1653                                 } else {
1654                                         if (maxInterval == 1) {
1655                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 1);
1656                                                 pCoexDm->psTdmaDuAdjType = 1;
1657                                         } else if (maxInterval == 2) {
1658                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 2);
1659                                                 pCoexDm->psTdmaDuAdjType = 2;
1660                                         } else if (maxInterval == 3) {
1661                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
1662                                                 pCoexDm->psTdmaDuAdjType = 3;
1663                                         } else {
1664                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
1665                                                 pCoexDm->psTdmaDuAdjType = 3;
1666                                         }
1667                                 }
1668                         }
1669                 }
1670                 /*  */
1671                 up = 0;
1672                 dn = 0;
1673                 m = 1;
1674                 n = 3;
1675                 result = 0;
1676                 WaitCount = 0;
1677         } else {
1678                 /* accquire the BT TRx retry count from BT_Info byte2 */
1679                 retryCount = pCoexSta->btRetryCnt;
1680                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], retryCount = %d\n", retryCount));
1681                 BTC_PRINT(
1682                         BTC_MSG_ALGORITHM,
1683                         ALGO_TRACE_FW_DETAIL,
1684                         (
1685                                 "[BTCoex], up =%d, dn =%d, m =%d, n =%d, WaitCount =%d\n",
1686                                 up, dn, m, n, WaitCount
1687                         )
1688                 );
1689                 result = 0;
1690                 WaitCount++;
1691
1692                 if (retryCount == 0) { /*  no retry in the last 2-second duration */
1693                         up++;
1694                         dn--;
1695
1696                         if (dn <= 0)
1697                                 dn = 0;
1698
1699                         if (up >= n) { /*  if 連續 n 個2秒 retry count為0, 則調寬WiFi duration */
1700                                 WaitCount = 0;
1701                                 n = 3;
1702                                 up = 0;
1703                                 dn = 0;
1704                                 result = 1;
1705                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Increase wifi duration!!\n"));
1706                         }
1707                 } else if (retryCount <= 3) { /*  <=3 retry in the last 2-second duration */
1708                         up--;
1709                         dn++;
1710
1711                         if (up <= 0)
1712                                 up = 0;
1713
1714                         if (dn == 2) { /*  if 連續 2 個2秒 retry count< 3, 則調窄WiFi duration */
1715                                 if (WaitCount <= 2)
1716                                         m++; /*  避免一直在兩個level中來回 */
1717                                 else
1718                                         m = 1;
1719
1720                                 if (m >= 20) /* m 最大值 = 20 ' 最大120秒 recheck是否調整 WiFi duration. */
1721                                         m = 20;
1722
1723                                 n = 3*m;
1724                                 up = 0;
1725                                 dn = 0;
1726                                 WaitCount = 0;
1727                                 result = -1;
1728                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter<3!!\n"));
1729                         }
1730                 } else { /* retry count > 3, 只要1次 retry count > 3, 則調窄WiFi duration */
1731                         if (WaitCount == 1)
1732                                 m++; /*  避免一直在兩個level中來回 */
1733                         else
1734                                 m = 1;
1735
1736                         if (m >= 20) /* m 最大值 = 20 ' 最大120秒 recheck是否調整 WiFi duration. */
1737                                 m = 20;
1738
1739                         n = 3*m;
1740                         up = 0;
1741                         dn = 0;
1742                         WaitCount = 0;
1743                         result = -1;
1744                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], Decrease wifi duration for retryCounter>3!!\n"));
1745                 }
1746
1747                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], max Interval = %d\n", maxInterval));
1748                 if (maxInterval == 1) {
1749                         if (bTxPause) {
1750                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));
1751
1752                                 if (pCoexDm->curPsTdma == 71) {
1753                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 5);
1754                                         pCoexDm->psTdmaDuAdjType = 5;
1755                                 } else if (pCoexDm->curPsTdma == 1) {
1756                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 5);
1757                                         pCoexDm->psTdmaDuAdjType = 5;
1758                                 } else if (pCoexDm->curPsTdma == 2) {
1759                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 6);
1760                                         pCoexDm->psTdmaDuAdjType = 6;
1761                                 } else if (pCoexDm->curPsTdma == 3) {
1762                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
1763                                         pCoexDm->psTdmaDuAdjType = 7;
1764                                 } else if (pCoexDm->curPsTdma == 4) {
1765                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 8);
1766                                         pCoexDm->psTdmaDuAdjType = 8;
1767                                 }
1768
1769                                 if (pCoexDm->curPsTdma == 9) {
1770                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 13);
1771                                         pCoexDm->psTdmaDuAdjType = 13;
1772                                 } else if (pCoexDm->curPsTdma == 10) {
1773                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 14);
1774                                         pCoexDm->psTdmaDuAdjType = 14;
1775                                 } else if (pCoexDm->curPsTdma == 11) {
1776                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
1777                                         pCoexDm->psTdmaDuAdjType = 15;
1778                                 } else if (pCoexDm->curPsTdma == 12) {
1779                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 16);
1780                                         pCoexDm->psTdmaDuAdjType = 16;
1781                                 }
1782
1783                                 if (result == -1) {
1784                                         if (pCoexDm->curPsTdma == 5) {
1785                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 6);
1786                                                 pCoexDm->psTdmaDuAdjType = 6;
1787                                         } else if (pCoexDm->curPsTdma == 6) {
1788                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
1789                                                 pCoexDm->psTdmaDuAdjType = 7;
1790                                         } else if (pCoexDm->curPsTdma == 7) {
1791                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 8);
1792                                                 pCoexDm->psTdmaDuAdjType = 8;
1793                                         } else if (pCoexDm->curPsTdma == 13) {
1794                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 14);
1795                                                 pCoexDm->psTdmaDuAdjType = 14;
1796                                         } else if (pCoexDm->curPsTdma == 14) {
1797                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
1798                                                 pCoexDm->psTdmaDuAdjType = 15;
1799                                         } else if (pCoexDm->curPsTdma == 15) {
1800                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 16);
1801                                                 pCoexDm->psTdmaDuAdjType = 16;
1802                                         }
1803                                 } else if (result == 1) {
1804                                         if (pCoexDm->curPsTdma == 8) {
1805                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
1806                                                 pCoexDm->psTdmaDuAdjType = 7;
1807                                         } else if (pCoexDm->curPsTdma == 7) {
1808                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 6);
1809                                                 pCoexDm->psTdmaDuAdjType = 6;
1810                                         } else if (pCoexDm->curPsTdma == 6) {
1811                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 5);
1812                                                 pCoexDm->psTdmaDuAdjType = 5;
1813                                         } else if (pCoexDm->curPsTdma == 16) {
1814                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
1815                                                 pCoexDm->psTdmaDuAdjType = 15;
1816                                         } else if (pCoexDm->curPsTdma == 15) {
1817                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 14);
1818                                                 pCoexDm->psTdmaDuAdjType = 14;
1819                                         } else if (pCoexDm->curPsTdma == 14) {
1820                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 13);
1821                                                 pCoexDm->psTdmaDuAdjType = 13;
1822                                         }
1823                                 }
1824                         } else {
1825                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));
1826                                 if (pCoexDm->curPsTdma == 5) {
1827                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 71);
1828                                         pCoexDm->psTdmaDuAdjType = 71;
1829                                 } else if (pCoexDm->curPsTdma == 6) {
1830                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 2);
1831                                         pCoexDm->psTdmaDuAdjType = 2;
1832                                 } else if (pCoexDm->curPsTdma == 7) {
1833                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
1834                                         pCoexDm->psTdmaDuAdjType = 3;
1835                                 } else if (pCoexDm->curPsTdma == 8) {
1836                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 4);
1837                                         pCoexDm->psTdmaDuAdjType = 4;
1838                                 }
1839
1840                                 if (pCoexDm->curPsTdma == 13) {
1841                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 9);
1842                                         pCoexDm->psTdmaDuAdjType = 9;
1843                                 } else if (pCoexDm->curPsTdma == 14) {
1844                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 10);
1845                                         pCoexDm->psTdmaDuAdjType = 10;
1846                                 } else if (pCoexDm->curPsTdma == 15) {
1847                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
1848                                         pCoexDm->psTdmaDuAdjType = 11;
1849                                 } else if (pCoexDm->curPsTdma == 16) {
1850                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 12);
1851                                         pCoexDm->psTdmaDuAdjType = 12;
1852                                 }
1853
1854                                 if (result == -1) {
1855                                         if (pCoexDm->curPsTdma == 71) {
1856                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 1);
1857                                                 pCoexDm->psTdmaDuAdjType = 1;
1858                                         } else if (pCoexDm->curPsTdma == 1) {
1859                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 2);
1860                                                 pCoexDm->psTdmaDuAdjType = 2;
1861                                         } else if (pCoexDm->curPsTdma == 2) {
1862                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
1863                                                 pCoexDm->psTdmaDuAdjType = 3;
1864                                         } else if (pCoexDm->curPsTdma == 3) {
1865                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 4);
1866                                                 pCoexDm->psTdmaDuAdjType = 4;
1867                                         } else if (pCoexDm->curPsTdma == 9) {
1868                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 10);
1869                                                 pCoexDm->psTdmaDuAdjType = 10;
1870                                         } else if (pCoexDm->curPsTdma == 10) {
1871                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
1872                                                 pCoexDm->psTdmaDuAdjType = 11;
1873                                         } else if (pCoexDm->curPsTdma == 11) {
1874                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 12);
1875                                                 pCoexDm->psTdmaDuAdjType = 12;
1876                                         }
1877                                 } else if (result == 1) {
1878                                         if (pCoexDm->curPsTdma == 4) {
1879                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
1880                                                 pCoexDm->psTdmaDuAdjType = 3;
1881                                         } else if (pCoexDm->curPsTdma == 3) {
1882                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 2);
1883                                                 pCoexDm->psTdmaDuAdjType = 2;
1884                                         } else if (pCoexDm->curPsTdma == 2) {
1885                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 1);
1886                                                 pCoexDm->psTdmaDuAdjType = 1;
1887                                         } else if (pCoexDm->curPsTdma == 1) {
1888                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 71);
1889                                                 pCoexDm->psTdmaDuAdjType = 71;
1890                                         } else if (pCoexDm->curPsTdma == 12) {
1891                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
1892                                                 pCoexDm->psTdmaDuAdjType = 11;
1893                                         } else if (pCoexDm->curPsTdma == 11) {
1894                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 10);
1895                                                 pCoexDm->psTdmaDuAdjType = 10;
1896                                         } else if (pCoexDm->curPsTdma == 10) {
1897                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 9);
1898                                                 pCoexDm->psTdmaDuAdjType = 9;
1899                                         }
1900                                 }
1901                         }
1902                 } else if (maxInterval == 2) {
1903                         if (bTxPause) {
1904                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));
1905                                 if (pCoexDm->curPsTdma == 1) {
1906                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 6);
1907                                         pCoexDm->psTdmaDuAdjType = 6;
1908                                 } else if (pCoexDm->curPsTdma == 2) {
1909                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 6);
1910                                         pCoexDm->psTdmaDuAdjType = 6;
1911                                 } else if (pCoexDm->curPsTdma == 3) {
1912                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
1913                                         pCoexDm->psTdmaDuAdjType = 7;
1914                                 } else if (pCoexDm->curPsTdma == 4) {
1915                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 8);
1916                                         pCoexDm->psTdmaDuAdjType = 8;
1917                                 }
1918
1919                                 if (pCoexDm->curPsTdma == 9) {
1920                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 14);
1921                                         pCoexDm->psTdmaDuAdjType = 14;
1922                                 } else if (pCoexDm->curPsTdma == 10) {
1923                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 14);
1924                                         pCoexDm->psTdmaDuAdjType = 14;
1925                                 } else if (pCoexDm->curPsTdma == 11) {
1926                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
1927                                         pCoexDm->psTdmaDuAdjType = 15;
1928                                 } else if (pCoexDm->curPsTdma == 12) {
1929                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 16);
1930                                         pCoexDm->psTdmaDuAdjType = 16;
1931                                 }
1932
1933                                 if (result == -1) {
1934                                         if (pCoexDm->curPsTdma == 5) {
1935                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 6);
1936                                                 pCoexDm->psTdmaDuAdjType = 6;
1937                                         } else if (pCoexDm->curPsTdma == 6) {
1938                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
1939                                                 pCoexDm->psTdmaDuAdjType = 7;
1940                                         } else if (pCoexDm->curPsTdma == 7) {
1941                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 8);
1942                                                 pCoexDm->psTdmaDuAdjType = 8;
1943                                         } else if (pCoexDm->curPsTdma == 13) {
1944                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 14);
1945                                                 pCoexDm->psTdmaDuAdjType = 14;
1946                                         } else if (pCoexDm->curPsTdma == 14) {
1947                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
1948                                                 pCoexDm->psTdmaDuAdjType = 15;
1949                                         } else if (pCoexDm->curPsTdma == 15) {
1950                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 16);
1951                                                 pCoexDm->psTdmaDuAdjType = 16;
1952                                         }
1953                                 } else if (result == 1) {
1954                                         if (pCoexDm->curPsTdma == 8) {
1955                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
1956                                                 pCoexDm->psTdmaDuAdjType = 7;
1957                                         } else if (pCoexDm->curPsTdma == 7) {
1958                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 6);
1959                                                 pCoexDm->psTdmaDuAdjType = 6;
1960                                         } else if (pCoexDm->curPsTdma == 6) {
1961                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 6);
1962                                                 pCoexDm->psTdmaDuAdjType = 6;
1963                                         } else if (pCoexDm->curPsTdma == 16) {
1964                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
1965                                                 pCoexDm->psTdmaDuAdjType = 15;
1966                                         } else if (pCoexDm->curPsTdma == 15) {
1967                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 14);
1968                                                 pCoexDm->psTdmaDuAdjType = 14;
1969                                         } else if (pCoexDm->curPsTdma == 14) {
1970                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 14);
1971                                                 pCoexDm->psTdmaDuAdjType = 14;
1972                                         }
1973                                 }
1974                         } else {
1975                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));
1976                                 if (pCoexDm->curPsTdma == 5) {
1977                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 2);
1978                                         pCoexDm->psTdmaDuAdjType = 2;
1979                                 } else if (pCoexDm->curPsTdma == 6) {
1980                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 2);
1981                                         pCoexDm->psTdmaDuAdjType = 2;
1982                                 } else if (pCoexDm->curPsTdma == 7) {
1983                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
1984                                         pCoexDm->psTdmaDuAdjType = 3;
1985                                 } else if (pCoexDm->curPsTdma == 8) {
1986                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 4);
1987                                         pCoexDm->psTdmaDuAdjType = 4;
1988                                 }
1989
1990                                 if (pCoexDm->curPsTdma == 13) {
1991                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 10);
1992                                         pCoexDm->psTdmaDuAdjType = 10;
1993                                 } else if (pCoexDm->curPsTdma == 14) {
1994                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 10);
1995                                         pCoexDm->psTdmaDuAdjType = 10;
1996                                 } else if (pCoexDm->curPsTdma == 15) {
1997                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
1998                                         pCoexDm->psTdmaDuAdjType = 11;
1999                                 } else if (pCoexDm->curPsTdma == 16) {
2000                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 12);
2001                                         pCoexDm->psTdmaDuAdjType = 12;
2002                                 }
2003
2004                                 if (result == -1) {
2005                                         if (pCoexDm->curPsTdma == 1) {
2006                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 2);
2007                                                 pCoexDm->psTdmaDuAdjType = 2;
2008                                         } else if (pCoexDm->curPsTdma == 2) {
2009                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
2010                                                 pCoexDm->psTdmaDuAdjType = 3;
2011                                         } else if (pCoexDm->curPsTdma == 3) {
2012                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 4);
2013                                                 pCoexDm->psTdmaDuAdjType = 4;
2014                                         } else if (pCoexDm->curPsTdma == 9) {
2015                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 10);
2016                                                 pCoexDm->psTdmaDuAdjType = 10;
2017                                         } else if (pCoexDm->curPsTdma == 10) {
2018                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
2019                                                 pCoexDm->psTdmaDuAdjType = 11;
2020                                         } else if (pCoexDm->curPsTdma == 11) {
2021                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 12);
2022                                                 pCoexDm->psTdmaDuAdjType = 12;
2023                                         }
2024                                 } else if (result == 1) {
2025                                         if (pCoexDm->curPsTdma == 4) {
2026                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
2027                                                 pCoexDm->psTdmaDuAdjType = 3;
2028                                         } else if (pCoexDm->curPsTdma == 3) {
2029                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 2);
2030                                                 pCoexDm->psTdmaDuAdjType = 2;
2031                                         } else if (pCoexDm->curPsTdma == 2) {
2032                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 2);
2033                                                 pCoexDm->psTdmaDuAdjType = 2;
2034                                         } else if (pCoexDm->curPsTdma == 12) {
2035                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
2036                                                 pCoexDm->psTdmaDuAdjType = 11;
2037                                         } else if (pCoexDm->curPsTdma == 11) {
2038                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 10);
2039                                                 pCoexDm->psTdmaDuAdjType = 10;
2040                                         } else if (pCoexDm->curPsTdma == 10) {
2041                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 10);
2042                                                 pCoexDm->psTdmaDuAdjType = 10;
2043                                         }
2044                                 }
2045                         }
2046                 } else if (maxInterval == 3) {
2047                         if (bTxPause) {
2048                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 1\n"));
2049                                 if (pCoexDm->curPsTdma == 1) {
2050                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
2051                                         pCoexDm->psTdmaDuAdjType = 7;
2052                                 } else if (pCoexDm->curPsTdma == 2) {
2053                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
2054                                         pCoexDm->psTdmaDuAdjType = 7;
2055                                 } else if (pCoexDm->curPsTdma == 3) {
2056                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
2057                                         pCoexDm->psTdmaDuAdjType = 7;
2058                                 } else if (pCoexDm->curPsTdma == 4) {
2059                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 8);
2060                                         pCoexDm->psTdmaDuAdjType = 8;
2061                                 }
2062
2063                                 if (pCoexDm->curPsTdma == 9) {
2064                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
2065                                         pCoexDm->psTdmaDuAdjType = 15;
2066                                 } else if (pCoexDm->curPsTdma == 10) {
2067                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
2068                                         pCoexDm->psTdmaDuAdjType = 15;
2069                                 } else if (pCoexDm->curPsTdma == 11) {
2070                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
2071                                         pCoexDm->psTdmaDuAdjType = 15;
2072                                 } else if (pCoexDm->curPsTdma == 12) {
2073                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 16);
2074                                         pCoexDm->psTdmaDuAdjType = 16;
2075                                 }
2076
2077                                 if (result == -1) {
2078                                         if (pCoexDm->curPsTdma == 5) {
2079                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
2080                                                 pCoexDm->psTdmaDuAdjType = 7;
2081                                         } else if (pCoexDm->curPsTdma == 6) {
2082                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
2083                                                 pCoexDm->psTdmaDuAdjType = 7;
2084                                         } else if (pCoexDm->curPsTdma == 7) {
2085                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 8);
2086                                                 pCoexDm->psTdmaDuAdjType = 8;
2087                                         } else if (pCoexDm->curPsTdma == 13) {
2088                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
2089                                                 pCoexDm->psTdmaDuAdjType = 15;
2090                                         } else if (pCoexDm->curPsTdma == 14) {
2091                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
2092                                                 pCoexDm->psTdmaDuAdjType = 15;
2093                                         } else if (pCoexDm->curPsTdma == 15) {
2094                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 16);
2095                                                 pCoexDm->psTdmaDuAdjType = 16;
2096                                         }
2097                                 } else if (result == 1) {
2098                                         if (pCoexDm->curPsTdma == 8) {
2099                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
2100                                                 pCoexDm->psTdmaDuAdjType = 7;
2101                                         } else if (pCoexDm->curPsTdma == 7) {
2102                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
2103                                                 pCoexDm->psTdmaDuAdjType = 7;
2104                                         } else if (pCoexDm->curPsTdma == 6) {
2105                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 7);
2106                                                 pCoexDm->psTdmaDuAdjType = 7;
2107                                         } else if (pCoexDm->curPsTdma == 16) {
2108                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
2109                                                 pCoexDm->psTdmaDuAdjType = 15;
2110                                         } else if (pCoexDm->curPsTdma == 15) {
2111                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
2112                                                 pCoexDm->psTdmaDuAdjType = 15;
2113                                         } else if (pCoexDm->curPsTdma == 14) {
2114                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 15);
2115                                                 pCoexDm->psTdmaDuAdjType = 15;
2116                                         }
2117                                 }
2118                         } else {
2119                                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], TxPause = 0\n"));
2120                                 if (pCoexDm->curPsTdma == 5) {
2121                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
2122                                         pCoexDm->psTdmaDuAdjType = 3;
2123                                 } else if (pCoexDm->curPsTdma == 6) {
2124                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
2125                                         pCoexDm->psTdmaDuAdjType = 3;
2126                                 } else if (pCoexDm->curPsTdma == 7) {
2127                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
2128                                         pCoexDm->psTdmaDuAdjType = 3;
2129                                 } else if (pCoexDm->curPsTdma == 8) {
2130                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 4);
2131                                         pCoexDm->psTdmaDuAdjType = 4;
2132                                 }
2133
2134                                 if (pCoexDm->curPsTdma == 13) {
2135                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
2136                                         pCoexDm->psTdmaDuAdjType = 11;
2137                                 } else if (pCoexDm->curPsTdma == 14) {
2138                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
2139                                         pCoexDm->psTdmaDuAdjType = 11;
2140                                 } else if (pCoexDm->curPsTdma == 15) {
2141                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
2142                                         pCoexDm->psTdmaDuAdjType = 11;
2143                                 } else if (pCoexDm->curPsTdma == 16) {
2144                                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 12);
2145                                         pCoexDm->psTdmaDuAdjType = 12;
2146                                 }
2147
2148                                 if (result == -1) {
2149                                         if (pCoexDm->curPsTdma == 1) {
2150                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
2151                                                 pCoexDm->psTdmaDuAdjType = 3;
2152                                         } else if (pCoexDm->curPsTdma == 2) {
2153                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
2154                                                 pCoexDm->psTdmaDuAdjType = 3;
2155                                         } else if (pCoexDm->curPsTdma == 3) {
2156                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 4);
2157                                                 pCoexDm->psTdmaDuAdjType = 4;
2158                                         } else if (pCoexDm->curPsTdma == 9) {
2159                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
2160                                                 pCoexDm->psTdmaDuAdjType = 11;
2161                                         } else if (pCoexDm->curPsTdma == 10) {
2162                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
2163                                                 pCoexDm->psTdmaDuAdjType = 11;
2164                                         } else if (pCoexDm->curPsTdma == 11) {
2165                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 12);
2166                                                 pCoexDm->psTdmaDuAdjType = 12;
2167                                         }
2168                                 } else if (result == 1) {
2169                                         if (pCoexDm->curPsTdma == 4) {
2170                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
2171                                                 pCoexDm->psTdmaDuAdjType = 3;
2172                                         } else if (pCoexDm->curPsTdma == 3) {
2173                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
2174                                                 pCoexDm->psTdmaDuAdjType = 3;
2175                                         } else if (pCoexDm->curPsTdma == 2) {
2176                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 3);
2177                                                 pCoexDm->psTdmaDuAdjType = 3;
2178                                         } else if (pCoexDm->curPsTdma == 12) {
2179                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
2180                                                 pCoexDm->psTdmaDuAdjType = 11;
2181                                         } else if (pCoexDm->curPsTdma == 11) {
2182                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
2183                                                 pCoexDm->psTdmaDuAdjType = 11;
2184                                         } else if (pCoexDm->curPsTdma == 10) {
2185                                                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 11);
2186                                                 pCoexDm->psTdmaDuAdjType = 11;
2187                                         }
2188                                 }
2189                         }
2190                 }
2191         }
2192
2193         /*  if current PsTdma not match with the recorded one (when scan, dhcp...), */
2194         /*  then we have to adjust it back to the previous record one. */
2195         if (pCoexDm->curPsTdma != pCoexDm->psTdmaDuAdjType) {
2196                 bool bScan = false, bLink = false, bRoam = false;
2197                 BTC_PRINT(
2198                         BTC_MSG_ALGORITHM,
2199                         ALGO_TRACE_FW_DETAIL,
2200                         (
2201                                 "[BTCoex], PsTdma type dismatch!!!, curPsTdma =%d, recordPsTdma =%d\n",
2202                                 pCoexDm->curPsTdma,
2203                                 pCoexDm->psTdmaDuAdjType
2204                         )
2205                 );
2206
2207                 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);
2208                 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);
2209                 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);
2210
2211                 if (!bScan && !bLink && !bRoam)
2212                         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, pCoexDm->psTdmaDuAdjType);
2213                 else {
2214                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE_FW_DETAIL, ("[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n"));
2215                 }
2216         }
2217 }
2218
2219 /*  SCO only or SCO+PAN(HS) */
2220 static void halbtc8723b2ant_ActionSco(PBTC_COEXIST pBtCoexist)
2221 {
2222         u8 wifiRssiState, btRssiState;
2223         u32 wifiBw;
2224
2225         wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2226         btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2227
2228         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2229
2230         halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2231
2232         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 4);
2233
2234         if (BTC_RSSI_HIGH(btRssiState))
2235                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2236         else
2237                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2238
2239         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2240
2241         if (BTC_WIFI_BW_LEGACY == wifiBw) /* for SCO quality at 11b/g mode */
2242                 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2);
2243         else  /* for SCO quality & wifi performance balance at 11n mode */
2244                 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 8);
2245
2246         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 0); /* for voice quality */
2247
2248         /*  sw mechanism */
2249         if (BTC_WIFI_BW_HT40 == wifiBw) {
2250                 if (
2251                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2252                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2253                 ) {
2254                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2255                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, true, 0x4);
2256                 } else {
2257                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2258                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, true, 0x4);
2259                 }
2260         } else {
2261                 if (
2262                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2263                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2264                 ) {
2265                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2266                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, true, 0x4);
2267                 } else {
2268                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2269                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, true, 0x4);
2270                 }
2271         }
2272 }
2273
2274
2275 static void halbtc8723b2ant_ActionHid(PBTC_COEXIST pBtCoexist)
2276 {
2277         u8 wifiRssiState, btRssiState;
2278         u32 wifiBw;
2279
2280         wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2281         btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2282
2283         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2284
2285         halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2286
2287         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2288
2289         if (BTC_RSSI_HIGH(btRssiState))
2290                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2291         else
2292                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2293
2294         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2295
2296         if (BTC_WIFI_BW_LEGACY == wifiBw) /* for HID at 11b/g mode */
2297                 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2298         else  /* for HID quality & wifi performance balance at 11n mode */
2299                 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 9);
2300
2301         if (
2302                 (btRssiState == BTC_RSSI_STATE_HIGH) ||
2303                 (btRssiState == BTC_RSSI_STATE_STAY_HIGH)
2304         )
2305                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 9);
2306         else
2307                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 13);
2308
2309         /*  sw mechanism */
2310         if (BTC_WIFI_BW_HT40 == wifiBw) {
2311                 if (
2312                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2313                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2314                 ) {
2315                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2316                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2317                 } else {
2318                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2319                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2320                 }
2321         } else {
2322                 if (
2323                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2324                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2325                 ) {
2326                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2327                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2328                 } else {
2329                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2330                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2331                 }
2332         }
2333 }
2334
2335 /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
2336 static void halbtc8723b2ant_ActionA2dp(PBTC_COEXIST pBtCoexist)
2337 {
2338         u8 wifiRssiState, wifiRssiState1, btRssiState;
2339         u32 wifiBw;
2340         u8 apNum = 0;
2341
2342         wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2343         wifiRssiState1 = halbtc8723b2ant_WifiRssiState(pBtCoexist, 1, 2, 40, 0);
2344         btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2345
2346         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);
2347
2348         /*  define the office environment */
2349         if (apNum >= 10 && BTC_RSSI_HIGH(wifiRssiState1)) {
2350                 /* DbgPrint(" AP#>10(%d)\n", apNum); */
2351                 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2352                 halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2353                 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2354                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2355                 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0);
2356                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
2357
2358                 /*  sw mechanism */
2359                 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2360                 if (BTC_WIFI_BW_HT40 == wifiBw) {
2361                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2362                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, true, 0x18);
2363                 } else {
2364                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2365                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, true, 0x18);
2366                 }
2367                 return;
2368         }
2369
2370         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2371         halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2372
2373         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2374
2375         if (BTC_RSSI_HIGH(btRssiState))
2376                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2377         else
2378                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2379
2380         halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2381
2382         if (
2383                 (btRssiState == BTC_RSSI_STATE_HIGH) ||
2384                 (btRssiState == BTC_RSSI_STATE_STAY_HIGH)
2385         )
2386                 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, false, false, 1);
2387         else
2388                 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, false, true, 1);
2389
2390         /*  sw mechanism */
2391         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2392         if (BTC_WIFI_BW_HT40 == wifiBw) {
2393                 if (
2394                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2395                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2396                 ) {
2397                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2398                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2399                 } else {
2400                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2401                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2402                 }
2403         } else {
2404                 if (
2405                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2406                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2407                 ) {
2408                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2409                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2410                 } else {
2411                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2412                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2413                 }
2414         }
2415 }
2416
2417 static void halbtc8723b2ant_ActionA2dpPanHs(PBTC_COEXIST pBtCoexist)
2418 {
2419         u8 wifiRssiState, btRssiState;
2420         u32 wifiBw;
2421
2422         wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2423         btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2424
2425         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2426
2427         halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2428
2429         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2430
2431         if (BTC_RSSI_HIGH(btRssiState))
2432                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2433         else
2434                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2435
2436         halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2437
2438         halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, false, true, 2);
2439
2440         /*  sw mechanism */
2441         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2442         if (BTC_WIFI_BW_HT40 == wifiBw) {
2443                 if (
2444                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2445                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2446                 ) {
2447                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2448                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2449                 } else {
2450                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2451                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2452                 }
2453         } else {
2454                 if (
2455                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2456                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2457                 ) {
2458                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2459                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2460                 } else {
2461                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2462                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2463                 }
2464         }
2465 }
2466
2467 static void halbtc8723b2ant_ActionPanEdr(PBTC_COEXIST pBtCoexist)
2468 {
2469         u8 wifiRssiState, btRssiState;
2470         u32 wifiBw;
2471
2472         wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2473         btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2474
2475         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2476
2477         halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2478
2479         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2480
2481         if (BTC_RSSI_HIGH(btRssiState))
2482                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2483         else
2484                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2485
2486         halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 10);
2487
2488         if (
2489                 (btRssiState == BTC_RSSI_STATE_HIGH) ||
2490                 (btRssiState == BTC_RSSI_STATE_STAY_HIGH)
2491         )
2492                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 1);
2493         else
2494                 halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 5);
2495
2496         /*  sw mechanism */
2497         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2498         if (BTC_WIFI_BW_HT40 == wifiBw) {
2499                 if (
2500                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2501                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2502                 ) {
2503                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2504                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2505                 } else {
2506                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2507                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2508                 }
2509         } else {
2510                 if (
2511                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2512                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2513                 ) {
2514                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2515                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2516                 } else {
2517                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2518                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2519                 }
2520         }
2521 }
2522
2523
2524 /* PAN(HS) only */
2525 static void halbtc8723b2ant_ActionPanHs(PBTC_COEXIST pBtCoexist)
2526 {
2527         u8 wifiRssiState, btRssiState;
2528         u32 wifiBw;
2529
2530         wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2531         btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2532
2533         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2534
2535         halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2536
2537         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2538
2539         if (BTC_RSSI_HIGH(btRssiState))
2540                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2541         else
2542                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2543
2544         halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2545
2546         halbtc8723b2ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 1);
2547
2548         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2549         if (BTC_WIFI_BW_HT40 == wifiBw) {
2550                 if (
2551                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2552                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2553                 ) {
2554                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2555                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2556                 } else {
2557                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2558                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2559                 }
2560         } else {
2561                 if (
2562                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2563                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2564                 ) {
2565                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2566                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2567                 } else {
2568                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2569                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2570                 }
2571         }
2572 }
2573
2574 /* PAN(EDR)+A2DP */
2575 static void halbtc8723b2ant_ActionPanEdrA2dp(PBTC_COEXIST pBtCoexist)
2576 {
2577         u8 wifiRssiState, btRssiState;
2578         u32 wifiBw;
2579
2580         wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2581         btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2582
2583         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2584
2585         halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2586
2587         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2588
2589         if (BTC_RSSI_HIGH(btRssiState))
2590                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2591         else
2592                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2593
2594         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2595
2596         if (
2597                 (btRssiState == BTC_RSSI_STATE_HIGH) ||
2598                 (btRssiState == BTC_RSSI_STATE_STAY_HIGH)
2599         ) {
2600                 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 12);
2601                 if (BTC_WIFI_BW_HT40 == wifiBw)
2602                         halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, false, true, 3);
2603                 else
2604                         halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, false, false, 3);
2605         } else {
2606                 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2607                 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, false, true, 3);
2608         }
2609
2610         /*  sw mechanism */
2611         if (BTC_WIFI_BW_HT40 == wifiBw) {
2612                 if (
2613                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2614                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2615                 ) {
2616                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2617                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2618                 } else {
2619                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, false, false, false);
2620                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2621                 }
2622         } else {
2623                 if (
2624                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2625                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2626                 ) {
2627                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2628                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2629                 } else {
2630                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, false, false, false);
2631                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2632                 }
2633         }
2634 }
2635
2636 static void halbtc8723b2ant_ActionPanEdrHid(PBTC_COEXIST pBtCoexist)
2637 {
2638         u8 wifiRssiState, btRssiState;
2639         u32 wifiBw;
2640
2641         wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2642         btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2643         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2644
2645         halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2646
2647         if (BTC_RSSI_HIGH(btRssiState))
2648                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2649         else
2650                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2651
2652         if (
2653                 (btRssiState == BTC_RSSI_STATE_HIGH) ||
2654                 (btRssiState == BTC_RSSI_STATE_STAY_HIGH)
2655         ) {
2656                 if (BTC_WIFI_BW_HT40 == wifiBw) {
2657                         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 3);
2658                         halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 11);
2659                         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780);
2660                 } else {
2661                         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2662                         halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2663                         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2664                 }
2665                 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, false, 2);
2666         } else {
2667                 halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2668                 halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 11);
2669                 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2670                 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, true, 2);
2671         }
2672
2673         /*  sw mechanism */
2674         if (BTC_WIFI_BW_HT40 == wifiBw) {
2675                 if (
2676                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2677                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2678                 ) {
2679                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2680                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2681                 } else {
2682                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2683                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2684                 }
2685         } else {
2686                 if (
2687                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2688                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2689                 ) {
2690                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2691                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2692                 } else {
2693                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2694                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2695                 }
2696         }
2697 }
2698
2699 /*  HID+A2DP+PAN(EDR) */
2700 static void halbtc8723b2ant_ActionHidA2dpPanEdr(PBTC_COEXIST pBtCoexist)
2701 {
2702         u8 wifiRssiState, btRssiState;
2703         u32 wifiBw;
2704
2705         wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2706         btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0);
2707
2708         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2709
2710         halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x8);
2711
2712         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2713
2714         if (BTC_RSSI_HIGH(btRssiState))
2715                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2716         else
2717                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2718
2719         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2720
2721         halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2722
2723         if (
2724                 (btRssiState == BTC_RSSI_STATE_HIGH) ||
2725                 (btRssiState == BTC_RSSI_STATE_STAY_HIGH)
2726         ) {
2727                 if (BTC_WIFI_BW_HT40 == wifiBw)
2728                         halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, true, 2);
2729                 else
2730                         halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, false, 3);
2731         } else
2732                 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, true, 3);
2733
2734         /*  sw mechanism */
2735         if (BTC_WIFI_BW_HT40 == wifiBw) {
2736                 if (
2737                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2738                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2739                 ) {
2740                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2741                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2742                 } else {
2743                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2744                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2745                 }
2746         } else {
2747                 if (
2748                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2749                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2750                 ) {
2751                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2752                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2753                 } else {
2754                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2755                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2756                 }
2757         }
2758 }
2759
2760 static void halbtc8723b2ant_ActionHidA2dp(PBTC_COEXIST pBtCoexist)
2761 {
2762         u8 wifiRssiState, btRssiState;
2763         u32 wifiBw;
2764         u8 apNum = 0;
2765
2766         wifiRssiState = halbtc8723b2ant_WifiRssiState(pBtCoexist, 0, 2, 15, 0);
2767         /* btRssiState = halbtc8723b2ant_BtRssiState(2, 29, 0); */
2768         btRssiState = halbtc8723b2ant_BtRssiState(3, 29, 37);
2769
2770         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
2771
2772         halbtc8723b2ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, true, 0x5);
2773
2774         halbtc8723b2ant_FwDacSwingLvl(pBtCoexist, NORMAL_EXEC, 6);
2775
2776         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2777         if (BTC_WIFI_BW_LEGACY == wifiBw) {
2778                 if (BTC_RSSI_HIGH(btRssiState))
2779                         halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2780                 else if (BTC_RSSI_MEDIUM(btRssiState))
2781                         halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2782                 else
2783                         halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2784         } else {
2785                 /*  only 802.11N mode we have to dec bt power to 4 degree */
2786                 if (BTC_RSSI_HIGH(btRssiState)) {
2787                         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);
2788                         /*  need to check ap Number of Not */
2789                         if (apNum < 10)
2790                                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 4);
2791                         else
2792                                 halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2793                 } else if (BTC_RSSI_MEDIUM(btRssiState))
2794                         halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 2);
2795                 else
2796                         halbtc8723b2ant_DecBtPwr(pBtCoexist, NORMAL_EXEC, 0);
2797         }
2798
2799         halbtc8723b2ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7);
2800
2801         if (
2802                 (btRssiState == BTC_RSSI_STATE_HIGH) ||
2803                 (btRssiState == BTC_RSSI_STATE_STAY_HIGH)
2804         )
2805                 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, false, 2);
2806         else
2807                 halbtc8723b2ant_TdmaDurationAdjust(pBtCoexist, true, true, 2);
2808
2809         /*  sw mechanism */
2810         if (BTC_WIFI_BW_HT40 == wifiBw) {
2811                 if (
2812                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2813                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2814                 ) {
2815                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2816                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2817                 } else {
2818                         halbtc8723b2ant_SwMechanism1(pBtCoexist, true, true, false, false);
2819                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2820                 }
2821         } else {
2822                 if (
2823                         (wifiRssiState == BTC_RSSI_STATE_HIGH) ||
2824                         (wifiRssiState == BTC_RSSI_STATE_STAY_HIGH)
2825                 ) {
2826                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2827                         halbtc8723b2ant_SwMechanism2(pBtCoexist, true, false, false, 0x18);
2828                 } else {
2829                         halbtc8723b2ant_SwMechanism1(pBtCoexist, false, true, false, false);
2830                         halbtc8723b2ant_SwMechanism2(pBtCoexist, false, false, false, 0x18);
2831                 }
2832         }
2833 }
2834
2835 static void halbtc8723b2ant_RunCoexistMechanism(PBTC_COEXIST pBtCoexist)
2836 {
2837         u8 algorithm = 0;
2838
2839         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism() ===>\n"));
2840
2841         if (pBtCoexist->bManualControl) {
2842                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n"));
2843                 return;
2844         }
2845
2846         if (pCoexSta->bUnderIps) {
2847                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], wifi is under IPS !!!\n"));
2848                 return;
2849         }
2850
2851         algorithm = halbtc8723b2ant_ActionAlgorithm(pBtCoexist);
2852         if (pCoexSta->bC2hBtInquiryPage && (BT_8723B_2ANT_COEX_ALGO_PANHS != algorithm)) {
2853                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT is under inquiry/page scan !!\n"));
2854                 halbtc8723b2ant_ActionBtInquiry(pBtCoexist);
2855                 return;
2856         } else {
2857                 if (pCoexDm->bNeedRecover0x948) {
2858                         pCoexDm->bNeedRecover0x948 = false;
2859                         pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, pCoexDm->backup0x948);
2860                 }
2861         }
2862
2863         pCoexDm->curAlgorithm = algorithm;
2864         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Algorithm = %d\n", pCoexDm->curAlgorithm));
2865
2866         if (halbtc8723b2ant_IsCommonAction(pBtCoexist)) {
2867                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant common.\n"));
2868                 pCoexDm->bAutoTdmaAdjust = false;
2869         } else {
2870                 if (pCoexDm->curAlgorithm != pCoexDm->preAlgorithm) {
2871                         BTC_PRINT(
2872                                 BTC_MSG_ALGORITHM,
2873                                 ALGO_TRACE,
2874                                 (
2875                                         "[BTCoex], preAlgorithm =%d, curAlgorithm =%d\n",
2876                                         pCoexDm->preAlgorithm,
2877                                         pCoexDm->curAlgorithm
2878                                 )
2879                         );
2880                         pCoexDm->bAutoTdmaAdjust = false;
2881                 }
2882
2883
2884                 switch (pCoexDm->curAlgorithm) {
2885                 case BT_8723B_2ANT_COEX_ALGO_SCO:
2886                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = SCO.\n"));
2887                         halbtc8723b2ant_ActionSco(pBtCoexist);
2888                         break;
2889                 case BT_8723B_2ANT_COEX_ALGO_HID:
2890                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID.\n"));
2891                         halbtc8723b2ant_ActionHid(pBtCoexist);
2892                         break;
2893                 case BT_8723B_2ANT_COEX_ALGO_A2DP:
2894                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP.\n"));
2895                         halbtc8723b2ant_ActionA2dp(pBtCoexist);
2896                         break;
2897                 case BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS:
2898                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n"));
2899                         halbtc8723b2ant_ActionA2dpPanHs(pBtCoexist);
2900                         break;
2901                 case BT_8723B_2ANT_COEX_ALGO_PANEDR:
2902                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n"));
2903                         halbtc8723b2ant_ActionPanEdr(pBtCoexist);
2904                         break;
2905                 case BT_8723B_2ANT_COEX_ALGO_PANHS:
2906                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HS mode.\n"));
2907                         halbtc8723b2ant_ActionPanHs(pBtCoexist);
2908                         break;
2909                 case BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP:
2910                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n"));
2911                         halbtc8723b2ant_ActionPanEdrA2dp(pBtCoexist);
2912                         break;
2913                 case BT_8723B_2ANT_COEX_ALGO_PANEDR_HID:
2914                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n"));
2915                         halbtc8723b2ant_ActionPanEdrHid(pBtCoexist);
2916                         break;
2917                 case BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
2918                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n"));
2919                         halbtc8723b2ant_ActionHidA2dpPanEdr(pBtCoexist);
2920                         break;
2921                 case BT_8723B_2ANT_COEX_ALGO_HID_A2DP:
2922                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n"));
2923                         halbtc8723b2ant_ActionHidA2dp(pBtCoexist);
2924                         break;
2925                 default:
2926                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n"));
2927                         halbtc8723b2ant_CoexAllOff(pBtCoexist);
2928                         break;
2929                 }
2930                 pCoexDm->preAlgorithm = pCoexDm->curAlgorithm;
2931         }
2932 }
2933
2934 static void halbtc8723b2ant_WifiOffHwCfg(PBTC_COEXIST pBtCoexist)
2935 {
2936         bool bIsInMpMode = false;
2937         u8 H2C_Parameter[2] = {0};
2938         u32 fwVer = 0;
2939
2940         /*  set wlan_act to low */
2941         pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
2942
2943         pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); /* WiFi goto standby while GNT_BT 0-->1 */
2944         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);
2945         if (fwVer >= 0x180000) {
2946                 /* Use H2C to set GNT_BT to HIGH */
2947                 H2C_Parameter[0] = 1;
2948                 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);
2949         } else
2950                 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);
2951
2952         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode);
2953         if (!bIsInMpMode)
2954                 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); /* BT select s0/s1 is controlled by BT */
2955         else
2956                 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); /* BT select s0/s1 is controlled by WiFi */
2957 }
2958
2959 static void halbtc8723b2ant_InitHwConfig(PBTC_COEXIST pBtCoexist, bool bBackUp)
2960 {
2961         u8 u1Tmp = 0;
2962
2963         BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], 2Ant Init HW Config!!\n"));
2964
2965         /*  backup rf 0x1e value */
2966         pCoexDm->btRf0x1eBackup =
2967                 pBtCoexist->fBtcGetRfReg(pBtCoexist, BTC_RF_A, 0x1e, 0xfffff);
2968
2969         /*  0x790[5:0]= 0x5 */
2970         u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x790);
2971         u1Tmp &= 0xc0;
2972         u1Tmp |= 0x5;
2973         pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, u1Tmp);
2974
2975         /* Antenna config */
2976         halbtc8723b2ant_SetAntPath(pBtCoexist, BTC_ANT_WIFI_AT_MAIN, true, false);
2977
2978         /*  PTA parameter */
2979         halbtc8723b2ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 0);
2980
2981         /*  Enable counter statistics */
2982         pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); /* 0x76e[3] = 1, WLAN_Act control by PTA */
2983         pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3);
2984         pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);
2985 }
2986
2987 /*  */
2988 /*  work around function start with wa_halbtc8723b2ant_ */
2989 /*  */
2990 /*  */
2991 /*  extern function start with EXhalbtc8723b2ant_ */
2992 /*  */
2993 void EXhalbtc8723b2ant_PowerOnSetting(PBTC_COEXIST pBtCoexist)
2994 {
2995         PBTC_BOARD_INFO pBoardInfo = &pBtCoexist->boardInfo;
2996         u8 u1Tmp = 0x4; /* Set BIT2 by default since it's 2ant case */
2997         u16 u2Tmp = 0x0;
2998
2999         pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20);
3000
3001         /*  enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. */
3002         u2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2);
3003         pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp|BIT0|BIT1);
3004
3005         /*  set GRAN_BT = 1 */
3006         pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);
3007         /*  set WLAN_ACT = 0 */
3008         pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
3009
3010         /*  */
3011         /*  S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info) */
3012         /*  Local setting bit define */
3013         /*      BIT0: "0" for no antenna inverse; "1" for antenna inverse */
3014         /*      BIT1: "0" for internal switch; "1" for external switch */
3015         /*      BIT2: "0" for one antenna; "1" for two antenna */
3016         /*  NOTE: here default all internal switch and 1-antenna ==> BIT1 = 0 and BIT2 = 0 */
3017         if (pBtCoexist->chipInterface == BTC_INTF_USB) {
3018                 /*  fixed at S0 for USB interface */
3019                 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
3020
3021                 u1Tmp |= 0x1;   /*  antenna inverse */
3022                 pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);
3023
3024                 pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;
3025         } else {
3026                 /*  for PCIE and SDIO interface, we check efuse 0xc3[6] */
3027                 if (pBoardInfo->singleAntPath == 0) {
3028                         /*  set to S1 */
3029                         pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);
3030                         pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
3031                 } else if (pBoardInfo->singleAntPath == 1) {
3032                         /*  set to S0 */
3033                         pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
3034                         u1Tmp |= 0x1;   /*  antenna inverse */
3035                         pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;
3036                 }
3037
3038                 if (pBtCoexist->chipInterface == BTC_INTF_PCI)
3039                         pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);
3040                 else if (pBtCoexist->chipInterface == BTC_INTF_SDIO)
3041                         pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);
3042         }
3043 }
3044
3045 void EXhalbtc8723b2ant_InitHwConfig(PBTC_COEXIST pBtCoexist, bool bWifiOnly)
3046 {
3047         halbtc8723b2ant_InitHwConfig(pBtCoexist, true);
3048 }
3049
3050 void EXhalbtc8723b2ant_InitCoexDm(PBTC_COEXIST pBtCoexist)
3051 {
3052         BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], Coex Mechanism Init!!\n"));
3053
3054         halbtc8723b2ant_InitCoexDm(pBtCoexist);
3055 }
3056
3057 void EXhalbtc8723b2ant_DisplayCoexInfo(PBTC_COEXIST pBtCoexist)
3058 {
3059         PBTC_BOARD_INFO pBoardInfo = &pBtCoexist->boardInfo;
3060         PBTC_STACK_INFO pStackInfo = &pBtCoexist->stackInfo;
3061         PBTC_BT_LINK_INFO pBtLinkInfo = &pBtCoexist->btLinkInfo;
3062         u8 *cliBuf = pBtCoexist->cliBuf;
3063         u8 u1Tmp[4], i, btInfoExt, psTdmaCase = 0;
3064         u32 u4Tmp[4];
3065         bool bRoam = false, bScan = false, bLink = false, bWifiUnder5G = false;
3066         bool bBtHsOn = false, bWifiBusy = false;
3067         s32 wifiRssi = 0, btHsRssi = 0;
3068         u32 wifiBw, wifiTrafficDir, faOfdm, faCck;
3069         u8 wifiDot11Chnl, wifiHsChnl;
3070         u32 fwVer = 0, btPatchVer = 0;
3071         u8 apNum = 0;
3072
3073         CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[BT Coexist info]============");
3074         CL_PRINTF(cliBuf);
3075
3076         if (pBtCoexist->bManualControl) {
3077                 CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ============[Under Manual Control]============");
3078                 CL_PRINTF(cliBuf);
3079                 CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n ==========================================");
3080                 CL_PRINTF(cliBuf);
3081         }
3082
3083         CL_SPRINTF(
3084                 cliBuf,
3085                 BT_TMP_BUF_SIZE,
3086                 "\r\n %-35s = %d/ %d ", "Ant PG number/ Ant mechanism:", \
3087                 pBoardInfo->pgAntNum,
3088                 pBoardInfo->btdmAntNum
3089         );
3090         CL_PRINTF(cliBuf);
3091
3092         CL_SPRINTF(
3093                 cliBuf,
3094                 BT_TMP_BUF_SIZE,
3095                 "\r\n %-35s = %s / %d", "BT stack/ hci ext ver", \
3096                 (pStackInfo->bProfileNotified ? "Yes" : "No"),
3097                 pStackInfo->hciVersion
3098         );
3099         CL_PRINTF(cliBuf);
3100
3101         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);
3102         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);
3103         CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)", "CoexVer/ FwVer/ PatchVer", \
3104                 GLCoexVerDate8723b2Ant, GLCoexVer8723b2Ant, fwVer, btPatchVer, btPatchVer);
3105         CL_PRINTF(cliBuf);
3106
3107         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
3108         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifiDot11Chnl);
3109         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifiHsChnl);
3110         CL_SPRINTF(
3111                 cliBuf,
3112                 BT_TMP_BUF_SIZE,
3113                 "\r\n %-35s = %d / %d(%d)", "Dot11 channel / HsChnl(HsMode)", \
3114                 wifiDot11Chnl,
3115                 wifiHsChnl,
3116                 bBtHsOn
3117         );
3118         CL_PRINTF(cliBuf);
3119
3120         CL_SPRINTF(
3121                 cliBuf,
3122                 BT_TMP_BUF_SIZE,
3123                 "\r\n %-35s = %02x %02x %02x ", "H2C Wifi inform bt chnl Info", \
3124                 pCoexDm->wifiChnlInfo[0],
3125                 pCoexDm->wifiChnlInfo[1],
3126                 pCoexDm->wifiChnlInfo[2]
3127         );
3128         CL_PRINTF(cliBuf);
3129
3130         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);
3131         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_HS_RSSI, &btHsRssi);
3132         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);
3133         CL_SPRINTF(
3134                 cliBuf,
3135                 BT_TMP_BUF_SIZE,
3136                 "\r\n %-35s = %d/ %d/ %d", "Wifi rssi/ HS rssi/ AP#", \
3137                 wifiRssi,
3138                 btHsRssi,
3139                 apNum
3140         );
3141         CL_PRINTF(cliBuf);
3142
3143         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);
3144         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);
3145         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);
3146         CL_SPRINTF(
3147                 cliBuf,
3148                 BT_TMP_BUF_SIZE,
3149                 "\r\n %-35s = %d/ %d/ %d ", "Wifi bLink/ bRoam/ bScan", \
3150                 bLink,
3151                 bRoam,
3152                 bScan
3153         );
3154         CL_PRINTF(cliBuf);
3155
3156         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_5G, &bWifiUnder5G);
3157         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
3158         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
3159         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, &wifiTrafficDir);
3160         CL_SPRINTF(
3161                 cliBuf,
3162                 BT_TMP_BUF_SIZE,
3163                 "\r\n %-35s = %s / %s/ %s ", "Wifi status", \
3164                 (bWifiUnder5G ? "5G" : "2.4G"),
3165                 ((BTC_WIFI_BW_LEGACY == wifiBw) ? "Legacy" : (((BTC_WIFI_BW_HT40 == wifiBw) ? "HT40" : "HT20"))),
3166                 ((!bWifiBusy) ? "idle" : ((BTC_WIFI_TRAFFIC_TX == wifiTrafficDir) ? "uplink" : "downlink"))
3167         );
3168         CL_PRINTF(cliBuf);
3169
3170         CL_SPRINTF(
3171                 cliBuf,
3172                 BT_TMP_BUF_SIZE,
3173                 "\r\n %-35s = [%s/ %d/ %d] ", "BT [status/ rssi/ retryCnt]", \
3174                 ((pBtCoexist->btInfo.bBtDisabled) ? ("disabled") : ((pCoexSta->bC2hBtInquiryPage) ? ("inquiry/page scan") : ((BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE == pCoexDm->btStatus) ? "non-connected idle" :
3175                 ((BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE == pCoexDm->btStatus) ? "connected-idle" : "busy")))),
3176                 pCoexSta->btRssi,
3177                 pCoexSta->btRetryCnt
3178         );
3179         CL_PRINTF(cliBuf);
3180
3181         CL_SPRINTF(
3182                 cliBuf,
3183                 BT_TMP_BUF_SIZE,
3184                 "\r\n %-35s = %d / %d / %d / %d", "SCO/HID/PAN/A2DP", \
3185                 pBtLinkInfo->bScoExist,
3186                 pBtLinkInfo->bHidExist,
3187                 pBtLinkInfo->bPanExist,
3188                 pBtLinkInfo->bA2dpExist
3189         );
3190         CL_PRINTF(cliBuf);
3191         pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_BT_LINK_INFO);
3192
3193         btInfoExt = pCoexSta->btInfoExt;
3194         CL_SPRINTF(
3195                 cliBuf,
3196                 BT_TMP_BUF_SIZE,
3197                 "\r\n %-35s = %s", "BT Info A2DP rate", \
3198                 (btInfoExt&BIT0) ? "Basic rate" : "EDR rate"
3199         );
3200         CL_PRINTF(cliBuf);
3201
3202         for (i = 0; i < BT_INFO_SRC_8723B_2ANT_MAX; i++) {
3203                 if (pCoexSta->btInfoC2hCnt[i]) {
3204                         CL_SPRINTF(
3205                                 cliBuf,
3206                                 BT_TMP_BUF_SIZE,
3207                                 "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)", GLBtInfoSrc8723b2Ant[i], \
3208                                 pCoexSta->btInfoC2h[i][0],
3209                                 pCoexSta->btInfoC2h[i][1],
3210                                 pCoexSta->btInfoC2h[i][2],
3211                                 pCoexSta->btInfoC2h[i][3],
3212                                 pCoexSta->btInfoC2h[i][4],
3213                                 pCoexSta->btInfoC2h[i][5],
3214                                 pCoexSta->btInfoC2h[i][6],
3215                                 pCoexSta->btInfoC2hCnt[i]
3216                         );
3217                         CL_PRINTF(cliBuf);
3218                 }
3219         }
3220
3221         CL_SPRINTF(
3222                 cliBuf,
3223                 BT_TMP_BUF_SIZE,
3224                 "\r\n %-35s = %s/%s", "PS state, IPS/LPS", \
3225                 ((pCoexSta->bUnderIps ? "IPS ON" : "IPS OFF")),
3226                 ((pCoexSta->bUnderLps ? "LPS ON" : "LPS OFF"))
3227         );
3228         CL_PRINTF(cliBuf);
3229         pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);
3230
3231         /*  Sw mechanism */
3232         CL_SPRINTF(
3233                 cliBuf,
3234                 BT_TMP_BUF_SIZE,
3235                 "\r\n %-35s", "============[Sw mechanism]============"
3236         );
3237         CL_PRINTF(cliBuf);
3238         CL_SPRINTF(
3239                 cliBuf,
3240                 BT_TMP_BUF_SIZE,
3241                 "\r\n %-35s = %d/ %d/ %d ", "SM1[ShRf/ LpRA/ LimDig]", \
3242                 pCoexDm->bCurRfRxLpfShrink,
3243                 pCoexDm->bCurLowPenaltyRa,
3244                 pCoexDm->bLimitedDig
3245         );
3246         CL_PRINTF(cliBuf);
3247         CL_SPRINTF(
3248                 cliBuf,
3249                 BT_TMP_BUF_SIZE,
3250                 "\r\n %-35s = %d/ %d/ %d(0x%x) ",
3251                 "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]", \
3252                 pCoexDm->bCurAgcTableEn,
3253                 pCoexDm->bCurAdcBackOff,
3254                 pCoexDm->bCurDacSwingOn,
3255                 pCoexDm->curDacSwingLvl
3256         );
3257         CL_PRINTF(cliBuf);
3258
3259         /*  Fw mechanism */
3260         CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Fw mechanism]============");
3261         CL_PRINTF(cliBuf);
3262
3263         psTdmaCase = pCoexDm->curPsTdma;
3264         CL_SPRINTF(
3265                 cliBuf,
3266                 BT_TMP_BUF_SIZE,
3267                 "\r\n %-35s = %02x %02x %02x %02x %02x case-%d (auto:%d)", "PS TDMA", \
3268                 pCoexDm->psTdmaPara[0],
3269                 pCoexDm->psTdmaPara[1],
3270                 pCoexDm->psTdmaPara[2],
3271                 pCoexDm->psTdmaPara[3],
3272                 pCoexDm->psTdmaPara[4],
3273                 psTdmaCase, pCoexDm->bAutoTdmaAdjust
3274         );
3275         CL_PRINTF(cliBuf);
3276
3277         CL_SPRINTF(
3278                 cliBuf,
3279                 BT_TMP_BUF_SIZE,
3280                 "\r\n %-35s = %d/ %d ", "DecBtPwr/ IgnWlanAct", \
3281                 pCoexDm->curBtDecPwrLvl,
3282                 pCoexDm->bCurIgnoreWlanAct
3283         );
3284         CL_PRINTF(cliBuf);
3285
3286         /*  Hw setting */
3287         CL_SPRINTF(cliBuf, BT_TMP_BUF_SIZE, "\r\n %-35s", "============[Hw setting]============");
3288         CL_PRINTF(cliBuf);
3289
3290         CL_SPRINTF(
3291                 cliBuf,
3292                 BT_TMP_BUF_SIZE,
3293                 "\r\n %-35s = 0x%x", "RF-A, 0x1e initVal", \
3294                 pCoexDm->btRf0x1eBackup
3295         );
3296         CL_PRINTF(cliBuf);
3297
3298         u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x778);
3299         u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x880);
3300         CL_SPRINTF(
3301                 cliBuf,
3302                 BT_TMP_BUF_SIZE,
3303                 "\r\n %-35s = 0x%x/ 0x%x", "0x778/0x880[29:25]", \
3304                 u1Tmp[0],
3305                 (u4Tmp[0]&0x3e000000) >> 25
3306         );
3307         CL_PRINTF(cliBuf);
3308
3309
3310         u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);
3311         u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);
3312         u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);
3313         CL_SPRINTF(
3314                 cliBuf,
3315                 BT_TMP_BUF_SIZE,
3316                 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x948/ 0x67[5] / 0x765", \
3317                 u4Tmp[0],
3318                 ((u1Tmp[0]&0x20)>>5),
3319                 u1Tmp[1]
3320         );
3321         CL_PRINTF(cliBuf);
3322
3323         u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x92c);
3324         u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x930);
3325         u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x944);
3326         CL_SPRINTF(
3327                 cliBuf,
3328                 BT_TMP_BUF_SIZE,
3329                 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]", \
3330                 u4Tmp[0]&0x3,
3331                 u4Tmp[1]&0xff,
3332                 u4Tmp[2]&0x3
3333         );
3334         CL_PRINTF(cliBuf);
3335
3336
3337         u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x39);
3338         u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x40);
3339         u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);
3340         u1Tmp[2] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x64);
3341         CL_SPRINTF(
3342                 cliBuf,
3343                 BT_TMP_BUF_SIZE,
3344                 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x38[11]/0x40/0x4c[24:23]/0x64[0]", \
3345                 ((u1Tmp[0] & 0x8)>>3),
3346                 u1Tmp[1],
3347                 ((u4Tmp[0]&0x01800000)>>23),
3348                 u1Tmp[2]&0x1
3349         );
3350         CL_PRINTF(cliBuf);
3351
3352         u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x550);
3353         u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x522);
3354         CL_SPRINTF(
3355                 cliBuf,
3356                 BT_TMP_BUF_SIZE,
3357                 "\r\n %-35s = 0x%x/ 0x%x", "0x550(bcn ctrl)/0x522", \
3358                 u4Tmp[0],
3359                 u1Tmp[0]
3360         );
3361         CL_PRINTF(cliBuf);
3362
3363         u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xc50);
3364         u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49c);
3365         CL_SPRINTF(
3366                 cliBuf,
3367                 BT_TMP_BUF_SIZE,
3368                 "\r\n %-35s = 0x%x/ 0x%x", "0xc50(dig)/0x49c(null-drop)", \
3369                 u4Tmp[0]&0xff,
3370                 u1Tmp[0]
3371         );
3372         CL_PRINTF(cliBuf);
3373
3374         u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda0);
3375         u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda4);
3376         u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xda8);
3377         u4Tmp[3] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xcf0);
3378
3379         u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5b);
3380         u1Tmp[1] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0xa5c);
3381
3382         faOfdm =
3383                 ((u4Tmp[0]&0xffff0000) >> 16) +
3384                 ((u4Tmp[1]&0xffff0000) >> 16) +
3385                 (u4Tmp[1] & 0xffff) +  (u4Tmp[2] & 0xffff) + \
3386                 ((u4Tmp[3]&0xffff0000) >> 16) +
3387                 (u4Tmp[3] & 0xffff);
3388
3389         faCck = (u1Tmp[0] << 8) + u1Tmp[1];
3390
3391         CL_SPRINTF(
3392                 cliBuf,
3393                 BT_TMP_BUF_SIZE,
3394                 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x", "OFDM-CCA/OFDM-FA/CCK-FA", \
3395                 u4Tmp[0]&0xffff,
3396                 faOfdm,
3397                 faCck
3398         );
3399         CL_PRINTF(cliBuf);
3400
3401         u4Tmp[0] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c0);
3402         u4Tmp[1] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c4);
3403         u4Tmp[2] = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x6c8);
3404         u1Tmp[0] = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x6cc);
3405         CL_SPRINTF(
3406                 cliBuf,
3407                 BT_TMP_BUF_SIZE,
3408                 "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x", "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)", \
3409                 u4Tmp[0],
3410                 u4Tmp[1],
3411                 u4Tmp[2],
3412                 u1Tmp[0]
3413         );
3414         CL_PRINTF(cliBuf);
3415
3416         CL_SPRINTF(
3417                 cliBuf,
3418                 BT_TMP_BUF_SIZE,
3419                 "\r\n %-35s = %d/ %d", "0x770(high-pri rx/tx)", \
3420                 pCoexSta->highPriorityRx,
3421                 pCoexSta->highPriorityTx
3422         );
3423         CL_PRINTF(cliBuf);
3424         CL_SPRINTF(
3425                 cliBuf,
3426                 BT_TMP_BUF_SIZE,
3427                 "\r\n %-35s = %d/ %d", "0x774(low-pri rx/tx)", \
3428                 pCoexSta->lowPriorityRx,
3429                 pCoexSta->lowPriorityTx
3430         );
3431         CL_PRINTF(cliBuf);
3432
3433         halbtc8723b2ant_MonitorBtCtr(pBtCoexist);
3434         pBtCoexist->fBtcDispDbgMsg(pBtCoexist, BTC_DBG_DISP_COEX_STATISTICS);
3435 }
3436
3437
3438 void EXhalbtc8723b2ant_IpsNotify(PBTC_COEXIST pBtCoexist, u8 type)
3439 {
3440         if (BTC_IPS_ENTER == type) {
3441                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS ENTER notify\n"));
3442                 pCoexSta->bUnderIps = true;
3443                 halbtc8723b2ant_WifiOffHwCfg(pBtCoexist);
3444                 halbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, true);
3445                 halbtc8723b2ant_CoexAllOff(pBtCoexist);
3446         } else if (BTC_IPS_LEAVE == type) {
3447                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], IPS LEAVE notify\n"));
3448                 pCoexSta->bUnderIps = false;
3449                 halbtc8723b2ant_InitHwConfig(pBtCoexist, false);
3450                 halbtc8723b2ant_InitCoexDm(pBtCoexist);
3451                 halbtc8723b2ant_QueryBtInfo(pBtCoexist);
3452         }
3453 }
3454
3455 void EXhalbtc8723b2ant_LpsNotify(PBTC_COEXIST pBtCoexist, u8 type)
3456 {
3457         if (BTC_LPS_ENABLE == type) {
3458                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS ENABLE notify\n"));
3459                 pCoexSta->bUnderLps = true;
3460         } else if (BTC_LPS_DISABLE == type) {
3461                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], LPS DISABLE notify\n"));
3462                 pCoexSta->bUnderLps = false;
3463         }
3464 }
3465
3466 void EXhalbtc8723b2ant_ScanNotify(PBTC_COEXIST pBtCoexist, u8 type)
3467 {
3468         if (BTC_SCAN_START == type) {
3469                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN START notify\n"));
3470         } else if (BTC_SCAN_FINISH == type) {
3471                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], SCAN FINISH notify\n"));
3472         }
3473 }
3474
3475 void EXhalbtc8723b2ant_ConnectNotify(PBTC_COEXIST pBtCoexist, u8 type)
3476 {
3477         if (BTC_ASSOCIATE_START == type) {
3478                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT START notify\n"));
3479         } else if (BTC_ASSOCIATE_FINISH == type) {
3480                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], CONNECT FINISH notify\n"));
3481         }
3482 }
3483
3484 void EXhalbtc8723b2ant_MediaStatusNotify(PBTC_COEXIST pBtCoexist, u8 type)
3485 {
3486         u8 H2C_Parameter[3] = {0};
3487         u32 wifiBw;
3488         u8 wifiCentralChnl;
3489         u8 apNum = 0;
3490
3491         if (BTC_MEDIA_CONNECT == type) {
3492                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA connect notify\n"));
3493         } else {
3494                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], MEDIA disconnect notify\n"));
3495         }
3496
3497         /*  only 2.4G we need to inform bt the chnl mask */
3498         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);
3499         if ((BTC_MEDIA_CONNECT == type) && (wifiCentralChnl <= 14)) {
3500                 H2C_Parameter[0] = 0x1;
3501                 H2C_Parameter[1] = wifiCentralChnl;
3502                 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
3503                 if (BTC_WIFI_BW_HT40 == wifiBw)
3504                         H2C_Parameter[2] = 0x30;
3505                 else {
3506                         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_AP_NUM, &apNum);
3507                         if (apNum < 10)
3508                                 H2C_Parameter[2] = 0x30;
3509                         else
3510                                 H2C_Parameter[2] = 0x20;
3511                 }
3512         }
3513
3514         pCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];
3515         pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];
3516         pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];
3517
3518         BTC_PRINT(
3519                 BTC_MSG_ALGORITHM,
3520                 ALGO_TRACE_FW_EXEC,
3521                 (
3522                         "[BTCoex], FW write 0x66 = 0x%x\n",
3523                         H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2]
3524                 )
3525         );
3526
3527         pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);
3528 }
3529
3530 void EXhalbtc8723b2ant_SpecialPacketNotify(PBTC_COEXIST pBtCoexist, u8 type)
3531 {
3532         if (type == BTC_PACKET_DHCP) {
3533                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], DHCP Packet notify\n"));
3534         }
3535 }
3536
3537 void EXhalbtc8723b2ant_BtInfoNotify(
3538         PBTC_COEXIST pBtCoexist, u8 *tmpBuf, u8 length
3539 )
3540 {
3541         u8      btInfo = 0;
3542         u8      i, rspSource = 0;
3543         bool bBtBusy = false, bLimitedDig = false;
3544         bool bWifiConnected = false;
3545
3546         pCoexSta->bC2hBtInfoReqSent = false;
3547
3548         rspSource = tmpBuf[0]&0xf;
3549         if (rspSource >= BT_INFO_SRC_8723B_2ANT_MAX)
3550                 rspSource = BT_INFO_SRC_8723B_2ANT_WIFI_FW;
3551
3552         pCoexSta->btInfoC2hCnt[rspSource]++;
3553
3554         BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Bt info[%d], length =%d, hex data =[", rspSource, length));
3555         for (i = 0; i < length; i++) {
3556                 pCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];
3557                 if (i == 1)
3558                         btInfo = tmpBuf[i];
3559
3560                 if (i == length-1) {
3561                         BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x]\n", tmpBuf[i]));
3562                 } else {
3563                         BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("0x%02x, ", tmpBuf[i]));
3564                 }
3565         }
3566
3567         if (pBtCoexist->bManualControl) {
3568                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n"));
3569                 return;
3570         }
3571
3572         if (BT_INFO_SRC_8723B_2ANT_WIFI_FW != rspSource) {
3573                 pCoexSta->btRetryCnt = pCoexSta->btInfoC2h[rspSource][2]&0xf; /* [3:0] */
3574
3575                 pCoexSta->btRssi = pCoexSta->btInfoC2h[rspSource][3]*2+10;
3576
3577                 pCoexSta->btInfoExt = pCoexSta->btInfoC2h[rspSource][4];
3578
3579                 pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2]&0x40);
3580                 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);
3581                 if (pCoexSta->bBtTxRxMask) {
3582                         /* BT into is responded by BT FW and BT RF REG 0x3C != 0x01 => Need to switch BT TRx Mask */
3583                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], Switch BT TRx Mask since BT RF REG 0x3C != 0x01\n"));
3584                         pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x01);
3585                 }
3586
3587                 /*  Here we need to resend some wifi info to BT */
3588                 /*  because bt is reset and loss of the info. */
3589                 if ((pCoexSta->btInfoExt & BIT1)) {
3590                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n"));
3591                         pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
3592
3593                         if (bWifiConnected)
3594                                 EXhalbtc8723b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_CONNECT);
3595                         else
3596                                 EXhalbtc8723b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);
3597                 }
3598
3599                 if ((pCoexSta->btInfoExt & BIT3)) {
3600                         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n"));
3601                         halbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, false);
3602                 } else {
3603                         /*  BT already NOT ignore Wlan active, do nothing here. */
3604                 }
3605         }
3606
3607         /*  check BIT2 first ==> check if bt is under inquiry or page scan */
3608         if (btInfo & BT_INFO_8723B_2ANT_B_INQ_PAGE)
3609                 pCoexSta->bC2hBtInquiryPage = true;
3610         else
3611                 pCoexSta->bC2hBtInquiryPage = false;
3612
3613         /*  set link exist status */
3614         if (!(btInfo&BT_INFO_8723B_2ANT_B_CONNECTION)) {
3615                 pCoexSta->bBtLinkExist = false;
3616                 pCoexSta->bPanExist = false;
3617                 pCoexSta->bA2dpExist = false;
3618                 pCoexSta->bHidExist = false;
3619                 pCoexSta->bScoExist = false;
3620         } else { /*  connection exists */
3621                 pCoexSta->bBtLinkExist = true;
3622                 if (btInfo & BT_INFO_8723B_2ANT_B_FTP)
3623                         pCoexSta->bPanExist = true;
3624                 else
3625                         pCoexSta->bPanExist = false;
3626                 if (btInfo & BT_INFO_8723B_2ANT_B_A2DP)
3627                         pCoexSta->bA2dpExist = true;
3628                 else
3629                         pCoexSta->bA2dpExist = false;
3630                 if (btInfo & BT_INFO_8723B_2ANT_B_HID)
3631                         pCoexSta->bHidExist = true;
3632                 else
3633                         pCoexSta->bHidExist = false;
3634                 if (btInfo & BT_INFO_8723B_2ANT_B_SCO_ESCO)
3635                         pCoexSta->bScoExist = true;
3636                 else
3637                         pCoexSta->bScoExist = false;
3638         }
3639
3640         halbtc8723b2ant_UpdateBtLinkInfo(pBtCoexist);
3641
3642         if (!(btInfo&BT_INFO_8723B_2ANT_B_CONNECTION)) {
3643                 pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE;
3644                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n"));
3645         } else if (btInfo == BT_INFO_8723B_2ANT_B_CONNECTION)   { /*  connection exists but no busy */
3646                 pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE;
3647                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n"));
3648         } else if (
3649                 (btInfo&BT_INFO_8723B_2ANT_B_SCO_ESCO) ||
3650                 (btInfo&BT_INFO_8723B_2ANT_B_SCO_BUSY)
3651         ) {
3652                 pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_SCO_BUSY;
3653                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT SCO busy!!!\n"));
3654         } else if (btInfo&BT_INFO_8723B_2ANT_B_ACL_BUSY) {
3655                 pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_ACL_BUSY;
3656                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT ACL busy!!!\n"));
3657         } else {
3658                 pCoexDm->btStatus = BT_8723B_2ANT_BT_STATUS_MAX;
3659                 BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n"));
3660         }
3661
3662         if (
3663                 (BT_8723B_2ANT_BT_STATUS_ACL_BUSY == pCoexDm->btStatus) ||
3664                 (BT_8723B_2ANT_BT_STATUS_SCO_BUSY == pCoexDm->btStatus) ||
3665                 (BT_8723B_2ANT_BT_STATUS_ACL_SCO_BUSY == pCoexDm->btStatus)
3666         ) {
3667                 bBtBusy = true;
3668                 bLimitedDig = true;
3669         } else {
3670                 bBtBusy = false;
3671                 bLimitedDig = false;
3672         }
3673
3674         pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);
3675
3676         pCoexDm->bLimitedDig = bLimitedDig;
3677         pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_LIMITED_DIG, &bLimitedDig);
3678
3679         halbtc8723b2ant_RunCoexistMechanism(pBtCoexist);
3680 }
3681
3682 void EXhalbtc8723b2ant_HaltNotify(PBTC_COEXIST pBtCoexist)
3683 {
3684         BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Halt notify\n"));
3685
3686         halbtc8723b2ant_WifiOffHwCfg(pBtCoexist);
3687         pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); /* BT goto standby while GNT_BT 1-->0 */
3688         halbtc8723b2ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, true);
3689
3690         EXhalbtc8723b2ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT);
3691 }
3692
3693 void EXhalbtc8723b2ant_PnpNotify(PBTC_COEXIST pBtCoexist, u8 pnpState)
3694 {
3695         BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify\n"));
3696
3697         if (BTC_WIFI_PNP_SLEEP == pnpState) {
3698                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to SLEEP\n"));
3699         } else if (BTC_WIFI_PNP_WAKE_UP == pnpState) {
3700                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_NOTIFY, ("[BTCoex], Pnp notify to WAKE UP\n"));
3701                 halbtc8723b2ant_InitHwConfig(pBtCoexist, false);
3702                 halbtc8723b2ant_InitCoexDm(pBtCoexist);
3703                 halbtc8723b2ant_QueryBtInfo(pBtCoexist);
3704         }
3705 }
3706
3707 void EXhalbtc8723b2ant_Periodical(PBTC_COEXIST pBtCoexist)
3708 {
3709         static u8 disVerInfoCnt = 0;
3710         u32 fwVer = 0, btPatchVer = 0;
3711
3712         BTC_PRINT(BTC_MSG_ALGORITHM, ALGO_TRACE, ("[BTCoex], ==========================Periodical ===========================\n"));
3713
3714         if (disVerInfoCnt <= 5) {
3715                 disVerInfoCnt += 1;
3716                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n"));
3717                 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);
3718                 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);
3719                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], CoexVer/ FwVer/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n", \
3720                         GLCoexVerDate8723b2Ant, GLCoexVer8723b2Ant, fwVer, btPatchVer, btPatchVer));
3721                 BTC_PRINT(BTC_MSG_INTERFACE, INTF_INIT, ("[BTCoex], ****************************************************************\n"));
3722         }
3723
3724         if (
3725                 halbtc8723b2ant_IsWifiStatusChanged(pBtCoexist) ||
3726                 pCoexDm->bAutoTdmaAdjust
3727         )
3728                 halbtc8723b2ant_RunCoexistMechanism(pBtCoexist);
3729 }