/* * SoftGemini.c * * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name Texas Instruments nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** \file softGemini.c * \brief BlueTooth-Wlan coexistence module interface * * \see softGemini.h */ /**************************************************************************************************** * * * MODULE: softGemini.c * * PURPOSE: BlueTooth-Wlan coexistence module interface. * * This module handles all data base (and Fw setting accordingly) * * for Bluetooth-Wlan coexistence implementation. * * * ****************************************************************************************************/ #define __FILE_ID__ FILE_ID_5 #include "report.h" #include "osApi.h" #include "SoftGemini.h" #include "DataCtrl_Api.h" #include "scrApi.h" #include "PowerMgr_API.h" #include "ScanCncn.h" #include "currBss.h" #include "CmdDispatcher.h" #include "TWDriver.h" #include "DrvMainModules.h" #include "bssTypes.h" #include "sme.h" #define SENSE_MODE_ENABLE 0x01 #define SENSE_MODE_DISABLE 0x00 #define PROTECTIVE_MODE_ON 0x01 #define PROTECTIVE_MODE_OFF 0x00 /********************************************************************************/ /* Internal functions prototypes. */ /********************************************************************************/ static TI_STATUS SoftGemini_setEnableParam(TI_HANDLE hSoftGemini, ESoftGeminiEnableModes SoftGeminiEnable, TI_BOOL recovery); static TI_STATUS SoftGemini_setParamsToFW(TI_HANDLE hSoftGemini, TSoftGeminiParams *SoftGeminiParam); static TI_STATUS SoftGemini_EnableDriver(TI_HANDLE hSoftGemini); static TI_STATUS SoftGemini_DisableDriver(TI_HANDLE hSoftGemini); static TI_STATUS SoftGemini_SetPS(SoftGemini_t *pSoftGemini); static TI_STATUS SoftGemini_unSetPS(SoftGemini_t *pSoftGemini); static void SoftGemini_RemoveProtectiveModeParameters(TI_HANDLE hSoftGemini); static void SoftGemini_setConfigParam(TI_HANDLE hSoftGemini, TI_UINT32 *param); static void SoftGemini_EnableProtectiveMode(TI_HANDLE hSoftGemini); static void SoftGemini_DisableProtectiveMode(TI_HANDLE hSoftGemini); #ifdef REPORT_LOG static char* SoftGemini_ConvertModeToString(ESoftGeminiEnableModes SoftGeminiEnable); #endif /********************************************************************************/ /* Interface functions Implementation. */ /********************************************************************************/ /************************************************************************ * SoftGemini_SetPSmode * ************************************************************************ DESCRIPTION: SoftGemini module, called by the conn_Infra on connection performs the following: - Enables SG if needed - Enables the SG power mode INPUT: hSoftGemini - Handle to SoftGemini OUTPUT: RETURN: ************************************************************************/ void SoftGemini_SetPSmode(TI_HANDLE hSoftGemini) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; if (pSoftGemini) { if (pSoftGemini->bDriverEnabled) { /* Check if coexAutoPsMode is enabled to enter/exit P.S */ if ( pSoftGemini->SoftGeminiParam.coexParams[SOFT_GEMINI_AUTO_PS_MODE]) { SoftGemini_SetPS(pSoftGemini); } } if (pSoftGemini->bProtectiveMode) { SoftGemini_EnableProtectiveMode(hSoftGemini); } } else { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_ERROR, " SoftGemini_SetPSmode() - Error hSoftGemini= NULL \n"); } } /************************************************************************ * SoftGemini_unSetPSmode * ************************************************************************ DESCRIPTION: SoftGemini module, called by the conn_Infra after disconnecting performs the following: - Disables the SG - Disables the SG power mode INPUT: hSoftGemini - Handle to SoftGemini OUTPUT: RETURN: ************************************************************************/ void SoftGemini_unSetPSmode(TI_HANDLE hSoftGemini) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; if (pSoftGemini) { if (pSoftGemini->bDriverEnabled) { /* Check if coexAutoPsMode is enabled to enter/exit P.S */ if ( pSoftGemini->SoftGeminiParam.coexParams[SOFT_GEMINI_AUTO_PS_MODE]) { SoftGemini_unSetPS(pSoftGemini); } } if (pSoftGemini->bProtectiveMode) { SoftGemini_RemoveProtectiveModeParameters(hSoftGemini); } } else { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_ERROR, " SoftGemini_unSetPSmode() - Error hSoftGemini= NULL \n"); } } /************************************************************************ * SoftGemini_create * ************************************************************************ DESCRIPTION: SoftGemini module creation function, called by the config mgr in creation phase performs the following: - Allocate the SoftGemini handle INPUT: hOs - Handle to OS OUTPUT: RETURN: Handle to the SoftGemini module on success, NULL otherwise ************************************************************************/ TI_HANDLE SoftGemini_create(TI_HANDLE hOs) { SoftGemini_t *pSoftGemini = NULL; /* allocating the SoftGemini object */ pSoftGemini = os_memoryAlloc(hOs,sizeof(SoftGemini_t)); if (pSoftGemini == NULL) return NULL; pSoftGemini->hOs = hOs; return pSoftGemini; } /************************************************************************ * SoftGemini_config * ************************************************************************ DESCRIPTION: SoftGemini module init function, called by the rvMain in init phase performs the following: - Init local variables - Init the handles to be used by the module INPUT: pStadHandles - The driver modules handles OUTPUT: RETURN: void ************************************************************************/ void SoftGemini_init (TStadHandlesList *pStadHandles) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)(pStadHandles->hSoftGemini); pSoftGemini->hCtrlData = pStadHandles->hCtrlData; pSoftGemini->hTWD = pStadHandles->hTWD; pSoftGemini->hReport = pStadHandles->hReport; pSoftGemini->hSCR = pStadHandles->hSCR; pSoftGemini->hPowerMgr = pStadHandles->hPowerMgr; pSoftGemini->hCmdDispatch = pStadHandles->hCmdDispatch; pSoftGemini->hScanCncn = pStadHandles->hScanCncn; pSoftGemini->hCurrBss = pStadHandles->hCurrBss; pSoftGemini->hSme = pStadHandles->hSme; } TI_STATUS SoftGemini_SetDefaults (TI_HANDLE hSoftGemini, SoftGeminiInitParams_t *pSoftGeminiInitParams) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; TI_UINT8 i =0; TI_STATUS status; /*************************************/ /* Getting SoftGemini init Params */ /***********************************/ pSoftGemini->SoftGeminiEnable = pSoftGeminiInitParams->SoftGeminiEnable; for (i =0; i< SOFT_GEMINI_PARAMS_MAX ; i++) { pSoftGemini->SoftGeminiParam.coexParams[i] = pSoftGeminiInitParams->coexParams[i]; } pSoftGemini->SoftGeminiParam.paramIdx = 0xFF; /* signals to FW to config all the paramters */ /* Send the configuration to the FW */ status = SoftGemini_setParamsToFW(hSoftGemini, &pSoftGemini->SoftGeminiParam); /*******************************/ /* register Indication interrupts */ /*****************************/ TWD_RegisterEvent (pSoftGemini->hTWD, TWD_OWN_EVENT_SOFT_GEMINI_SENSE, (void *)SoftGemini_SenseIndicationCB, hSoftGemini); TWD_RegisterEvent (pSoftGemini->hTWD, TWD_OWN_EVENT_SOFT_GEMINI_PREDIC, (void *)SoftGemini_ProtectiveIndicationCB, hSoftGemini); TWD_EnableEvent (pSoftGemini->hTWD, TWD_OWN_EVENT_SOFT_GEMINI_SENSE); TWD_EnableEvent (pSoftGemini->hTWD, TWD_OWN_EVENT_SOFT_GEMINI_PREDIC); /* On system initialization SG is disabled but later calls to SoftGemini_setEnableParam() */ pSoftGemini->bProtectiveMode = TI_FALSE; pSoftGemini->SoftGeminiEnable = SG_DISABLE; pSoftGemini->bDriverEnabled = TI_FALSE; pSoftGemini->bPsPollFailureActive = TI_FALSE; if ((TI_OK == status) && (pSoftGeminiInitParams->SoftGeminiEnable != SG_DISABLE)) { /* called only if different than SG_DISABLE */ status = SoftGemini_setEnableParam(hSoftGemini, pSoftGeminiInitParams->SoftGeminiEnable, TI_FALSE); } if (status == TI_OK) { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INIT, " SoftGemini_config() - configured successfully\n"); } else { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_ERROR, " SoftGemini_config() - Error configuring module \n"); } return status; } /************************************************************************ * SoftGemini_destroy * ************************************************************************ DESCRIPTION: SoftGemini module destroy function, called by the config mgr in the destroy phase performs the following: - Free all memory aloocated by the module INPUT: hSoftGemini - SoftGemini handle. OUTPUT: RETURN: TI_OK on success, TI_NOK otherwise ************************************************************************/ TI_STATUS SoftGemini_destroy(TI_HANDLE hSoftGemini) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; if (pSoftGemini != NULL) { os_memoryFree( pSoftGemini->hOs, (TI_HANDLE)pSoftGemini , sizeof(SoftGemini_t)); } return TI_OK; } /*********************************************************************** * SoftGemini_setParam *********************************************************************** DESCRIPTION: SoftGemini set param function, called by the following: - config mgr in order to set a parameter receiving from the OS abstraction layer. - From inside the driver INPUT: hSoftGemini - SoftGemini handle. pParam - Pointer to the parameter OUTPUT: RETURN: TI_OK on success, TI_NOK otherwise ************************************************************************/ TI_STATUS SoftGemini_setParam(TI_HANDLE hSoftGemini, paramInfo_t *pParam) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; TI_STATUS return_value = TI_OK; TRACE1(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, " SoftGemini_setParam() (0x%x)\n", pParam->paramType); switch(pParam->paramType) { case SOFT_GEMINI_SET_ENABLE: return_value = SoftGemini_setEnableParam(hSoftGemini,pParam->content.SoftGeminiEnable, TI_FALSE); break; case SOFT_GEMINI_SET_CONFIG: /* copy new params to SoftGemini module */ SoftGemini_setConfigParam(hSoftGemini,pParam->content.SoftGeminiParamArray); /* set new params to FW */ return_value = SoftGemini_setParamsToFW(hSoftGemini, &(pSoftGemini->SoftGeminiParam)); if (pSoftGemini->bProtectiveMode == TI_TRUE) { /* set new configurations of scan to scancncn */ scanCncn_SGconfigureScanParams(pSoftGemini->hScanCncn,TI_TRUE, (TI_UINT8)pSoftGemini->SoftGeminiParam.coexParams[SOFT_GEMINI_AUTO_SCAN_PROBE_REQ], pSoftGemini->SoftGeminiParam.coexParams[SOFT_GEMINI_HV3_MAX_OVERRIDE], pSoftGemini->SoftGeminiParam.coexParams[SOFT_GEMINI_ACTIVE_SCAN_DURATION_FACTOR_HV3]); } break; default: TRACE1(pSoftGemini->hReport, REPORT_SEVERITY_ERROR, " SoftGemini_setParam(), Params is not supported, %d\n\n", pParam->paramType); return PARAM_NOT_SUPPORTED; } return return_value; } /*********************************************************************** * SoftGemini_getParam *********************************************************************** DESCRIPTION: SoftGemini get param function, called by the following: - config mgr in order to get a parameter from the OS abstraction layer. - From inside the dirver INPUT: hSoftGemini - SoftGemini handle. OUTPUT: pParam - Pointer to the parameter RETURN: TI_OK on success, TI_NOK otherwise ************************************************************************/ TI_STATUS SoftGemini_getParam(TI_HANDLE hSoftGemini, paramInfo_t *pParam) { switch (pParam->paramType) { case SOFT_GEMINI_GET_CONFIG: SoftGemini_printParams(hSoftGemini); break; } return TI_OK; } /*************************************************************************** * SoftGemini_setEnableParam * **************************************************************************** * DESCRIPTION: The function sets the appropriate Enable value, * configures SCR , POWER MGR , DATA CTRL , FW. * * INPUTS: pSoftGemini - the object ***************************************************************************/ static TI_STATUS SoftGemini_setEnableParam(TI_HANDLE hSoftGemini, ESoftGeminiEnableModes SoftGeminiEnable, TI_BOOL recovery) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; TTwdParamInfo param; TI_STATUS return_value = TI_OK; TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, " setSoftGeminiEnableParam() - Old value = , New value = \n"); /* * PsPoll work around is active. Just save the value and configure it later */ if ( pSoftGemini->bPsPollFailureActive ) { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, " setSoftGeminiEnableParam() - while PsPollFailure is active\n"); pSoftGemini->PsPollFailureLastEnableValue = SoftGeminiEnable; return TI_OK; } /**********************************/ /* Sanity check on enable values */ /********************************/ /* Old Value New Value */ /* | | */ /* \|/ \|/ */ if ((pSoftGemini->SoftGeminiEnable == SoftGeminiEnable) && !recovery) { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_ERROR, " - setting same value \n"); return TI_NOK; } /*******************************/ /* Make the necessary actions */ /*****************************/ switch (SoftGeminiEnable) { case SG_PROTECTIVE: case SG_OPPORTUNISTIC: /* set FW with SG_ENABLE */ param.paramType = TWD_SG_ENABLE_PARAM_ID; param.content.SoftGeminiEnable = SoftGeminiEnable; return_value = TWD_SetParam (pSoftGemini->hTWD, ¶m); break; case SG_DISABLE: /* set FW with SG_DISABLE */ param.paramType = TWD_SG_ENABLE_PARAM_ID; param.content.SoftGeminiEnable = SG_DISABLE; return_value = TWD_SetParam (pSoftGemini->hTWD, ¶m); if (pSoftGemini->bDriverEnabled) { SoftGemini_DisableDriver(hSoftGemini); } break; default: TRACE1(pSoftGemini->hReport, REPORT_SEVERITY_ERROR, " defualt :%d\n",SoftGeminiEnable); return TI_NOK; } /* Pass to the new enable state */ pSoftGemini->SoftGeminiEnable = SoftGeminiEnable; if (TI_OK != return_value) { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_ERROR, " can't configure enable param to FW :\n"); } return return_value; } /*************************************************************************** * SoftGemini_setConfigParam * **************************************************************************** * DESCRIPTION: The function sets params * * INPUTS: pSoftGemini - the object * param - params to be configured ***************************************************************************/ static void SoftGemini_setConfigParam(TI_HANDLE hSoftGemini, TI_UINT32 *param) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; /* param[0] - SG parameter index, param[1] - SG parameter value */ pSoftGemini->SoftGeminiParam.coexParams[(TI_UINT8)param[0]] = (TI_UINT32)param[1]; pSoftGemini->SoftGeminiParam.paramIdx = (TI_UINT8)param[0]; } /*************************************************************************** * SoftGemini_printParams * **************************************************************************** * DESCRIPTION: Print SG Parameters. * * INPUTS: pSoftGemini - the object ***************************************************************************/ void SoftGemini_printParams(TI_HANDLE hSoftGemini) { #ifdef REPORT_LOG SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; TSoftGeminiParams *SoftGeminiParam = &pSoftGemini->SoftGeminiParam; WLAN_OS_REPORT(("[0]: coexBtPerThreshold = %d\n", SoftGeminiParam->coexParams[SOFT_GEMINI_BT_PER_THRESHOLD])); WLAN_OS_REPORT(("[1]: coexHv3MaxOverride = %d \n", SoftGeminiParam->coexParams[SOFT_GEMINI_HV3_MAX_OVERRIDE])); WLAN_OS_REPORT(("[2]: coexBtNfsSampleInterval = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_BT_NFS_SAMPLE_INTERVAL])); WLAN_OS_REPORT(("[3]: coexBtLoadRatio = %d (%)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_BT_LOAD_RATIO])); WLAN_OS_REPORT(("[4]: coexAutoPsMode = %s \n", (SoftGeminiParam->coexParams[SOFT_GEMINI_AUTO_PS_MODE]?"Enabled":"Disabled"))); WLAN_OS_REPORT(("[5]: coexAutoScanEnlargedNumOfProbeReqPercent = %d (%)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_AUTO_SCAN_PROBE_REQ])); WLAN_OS_REPORT(("[6]: coexHv3AutoScanEnlargedScanWinodowPercent = %d (%)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_ACTIVE_SCAN_DURATION_FACTOR_HV3])); WLAN_OS_REPORT(("[7]: coexAntennaConfiguration = %s (0 = Single, 1 = Dual) \n", (SoftGeminiParam->coexParams[SOFT_GEMINI_ANTENNA_CONFIGURATION]?"Dual":"Single"))); WLAN_OS_REPORT(("[8]: coexMaxConsecutiveBeaconMissPrecent = %d (%)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_BEACON_MISS_PERCENT])); WLAN_OS_REPORT(("[9]: coexAPRateAdapationThr = %d\n", SoftGeminiParam->coexParams[SOFT_GEMINI_RATE_ADAPT_THRESH])); WLAN_OS_REPORT(("[10]: coexAPRateAdapationSnr = %d\n", SoftGeminiParam->coexParams[SOFT_GEMINI_RATE_ADAPT_SNR])); WLAN_OS_REPORT(("[11]: coexWlanPsBtAclMasterMinBR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_PS_BT_ACL_MASTER_MIN_BR])); WLAN_OS_REPORT(("[12]: coexWlanPsBtAclMasterMaxBR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_PS_BT_ACL_MASTER_MAX_BR])); WLAN_OS_REPORT(("[13]: coexWlanPsMaxBtAclMasterBR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_PS_MAX_BT_ACL_MASTER_BR])); WLAN_OS_REPORT(("[14]: coexWlanPsBtAclSlaveMinBR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_PS_BT_ACL_SLAVE_MIN_BR])); WLAN_OS_REPORT(("[15]: coexWlanPsBtAclSlaveMaxBR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_PS_BT_ACL_SLAVE_MAX_BR])); WLAN_OS_REPORT(("[16]: coexWlanPsMaxBtAclSlaveBR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_PS_MAX_BT_ACL_SLAVE_BR])); WLAN_OS_REPORT(("[17]: coexWlanPsBtAclMasterMinEDR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_PS_BT_ACL_MASTER_MIN_EDR])); WLAN_OS_REPORT(("[18]: coexWlanPsBtAclMasterMaxEDR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_PS_BT_ACL_MASTER_MAX_EDR])); WLAN_OS_REPORT(("[19]: coexWlanPsMaxBtAclMasterEDR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_PS_MAX_BT_ACL_MASTER_EDR])); WLAN_OS_REPORT(("[20]: coexWlanPsBtAclSlaveMinEDR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_PS_BT_ACL_SLAVE_MIN_EDR])); WLAN_OS_REPORT(("[21]: coexWlanPsBtAclSlaveMaxEDR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_PS_BT_ACL_SLAVE_MAX_EDR])); WLAN_OS_REPORT(("[22]: coexWlanPsMaxBtAclSlaveEDR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_PS_MAX_BT_ACL_SLAVE_EDR])); WLAN_OS_REPORT(("[23]: coexRxt = %d (usec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_RXT])); WLAN_OS_REPORT(("[24]: coexTxt = %d (usec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_TXT])); WLAN_OS_REPORT(("[25]: coexAdaptiveRxtTxt = %s \n", (SoftGeminiParam->coexParams[SOFT_GEMINI_ADAPTIVE_RXT_TXT]?"Enabled":"Disabled"))); WLAN_OS_REPORT(("[26]: coexPsPollTimeout = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_PS_POLL_TIMEOUT])); WLAN_OS_REPORT(("[27]: coexUpsdTimeout = %d (msec) \n", SoftGeminiParam->coexParams[SOFT_GEMINI_UPSD_TIMEOUT])); WLAN_OS_REPORT(("[28]: coexWlanActiveBtAclMasterMinEDR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_ACTIVE_BT_ACL_MASTER_MIN_EDR])); WLAN_OS_REPORT(("[29]: coexWlanActiveBtAclMasterMaxEDR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_ACTIVE_BT_ACL_MASTER_MAX_EDR])); WLAN_OS_REPORT(("[30]: coexWlanActiveMaxBtAclMasterEDR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_ACTIVE_MAX_BT_ACL_MASTER_EDR])); WLAN_OS_REPORT(("[31]: coexWlanActiveBtAclSlaveMinEDR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_ACTIVE_BT_ACL_SLAVE_MIN_EDR])); WLAN_OS_REPORT(("[32]: coexWlanActiveBtAclSlaveMaxEDR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_ACTIVE_BT_ACL_SLAVE_MAX_EDR])); WLAN_OS_REPORT(("[33]: coexWlanActiveMaxBtAclSlaveEDR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_ACTIVE_MAX_BT_ACL_SLAVE_EDR])); WLAN_OS_REPORT(("[34]: coexWlanActiveBtAclMinBR = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_ACTIVE_BT_ACL_MIN_BR])); WLAN_OS_REPORT(("[35]: coexWlanActiveBtAclMinBr = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_ACTIVE_BT_ACL_MAX_BR])); WLAN_OS_REPORT(("[36]: coexWlanActiveMaxBtAclBr = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_WLAN_ACTIVE_MAX_BT_ACL_BR])); WLAN_OS_REPORT(("[37]: coexHv3AutoEnlargePassiveScanWindowPercent = %d (%)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_PASSIVE_SCAN_DURATION_FACTOR_HV3])); WLAN_OS_REPORT(("[38]: coexA2DPAutoEnlargePassiveScanWindowPercent = %d (%) \n", SoftGeminiParam->coexParams[SOFT_GEMINI_PASSIVE_SCAN_DURATION_FACTOR_A2DP])); WLAN_OS_REPORT(("[39]: coexPassiveScanA2dpBtTime = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_PASSIVE_SCAN_A2DP_BT_TIME])); WLAN_OS_REPORT(("[40]: coexPassiveScanA2dpWlanTime = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_PASSIVE_SCAN_A2DP_WLAN_TIME])); WLAN_OS_REPORT(("[41]: CoexHv3MaxServed = %d \n", SoftGeminiParam->coexParams[SOFT_GEMINI_HV3_MAX_SERVED])); WLAN_OS_REPORT(("[42]: coexDhcpTime = %d (msec)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_DHCP_TIME])); WLAN_OS_REPORT(("[43]: coexA2dpAutoScanEnlargedScanWinodowPercent = %d (%)\n", SoftGeminiParam->coexParams[SOFT_GEMINI_ACTIVE_SCAN_DURATION_FACTOR_A2DP])); WLAN_OS_REPORT(("[44]: coexTempParam1 = %d \n", SoftGeminiParam->coexParams[SOFT_GEMINI_TEMP_PARAM_1])); WLAN_OS_REPORT(("[45]: coexTempParam2 = %d \n", SoftGeminiParam->coexParams[SOFT_GEMINI_TEMP_PARAM_2])); WLAN_OS_REPORT(("[46]: coexTempParam3 = %d \n", SoftGeminiParam->coexParams[SOFT_GEMINI_TEMP_PARAM_3])); WLAN_OS_REPORT(("[47]: coexTempParam4 = %d \n", SoftGeminiParam->coexParams[SOFT_GEMINI_TEMP_PARAM_4])); WLAN_OS_REPORT(("[48]: coexTempParam5 = %d \n", SoftGeminiParam->coexParams[SOFT_GEMINI_TEMP_PARAM_5])); WLAN_OS_REPORT(("Enable mode : %s\n", SoftGemini_ConvertModeToString(pSoftGemini->SoftGeminiEnable))); WLAN_OS_REPORT(("Driver Enabled : %s\n",(pSoftGemini->bDriverEnabled ? "YES" : "NO"))); WLAN_OS_REPORT(("Protective mode : %s\n", (pSoftGemini->bProtectiveMode ? "ON" : "OFF"))); WLAN_OS_REPORT(("PsPoll failure active : %s\n", (pSoftGemini->bPsPollFailureActive ? "YES" : "NO"))); #endif } /*************************************************************************** * SoftGemini_setParamsToFW * **************************************************************************** * DESCRIPTION: The function sets the FW with the appropriate parameters set. * * INPUTS: pSoftGemini - the object * * * OUTPUT: * * RETURNS: ***************************************************************************/ static TI_STATUS SoftGemini_setParamsToFW(TI_HANDLE hSoftGemini, TSoftGeminiParams *softGeminiParams) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; TTwdParamInfo param; os_memoryCopy(pSoftGemini->hOs,¶m.content.SoftGeminiParam, softGeminiParams, sizeof(TSoftGeminiParams)); param.paramType = TWD_SG_CONFIG_PARAM_ID; return TWD_SetParam (pSoftGemini->hTWD, ¶m); } /*************************************************************************** * SoftGemini_EnableDriver * **************************************************************************** * DESCRIPTION: Activated when SG is enabled (after CLI or FW command) * * INPUTS: pSoftGemini - the object * ***************************************************************************/ static TI_STATUS SoftGemini_EnableDriver(TI_HANDLE hSoftGemini) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; TI_STATUS return_value = TI_OK; TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, "\n"); pSoftGemini->bDriverEnabled = TI_TRUE; /* Check if coexAutoPsMode - Co-ex is enabled to enter/exit P.S */ if ( pSoftGemini->SoftGeminiParam.coexParams[SOFT_GEMINI_AUTO_PS_MODE]) { SoftGemini_SetPS(pSoftGemini); } scr_setMode(pSoftGemini->hSCR, SCR_MID_SG); return return_value; } /*************************************************************************** * SoftGemini_DisableDriver * **************************************************************************** * DESCRIPTION: Activated when SG is disabled (after CLI or FW command) * * INPUTS: pSoftGemini - the object * ***************************************************************************/ static TI_STATUS SoftGemini_DisableDriver(TI_HANDLE hSoftGemini) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; TI_STATUS return_value = TI_OK; TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, "\n"); pSoftGemini->bDriverEnabled = TI_FALSE; scr_setMode(pSoftGemini->hSCR, SCR_MID_NORMAL); /* Check if coexAutoPsMode - Co-ex is enabled to enter/exit P.S */ if ( pSoftGemini->SoftGeminiParam.coexParams[SOFT_GEMINI_AUTO_PS_MODE]) { SoftGemini_unSetPS(pSoftGemini); } /* Undo the changes that were made when Protective mode was on */ if (pSoftGemini->bProtectiveMode) { SoftGemini_DisableProtectiveMode(hSoftGemini); } return return_value; } /*************************************************************************** * SoftGemini_SetPS * **************************************************************************** * DESCRIPTION: Set Always PS to PowerMgr * * INPUTS: pSoftGemini - the object * ***************************************************************************/ static TI_STATUS SoftGemini_SetPS(SoftGemini_t *pSoftGemini) { paramInfo_t param; bssEntry_t *pBssInfo=NULL; if (pSoftGemini->hCurrBss) { pBssInfo = currBSS_getBssInfo(pSoftGemini->hCurrBss); } else { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_ERROR, "SoftGemini_SetPS: hCurrBss = NULL!!!\n"); } TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, "\n"); if (pBssInfo) { if ((pBssInfo->band == RADIO_BAND_2_4_GHZ)) { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, " SG-setPS: band == RADIO_BAND_2_4_GHZ"); /* Set Params to Power Mgr for SG priority */ param.paramType = POWER_MGR_POWER_MODE; param.content.powerMngPowerMode.PowerMode = POWER_MODE_PS_ONLY; param.content.powerMngPowerMode.PowerMngPriority = POWER_MANAGER_SG_PRIORITY; powerMgr_setParam(pSoftGemini->hPowerMgr,¶m); /* enable SG priority for Power Mgr */ param.paramType = POWER_MGR_ENABLE_PRIORITY; param.content.powerMngPriority = POWER_MANAGER_SG_PRIORITY; return powerMgr_setParam(pSoftGemini->hPowerMgr,¶m); } else { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, " SG-setPS: band == RADIO_BAND_5_GHZ"); } } return TI_OK; } /*************************************************************************** * SoftGemini_unSetPS * **************************************************************************** * DESCRIPTION: unSet Always PS to PowerMgr * * INPUTS: pSoftGemini - the object * ***************************************************************************/ static TI_STATUS SoftGemini_unSetPS(SoftGemini_t *pSoftGemini) { paramInfo_t param; TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, ", SG-unSetPS \n"); /* disable SG priority for Power Mgr*/ param.paramType = POWER_MGR_DISABLE_PRIORITY; param.content.powerMngPriority = POWER_MANAGER_SG_PRIORITY; return powerMgr_setParam(pSoftGemini->hPowerMgr,¶m); } /*************************************************************************** * SoftGemini_EnableProtectiveMode * **************************************************************************** * DESCRIPTION: Activated when FW inform us that protective mode is ON * * * INPUTS: pSoftGemini - the object * ***************************************************************************/ void SoftGemini_EnableProtectiveMode(TI_HANDLE hSoftGemini) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; paramInfo_t param; pSoftGemini->bProtectiveMode = TI_TRUE; /* set new configurations of SG roaming parameters */ /* This code should be removed on SG stage 2 integration currBSS_SGconfigureBSSLoss(pSoftGemini->hCurrBss,pSoftGemini->BSSLossCompensationPercent,TI_TRUE); */ /* set new configurations of scan to scancncn */ scanCncn_SGconfigureScanParams(pSoftGemini->hScanCncn,TI_TRUE, (TI_UINT8)pSoftGemini->SoftGeminiParam.coexParams[SOFT_GEMINI_AUTO_SCAN_PROBE_REQ], pSoftGemini->SoftGeminiParam.coexParams[SOFT_GEMINI_HV3_MAX_OVERRIDE], pSoftGemini->SoftGeminiParam.coexParams[SOFT_GEMINI_ACTIVE_SCAN_DURATION_FACTOR_HV3]); /* Call the power manager to enter short doze */ TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, " SoftGemini_EnableProtectiveMode set SD"); /* Set Params to Power Mgr for SG priority */ param.paramType = POWER_MGR_POWER_MODE; param.content.powerMngPowerMode.PowerMode = POWER_MODE_SHORT_DOZE; param.content.powerMngPowerMode.PowerMngPriority = POWER_MANAGER_SG_PRIORITY; powerMgr_setParam(pSoftGemini->hPowerMgr,¶m); } /*************************************************************************** * SoftGemini_DisableProtectiveMode * **************************************************************************** * DESCRIPTION: Activated when FW inform us that protective mode is OFF or SG is disabled * * INPUTS: pSoftGemini - the object * ***************************************************************************/ void SoftGemini_DisableProtectiveMode(TI_HANDLE hSoftGemini) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, "\n"); pSoftGemini->bProtectiveMode = TI_FALSE; SoftGemini_RemoveProtectiveModeParameters(hSoftGemini); } /*************************************************************************** * SoftGemini_DisableProtectiveMode * **************************************************************************** * DESCRIPTION: Called from SoftGemini_DisableProtectiveMode() when FW inform * us that protective mode is OFF or SG is disabled, or from * SoftGemini_unSetPSmode() when driver disconnects from AP. * * INPUTS: pSoftGemini - the object * ***************************************************************************/ void SoftGemini_RemoveProtectiveModeParameters(TI_HANDLE hSoftGemini) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; paramInfo_t param; TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, "\n"); /* don't use the SG roaming parameters */ currBSS_SGconfigureBSSLoss(pSoftGemini->hCurrBss,0,TI_FALSE); /* don't use the SG scan parameters */ scanCncn_SGconfigureScanParams(pSoftGemini->hScanCncn,TI_FALSE,0,0,0); /* Call the power manager to exit short doze */ /* Set Params to Power Mgr for SG priority */ param.paramType = POWER_MGR_POWER_MODE; param.content.powerMngPowerMode.PowerMode = POWER_MODE_PS_ONLY; param.content.powerMngPowerMode.PowerMngPriority = POWER_MANAGER_SG_PRIORITY; powerMgr_setParam(pSoftGemini->hPowerMgr,¶m); } /*************************************************************************** * SoftGemini_SenseIndicationCB * **************************************************************************** * DESCRIPTION: This is the the function which is called for sense mode indication from FW * (i.e. we are in SENSE mode and FW detects BT activity ) * SENSE_MODE_ENABLE - Indicates that FW detected BT activity * SENSE_MODE_DISABLE - Indicates that FW doesn't detect BT activity for a period of time * * INPUTS: pSoftGemini - the object * NOTE This function is located in the API for debug purposes ***************************************************************************/ void SoftGemini_SenseIndicationCB( TI_HANDLE hSoftGemini, char* str, TI_UINT32 strLen ) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; if (pSoftGemini->SoftGeminiEnable == SG_DISABLE) { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_WARNING, ": SG is disabled, existing"); return; } if ( (SENSE_MODE_ENABLE == *str) && (!pSoftGemini->bDriverEnabled) ) { SoftGemini_EnableDriver(hSoftGemini); } else if ( (SENSE_MODE_DISABLE == *str) && (pSoftGemini->bDriverEnabled) ) { SoftGemini_DisableDriver(hSoftGemini); } } /*************************************************************************** * SoftGemini_ProtectiveIndicationCB * **************************************************************************** * DESCRIPTION: This is the the function which is called when FW starts Protective mode (i.e BT voice) * * PROTECTIVE_MODE_ON - FW is activated on protective mode (BT voice is running) * PROTECTIVE_MODE_OFF - FW is not activated on protective mode * * INPUTS: pSoftGemini - the object * NOTE This function is located in the API for debug purposes ***************************************************************************/ void SoftGemini_ProtectiveIndicationCB( TI_HANDLE hSoftGemini, char* str, TI_UINT32 strLen ) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; TRACE1(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, " with 0x%x\n",*str); if (SG_DISABLE != pSoftGemini->SoftGeminiEnable) { if ((!pSoftGemini->bProtectiveMode) && (PROTECTIVE_MODE_ON == *str)) { SoftGemini_EnableProtectiveMode(hSoftGemini); } else if ((pSoftGemini->bProtectiveMode) && (PROTECTIVE_MODE_OFF == *str)) { SoftGemini_DisableProtectiveMode(hSoftGemini); } else { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, " : Protective mode called when Protective mode is \n"); } } else { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_WARNING, " : Protective mode called when SG mode is ? \n"); } } /*************************************************************************** * SoftGemini_ConvertModeToString * ****************************************************************************/ #ifdef REPORT_LOG char* SoftGemini_ConvertModeToString(ESoftGeminiEnableModes SoftGeminiEnable) { switch(SoftGeminiEnable) { case SG_PROTECTIVE: return "SG_PROTECTIVE"; case SG_DISABLE: return "SG_DISABLE"; case SG_OPPORTUNISTIC: return "SG_OPPORTUNISTIC"; default: return "ERROR"; } } #endif /*************************************************************************** * SoftGemini_getSGMode * ****************************************************************************/ ESoftGeminiEnableModes SoftGemini_getSGMode(TI_HANDLE hSoftGemini) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; return pSoftGemini->SoftGeminiEnable; } /*************************************************************************** * SoftGemini_handleRecovery * **************************************************************************** * DESCRIPTION: The function reconfigures WHAL with the SG parameters. * * INPUTS: pSoftGemini - the object ***************************************************************************/ TI_STATUS SoftGemini_handleRecovery(TI_HANDLE hSoftGemini) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; ESoftGeminiEnableModes realSoftGeminiEnableMode; realSoftGeminiEnableMode = pSoftGemini->SoftGeminiEnable; /* Disable the SG */ SoftGemini_setEnableParam(hSoftGemini, SG_DISABLE, TI_TRUE); TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, "Disable SG \n"); pSoftGemini->SoftGeminiEnable = realSoftGeminiEnableMode; /* Set enable param */ SoftGemini_setEnableParam(hSoftGemini, pSoftGemini->SoftGeminiEnable, TI_TRUE); TRACE1(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, "Set SG to-%d\n", pSoftGemini->SoftGeminiEnable); /* Config the params to FW */ SoftGemini_setParamsToFW(hSoftGemini, &pSoftGemini->SoftGeminiParam); /*SoftGemini_printParams(hSoftGemini);*/ return TI_OK; } /*************************************************************************** * SoftGemini_startPsPollFailure * **************************************************************************** * DESCRIPTION: After Ps-Poll failure we disable the SG * * INPUTS: pSoftGemini - the object ***************************************************************************/ void SoftGemini_startPsPollFailure(TI_HANDLE hSoftGemini) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, "\n"); if ( (!pSoftGemini->bPsPollFailureActive) && (pSoftGemini->SoftGeminiParam.coexParams[SOFT_GEMINI_AUTO_PS_MODE] == TI_TRUE) ) { pSoftGemini->PsPollFailureLastEnableValue = pSoftGemini->SoftGeminiEnable; /* Disable SG if needed */ if ( pSoftGemini->SoftGeminiEnable != SG_DISABLE ) { SoftGemini_setEnableParam(hSoftGemini, SG_DISABLE, TI_FALSE); } pSoftGemini->bPsPollFailureActive = TI_TRUE; } else /* Calling SoftGemini_startPsPollFailure twice ? */ { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_WARNING, "Calling SoftGemini_startPsPollFailure while bPsPollFailureActive is TRUE\n"); } } /*************************************************************************** * SoftGemini_endPsPollFailure * **************************************************************************** * DESCRIPTION: Return to normal behavior after the PsPoll failure * * INPUTS: pSoftGemini - the object ***************************************************************************/ void SoftGemini_endPsPollFailure(TI_HANDLE hSoftGemini) { SoftGemini_t *pSoftGemini = (SoftGemini_t *)hSoftGemini; TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_INFORMATION, "\n"); if ( pSoftGemini->bPsPollFailureActive ) { pSoftGemini->bPsPollFailureActive = TI_FALSE; /* return to previous value */ if ( pSoftGemini->PsPollFailureLastEnableValue != SG_DISABLE ) { SoftGemini_setEnableParam(hSoftGemini, pSoftGemini->PsPollFailureLastEnableValue, TI_FALSE); } } else /* Calling SoftGemini_endPsPollFailure twice ? */ { TRACE0(pSoftGemini->hReport, REPORT_SEVERITY_WARNING, "Calling SoftGemini_endPsPollFailure while bPsPollFailureActive is FALSE\n"); } }