diff options
Diffstat (limited to 'drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c')
-rwxr-xr-x | drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c | 469 |
1 files changed, 360 insertions, 109 deletions
diff --git a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c index 34025b0bb50e..4ac0a4a6bd64 100755 --- a/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c +++ b/drivers/net/wireless/rtl8723as/hal/rtl8723a/rtl8723a_bt-coexist.c @@ -27,7 +27,7 @@ //#define BT_DEBUG -#define CHECK_BT_EXIST_FROM_REG +//#define CHECK_BT_EXIST_FROM_REG #define DIS_PS_RX_BCN //#define BTCOEX_DECREASE_WIFI_POWER //#define BTCOEX_CMCC_TEST @@ -144,7 +144,7 @@ static u8 PlatformCancelTimer(PADAPTER a, _timer *ptimer) #define PlatformScheduleWorkItem(pwork) _set_workitem(pwork) #if 0 #define GET_UNDECORATED_AVERAGE_RSSI(padapter) \ - (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) ? \ + (BTDM_CheckFWState(padapter, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) ? \ (GET_HAL_DATA(padapter)->dmpriv.EntryMinUndecoratedSmoothedPWDB): \ (GET_HAL_DATA(padapter)->dmpriv.UndecoratedSmoothedPWDB) #else @@ -216,6 +216,14 @@ void BT_SignalCompensation(PADAPTER padapter, u8 *rssi_wifi, u8 *rssi_bt) void BT_WifiScanNotify(PADAPTER padapter, u8 scanType) { +#if defined(CONFIG_CONCURRENT_MODE) + if (padapter->adapter_type != PRIMARY_ADAPTER) + { + RTPRINT(FBT, BT_TRACE, ("[DM][BT], CONFIG_CONCURRENT_MODE and padapter->adapter_type != PRIMARY_ADAPTER in %s!!\n", __FUNCTION__)); + return; + } +#endif + BTHCI_WifiScanNotify(padapter, scanType); BTDM_CheckAntSelMode(padapter); BTDM_WifiScanNotify(padapter, scanType); @@ -223,6 +231,14 @@ void BT_WifiScanNotify(PADAPTER padapter, u8 scanType) void BT_WifiAssociateNotify(PADAPTER padapter, u8 action) { +#if defined(CONFIG_CONCURRENT_MODE) + if (padapter->adapter_type != PRIMARY_ADAPTER) + { + RTPRINT(FBT, BT_TRACE, ("[DM][BT], CONFIG_CONCURRENT_MODE and padapter->adapter_type != PRIMARY_ADAPTER in %s!!\n", __FUNCTION__)); + return; + } +#endif + // action : // TRUE = associate start // FALSE = associate finished @@ -234,11 +250,27 @@ void BT_WifiAssociateNotify(PADAPTER padapter, u8 action) void BT_WifiMediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus) { +#if defined(CONFIG_CONCURRENT_MODE) + if (padapter->adapter_type != PRIMARY_ADAPTER) + { + RTPRINT(FBT, BT_TRACE, ("[DM][BT], CONFIG_CONCURRENT_MODE and padapter->adapter_type != PRIMARY_ADAPTER in %s!!\n", __FUNCTION__)); + return; + } +#endif + BTDM_MediaStatusNotify(padapter, mstatus); } void BT_SpecialPacketNotify(PADAPTER padapter) { +#if defined(CONFIG_CONCURRENT_MODE) + if (padapter->adapter_type != PRIMARY_ADAPTER) + { + RTPRINT(FBT, BT_TRACE, ("[DM][BT], CONFIG_CONCURRENT_MODE and padapter->adapter_type != PRIMARY_ADAPTER in %s!!\n", __FUNCTION__)); + return; + } +#endif + BTDM_ForDhcp(padapter); } @@ -295,7 +327,7 @@ void BTPKT_WPAAuthINITIALIZE(PADAPTER padapter, u8 EntryNum) if (pHalData->bBTMode) { // if (padapter->MgntInfo.OpMode == RT_OP_MODE_IBSS) - if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) + if (BTDM_CheckFWState(padapter, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE) { pBtSec->bUsedHwEncrypt = _FALSE; } @@ -745,7 +777,7 @@ void bthci_DecideBTChannel(PADAPTER padapter, u8 EntryNum) IsAPModeExist(padapter)|| BTHCI_HsConnectionEstablished(padapter))) #else - if (!(check_fwstate(pmlmepriv, WIFI_ASOC_STATE|WIFI_ADHOC_STATE|WIFI_AP_STATE) == _TRUE || + if (!(BTDM_CheckFWState(padapter, WIFI_ASOC_STATE|WIFI_ADHOC_STATE|WIFI_AP_STATE) == _TRUE || BTHCI_HsConnectionEstablished(padapter))) #endif { @@ -1462,7 +1494,7 @@ bthci_AssocPreferredChannelList( pMgntInfo->mIbss || IsExtAPModeExist(padapter)) || #else - (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE) == _TRUE) || + (BTDM_CheckFWState(padapter, WIFI_ASOC_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_AP_STATE) == _TRUE) || #endif BTHCI_HsConnectionEstablished(padapter)) { @@ -1591,7 +1623,7 @@ u8 bthci_CheckRfStateBeforeConnect(PADAPTER padapter) pBTInfo = GET_BT_INFO(padapter); // rtw_hal_get_hwreg(padapter, HW_VAR_RF_STATE, (u8*)(&RfState)); - RfState = padapter->pwrctrlpriv.rf_pwrstate; + RfState = adapter_to_pwrctl(padapter)->rf_pwrstate; if (RfState != rf_on) { @@ -4249,7 +4281,7 @@ bthci_CmdReadLocalAMPInfo( { // PMGNT_INFO pMgntInfo = &padapter->MgntInfo; - struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv; + struct pwrctrl_priv *ppwrctrl = adapter_to_pwrctl(padapter); u8 localBuf[TmpLocalBufSize] = ""; u8 *pRetPar; u8 len = 0; @@ -5353,15 +5385,15 @@ bthci_CmdWIFIConnectionStatus( } } #else - if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) { + if (BTDM_CheckFWState(padapter, WIFI_AP_STATE) == _TRUE) { if (padapter->stapriv.asoc_sta_count >= 3) connectStatus = HCI_WIFI_CONNECTED; else connectStatus = HCI_WIFI_NOT_CONNECTED; } - else if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_ASOC_STATE) == _TRUE) + else if (BTDM_CheckFWState(padapter, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE|WIFI_ASOC_STATE) == _TRUE) connectStatus = HCI_WIFI_CONNECTED; - else if (check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING) == _TRUE) + else if (BTDM_CheckFWState(padapter, WIFI_UNDER_LINKING) == _TRUE) connectStatus = HCI_WIFI_CONNECT_IN_PROGRESS; else connectStatus = HCI_WIFI_NOT_CONNECTED; @@ -6526,7 +6558,7 @@ bthci_StateDisconnected( (MgntIsLinkInProgress(pMgntInfo))|| (MgntScanInProgress(pMgntInfo))) #else - while (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE|WIFI_SITE_MONITOR) == _TRUE) + while (BTDM_CheckFWState(padapter, WIFI_ASOC_STATE|WIFI_SITE_MONITOR) == _TRUE) #endif { RTPRINT(FIOCTL, IOCTL_STATE, ("Scan/Roaming/Wifi Link is in Progress, wait 200 ms\n")); @@ -6959,7 +6991,7 @@ u8 bthci_WaitForRfReady(PADAPTER padapter) u8 bRet = _FALSE; // PRT_POWER_SAVE_CONTROL pPSC = GET_POWER_SAVE_CONTROL(&(padapter->MgntInfo)); - struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv; + struct pwrctrl_priv *ppwrctrl = adapter_to_pwrctl(padapter); rt_rf_power_state RfState; u32 waitcnt = 0; @@ -7070,7 +7102,7 @@ u8 BTHCI_GetCurrentEntryNumByMAC(PADAPTER padapter, u8 *SA) void BTHCI_StatusWatchdog(PADAPTER padapter) { // PMGNT_INFO pMgntInfo = &padapter->MgntInfo; - struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv; + struct pwrctrl_priv *ppwrctrl = adapter_to_pwrctl(padapter); PBT30Info pBTInfo = GET_BT_INFO(padapter); PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt; PBT_TRAFFIC pBtTraffic = &pBTInfo->BtTraffic; @@ -7113,7 +7145,7 @@ void BTHCI_StatusWatchdog(PADAPTER padapter) !MgntIsLinkInProgress(pMgntInfo) && !MgntScanInProgress(pMgntInfo) && #else - if ((check_fwstate(&padapter->mlmepriv, WIFI_REASOC_STATE|WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _FALSE) && + if ((BTDM_CheckFWState(padapter, WIFI_REASOC_STATE|WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _FALSE) && #endif !bRfOff) { @@ -7166,7 +7198,7 @@ BTHCI_NotifyRFState( PMGNT_INFO pMgntInfo = &padapter->MgntInfo; RT_RF_CHANGE_SOURCE RfOffReason = pMgntInfo->RfOffReason; #else - struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv; + struct pwrctrl_priv *ppwrctrl = adapter_to_pwrctl(padapter); RT_RF_CHANGE_SOURCE RfOffReason = ppwrctrl->rfoff_reason; #endif @@ -8104,7 +8136,7 @@ void btdm_1AntSetPSMode(PADAPTER padapter, u8 enable, u8 smartps, u8 mode) RTPRINT(FBT, BT_TRACE, ("[BTCoex], Current LPS(%s, %d), smartps=%d\n", enable==_TRUE?"ON":"OFF", mode, smartps)); - pwrctrl = &padapter->pwrctrlpriv; + pwrctrl = adapter_to_pwrctl(padapter); if (enable == _TRUE) { rtw_set_ps_mode(padapter, PS_MODE_MIN, smartps, mode); @@ -8147,6 +8179,41 @@ u8 btdm_Is1AntPsTdmaStateChange(PADAPTER padapter) } } +void btdm_1AntSetBTCoexTable(PADAPTER padapter, u8 coexCase) +{ + switch (coexCase) + { + case 0: + rtw_write32(padapter, REG_BT_COEX_TABLE_1, 0x55555555); + rtw_write32(padapter, REG_BT_COEX_TABLE_2, 0x55555555); + break; + case 1: + rtw_write32(padapter, REG_BT_COEX_TABLE_1, 0x55555555); + rtw_write32(padapter, REG_BT_COEX_TABLE_2, 0x5afa5afa); + break; + case 2: + rtw_write32(padapter, REG_BT_COEX_TABLE_1, 0x5a5a5a5a); + rtw_write32(padapter, REG_BT_COEX_TABLE_2, 0x5a5a5a5a); + break; + case 3: + rtw_write32(padapter, REG_BT_COEX_TABLE_1, 0xaaaaaaaa); + rtw_write32(padapter, REG_BT_COEX_TABLE_2, 0xaaaaaaaa); + break; + case 4: + rtw_write32(padapter, REG_BT_COEX_TABLE_1, 0xffffffff); + rtw_write32(padapter, REG_BT_COEX_TABLE_2, 0xffffffff); + break; + case 5: + rtw_write32(padapter, REG_BT_COEX_TABLE_1, 0x5fff5fff); + rtw_write32(padapter, REG_BT_COEX_TABLE_2, 0x5fff5fff); + break; + case 6: + rtw_write32(padapter, REG_BT_COEX_TABLE_1, 0x55ff55ff); + rtw_write32(padapter, REG_BT_COEX_TABLE_2, 0x5a5a5a5a); + break; + } +} + // Before enter TDMA, make sure Power Saving is enable! void btdm_1AntPsTdma( @@ -8171,22 +8238,24 @@ btdm_1AntPsTdma( if (btdm_Is1AntPsTdmaStateChange(padapter)) { // wide duration for WiFi - BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x0, 0x58); + BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x0, 0x50); + btdm_1AntSetBTCoexTable(padapter, 6); } break; case 2: // A2DP Level-2 if (btdm_Is1AntPsTdmaStateChange(padapter)) { // normal duration for WiFi - BTDM_SetFw3a(padapter, 0xd3, 0x12, 0x12, 0x0, 0x58); + BTDM_SetFw3a(padapter, 0xd3, 0x12, 0x12, 0x0, 0x50); + btdm_1AntSetBTCoexTable(padapter, 6); } break; case 3: // BT FTP/OPP if (btdm_Is1AntPsTdmaStateChange(padapter)) { // normal duration for WiFi - BTDM_SetFw3a(padapter, 0xd3, 0x30, 0x03, 0x10, 0x58); - + BTDM_SetFw3a(padapter, 0x53, 0x30, 0x03, 0x10, 0x50); + btdm_1AntSetBTCoexTable(padapter, 6); } break; case 4: // for wifi scan & BT is connected @@ -8194,13 +8263,15 @@ btdm_1AntPsTdma( { // protect 3 beacons in 3-beacon period & no Tx pause at BT slot BTDM_SetFw3a(padapter, 0x93, 0x15, 0x03, 0x14, 0x0); + btdm_1AntSetBTCoexTable(padapter, 1); } break; case 5: // for WiFi connected-busy & BT is Non-Connected-Idle if (btdm_Is1AntPsTdmaStateChange(padapter)) { // SCO mode, Ant fixed at WiFi, WLAN_Act toggle - BTDM_SetFw3a(padapter, 0x61, 0x15, 0x03, 0x31, 0x00); + BTDM_SetFw3a(padapter, 0x61, 0x15, 0x03, 0x31, 0x10); + btdm_1AntSetBTCoexTable(padapter, 2); } break; case 9: // ACL high-retry type - 2 @@ -8208,19 +8279,22 @@ btdm_1AntPsTdma( { // narrow duration for WiFi BTDM_SetFw3a(padapter, 0xd3, 0xa, 0xa, 0x0, 0x58); //narrow duration for WiFi + btdm_1AntSetBTCoexTable(padapter, 6); } break; case 10: // for WiFi connect idle & BT ACL busy or WiFi Connected-Busy & BT is Inquiry if (btdm_Is1AntPsTdmaStateChange(padapter)) { BTDM_SetFw3a(padapter, 0x13, 0xa, 0xa, 0x0, 0x40); + btdm_1AntSetBTCoexTable(padapter, 2); } break; case 11: // ACL high-retry type - 3 if (btdm_Is1AntPsTdmaStateChange(padapter)) { // narrow duration for WiFi - BTDM_SetFw3a(padapter, 0xd3, 0x05, 0x05, 0x00, 0x58); + BTDM_SetFw3a(padapter, 0x53, 0x10, 0x03, 0x10, 0x50); + btdm_1AntSetBTCoexTable(padapter, 6); } break; case 12: // for WiFi Connected-Busy & BT is Connected-Idle @@ -8228,68 +8302,91 @@ btdm_1AntPsTdma( { // Allow High-Pri BT BTDM_SetFw3a(padapter, 0xeb, 0x0a, 0x03, 0x31, 0x18); + btdm_1AntSetBTCoexTable(padapter, 2); } break; case 20: // WiFi only busy ,TDMA mode for power saving if (btdm_Is1AntPsTdmaStateChange(padapter)) { BTDM_SetFw3a(padapter, 0x13, 0x25, 0x25, 0x00, 0x00); + btdm_1AntSetBTCoexTable(padapter, 2); } break; case 27: // WiFi DHCP/Site Survey & BT SCO busy if (btdm_Is1AntPsTdmaStateChange(padapter)) { BTDM_SetFw3a(padapter, 0xa3, 0x25, 0x03, 0x31, 0x98); + btdm_1AntSetBTCoexTable(padapter, 2); } break; case 28: // WiFi DHCP/Site Survey & BT idle if (btdm_Is1AntPsTdmaStateChange(padapter)) { BTDM_SetFw3a(padapter, 0x69, 0x25, 0x03, 0x31, 0x00); + btdm_1AntSetBTCoexTable(padapter, 2); } break; case 29: // WiFi DHCP/Site Survey & BT ACL busy if (btdm_Is1AntPsTdmaStateChange(padapter)) { BTDM_SetFw3a(padapter, 0xeb, 0x1a, 0x1a, 0x01, 0x18); - rtw_write32(padapter, 0x6c0, 0x5afa5afa); - rtw_write32(padapter, 0x6c4, 0x5afa5afa); + btdm_1AntSetBTCoexTable(padapter, 1); } break; case 30: // WiFi idle & BT Inquiry if (btdm_Is1AntPsTdmaStateChange(padapter)) { BTDM_SetFw3a(padapter, 0x93, 0x15, 0x03, 0x14, 0x00); + btdm_1AntSetBTCoexTable(padapter, 0); } break; case 31: // BT HID if (btdm_Is1AntPsTdmaStateChange(padapter)) { - BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x00, 0x58); + BTDM_SetFw3a(padapter, 0x53, 0x12, 0x12, 0x00, 0x50); + btdm_1AntSetBTCoexTable(padapter, 6); } break; case 32: // BT SCO & Inquiry if (btdm_Is1AntPsTdmaStateChange(padapter)) { - BTDM_SetFw3a(padapter, 0xab, 0x0a, 0x03, 0x11, 0x98); + BTDM_SetFw3a(padapter, 0xa3, 0x0a, 0x03, 0x14, 0x00); + btdm_1AntSetBTCoexTable(padapter, 0); } break; case 33: // BT SCO & WiFi site survey if (btdm_Is1AntPsTdmaStateChange(padapter)) { BTDM_SetFw3a(padapter, 0xa3, 0x25, 0x03, 0x30, 0x98); + btdm_1AntSetBTCoexTable(padapter, 2); } break; case 34: // BT HID & WiFi site survey if (btdm_Is1AntPsTdmaStateChange(padapter)) { - BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x00, 0x18); + BTDM_SetFw3a(padapter, 0xd3, 0x1a, 0x1a, 0x00, 0x10); + btdm_1AntSetBTCoexTable(padapter, 1); } break; case 35: // BT HID & WiFi Connecting if (btdm_Is1AntPsTdmaStateChange(padapter)) { - BTDM_SetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x00, 0x18); + BTDM_SetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x00, 0x10); + btdm_1AntSetBTCoexTable(padapter, 1); + } + break; + case 36: // BT A2DP/FTP/A2DP+HID/FTP+A2DP & WiFi LPS + if (btdm_Is1AntPsTdmaStateChange(padapter)) + { + BTDM_SetFw3a(padapter, 0x23, 0x20, 0x00, 0x10, 0x24); + btdm_1AntSetBTCoexTable(padapter, 2); + } + break; + case 37: + if (btdm_Is1AntPsTdmaStateChange(padapter)) + { + BTDM_SetFw3a(padapter, 0x53, 0x10, 0x03, 0x10, 0x10); + btdm_1AntSetBTCoexTable(padapter, 6); } break; } @@ -8326,6 +8423,7 @@ btdm_1AntPsTdma( RTPRINT(FBT, BT_TRACE, ("[BTCoex], 0x860=0x110, Switch Antenna to WiFi\n")); break; } + btdm_1AntSetBTCoexTable(padapter, 2); } RTPRINT(FBT, BT_TRACE, ("[BTCoex], Current TDMA(%s, %d)\n", @@ -8345,7 +8443,7 @@ void _btdm_1AntSetPSTDMA(PADAPTER padapter, u8 bPSEn, u8 smartps, u8 psOption, u u8 bSwitchPS; - if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _FALSE) && + if ((BTDM_CheckFWState(padapter, WIFI_STATION_STATE) == _FALSE) && (get_fwstate(&padapter->mlmepriv) != WIFI_NULL_STATE)) { btdm_1AntPsTdma(padapter, bTDMAOn, tdmaType); @@ -8361,7 +8459,7 @@ void _btdm_1AntSetPSTDMA(PADAPTER padapter, u8 bPSEn, u8 smartps, u8 psOption, u bPSEn==_TRUE?"ON":"OFF", psOption, bTDMAOn==_TRUE?"ON":"OFF", tdmaType)); - pwrctrl = &padapter->pwrctrlpriv; + pwrctrl = adapter_to_pwrctl(padapter); pHalData = GET_HAL_DATA(padapter); pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm1Ant; @@ -8606,7 +8704,12 @@ void btdm_1AntTdmaDurationAdjustForACL(PADAPTER padapter) if (pBtdm8723->psTdmaMonitorCnt == 0) { // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, first time execute!!\n")); - btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 2); + btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 9); + if(pHalData->bt_coexist.halCoex8723.btInfoExt){ + pBtdm8723->psTdmaDuAdjType = 9; + RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, limit to type9 \n")); + } + else pBtdm8723->psTdmaDuAdjType = 2; } else @@ -8666,7 +8769,7 @@ void btdm_1AntTdmaDurationAdjustForACL(PADAPTER padapter) } else if (pBtdm8723->curPsTdma == 9) { - if (pHalData->bt_coexist.halCoex8723.btInfoExt){ + if ((pHalData->bt_coexist.halCoex8723.btInfoExt) || (pHalData->bt_coexist.halCoex8723.btRssi <= 32)){ pBtdm8723->psTdmaDuAdjType = 9; // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, limit to type9 \n")); } @@ -8676,7 +8779,7 @@ void btdm_1AntTdmaDurationAdjustForACL(PADAPTER padapter) } else if (pBtdm8723->curPsTdma == 2) { - if (pHalData->bt_coexist.halCoex8723.btInfoExt){ + if ((pHalData->bt_coexist.halCoex8723.btInfoExt) || (pHalData->bt_coexist.halCoex8723.btRssi <=32)){ pBtdm8723->psTdmaDuAdjType = 9; // RTPRINT(FBT, BT_TRACE, ("[BTCoex], 1AntTdmaAdjACL, limit to type9 \n")); } @@ -8855,9 +8958,9 @@ void btdm_1AntCoexProcessForWifiConnect(PADAPTER padapter) RTPRINT(FBT, BT_TRACE, ("[BTCoex], WiFi is %s\n", BTDM_IsWifiBusy(padapter)?"Busy":"IDLE")); RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT is %s\n", BtStateString[BtState])); - padapter->pwrctrlpriv.btcoex_rfon = _FALSE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _FALSE; - if ((!BTDM_IsWifiBusy(padapter)) &&(check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) != _TRUE)&& + if ((!BTDM_IsWifiBusy(padapter)) &&(BTDM_CheckFWState(padapter, WIFI_AP_STATE) != _TRUE)&& ((BtState == BT_INFO_STATE_NO_CONNECTION) || (BtState == BT_INFO_STATE_CONNECT_IDLE))) { switch (BtState) @@ -8866,7 +8969,7 @@ void btdm_1AntCoexProcessForWifiConnect(PADAPTER padapter) _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 0x26, _FALSE, 9); break; case BT_INFO_STATE_CONNECT_IDLE: - _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 0x26, _FALSE, 0); + _btdm_1AntSetPSTDMA(padapter, _TRUE, 2, 0x26, _FALSE, 9); break; } } @@ -8898,13 +9001,11 @@ void btdm_1AntCoexProcessForWifiConnect(PADAPTER padapter) case BT_INFO_STATE_CONNECT_IDLE: // WiFi is Busy btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 5); - rtw_write32(padapter, 0x6c0, 0x5a5a5a5a); - rtw_write32(padapter, 0x6c4, 0x5a5a5a5a); break; case BT_INFO_STATE_ACL_INQ_OR_PAG: RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is BT_INFO_STATE_ACL_INQ_OR_PAG\n")); case BT_INFO_STATE_INQ_OR_PAG: - padapter->pwrctrlpriv.btcoex_rfon = _TRUE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _TRUE; btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 30); break; case BT_INFO_STATE_SCO_ONLY_BUSY: @@ -8917,14 +9018,17 @@ void btdm_1AntCoexProcessForWifiConnect(PADAPTER padapter) btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 23); #else // !BTCOEX_CMCC_TEST btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 8); - rtw_write32(padapter, 0x6c0, 0x5a5a5a5a); - rtw_write32(padapter, 0x6c4, 0x5a5a5a5a); #endif // !BTCOEX_CMCC_TEST } break; case BT_INFO_STATE_ACL_ONLY_BUSY: - padapter->pwrctrlpriv.btcoex_rfon = _TRUE; - if (pBtCoex->c2hBtProfile == BT_INFO_HID) + adapter_to_pwrctl(padapter)->btcoex_rfon = _TRUE; + if (!BTDM_IsWifiBusy(padapter)) { + //WiFi LPS + btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 37); + + } + else if (pBtCoex->c2hBtProfile == BT_INFO_HID) { RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is HID\n")); btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 31); @@ -8939,17 +9043,37 @@ void btdm_1AntCoexProcessForWifiConnect(PADAPTER padapter) RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP_FTP\n")); btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 11); } + else if (pBtCoex->c2hBtProfile == (BT_INFO_A2DP|BT_INFO_HID)) + { + RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP_HID\n")); + btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 11); + } + else if (pBtCoex->c2hBtProfile == (BT_INFO_FTP|BT_INFO_HID)) + { + RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is FTP_HID\n")); + btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 11); + } else { if (pBtCoex->c2hBtProfile == BT_INFO_A2DP) { RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP\n")); + RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP pBtCoex->AclTp=0x%x lowPriorityTx=%d\n",pBtCoex->AclTp,pHalData->bt_coexist.halCoex8723.lowPriorityTx)); + if(pBtCoex->AclTp > 0x3000 ||pHalData->bt_coexist.halCoex8723.lowPriorityTx >1000) + { + RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is A2DP change to A2DP+OPP, pBtCoex->AclTp=0x%x lowPriorityTx=%d\n",pBtCoex->AclTp,pHalData->bt_coexist.halCoex8723.lowPriorityTx)); + btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 11); + } + else{ + btdm_1AntTdmaDurationAdjustForACL(padapter); + } } else { RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT PROFILE is UNKNOWN(0x%02X)! Use A2DP Profile\n", pBtCoex->c2hBtProfile)); + btdm_1AntTdmaDurationAdjustForACL(padapter); } - btdm_1AntTdmaDurationAdjustForACL(padapter); + } break; } @@ -9114,7 +9238,7 @@ void btdm_1AntBTStateChangeHandler(PADAPTER padapter, BT_STATE_1ANT oldState, BT btdm_SetFwIgnoreWlanAct(padapter, _FALSE); } - if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) && + if ((BTDM_CheckFWState(padapter, WIFI_STATION_STATE) == _TRUE) && (BTDM_IsWifiConnectionExist(padapter) == _TRUE)) { if ((newState == BT_INFO_STATE_SCO_ONLY_BUSY) || @@ -9185,7 +9309,7 @@ void btdm_1AntBtCoexistHandler(PADAPTER padapter) pHalData = GET_HAL_DATA(padapter); pBtCoex8723 = &pHalData->bt_coexist.halCoex8723; pBtdm8723 = &pBtCoex8723->btdm1Ant; - padapter->pwrctrlpriv.btcoex_rfon = _FALSE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _FALSE; if (BT_IsBtDisabled(padapter) == _TRUE) { RTPRINT(FBT, BT_TRACE, ("[BTCoex], BT is disabled\n")); @@ -9403,8 +9527,6 @@ void BTDM_1AntWifiAssociateNotify(PADAPTER padapter, u8 type) (BtState == BT_INFO_STATE_ACL_SCO_BUSY)) { btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _FALSE, 8); - rtw_write32(padapter, 0x6c0, 0x5a5a5a5a); - rtw_write32(padapter, 0x6c4, 0x5a5a5a5a); } else if ((BtState == BT_INFO_STATE_ACL_ONLY_BUSY) || (BtState == BT_INFO_STATE_ACL_INQ_OR_PAG)) @@ -9445,7 +9567,7 @@ void BTDM_1AntMediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus) if (RT_MEDIA_CONNECT == mstatus) { - if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE) + if (BTDM_CheckFWState(padapter, WIFI_STATION_STATE) == _TRUE) { if ((pBtCoex->c2hBtInfo == BT_INFO_STATE_SCO_ONLY_BUSY) || (pBtCoex->c2hBtInfo == BT_INFO_STATE_ACL_SCO_BUSY)) @@ -9454,7 +9576,7 @@ void BTDM_1AntMediaStatusNotify(PADAPTER padapter, RT_MEDIA_STATUS mstatus) } } - padapter->pwrctrlpriv.DelayLPSLastTimeStamp = rtw_get_current_time(); + adapter_to_pwrctl(padapter)->DelayLPSLastTimeStamp = rtw_get_current_time(); BTDM_1AntForDhcp(padapter); } else @@ -9486,7 +9608,8 @@ void BTDM_1AntForDhcp(PADAPTER padapter) #if 1 - BTDM_1AntWifiAssociateNotify(padapter, _TRUE); + //BTDM_1AntWifiAssociateNotify(padapter, _TRUE); + RTPRINT(FBT, BT_TRACE, ("\n[BTCoex], 1Ant for DHCP SKIP~~~~~\n")); #else @@ -9509,7 +9632,7 @@ void BTDM_1AntForDhcp(PADAPTER padapter) } else if (BtState == BT_INFO_STATE_ACL_ONLY_BUSY) { - padapter->pwrctrlpriv.btcoex_rfon = _TRUE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _TRUE; if(padapter->securitypriv.ndisencryptstatus != Ndis802_11EncryptionDisabled) { btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 18); @@ -9579,18 +9702,18 @@ void BTDM_1AntWifiScanNotify(PADAPTER padapter, u8 scanType) btdm_1AntSetPSTDMA(padapter, _FALSE, 0, _TRUE, 32); else { - padapter->pwrctrlpriv.btcoex_rfon = _TRUE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _TRUE; btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 33); } } else if (_TRUE == pBtCoex->bC2hBtInquiryPage) { - padapter->pwrctrlpriv.btcoex_rfon = _TRUE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _TRUE; btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 30); } else if (BtState == BT_INFO_STATE_ACL_ONLY_BUSY) { - padapter->pwrctrlpriv.btcoex_rfon = _TRUE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _TRUE; if (pBtCoex->c2hBtProfile == BT_INFO_HID) btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 34); else @@ -9598,7 +9721,7 @@ void BTDM_1AntWifiScanNotify(PADAPTER padapter, u8 scanType) } else { - padapter->pwrctrlpriv.btcoex_rfon = _TRUE; + adapter_to_pwrctl(padapter)->btcoex_rfon = _TRUE; btdm_1AntSetPSTDMA(padapter, _TRUE, 0, _TRUE, 5); } } @@ -9655,6 +9778,10 @@ void BTDM_1AntFwC2hBtInfo8723A(PADAPTER padapter) if (btState == 0x1) { pBtCoex->c2hBtInfo = BT_INFO_STATE_CONNECT_IDLE; + if (pBtCoex->c2hBtProfile) + { + pBtCoex->c2hBtInfo = BT_INFO_STATE_ACL_ONLY_BUSY; + } } else if (btState == 0x9) { @@ -9692,28 +9819,26 @@ void BTDM_1AntFwC2hBtInfo8723A(PADAPTER padapter) RTPRINT(FBT, BT_TRACE, ("[BTC2H], %s(%d)\n", BtStateString[pBtCoex->c2hBtInfo], pBtCoex->c2hBtInfo)); - if(pBtCoex->c2hBtProfile != BT_INFO_HID) - pBtCoex->c2hBtProfile &= ~BT_INFO_HID; +// if(pBtCoex->c2hBtProfile != BT_INFO_HID) +// pBtCoex->c2hBtProfile &= ~BT_INFO_HID; } void BTDM_1AntBtCoexist8723A(PADAPTER padapter) { - struct mlme_priv *pmlmepriv; PHAL_DATA_TYPE pHalData; u32 curr_time, delta_time; - pmlmepriv = &padapter->mlmepriv; pHalData = GET_HAL_DATA(padapter); - if (check_fwstate(pmlmepriv, WIFI_SITE_MONITOR) == _TRUE) + if (BTDM_CheckFWState(padapter, WIFI_SITE_MONITOR) == _TRUE) { // already done in BTDM_1AntForScan() RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is under scan progress!!\n")); return; } - if (check_fwstate(pmlmepriv, WIFI_UNDER_LINKING) == _TRUE) + if (BTDM_CheckFWState(padapter, WIFI_UNDER_LINKING) == _TRUE) { RTPRINT(FBT, BT_TRACE, ("[BTCoex], wifi is under link progress!!\n")); return; @@ -9721,7 +9846,7 @@ void BTDM_1AntBtCoexist8723A(PADAPTER padapter) // under DHCP(Special packet) curr_time = rtw_get_current_time(); - delta_time = curr_time - padapter->pwrctrlpriv.DelayLPSLastTimeStamp; + delta_time = curr_time - adapter_to_pwrctl(padapter)->DelayLPSLastTimeStamp; delta_time = rtw_systime_to_ms(delta_time); if (delta_time < 500) // 500ms { @@ -10321,8 +10446,8 @@ void btdm_2AntCoexTable( PADAPTER padapter,u32 val0x6c0,u32 val0x6c8,u8 val0x6cc PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant; - RTPRINT(FBT, BT_TRACE, ("[BTCoex], write Coex Table 0x6c0=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", - val0x6c0, val0x6c8, val0x6cc)); +// RTPRINT(FBT, BT_TRACE, ("[BTCoex], write Coex Table 0x6c0=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n", +// val0x6c0, val0x6c8, val0x6cc)); pBtdm8723->curVal0x6c0 = val0x6c0; pBtdm8723->curVal0x6c8 = val0x6c8; pBtdm8723->curVal0x6cc = val0x6cc; @@ -10361,6 +10486,33 @@ void btdm_2AntIgnoreWlanAct(PADAPTER padapter,u8 bEnable) btdm_SetFwIgnoreWlanAct(padapter,bEnable); pBtdm8723->bPreIgnoreWlanAct = pBtdm8723->bCurIgnoreWlanAct; } +void btdm_2AntSetTable(PADAPTER padapter,u8 byte){ + u8 value; + u32 val0x6c0,val0x6c4; + value =(byte&(BIT4|BIT3))>>3; + + switch(value){ + case 0: + val0x6c0=0x55555555; + val0x6c4=0x55555555; + break; + case 1: + val0x6c0=0x55555555; + val0x6c4=0x5afa5afa; + break; + case 2: + val0x6c0=0x55ff55ff; + val0x6c4=0x5a5a5a5a; + break; + case 3: + val0x6c0=0x55ff55ff; + val0x6c4=0x5afa5afa; + break; + } + RTPRINT(FBT, BT_TRACE, ("set coex table, set 0x6c0=0x%x 0x6c4=0x%x\n", val0x6c0, val0x6c4)); + rtw_write32(padapter, 0x6c0, val0x6c0); + rtw_write32(padapter, 0x6c4, val0x6c4); +} void btdm_2AntSetFw3a(PADAPTER padapter,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 byte5) { @@ -10391,6 +10543,7 @@ void btdm_2AntSetFw3a(PADAPTER padapter,u8 byte1,u8 byte2,u8 byte3,u8 byte4,u8 H2C_Parameter[1]<<24|H2C_Parameter[2]<<16|H2C_Parameter[3]<<8|H2C_Parameter[4])); FillH2CCmd(padapter, 0x3a, 5, H2C_Parameter); + btdm_2AntSetTable(padapter,byte5); // Driver need to set the Coex Table value after FW version 35. } void btdm_2AntPsTdma(PADAPTER padapter,u8 bTurnOn,u8 type) @@ -10434,64 +10587,64 @@ void btdm_2AntPsTdma(PADAPTER padapter,u8 bTurnOn,u8 type) { case 1: default: - btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0xe1, 0x98); break; case 2: - btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0xe1, 0x98); break; case 3: - btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0xe1, 0x98); break; case 4: - btdm_2AntSetFw3a(padapter, 0xa3, 0x5, 0x5, 0xa1, 0x80); + btdm_2AntSetFw3a(padapter, 0xa3, 0x5, 0x5, 0xe1, 0x80); break; case 5: - btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x60, 0x98); break; case 6: - btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0x60, 0x98); break; case 7: - btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0x60, 0x98); break; case 8: - btdm_2AntSetFw3a(padapter, 0xa3, 0x5, 0x5, 0x20, 0x80); + btdm_2AntSetFw3a(padapter, 0xa3, 0x5, 0x5, 0x60, 0x80); break; case 9: - btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0xe1, 0x98); break; case 10: - btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0xe1, 0x98); break; case 11: - btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0xe1, 0x98); break; case 12: - btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0xe1, 0x98); break; case 13: - btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x1a, 0x1a, 0x60, 0x98); break; case 14: - btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x12, 0x12, 0x60, 0x98); break; case 15: - btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0xa, 0xa, 0x60, 0x98); break; case 16: - btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0x60, 0x98); break; case 17: - btdm_2AntSetFw3a(padapter, 0xa3, 0x2f, 0x2f, 0x20, 0x80); + btdm_2AntSetFw3a(padapter, 0xa3, 0x2f, 0x2f, 0x60, 0x80); break; case 18: - btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x5, 0x5, 0xe1, 0x98); break; case 19: - btdm_2AntSetFw3a(padapter, 0xe3, 0x25, 0x25, 0xa1, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x25, 0x25, 0xe1, 0x98); break; case 20: - btdm_2AntSetFw3a(padapter, 0xe3, 0x25, 0x25, 0x20, 0x98); + btdm_2AntSetFw3a(padapter, 0xe3, 0x25, 0x25, 0x60, 0x98); break; } } @@ -10572,11 +10725,11 @@ u8 btdm_Is2Ant8723ACommonAction(PADAPTER padapter) PBTDM_8723A_2ANT pBtdm8723 = &pHalData->bt_coexist.halCoex8723.btdm2Ant; u8 bCommon=_FALSE; - RTPRINT(FBT, BT_TRACE, ("%s :BTDM_IsWifiConnectionExist =%x check_fwstate=%x pmlmepriv->fw_state=0x%x\n",__func__,BTDM_IsWifiConnectionExist(padapter),check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING)),padapter->mlmepriv.fw_state)); + RTPRINT(FBT, BT_TRACE, ("%s :BTDM_IsWifiConnectionExist =%x BTDM_CheckFWState=%x pmlmepriv->fw_state=0x%x\n",__func__,BTDM_IsWifiConnectionExist(padapter),BTDM_CheckFWState(padapter, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING)),padapter->mlmepriv.fw_state)); // if(!BTDM_IsWifiBusy(padapter) && - if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&& + if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(BTDM_CheckFWState(padapter, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&& (BT_2ANT_BT_STATUS_IDLE == pBtdm8723->btStatus) ) { RTPRINT(FBT, BT_TRACE, ("Wifi idle + Bt idle!!\n")); @@ -10597,7 +10750,7 @@ u8 btdm_Is2Ant8723ACommonAction(PADAPTER padapter) bCommon = _TRUE; } // else if( BTDM_IsWifiBusy(padapter) && - else if(((BTDM_IsWifiConnectionExist(padapter) == _TRUE)||(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE))&& + else if(((BTDM_IsWifiConnectionExist(padapter) == _TRUE)||(BTDM_CheckFWState(padapter, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE))&& (BT_2ANT_BT_STATUS_IDLE == pBtdm8723->btStatus) ) { RTPRINT(FBT, BT_TRACE, ("Wifi non-idle + BT idle!!\n")); @@ -10618,7 +10771,7 @@ u8 btdm_Is2Ant8723ACommonAction(PADAPTER padapter) bCommon = _TRUE; } // else if(!BTDM_IsWifiBusy(padapter) && - else if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&& + else if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(BTDM_CheckFWState(padapter, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&& (BT_2ANT_BT_STATUS_CONNECTED_IDLE == pBtdm8723->btStatus) ) { RTPRINT(FBT, BT_TRACE, ("Wifi idle + Bt connected idle!!\n")); @@ -10639,7 +10792,7 @@ u8 btdm_Is2Ant8723ACommonAction(PADAPTER padapter) bCommon = _TRUE; } // else if(BTDM_IsWifiBusy(padapter) && - else if(((BTDM_IsWifiConnectionExist(padapter) == _TRUE)||(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE))&& + else if(((BTDM_IsWifiConnectionExist(padapter) == _TRUE)||(BTDM_CheckFWState(padapter, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _TRUE))&& (BT_2ANT_BT_STATUS_CONNECTED_IDLE == pBtdm8723->btStatus) ) { RTPRINT(FBT, BT_TRACE, ("Wifi non-idle + Bt connected idle!!\n")); @@ -10660,7 +10813,7 @@ u8 btdm_Is2Ant8723ACommonAction(PADAPTER padapter) bCommon = _TRUE; } // else if(!BTDM_IsWifiBusy(padapter) && - else if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(check_fwstate(&padapter->mlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&& + else if((BTDM_IsWifiConnectionExist(padapter) == _FALSE)&&(BTDM_CheckFWState(padapter, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING))== _FALSE)&& (BT_2ANT_BT_STATUS_NON_IDLE == pBtdm8723->btStatus) ) { RTPRINT(FBT, BT_TRACE, ("Wifi idle + BT non-idle!!\n")); @@ -11573,7 +11726,7 @@ void btdm_2AntTdmaDurationAdjust(PADAPTER padapter,u8 bScoHid,u8 bTxPause,u8 RTPRINT(FBT, BT_TRACE, ("[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n", pBtdm8723->curPsTdma, pBtdm8723->psTdmaDuAdjType)); - if( check_fwstate(&padapter->mlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _FALSE ) + if( BTDM_CheckFWState(padapter, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == _FALSE ) { btdm_2AntPsTdma(padapter, _TRUE, pBtdm8723->psTdmaDuAdjType); } @@ -13362,6 +13515,22 @@ u8 btdm_BtWifiAntNum(PADAPTER padapter) return Ant_x2; } +u8 btdm_GetBtState(PADAPTER padapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + PBT_COEXIST_8723A pBtCoex = &pHalData->bt_coexist.halCoex8723; + + return pBtCoex->c2hBtInfo; +} + +u8 btdm_IsBtInquiryPage(PADAPTER padapter) +{ + PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); + PBT_COEXIST_8723A pBtCoex = &pHalData->bt_coexist.halCoex8723; + + return pBtCoex->bC2hBtInquiryPage; +} + void btdm_BtHwCountersMonitor(PADAPTER padapter) { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); @@ -13580,7 +13749,7 @@ void BTDM_SetFwChnlInfo(PADAPTER padapter, RT_MEDIA_STATUS mstatus) H2C_Parameter[0] = 0x1; // 0: disconnected, 1:connected } - if (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE) + if (BTDM_CheckFWState(padapter, WIFI_ASOC_STATE) == _TRUE) { // channel chnl = pmlmeext->cur_channel; @@ -13619,7 +13788,10 @@ void BTDM_SetFwChnlInfo(PADAPTER padapter, RT_MEDIA_STATUS mstatus) // RTPRINT(FBT, BT_TRACE, ("[BTCoex], FW write 0x19=0x%x\n", // H2C_Parameter[0]<<16|H2C_Parameter[1]<<8|H2C_Parameter[2])); - FillH2CCmd(padapter, 0x19, 3, H2C_Parameter); + if (btdm_BtWifiAntNum(padapter) == Ant_x2) + { + FillH2CCmd(padapter, 0x19, 3, H2C_Parameter); + } } u8 BTDM_IsWifiConnectionExist(PADAPTER padapter) @@ -13630,8 +13802,21 @@ u8 BTDM_IsWifiConnectionExist(PADAPTER padapter) if (BTHCI_HsConnectionEstablished(padapter)) bRet = _TRUE; - if (check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE) +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->pbuddy_adapter != NULL) + { + if ((BTDM_CheckFWState(padapter, WIFI_ASOC_STATE) == _TRUE) || (BTDM_CheckFWState(padapter->pbuddy_adapter, WIFI_ASOC_STATE) == _TRUE)) + bRet = _TRUE; + } + else + { + if (BTDM_CheckFWState(padapter, WIFI_ASOC_STATE) == _TRUE) + bRet = _TRUE; + } +#else + if (BTDM_CheckFWState(padapter, WIFI_ASOC_STATE) == _TRUE) bRet = _TRUE; +#endif return bRet; } @@ -13649,7 +13834,7 @@ void BTDM_SetFw3a( if (BTDM_1Ant8723A(padapter) == _TRUE) { - if ((check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _FALSE) && + if ((BTDM_CheckFWState(padapter, WIFI_STATION_STATE) == _FALSE) && (get_fwstate(&padapter->mlmepriv) != WIFI_NULL_STATE)) // for softap mode { PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); @@ -13859,6 +14044,7 @@ void BTDM_FwC2hBtInfo8723A(PADAPTER padapter, u8 *tmpBuf, u8 length) RTPRINT(FBT, BT_TRACE, ("[BTC2H], BT info[%d]=[", length)); pBtCoex->btRetryCnt = 0; + pBtCoex->AclTp=0; for (i=0; i<length; i++) { switch (i) @@ -13873,8 +14059,14 @@ void BTDM_FwC2hBtInfo8723A(PADAPTER padapter, u8 *tmpBuf, u8 length) BTDM_FwC2hBtRssi8723A(padapter, &tmpBuf[i]); break; case 3: - pBtCoex->btInfoExt=tmpBuf[i]&BIT(0); + pBtCoex->btInfoExt=tmpBuf[i]&BIT(0); //EDR_BR break; + case 4: + pBtCoex->AclTp=tmpBuf[i]; + break; + case 5: + pBtCoex->AclTp |=(tmpBuf[i]<<8); + break; } if (i == length-1) @@ -14328,6 +14520,16 @@ void BTDM_BTCoexist8723A(PADAPTER padapter) BTDM_QueryBtInformation(padapter); } +u8 BTDM_GetBtState8723A(PADAPTER padapter) +{ + return btdm_GetBtState(padapter); +} + +u8 BTDM_IsBtInquiryPage8723A(PADAPTER padapter) +{ + return btdm_IsBtInquiryPage(padapter); +} + // ===== End of sync from SD7 driver HAL/BTCoexist/HalBtc8723.c ===== #endif @@ -15239,7 +15441,7 @@ void BTDM_CheckBTIdleChange1Ant(PADAPTER padapter) MgntIsLinkInProgress(pMgntInfo) || MgntScanInProgress(pMgntInfo)) #else - if (check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _TRUE) + if (BTDM_CheckFWState(padapter, WIFI_UNDER_LINKING|WIFI_SITE_MONITOR) == _TRUE) #endif { BTDM_SetAntenna(padapter, BTDM_ANT_WIFI); @@ -18164,16 +18366,14 @@ void BTDM_CheckWiFiState(PADAPTER padapter) s32 BTDM_GetRxSS(PADAPTER padapter) { // PMGNT_INFO pMgntInfo = &padapter->MgntInfo; - struct mlme_priv *pmlmepriv; PHAL_DATA_TYPE pHalData; s32 UndecoratedSmoothedPWDB = 0; - pmlmepriv = &padapter->mlmepriv; pHalData = GET_HAL_DATA(padapter); // if (pMgntInfo->bMediaConnect) // Default port - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + if (BTDM_CheckFWState(padapter, _FW_LINKED) == _TRUE) { UndecoratedSmoothedPWDB = GET_UNDECORATED_AVERAGE_RSSI(padapter); } @@ -18189,16 +18389,14 @@ s32 BTDM_GetRxSS(PADAPTER padapter) s32 BTDM_GetRxBeaconSS(PADAPTER padapter) { // PMGNT_INFO pMgntInfo = &padapter->MgntInfo; - struct mlme_priv *pmlmepriv; PHAL_DATA_TYPE pHalData; s32 pwdbBeacon = 0; - pmlmepriv = &padapter->mlmepriv; pHalData = GET_HAL_DATA(padapter); // if (pMgntInfo->bMediaConnect) // Default port - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) + if (BTDM_CheckFWState(padapter, _FW_LINKED) == _TRUE) { //pwdbBeacon = pHalData->dmpriv.UndecoratedSmoothedBeacon; pwdbBeacon= pHalData->dmpriv.EntryMinUndecoratedSmoothedPWDB; @@ -18666,7 +18864,7 @@ u8 BTDM_DisableEDCATurbo(PADAPTER padapter) if ((pHalData->bt_coexist.last_aggr_num != aggr_num) || !pHalData->bt_coexist.bEDCAInitialized) { RTPRINT(FBT, BT_TRACE, ("BT write AGGR NUM = 0x%x\n", aggr_num)); - rtw_write16(padapter, REG_MAX_AGGR_NUM, aggr_num); + rtw_write8(padapter, REG_MAX_AGGR_NUM, aggr_num); pHalData->bt_coexist.last_aggr_num = aggr_num; } } @@ -18893,7 +19091,7 @@ void BTDM_TurnOffBtCoexistBeforeEnterLPS(PADAPTER padapter) PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt; PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); // PRT_POWER_SAVE_CONTROL pPSC = GET_POWER_SAVE_CONTROL(pMgntInfo); - struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv; + struct pwrctrl_priv *ppwrctrl = adapter_to_pwrctl(padapter); // Add temporarily. @@ -18928,7 +19126,7 @@ void BTDM_TurnOffBtCoexistBeforeEnterIPS(PADAPTER padapter) PBT_MGNT pBtMgnt = &pBTInfo->BtMgnt; PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); // PRT_POWER_SAVE_CONTROL pPSC = GET_POWER_SAVE_CONTROL(pMgntInfo); - struct pwrctrl_priv *ppwrctrl = &padapter->pwrctrlpriv; + struct pwrctrl_priv *ppwrctrl = adapter_to_pwrctl(padapter); if (!pHalData->bt_coexist.BluetoothCoexist) return; @@ -19008,6 +19206,9 @@ void dm_CheckBTState(_adapter *pAdapter) rtw_write8(pAdapter, 0xf6, value); rtw_write8(pAdapter, 0x3A, 0x31); } + else{ + return; + } regvalue32 = rtw_read32(pAdapter, 0xc0); //DBG_871X("Get 0xc0 = 0x%x\n",regvalue32); @@ -19016,6 +19217,9 @@ void dm_CheckBTState(_adapter *pAdapter) value |= 0x4; rtw_write8(pAdapter, 0xcc, value); } + else{ + return; + } regValue8 = rtw_read8(pAdapter, 0x6b); //0x6b[28] //DBG_871X("Get 0x6b = 0x%x\n",regValue8); @@ -19042,6 +19246,7 @@ void check_bt_status_work(void *data) { struct delayed_work *dwork; PADAPTER padapter; + struct pwrctrl_priv *pwrpriv ; dwork = container_of(data, struct delayed_work, work); padapter = container_of(dwork, struct _ADAPTER, checkbt_work); @@ -19051,7 +19256,9 @@ void check_bt_status_work(void *data) return; }; - dm_CheckBTState(padapter); + pwrpriv = adapter_to_pwrctl(padapter); + if (pwrpriv->bInSuspend == _FALSE) + dm_CheckBTState(padapter); } #endif void BTDM_Coexist(PADAPTER padapter) @@ -19261,8 +19468,33 @@ u8 BTDM_IsWifiBusy(PADAPTER padapter) PBT30Info pBTInfo = GET_BT_INFO(padapter); PBT_TRAFFIC pBtTraffic = &pBTInfo->BtTraffic; +#ifdef CONFIG_CONCURRENT_MODE + struct mlme_priv *pbuddy_mlmepriv; + + if (padapter->pbuddy_adapter != NULL) + { + pbuddy_mlmepriv = &(padapter->pbuddy_adapter->mlmepriv); + +#if 1 + if ((btdm_BtWifiAntNum(padapter) == Ant_x1) && ((BT_IsBtDisabled(padapter) == _TRUE) || ((BT_IsBtDisabled(padapter) == _FALSE && (BT_GetBtState(padapter) <= BT_INFO_STATE_CONNECT_IDLE))))) + { + if (((padapter->iface_type == IFACE_PORT0) && (check_fwstate(pbuddy_mlmepriv, _FW_LINKED) == _TRUE)) || + ((padapter->iface_type == IFACE_PORT1) && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE))) + return _TRUE; + } +#endif + + if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > WIFI_BUSY_TRAFFIC_TH ||pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > WIFI_BUSY_TRAFFIC_TH || + pbuddy_mlmepriv->LinkDetectInfo.NumRxOkInPeriod > WIFI_BUSY_TRAFFIC_TH || pbuddy_mlmepriv->LinkDetectInfo.NumTxOkInPeriod > WIFI_BUSY_TRAFFIC_TH || + pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic || + pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic) + return _TRUE; + else + return _FALSE; + } +#endif - if (pmlmepriv->LinkDetectInfo.bBusyTraffic || + if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > WIFI_BUSY_TRAFFIC_TH ||pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > WIFI_BUSY_TRAFFIC_TH || pBtTraffic->Bt30TrafficStatistics.bTxBusyTraffic || pBtTraffic->Bt30TrafficStatistics.bRxBusyTraffic) return _TRUE; @@ -19707,6 +19939,25 @@ u8 BTDM_IsBtDisabled(PADAPTER padapter) return _FALSE; } +sint BTDM_CheckFWState(PADAPTER padapter, sint state) +{ + if (check_fwstate(&padapter->mlmepriv, state) == _FALSE) + { +#ifdef CONFIG_CONCURRENT_MODE + if (padapter->pbuddy_adapter != NULL) + { + if (check_fwstate(&padapter->pbuddy_adapter->mlmepriv, state) == _TRUE) + { + return _TRUE; + } + } +#endif + return _FALSE; + } + + return _TRUE; +} + //============================================ // Started with "WA_" means this is a work around function. // Because fw need to count bt HW counters |