prima: Create interface for updating cfg ini param
Create interface for updating cfg ini param to firmware
dynamically using WLAN_HAL_UPDATE_CFG_REQ
Change-Id: I9d147a805e9628e35fd4fd2c3babcfb14d2f91f9
CRs-Fixed: 1096029
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index e18f683..751cf24 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -5264,7 +5264,7 @@
* FUNCTION: WDA_ConvertWniCfgIdToHALCfgId
* Convert the WNI CFG ID to HAL CFG ID
*/
-static inline v_U8_t WDA_ConvertWniCfgIdToHALCfgId(v_U32_t wniCfgId)
+static inline tANI_U16 WDA_ConvertWniCfgIdToHALCfgId(v_U32_t wniCfgId)
{
switch(wniCfgId)
{
@@ -5372,12 +5372,14 @@
return QWLAN_HAL_CFG_UNITS_OF_BCN_WAIT_TIME;
case WNI_CFG_ENABLE_RTSCTS_HTVHT:
return QWLAN_HAL_CFG_ENABLE_RTSCTS_HTVHT;
+ case WNI_CFG_ENABLE_MC_ADDR_LIST:
+ return QWLAN_HAL_CFG_ENABLE_MC_ADDR_LIST;
default:
{
VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
"There is no HAL CFG Id corresponding to WNI CFG Id: %d",
wniCfgId);
- return VOS_STATUS_E_INVAL;
+ return QWLAN_HAL_CFG_MAX_PARAMS;
}
}
}
@@ -5433,7 +5435,6 @@
{
return VOS_STATUS_E_FAILURE;
}
-
if(NULL != pWDA->wdaWdiCfgApiMsgParam)
{
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -5441,7 +5442,7 @@
VOS_ASSERT(0);
return VOS_STATUS_E_FAILURE;
}
-
+
wdiCfgReqParam = (WDI_UpdateCfgReqParamsType *)vos_mem_malloc(
sizeof(WDI_UpdateCfgReqParamsType)) ;
if(NULL == wdiCfgReqParam)
@@ -5461,7 +5462,7 @@
VOS_ASSERT(0);
return VOS_STATUS_E_NOMEM;
}
-
+
/*convert the WNI CFG Id to HAL CFG Id*/
((tHalCfg *)wdiCfgReqParam->pConfigBuffer)->type =
WDA_ConvertWniCfgIdToHALCfgId(cfgParam->bodyval);
@@ -5505,6 +5506,166 @@
return CONVERT_WDI2VOS_STATUS(status) ;
}
+/*
+ * FUNCTION: WDA_UpdateCfgIntParamCb
+ *
+ */
+void WDA_UpdateCfgIntParamCb(WDI_Status wdiStatus, void* pUserData)
+{
+ tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
+ WDI_UpdateCfgReqParamsType *wdiCfgParam =
+ (WDI_UpdateCfgReqParamsType *)pWDA->wdaWdiCfgUpdateIntMsg ;
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "<------ %s " ,__func__);
+ /*
+ * currently there is no response message is expected between PE and
+ * WDA, Failure return from WDI is a ASSERT condition
+ */
+ if (WDI_STATUS_SUCCESS != wdiStatus)
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: CFG (%d) config failure", __func__,
+ ((tHalCfg *)(wdiCfgParam->pConfigBuffer))->type);
+
+ if (wdiCfgParam && wdiCfgParam->pConfigBuffer)
+ {
+ vos_mem_free(wdiCfgParam->pConfigBuffer);
+ wdiCfgParam->pConfigBuffer = NULL;
+ }
+
+ if (pWDA->wdaWdiCfgUpdateIntMsg)
+ {
+ vos_mem_free(pWDA->wdaWdiCfgUpdateIntMsg);
+ pWDA->wdaWdiCfgUpdateIntMsg = NULL;
+ }
+
+ return ;
+}
+
+/*
+ * FUNCTION: WDA_UpdateCfgIntParam
+ *
+ */
+VOS_STATUS WDA_UpdateCfgIntParam(tWDA_CbContext *pWDA,
+ tSirUpdateCfgIntParam *cfgParam)
+{
+
+ WDI_Status status = WDI_STATUS_SUCCESS ;
+ tANI_U32 val =0;
+ tpAniSirGlobal pMac;
+ WDI_UpdateCfgReqParamsType *wdiCfgReqParam = NULL ;
+ tHalCfg *tlvStruct = NULL ;
+ tANI_U8 *tlvStructStart = NULL ;
+ v_PVOID_t *configParam;
+ tANI_U32 configParamSize;
+ tANI_U32 *configDataValue;
+ tANI_U32 cfgId;
+ tANI_U32 tlv_type = QWLAN_HAL_CFG_MAX_PARAMS;
+
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ " ------> %s " ,__func__);
+
+ if (cfgParam)
+ {
+ cfgId = cfgParam->cfgId;
+ }
+ else
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ FL("Invoked with NULL cfgParam"));
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ if (!pWDA)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ FL("Invoked with invalid WDA context"));
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ if (NULL != pWDA->wdaWdiCfgUpdateIntMsg)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ FL("wdaWdiCfgApiMsgParam is not NULL"));
+
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ pMac = (tpAniSirGlobal )VOS_GET_MAC_CTXT(pWDA->pVosContext) ;
+ if (NULL == pMac)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ FL("Invoked with invalid MAC context "));
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ if (wlan_cfgGetInt(pMac, (tANI_U16)cfgId , &val) != eSIR_SUCCESS)
+ {
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ FL("Fail to cfg get id %d"), cfgId);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ /* Get TLV type */
+ tlv_type = WDA_ConvertWniCfgIdToHALCfgId(cfgId);
+ if (tlv_type == QWLAN_HAL_CFG_MAX_PARAMS)
+ {
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failed to Convert cfg to hal id %d", cfgId);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ wdiCfgReqParam = (WDI_UpdateCfgReqParamsType *)vos_mem_malloc(
+ sizeof(WDI_UpdateCfgReqParamsType)) ;
+ if (NULL == wdiCfgReqParam)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ return VOS_STATUS_E_NOMEM;
+ }
+
+ configParamSize = (sizeof(tHalCfg) + (sizeof(tANI_U32))) * 1;
+ configParam = vos_mem_malloc(configParamSize);
+ if (NULL == configParam)
+ {
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ vos_mem_free(wdiCfgReqParam);
+ return VOS_STATUS_E_NOMEM;
+ }
+
+ vos_mem_set(configParam, configParamSize, 0);
+ wdiCfgReqParam->pConfigBuffer = configParam;
+ tlvStruct = (tHalCfg *)configParam;
+ tlvStructStart = (tANI_U8 *)configParam;
+ /* Set TLV type */
+ tlvStruct->type = tlv_type;
+ tlvStruct->length = sizeof(tANI_U32);
+ configDataValue = (tANI_U32 *)(tlvStruct + 1);
+ *configDataValue = (tANI_U32)val;
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "cfg_id %d tlv_type %d tlv_value %d \n",
+ cfgId, tlvStruct->type, val);
+ tlvStruct = (tHalCfg *)(( (tANI_U8 *) tlvStruct
+ + sizeof(tHalCfg) + tlvStruct->length)) ;
+ wdiCfgReqParam->uConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
+ wdiCfgReqParam->wdiReqStatusCB = NULL;
+ /* store Params pass it to WDI */
+ pWDA->wdaWdiCfgUpdateIntMsg = (void *)wdiCfgReqParam ;
+ status = WDI_UpdateCfgReq(wdiCfgReqParam,
+ (WDI_UpdateCfgRspCb )WDA_UpdateCfgIntParamCb, pWDA) ;
+ if (IS_WDI_STATUS_FAILURE(status))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failure in WDA_UpdateCfgIntParam WDI API, free memory ");
+ vos_mem_free(wdiCfgReqParam->pConfigBuffer);
+ wdiCfgReqParam->pConfigBuffer = NULL;
+ vos_mem_free(pWDA->wdaWdiCfgUpdateIntMsg);
+ pWDA->wdaWdiCfgUpdateIntMsg = NULL;
+ }
+
+ return CONVERT_WDI2VOS_STATUS(status);
+}
+
VOS_STATUS WDA_GetWepKeysFromCfg( tWDA_CbContext *pWDA,
v_U8_t *pDefaultKeyId,
v_U8_t *pNumKeys,
@@ -15389,6 +15550,25 @@
}
break;
}
+ case WDA_UPDATE_CFG_INT_PARAM:
+ {
+ if(pWDA->wdaState == WDA_READY_STATE)
+ {
+ WDA_UpdateCfgIntParam(pWDA, (tSirUpdateCfgIntParam *)pMsg->bodyptr);
+ vos_mem_free(pMsg->bodyptr);
+ }
+ else
+ {
+ if(NULL != pMsg->bodyptr)
+ {
+ vos_mem_free(pMsg->bodyptr);
+ }
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ " WDA_UPDATE_CFG_INT_PARAM req in wrong state %d",
+ pWDA->wdaState );
+ }
+ break;
+ }
case WDA_ENTER_IMPS_REQ:
{
if(pWDA->wdaState == WDA_READY_STATE)