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