/* DTS Tx packet complete function. * This function should be invoked by the transport device to indicate * transmit complete for a frame. * Parameters: * pContext:Cookie that should be passed back to the caller * pFrame:Refernce to PAL frame. * Return Value: SUCCESS Completed successfully. * FAILURE_XXX Request was rejected due XXX Reason. * */ wpt_status WDTS_TxPacketComplete(void *pContext, wpt_packet *pFrame, wpt_status status) { WDI_DS_ClientDataType *pClientData = (WDI_DS_ClientDataType*)(pContext); WDI_DS_TxMetaInfoType *pTxMetadata; void *pvBDHeader, *physBDHeader; wpt_uint8 staIndex; // Do Sanity checks if(NULL == pContext || NULL == pFrame){ return eWLAN_PAL_STATUS_E_FAILURE; } // extract metadata from PAL packet pTxMetadata = WDI_DS_ExtractTxMetaData(pFrame); pTxMetadata->txCompleteStatus = status; // Free BD header from pool WDI_GetBDPointers(pFrame, &pvBDHeader, &physBDHeader); switch(pTxMetadata->frmType) { case WDI_MAC_DATA_FRAME: /* note that EAPOL frame hasn't incremented ReserveCount. see WDI_DS_TxPacket() in wlan_qct_wdi_ds.c */ #ifdef FEATURE_WLAN_TDLS /* I utilizes TDLS mgmt frame always sent at BD_RATE2. (See limProcessTdls.c) Assumption here is data frame sent by WDA_TxPacket() <- HalTxFrame/HalTxFrameWithComplete() should take managment path. As of today, only TDLS feature has special data frame which needs to be treated as mgmt. */ if((!pTxMetadata->isEapol) && ((pTxMetadata->txFlags & WDI_USE_BD_RATE2_FOR_MANAGEMENT_FRAME) != WDI_USE_BD_RATE2_FOR_MANAGEMENT_FRAME)) #else if(!pTxMetadata->isEapol) #endif { /* SWAP BD header to get STA index for completed frame */ WDI_SwapTxBd(pvBDHeader); staIndex = (wpt_uint8)WDI_TX_BD_GET_STA_ID(pvBDHeader); WDI_DS_MemPoolFree(&(pClientData->dataMemPool), pvBDHeader, physBDHeader); WDI_DS_MemPoolDecreaseReserveCount(&(pClientData->dataMemPool), staIndex); break; } // intentional fall-through to handle eapol packet as mgmt case WDI_MAC_MGMT_FRAME: WDI_DS_MemPoolFree(&(pClientData->mgmtMemPool), pvBDHeader, physBDHeader); break; } WDI_SetBDPointers(pFrame, 0, 0); // Invoke Tx complete callback pClientData->txCompleteCB(pClientData->pCallbackContext, pFrame); return eWLAN_PAL_STATUS_SUCCESS; }
/* DTS Tx packet complete function. * This function should be invoked by the transport device to indicate * transmit complete for a frame. * Parameters: * pContext:Cookie that should be passed back to the caller * pFrame:Refernce to PAL frame. * Return Value: SUCCESS Completed successfully. * FAILURE_XXX Request was rejected due XXX Reason. * */ wpt_status WDTS_TxPacketComplete(void *pContext, wpt_packet *pFrame, wpt_status status) { WDI_DS_ClientDataType *pClientData = (WDI_DS_ClientDataType*)(pContext); WDI_DS_TxMetaInfoType *pTxMetadata; void *pvBDHeader, *physBDHeader; wpt_uint8 staIndex; // Do Sanity checks if(NULL == pContext || NULL == pFrame){ return eWLAN_PAL_STATUS_E_FAILURE; } // extract metadata from PAL packet pTxMetadata = WDI_DS_ExtractTxMetaData(pFrame); pTxMetadata->txCompleteStatus = status; // Free BD header from pool WDI_GetBDPointers(pFrame, &pvBDHeader, &physBDHeader); switch(pTxMetadata->frmType) { case WDI_MAC_DATA_FRAME: /* SWAP BD header to get STA index for completed frame */ WDI_SwapTxBd(pvBDHeader); staIndex = (wpt_uint8)WDI_TX_BD_GET_STA_ID(pvBDHeader); WDI_DS_MemPoolFree(&(pClientData->dataMemPool), pvBDHeader, physBDHeader); WDI_DS_MemPoolDecreaseReserveCount(&(pClientData->dataMemPool), staIndex); break; case WDI_MAC_MGMT_FRAME: WDI_DS_MemPoolFree(&(pClientData->mgmtMemPool), pvBDHeader, physBDHeader); break; } WDI_SetBDPointers(pFrame, 0, 0); // Invoke Tx complete callback pClientData->txCompleteCB(pClientData->pCallbackContext, pFrame); return eWLAN_PAL_STATUS_SUCCESS; }