HalBtc8723b1Ant.c (75598B)
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, 0x0); 196 break; 197 case 1: /* disable cck 1/2 */ 198 halbtc8723b1ant_UpdateRaMask(pBtCoexist, bForceExec, 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, 0x0001f1f7); 202 break; 203 default: 204 break; 205 } 206 207 halbtc8723b1ant_AutoRateFallbackRetry(pBtCoexist, bForceExec, arfrType); 208 halbtc8723b1ant_RetryLimit(pBtCoexist, bForceExec, retryLimitType); 209 halbtc8723b1ant_AmpduMaxTime(pBtCoexist, bForceExec, 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, 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, 0x55555555, 0x55555555, 0xffffff, 0x3 693 ); 694 break; 695 case 1: 696 halbtc8723b1ant_CoexTable( 697 pBtCoexist, bForceExec, 0x55555555, 0x5a5a5a5a, 0xffffff, 0x3 698 ); 699 break; 700 case 2: 701 halbtc8723b1ant_CoexTable( 702 pBtCoexist, bForceExec, 0x5a5a5a5a, 0x5a5a5a5a, 0xffffff, 0x3 703 ); 704 break; 705 case 3: 706 halbtc8723b1ant_CoexTable( 707 pBtCoexist, bForceExec, 0xaaaa5555, 0xaaaa5a5a, 0xffffff, 0x3 708 ); 709 break; 710 case 4: 711 halbtc8723b1ant_CoexTable( 712 pBtCoexist, bForceExec, 0x55555555, 0xaaaa5a5a, 0xffffff, 0x3 713 ); 714 break; 715 case 5: 716 halbtc8723b1ant_CoexTable( 717 pBtCoexist, bForceExec, 0x5a5a5a5a, 0xaaaa5a5a, 0xffffff, 0x3 718 ); 719 break; 720 case 6: 721 halbtc8723b1ant_CoexTable( 722 pBtCoexist, bForceExec, 0x55555555, 0xaaaaaaaa, 0xffffff, 0x3 723 ); 724 break; 725 case 7: 726 halbtc8723b1ant_CoexTable( 727 pBtCoexist, bForceExec, 0xaaaaaaaa, 0xaaaaaaaa, 0xffffff, 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); 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, 0x51, 0x1a, 0x1a, 0x0, psTdmaByte4Val 1070 ); 1071 break; 1072 case 1: 1073 halbtc8723b1ant_SetFwPstdma( 1074 pBtCoexist, 1075 psTdmaByte0Val, 1076 0x3a + nWiFiDurationAdjust, 1077 0x03, 1078 psTdmaByte3Val, 1079 psTdmaByte4Val 1080 ); 1081 break; 1082 case 2: 1083 halbtc8723b1ant_SetFwPstdma( 1084 pBtCoexist, 1085 psTdmaByte0Val, 1086 0x2d + nWiFiDurationAdjust, 1087 0x03, 1088 psTdmaByte3Val, 1089 psTdmaByte4Val 1090 ); 1091 break; 1092 case 3: 1093 halbtc8723b1ant_SetFwPstdma( 1094 pBtCoexist, 0x51, 0x1d, 0x1d, 0x0, 0x10 1095 ); 1096 break; 1097 case 4: 1098 halbtc8723b1ant_SetFwPstdma( 1099 pBtCoexist, 0x93, 0x15, 0x3, 0x14, 0x0 1100 ); 1101 break; 1102 case 5: 1103 halbtc8723b1ant_SetFwPstdma( 1104 pBtCoexist, 0x61, 0x15, 0x3, 0x11, 0x10 1105 ); 1106 break; 1107 case 6: 1108 halbtc8723b1ant_SetFwPstdma( 1109 pBtCoexist, 0x61, 0x20, 0x3, 0x11, 0x11 1110 ); 1111 break; 1112 case 7: 1113 halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xc, 0x5, 0x0, 0x0); 1114 break; 1115 case 8: 1116 halbtc8723b1ant_SetFwPstdma( 1117 pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0 1118 ); 1119 break; 1120 case 9: 1121 halbtc8723b1ant_SetFwPstdma( 1122 pBtCoexist, 1123 psTdmaByte0Val, 1124 0x21, 1125 0x3, 1126 psTdmaByte3Val, 1127 psTdmaByte4Val 1128 ); 1129 break; 1130 case 10: 1131 halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x13, 0xa, 0xa, 0x0, 0x40); 1132 break; 1133 case 11: 1134 halbtc8723b1ant_SetFwPstdma( 1135 pBtCoexist, 1136 psTdmaByte0Val, 1137 0x21, 1138 0x03, 1139 psTdmaByte3Val, 1140 psTdmaByte4Val 1141 ); 1142 break; 1143 case 12: 1144 halbtc8723b1ant_SetFwPstdma( 1145 pBtCoexist, 0x51, 0x0a, 0x0a, 0x0, 0x50 1146 ); 1147 break; 1148 case 13: 1149 halbtc8723b1ant_SetFwPstdma( 1150 pBtCoexist, 0x51, 0x12, 0x12, 0x0, 0x10 1151 ); 1152 break; 1153 case 14: 1154 halbtc8723b1ant_SetFwPstdma( 1155 pBtCoexist, 0x51, 0x21, 0x3, 0x10, psTdmaByte4Val 1156 ); 1157 break; 1158 case 15: 1159 halbtc8723b1ant_SetFwPstdma( 1160 pBtCoexist, 0x13, 0xa, 0x3, 0x8, 0x0 1161 ); 1162 break; 1163 case 16: 1164 halbtc8723b1ant_SetFwPstdma( 1165 pBtCoexist, 0x93, 0x15, 0x3, 0x10, 0x0 1166 ); 1167 break; 1168 case 18: 1169 halbtc8723b1ant_SetFwPstdma( 1170 pBtCoexist, 0x93, 0x25, 0x3, 0x10, 0x0 1171 ); 1172 break; 1173 case 20: 1174 halbtc8723b1ant_SetFwPstdma( 1175 pBtCoexist, 0x61, 0x3f, 0x03, 0x11, 0x10 1176 1177 ); 1178 break; 1179 case 21: 1180 halbtc8723b1ant_SetFwPstdma( 1181 pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x11 1182 ); 1183 break; 1184 case 22: 1185 halbtc8723b1ant_SetFwPstdma( 1186 pBtCoexist, 0x61, 0x25, 0x03, 0x11, 0x10 1187 ); 1188 break; 1189 case 23: 1190 halbtc8723b1ant_SetFwPstdma( 1191 pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x18 1192 ); 1193 break; 1194 case 24: 1195 halbtc8723b1ant_SetFwPstdma( 1196 pBtCoexist, 0xe3, 0x15, 0x3, 0x31, 0x18 1197 ); 1198 break; 1199 case 25: 1200 halbtc8723b1ant_SetFwPstdma( 1201 pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18 1202 ); 1203 break; 1204 case 26: 1205 halbtc8723b1ant_SetFwPstdma( 1206 pBtCoexist, 0xe3, 0xa, 0x3, 0x31, 0x18 1207 ); 1208 break; 1209 case 27: 1210 halbtc8723b1ant_SetFwPstdma( 1211 pBtCoexist, 0xe3, 0x25, 0x3, 0x31, 0x98 1212 ); 1213 break; 1214 case 28: 1215 halbtc8723b1ant_SetFwPstdma( 1216 pBtCoexist, 0x69, 0x25, 0x3, 0x31, 0x0 1217 ); 1218 break; 1219 case 29: 1220 halbtc8723b1ant_SetFwPstdma( 1221 pBtCoexist, 0xab, 0x1a, 0x1a, 0x1, 0x10 1222 ); 1223 break; 1224 case 30: 1225 halbtc8723b1ant_SetFwPstdma( 1226 pBtCoexist, 0x51, 0x30, 0x3, 0x10, 0x10 1227 ); 1228 break; 1229 case 31: 1230 halbtc8723b1ant_SetFwPstdma( 1231 pBtCoexist, 0xd3, 0x1a, 0x1a, 0x0, 0x58 1232 ); 1233 break; 1234 case 32: 1235 halbtc8723b1ant_SetFwPstdma( 1236 pBtCoexist, 0x61, 0x35, 0x3, 0x11, 0x11 1237 ); 1238 break; 1239 case 33: 1240 halbtc8723b1ant_SetFwPstdma( 1241 pBtCoexist, 0xa3, 0x25, 0x3, 0x30, 0x90 1242 ); 1243 break; 1244 case 34: 1245 halbtc8723b1ant_SetFwPstdma( 1246 pBtCoexist, 0x53, 0x1a, 0x1a, 0x0, 0x10 1247 ); 1248 break; 1249 case 35: 1250 halbtc8723b1ant_SetFwPstdma( 1251 pBtCoexist, 0x63, 0x1a, 0x1a, 0x0, 0x10 1252 ); 1253 break; 1254 case 36: 1255 halbtc8723b1ant_SetFwPstdma( 1256 pBtCoexist, 0xd3, 0x12, 0x3, 0x14, 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, 0x23, 0x18, 0x00, 0x10, 0x24 1263 ); 1264 break; 1265 } 1266 } else { 1267 1268 /* disable PS tdma */ 1269 switch (type) { 1270 case 8: /* PTA Control */ 1271 halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x8, 0x0, 0x0, 0x0, 0x0); 1272 halbtc8723b1ant_SetAntPath( 1273 pBtCoexist, BTC_ANT_PATH_PTA, false, false 1274 ); 1275 break; 1276 case 0: 1277 default: /* Software control, Antenna at BT side */ 1278 halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0); 1279 halbtc8723b1ant_SetAntPath( 1280 pBtCoexist, BTC_ANT_PATH_BT, false, false 1281 ); 1282 break; 1283 case 9: /* Software control, Antenna at WiFi side */ 1284 halbtc8723b1ant_SetFwPstdma(pBtCoexist, 0x0, 0x0, 0x0, 0x0, 0x0); 1285 halbtc8723b1ant_SetAntPath( 1286 pBtCoexist, BTC_ANT_PATH_WIFI, false, 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, true, 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, true, 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, true, 9); 1465 pCoexDm->psTdmaDuAdjType = 9; 1466 } else if (pCoexDm->curPsTdma == 1) { 1467 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 2); 1468 pCoexDm->psTdmaDuAdjType = 2; 1469 } else if (pCoexDm->curPsTdma == 2) { 1470 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 9); 1471 pCoexDm->psTdmaDuAdjType = 9; 1472 } else if (pCoexDm->curPsTdma == 9) { 1473 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 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, true, 9); 1482 pCoexDm->psTdmaDuAdjType = 9; 1483 } else if (pCoexDm->curPsTdma == 11) { 1484 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 9); 1485 pCoexDm->psTdmaDuAdjType = 9; 1486 } else if (pCoexDm->curPsTdma == 9) { 1487 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 2); 1488 pCoexDm->psTdmaDuAdjType = 2; 1489 } else if (pCoexDm->curPsTdma == 2) { 1490 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 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, true, 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, false, 0); 1520 } else { /* NO PS state */ 1521 if (bNewPsState) /* will enter LPS state, turn off psTdma first */ 1522 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 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, 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, 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, BTC_PS_WIFI_NATIVE, 0x0, 0x0); 1581 1582 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 8); 1583 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); 1584} 1585 1586static void halbtc8723b1ant_ActionHs(struct btc_coexist *pBtCoexist) 1587{ 1588 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 5); 1589 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 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, BTC_PS_WIFI_NATIVE, 0x0, 0x0); 1607 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 8); 1608 1609 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); 1610 } else if ( 1611 pBtLinkInfo->bScoExist || 1612 pBtLinkInfo->bHidExist || 1613 pBtLinkInfo->bA2dpExist 1614 ) { 1615 /* SCO/HID/A2DP busy */ 1616 halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); 1617 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 32); 1618 1619 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); 1620 } else if (pBtLinkInfo->bPanExist || bWifiBusy) { 1621 halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); 1622 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 20); 1623 1624 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); 1625 } else { 1626 halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); 1627 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 8); 1628 1629 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 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, true, 5); 1646 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 5); 1647 } else { /* HID */ 1648 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 6); 1649 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 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(2, 28, 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, true, 32); 1673 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); 1674 pCoexDm->bAutoTdmaAdjust = false; 1675 } else { 1676 halbtc8723b1ant_TdmaDurationAdjustForAcl(pBtCoexist, wifiStatus); 1677 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); 1678 pCoexDm->bAutoTdmaAdjust = true; 1679 } 1680 } else if (pBtLinkInfo->bHidExist && pBtLinkInfo->bA2dpExist) { /* HID+A2DP */ 1681 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 14); 1682 pCoexDm->bAutoTdmaAdjust = false; 1683 1684 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 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, true, 3); 1690 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 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, true, 13); 1697 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); 1698 pCoexDm->bAutoTdmaAdjust = false; 1699 } else { 1700 /* BT no-profile busy (0x9) */ 1701 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 32); 1702 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 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, BTC_PS_WIFI_NATIVE, 0x0, 0x0); 1711 1712 /* tdma and coex table */ 1713 halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, false, 8); 1714 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 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, BTC_PS_WIFI_NATIVE, 0x0, 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, true, 32); 1729 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); 1730 } else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist) { 1731 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 22); 1732 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); 1733 } else { 1734 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 20); 1735 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 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, BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN 1743 ); 1744 } else { 1745 /* Bryant Add */ 1746 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 8); 1747 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 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, BTC_PS_WIFI_NATIVE, 0x0, 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, true, 32); 1766 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); 1767 } else if (pBtLinkInfo->bPanExist) { 1768 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 20); 1769 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); 1770 } else { 1771 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 8); 1772 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 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, BTC_PS_WIFI_NATIVE, 0x0, 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, true, 32); 1786 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); 1787 } else if (pBtLinkInfo->bA2dpExist && pBtLinkInfo->bPanExist) { 1788 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 22); 1789 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); 1790 } else { 1791 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 20); 1792 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 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, BT_8723B_1ANT_WIFI_STATUS_CONNECTED_SCAN 1800 ); 1801 } else { 1802 /* Bryant Add */ 1803 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 8); 1804 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 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, BTC_PS_WIFI_NATIVE, 0x0, 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, true, 32); 1823 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); 1824 } else if (pBtLinkInfo->bPanExist) { 1825 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, true, 20); 1826 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 4); 1827 } else { 1828 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 8); 1829 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 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, BTC_PS_WIFI_NATIVE, 0x0, 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, BTC_PS_WIFI_NATIVE, 0x0, 0x0 1874 ); 1875 else 1876 halbtc8723b1ant_PowerSaveState( 1877 pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4 1878 ); 1879 } 1880 } else if ( 1881 (!pCoexSta->bPanExist) && 1882 (!pCoexSta->bA2dpExist) && 1883 (!pCoexSta->bHidExist) 1884 ) 1885 halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 0x0); 1886 else 1887 halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_LPS_ON, 0x50, 0x4); 1888 } else 1889 halbtc8723b1ant_PowerSaveState(pBtCoexist, BTC_PS_WIFI_NATIVE, 0x0, 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 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 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_IDLE); 1904 } else { 1905 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 8); 1906 1907 if ((pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60) 1908 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); 1909 else 1910 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 7); 1911 } 1912 } else { 1913 if (pCoexDm->btStatus == BT_8723B_1ANT_BT_STATUS_ACL_BUSY) { 1914 halbtc8723b1ant_ActionWifiConnectedBtAclBusy( 1915 pBtCoexist, 1916 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 BT_8723B_1ANT_WIFI_STATUS_CONNECTED_BUSY 1925 ); 1926 } else { 1927 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 8); 1928 1929 if ((pCoexSta->highPriorityTx) + (pCoexSta->highPriorityRx) <= 60) 1930 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); 1931 else 1932 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 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, 0, 0, 0, 0); 2032 halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, 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, 1, 1, 0, 1); 2044 2045 if (pBtLinkInfo->bScoExist) 2046 halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, true, 0x5); 2047 else 2048 halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, true, 0x8); 2049 2050 halbtc8723b1ant_SwMechanism(pBtCoexist, true); 2051 halbtc8723b1ant_RunSwCoexistMechanism(pBtCoexist); /* just print debug message */ 2052 } else { 2053 halbtc8723b1ant_LimitedTx(pBtCoexist, NORMAL_EXEC, 0, 0, 0, 0); 2054 2055 halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, false, false, 0x5); 2056 2057 halbtc8723b1ant_SwMechanism(pBtCoexist, 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, false); 2095 2096 /* halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, false, 8); */ 2097 halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 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, true, false); 2120 halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, false, 9); 2121 } else 2122 halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, true, false); 2123 2124 /* PTA parameter */ 2125 halbtc8723b1ant_CoexTableWithType(pBtCoexist, FORCE_EXEC, 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, 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, false, 0); 2213 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 0); 2214 halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, false, true); 2215 } else if (type == BTC_IPS_LEAVE) { 2216 pCoexSta->bUnderIps = false; 2217 2218 halbtc8723b1ant_InitHwConfig(pBtCoexist, false, 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, false, 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, 0, 0, 0, 0); 2274 halbtc8723b1ant_LimitedRx( 2275 pBtCoexist, NORMAL_EXEC, 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, 0, 0, 0, 0); 2329 halbtc8723b1ant_LimitedRx(pBtCoexist, NORMAL_EXEC, 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, 0, 0, 0, 0); 2455 halbtc8723b1ant_LimitedRx( 2456 pBtCoexist, NORMAL_EXEC, 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, BTC_MEDIA_CONNECT); 2531 else 2532 EXhalbtc8723b1ant_MediaStatusNotify(pBtCoexist, BTC_MEDIA_DISCONNECT); 2533 } 2534 2535 if (pCoexSta->btInfoExt & BIT3) { 2536 if (!pBtCoexist->bManualControl && !pBtCoexist->bStopCoexDm) 2537 halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, 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, BTC_PS_WIFI_NATIVE, 0x0, 0x0); 2618 halbtc8723b1ant_PsTdma(pBtCoexist, FORCE_EXEC, false, 0); 2619 halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, false, true); 2620 2621 halbtc8723b1ant_IgnoreWlanAct(pBtCoexist, FORCE_EXEC, true); 2622 2623 EXhalbtc8723b1ant_MediaStatusNotify(pBtCoexist, 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, BTC_PS_WIFI_NATIVE, 0x0, 0x0); 2632 halbtc8723b1ant_PsTdma(pBtCoexist, NORMAL_EXEC, false, 0); 2633 halbtc8723b1ant_CoexTableWithType(pBtCoexist, NORMAL_EXEC, 2); 2634 halbtc8723b1ant_SetAntPath(pBtCoexist, BTC_ANT_PATH_BT, false, true); 2635 2636 pBtCoexist->bStopCoexDm = true; 2637 } else if (pnpState == BTC_WIFI_PNP_WAKE_UP) { 2638 pBtCoexist->bStopCoexDm = false; 2639 halbtc8723b1ant_InitHwConfig(pBtCoexist, false, 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}