/*========================================================================== FUNCTION WDA_DS_Register DESCRIPTION Register TL client to WDA. This function registers TL RX/TX functions to WDI by calling WDI_DS_Register. For NON integrated SOC, this function calls WLANBAL_RegTlCbFunctions to register TL's RX/TX functions to BAL TODO For Prima, pfnResourceCB gets called in WDTS_OOResourceNotification. The uCount parameter is AC mask. It should be redefined to use the same resource callback function. DEPENDENCIES PARAMETERS IN pvosGCtx VOS context pfnTxCompleteCallback TX complete callback upon TX completion pfnRxPacketCallback RX callback pfnTxPacketCallback TX callback pfnResourceCB gets called when updating TX PDU number uResTheshold minimum TX PDU size for a packet pCallbackContext WDI calls callback function with it VOS global context pointer OUT uAvailableTxBuf available TX PDU numbder. BAL returns it for NON integrated SOC RETURN VALUE VOS_STATUS_E_FAULT: pointer is NULL and other errors VOS_STATUS_SUCCESS: Everything is good :) SIDE EFFECTS ============================================================================*/ VOS_STATUS WDA_DS_Register ( v_PVOID_t pvosGCtx, WDA_DS_TxCompleteCallback pfnTxCompleteCallback, WDA_DS_RxPacketCallback pfnRxPacketCallback, WDA_DS_TxPacketCallback pfnTxPacketCallback, WDA_DS_ResourceCB pfnResourceCB, v_U32_t uResTheshold, v_PVOID_t pCallbackContext, v_U32_t *uAvailableTxBuf ) { tWDA_CbContext *wdaContext = NULL; WDI_Status wdiStatus; VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH, "WLAN WDA: WDA_DS_Register" ); /*------------------------------------------------------------------------ Sanity check ------------------------------------------------------------------------*/ if ( ( NULL == pvosGCtx ) || ( NULL == pfnTxPacketCallback ) || ( NULL == pfnTxCompleteCallback ) || ( NULL == pfnRxPacketCallback ) || ( NULL == pfnResourceCB) ) { VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, "WLAN WDA:Invalid pointers on WDA_DS_Register" ); return VOS_STATUS_E_FAULT; } /*------------------------------------------------------------------------ Extract WDA context ------------------------------------------------------------------------*/ wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx ); if ( NULL == wdaContext ) { VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, "WLAN WDA:Invalid wda context pointer " "from pvosGCtx on WDA_DS_Register" ); return VOS_STATUS_E_FAULT; } /*------------------------------------------------------------------------ Register with WDI as transport layer client ------------------------------------------------------------------------*/ VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH, "WDA: WDA_DS_Register"); wdaContext->pfnTxResourceCB = pfnResourceCB; wdaContext->pfnTxCompleteCallback = pfnTxCompleteCallback; wdiStatus = WDI_DS_Register( wdaContext->pWdiContext, (WDI_DS_TxCompleteCallback)WDA_DS_TxCompleteCB, (WDI_DS_RxPacketCallback)pfnRxPacketCallback, WDA_DS_TxFlowControlCallback, pvosGCtx ); if ( WDI_STATUS_SUCCESS != wdiStatus ) { VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WLAN TL:TL failed to register with DAL, Err: %d", wdiStatus ); return VOS_STATUS_E_FAILURE; } /* TODO Out-of-resource condition if PDU size is less than WLANTL_MIN_RES_MF Put hardcoded value not to put TL into OOR. Revisit it */ *uAvailableTxBuf = WDA_DS_DXE_RES_COUNT; return VOS_STATUS_SUCCESS; }
/*========================================================================== FUNCTION WDA_DS_Register DESCRIPTION Register TL client to WDA. This function registers TL RX/TX functions to WDI by calling WDI_DS_Register. For NON integrated SOC, this function calls WLANBAL_RegTlCbFunctions to register TL's RX/TX functions to BAL TODO For Prima, pfnResourceCB gets called in WDTS_OOResourceNotification. The uCount parameter is AC mask. It should be redefined to use the same resource callback function. DEPENDENCIES PARAMETERS IN pvosGCtx VOS context pfnTxCompleteCallback TX complete callback upon TX completion pfnRxPacketCallback RX callback pfnTxPacketCallback TX callback pfnResourceCB gets called when updating TX PDU number uResTheshold minimum TX PDU size for a packet pCallbackContext WDI calls callback function with it VOS global context pointer OUT uAvailableTxBuf available TX PDU numbder. BAL returns it for NON integrated SOC RETURN VALUE VOS_STATUS_E_FAULT: pointer is NULL and other errors VOS_STATUS_SUCCESS: Everything is good :) SIDE EFFECTS ============================================================================*/ VOS_STATUS WDA_DS_Register ( v_PVOID_t pvosGCtx, WDA_DS_TxCompleteCallback pfnTxCompleteCallback, WDA_DS_RxPacketCallback pfnRxPacketCallback, WDA_DS_TxPacketCallback pfnTxPacketCallback, WDA_DS_ResourceCB pfnResourceCB, v_U32_t uResTheshold, v_PVOID_t pCallbackContext, v_U32_t *uAvailableTxBuf ) { #if defined( FEATURE_WLAN_INTEGRATED_SOC ) tWDA_CbContext *wdaContext = NULL; WDI_Status wdiStatus; VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH, "WLAN WDA: WDA_DS_Register" ); /*------------------------------------------------------------------------ Sanity check ------------------------------------------------------------------------*/ if ( ( NULL == pvosGCtx ) || ( NULL == pfnTxPacketCallback ) || ( NULL == pfnTxCompleteCallback ) || ( NULL == pfnRxPacketCallback ) || ( NULL == pfnResourceCB) ) { VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, "WLAN WDA:Invalid pointers on WDA_DS_Register" ); return VOS_STATUS_E_FAULT; } /*------------------------------------------------------------------------ Extract WDA context ------------------------------------------------------------------------*/ wdaContext = (tWDA_CbContext *)vos_get_context( VOS_MODULE_ID_WDA, pvosGCtx ); if ( NULL == wdaContext ) { VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, "WLAN WDA:Invalid wda context pointer " "from pvosGCtx on WDA_DS_Register" ); return VOS_STATUS_E_FAULT; } /*------------------------------------------------------------------------ Register with WDI as transport layer client ------------------------------------------------------------------------*/ VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH, "WDA: WDA_DS_Register"); wdaContext->pfnTxResourceCB = pfnResourceCB; wdaContext->pfnTxCompleteCallback = pfnTxCompleteCallback; wdiStatus = WDI_DS_Register( wdaContext->pWdiContext, (WDI_DS_TxCompleteCallback)WDA_DS_TxCompleteCB, (WDI_DS_RxPacketCallback)pfnRxPacketCallback, WDA_DS_TxFlowControlCallback, pvosGCtx ); if ( WDI_STATUS_SUCCESS != wdiStatus ) { VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WLAN TL:TL failed to register with DAL, Err: %d", wdiStatus ); return VOS_STATUS_E_FAILURE; } /* TODO Out-of-resource condition if PDU size is less than WLANTL_MIN_RES_MF Put hardcoded value not to put TL into OOR. Revisit it */ *uAvailableTxBuf = WDA_DS_DXE_RES_COUNT; return VOS_STATUS_SUCCESS; #else /* FEATURE_WLAN_INTEGRATED_SOC */ VOS_STATUS vosStatus; WLANBAL_TlRegType tlReg; VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH, "WLAN WDA: WDA_DS_Register" ); /*------------------------------------------------------------------------ Sanity check ------------------------------------------------------------------------*/ if ( ( NULL == pvosGCtx ) || ( NULL == pfnTxPacketCallback ) || ( NULL == pfnTxCompleteCallback ) || ( NULL == pfnRxPacketCallback ) || ( NULL == pfnResourceCB ) ) { VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WLAN WDA:Invalid pointers on WDA_DS_Register" ); return VOS_STATUS_E_FAULT; } /*------------------------------------------------------------------------ Register with BAL as transport layer client ------------------------------------------------------------------------*/ tlReg.receiveFrameCB = pfnRxPacketCallback; tlReg.getTXFrameCB = pfnTxPacketCallback; tlReg.txCompleteCB = pfnTxCompleteCallback; tlReg.txResourceCB = pfnResourceCB; tlReg.txResourceThreashold = uResTheshold; tlReg.tlUsrData = pvosGCtx; vosStatus = WLANBAL_RegTlCbFunctions( pvosGCtx, &tlReg ); if ( VOS_STATUS_SUCCESS != vosStatus ) { VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WLAN TL: TL failed to register with BAL, Err: %d", vosStatus ); return vosStatus; } /*------------------------------------------------------------------------ Request resources for tx from bus ------------------------------------------------------------------------*/ vosStatus = WLANBAL_GetTxResources( pvosGCtx, uAvailableTxBuf ); if ( VOS_STATUS_SUCCESS != vosStatus ) { VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WLAN TL:TL failed to get resources from BAL, Err: %d", vosStatus ); return vosStatus; } return vosStatus; #endif }