prima: WLAN Driver Release 3.1.7.9

This is the initial release of the Prima WLAN Driver
diff --git a/CORE/WDI/TRP/DTS/src/wlan_qct_wdi_dts.c b/CORE/WDI/TRP/DTS/src/wlan_qct_wdi_dts.c
new file mode 100644
index 0000000..3ca56fb
--- /dev/null
+++ b/CORE/WDI/TRP/DTS/src/wlan_qct_wdi_dts.c
@@ -0,0 +1,618 @@
+/*
+ * Copyright (c) 2012, Code Aurora Forum. All rights reserved.
+ *
+ * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+ *
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**=========================================================================
+ *     
+ *       \file  wlan_qct_wdi_dts.c
+ *          
+ *       \brief  Data Transport Service API 
+ *                               
+ * WLAN Device Abstraction layer External API for Dataservice
+ * DESCRIPTION
+ *  This file contains the external API implemntation exposed by the 
+ *   wlan device abstarction layer module.
+ *
+ *   Copyright (c) 2008 QUALCOMM Incorporated. All Rights Reserved.
+ *   Qualcomm Confidential and Proprietary
+ */
+
+
+#include "wlan_qct_wdi.h"
+#include "wlan_qct_dxe.h"
+#include "wlan_qct_wdi_ds.h"
+#include "wlan_qct_wdi_ds_i.h"
+#include "wlan_qct_wdi_dts.h"
+#include "wlan_qct_wdi_dp.h"
+#include "wlan_qct_wdi_sta.h"
+
+static WDTS_TransportDriverTrype gTransportDriver = {
+  WLANDXE_Open, 
+  WLANDXE_Start, 
+  WLANDXE_ClientRegistration, 
+  WLANDXE_TxFrame,
+  WLANDXE_CompleteTX,
+  WLANDXE_SetPowerState,
+  WLANDXE_Stop,
+  WLANDXE_Close,
+  WLANDXE_GetFreeTxDataResNumber
+};
+
+static WDTS_SetPowerStateCbInfoType gSetPowerStateCbInfo;
+
+/* 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;
+
+}
+
+
+/*===============================================================================
+  FUNCTION      WLANTL_GetReplayCounterFromRxBD
+     
+  DESCRIPTION   This function extracts 48-bit replay packet number from RX BD 
+ 
+  DEPENDENCIES  Validity of replay check must be done before the function 
+                is called
+                          
+  PARAMETERS    pucRxHeader pointer to RX BD header
+                                       
+  RETRUN        v_U64_t    Packet number extarcted from RX BD
+
+  SIDE EFFECTS   none
+ ===============================================================================*/
+v_U64_t
+WDTS_GetReplayCounterFromRxBD
+(
+   v_U8_t *pucRxBDHeader
+)
+{
+  v_U64_t ullcurrentReplayCounter = 0;
+  /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+/* 48-bit replay counter is created as follows
+   from RX BD 6 byte PMI command:
+   Addr : AES/TKIP
+   0x38 : pn3/tsc3
+   0x39 : pn2/tsc2
+   0x3a : pn1/tsc1
+   0x3b : pn0/tsc0
+
+   0x3c : pn5/tsc5
+   0x3d : pn4/tsc4 */
+  
+#ifdef ANI_BIG_BYTE_ENDIAN
+    /* Getting 48-bit replay counter from the RX BD */
+    ullcurrentReplayCounter = WDI_RX_BD_GET_PMICMD_20TO23(pucRxBDHeader); 
+    ullcurrentReplayCounter <<= 16;
+    ullcurrentReplayCounter |= (( WDI_RX_BD_GET_PMICMD_24TO25(pucRxBDHeader) & 0xFFFF0000) >> 16);
+    return ullcurrentReplayCounter;
+#else
+    /* Getting 48-bit replay counter from the RX BD */
+    ullcurrentReplayCounter = (WDI_RX_BD_GET_PMICMD_24TO25(pucRxBDHeader) & 0x0000FFFF); 
+    ullcurrentReplayCounter <<= 32; 
+    ullcurrentReplayCounter |= WDI_RX_BD_GET_PMICMD_20TO23(pucRxBDHeader); 
+    return ullcurrentReplayCounter;
+#endif
+}
+
+
+/* DTS Rx packet function. 
+ * This function should be invoked by the transport device to indicate 
+ * reception of 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_RxPacket (void *pContext, wpt_packet *pFrame, WDTS_ChannelType channel)
+{
+  WDI_DS_ClientDataType *pClientData = 
+    (WDI_DS_ClientDataType*)(pContext);
+  wpt_boolean       bASF, bFSF, bLSF, bAEF;
+  wpt_uint8                   ucMPDUHOffset, ucMPDUHLen, ucTid;
+  wpt_uint8                   *pBDHeader;
+  wpt_uint16                  usMPDUDOffset, usMPDULen;
+  WDI_DS_RxMetaInfoType     *pRxMetadata;
+  wpt_uint8                  isFcBd = 0;
+
+  tpSirMacFrameCtl  pMacFrameCtl;
+  // Do Sanity checks
+  if(NULL == pContext || NULL == pFrame){
+    return eWLAN_PAL_STATUS_E_FAILURE;
+  }
+
+  /*------------------------------------------------------------------------
+    Extract BD header and check if valid
+    ------------------------------------------------------------------------*/
+  pBDHeader = (wpt_uint8*)wpalPacketGetRawBuf(pFrame);
+  if(NULL == pBDHeader)
+  {
+    DTI_TRACE( DTI_TRACE_LEVEL_ERROR,
+       "WLAN TL:BD header received NULL - dropping packet");
+    wpalPacketFree(pFrame);
+    return eWLAN_PAL_STATUS_E_FAILURE;
+  }
+  WDI_SwapRxBd(pBDHeader);
+
+  ucMPDUHOffset = (wpt_uint8)WDI_RX_BD_GET_MPDU_H_OFFSET(pBDHeader);
+  usMPDUDOffset = (wpt_uint16)WDI_RX_BD_GET_MPDU_D_OFFSET(pBDHeader);
+  usMPDULen     = (wpt_uint16)WDI_RX_BD_GET_MPDU_LEN(pBDHeader);
+  ucMPDUHLen    = (wpt_uint8)WDI_RX_BD_GET_MPDU_H_LEN(pBDHeader);
+  ucTid         = (wpt_uint8)WDI_RX_BD_GET_TID(pBDHeader);
+
+  /*------------------------------------------------------------------------
+    Gather AMSDU information 
+    ------------------------------------------------------------------------*/
+  bASF = WDI_RX_BD_GET_ASF(pBDHeader);
+  bAEF = WDI_RX_BD_GET_AEF(pBDHeader);
+  bFSF = WDI_RX_BD_GET_ESF(pBDHeader);
+  bLSF = WDI_RX_BD_GET_LSF(pBDHeader);
+  isFcBd = WDI_RX_FC_BD_GET_FC(pBDHeader);
+
+  DTI_TRACE( DTI_TRACE_LEVEL_INFO,
+      "WLAN TL:BD header processing data: HO %d DO %d Len %d HLen %d"
+      " Tid %d BD %d",
+      ucMPDUHOffset, usMPDUDOffset, usMPDULen, ucMPDUHLen, ucTid,
+      WDI_RX_BD_HEADER_SIZE);
+
+  if(!isFcBd)
+  {
+      if(usMPDUDOffset <= ucMPDUHOffset || usMPDULen < ucMPDUHLen) {
+        DTI_TRACE( DTI_TRACE_LEVEL_ERROR,
+            "WLAN TL:BD header corrupted - dropping packet");
+        /* Drop packet ???? */ 
+        wpalPacketFree(pFrame);
+        return eWLAN_PAL_STATUS_SUCCESS;
+      }
+
+      if((ucMPDUHOffset < WDI_RX_BD_HEADER_SIZE) &&  (!(bASF && !bFSF))){
+        /* AMSDU case, ucMPDUHOffset = 0  it should be hancdled seperatly */
+        /* Drop packet ???? */ 
+        wpalPacketFree(pFrame);
+        return eWLAN_PAL_STATUS_SUCCESS;
+      }
+
+      /* AMSDU frame, but not first sub-frame
+       * No MPDU header, MPDU header offset is 0
+       * Total frame size is actual frame size + MPDU data offset */
+      if((ucMPDUHOffset < WDI_RX_BD_HEADER_SIZE) && (bASF && !bFSF)){
+        ucMPDUHOffset = usMPDUDOffset;
+      }
+
+      if(VPKT_SIZE_BUFFER < (usMPDULen+ucMPDUHOffset)){
+        DTI_TRACE( DTI_TRACE_LEVEL_FATAL,
+                   "Invalid Frame size, might memory corrupted");
+        wpalPacketFree(pFrame);
+        return eWLAN_PAL_STATUS_SUCCESS;
+      }
+      wpalPacketSetRxLength(pFrame, usMPDULen+ucMPDUHOffset);
+      wpalPacketRawTrimHead(pFrame, ucMPDUHOffset);
+
+     
+
+      pRxMetadata = WDI_DS_ExtractRxMetaData(pFrame);
+
+      pRxMetadata->fc = isFcBd;
+      pRxMetadata->staId = WDI_RX_BD_GET_STA_ID(pBDHeader);
+      pRxMetadata->addr3Idx = WDI_RX_BD_GET_ADDR3_IDX(pBDHeader);
+      pRxMetadata->rxChannel = WDI_RX_BD_GET_RX_CHANNEL(pBDHeader);
+      pRxMetadata->rtsf = WDI_RX_BD_GET_RTSF(pBDHeader);
+      pRxMetadata->bsf = WDI_RX_BD_GET_BSF(pBDHeader);
+      pRxMetadata->scan = WDI_RX_BD_GET_SCAN(pBDHeader);
+      pRxMetadata->dpuSig = WDI_RX_BD_GET_DPU_SIG(pBDHeader);
+      pRxMetadata->ft = WDI_RX_BD_GET_FT(pBDHeader);
+      pRxMetadata->ne = WDI_RX_BD_GET_NE(pBDHeader);
+      pRxMetadata->llcr = WDI_RX_BD_GET_LLCR(pBDHeader);
+      pRxMetadata->bcast = WDI_RX_BD_GET_UB(pBDHeader);
+      pRxMetadata->tid = ucTid;
+      pRxMetadata->dpuFeedback = WDI_RX_BD_GET_DPU_FEEDBACK(pBDHeader);
+      pRxMetadata->rateIndex = WDI_RX_BD_GET_RATEINDEX(pBDHeader);
+      pRxMetadata->rxpFlags = WDI_RX_BD_GET_RXPFLAGS(pBDHeader);
+      pRxMetadata->mclkRxTimestamp = WDI_RX_BD_GET_TIMESTAMP(pBDHeader);
+
+      /* typeSubtype in BD doesn't look like correct. Fill from frame ctrl
+         TL does it for Volans but TL does not know BD for Prima. WDI should do it */
+      if ( 0 == WDI_RX_BD_GET_FT(pBDHeader) ) {
+        if ( bASF ) {
+          pRxMetadata->subtype = WDI_MAC_DATA_QOS_DATA;
+          pRxMetadata->type    = WDI_MAC_DATA_FRAME;
+        } else {
+          pMacFrameCtl = (tpSirMacFrameCtl)(((wpt_uint8*)pBDHeader) + ucMPDUHOffset);
+          pRxMetadata->subtype = pMacFrameCtl->subType;
+          pRxMetadata->type    = pMacFrameCtl->type;
+        }
+      } else {
+        pMacFrameCtl = (tpSirMacFrameCtl)(((wpt_uint8*)pBDHeader) + WDI_RX_BD_HEADER_SIZE);
+        pRxMetadata->subtype = pMacFrameCtl->subType;
+        pRxMetadata->type    = pMacFrameCtl->type;
+      }
+
+      pRxMetadata->mpduHeaderPtr = pBDHeader + ucMPDUHOffset;
+      pRxMetadata->mpduDataPtr = pBDHeader + usMPDUDOffset;
+      pRxMetadata->mpduLength = usMPDULen;
+      pRxMetadata->mpduHeaderLength = ucMPDUHLen;
+
+      /*------------------------------------------------------------------------
+        Gather AMPDU information 
+        ------------------------------------------------------------------------*/
+      pRxMetadata->ampdu_reorderOpcode  = (wpt_uint8)WDI_RX_BD_GET_BA_OPCODE(pBDHeader);
+      pRxMetadata->ampdu_reorderSlotIdx = (wpt_uint8)WDI_RX_BD_GET_BA_SI(pBDHeader);
+      pRxMetadata->ampdu_reorderFwdIdx  = (wpt_uint8)WDI_RX_BD_GET_BA_FI(pBDHeader);
+      pRxMetadata->currentPktSeqNo       = (wpt_uint8)WDI_RX_BD_GET_BA_CSN(pBDHeader);
+
+
+      /*------------------------------------------------------------------------
+        Gather AMSDU information 
+        ------------------------------------------------------------------------*/
+      pRxMetadata->amsdu_asf  =  bASF;
+      pRxMetadata->amsdu_aef  =  bAEF;
+      pRxMetadata->amsdu_esf  =  bFSF;
+      pRxMetadata->amsdu_lsf  =  bLSF;
+      pRxMetadata->amsdu_size =  WDI_RX_BD_GET_AMSDU_SIZE(pBDHeader);
+
+      pRxMetadata->rssi0 = WDI_RX_BD_GET_RSSI0(pBDHeader);
+      pRxMetadata->rssi1 = WDI_RX_BD_GET_RSSI1(pBDHeader);
+
+
+        /* Missing: 
+      wpt_uint32 fcSTATxQStatus:8;
+      wpt_uint32 fcSTAThreshIndMask:8;
+      wpt_uint32 fcSTAPwrSaveStateMask:8;
+      wpt_uint32 fcSTAValidMask:8;
+
+      wpt_uint8 fcSTATxQLen[8]; // one byte per STA. 
+      wpt_uint8 fcSTACurTxRate[8]; // current Tx rate for each sta.   
+      unknownUcastPkt 
+      */
+
+      pRxMetadata->replayCount = WDTS_GetReplayCounterFromRxBD(pBDHeader);
+      pRxMetadata->snr = WDI_RX_BD_GET_SNR(pBDHeader); 
+
+      /* 
+       * PAL BD pointer information needs to be populated 
+       */ 
+      WPAL_PACKET_SET_BD_POINTER(pFrame, pBDHeader);
+      WPAL_PACKET_SET_BD_LENGTH(pFrame, sizeof(WDI_RxBdType));
+
+      // Invoke Rx complete callback
+      pClientData->receiveFrameCB(pClientData->pCallbackContext, pFrame);  
+  }
+  else
+  {
+      wpalPacketSetRxLength(pFrame, usMPDULen+ucMPDUHOffset);
+      wpalPacketRawTrimHead(pFrame, ucMPDUHOffset);
+
+      pRxMetadata = WDI_DS_ExtractRxMetaData(pFrame);
+      //flow control related
+      pRxMetadata->fc = isFcBd;
+      pRxMetadata->fcStaTxDisabledBitmap = WDI_RX_FC_BD_GET_STA_TX_DISABLED_BITMAP(pBDHeader);
+      pRxMetadata->fcSTAValidMask = WDI_RX_FC_BD_GET_STA_VALID_MASK(pBDHeader);
+      // Invoke Rx complete callback
+      pClientData->receiveFrameCB(pClientData->pCallbackContext, pFrame);  
+  }
+  return eWLAN_PAL_STATUS_SUCCESS;
+
+}
+
+
+
+/* DTS Out of Resource packet function. 
+ * This function should be invoked by the transport device to indicate 
+ * the device is out of resources.
+ * Parameters:
+ * pContext:Cookie that should be passed back to the caller 
+ * priority: indicates which channel is out of resource.
+ * Return Value: SUCCESS  Completed successfully.
+ *     FAILURE_XXX  Request was rejected due XXX Reason.
+ */
+wpt_status WDTS_OOResourceNotification(void *pContext, WDTS_ChannelType channel, wpt_boolean on)
+{
+  WDI_DS_ClientDataType *pClientData =
+    (WDI_DS_ClientDataType *) pContext;
+  static wpt_uint8 ac_mask = 0x1f;
+
+  // Do Sanity checks
+  if(NULL == pContext){
+    return eWLAN_PAL_STATUS_E_FAILURE;
+  }
+  
+  if(on){
+    ac_mask |=  channel == WDTS_CHANNEL_TX_LOW_PRI?  0x0f : 0x10;
+  } else {
+    ac_mask &=  channel == WDTS_CHANNEL_TX_LOW_PRI?  0x10 : 0x0f;
+  }
+
+
+  // Invoke OOR callback
+  pClientData->txResourceCB(pClientData->pCallbackContext, ac_mask); 
+  return eWLAN_PAL_STATUS_SUCCESS;
+
+}
+
+/* DTS open  function. 
+ * On open the transport device should initialize itself.
+ * Parameters:
+ *  pContext:Cookie that should be passed back to the caller along 
+ *  with the callback.
+ *
+ * Return Value: SUCCESS  Completed successfully.
+ *     FAILURE_XXX  Request was rejected due XXX Reason.
+ *
+ */
+wpt_status WDTS_openTransport( void *pContext)
+{
+  void *pDTDriverContext; 
+  WDI_DS_ClientDataType *pClientData;
+  WDI_Status sWdiStatus = WDI_STATUS_SUCCESS;
+
+  pClientData = (WDI_DS_ClientDataType*) wpalMemoryAllocate(sizeof(WDI_DS_ClientDataType));
+  if (!pClientData){
+    return eWLAN_PAL_STATUS_E_NOMEM;
+  }
+
+  pClientData->suspend = 0;
+  WDI_DS_AssignDatapathContext(pContext, (void*)pClientData);
+
+  pDTDriverContext = gTransportDriver.open(); 
+  if( NULL == pDTDriverContext )
+  {
+     DTI_TRACE( DTI_TRACE_LEVEL_ERROR, " %s fail from transport open", __FUNCTION__);
+     return eWLAN_PAL_STATUS_E_FAILURE;
+  }
+  WDT_AssignTransportDriverContext(pContext, pDTDriverContext);
+  gTransportDriver.register_client(pDTDriverContext, WDTS_RxPacket, WDTS_TxPacketComplete, 
+    WDTS_OOResourceNotification, (void*)pClientData);
+
+  /* Create a memory pool for Mgmt BDheaders.*/
+  sWdiStatus = WDI_DS_MemPoolCreate(&pClientData->mgmtMemPool, WDI_DS_MAX_CHUNK_SIZE, 
+                                                     WDI_DS_HI_PRI_RES_NUM);
+  if (WDI_STATUS_SUCCESS != sWdiStatus){
+    return eWLAN_PAL_STATUS_E_NOMEM;
+  }
+
+  /* Create a memory pool for Data BDheaders.*/
+  sWdiStatus = WDI_DS_MemPoolCreate(&pClientData->dataMemPool, WDI_DS_MAX_CHUNK_SIZE, 
+                                                      WDI_DS_LO_PRI_RES_NUM);
+  if (WDI_STATUS_SUCCESS != sWdiStatus){
+    return eWLAN_PAL_STATUS_E_NOMEM;
+  }
+
+  return eWLAN_PAL_STATUS_SUCCESS;
+
+}
+
+
+
+/* DTS start  function. 
+ * On start the transport device should start running.
+ * Parameters:
+ * pContext:Cookie that should be passed back to the caller along 
+ * with the callback.
+ *
+ * Return Value: SUCCESS  Completed successfully.
+ *     FAILURE_XXX  Request was rejected due XXX Reason.
+ *
+ */
+wpt_status WDTS_startTransport( void *pContext)
+{
+  void *pDTDriverContext = WDT_GetTransportDriverContext(pContext);
+  gTransportDriver.start(pDTDriverContext); 
+  return eWLAN_PAL_STATUS_SUCCESS;
+
+}
+
+
+/* DTS Tx packet function. 
+ * This function should be invoked by the DAL Dataservice to schedule transmit frame through DXE/SDIO.
+ * Parameters:
+ * pContext:Cookie that should be passed back to the caller along with the callback.
+ * pFrame:Refernce to PAL frame.
+ * Return Value: SUCCESS  Completed successfully.
+ *     FAILURE_XXX  Request was rejected due XXX Reason.
+ *
+ */
+wpt_status WDTS_TxPacket(void *pContext, wpt_packet *pFrame)
+{
+  void *pDTDriverContext = WDT_GetTransportDriverContext(pContext);
+  WDI_DS_TxMetaInfoType     *pTxMetadata;
+  WDTS_ChannelType channel = WDTS_CHANNEL_TX_LOW_PRI;
+  wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
+
+  // extract metadata from PAL packet
+  pTxMetadata = WDI_DS_ExtractTxMetaData(pFrame);
+
+  // assign MDPU to correct channel??
+  channel =  (pTxMetadata->frmType & WDI_MAC_DATA_FRAME)? 
+      WDTS_CHANNEL_TX_LOW_PRI : WDTS_CHANNEL_TX_HIGH_PRI;
+  
+  // Send packet to  Transport Driver. 
+  status =  gTransportDriver.xmit(pDTDriverContext, pFrame, channel);
+  return status;
+}
+
+/* DTS Tx Complete function. 
+ * This function should be invoked by the DAL Dataservice to notify tx completion to DXE/SDIO.
+ * Parameters:
+ * pContext:Cookie that should be passed back to the caller along with the callback.
+ * ucTxResReq:TX resource number required by TL
+ * Return Value: SUCCESS  Completed successfully.
+ *     FAILURE_XXX  Request was rejected due XXX Reason.
+ *
+ */
+wpt_status WDTS_CompleteTx(void *pContext, wpt_uint32 ucTxResReq)
+{
+  void *pDTDriverContext = WDT_GetTransportDriverContext(pContext);
+  
+  // Notify completion to  Transport Driver. 
+  return gTransportDriver.txComplete(pDTDriverContext, ucTxResReq);
+}
+
+/* DXE Set power state ACK callback. 
+ * This callback function should be invoked by the DXE to notify WDI that set
+ * power state request is complete.
+ * Parameters:
+ * status: status of the set operation
+ * Return Value: None.
+ *
+ */
+void  WDTS_SetPowerStateCb(wpt_status   status, unsigned int dxePhyAddr)
+{
+   //print a msg
+   if(NULL != gSetPowerStateCbInfo.cback) 
+   {
+      gSetPowerStateCbInfo.cback(status, dxePhyAddr, gSetPowerStateCbInfo.pUserData);
+   }
+}
+
+
+/* DTS Set power state function. 
+ * This function should be invoked by the DAL to notify the WLAN device power state.
+ * Parameters:
+ * pContext:Cookie that should be passed back to the caller along with the callback.
+ * powerState:Power state of the WLAN device.
+ * Return Value: SUCCESS  Set successfully in DXE control blk.
+ *     FAILURE_XXX  Request was rejected due XXX Reason.
+ *
+ */
+wpt_status WDTS_SetPowerState(void *pContext, WDTS_PowerStateType  powerState,
+                              WDTS_SetPowerStateCbType cback)
+{
+   void *pDTDriverContext = WDT_GetTransportDriverContext(pContext);
+   wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
+
+   if( cback )
+   {
+      //save the cback & cookie
+      gSetPowerStateCbInfo.pUserData = pContext;
+      gSetPowerStateCbInfo.cback = cback;
+      status = gTransportDriver.setPowerState(pDTDriverContext, powerState,
+                                            WDTS_SetPowerStateCb);
+   }
+   else
+   {
+      status = gTransportDriver.setPowerState(pDTDriverContext, powerState,
+                                               NULL);
+   }
+
+   return status;
+}
+
+/* DTS Stop function. 
+ * Stop Transport driver, ie DXE, SDIO
+ * Parameters:
+ * pContext:Cookie that should be passed back to the caller along with the callback.
+ * Return Value: SUCCESS  Completed successfully.
+ *     FAILURE_XXX  Request was rejected due XXX Reason.
+ *
+ */
+wpt_status WDTS_Stop(void *pContext)
+{
+  void *pDTDriverContext = WDT_GetTransportDriverContext(pContext);
+  wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
+
+  status =  gTransportDriver.stop(pDTDriverContext);
+
+  return status;
+}
+
+/* DTS Stop function. 
+ * Stop Transport driver, ie DXE, SDIO
+ * Parameters:
+ * pContext:Cookie that should be passed back to the caller along with the callback.
+ * Return Value: SUCCESS  Completed successfully.
+ *     FAILURE_XXX  Request was rejected due XXX Reason.
+ *
+ */
+wpt_status WDTS_Close(void *pContext)
+{
+  void *pDTDriverContext = WDT_GetTransportDriverContext(pContext);
+  WDI_DS_ClientDataType *pClientData = WDI_DS_GetDatapathContext(pContext);
+  wpt_status status = eWLAN_PAL_STATUS_SUCCESS;
+
+  /*Destroy the mem pool for mgmt BD headers*/
+  WDI_DS_MemPoolDestroy(&pClientData->mgmtMemPool);
+  
+  /*Destroy the mem pool for mgmt BD headers*/
+  WDI_DS_MemPoolDestroy(&pClientData->dataMemPool);
+  
+  status =  gTransportDriver.close(pDTDriverContext);
+
+  wpalMemoryFree(pClientData);
+
+  return status;
+}
+
+/* Get free TX data descriptor number from DXE
+ * Parameters:
+ * pContext: Cookie that should be passed back to the caller along with the callback.
+ * Return Value: number of free descriptors for TX data channel
+ *
+ */
+wpt_uint32 WDTS_GetFreeTxDataResNumber(void *pContext)
+{
+  return 
+     gTransportDriver.getFreeTxDataResNumber(WDT_GetTransportDriverContext(pContext));
+}