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 */
11static struct coex_dm_8723b_1ant GLCoexDm8723b1Ant;
12static struct coex_dm_8723b_1ant *pCoexDm = &GLCoexDm8723b1Ant;
13static struct coex_sta_8723b_1ant GLCoexSta8723b1Ant;
14static struct coex_sta_8723b_1ant *pCoexSta = &GLCoexSta8723b1Ant;
15
16/* local function proto type if needed */
17/* local function start with halbtc8723b1ant_ */
18static u8 halbtc8723b1ant_BtRssiState(
19 u8 levelNum, u8 rssiThresh, u8 rssiThresh1
20)
21{
22 s32 btRssi = 0;
23 u8 btRssiState = pCoexSta->preBtRssiState;
24
25 btRssi = pCoexSta->btRssi;
26
27 if (levelNum == 2) {
28 if (
29 (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||
30 (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW)
31 ) {
32 if (btRssi >= (rssiThresh + BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT))
33
34 btRssiState = BTC_RSSI_STATE_HIGH;
35 else
36 btRssiState = BTC_RSSI_STATE_STAY_LOW;
37 } else {
38 if (btRssi < rssiThresh)
39 btRssiState = BTC_RSSI_STATE_LOW;
40 else
41 btRssiState = BTC_RSSI_STATE_STAY_HIGH;
42 }
43 } else if (levelNum == 3) {
44 if (rssiThresh > rssiThresh1)
45 return pCoexSta->preBtRssiState;
46
47 if (
48 (pCoexSta->preBtRssiState == BTC_RSSI_STATE_LOW) ||
49 (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_LOW)
50 ) {
51 if (btRssi >= (rssiThresh + BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT))
52 btRssiState = BTC_RSSI_STATE_MEDIUM;
53 else
54 btRssiState = BTC_RSSI_STATE_STAY_LOW;
55 } else if (
56 (pCoexSta->preBtRssiState == BTC_RSSI_STATE_MEDIUM) ||
57 (pCoexSta->preBtRssiState == BTC_RSSI_STATE_STAY_MEDIUM)
58 ) {
59 if (btRssi >= (rssiThresh1 + BTC_RSSI_COEX_THRESH_TOL_8723B_1ANT))
60 btRssiState = BTC_RSSI_STATE_HIGH;
61 else if (btRssi < rssiThresh)
62 btRssiState = BTC_RSSI_STATE_LOW;
63 else
64 btRssiState = BTC_RSSI_STATE_STAY_MEDIUM;
65 } else {
66 if (btRssi < rssiThresh1)
67 btRssiState = BTC_RSSI_STATE_MEDIUM;
68 else
69 btRssiState = BTC_RSSI_STATE_STAY_HIGH;
70 }
71 }
72
73 pCoexSta->preBtRssiState = btRssiState;
74
75 return btRssiState;
76}
77
78static void halbtc8723b1ant_UpdateRaMask(
79 struct btc_coexist *pBtCoexist, bool bForceExec, u32 disRateMask
80)
81{
82 pCoexDm->curRaMask = disRateMask;
83
84 if (bForceExec || (pCoexDm->preRaMask != pCoexDm->curRaMask))
85 pBtCoexist->fBtcSet(
86 pBtCoexist,
87 BTC_SET_ACT_UPDATE_RAMASK,
88 &pCoexDm->curRaMask
89 );
90 pCoexDm->preRaMask = pCoexDm->curRaMask;
91}
92
93static void halbtc8723b1ant_AutoRateFallbackRetry(
94 struct btc_coexist *pBtCoexist, bool bForceExec, u8 type
95)
96{
97 bool bWifiUnderBMode = false;
98
99 pCoexDm->curArfrType = type;
100
101 if (bForceExec || (pCoexDm->preArfrType != pCoexDm->curArfrType)) {
102 switch (pCoexDm->curArfrType) {
103 case 0: /* normal mode */
104 pBtCoexist->fBtcWrite4Byte(
105 pBtCoexist, 0x430, pCoexDm->backupArfrCnt1
106 );
107 pBtCoexist->fBtcWrite4Byte(
108 pBtCoexist, 0x434, pCoexDm->backupArfrCnt2
109 );
110 break;
111 case 1:
112 pBtCoexist->fBtcGet(
113 pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode
114 );
115 if (bWifiUnderBMode) {
116 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);
117 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x01010101);
118 } else {
119 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x430, 0x0);
120 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x434, 0x04030201);
121 }
122 break;
123 default:
124 break;
125 }
126 }
127
128 pCoexDm->preArfrType = pCoexDm->curArfrType;
129}
130
131static void halbtc8723b1ant_RetryLimit(
132 struct btc_coexist *pBtCoexist, bool bForceExec, u8 type
133)
134{
135 pCoexDm->curRetryLimitType = type;
136
137 if (
138 bForceExec ||
139 (pCoexDm->preRetryLimitType != pCoexDm->curRetryLimitType)
140 ) {
141 switch (pCoexDm->curRetryLimitType) {
142 case 0: /* normal mode */
143 pBtCoexist->fBtcWrite2Byte(
144 pBtCoexist, 0x42a, pCoexDm->backupRetryLimit
145 );
146 break;
147 case 1: /* retry limit =8 */
148 pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x42a, 0x0808);
149 break;
150 default:
151 break;
152 }
153 }
154
155 pCoexDm->preRetryLimitType = pCoexDm->curRetryLimitType;
156}
157
158static void halbtc8723b1ant_AmpduMaxTime(
159 struct btc_coexist *pBtCoexist, bool bForceExec, u8 type
160)
161{
162 pCoexDm->curAmpduTimeType = type;
163
164 if (
165 bForceExec || (pCoexDm->preAmpduTimeType != pCoexDm->curAmpduTimeType)
166 ) {
167 switch (pCoexDm->curAmpduTimeType) {
168 case 0: /* normal mode */
169 pBtCoexist->fBtcWrite1Byte(
170 pBtCoexist, 0x456, pCoexDm->backupAmpduMaxTime
171 );
172 break;
173 case 1: /* AMPDU timw = 0x38 * 32us */
174 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x456, 0x38);
175 break;
176 default:
177 break;
178 }
179 }
180
181 pCoexDm->preAmpduTimeType = pCoexDm->curAmpduTimeType;
182}
183
184static void halbtc8723b1ant_LimitedTx(
185 struct btc_coexist *pBtCoexist,
186 bool bForceExec,
187 u8 raMaskType,
188 u8 arfrType,
189 u8 retryLimitType,
190 u8 ampduTimeType
191)
192{
193 switch (raMaskType) {
194 case 0: /* normal mode */
195 halbtc8723b1ant_UpdateRaMask(pBtCoexist, bForceExec, disRateMask: 0x0);
196 break;
197 case 1: /* disable cck 1/2 */
198 halbtc8723b1ant_UpdateRaMask(pBtCoexist, bForceExec, disRateMask: 0x00000003);
199 break;
200 case 2: /* disable cck 1/2/5.5, ofdm 6/9/12/18/24, mcs 0/1/2/3/4 */
201 halbtc8723b1ant_UpdateRaMask(pBtCoexist, bForceExec, disRateMask: 0x0001f1f7);
202 break;
203 default:
204 break;
205 }
206
207 halbtc8723b1ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, type: arfrType);
208 halbtc8723b1ant_RetryLimit(pBtCoexist, bForceExec, type: retryLimitType);
209 halbtc8723b1ant_AmpduMaxTime(pBtCoexist, bForceExec, type: ampduTimeType);
210}
211
212static void halbtc8723b1ant_LimitedRx(
213 struct btc_coexist *pBtCoexist,
214 bool bForceExec,
215 bool bRejApAggPkt,
216 bool bBtCtrlAggBufSize,
217 u8 aggBufSize
218)
219{
220 bool bRejectRxAgg = bRejApAggPkt;
221 bool bBtCtrlRxAggSize = bBtCtrlAggBufSize;
222 u8 rxAggSize = aggBufSize;
223
224 /* */
225 /* Rx Aggregation related setting */
226 /* */
227 pBtCoexist->fBtcSet(
228 pBtCoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT, &bRejectRxAgg
229 );
230 /* decide BT control aggregation buf size or not */
231 pBtCoexist->fBtcSet(
232 pBtCoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE, &bBtCtrlRxAggSize
233 );
234 /* aggregation buf size, only work when BT control Rx aggregation size. */
235 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_AGG_BUF_SIZE, &rxAggSize);
236 /* real update aggregation setting */
237 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
238
239
240}
241
242static void halbtc8723b1ant_QueryBtInfo(struct btc_coexist *pBtCoexist)
243{
244 u8 H2C_Parameter[1] = {0};
245
246 pCoexSta->bC2hBtInfoReqSent = true;
247
248 H2C_Parameter[0] |= BIT0; /* trigger */
249
250 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x61, 1, H2C_Parameter);
251}
252
253static void halbtc8723b1ant_MonitorBtCtr(struct btc_coexist *pBtCoexist)
254{
255 u32 regHPTxRx, regLPTxRx, u4Tmp;
256 u32 regHPTx = 0, regHPRx = 0, regLPTx = 0, regLPRx = 0;
257 static u8 NumOfBtCounterChk;
258
259 /* to avoid 0x76e[3] = 1 (WLAN_Act control by PTA) during IPS */
260 /* if (! (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) & 0x8)) */
261
262 if (pCoexSta->bUnderIps) {
263 pCoexSta->highPriorityTx = 65535;
264 pCoexSta->highPriorityRx = 65535;
265 pCoexSta->lowPriorityTx = 65535;
266 pCoexSta->lowPriorityRx = 65535;
267 return;
268 }
269
270 regHPTxRx = 0x770;
271 regLPTxRx = 0x774;
272
273 u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regHPTxRx);
274 regHPTx = u4Tmp & bMaskLWord;
275 regHPRx = (u4Tmp & bMaskHWord) >> 16;
276
277 u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, regLPTxRx);
278 regLPTx = u4Tmp & bMaskLWord;
279 regLPRx = (u4Tmp & bMaskHWord) >> 16;
280
281 pCoexSta->highPriorityTx = regHPTx;
282 pCoexSta->highPriorityRx = regHPRx;
283 pCoexSta->lowPriorityTx = regLPTx;
284 pCoexSta->lowPriorityRx = regLPRx;
285
286 if ((pCoexSta->lowPriorityTx >= 1050) && (!pCoexSta->bC2hBtInquiryPage))
287 pCoexSta->popEventCnt++;
288
289 /* reset counter */
290 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);
291
292 if ((regHPTx == 0) && (regHPRx == 0) && (regLPTx == 0) && (regLPRx == 0)) {
293 NumOfBtCounterChk++;
294 if (NumOfBtCounterChk >= 3) {
295 halbtc8723b1ant_QueryBtInfo(pBtCoexist);
296 NumOfBtCounterChk = 0;
297 }
298 }
299}
300
301
302static void halbtc8723b1ant_MonitorWiFiCtr(struct btc_coexist *pBtCoexist)
303{
304 s32 wifiRssi = 0;
305 bool bWifiBusy = false, bWifiUnderBMode = false;
306 static u8 nCCKLockCounter;
307
308 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
309 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_S4_WIFI_RSSI, &wifiRssi);
310 pBtCoexist->fBtcGet(
311 pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode
312 );
313
314 if (pCoexSta->bUnderIps) {
315 pCoexSta->nCRCOK_CCK = 0;
316 pCoexSta->nCRCOK_11g = 0;
317 pCoexSta->nCRCOK_11n = 0;
318 pCoexSta->nCRCOK_11nAgg = 0;
319
320 pCoexSta->nCRCErr_CCK = 0;
321 pCoexSta->nCRCErr_11g = 0;
322 pCoexSta->nCRCErr_11n = 0;
323 pCoexSta->nCRCErr_11nAgg = 0;
324 } else {
325 pCoexSta->nCRCOK_CCK = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf88);
326 pCoexSta->nCRCOK_11g = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf94);
327 pCoexSta->nCRCOK_11n = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf90);
328 pCoexSta->nCRCOK_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfb8);
329
330 pCoexSta->nCRCErr_CCK = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0xf84);
331 pCoexSta->nCRCErr_11g = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf96);
332 pCoexSta->nCRCErr_11n = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xf92);
333 pCoexSta->nCRCErr_11nAgg = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0xfba);
334 }
335
336
337 /* reset counter */
338 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x1);
339 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0xf16, 0x1, 0x0);
340
341 if (bWifiBusy && (wifiRssi >= 30) && !bWifiUnderBMode) {
342 if (
343 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) ||
344 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY) ||
345 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_SCO_BUSY)
346 ) {
347 if (
348 pCoexSta->nCRCOK_CCK > (
349 pCoexSta->nCRCOK_11g +
350 pCoexSta->nCRCOK_11n +
351 pCoexSta->nCRCOK_11nAgg
352 )
353 ) {
354 if (nCCKLockCounter < 5)
355 nCCKLockCounter++;
356 } else {
357 if (nCCKLockCounter > 0)
358 nCCKLockCounter--;
359 }
360
361 } else {
362 if (nCCKLockCounter > 0)
363 nCCKLockCounter--;
364 }
365 } else {
366 if (nCCKLockCounter > 0)
367 nCCKLockCounter--;
368 }
369
370 if (!pCoexSta->bPreCCKLock) {
371
372 if (nCCKLockCounter >= 5)
373 pCoexSta->bCCKLock = true;
374 else
375 pCoexSta->bCCKLock = false;
376 } else {
377 if (nCCKLockCounter == 0)
378 pCoexSta->bCCKLock = false;
379 else
380 pCoexSta->bCCKLock = true;
381 }
382
383 pCoexSta->bPreCCKLock = pCoexSta->bCCKLock;
384
385
386}
387
388static bool halbtc8723b1ant_IsWifiStatusChanged(struct btc_coexist *pBtCoexist)
389{
390 static bool bPreWifiBusy, bPreUnder4way, bPreBtHsOn;
391 bool bWifiBusy = false, bUnder4way = false, bBtHsOn = false;
392 bool bWifiConnected = false;
393
394 pBtCoexist->fBtcGet(
395 pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected
396 );
397 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
398 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
399 pBtCoexist->fBtcGet(
400 pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way
401 );
402
403 if (bWifiConnected) {
404 if (bWifiBusy != bPreWifiBusy) {
405 bPreWifiBusy = bWifiBusy;
406 return true;
407 }
408
409 if (bUnder4way != bPreUnder4way) {
410 bPreUnder4way = bUnder4way;
411 return true;
412 }
413
414 if (bBtHsOn != bPreBtHsOn) {
415 bPreBtHsOn = bBtHsOn;
416 return true;
417 }
418 }
419
420 return false;
421}
422
423static void halbtc8723b1ant_UpdateBtLinkInfo(struct btc_coexist *pBtCoexist)
424{
425 struct btc_bt_link_info *pBtLinkInfo = &pBtCoexist->btLinkInfo;
426 bool bBtHsOn = false;
427
428 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
429
430 pBtLinkInfo->bBtLinkExist = pCoexSta->bBtLinkExist;
431 pBtLinkInfo->bScoExist = pCoexSta->bScoExist;
432 pBtLinkInfo->bA2dpExist = pCoexSta->bA2dpExist;
433 pBtLinkInfo->bPanExist = pCoexSta->bPanExist;
434 pBtLinkInfo->bHidExist = pCoexSta->bHidExist;
435
436 /* work around for HS mode. */
437 if (bBtHsOn) {
438 pBtLinkInfo->bPanExist = true;
439 pBtLinkInfo->bBtLinkExist = true;
440 }
441
442 /* check if Sco only */
443 if (
444 pBtLinkInfo->bScoExist &&
445 !pBtLinkInfo->bA2dpExist &&
446 !pBtLinkInfo->bPanExist &&
447 !pBtLinkInfo->bHidExist
448 )
449 pBtLinkInfo->bScoOnly = true;
450 else
451 pBtLinkInfo->bScoOnly = false;
452
453 /* check if A2dp only */
454 if (
455 !pBtLinkInfo->bScoExist &&
456 pBtLinkInfo->bA2dpExist &&
457 !pBtLinkInfo->bPanExist &&
458 !pBtLinkInfo->bHidExist
459 )
460 pBtLinkInfo->bA2dpOnly = true;
461 else
462 pBtLinkInfo->bA2dpOnly = false;
463
464 /* check if Pan only */
465 if (
466 !pBtLinkInfo->bScoExist &&
467 !pBtLinkInfo->bA2dpExist &&
468 pBtLinkInfo->bPanExist &&
469 !pBtLinkInfo->bHidExist
470 )
471 pBtLinkInfo->bPanOnly = true;
472 else
473 pBtLinkInfo->bPanOnly = false;
474
475 /* check if Hid only */
476 if (
477 !pBtLinkInfo->bScoExist &&
478 !pBtLinkInfo->bA2dpExist &&
479 !pBtLinkInfo->bPanExist &&
480 pBtLinkInfo->bHidExist
481 )
482 pBtLinkInfo->bHidOnly = true;
483 else
484 pBtLinkInfo->bHidOnly = false;
485}
486
487static u8 halbtc8723b1ant_ActionAlgorithm(struct btc_coexist *pBtCoexist)
488{
489 struct btc_bt_link_info *pBtLinkInfo = &pBtCoexist->btLinkInfo;
490 bool bBtHsOn = false;
491 u8 algorithm = BT_8723B_1ANT_COEX_ALGO_UNDEFINED;
492 u8 numOfDiffProfile = 0;
493
494 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
495
496 if (!pBtLinkInfo->bBtLinkExist)
497 return algorithm;
498
499 if (pBtLinkInfo->bScoExist)
500 numOfDiffProfile++;
501 if (pBtLinkInfo->bHidExist)
502 numOfDiffProfile++;
503 if (pBtLinkInfo->bPanExist)
504 numOfDiffProfile++;
505 if (pBtLinkInfo->bA2dpExist)
506 numOfDiffProfile++;
507
508 if (numOfDiffProfile == 1) {
509 if (pBtLinkInfo->bScoExist) {
510 algorithm = BT_8723B_1ANT_COEX_ALGO_SCO;
511 } else {
512 if (pBtLinkInfo->bHidExist) {
513 algorithm = BT_8723B_1ANT_COEX_ALGO_HID;
514 } else if (pBtLinkInfo->bA2dpExist) {
515 algorithm = BT_8723B_1ANT_COEX_ALGO_A2DP;
516 } else if (pBtLinkInfo->bPanExist) {
517 if (bBtHsOn)
518 algorithm = BT_8723B_1ANT_COEX_ALGO_PANHS;
519 else
520 algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR;
521 }
522 }
523 } else if (numOfDiffProfile == 2) {
524 if (pBtLinkInfo->bScoExist) {
525 if (pBtLinkInfo->bHidExist) {
526 algorithm = BT_8723B_1ANT_COEX_ALGO_HID;
527 } else if (pBtLinkInfo->bA2dpExist) {
528 algorithm = BT_8723B_1ANT_COEX_ALGO_SCO;
529 } else if (pBtLinkInfo->bPanExist) {
530 if (bBtHsOn)
531 algorithm = BT_8723B_1ANT_COEX_ALGO_SCO;
532 else
533 algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;
534 }
535 } else {
536 if (pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist) {
537 algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP;
538 } else if (pBtLinkInfo->bHidExist && pBtLinkInfo->bPanExist) {
539 if (bBtHsOn)
540 algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP;
541 else
542 algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;
543 } else if (pBtLinkInfo->bPanExist && pBtLinkInfo->bA2dpExist) {
544 if (bBtHsOn)
545 algorithm = BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS;
546 else
547 algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP;
548 }
549 }
550 } else if (numOfDiffProfile == 3) {
551 if (pBtLinkInfo->bScoExist) {
552 if (pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist) {
553 algorithm = BT_8723B_1ANT_COEX_ALGO_HID;
554 } else if (
555 pBtLinkInfo->bHidExist && pBtLinkInfo->bPanExist
556 ) {
557 if (bBtHsOn)
558 algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP;
559 else
560 algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;
561 } else if (pBtLinkInfo->bPanExist && pBtLinkInfo->bA2dpExist) {
562 if (bBtHsOn)
563 algorithm = BT_8723B_1ANT_COEX_ALGO_SCO;
564 else
565 algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;
566 }
567 } else {
568 if (
569 pBtLinkInfo->bHidExist &&
570 pBtLinkInfo->bPanExist &&
571 pBtLinkInfo->bA2dpExist
572 ) {
573 if (bBtHsOn)
574 algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP;
575 else
576 algorithm = BT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR;
577 }
578 }
579 } else if (numOfDiffProfile >= 3) {
580 if (pBtLinkInfo->bScoExist) {
581 if (
582 pBtLinkInfo->bHidExist &&
583 pBtLinkInfo->bPanExist &&
584 pBtLinkInfo->bA2dpExist
585 ) {
586 if (!bBtHsOn)
587 algorithm = BT_8723B_1ANT_COEX_ALGO_PANEDR_HID;
588
589 }
590 }
591 }
592
593 return algorithm;
594}
595
596static void halbtc8723b1ant_SetSwPenaltyTxRateAdaptive(
597 struct btc_coexist *pBtCoexist, bool bLowPenaltyRa
598)
599{
600 u8 H2C_Parameter[6] = {0};
601
602 H2C_Parameter[0] = 0x6; /* opCode, 0x6 = Retry_Penalty */
603
604 if (bLowPenaltyRa) {
605 H2C_Parameter[1] |= BIT0;
606 H2C_Parameter[2] = 0x00; /* normal rate except MCS7/6/5, OFDM54/48/36 */
607 H2C_Parameter[3] = 0xf7; /* MCS7 or OFDM54 */
608 H2C_Parameter[4] = 0xf8; /* MCS6 or OFDM48 */
609 H2C_Parameter[5] = 0xf9; /* MCS5 or OFDM36 */
610 }
611
612 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x69, 6, H2C_Parameter);
613}
614
615static void halbtc8723b1ant_LowPenaltyRa(
616 struct btc_coexist *pBtCoexist, bool bForceExec, bool bLowPenaltyRa
617)
618{
619 pCoexDm->bCurLowPenaltyRa = bLowPenaltyRa;
620
621 if (!bForceExec) {
622 if (pCoexDm->bPreLowPenaltyRa == pCoexDm->bCurLowPenaltyRa)
623 return;
624 }
625 halbtc8723b1ant_SetSwPenaltyTxRateAdaptive(
626 pBtCoexist, bLowPenaltyRa: pCoexDm->bCurLowPenaltyRa
627 );
628
629 pCoexDm->bPreLowPenaltyRa = pCoexDm->bCurLowPenaltyRa;
630}
631
632static void halbtc8723b1ant_SetCoexTable(
633 struct btc_coexist *pBtCoexist,
634 u32 val0x6c0,
635 u32 val0x6c4,
636 u32 val0x6c8,
637 u8 val0x6cc
638)
639{
640 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, val0x6c0);
641
642 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, val0x6c4);
643
644 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, val0x6c8);
645
646 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, val0x6cc);
647}
648
649static void halbtc8723b1ant_CoexTable(
650 struct btc_coexist *pBtCoexist,
651 bool bForceExec,
652 u32 val0x6c0,
653 u32 val0x6c4,
654 u32 val0x6c8,
655 u8 val0x6cc
656)
657{
658 pCoexDm->curVal0x6c0 = val0x6c0;
659 pCoexDm->curVal0x6c4 = val0x6c4;
660 pCoexDm->curVal0x6c8 = val0x6c8;
661 pCoexDm->curVal0x6cc = val0x6cc;
662
663 if (!bForceExec) {
664 if (
665 (pCoexDm->preVal0x6c0 == pCoexDm->curVal0x6c0) &&
666 (pCoexDm->preVal0x6c4 == pCoexDm->curVal0x6c4) &&
667 (pCoexDm->preVal0x6c8 == pCoexDm->curVal0x6c8) &&
668 (pCoexDm->preVal0x6cc == pCoexDm->curVal0x6cc)
669 )
670 return;
671 }
672
673 halbtc8723b1ant_SetCoexTable(
674 pBtCoexist, val0x6c0, val0x6c4, val0x6c8, val0x6cc
675 );
676
677 pCoexDm->preVal0x6c0 = pCoexDm->curVal0x6c0;
678 pCoexDm->preVal0x6c4 = pCoexDm->curVal0x6c4;
679 pCoexDm->preVal0x6c8 = pCoexDm->curVal0x6c8;
680 pCoexDm->preVal0x6cc = pCoexDm->curVal0x6cc;
681}
682
683static void halbtc8723b1ant_CoexTableWithType(
684 struct btc_coexist *pBtCoexist, bool bForceExec, u8 type
685)
686{
687 pCoexSta->nCoexTableType = type;
688
689 switch (type) {
690 case 0:
691 halbtc8723b1ant_CoexTable(
692 pBtCoexist, bForceExec, val0x6c0: 0x55555555, val0x6c4: 0x55555555, val0x6c8: 0xffffff, val0x6cc: 0x3
693 );
694 break;
695 case 1:
696 halbtc8723b1ant_CoexTable(
697 pBtCoexist, bForceExec, val0x6c0: 0x55555555, val0x6c4: 0x5a5a5a5a, val0x6c8: 0xffffff, val0x6cc: 0x3
698 );
699 break;
700 case 2:
701 halbtc8723b1ant_CoexTable(
702 pBtCoexist, bForceExec, val0x6c0: 0x5a5a5a5a, val0x6c4: 0x5a5a5a5a, val0x6c8: 0xffffff, val0x6cc: 0x3
703 );
704 break;
705 case 3:
706 halbtc8723b1ant_CoexTable(
707 pBtCoexist, bForceExec, val0x6c0: 0xaaaa5555, val0x6c4: 0xaaaa5a5a, val0x6c8: 0xffffff, val0x6cc: 0x3
708 );
709 break;
710 case 4:
711 halbtc8723b1ant_CoexTable(
712 pBtCoexist, bForceExec, val0x6c0: 0x55555555, val0x6c4: 0xaaaa5a5a, val0x6c8: 0xffffff, val0x6cc: 0x3
713 );
714 break;
715 case 5:
716 halbtc8723b1ant_CoexTable(
717 pBtCoexist, bForceExec, val0x6c0: 0x5a5a5a5a, val0x6c4: 0xaaaa5a5a, val0x6c8: 0xffffff, val0x6cc: 0x3
718 );
719 break;
720 case 6:
721 halbtc8723b1ant_CoexTable(
722 pBtCoexist, bForceExec, val0x6c0: 0x55555555, val0x6c4: 0xaaaaaaaa, val0x6c8: 0xffffff, val0x6cc: 0x3
723 );
724 break;
725 case 7:
726 halbtc8723b1ant_CoexTable(
727 pBtCoexist, bForceExec, val0x6c0: 0xaaaaaaaa, val0x6c4: 0xaaaaaaaa, val0x6c8: 0xffffff, val0x6cc: 0x3
728 );
729 break;
730 default:
731 break;
732 }
733}
734
735static void halbtc8723b1ant_SetFwIgnoreWlanAct(
736 struct btc_coexist *pBtCoexist, bool bEnable
737)
738{
739 u8 H2C_Parameter[1] = {0};
740
741 if (bEnable)
742 H2C_Parameter[0] |= BIT0; /* function enable */
743
744 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x63, 1, H2C_Parameter);
745}
746
747static void halbtc8723b1ant_IgnoreWlanAct(
748 struct btc_coexist *pBtCoexist, bool bForceExec, bool bEnable
749)
750{
751 pCoexDm->bCurIgnoreWlanAct = bEnable;
752
753 if (!bForceExec) {
754 if (pCoexDm->bPreIgnoreWlanAct == pCoexDm->bCurIgnoreWlanAct)
755 return;
756 }
757 halbtc8723b1ant_SetFwIgnoreWlanAct(pBtCoexist, bEnable);
758
759 pCoexDm->bPreIgnoreWlanAct = pCoexDm->bCurIgnoreWlanAct;
760}
761
762static void halbtc8723b1ant_SetLpsRpwm(
763 struct btc_coexist *pBtCoexist, u8 lpsVal, u8 rpwmVal
764)
765{
766 u8 lps = lpsVal;
767 u8 rpwm = rpwmVal;
768
769 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_LPS_VAL, &lps);
770 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
771}
772
773static void halbtc8723b1ant_LpsRpwm(
774 struct btc_coexist *pBtCoexist, bool bForceExec, u8 lpsVal, u8 rpwmVal
775)
776{
777 pCoexDm->curLps = lpsVal;
778 pCoexDm->curRpwm = rpwmVal;
779
780 if (!bForceExec) {
781 if (
782 (pCoexDm->preLps == pCoexDm->curLps) &&
783 (pCoexDm->preRpwm == pCoexDm->curRpwm)
784 ) {
785 return;
786 }
787 }
788 halbtc8723b1ant_SetLpsRpwm(pBtCoexist, lpsVal, rpwmVal);
789
790 pCoexDm->preLps = pCoexDm->curLps;
791 pCoexDm->preRpwm = pCoexDm->curRpwm;
792}
793
794static void halbtc8723b1ant_SwMechanism(
795 struct btc_coexist *pBtCoexist, bool bLowPenaltyRA
796)
797{
798 halbtc8723b1ant_LowPenaltyRa(pBtCoexist, NORMAL_EXEC, bLowPenaltyRa: bLowPenaltyRA);
799}
800
801static void halbtc8723b1ant_SetAntPath(
802 struct btc_coexist *pBtCoexist, u8 antPosType, bool bInitHwCfg, bool bWifiOff
803)
804{
805 struct btc_board_info *pBoardInfo = &pBtCoexist->boardInfo;
806 u32 fwVer = 0, u4Tmp = 0, cntBtCalChk = 0;
807 bool bPgExtSwitch = false;
808 bool bUseExtSwitch = false;
809 bool bIsInMpMode = false;
810 u8 H2C_Parameter[2] = {0}, u1Tmp = 0;
811
812 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_EXT_SWITCH, &bPgExtSwitch);
813 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer); /* [31:16]=fw ver, [15:0]=fw sub ver */
814
815 if ((fwVer > 0 && fwVer < 0xc0000) || bPgExtSwitch)
816 bUseExtSwitch = true;
817
818 if (bInitHwCfg) {
819 pBtCoexist->fBtcSetRfReg(pBtCoexist, BTC_RF_A, 0x1, 0xfffff, 0x780); /* WiFi TRx Mask on */
820 pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15); /* BT TRx Mask on */
821
822 if (fwVer >= 0x180000) {
823 /* Use H2C to set GNT_BT to HIGH */
824 H2C_Parameter[0] = 1;
825 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);
826 } else /* set grant_bt to high */
827 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);
828
829 /* set wlan_act control by PTA */
830 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
831
832 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); /* BT select s0/s1 is controlled by WiFi */
833
834 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x39, 0x8, 0x1);
835 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x974, 0xff);
836 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x944, 0x3, 0x3);
837 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x930, 0x77);
838 } else if (bWifiOff) {
839 if (fwVer >= 0x180000) {
840 /* Use H2C to set GNT_BT to HIGH */
841 H2C_Parameter[0] = 1;
842 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);
843 } else /* set grant_bt to high */
844 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);
845
846 /* set wlan_act to always low */
847 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
848
849 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_IS_IN_MP_MODE, &bIsInMpMode);
850 if (!bIsInMpMode)
851 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x0); /* BT select s0/s1 is controlled by BT */
852 else
853 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x67, 0x20, 0x1); /* BT select s0/s1 is controlled by WiFi */
854
855 /* 0x4c[24:23]= 00, Set Antenna control by BT_RFE_CTRL BT Vendor 0xac = 0xf002 */
856 u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);
857 u4Tmp &= ~BIT23;
858 u4Tmp &= ~BIT24;
859 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
860 } else {
861 /* Use H2C to set GNT_BT to LOW */
862 if (fwVer >= 0x180000) {
863 if (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765) != 0) {
864 H2C_Parameter[0] = 0;
865 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x6E, 1, H2C_Parameter);
866 }
867 } else {
868 /* BT calibration check */
869 while (cntBtCalChk <= 20) {
870 u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x49d);
871 cntBtCalChk++;
872
873 if (u1Tmp & BIT0)
874 mdelay(50);
875 else
876 break;
877 }
878
879 /* set grant_bt to PTA */
880 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x0);
881 }
882
883 if (pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x76e) != 0xc)
884 /* set wlan_act control by PTA */
885 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc);
886 }
887
888 if (bUseExtSwitch) {
889 if (bInitHwCfg) {
890 /* 0x4c[23]= 0, 0x4c[24]= 1 Antenna control by WL/BT */
891 u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);
892 u4Tmp &= ~BIT23;
893 u4Tmp |= BIT24;
894 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
895
896 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0); /* fixed internal switch S1->WiFi, S0->BT */
897
898 if (pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) {
899 /* tell firmware "no antenna inverse" */
900 H2C_Parameter[0] = 0;
901 H2C_Parameter[1] = 1; /* ext switch type */
902 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);
903 } else {
904 /* tell firmware "antenna inverse" */
905 H2C_Parameter[0] = 1;
906 H2C_Parameter[1] = 1; /* ext switch type */
907 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);
908 }
909 }
910
911
912 /* ext switch setting */
913 switch (antPosType) {
914 case BTC_ANT_PATH_WIFI:
915 if (pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
916 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);
917 else
918 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2);
919 break;
920 case BTC_ANT_PATH_BT:
921 if (pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
922 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2);
923 else
924 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);
925 break;
926 default:
927 case BTC_ANT_PATH_PTA:
928 if (pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
929 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x1);
930 else
931 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x92c, 0x3, 0x2);
932 break;
933 }
934
935 } else {
936 if (bInitHwCfg) {
937 /* 0x4c[23]= 1, 0x4c[24]= 0 Antenna control by 0x64 */
938 u4Tmp = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x4c);
939 u4Tmp |= BIT23;
940 u4Tmp &= ~BIT24;
941 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x4c, u4Tmp);
942
943 /* Fix Ext switch Main->S1, Aux->S0 */
944 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x64, 0x1, 0x0);
945
946 if (pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT) {
947
948 /* tell firmware "no antenna inverse" */
949 H2C_Parameter[0] = 0;
950 H2C_Parameter[1] = 0; /* internal switch type */
951 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);
952 } else {
953
954 /* tell firmware "antenna inverse" */
955 H2C_Parameter[0] = 1;
956 H2C_Parameter[1] = 0; /* internal switch type */
957 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x65, 2, H2C_Parameter);
958 }
959 }
960
961
962 /* internal switch setting */
963 switch (antPosType) {
964 case BTC_ANT_PATH_WIFI:
965 if (pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
966 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
967 else
968 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);
969 break;
970 case BTC_ANT_PATH_BT:
971 if (pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
972 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);
973 else
974 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
975 break;
976 default:
977 case BTC_ANT_PATH_PTA:
978 if (pBoardInfo->btdmAntPos == BTC_ANTENNA_AT_MAIN_PORT)
979 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x200);
980 else
981 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x80);
982 break;
983 }
984 }
985}
986
987static void halbtc8723b1ant_SetFwPstdma(
988 struct btc_coexist *pBtCoexist, u8 byte1, u8 byte2, u8 byte3, u8 byte4, u8 byte5
989)
990{
991 u8 H2C_Parameter[5] = {0};
992 u8 realByte1 = byte1, realByte5 = byte5;
993 bool bApEnable = false;
994
995 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);
996
997 if (bApEnable) {
998 if (byte1 & BIT4 && !(byte1 & BIT5)) {
999 realByte1 &= ~BIT4;
1000 realByte1 |= BIT5;
1001
1002 realByte5 |= BIT5;
1003 realByte5 &= ~BIT6;
1004 }
1005 }
1006
1007 H2C_Parameter[0] = realByte1;
1008 H2C_Parameter[1] = byte2;
1009 H2C_Parameter[2] = byte3;
1010 H2C_Parameter[3] = byte4;
1011 H2C_Parameter[4] = realByte5;
1012
1013 pCoexDm->psTdmaPara[0] = realByte1;
1014 pCoexDm->psTdmaPara[1] = byte2;
1015 pCoexDm->psTdmaPara[2] = byte3;
1016 pCoexDm->psTdmaPara[3] = byte4;
1017 pCoexDm->psTdmaPara[4] = realByte5;
1018
1019 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x60, 5, H2C_Parameter);
1020}
1021
1022
1023static void halbtc8723b1ant_PsTdma(
1024 struct btc_coexist *pBtCoexist, bool bForceExec, bool bTurnOn, u8 type
1025)
1026{
1027 struct btc_bt_link_info *pBtLinkInfo = &pBtCoexist->btLinkInfo;
1028 bool bWifiBusy = false;
1029 u8 rssiAdjustVal = 0;
1030 u8 psTdmaByte4Val = 0x50, psTdmaByte0Val = 0x51, psTdmaByte3Val = 0x10;
1031 s8 nWiFiDurationAdjust = 0x0;
1032 /* u32 fwVer = 0; */
1033
1034 pCoexDm->bCurPsTdmaOn = bTurnOn;
1035 pCoexDm->curPsTdma = type;
1036
1037 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
1038
1039 if (!bForceExec) {
1040 if (
1041 (pCoexDm->bPrePsTdmaOn == pCoexDm->bCurPsTdmaOn) &&
1042 (pCoexDm->prePsTdma == pCoexDm->curPsTdma)
1043 )
1044 return;
1045 }
1046
1047 if (pCoexSta->nScanAPNum <= 5)
1048 nWiFiDurationAdjust = 5;
1049 else if (pCoexSta->nScanAPNum >= 40)
1050 nWiFiDurationAdjust = -15;
1051 else if (pCoexSta->nScanAPNum >= 20)
1052 nWiFiDurationAdjust = -10;
1053
1054 if (!pCoexSta->bForceLpsOn) { /* only for A2DP-only case 1/2/9/11 */
1055 psTdmaByte0Val = 0x61; /* no null-pkt */
1056 psTdmaByte3Val = 0x11; /* no tx-pause at BT-slot */
1057 psTdmaByte4Val = 0x10; /* 0x778 = d/1 toggle */
1058 }
1059
1060
1061 if (bTurnOn) {
1062 if (pBtLinkInfo->bSlaveRole)
1063 psTdmaByte4Val = psTdmaByte4Val | 0x1; /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
1064
1065
1066 switch (type) {
1067 default:
1068 halbtc8723b1ant_SetFwPstdma(
1069 pBtCoexist, byte1: 0x51, byte2: 0x1a, byte3: 0x1a, byte4: 0x0, byte5: psTdmaByte4Val
1070 );
1071 break;
1072 case 1:
1073 halbtc8723b1ant_SetFwPstdma(
1074 pBtCoexist,
1075 byte1: psTdmaByte0Val,
1076 byte2: 0x3a + nWiFiDurationAdjust,
1077 byte3: 0x03,
1078 byte4: psTdmaByte3Val,
1079 byte5: psTdmaByte4Val
1080 );
1081 break;
1082 case 2:
1083 halbtc8723b1ant_SetFwPstdma(
1084 pBtCoexist,
1085 byte1: psTdmaByte0Val,
1086 byte2: 0x2d + nWiFiDurationAdjust,
1087 byte3: 0x03,
1088 byte4: psTdmaByte3Val,
1089 byte5: psTdmaByte4Val
1090 );
1091 break;
1092 case 3:
1093 halbtc8723b1ant_SetFwPstdma(
1094 pBtCoexist, byte1: 0x51, byte2: 0x1d, byte3: 0x1d, byte4: 0x0, byte5: 0x10
1095 );
1096 break;
1097 case 4:
1098 halbtc8723b1ant_SetFwPstdma(
1099 pBtCoexist, byte1: 0x93, byte2: 0x15, byte3: 0x3, byte4: 0x14, byte5: 0x0
1100 );
1101 break;
1102 case 5:
1103 halbtc8723b1ant_SetFwPstdma(
1104 pBtCoexist, byte1: 0x61, byte2: 0x15, byte3: 0x3, byte4: 0x11, byte5: 0x10
1105 );
1106 break;
1107 case 6:
1108 halbtc8723b1ant_SetFwPstdma(
1109 pBtCoexist, byte1: 0x61, byte2: 0x20, byte3: 0x3, byte4: 0x11, byte5: 0x11
1110 );
1111 break;
1112 case 7:
1113 halbtc8723b1ant_SetFwPstdma(pBtCoexist, byte1: 0x13, byte2: 0xc, byte3: 0x5, byte4: 0x0, byte5: 0x0);
1114 break;
1115 case 8:
1116 halbtc8723b1ant_SetFwPstdma(
1117 pBtCoexist, byte1: 0x93, byte2: 0x25, byte3: 0x3, byte4: 0x10, byte5: 0x0
1118 );
1119 break;
1120 case 9:
1121 halbtc8723b1ant_SetFwPstdma(
1122 pBtCoexist,
1123 byte1: psTdmaByte0Val,
1124 byte2: 0x21,
1125 byte3: 0x3,
1126 byte4: psTdmaByte3Val,
1127 byte5: psTdmaByte4Val
1128 );
1129 break;
1130 case 10:
1131 halbtc8723b1ant_SetFwPstdma(pBtCoexist, byte1: 0x13, byte2: 0xa, byte3: 0xa, byte4: 0x0, byte5: 0x40);
1132 break;
1133 case 11:
1134 halbtc8723b1ant_SetFwPstdma(
1135 pBtCoexist,
1136 byte1: psTdmaByte0Val,
1137 byte2: 0x21,
1138 byte3: 0x03,
1139 byte4: psTdmaByte3Val,
1140 byte5: psTdmaByte4Val
1141 );
1142 break;
1143 case 12:
1144 halbtc8723b1ant_SetFwPstdma(
1145 pBtCoexist, byte1: 0x51, byte2: 0x0a, byte3: 0x0a, byte4: 0x0, byte5: 0x50
1146 );
1147 break;
1148 case 13:
1149 halbtc8723b1ant_SetFwPstdma(
1150 pBtCoexist, byte1: 0x51, byte2: 0x12, byte3: 0x12, byte4: 0x0, byte5: 0x10
1151 );
1152 break;
1153 case 14:
1154 halbtc8723b1ant_SetFwPstdma(
1155 pBtCoexist, byte1: 0x51, byte2: 0x21, byte3: 0x3, byte4: 0x10, byte5: psTdmaByte4Val
1156 );
1157 break;
1158 case 15:
1159 halbtc8723b1ant_SetFwPstdma(
1160 pBtCoexist, byte1: 0x13, byte2: 0xa, byte3: 0x3, byte4: 0x8, byte5: 0x0
1161 );
1162 break;
1163 case 16:
1164 halbtc8723b1ant_SetFwPstdma(
1165 pBtCoexist, byte1: 0x93, byte2: 0x15, byte3: 0x3, byte4: 0x10, byte5: 0x0
1166 );
1167 break;
1168 case 18:
1169 halbtc8723b1ant_SetFwPstdma(
1170 pBtCoexist, byte1: 0x93, byte2: 0x25, byte3: 0x3, byte4: 0x10, byte5: 0x0
1171 );
1172 break;
1173 case 20:
1174 halbtc8723b1ant_SetFwPstdma(
1175 pBtCoexist, byte1: 0x61, byte2: 0x3f, byte3: 0x03, byte4: 0x11, byte5: 0x10
1176
1177 );
1178 break;
1179 case 21:
1180 halbtc8723b1ant_SetFwPstdma(
1181 pBtCoexist, byte1: 0x61, byte2: 0x25, byte3: 0x03, byte4: 0x11, byte5: 0x11
1182 );
1183 break;
1184 case 22:
1185 halbtc8723b1ant_SetFwPstdma(
1186 pBtCoexist, byte1: 0x61, byte2: 0x25, byte3: 0x03, byte4: 0x11, byte5: 0x10
1187 );
1188 break;
1189 case 23:
1190 halbtc8723b1ant_SetFwPstdma(
1191 pBtCoexist, byte1: 0xe3, byte2: 0x25, byte3: 0x3, byte4: 0x31, byte5: 0x18
1192 );
1193 break;
1194 case 24:
1195 halbtc8723b1ant_SetFwPstdma(
1196 pBtCoexist, byte1: 0xe3, byte2: 0x15, byte3: 0x3, byte4: 0x31, byte5: 0x18
1197 );
1198 break;
1199 case 25:
1200 halbtc8723b1ant_SetFwPstdma(
1201 pBtCoexist, byte1: 0xe3, byte2: 0xa, byte3: 0x3, byte4: 0x31, byte5: 0x18
1202 );
1203 break;
1204 case 26:
1205 halbtc8723b1ant_SetFwPstdma(
1206 pBtCoexist, byte1: 0xe3, byte2: 0xa, byte3: 0x3, byte4: 0x31, byte5: 0x18
1207 );
1208 break;
1209 case 27:
1210 halbtc8723b1ant_SetFwPstdma(
1211 pBtCoexist, byte1: 0xe3, byte2: 0x25, byte3: 0x3, byte4: 0x31, byte5: 0x98
1212 );
1213 break;
1214 case 28:
1215 halbtc8723b1ant_SetFwPstdma(
1216 pBtCoexist, byte1: 0x69, byte2: 0x25, byte3: 0x3, byte4: 0x31, byte5: 0x0
1217 );
1218 break;
1219 case 29:
1220 halbtc8723b1ant_SetFwPstdma(
1221 pBtCoexist, byte1: 0xab, byte2: 0x1a, byte3: 0x1a, byte4: 0x1, byte5: 0x10
1222 );
1223 break;
1224 case 30:
1225 halbtc8723b1ant_SetFwPstdma(
1226 pBtCoexist, byte1: 0x51, byte2: 0x30, byte3: 0x3, byte4: 0x10, byte5: 0x10
1227 );
1228 break;
1229 case 31:
1230 halbtc8723b1ant_SetFwPstdma(
1231 pBtCoexist, byte1: 0xd3, byte2: 0x1a, byte3: 0x1a, byte4: 0x0, byte5: 0x58
1232 );
1233 break;
1234 case 32:
1235 halbtc8723b1ant_SetFwPstdma(
1236 pBtCoexist, byte1: 0x61, byte2: 0x35, byte3: 0x3, byte4: 0x11, byte5: 0x11
1237 );
1238 break;
1239 case 33:
1240 halbtc8723b1ant_SetFwPstdma(
1241 pBtCoexist, byte1: 0xa3, byte2: 0x25, byte3: 0x3, byte4: 0x30, byte5: 0x90
1242 );
1243 break;
1244 case 34:
1245 halbtc8723b1ant_SetFwPstdma(
1246 pBtCoexist, byte1: 0x53, byte2: 0x1a, byte3: 0x1a, byte4: 0x0, byte5: 0x10
1247 );
1248 break;
1249 case 35:
1250 halbtc8723b1ant_SetFwPstdma(
1251 pBtCoexist, byte1: 0x63, byte2: 0x1a, byte3: 0x1a, byte4: 0x0, byte5: 0x10
1252 );
1253 break;
1254 case 36:
1255 halbtc8723b1ant_SetFwPstdma(
1256 pBtCoexist, byte1: 0xd3, byte2: 0x12, byte3: 0x3, byte4: 0x14, byte5: 0x50
1257 );
1258 break;
1259 case 40: /* SoftAP only with no sta associated, BT disable , TDMA mode for power saving */
1260 /* here softap mode screen off will cost 70-80mA for phone */
1261 halbtc8723b1ant_SetFwPstdma(
1262 pBtCoexist, byte1: 0x23, byte2: 0x18, byte3: 0x00, byte4: 0x10, byte5: 0x24
1263 );
1264 break;
1265 }
1266 } else {
1267
1268 /* disable PS tdma */
1269 switch (type) {
1270 case 8: /* PTA Control */
1271 halbtc8723b1ant_SetFwPstdma(pBtCoexist, byte1: 0x8, byte2: 0x0, byte3: 0x0, byte4: 0x0, byte5: 0x0);
1272 halbtc8723b1ant_SetAntPath(
1273 pBtCoexist, BTC_ANT_PATH_PTA, bInitHwCfg: false, bWifiOff: false
1274 );
1275 break;
1276 case 0:
1277 default: /* Software control, Antenna at BT side */
1278 halbtc8723b1ant_SetFwPstdma(pBtCoexist, byte1: 0x0, byte2: 0x0, byte3: 0x0, byte4: 0x0, byte5: 0x0);
1279 halbtc8723b1ant_SetAntPath(
1280 pBtCoexist, BTC_ANT_PATH_BT, bInitHwCfg: false, bWifiOff: false
1281 );
1282 break;
1283 case 9: /* Software control, Antenna at WiFi side */
1284 halbtc8723b1ant_SetFwPstdma(pBtCoexist, byte1: 0x0, byte2: 0x0, byte3: 0x0, byte4: 0x0, byte5: 0x0);
1285 halbtc8723b1ant_SetAntPath(
1286 pBtCoexist, BTC_ANT_PATH_WIFI, bInitHwCfg: false, bWifiOff: false
1287 );
1288 break;
1289 }
1290 }
1291
1292 rssiAdjustVal = 0;
1293 pBtCoexist->fBtcSet(
1294 pBtCoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE, &rssiAdjustVal
1295 );
1296
1297 /* update pre state */
1298 pCoexDm->bPrePsTdmaOn = pCoexDm->bCurPsTdmaOn;
1299 pCoexDm->prePsTdma = pCoexDm->curPsTdma;
1300}
1301
1302static bool halbtc8723b1ant_IsCommonAction(struct btc_coexist *pBtCoexist)
1303{
1304 bool bCommon = false, bWifiConnected = false, bWifiBusy = false;
1305
1306 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
1307 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
1308
1309 if (
1310 !bWifiConnected &&
1311 pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE
1312 ) {
1313 /* halbtc8723b1ant_SwMechanism(pBtCoexist, false); */
1314
1315 bCommon = true;
1316 } else if (
1317 bWifiConnected &&
1318 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE)
1319 ) {
1320 /* halbtc8723b1ant_SwMechanism(pBtCoexist, false); */
1321
1322 bCommon = true;
1323 } else if (
1324 !bWifiConnected &&
1325 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE)
1326 ) {
1327 /* halbtc8723b1ant_SwMechanism(pBtCoexist, false); */
1328
1329 bCommon = true;
1330 } else if (
1331 bWifiConnected &&
1332 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE)
1333 ) {
1334 /* halbtc8723b1ant_SwMechanism(pBtCoexist, false); */
1335
1336 bCommon = true;
1337 } else if (
1338 !bWifiConnected &&
1339 (pCoexDm->btStatus != BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE)
1340 ) {
1341 /* halbtc8723b1ant_SwMechanism(pBtCoexist, false); */
1342
1343 bCommon = true;
1344 } else {
1345 bCommon = false;
1346 }
1347
1348 return bCommon;
1349}
1350
1351
1352static void halbtc8723b1ant_TdmaDurationAdjustForAcl(
1353 struct btc_coexist *pBtCoexist, u8 wifiStatus
1354)
1355{
1356 static s32 up, dn, m, n, WaitCount;
1357 s32 result; /* 0: no change, +1: increase WiFi duration, -1: decrease WiFi duration */
1358 u8 retryCount = 0, btInfoExt;
1359
1360 if (
1361 (wifiStatus == BT_8723B_1ANT_WIFI_STATUS_NON_CONNECTED_ASSO_AUTH_SCAN) ||
1362 (wifiStatus == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN) ||
1363 (wifiStatus == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SPECIAL_PKT)
1364 ) {
1365 if (
1366 pCoexDm->curPsTdma != 1 &&
1367 pCoexDm->curPsTdma != 2 &&
1368 pCoexDm->curPsTdma != 3 &&
1369 pCoexDm->curPsTdma != 9
1370 ) {
1371 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 9);
1372 pCoexDm->psTdmaDuAdjType = 9;
1373
1374 up = 0;
1375 dn = 0;
1376 m = 1;
1377 n = 3;
1378 result = 0;
1379 WaitCount = 0;
1380 }
1381 return;
1382 }
1383
1384 if (!pCoexDm->bAutoTdmaAdjust) {
1385 pCoexDm->bAutoTdmaAdjust = true;
1386
1387 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 2);
1388 pCoexDm->psTdmaDuAdjType = 2;
1389 /* */
1390 up = 0;
1391 dn = 0;
1392 m = 1;
1393 n = 3;
1394 result = 0;
1395 WaitCount = 0;
1396 } else {
1397 /* acquire the BT TRx retry count from BT_Info byte2 */
1398 retryCount = pCoexSta->btRetryCnt;
1399 btInfoExt = pCoexSta->btInfoExt;
1400
1401 if (pCoexSta->lowPriorityTx > 1050 || pCoexSta->lowPriorityRx > 1250)
1402 retryCount++;
1403
1404 result = 0;
1405 WaitCount++;
1406
1407 if (retryCount == 0) { /* no retry in the last 2-second duration */
1408 up++;
1409 dn--;
1410
1411 if (dn <= 0)
1412 dn = 0;
1413
1414 if (up >= n) { /* if 連續 n 個2秒 retry count為0, 則調寬WiFi duration */
1415 WaitCount = 0;
1416 n = 3;
1417 up = 0;
1418 dn = 0;
1419 result = 1;
1420 }
1421 } else if (retryCount <= 3) { /* <=3 retry in the last 2-second duration */
1422 up--;
1423 dn++;
1424
1425 if (up <= 0)
1426 up = 0;
1427
1428 if (dn == 2) { /* if 連續 2 個2秒 retry count< 3, 則調窄WiFi duration */
1429 if (WaitCount <= 2)
1430 m++; /* 避免一直在兩個level中來回 */
1431 else
1432 m = 1;
1433
1434 if (m >= 20) /* m 最大值 = 20 ' 最大120秒 recheck是否調整 WiFi duration. */
1435 m = 20;
1436
1437 n = 3 * m;
1438 up = 0;
1439 dn = 0;
1440 WaitCount = 0;
1441 result = -1;
1442 }
1443 } else { /* retry count > 3, 只要1次 retry count > 3, 則調窄WiFi duration */
1444 if (WaitCount == 1)
1445 m++; /* 避免一直在兩個level中來回 */
1446 else
1447 m = 1;
1448
1449 if (m >= 20) /* m 最大值 = 20 ' 最大120秒 recheck是否調整 WiFi duration. */
1450 m = 20;
1451
1452 n = 3 * m;
1453 up = 0;
1454 dn = 0;
1455 WaitCount = 0;
1456 result = -1;
1457 }
1458
1459 if (result == -1) {
1460 if (
1461 BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(btInfoExt) &&
1462 ((pCoexDm->curPsTdma == 1) || (pCoexDm->curPsTdma == 2))
1463 ) {
1464 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 9);
1465 pCoexDm->psTdmaDuAdjType = 9;
1466 } else if (pCoexDm->curPsTdma == 1) {
1467 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 2);
1468 pCoexDm->psTdmaDuAdjType = 2;
1469 } else if (pCoexDm->curPsTdma == 2) {
1470 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 9);
1471 pCoexDm->psTdmaDuAdjType = 9;
1472 } else if (pCoexDm->curPsTdma == 9) {
1473 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 11);
1474 pCoexDm->psTdmaDuAdjType = 11;
1475 }
1476 } else if (result == 1) {
1477 if (
1478 BT_INFO_8723B_1ANT_A2DP_BASIC_RATE(btInfoExt) &&
1479 ((pCoexDm->curPsTdma == 1) || (pCoexDm->curPsTdma == 2))
1480 ) {
1481 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 9);
1482 pCoexDm->psTdmaDuAdjType = 9;
1483 } else if (pCoexDm->curPsTdma == 11) {
1484 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 9);
1485 pCoexDm->psTdmaDuAdjType = 9;
1486 } else if (pCoexDm->curPsTdma == 9) {
1487 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 2);
1488 pCoexDm->psTdmaDuAdjType = 2;
1489 } else if (pCoexDm->curPsTdma == 2) {
1490 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 1);
1491 pCoexDm->psTdmaDuAdjType = 1;
1492 }
1493 }
1494
1495 if (
1496 pCoexDm->curPsTdma != 1 &&
1497 pCoexDm->curPsTdma != 2 &&
1498 pCoexDm->curPsTdma != 9 &&
1499 pCoexDm->curPsTdma != 11
1500 ) /* recover to previous adjust type */
1501 halbtc8723b1ant_PsTdma(
1502 pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: pCoexDm->psTdmaDuAdjType
1503 );
1504 }
1505}
1506
1507static void halbtc8723b1ant_PsTdmaCheckForPowerSaveState(
1508 struct btc_coexist *pBtCoexist, bool bNewPsState
1509)
1510{
1511 u8 lpsMode = 0x0;
1512
1513 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_LPS_MODE, &lpsMode);
1514
1515 if (lpsMode) { /* already under LPS state */
1516 if (bNewPsState) {
1517 /* keep state under LPS, do nothing. */
1518 } else /* will leave LPS state, turn off psTdma first */
1519 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: false, type: 0);
1520 } else { /* NO PS state */
1521 if (bNewPsState) /* will enter LPS state, turn off psTdma first */
1522 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: false, type: 0);
1523 else {
1524 /* keep state under NO PS state, do nothing. */
1525 }
1526 }
1527}
1528
1529static void halbtc8723b1ant_PowerSaveState(
1530 struct btc_coexist *pBtCoexist, u8 psType, u8 lpsVal, u8 rpwmVal
1531)
1532{
1533 bool bLowPwrDisable = false;
1534
1535 switch (psType) {
1536 case BTC_PS_WIFI_NATIVE:
1537 /* recover to original 32k low power setting */
1538 bLowPwrDisable = false;
1539 pBtCoexist->fBtcSet(
1540 pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable
1541 );
1542 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_NORMAL_LPS, NULL);
1543 pCoexSta->bForceLpsOn = false;
1544 break;
1545 case BTC_PS_LPS_ON:
1546 halbtc8723b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, bNewPsState: true);
1547 halbtc8723b1ant_LpsRpwm(pBtCoexist, NORMAL_EXEC, lpsVal, rpwmVal);
1548 /* when coex force to enter LPS, do not enter 32k low power. */
1549 bLowPwrDisable = true;
1550 pBtCoexist->fBtcSet(
1551 pBtCoexist, BTC_SET_ACT_DISABLE_LOW_POWER, &bLowPwrDisable
1552 );
1553 /* power save must executed before psTdma. */
1554 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_ENTER_LPS, NULL);
1555 pCoexSta->bForceLpsOn = true;
1556 break;
1557 case BTC_PS_LPS_OFF:
1558 halbtc8723b1ant_PsTdmaCheckForPowerSaveState(pBtCoexist, bNewPsState: false);
1559 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_ACT_LEAVE_LPS, NULL);
1560 pCoexSta->bForceLpsOn = false;
1561 break;
1562 default:
1563 break;
1564 }
1565}
1566
1567/* */
1568/* */
1569/* Software Coex Mechanism start */
1570/* */
1571/* */
1572
1573/* */
1574/* */
1575/* Non-Software Coex Mechanism start */
1576/* */
1577/* */
1578static void halbtc8723b1ant_ActionWifiMultiPort(struct btc_coexist *pBtCoexist)
1579{
1580 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0);
1581
1582 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: false, type: 8);
1583 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 2);
1584}
1585
1586static void halbtc8723b1ant_ActionHs(struct btc_coexist *pBtCoexist)
1587{
1588 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 5);
1589 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 2);
1590}
1591
1592static void halbtc8723b1ant_ActionBtInquiry(struct btc_coexist *pBtCoexist)
1593{
1594 struct btc_bt_link_info *pBtLinkInfo = &pBtCoexist->btLinkInfo;
1595 bool bWifiConnected = false;
1596 bool bApEnable = false;
1597 bool bWifiBusy = false;
1598 bool bBtBusy = false;
1599
1600 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);
1601 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
1602 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
1603 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);
1604
1605 if (!bWifiConnected && !pCoexSta->bWiFiIsHighPriTask) {
1606 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0);
1607 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: false, type: 8);
1608
1609 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 0);
1610 } else if (
1611 pBtLinkInfo->bScoExist ||
1612 pBtLinkInfo->bHidExist ||
1613 pBtLinkInfo->bA2dpExist
1614 ) {
1615 /* SCO/HID/A2DP busy */
1616 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0);
1617 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 32);
1618
1619 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1620 } else if (pBtLinkInfo->bPanExist || bWifiBusy) {
1621 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0);
1622 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 20);
1623
1624 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1625 } else {
1626 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0);
1627 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: false, type: 8);
1628
1629 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 7);
1630 }
1631}
1632
1633static void halbtc8723b1ant_ActionBtScoHidOnlyBusy(
1634 struct btc_coexist *pBtCoexist, u8 wifiStatus
1635)
1636{
1637 struct btc_bt_link_info *pBtLinkInfo = &pBtCoexist->btLinkInfo;
1638 bool bWifiConnected = false;
1639
1640 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
1641
1642 /* tdma and coex table */
1643
1644 if (pBtLinkInfo->bScoExist) {
1645 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 5);
1646 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 5);
1647 } else { /* HID */
1648 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 6);
1649 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 5);
1650 }
1651}
1652
1653static void halbtc8723b1ant_ActionWifiConnectedBtAclBusy(
1654 struct btc_coexist *pBtCoexist, u8 wifiStatus
1655)
1656{
1657 struct btc_bt_link_info *pBtLinkInfo = &pBtCoexist->btLinkInfo;
1658
1659 halbtc8723b1ant_BtRssiState(levelNum: 2, rssiThresh: 28, rssiThresh1: 0);
1660
1661 if ((pCoexSta->lowPriorityRx >= 1000) && (pCoexSta->lowPriorityRx != 65535))
1662 pBtLinkInfo->bSlaveRole = true;
1663 else
1664 pBtLinkInfo->bSlaveRole = false;
1665
1666 if (pBtLinkInfo->bHidOnly) { /* HID */
1667 halbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist, wifiStatus);
1668 pCoexDm->bAutoTdmaAdjust = false;
1669 return;
1670 } else if (pBtLinkInfo->bA2dpOnly) { /* A2DP */
1671 if (wifiStatus == BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE) {
1672 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 32);
1673 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1674 pCoexDm->bAutoTdmaAdjust = false;
1675 } else {
1676 halbtc8723b1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus);
1677 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1678 pCoexDm->bAutoTdmaAdjust = true;
1679 }
1680 } else if (pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist) { /* HID+A2DP */
1681 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 14);
1682 pCoexDm->bAutoTdmaAdjust = false;
1683
1684 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1685 } else if (
1686 pBtLinkInfo->bPanOnly ||
1687 (pBtLinkInfo->bHidExist && pBtLinkInfo->bPanExist)
1688 ) { /* PAN(OPP, FTP), HID+PAN(OPP, FTP) */
1689 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 3);
1690 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1691 pCoexDm->bAutoTdmaAdjust = false;
1692 } else if (
1693 (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist) ||
1694 (pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist)
1695 ) { /* A2DP+PAN(OPP, FTP), HID+A2DP+PAN(OPP, FTP) */
1696 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 13);
1697 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1698 pCoexDm->bAutoTdmaAdjust = false;
1699 } else {
1700 /* BT no-profile busy (0x9) */
1701 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 32);
1702 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1703 pCoexDm->bAutoTdmaAdjust = false;
1704 }
1705}
1706
1707static void halbtc8723b1ant_ActionWifiNotConnected(struct btc_coexist *pBtCoexist)
1708{
1709 /* power save state */
1710 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0);
1711
1712 /* tdma and coex table */
1713 halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, bTurnOn: false, type: 8);
1714 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 0);
1715}
1716
1717static void halbtc8723b1ant_ActionWifiNotConnectedScan(
1718 struct btc_coexist *pBtCoexist
1719)
1720{
1721 struct btc_bt_link_info *pBtLinkInfo = &pBtCoexist->btLinkInfo;
1722
1723 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0);
1724
1725 /* tdma and coex table */
1726 if (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
1727 if (pBtLinkInfo->bA2dpExist) {
1728 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 32);
1729 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1730 } else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist) {
1731 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 22);
1732 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1733 } else {
1734 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 20);
1735 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1736 }
1737 } else if (
1738 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_SCO_BUSY) ||
1739 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY)
1740 ) {
1741 halbtc8723b1ant_ActionBtScoHidOnlyBusy(
1742 pBtCoexist, wifiStatus: BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN
1743 );
1744 } else {
1745 /* Bryant Add */
1746 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: false, type: 8);
1747 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 2);
1748 }
1749}
1750
1751static void halbtc8723b1ant_ActionWifiNotConnectedAssoAuth(
1752 struct btc_coexist *pBtCoexist
1753)
1754{
1755 struct btc_bt_link_info *pBtLinkInfo = &pBtCoexist->btLinkInfo;
1756
1757 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0);
1758
1759 /* tdma and coex table */
1760 if (
1761 (pBtLinkInfo->bScoExist) ||
1762 (pBtLinkInfo->bHidExist) ||
1763 (pBtLinkInfo->bA2dpExist)
1764 ) {
1765 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 32);
1766 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1767 } else if (pBtLinkInfo->bPanExist) {
1768 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 20);
1769 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1770 } else {
1771 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: false, type: 8);
1772 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 2);
1773 }
1774}
1775
1776static void halbtc8723b1ant_ActionWifiConnectedScan(struct btc_coexist *pBtCoexist)
1777{
1778 struct btc_bt_link_info *pBtLinkInfo = &pBtCoexist->btLinkInfo;
1779
1780 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0);
1781
1782 /* tdma and coex table */
1783 if (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
1784 if (pBtLinkInfo->bA2dpExist) {
1785 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 32);
1786 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1787 } else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist) {
1788 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 22);
1789 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1790 } else {
1791 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 20);
1792 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1793 }
1794 } else if (
1795 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_SCO_BUSY) ||
1796 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY)
1797 ) {
1798 halbtc8723b1ant_ActionBtScoHidOnlyBusy(
1799 pBtCoexist, wifiStatus: BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN
1800 );
1801 } else {
1802 /* Bryant Add */
1803 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: false, type: 8);
1804 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 2);
1805 }
1806}
1807
1808static void halbtc8723b1ant_ActionWifiConnectedSpecialPacket(
1809 struct btc_coexist *pBtCoexist
1810)
1811{
1812 struct btc_bt_link_info *pBtLinkInfo = &pBtCoexist->btLinkInfo;
1813
1814 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0);
1815
1816 /* tdma and coex table */
1817 if (
1818 (pBtLinkInfo->bScoExist) ||
1819 (pBtLinkInfo->bHidExist) ||
1820 (pBtLinkInfo->bA2dpExist)
1821 ) {
1822 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 32);
1823 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1824 } else if (pBtLinkInfo->bPanExist) {
1825 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: true, type: 20);
1826 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 4);
1827 } else {
1828 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: false, type: 8);
1829 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 2);
1830 }
1831}
1832
1833static void halbtc8723b1ant_ActionWifiConnected(struct btc_coexist *pBtCoexist)
1834{
1835 bool bWifiBusy = false;
1836 bool bScan = false, bLink = false, bRoam = false;
1837 bool bUnder4way = false, bApEnable = false;
1838
1839 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS, &bUnder4way);
1840 if (bUnder4way) {
1841 halbtc8723b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);
1842 return;
1843 }
1844
1845 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);
1846 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);
1847 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);
1848 if (bScan || bLink || bRoam) {
1849 if (bScan)
1850 halbtc8723b1ant_ActionWifiConnectedScan(pBtCoexist);
1851 else
1852 halbtc8723b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);
1853 return;
1854 }
1855
1856 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, &bApEnable);
1857 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_BUSY, &bWifiBusy);
1858
1859 /* power save state */
1860 if (
1861 !bApEnable &&
1862 pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_BUSY &&
1863 !pBtCoexist->btLinkInfo.bHidOnly
1864 ) {
1865 if (pBtCoexist->btLinkInfo.bA2dpOnly) { /* A2DP */
1866 if (!bWifiBusy)
1867 halbtc8723b1ant_PowerSaveState(
1868 pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0
1869 );
1870 else { /* busy */
1871 if (pCoexSta->nScanAPNum >= BT_8723B_1ANT_WIFI_NOISY_THRESH) /* no force LPS, no PS-TDMA, use pure TDMA */
1872 halbtc8723b1ant_PowerSaveState(
1873 pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0
1874 );
1875 else
1876 halbtc8723b1ant_PowerSaveState(
1877 pBtCoexist, psType: BTC_PS_LPS_ON, lpsVal: 0x50, rpwmVal: 0x4
1878 );
1879 }
1880 } else if (
1881 (!pCoexSta->bPanExist) &&
1882 (!pCoexSta->bA2dpExist) &&
1883 (!pCoexSta->bHidExist)
1884 )
1885 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0);
1886 else
1887 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_LPS_ON, lpsVal: 0x50, rpwmVal: 0x4);
1888 } else
1889 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0);
1890
1891 /* tdma and coex table */
1892 if (!bWifiBusy) {
1893 if (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
1894 halbtc8723b1ant_ActionWifiConnectedBtAclBusy(
1895 pBtCoexist,
1896 wifiStatus: BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE
1897 );
1898 } else if (
1899 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_SCO_BUSY) ||
1900 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY)
1901 ) {
1902 halbtc8723b1ant_ActionBtScoHidOnlyBusy(pBtCoexist,
1903 wifiStatus: BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE);
1904 } else {
1905 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: false, type: 8);
1906
1907 if ((pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60)
1908 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 2);
1909 else
1910 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 7);
1911 }
1912 } else {
1913 if (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) {
1914 halbtc8723b1ant_ActionWifiConnectedBtAclBusy(
1915 pBtCoexist,
1916 wifiStatus: BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY
1917 );
1918 } else if (
1919 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_SCO_BUSY) ||
1920 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY)
1921 ) {
1922 halbtc8723b1ant_ActionBtScoHidOnlyBusy(
1923 pBtCoexist,
1924 wifiStatus: BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY
1925 );
1926 } else {
1927 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: false, type: 8);
1928
1929 if ((pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60)
1930 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 2);
1931 else
1932 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 7);
1933 }
1934 }
1935}
1936
1937static void halbtc8723b1ant_RunSwCoexistMechanism(struct btc_coexist *pBtCoexist)
1938{
1939 u8 algorithm = 0;
1940
1941 algorithm = halbtc8723b1ant_ActionAlgorithm(pBtCoexist);
1942 pCoexDm->curAlgorithm = algorithm;
1943
1944 if (halbtc8723b1ant_IsCommonAction(pBtCoexist)) {
1945
1946 } else {
1947 switch (pCoexDm->curAlgorithm) {
1948 case BT_8723B_1ANT_COEX_ALGO_SCO:
1949 /* halbtc8723b1ant_ActionSco(pBtCoexist); */
1950 break;
1951 case BT_8723B_1ANT_COEX_ALGO_HID:
1952 /* halbtc8723b1ant_ActionHid(pBtCoexist); */
1953 break;
1954 case BT_8723B_1ANT_COEX_ALGO_A2DP:
1955 /* halbtc8723b1ant_ActionA2dp(pBtCoexist); */
1956 break;
1957 case BT_8723B_1ANT_COEX_ALGO_A2DP_PANHS:
1958 /* halbtc8723b1ant_ActionA2dpPanHs(pBtCoexist); */
1959 break;
1960 case BT_8723B_1ANT_COEX_ALGO_PANEDR:
1961 /* halbtc8723b1ant_ActionPanEdr(pBtCoexist); */
1962 break;
1963 case BT_8723B_1ANT_COEX_ALGO_PANHS:
1964 /* halbtc8723b1ant_ActionPanHs(pBtCoexist); */
1965 break;
1966 case BT_8723B_1ANT_COEX_ALGO_PANEDR_A2DP:
1967 /* halbtc8723b1ant_ActionPanEdrA2dp(pBtCoexist); */
1968 break;
1969 case BT_8723B_1ANT_COEX_ALGO_PANEDR_HID:
1970 /* halbtc8723b1ant_ActionPanEdrHid(pBtCoexist); */
1971 break;
1972 case BT_8723B_1ANT_COEX_ALGO_HID_A2DP_PANEDR:
1973 /* halbtc8723b1ant_ActionHidA2dpPanEdr(pBtCoexist); */
1974 break;
1975 case BT_8723B_1ANT_COEX_ALGO_HID_A2DP:
1976 /* halbtc8723b1ant_ActionHidA2dp(pBtCoexist); */
1977 break;
1978 default:
1979 break;
1980 }
1981 pCoexDm->preAlgorithm = pCoexDm->curAlgorithm;
1982 }
1983}
1984
1985static void halbtc8723b1ant_RunCoexistMechanism(struct btc_coexist *pBtCoexist)
1986{
1987 struct btc_bt_link_info *pBtLinkInfo = &pBtCoexist->btLinkInfo;
1988 bool bWifiConnected = false, bBtHsOn = false;
1989 bool bIncreaseScanDevNum = false;
1990 bool bBtCtrlAggBufSize = false;
1991 u8 aggBufSize = 5;
1992 u32 wifiLinkStatus = 0;
1993 u32 numOfWifiLink = 0;
1994
1995 if (pBtCoexist->bManualControl)
1996 return;
1997
1998 if (pBtCoexist->bStopCoexDm)
1999 return;
2000
2001 if (pCoexSta->bUnderIps)
2002 return;
2003
2004 if (
2005 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) ||
2006 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_SCO_BUSY) ||
2007 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY)
2008 ){
2009 bIncreaseScanDevNum = true;
2010 }
2011
2012 pBtCoexist->fBtcSet(
2013 pBtCoexist,
2014 BTC_SET_BL_INC_SCAN_DEV_NUM,
2015 &bIncreaseScanDevNum
2016 );
2017 pBtCoexist->fBtcGet(
2018 pBtCoexist,
2019 BTC_GET_BL_WIFI_CONNECTED,
2020 &bWifiConnected
2021 );
2022
2023 pBtCoexist->fBtcGet(
2024 pBtCoexist,
2025 BTC_GET_U4_WIFI_LINK_STATUS,
2026 &wifiLinkStatus
2027 );
2028 numOfWifiLink = wifiLinkStatus >> 16;
2029
2030 if ((numOfWifiLink >= 2) || (wifiLinkStatus & WIFI_P2P_GO_CONNECTED)) {
2031 halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, raMaskType: 0, arfrType: 0, retryLimitType: 0, ampduTimeType: 0);
2032 halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, bRejApAggPkt: false, bBtCtrlAggBufSize, aggBufSize);
2033
2034 if ((pBtLinkInfo->bA2dpExist) && (pCoexSta->bC2hBtInquiryPage))
2035 halbtc8723b1ant_ActionBtInquiry(pBtCoexist);
2036 else
2037 halbtc8723b1ant_ActionWifiMultiPort(pBtCoexist);
2038
2039 return;
2040 }
2041
2042 if ((pBtLinkInfo->bBtLinkExist) && (bWifiConnected)) {
2043 halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, raMaskType: 1, arfrType: 1, retryLimitType: 0, ampduTimeType: 1);
2044
2045 if (pBtLinkInfo->bScoExist)
2046 halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, bRejApAggPkt: false, bBtCtrlAggBufSize: true, aggBufSize: 0x5);
2047 else
2048 halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, bRejApAggPkt: false, bBtCtrlAggBufSize: true, aggBufSize: 0x8);
2049
2050 halbtc8723b1ant_SwMechanism(pBtCoexist, bLowPenaltyRA: true);
2051 halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist); /* just print debug message */
2052 } else {
2053 halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, raMaskType: 0, arfrType: 0, retryLimitType: 0, ampduTimeType: 0);
2054
2055 halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, bRejApAggPkt: false, bBtCtrlAggBufSize: false, aggBufSize: 0x5);
2056
2057 halbtc8723b1ant_SwMechanism(pBtCoexist, bLowPenaltyRA: false);
2058 halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist); /* just print debug message */
2059 }
2060
2061 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
2062 if (pCoexSta->bC2hBtInquiryPage) {
2063 halbtc8723b1ant_ActionBtInquiry(pBtCoexist);
2064 return;
2065 } else if (bBtHsOn) {
2066 halbtc8723b1ant_ActionHs(pBtCoexist);
2067 return;
2068 }
2069
2070
2071 if (!bWifiConnected) {
2072 bool bScan = false, bLink = false, bRoam = false;
2073
2074 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_SCAN, &bScan);
2075 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_LINK, &bLink);
2076 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_ROAM, &bRoam);
2077
2078 if (bScan || bLink || bRoam) {
2079 if (bScan)
2080 halbtc8723b1ant_ActionWifiNotConnectedScan(pBtCoexist);
2081 else
2082 halbtc8723b1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);
2083 } else
2084 halbtc8723b1ant_ActionWifiNotConnected(pBtCoexist);
2085 } else /* wifi LPS/Busy */
2086 halbtc8723b1ant_ActionWifiConnected(pBtCoexist);
2087}
2088
2089static void halbtc8723b1ant_InitCoexDm(struct btc_coexist *pBtCoexist)
2090{
2091 /* force to reset coex mechanism */
2092
2093 /* sw all off */
2094 halbtc8723b1ant_SwMechanism(pBtCoexist, bLowPenaltyRA: false);
2095
2096 /* halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, false, 8); */
2097 halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, type: 0);
2098
2099 pCoexSta->popEventCnt = 0;
2100}
2101
2102static void halbtc8723b1ant_InitHwConfig(
2103 struct btc_coexist *pBtCoexist,
2104 bool bBackUp,
2105 bool bWifiOnly
2106)
2107{
2108 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x550, 0x8, 0x1); /* enable TBTT nterrupt */
2109
2110 /* 0x790[5:0]= 0x5 */
2111 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x790, 0x5);
2112
2113 /* Enable counter statistics */
2114 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x1);
2115 pBtCoexist->fBtcWrite1ByteBitMask(pBtCoexist, 0x40, 0x20, 0x1);
2116
2117 /* Antenna config */
2118 if (bWifiOnly) {
2119 halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_WIFI, bInitHwCfg: true, bWifiOff: false);
2120 halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, bTurnOn: false, type: 9);
2121 } else
2122 halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, bInitHwCfg: true, bWifiOff: false);
2123
2124 /* PTA parameter */
2125 halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, type: 0);
2126
2127 pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);
2128 pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);
2129 pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);
2130}
2131
2132/* */
2133/* work around function start with wa_halbtc8723b1ant_ */
2134/* */
2135/* */
2136/* extern function start with EXhalbtc8723b1ant_ */
2137/* */
2138void EXhalbtc8723b1ant_PowerOnSetting(struct btc_coexist *pBtCoexist)
2139{
2140 struct btc_board_info *pBoardInfo = &pBtCoexist->boardInfo;
2141 u8 u1Tmp = 0x0;
2142 u16 u2Tmp = 0x0;
2143
2144 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x67, 0x20);
2145
2146 /* enable BB, REG_SYS_FUNC_EN such that we can write 0x948 correctly. */
2147 u2Tmp = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x2);
2148 pBtCoexist->fBtcWrite2Byte(pBtCoexist, 0x2, u2Tmp | BIT0 | BIT1);
2149
2150 /* set GRAN_BT = 1 */
2151 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x765, 0x18);
2152 /* set WLAN_ACT = 0 */
2153 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0x4);
2154
2155 /* */
2156 /* S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info) */
2157 /* Local setting bit define */
2158 /* BIT0: "0" for no antenna inverse; "1" for antenna inverse */
2159 /* BIT1: "0" for internal switch; "1" for external switch */
2160 /* BIT2: "0" for one antenna; "1" for two antenna */
2161 /* NOTE: here default all internal switch and 1-antenna ==> BIT1 = 0 and BIT2 = 0 */
2162 if (pBtCoexist->chipInterface == BTC_INTF_USB) {
2163 /* fixed at S0 for USB interface */
2164 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
2165
2166 u1Tmp |= 0x1; /* antenna inverse */
2167 pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0xfe08, u1Tmp);
2168
2169 pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;
2170 } else {
2171 /* for PCIE and SDIO interface, we check efuse 0xc3[6] */
2172 if (pBoardInfo->singleAntPath == 0) {
2173 /* set to S1 */
2174 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x280);
2175 pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_MAIN_PORT;
2176 } else if (pBoardInfo->singleAntPath == 1) {
2177 /* set to S0 */
2178 pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x948, 0x0);
2179 u1Tmp |= 0x1; /* antenna inverse */
2180 pBoardInfo->btdmAntPos = BTC_ANTENNA_AT_AUX_PORT;
2181 }
2182
2183 if (pBtCoexist->chipInterface == BTC_INTF_PCI)
2184 pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x384, u1Tmp);
2185 else if (pBtCoexist->chipInterface == BTC_INTF_SDIO)
2186 pBtCoexist->fBtcWriteLocalReg1Byte(pBtCoexist, 0x60, u1Tmp);
2187 }
2188}
2189
2190void EXhalbtc8723b1ant_InitHwConfig(struct btc_coexist *pBtCoexist, bool bWifiOnly)
2191{
2192 halbtc8723b1ant_InitHwConfig(pBtCoexist, bBackUp: true, bWifiOnly);
2193}
2194
2195void EXhalbtc8723b1ant_InitCoexDm(struct btc_coexist *pBtCoexist)
2196{
2197 pBtCoexist->bStopCoexDm = false;
2198
2199 halbtc8723b1ant_InitCoexDm(pBtCoexist);
2200
2201 halbtc8723b1ant_QueryBtInfo(pBtCoexist);
2202}
2203
2204void EXhalbtc8723b1ant_IpsNotify(struct btc_coexist *pBtCoexist, u8 type)
2205{
2206 if (pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm)
2207 return;
2208
2209 if (type == BTC_IPS_ENTER) {
2210 pCoexSta->bUnderIps = true;
2211
2212 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: false, type: 0);
2213 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 0);
2214 halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, bInitHwCfg: false, bWifiOff: true);
2215 } else if (type == BTC_IPS_LEAVE) {
2216 pCoexSta->bUnderIps = false;
2217
2218 halbtc8723b1ant_InitHwConfig(pBtCoexist, bBackUp: false, bWifiOnly: false);
2219 halbtc8723b1ant_InitCoexDm(pBtCoexist);
2220 halbtc8723b1ant_QueryBtInfo(pBtCoexist);
2221 }
2222}
2223
2224void EXhalbtc8723b1ant_LpsNotify(struct btc_coexist *pBtCoexist, u8 type)
2225{
2226 if (pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm)
2227 return;
2228
2229 if (type == BTC_LPS_ENABLE)
2230 pCoexSta->bUnderLps = true;
2231 else if (type == BTC_LPS_DISABLE)
2232 pCoexSta->bUnderLps = false;
2233}
2234
2235void EXhalbtc8723b1ant_ScanNotify(struct btc_coexist *pBtCoexist, u8 type)
2236{
2237 bool bWifiConnected = false, bBtHsOn = false;
2238 u32 wifiLinkStatus = 0;
2239 u32 numOfWifiLink = 0;
2240 bool bBtCtrlAggBufSize = false;
2241 u8 aggBufSize = 5;
2242
2243 if (pBtCoexist->bManualControl || pBtCoexist->bStopCoexDm)
2244 return;
2245
2246 if (type == BTC_SCAN_START) {
2247 pCoexSta->bWiFiIsHighPriTask = true;
2248
2249 halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, bTurnOn: false, type: 8); /* Force antenna setup for no scan result issue */
2250 pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x948);
2251 pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x765);
2252 pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x67);
2253 } else {
2254 pCoexSta->bWiFiIsHighPriTask = false;
2255
2256 pBtCoexist->fBtcGet(
2257 pBtCoexist, BTC_GET_U1_AP_NUM, &pCoexSta->nScanAPNum
2258 );
2259 }
2260
2261 if (pBtCoexist->btInfo.bBtDisabled)
2262 return;
2263
2264 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
2265 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
2266
2267 halbtc8723b1ant_QueryBtInfo(pBtCoexist);
2268
2269 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);
2270 numOfWifiLink = wifiLinkStatus >> 16;
2271
2272 if (numOfWifiLink >= 2) {
2273 halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, raMaskType: 0, arfrType: 0, retryLimitType: 0, ampduTimeType: 0);
2274 halbtc8723b1ant_LimitedRx(
2275 pBtCoexist, NORMAL_EXEC, bRejApAggPkt: false, bBtCtrlAggBufSize, aggBufSize
2276 );
2277 halbtc8723b1ant_ActionWifiMultiPort(pBtCoexist);
2278 return;
2279 }
2280
2281 if (pCoexSta->bC2hBtInquiryPage) {
2282 halbtc8723b1ant_ActionBtInquiry(pBtCoexist);
2283 return;
2284 } else if (bBtHsOn) {
2285 halbtc8723b1ant_ActionHs(pBtCoexist);
2286 return;
2287 }
2288
2289 if (type == BTC_SCAN_START) {
2290 if (!bWifiConnected) /* non-connected scan */
2291 halbtc8723b1ant_ActionWifiNotConnectedScan(pBtCoexist);
2292 else /* wifi is connected */
2293 halbtc8723b1ant_ActionWifiConnectedScan(pBtCoexist);
2294 } else if (type == BTC_SCAN_FINISH) {
2295 if (!bWifiConnected) /* non-connected scan */
2296 halbtc8723b1ant_ActionWifiNotConnected(pBtCoexist);
2297 else
2298 halbtc8723b1ant_ActionWifiConnected(pBtCoexist);
2299 }
2300}
2301
2302void EXhalbtc8723b1ant_ConnectNotify(struct btc_coexist *pBtCoexist, u8 type)
2303{
2304 bool bWifiConnected = false, bBtHsOn = false;
2305 u32 wifiLinkStatus = 0;
2306 u32 numOfWifiLink = 0;
2307 bool bBtCtrlAggBufSize = false;
2308 u8 aggBufSize = 5;
2309
2310 if (
2311 pBtCoexist->bManualControl ||
2312 pBtCoexist->bStopCoexDm ||
2313 pBtCoexist->btInfo.bBtDisabled
2314 )
2315 return;
2316
2317 if (type == BTC_ASSOCIATE_START) {
2318 pCoexSta->bWiFiIsHighPriTask = true;
2319 pCoexDm->nArpCnt = 0;
2320 } else {
2321 pCoexSta->bWiFiIsHighPriTask = false;
2322 /* pCoexDm->nArpCnt = 0; */
2323 }
2324
2325 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus);
2326 numOfWifiLink = wifiLinkStatus >> 16;
2327 if (numOfWifiLink >= 2) {
2328 halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, raMaskType: 0, arfrType: 0, retryLimitType: 0, ampduTimeType: 0);
2329 halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, bRejApAggPkt: false, bBtCtrlAggBufSize, aggBufSize);
2330 halbtc8723b1ant_ActionWifiMultiPort(pBtCoexist);
2331 return;
2332 }
2333
2334 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
2335 if (pCoexSta->bC2hBtInquiryPage) {
2336 halbtc8723b1ant_ActionBtInquiry(pBtCoexist);
2337 return;
2338 } else if (bBtHsOn) {
2339 halbtc8723b1ant_ActionHs(pBtCoexist);
2340 return;
2341 }
2342
2343 if (type == BTC_ASSOCIATE_START) {
2344 halbtc8723b1ant_ActionWifiNotConnectedAssoAuth(pBtCoexist);
2345 } else if (type == BTC_ASSOCIATE_FINISH) {
2346 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
2347 if (!bWifiConnected) /* non-connected scan */
2348 halbtc8723b1ant_ActionWifiNotConnected(pBtCoexist);
2349 else
2350 halbtc8723b1ant_ActionWifiConnected(pBtCoexist);
2351 }
2352}
2353
2354void EXhalbtc8723b1ant_MediaStatusNotify(struct btc_coexist *pBtCoexist, u8 type)
2355{
2356 u8 H2C_Parameter[3] = {0};
2357 u32 wifiBw;
2358 u8 wifiCentralChnl;
2359 bool bWifiUnderBMode = false;
2360
2361 if (
2362 pBtCoexist->bManualControl ||
2363 pBtCoexist->bStopCoexDm ||
2364 pBtCoexist->btInfo.bBtDisabled
2365 )
2366 return;
2367
2368 if (type == BTC_MEDIA_CONNECT) {
2369 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, &bWifiUnderBMode);
2370
2371 /* Set CCK Tx/Rx high Pri except 11b mode */
2372 if (bWifiUnderBMode) {
2373 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x00); /* CCK Tx */
2374 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x00); /* CCK Rx */
2375 } else {
2376 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x10); /* CCK Tx */
2377 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x10); /* CCK Rx */
2378 }
2379
2380 pCoexDm->backupArfrCnt1 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x430);
2381 pCoexDm->backupArfrCnt2 = pBtCoexist->fBtcRead4Byte(pBtCoexist, 0x434);
2382 pCoexDm->backupRetryLimit = pBtCoexist->fBtcRead2Byte(pBtCoexist, 0x42a);
2383 pCoexDm->backupAmpduMaxTime = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x456);
2384 } else {
2385 pCoexDm->nArpCnt = 0;
2386
2387 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cd, 0x0); /* CCK Tx */
2388 pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cf, 0x0); /* CCK Rx */
2389 }
2390
2391 /* only 2.4G we need to inform bt the chnl mask */
2392 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifiCentralChnl);
2393 if ((type == BTC_MEDIA_CONNECT) && (wifiCentralChnl <= 14)) {
2394 /* H2C_Parameter[0] = 0x1; */
2395 H2C_Parameter[0] = 0x0;
2396 H2C_Parameter[1] = wifiCentralChnl;
2397 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_BW, &wifiBw);
2398
2399 if (wifiBw == BTC_WIFI_BW_HT40)
2400 H2C_Parameter[2] = 0x30;
2401 else
2402 H2C_Parameter[2] = 0x20;
2403 }
2404
2405 pCoexDm->wifiChnlInfo[0] = H2C_Parameter[0];
2406 pCoexDm->wifiChnlInfo[1] = H2C_Parameter[1];
2407 pCoexDm->wifiChnlInfo[2] = H2C_Parameter[2];
2408
2409 pBtCoexist->fBtcFillH2c(pBtCoexist, 0x66, 3, H2C_Parameter);
2410}
2411
2412void EXhalbtc8723b1ant_SpecialPacketNotify(struct btc_coexist *pBtCoexist, u8 type)
2413{
2414 bool bBtHsOn = false;
2415 u32 wifiLinkStatus = 0;
2416 u32 numOfWifiLink = 0;
2417 bool bBtCtrlAggBufSize = false;
2418 u8 aggBufSize = 5;
2419
2420 if (
2421 pBtCoexist->bManualControl ||
2422 pBtCoexist->bStopCoexDm ||
2423 pBtCoexist->btInfo.bBtDisabled
2424 )
2425 return;
2426
2427 if (
2428 type == BTC_PACKET_DHCP ||
2429 type == BTC_PACKET_EAPOL ||
2430 type == BTC_PACKET_ARP
2431 ) {
2432 if (type == BTC_PACKET_ARP) {
2433 pCoexDm->nArpCnt++;
2434
2435 if (pCoexDm->nArpCnt >= 10) /* if APR PKT > 10 after connect, do not go to ActionWifiConnectedSpecialPacket(pBtCoexist) */
2436 pCoexSta->bWiFiIsHighPriTask = false;
2437 else
2438 pCoexSta->bWiFiIsHighPriTask = true;
2439 } else {
2440 pCoexSta->bWiFiIsHighPriTask = true;
2441 }
2442 } else {
2443 pCoexSta->bWiFiIsHighPriTask = false;
2444 }
2445
2446 pCoexSta->specialPktPeriodCnt = 0;
2447
2448 pBtCoexist->fBtcGet(
2449 pBtCoexist, BTC_GET_U4_WIFI_LINK_STATUS, &wifiLinkStatus
2450 );
2451 numOfWifiLink = wifiLinkStatus >> 16;
2452
2453 if (numOfWifiLink >= 2) {
2454 halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, raMaskType: 0, arfrType: 0, retryLimitType: 0, ampduTimeType: 0);
2455 halbtc8723b1ant_LimitedRx(
2456 pBtCoexist, NORMAL_EXEC, bRejApAggPkt: false, bBtCtrlAggBufSize, aggBufSize
2457 );
2458 halbtc8723b1ant_ActionWifiMultiPort(pBtCoexist);
2459 return;
2460 }
2461
2462 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_HS_OPERATION, &bBtHsOn);
2463 if (pCoexSta->bC2hBtInquiryPage) {
2464 halbtc8723b1ant_ActionBtInquiry(pBtCoexist);
2465 return;
2466 } else if (bBtHsOn) {
2467 halbtc8723b1ant_ActionHs(pBtCoexist);
2468 return;
2469 }
2470
2471 if (
2472 type == BTC_PACKET_DHCP ||
2473 type == BTC_PACKET_EAPOL ||
2474 ((type == BTC_PACKET_ARP) && (pCoexSta->bWiFiIsHighPriTask))
2475 )
2476 halbtc8723b1ant_ActionWifiConnectedSpecialPacket(pBtCoexist);
2477}
2478
2479void EXhalbtc8723b1ant_BtInfoNotify(
2480 struct btc_coexist *pBtCoexist, u8 *tmpBuf, u8 length
2481)
2482{
2483 u8 btInfo = 0;
2484 u8 i, rspSource = 0;
2485 bool bWifiConnected = false;
2486 bool bBtBusy = false;
2487
2488 pCoexSta->bC2hBtInfoReqSent = false;
2489
2490 rspSource = tmpBuf[0] & 0xf;
2491 if (rspSource >= BT_INFO_SRC_8723B_1ANT_MAX)
2492 rspSource = BT_INFO_SRC_8723B_1ANT_WIFI_FW;
2493 pCoexSta->btInfoC2hCnt[rspSource]++;
2494
2495 for (i = 0; i < length; i++) {
2496 pCoexSta->btInfoC2h[rspSource][i] = tmpBuf[i];
2497 if (i == 1)
2498 btInfo = tmpBuf[i];
2499 }
2500
2501 if (rspSource != BT_INFO_SRC_8723B_1ANT_WIFI_FW) {
2502 pCoexSta->btRetryCnt = pCoexSta->btInfoC2h[rspSource][2] & 0xf;
2503
2504 if (pCoexSta->btRetryCnt >= 1)
2505 pCoexSta->popEventCnt++;
2506
2507 if (pCoexSta->btInfoC2h[rspSource][2] & 0x20)
2508 pCoexSta->bC2hBtPage = true;
2509 else
2510 pCoexSta->bC2hBtPage = false;
2511
2512 pCoexSta->btRssi = pCoexSta->btInfoC2h[rspSource][3] * 2 - 90;
2513 /* pCoexSta->btInfoC2h[rspSource][3]*2+10; */
2514
2515 pCoexSta->btInfoExt = pCoexSta->btInfoC2h[rspSource][4];
2516
2517 pCoexSta->bBtTxRxMask = (pCoexSta->btInfoC2h[rspSource][2] & 0x40);
2518 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TX_RX_MASK, &pCoexSta->bBtTxRxMask);
2519
2520 if (!pCoexSta->bBtTxRxMask) {
2521 /* BT into is responded by BT FW and BT RF REG 0x3C != 0x15 => Need to switch BT TRx Mask */
2522 pBtCoexist->fBtcSetBtReg(pBtCoexist, BTC_BT_REG_RF, 0x3c, 0x15);
2523 }
2524
2525 /* Here we need to resend some wifi info to BT */
2526 /* because bt is reset and loss of the info. */
2527 if (pCoexSta->btInfoExt & BIT1) {
2528 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_BL_WIFI_CONNECTED, &bWifiConnected);
2529 if (bWifiConnected)
2530 EXhalbtc8723b1ant_MediaStatusNotify(pBtCoexist, type: BTC_MEDIA_CONNECT);
2531 else
2532 EXhalbtc8723b1ant_MediaStatusNotify(pBtCoexist, type: BTC_MEDIA_DISCONNECT);
2533 }
2534
2535 if (pCoexSta->btInfoExt & BIT3) {
2536 if (!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm)
2537 halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, bEnable: false);
2538 } else {
2539 /* BT already NOT ignore Wlan active, do nothing here. */
2540 }
2541 }
2542
2543 /* check BIT2 first ==> check if bt is under inquiry or page scan */
2544 if (btInfo & BT_INFO_8723B_1ANT_B_INQ_PAGE)
2545 pCoexSta->bC2hBtInquiryPage = true;
2546 else
2547 pCoexSta->bC2hBtInquiryPage = false;
2548
2549 /* set link exist status */
2550 if (!(btInfo & BT_INFO_8723B_1ANT_B_CONNECTION)) {
2551 pCoexSta->bBtLinkExist = false;
2552 pCoexSta->bPanExist = false;
2553 pCoexSta->bA2dpExist = false;
2554 pCoexSta->bHidExist = false;
2555 pCoexSta->bScoExist = false;
2556 } else { /* connection exists */
2557 pCoexSta->bBtLinkExist = true;
2558 if (btInfo & BT_INFO_8723B_1ANT_B_FTP)
2559 pCoexSta->bPanExist = true;
2560 else
2561 pCoexSta->bPanExist = false;
2562
2563 if (btInfo & BT_INFO_8723B_1ANT_B_A2DP)
2564 pCoexSta->bA2dpExist = true;
2565 else
2566 pCoexSta->bA2dpExist = false;
2567
2568 if (btInfo & BT_INFO_8723B_1ANT_B_HID)
2569 pCoexSta->bHidExist = true;
2570 else
2571 pCoexSta->bHidExist = false;
2572
2573 if (btInfo & BT_INFO_8723B_1ANT_B_SCO_ESCO)
2574 pCoexSta->bScoExist = true;
2575 else
2576 pCoexSta->bScoExist = false;
2577 }
2578
2579 halbtc8723b1ant_UpdateBtLinkInfo(pBtCoexist);
2580
2581 btInfo = btInfo & 0x1f; /* mask profile bit for connect-ilde identification (for CSR case: A2DP idle --> 0x41) */
2582
2583 if (!(btInfo & BT_INFO_8723B_1ANT_B_CONNECTION)) {
2584 pCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_NON_CONNECTED_IDLE;
2585 } else if (btInfo == BT_INFO_8723B_1ANT_B_CONNECTION) {
2586 /* connection exists but no busy */
2587 pCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_CONNECTED_IDLE;
2588 } else if (
2589 (btInfo & BT_INFO_8723B_1ANT_B_SCO_ESCO) ||
2590 (btInfo & BT_INFO_8723B_1ANT_B_SCO_BUSY)
2591 ) {
2592 pCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_SCO_BUSY;
2593 } else if (btInfo & BT_INFO_8723B_1ANT_B_ACL_BUSY) {
2594 if (pCoexDm->btStatus != BT_8723B_1ANT_BT_STATUS_ACL_BUSY)
2595 pCoexDm->bAutoTdmaAdjust = false;
2596
2597 pCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_ACL_BUSY;
2598 } else {
2599 pCoexDm->btStatus = BT_8723B_1ANT_BT_STATUS_MAX;
2600 }
2601
2602 if (
2603 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) ||
2604 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_SCO_BUSY) ||
2605 (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_SCO_BUSY)
2606 )
2607 bBtBusy = true;
2608 else
2609 bBtBusy = false;
2610 pBtCoexist->fBtcSet(pBtCoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bBtBusy);
2611
2612 halbtc8723b1ant_RunCoexistMechanism(pBtCoexist);
2613}
2614
2615void EXhalbtc8723b1ant_HaltNotify(struct btc_coexist *pBtCoexist)
2616{
2617 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0);
2618 halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, bTurnOn: false, type: 0);
2619 halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, bInitHwCfg: false, bWifiOff: true);
2620
2621 halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, bEnable: true);
2622
2623 EXhalbtc8723b1ant_MediaStatusNotify(pBtCoexist, type: BTC_MEDIA_DISCONNECT);
2624
2625 pBtCoexist->bStopCoexDm = true;
2626}
2627
2628void EXhalbtc8723b1ant_PnpNotify(struct btc_coexist *pBtCoexist, u8 pnpState)
2629{
2630 if (pnpState == BTC_WIFI_PNP_SLEEP) {
2631 halbtc8723b1ant_PowerSaveState(pBtCoexist, psType: BTC_PS_WIFI_NATIVE, lpsVal: 0x0, rpwmVal: 0x0);
2632 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, bTurnOn: false, type: 0);
2633 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, type: 2);
2634 halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, bInitHwCfg: false, bWifiOff: true);
2635
2636 pBtCoexist->bStopCoexDm = true;
2637 } else if (pnpState == BTC_WIFI_PNP_WAKE_UP) {
2638 pBtCoexist->bStopCoexDm = false;
2639 halbtc8723b1ant_InitHwConfig(pBtCoexist, bBackUp: false, bWifiOnly: false);
2640 halbtc8723b1ant_InitCoexDm(pBtCoexist);
2641 halbtc8723b1ant_QueryBtInfo(pBtCoexist);
2642 }
2643}
2644
2645void EXhalbtc8723b1ant_Periodical(struct btc_coexist *pBtCoexist)
2646{
2647 static u8 disVerInfoCnt;
2648 u32 fwVer = 0, btPatchVer = 0;
2649
2650 if (disVerInfoCnt <= 5) {
2651 disVerInfoCnt += 1;
2652 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_BT_PATCH_VER, &btPatchVer);
2653 pBtCoexist->fBtcGet(pBtCoexist, BTC_GET_U4_WIFI_FW_VER, &fwVer);
2654 }
2655
2656 halbtc8723b1ant_MonitorBtCtr(pBtCoexist);
2657 halbtc8723b1ant_MonitorWiFiCtr(pBtCoexist);
2658
2659 if (
2660 halbtc8723b1ant_IsWifiStatusChanged(pBtCoexist) ||
2661 pCoexDm->bAutoTdmaAdjust
2662 )
2663 halbtc8723b1ant_RunCoexistMechanism(pBtCoexist);
2664
2665 pCoexSta->specialPktPeriodCnt++;
2666}
2667

source code of linux/drivers/staging/rtl8723bs/hal/HalBtc8723b1Ant.c