wlan: Extended Capability and VHT Opmode support
Change-Id: I12e1941adb86d6d6f3ad6863e2938dbfe6054264
CRs-Fixed: 395644, 395645
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 6d26a05..4fc82c3 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -185,6 +185,10 @@
VOS_STATUS WDA_ProcessSetTmLevelReq(tWDA_CbContext *pWDA,
tAniSetTmLevelReq *setTmLevelReq);
+#ifdef WLAN_FEATURE_11AC
+VOS_STATUS WDA_ProcessUpdateOpMode(tWDA_CbContext *pWDA,
+ tUpdateVHTOpMode *pData);
+#endif
/*
* FUNCTION: WDA_open
* Allocate the WDA context
@@ -9523,7 +9527,23 @@
WDA_ProcessSetTmLevelReq(pWDA, (tAniSetTmLevelReq *)pMsg->bodyptr);
break;
}
-
+#ifdef WLAN_FEATURE_11AC
+ case WDA_UPDATE_OP_MODE:
+ {
+ if(WDA_getHostWlanFeatCaps(DOT11AC) && WDA_getFwWlanFeatCaps(DOT11AC))
+ {
+ if(WDA_getHostWlanFeatCaps(DOT11AC_OPMODE) && WDA_getFwWlanFeatCaps(DOT11AC_OPMODE))
+ WDA_ProcessUpdateOpMode(pWDA, (tUpdateVHTOpMode *)pMsg->bodyptr);
+ else
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ " VHT OpMode Feature is Not Supported \n");
+ }
+ else
+ VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ " 11AC Feature is Not Supported \n");
+ break;
+ }
+#endif
default:
{
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11396,4 +11416,78 @@
return pWDA->needShutdown;
}
+#ifdef WLAN_FEATURE_11AC
+/*
+ * FUNCTION: WDA_SetBeaconFilterReqCallback
+ *
+ */
+void WDA_SetUpdateOpModeReqCallback(WDI_Status status, void* pUserData)
+{
+ tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "<------ %s " ,__FUNCTION__);
+ if(NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pWdaParams received NULL", __FUNCTION__);
+ VOS_ASSERT(0) ;
+ return ;
+ }
+ vos_mem_free(pWdaParams->wdaMsgParam) ;
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ vos_mem_free(pWdaParams) ;
+ /*
+ * No respone required for SetBeaconFilter req so just free the request
+ * param here
+ */
+
+ return ;
+}
+
+VOS_STATUS WDA_ProcessUpdateOpMode(tWDA_CbContext *pWDA,
+ tUpdateVHTOpMode *pData)
+{
+ WDI_Status status = WDI_STATUS_SUCCESS ;
+ tWDA_ReqParams *pWdaParams ;
+ WDI_UpdateVHTOpMode *wdiTemp = (WDI_UpdateVHTOpMode *)vos_mem_malloc(
+ sizeof(WDI_UpdateVHTOpMode)) ;
+ if(NULL == wdiTemp)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __FUNCTION__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_NOMEM;
+ }
+ pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
+ if(NULL == pWdaParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __FUNCTION__);
+ VOS_ASSERT(0);
+ vos_mem_free(wdiTemp);
+ return VOS_STATUS_E_NOMEM;
+ }
+
+ wdiTemp->opMode = pData->opMode;
+ wdiTemp->staId = pData->staId;
+
+ pWdaParams->pWdaContext = pWDA;
+ /* Store Req pointer, as this will be used for response */
+ pWdaParams->wdaMsgParam = (void *)pData;
+ /* store Params pass it to WDI */
+ pWdaParams->wdaWdiApiMsgParam = (void *)wdiTemp ;
+
+ status = WDI_UpdateVHTOpModeReq( wdiTemp, (WDI_UpdateVHTOpModeCb) WDA_SetUpdateOpModeReqCallback, pWdaParams);
+
+ if(IS_WDI_STATUS_FAILURE(status))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "Failure in UPDATE VHT OP_MODE REQ Params WDI API, free all the memory " );
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
+ vos_mem_free(pWdaParams->wdaMsgParam);
+ vos_mem_free(pWdaParams);
+ }
+ return CONVERT_WDI2VOS_STATUS(status) ;
+}
+#endif