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