/*
 * CmdBldCfgIE.c
 *
 * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.      
 * All rights reserved.                                                  
 *                                                                       
 * Redistribution and use in source and binary forms, with or without    
 * modification, are permitted provided that the following conditions    
 * are met:                                                              
 *                                                                       
 *  * Redistributions of source code must retain the above copyright     
 *    notice, this list of conditions and the following disclaimer.      
 *  * Redistributions in binary form must reproduce the above copyright  
 *    notice, this list of conditions and the following disclaimer in    
 *    the documentation and/or other materials provided with the         
 *    distribution.                                                      
 *  * Neither the name Texas Instruments nor the names of its            
 *    contributors may be used to endorse or promote products derived    
 *    from this software without specific prior written permission.      
 *                                                                       
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */


/** \file  CmdBldCfgIE.c 
 *  \brief Command builder. Configuration commands information elements
 *
 *  \see   CmdBld.h 
 */
#define __FILE_ID__  FILE_ID_92
#include "osApi.h"
#include "report.h"
#include "CmdBld.h"
#include "CmdQueue_api.h"
#include "rate.h"
#include "TwIf.h"

/****************************************************************************
 *                      cmdBld_CfgIeConfigMemory()
 ****************************************************************************
 * DESCRIPTION: Configure wlan hardware memory
 *
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeConfigMemory (TI_HANDLE hCmdBld, TDmaParams *pDmaParams, void *fCb, TI_HANDLE hCb)
{   
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXConfigMemory_t AcxElm_ConfigMemory;
    ACXConfigMemory_t *pCfg = &AcxElm_ConfigMemory;
    
    os_memoryZero(pCmdBld->hOs, (void *)pCfg, sizeof(*pCfg));

    /*
     * Set information element header
     */
    pCfg->EleHdr.id = ACX_MEM_CFG;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /*
     * Set configuration fields
     */
    pCfg->numStations             = pDmaParams->NumStations;
    pCfg->rxMemblockNumber        = TWD_RX_MEM_BLKS_NUM;
    pCfg->txMinimumMemblockNumber = TWD_TX_MIN_MEM_BLKS_NUM;
    pCfg->numSsidProfiles         = 1;
    pCfg->totalTxDescriptors      = ENDIAN_HANDLE_LONG(NUM_TX_DESCRIPTORS);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/* WoneIndex value when running as station */
#define STATION_WONE_INDEX                  0


/****************************************************************************
 *                      cmdBld_CfgIeSlotTime()
 ****************************************************************************
 * DESCRIPTION: Configure/Interrogate the Slot Time
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeSlotTime (TI_HANDLE hCmdBld, TI_UINT8 apSlotTime, void *fCb, TI_HANDLE hCb)                                
{
    TCmdBld    *pCmdBld = (TCmdBld *)hCmdBld;
    ACXSlot_t   AcxElm_SlotTime;
    ACXSlot_t   *pCfg = &AcxElm_SlotTime;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_SLOT;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /* Set configuration fields */
    /* woneIndex is not relevant to station implementation */
    pCfg->woneIndex = STATION_WONE_INDEX;
    pCfg->slotTime = apSlotTime;

    TRACE1(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, ": Sending info elem to firmware, Slot Time = %d\n", (TI_UINT8)pCfg->slotTime);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIePreamble()
 ****************************************************************************
 * DESCRIPTION: Configure/Interrogate the Preamble
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIePreamble (TI_HANDLE hCmdBld, TI_UINT8 preamble, void *fCb, TI_HANDLE hCb)
{
    TCmdBld        *pCmdBld = (TCmdBld *)hCmdBld;
    ACXPreamble_t   AcxElm_Preamble;
    ACXPreamble_t   *pCfg = &AcxElm_Preamble;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_PREAMBLE_TYPE;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /* Set configuration fields */
    /* woneIndex is not relevant to station implementation */
    pCfg->preamble = preamble;

    TRACE2(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "ID=%u: preamble=%u\n", pCfg->EleHdr.id, preamble);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeRx()
 ****************************************************************************
 * DESCRIPTION: Configure/Interrogate RxConfig information element
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeRx (TI_HANDLE hCmdBld, TI_UINT32 apRxConfigOption, TI_UINT32 apRxFilterOption, void *fCb, TI_HANDLE hCb)
{
    TCmdBld       *pCmdBld = (TCmdBld *)hCmdBld;
    ACXRxConfig_t   AcxElm_RxConfig;
    ACXRxConfig_t  *pCfg = &AcxElm_RxConfig;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_RX_CFG;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /* Set configuration fields */
    pCfg->ConfigOptions = ENDIAN_HANDLE_LONG(apRxConfigOption);
    pCfg->FilterOptions = ENDIAN_HANDLE_LONG(apRxFilterOption);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}

/****************************************************************************
*                 cmdBld_CfgIeEnableRxDataFilter()
*****************************************************************************
* DESCRIPTION: Enables or disables Rx data filtering.
*
* INPUTS:  enabled             - 0 to disable data filtering, any other value to enable 
*          defaultAction       - The default action to take on non-matching packets.
*
* OUTPUT:  None
*
* RETURNS: TI_OK or TI_NOK
****************************************************************************/
TI_STATUS cmdBld_CfgIeEnableRxDataFilter (TI_HANDLE hCmdBld, TI_BOOL enabled, filter_e defaultAction, void *fCb, TI_HANDLE hCb)
{
    TCmdBld       *pCmdBld = (TCmdBld *)hCmdBld;
    DataFilterDefault_t dataFilterDefault;
    DataFilterDefault_t * pCfg = &dataFilterDefault;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_ENABLE_RX_DATA_FILTER;
    pCfg->EleHdr.len = 0;

    TRACE0(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, ": Rx Data Filter configuration:\n");
    TRACE2(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, ": enabled = %d, defaultAction = %d\n", enabled, defaultAction);

    /* Set information element configuration fields */
    pCfg->enable = enabled;
    pCfg->action = defaultAction;
    pCfg->EleHdr.len += sizeof(pCfg->enable) + sizeof(pCfg->action);

    TRACE_INFO_HEX(pCmdBld->hReport, (TI_UINT8 *) pCfg, sizeof(dataFilterDefault));

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}

/****************************************************************************
*                      cmdBld_CfgIeRxDataFilter()
*****************************************************************************
* DESCRIPTION: Add/remove Rx Data filter information element.
*
* INPUTS:  index               - Index of the Rx Data filter
*          command             - Add or remove the filter
*          action              - Action to take on packets matching the pattern
*          numFieldPatterns    - Number of field patterns in the filter
*          lenFieldPatterns    - Length of the field pattern series
*          fieldPatterns       - Series of field patterns
*
* OUTPUT:  None
*
* RETURNS: TI_OK or TI_NOK
****************************************************************************/
TI_STATUS cmdBld_CfgIeRxDataFilter (TI_HANDLE hCmdBld, 
                                    TI_UINT8 index, 
                                    TI_UINT8 command, 
                                    filter_e action, 
                                    TI_UINT8 numFieldPatterns, 
                                    TI_UINT8 lenFieldPatterns, 
                                    TI_UINT8 *pFieldPatterns, 
                                    void *fCb, 
                                    TI_HANDLE hCb)
{
    TCmdBld       *pCmdBld = (TCmdBld *)hCmdBld;
    TI_UINT8 dataFilterConfig[sizeof(DataFilterConfig_t) + MAX_DATA_FILTER_SIZE];
    DataFilterConfig_t * pCfg = (DataFilterConfig_t *) &dataFilterConfig;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_SET_RX_DATA_FILTER;
    pCfg->EleHdr.len = 0;

    TRACE0(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, ": Rx Data Filter configuration:\n");
    TRACE5(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, ": command = %d, index = %d, action = %d, numFieldPatterns = %d, lenFieldPatterns = %d\n", command, index, action, numFieldPatterns, lenFieldPatterns);

    /* Set information element configuration fields */
    pCfg->command = command;
    pCfg->index = index;
    pCfg->EleHdr.len += sizeof(pCfg->command) + sizeof(pCfg->index);

    /* When removing a filter only the index and command are to be sent */
    if (command == ADD_FILTER)
    {
        pCfg->action = action;
        pCfg->numOfFields = numFieldPatterns;
        pCfg->EleHdr.len += sizeof(pCfg->action) + sizeof(pCfg->numOfFields);

        if (pFieldPatterns == NULL)
        {
            TRACE0(pCmdBld->hReport, REPORT_SEVERITY_ERROR, ": Null pattern table argument received!\n");

            return PARAM_VALUE_NOT_VALID;
        }

        os_memoryCopy(pCmdBld->hOs, &pCfg->FPTable, pFieldPatterns, lenFieldPatterns);
        pCfg->EleHdr.len += lenFieldPatterns;
    }

    TRACE_INFO_HEX(pCmdBld->hReport, (TI_UINT8 *) pCfg, sizeof(dataFilterConfig));

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(dataFilterConfig), fCb, hCb, NULL);
}

/****************************************************************************
 *                      cmdBld_CfgIeArpIpFilter()
 ****************************************************************************
 * DESCRIPTION: Configure/Interrogate ARP addr table information element for
 *              ipV4 only
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeArpIpFilter (TI_HANDLE hCmdBld, 
                                   TIpAddr   tIpAddr,
                                   TI_BOOL   bFilteringEnabled, 
                                   void      *fCb, 
                                   TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXConfigureIP_t AcxElm_CmdConfigureIP;
    ACXConfigureIP_t *pCfg = &AcxElm_CmdConfigureIP;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_ARP_IP_FILTER;
    pCfg->EleHdr.len = sizeof(ACXConfigureIP_t) - sizeof(EleHdrStruct);

    pCfg->arpFilterEnable = (TI_UINT32)bFilteringEnabled;
        
    /* IP address */
    /* Note that in the case of IPv4 it is assumed that the extra two bytes are zero */
    IP_COPY (pCfg->address, tIpAddr);

    TRACE3(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "ID=%u: ip=%x, enable=%u\n", pCfg->EleHdr.id, *((TI_UINT32*)pCfg->address), bFilteringEnabled);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(ACXConfigureIP_t), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeGroupAdressTable()
 ****************************************************************************
 * DESCRIPTION: Configure/Interrogate Group addr table information element
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeGroupAdressTable (TI_HANDLE       hCmdBld, 
                                        TI_UINT8        numGroupAddrs, 
                                        TMacAddr        *pGroupAddr, 
                                        TI_BOOL         bEnabled, 
                                        void            *fCb, 
                                        TI_HANDLE       hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    TI_UINT32   i = 0;
    TI_UINT8   *tmpLoc = NULL;
    dot11MulticastGroupAddrStart_t  AcxElm_CmdConfigureMulticastIp;
    dot11MulticastGroupAddrStart_t* pCfg = &AcxElm_CmdConfigureMulticastIp;
      
    os_memoryZero (pCmdBld->hOs, (void *)pCfg, sizeof(dot11MulticastGroupAddrStart_t));

    /* Set information element header */
    pCfg->EleHdr.id = DOT11_GROUP_ADDRESS_TBL;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);
     
    pCfg->numOfGroups = numGroupAddrs;
    pCfg->fltrState = bEnabled;
    tmpLoc = pCfg->dataLocation;
        
    if (NULL != pGroupAddr)
    {
        for (i = 0; i < numGroupAddrs; i++) 
        {
            MAC_COPY (&tmpLoc[MAC_ADDR_LEN * i], *(pGroupAddr + i));

            TRACE7(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "cmdBld_CfgIeGroupAdressTable: MAC %x: %x:%x:%x:%x:%x:%x\n", i, tmpLoc[MAC_ADDR_LEN*i+0] , tmpLoc[MAC_ADDR_LEN*i+1] , tmpLoc[MAC_ADDR_LEN*i+2] , tmpLoc[MAC_ADDR_LEN*i+3] , tmpLoc[MAC_ADDR_LEN*i+4] , tmpLoc[MAC_ADDR_LEN*i+5]);
        }
    }

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(dot11MulticastGroupAddrStart_t), fCb, hCb, NULL);
    
}


/****************************************************************************
 *                      cmdBld_CfgIeSgEnable()
 ****************************************************************************
 * DESCRIPTION: Enable/Disable the BTH-WLAN  
 *
 * INPUTS:  Enable flag
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeSgEnable (TI_HANDLE hCmdBld, ESoftGeminiEnableModes SoftGeminiEnableModes, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXBluetoothWlanCoEnableStruct  AcxElm_BluetoothWlanEnable;
    ACXBluetoothWlanCoEnableStruct* pCfg = &AcxElm_BluetoothWlanEnable;

    TRACE1(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "cmdBld_CfgIeSgEnable: Enable flag = %d\n", SoftGeminiEnableModes);

    /* Set information element header */
    pCfg->EleHdr.id = ACX_SG_ENABLE;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /* Set enable field */
    pCfg->coexOperationMode = (TI_UINT8)SoftGeminiEnableModes;

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeSg()
 ****************************************************************************
 * DESCRIPTION: Configure the BTH-WLAN co-exsistance   
 *
 * INPUTS:  Configuration structure pointer 
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeSg (TI_HANDLE hCmdBld, TSoftGeminiParams *pSoftGeminiParam, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXBluetoothWlanCoParamsStruct  AcxElm_BluetoothWlanEnable;
    ACXBluetoothWlanCoParamsStruct *pCfg = &AcxElm_BluetoothWlanEnable;
	int i=0;
    
    TRACE0(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "cmdBld_CfgIeSg. \n");

    /* Set information element header */
    pCfg->EleHdr.id      		= ACX_SG_CFG;
    pCfg->EleHdr.len     		= sizeof(*pCfg) - sizeof(EleHdrStruct);

	pCfg->softGeminiParams.paramIdx = pSoftGeminiParam->paramIdx;


	for (i=0; i< SOFT_GEMINI_PARAMS_MAX ; i++)
	{
		pCfg->softGeminiParams.coexParams[i] = pSoftGeminiParam->coexParams[i];
	}

    /* Rate conversion is done in the HAL */
    pCfg->softGeminiParams.coexParams[SOFT_GEMINI_RATE_ADAPT_THRESH] = rateNumberToBitmap((TI_UINT8)pSoftGeminiParam->coexParams[SOFT_GEMINI_RATE_ADAPT_THRESH]);

	if (pCfg->softGeminiParams.coexParams[SOFT_GEMINI_RATE_ADAPT_THRESH] == 0)
    {
        TRACE0(pCmdBld->hReport, REPORT_SEVERITY_ERROR, "coexAPRateAdapationThr is 0, convert to 1MBPS. \n");
        pCfg->softGeminiParams.coexParams[SOFT_GEMINI_RATE_ADAPT_THRESH] = HW_BIT_RATE_1MBPS;
    }

    /* Send the configuration command */
    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeFmCoex()
 ****************************************************************************
 * DESCRIPTION: Configure the FM-WLAN co-exsistance parameters
 *
 * INPUTS:  Configuration structure pointer
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeFmCoex (TI_HANDLE hCmdBld, TFmCoexParams *pFmCoexParams, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXWlanFmCoexStruct  tFmWlanCoex;
    ACXWlanFmCoexStruct *pCfg = &tFmWlanCoex;

    TRACE0(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "cmdBld_CfgIeFmCoex\n");

    /* Set information element header */
    pCfg->EleHdr.id  = ACX_FM_COEX_CFG;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /* Set parameters with endianess handling */
    pCfg->enable                   = pFmCoexParams->uEnable;
    pCfg->swallowPeriod            = pFmCoexParams->uSwallowPeriod;
    pCfg->nDividerFrefSet1         = pFmCoexParams->uNDividerFrefSet1;
    pCfg->nDividerFrefSet2         = pFmCoexParams->uNDividerFrefSet2;
    pCfg->mDividerFrefSet1         = ENDIAN_HANDLE_WORD(pFmCoexParams->uMDividerFrefSet1);
    pCfg->mDividerFrefSet2         = ENDIAN_HANDLE_WORD(pFmCoexParams->uMDividerFrefSet2);
    pCfg->coexPllStabilizationTime = ENDIAN_HANDLE_LONG(pFmCoexParams->uCoexPllStabilizationTime);
    pCfg->ldoStabilizationTime     = ENDIAN_HANDLE_WORD(pFmCoexParams->uLdoStabilizationTime);
    pCfg->fmDisturbedBandMargin    = pFmCoexParams->uFmDisturbedBandMargin;
    pCfg->swallowClkDif            = pFmCoexParams->uSwallowClkDif;

    /* Send the configuration command */
    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeMemoryMap ()
 ****************************************************************************
 * DESCRIPTION: Configure/Interrogate MemoryMap information element
 *
 * INPUTS:
 *      AcxElm_MemoryMap_T *apMap   pointer to the memory map structure
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeMemoryMap (TI_HANDLE hCmdBld, MemoryMap_t *apMap, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    MemoryMap_t SwapMap;
    TI_UINT32 *pSwap, *pOrig, i, uMemMapNumFields;

    /* Set information element header */
    SwapMap.EleHdr.id  = ACX_MEM_MAP;
    SwapMap.EleHdr.len = sizeof(MemoryMap_t) - sizeof(EleHdrStruct);

    /* Solve endian problem (all fields are 32 bit) */
    pOrig = (TI_UINT32* )&apMap->codeStart;
    pSwap = (TI_UINT32* )&SwapMap.codeStart;
    uMemMapNumFields = (sizeof(MemoryMap_t) - sizeof(EleHdrStruct)) % 4;
    for (i = 0; i < uMemMapNumFields; i++)
        pSwap[i] = ENDIAN_HANDLE_LONG(pOrig[i]);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, &SwapMap, sizeof(SwapMap), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeAid()
 ****************************************************************************
 * DESCRIPTION: Configure/Interrogate the AID info element
 *
 * INPUTS:
 *      TI_UINT16* apAidVal     The AID value
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeAid (TI_HANDLE hCmdBld, TI_UINT16 apAidVal, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXAid_t    WlanElm_AID;
    ACXAid_t    *pCfg = &WlanElm_AID;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_AID;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    pCfg->Aid = ENDIAN_HANDLE_WORD(apAidVal);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeWakeUpCondition()
 ****************************************************************************
 * DESCRIPTION: Configure/Interrogate the power management option
 *
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeWakeUpCondition (TI_HANDLE hCmdBld, TPowerMgmtConfig *pPMConfig, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    WakeUpCondition_t WakeUpCondition;
    WakeUpCondition_t *pCfg = &WakeUpCondition;

    TRACE1(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION , "WakeUpCondition :\n                             listenInterval = 0x%X\n", pPMConfig->listenInterval);

    switch (pPMConfig->tnetWakeupOn)
    {
        case TNET_WAKE_ON_BEACON:
            pCfg->wakeUpConditionBitmap = WAKE_UP_EVENT_BEACON_BITMAP;
            break;
        case TNET_WAKE_ON_DTIM:
            pCfg->wakeUpConditionBitmap = WAKE_UP_EVENT_DTIM_BITMAP;
            break;
        case TNET_WAKE_ON_N_BEACON:
            pCfg->wakeUpConditionBitmap = WAKE_UP_EVENT_N_BEACONS_BITMAP;
            break;
        case TNET_WAKE_ON_N_DTIM:
            pCfg->wakeUpConditionBitmap = WAKE_UP_EVENT_N_DTIM_BITMAP;
            break;
        default:
            pCfg->wakeUpConditionBitmap = WAKE_UP_EVENT_BEACON_BITMAP;
            break;
    }

    pCfg->listenInterval = pPMConfig->listenInterval;

    TRACE2(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, " cmdBld_wakeUpCondition  tnetWakeupOn=0x%x listenInterval=%d\n",pCfg->wakeUpConditionBitmap,pCfg->listenInterval);

    /* Set information element header */
    pCfg->EleHdr.id = ACX_WAKE_UP_CONDITIONS;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeSleepAuth()
 ****************************************************************************
 * DESCRIPTION: Configure/Interrogate the power management option
 *
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeSleepAuth (TI_HANDLE hCmdBld, EPowerPolicy eMinPowerLevel, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXSleepAuth_t ACXSleepAuth;
    ACXSleepAuth_t *pCfg = &ACXSleepAuth;
    EElpCtrlMode eElpCtrlMode;

    /* Set the ELP control according to the new power policy */
    switch (eMinPowerLevel) 
    {
    case POWERAUTHO_POLICY_AWAKE:   eElpCtrlMode = ELPCTRL_MODE_KEEP_AWAKE;  break;
    case POWERAUTHO_POLICY_PD:      eElpCtrlMode = ELPCTRL_MODE_KEEP_AWAKE;  break;
    case POWERAUTHO_POLICY_ELP:     eElpCtrlMode = ELPCTRL_MODE_NORMAL;      break;
    default:
        TRACE1(pCmdBld->hReport, REPORT_SEVERITY_ERROR, " - Param value is not supported, %d\n", eMinPowerLevel);
        return TI_NOK;

    }

    /* Set the ELP mode only if there is a change */
    if (pCmdBld->uLastElpCtrlMode != eElpCtrlMode)
    {
        pCmdBld->uLastElpCtrlMode = eElpCtrlMode;
		if (eElpCtrlMode == ELPCTRL_MODE_KEEP_AWAKE)
		{
			twIf_Awake(pCmdBld->hTwIf);
		}
		else
		{
			twIf_Sleep(pCmdBld->hTwIf);
		}
    }

    /* In the info element the enums are in reverse */
    switch (eMinPowerLevel)
    {
        case POWERAUTHO_POLICY_ELP:
            pCfg->sleepAuth = 2;
            break;
        case POWERAUTHO_POLICY_AWAKE:
            pCfg->sleepAuth = 0;
            break;
        default:
            pCfg->sleepAuth = eMinPowerLevel;
    }

    TRACE1(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, " cmdBld_MinPowerLevelSet  sleepAuth=%d\n", eMinPowerLevel);

    /* Set information element header*/
    pCfg->EleHdr.id = ACX_SLEEP_AUTH;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeBcnBrcOptions()
 ****************************************************************************
 * DESCRIPTION: Configure/Interrogate the power management option
 *
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeBcnBrcOptions (TI_HANDLE hCmdBld, TPowerMgmtConfig *pPMConfig, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXBeaconAndBroadcastOptions_t ACXBeaconAndBroadcastOptions;
    ACXBeaconAndBroadcastOptions_t *pCfg = &ACXBeaconAndBroadcastOptions;

    pCfg->beaconRxTimeOut = pPMConfig->BcnBrcOptions.BeaconRxTimeout;
    pCfg->broadcastTimeOut = pPMConfig->BcnBrcOptions.BroadcastRxTimeout;
    pCfg->rxBroadcastInPS = pPMConfig->BcnBrcOptions.RxBroadcastInPs;
	pCfg->consecutivePsPollDeliveryFailureThr = pPMConfig->ConsecutivePsPollDeliveryFailureThreshold;


    TRACE4(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, " cmdBld_BcnBrcOptions  BeaconRxTimeout=%d BroadcastRxTimeout=%d RxBroadcastInPs=0x%x, consecutivePsPollDeliveryFailureThr=%d\n",							 pCfg->beaconRxTimeOut,pCfg->broadcastTimeOut,							 pCfg->rxBroadcastInPS, pCfg->consecutivePsPollDeliveryFailureThr);

    /* Set information element header */
    pCfg->EleHdr.id = ACX_BCN_DTIM_OPTIONS;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeFeatureConfig()
                                    ACXBeaconAndBroadcastOptions_t* pWlanElm_BcnBrcOptions,
 ****************************************************************************
 * DESCRIPTION: Configure the feature config info element
 *
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeFeatureConfig (TI_HANDLE hCmdBld, TI_UINT32 options, TI_UINT32 uDataFlowOptions, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXFeatureConfig_t  WlanElm_FeatureConfig;
    ACXFeatureConfig_t  *pCfg = &WlanElm_FeatureConfig;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_FEATURE_CFG;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /* Set fields */
    pCfg->Options = ENDIAN_HANDLE_LONG(options);
    pCfg->dataflowOptions = ENDIAN_HANDLE_LONG(uDataFlowOptions);

    TRACE3(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "ID=%u: option=0x%x, def.option=0x%x\n", pCfg->EleHdr.id, options, uDataFlowOptions);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeTxPowerDbm ()
 ****************************************************************************
 * DESCRIPTION: Set the Tx power in Dbm units.
 *
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeTxPowerDbm (TI_HANDLE hCmdBld, TI_UINT8 uTxPowerDbm , void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    dot11CurrentTxPowerStruct dot11CurrentTxPower;
    dot11CurrentTxPowerStruct *pCfg = &dot11CurrentTxPower;

   TRACE1( pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, " uTxPowerDbm = %d\n", uTxPowerDbm);


    /* Set information element header*/
    pCfg->EleHdr.id = DOT11_CUR_TX_PWR;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    pCfg->dot11CurrentTxPower = uTxPowerDbm;

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeStatisitics ()
 ****************************************************************************
 * DESCRIPTION: Set the ACX statistics counters to zero.
 *
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeStatisitics (TI_HANDLE hCmdBld, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    TI_STATUS status = TI_NOK;
    ACXStatistics_t  *pCfg;

    pCfg = os_memoryAlloc(pCmdBld->hOs, sizeof(ACXStatistics_t));
    if (!pCfg)
        return status;
    /* Set information element header */
    pCfg->EleHdr.id  = ACX_STATISTICS;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    status = cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
    os_memoryFree(pCmdBld->hOs, pCfg, sizeof(ACXStatistics_t));
    return status;
}


/****************************************************************************
 *                      cmdBld_CfgIeTid()
 ****************************************************************************
 * DESCRIPTION: Write the Queue configuration (For Quality Of Service)
 *
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeTid (TI_HANDLE hCmdBld, TQueueTrafficParams* pQtrafficParams, void *fCb, TI_HANDLE hCb)
                                          
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXTIDConfig_t    TrafficCategoryCfg;
    ACXTIDConfig_t   *pCfg = &TrafficCategoryCfg;

    os_memoryZero (pCmdBld->hOs, (void *)pCfg, sizeof(*pCfg));

    /*
     * Set information element header
     * ==============================
     */
    pCfg->EleHdr.id = ACX_TID_CFG;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /*
     * Set information element Data
     * ==============================
     */
    pCfg->queueID       = pQtrafficParams->queueID;
    pCfg->channelType   = pQtrafficParams->channelType;
    pCfg->tsid          = pQtrafficParams->tsid;
    pCfg->psScheme      = pQtrafficParams->psScheme; 
    pCfg->APSDConf[0]   = pQtrafficParams->APSDConf[0];
    pCfg->APSDConf[1]   = pQtrafficParams->APSDConf[1];

    TRACE7(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION , "ID=%u: queue-id=%u, chan-type=%u, tsid=%u, ps-scheme=%u, apsd-1=0x%x, apsd-2=0x%x\n", pCfg->EleHdr.id, pCfg->queueID, pCfg->channelType, pCfg->tsid, pCfg->psScheme, pCfg->APSDConf[0], pCfg->APSDConf[1]);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeAcParams()
 ****************************************************************************
 * DESCRIPTION: Write the AC configuration (For Quality Of Service)
 *
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeAcParams (TI_HANDLE hCmdBld, TAcQosParams *pAcQosParams, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXAcCfg_t     AcCfg;
    ACXAcCfg_t    *pCfg  = &AcCfg;

    os_memoryZero (pCmdBld->hOs, (void *)pCfg, sizeof(*pCfg));

    /*
     * Set information element header
     * ==============================
     */
    pCfg->EleHdr.id = ACX_AC_CFG;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /*
     * Set information element Data
     * ==============================
     */

    pCfg->ac        = pAcQosParams->ac;
    pCfg->aifsn     = pAcQosParams->aifsn;
    pCfg->cwMax     = ENDIAN_HANDLE_WORD(pAcQosParams->cwMax);
    pCfg->cwMin     = pAcQosParams->cwMin;
    pCfg->txopLimit = ENDIAN_HANDLE_WORD(pAcQosParams->txopLimit);

    TRACE6(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "ID=%u: ac= %u, aifsn=%u, cw-max=%u, cw-min=%u, txop=%u\n", pCfg->EleHdr.id, pAcQosParams->ac, pAcQosParams->aifsn, pAcQosParams->cwMax, pAcQosParams->cwMin, pAcQosParams->txopLimit);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIePsRxStreaming()
 ****************************************************************************
 * DESCRIPTION: Write the AC PS-Rx-Streaming
 *
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIePsRxStreaming (TI_HANDLE hCmdBld, TPsRxStreaming *pPsRxStreaming, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXPsRxStreaming_t  tStreamingCfg;
    ACXPsRxStreaming_t *pCfg  = &tStreamingCfg;

    os_memoryZero (pCmdBld->hOs, (void *)pCfg, sizeof(*pCfg));

    /*
     * Set information element header
     * ==============================
     */
    pCfg->EleHdr.id = ACX_PS_RX_STREAMING;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /*
     * Set information element Data
     * ============================
     */
    pCfg->TID          = (TI_UINT8)pPsRxStreaming->uTid;
    pCfg->rxPSDEnabled = (TI_UINT8)pPsRxStreaming->bEnabled;
    pCfg->streamPeriod = (TI_UINT8)pPsRxStreaming->uStreamPeriod;
    pCfg->txTimeout    = (TI_UINT8)pPsRxStreaming->uTxTimeout;

    TRACE5(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "ID=%u: tid= %u, enable=%u, streamPeriod=%u, txTimeout=%u\n", pCfg->EleHdr.id, pCfg->TID, pCfg->rxPSDEnabled, pCfg->streamPeriod, pCfg->txTimeout);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIePacketDetectionThreshold()
 ****************************************************************************
 * DESCRIPTION:  Set the PacketDetection threshold
 *
 * INPUTS:  
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIePacketDetectionThreshold (TI_HANDLE hCmdBld, TI_UINT32 pdThreshold, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXPacketDetection_t  PacketDetectionThresholdCfg;
    ACXPacketDetection_t *pCfg = &PacketDetectionThresholdCfg;

    /*
     * Set information element header
     * ==============================
     */
    pCfg->EleHdr.id = ACX_PD_THRESHOLD;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /*
     * Set information element Data
     * ==============================
     */
    pCfg->pdThreshold = ENDIAN_HANDLE_LONG(pdThreshold);

    TRACE2(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, ": pdThreshold = 0x%x , len = 0x%x \n",pCfg->pdThreshold,pCfg->EleHdr.len);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}




/****************************************************************************
 *                      cmdBld_CfgIeBeaconFilterOpt()
 ****************************************************************************
 * DESCRIPTION: Configure/Interrogate the beacon filtering option
 *
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeBeaconFilterOpt (TI_HANDLE hCmdBld, TI_UINT8 beaconFilteringStatus, TI_UINT8 numOfBeaconsToBuffer, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXBeaconFilterOptions_t  ACXBeaconFilterOptions;
    ACXBeaconFilterOptions_t *pCfg = &ACXBeaconFilterOptions;
    
    pCfg->enable = beaconFilteringStatus;
    pCfg->maxNumOfBeaconsStored = numOfBeaconsToBuffer;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_BEACON_FILTER_OPT;
    pCfg->EleHdr.len = sizeof(ACXBeaconFilterOptions_t) - sizeof(EleHdrStruct);

    TRACE3(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION , "ID=%u: enable=%u, num-stored=%u\n", pCfg->EleHdr.id, beaconFilteringStatus, numOfBeaconsToBuffer);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(ACXBeaconFilterOptions_t), fCb, hCb, NULL);
}
/****************************************************************************
 *                      cmdBld_CfgIeRateMngDbg()
 ****************************************************************************
 * DESCRIPTION: Configure the rate managment params
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/

TI_STATUS cmdBld_CfgIeRateMngDbg (TI_HANDLE hCmdBld, RateMangeParams_t *pRateMngParams, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    AcxRateMangeParams  RateMng;
    AcxRateMangeParams *pCfg = &RateMng;
	int i;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_SET_RATE_MAMAGEMENT_PARAMS;
    pCfg->EleHdr.len = sizeof(AcxRateMangeParams) - sizeof(EleHdrStruct);


    TRACE2(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION , "ID=%u, index=%d \n",pCfg->EleHdr.id,pRateMngParams->paramIndex);

	pCfg->paramIndex = pRateMngParams->paramIndex;

	pCfg->InverseCuriosityFactor = pRateMngParams->InverseCuriosityFactor;
    pCfg->MaxPer = pRateMngParams->MaxPer;
	pCfg->PerAdd = pRateMngParams->PerAdd;
	pCfg->PerAddShift = pRateMngParams->PerAddShift;
	pCfg->PerAlphaShift = pRateMngParams->PerAlphaShift;
	pCfg->PerBeta1Shift = pRateMngParams->PerBeta1Shift;
	pCfg->PerBeta2Shift = pRateMngParams->PerBeta2Shift;
	pCfg->PerTh1 = pRateMngParams->PerTh1;
	pCfg->PerTh2 = pRateMngParams->PerTh2;
	pCfg->RateCheckDown = pRateMngParams->RateCheckDown;
	pCfg->RateCheckUp = pRateMngParams->RateCheckUp;
	pCfg->RateRetryScore = pRateMngParams->RateRetryScore;
	pCfg->TxFailHighTh = pRateMngParams->TxFailHighTh;
	pCfg->TxFailLowTh = pRateMngParams->TxFailLowTh;

	for (i=0 ; i< 13 ; i++)
	{
		pCfg->RateRetryPolicy[i] = pRateMngParams->RateRetryPolicy[i];
	}

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(AcxRateMangeParams), fCb, hCb, NULL);
}



/****************************************************************************
 *                     cmdBld_CfgIeBeaconFilterTable
 ****************************************************************************
 * DESCRIPTION: Configure/Interrogate the beacon filter IE table
 *
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeBeaconFilterTable (TI_HANDLE hCmdBld,
                                         TI_UINT8   uNumberOfIEs, 
                                         TI_UINT8  *pIETable,
                                         TI_UINT8   uIETableSize, 
                                         void      *fCb, 
                                         TI_HANDLE  hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXBeaconFilterIETable_t beaconFilterIETableStruct;
    ACXBeaconFilterIETable_t *pCfg = &beaconFilterIETableStruct;
    TI_UINT32 counter;
    
    if (NULL == pIETable) 
    {
        return PARAM_VALUE_NOT_VALID;
    }

    pCfg->EleHdr.id = ACX_BEACON_FILTER_TABLE;
    pCfg->EleHdr.len = uIETableSize + 1; 
    pCfg->NumberOfIEs = uNumberOfIEs;
        
    os_memoryZero (pCmdBld->hOs, (void *)pCfg->IETable, BEACON_FILTER_TABLE_MAX_SIZE);
    os_memoryCopy (pCmdBld->hOs, (void *)pCfg->IETable, (void *)pIETable, uIETableSize);
        
    TRACE3(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION , "ID=%u: num-ie=%u, table-size=%u\n", pCfg->EleHdr.id, uNumberOfIEs, uIETableSize);

TRACE0(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "Beacon IE Table:\n");
    for (counter = 0; counter < uIETableSize; counter++)
    {
TRACE1(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "%2x ", pIETable[counter]);
	}
TRACE0(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "\n");
        
    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(ACXBeaconFilterIETable_t), fCb, hCb, NULL);
}
 
/****************************************************************************
 *                     cmdBld_CfgCoexActivity
 ****************************************************************************
 * DESCRIPTION: Configure/Interrogate the Coex activity IE 
 *
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeCoexActivity (TI_HANDLE hCmdBld,
                                         TCoexActivity  *pCoexActivity,
                                         void      *fCb, 
                                         TI_HANDLE  hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXCoexActivityIE_t coexActivityIEStruct;
    ACXCoexActivityIE_t *pCfg = &coexActivityIEStruct;
    
    if (NULL == pCoexActivity) 
    {
        return PARAM_VALUE_NOT_VALID;
    }

    pCfg->EleHdr.id = ACX_COEX_ACTIVITY;
    pCfg->EleHdr.len = sizeof(ACXCoexActivityIE_t) - sizeof(EleHdrStruct);
        
    TRACE1(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "CoexActivity: ID=0x%x\n", pCfg->EleHdr.id);

    pCfg->coexIp          = pCoexActivity->coexIp;
    pCfg->activityId      = pCoexActivity->activityId;
    pCfg->defaultPriority = pCoexActivity->defaultPriority;
    pCfg->raisedPriority  = pCoexActivity->raisedPriority;
    pCfg->minService      = ENDIAN_HANDLE_WORD(pCoexActivity->minService);
    pCfg->maxService      = ENDIAN_HANDLE_WORD(pCoexActivity->maxService);

    TRACE6(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "CoexActivity: 0x%02x 0x%02x - 0x%02x 0x%02x 0x%04x 0x%04x\n", 
            pCfg->coexIp,
            pCfg->activityId,
            pCfg->defaultPriority,
            pCfg->raisedPriority,
            pCfg->minService,
            pCfg->maxService);
 
    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}

/****************************************************************************
 *                      cmdBld_CfgIeCcaThreshold()
 ****************************************************************************
 * DESCRIPTION: Configure/Interrogate the Slot Time
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeCcaThreshold (TI_HANDLE hCmdBld, TI_UINT16 ccaThreshold, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXEnergyDetection_t AcxElm_CcaThreshold;
    ACXEnergyDetection_t *pCfg = &AcxElm_CcaThreshold;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_CCA_THRESHOLD;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);
    
    pCfg->rxCCAThreshold = ENDIAN_HANDLE_WORD(ccaThreshold);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeEventMask()
 ****************************************************************************
 * DESCRIPTION: Change the Event Vector Mask in the FW
 * 
 * INPUTS: MaskVector   The Updated Vector Mask
 * 
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeEventMask (TI_HANDLE hCmdBld, TI_UINT32 mask, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;

    ACXEventMboxMask_t EventMboxData;
    ACXEventMboxMask_t *pCfg = &EventMboxData;

    /* Set information element header*/
    pCfg->EleHdr.id = ACX_EVENT_MBOX_MASK; 
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);
    pCfg->lowEventMask = ENDIAN_HANDLE_LONG(mask);
    pCfg->highEventMask = ENDIAN_HANDLE_LONG(0xffffffff); /* Not in Use */

    TRACE0(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION , "cmdBld_CfgIeEventMask:\n");

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeMaxTxRetry()
 ****************************************************************************
 * DESCRIPTION: Configure the Max Tx Retry parameters
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeMaxTxRetry (TI_HANDLE hCmdBld,
                                  TRroamingTriggerParams *pRoamingTriggerCmd,
                                  void      *fCb, 
                                  TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXConsTxFailureTriggerParameters_t AcxElm_SetMaxTxRetry;
    ACXConsTxFailureTriggerParameters_t* pCfg = &AcxElm_SetMaxTxRetry;

    pCfg->maxTxRetry = pRoamingTriggerCmd->maxTxRetry;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_CONS_TX_FAILURE;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);
    
    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeConnMonitParams()
 ****************************************************************************
 * DESCRIPTION: Configure the Bss Lost Timeout & TSF miss threshold
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeConnMonitParams (TI_HANDLE hCmdBld, TRroamingTriggerParams *pRoamingTriggerCmd, void *fCb, TI_HANDLE hCb)                                           
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    AcxConnectionMonitorOptions  AcxElm_SetBssLossTsfThreshold;
    AcxConnectionMonitorOptions* pCfg = &AcxElm_SetBssLossTsfThreshold;

    pCfg->BSSLossTimeout     = ENDIAN_HANDLE_LONG(pRoamingTriggerCmd->BssLossTimeout);
    pCfg->TSFMissedThreshold = ENDIAN_HANDLE_LONG(pRoamingTriggerCmd->TsfMissThreshold);

    /* Set information element header */
    pCfg->EleHdr.id  = ACX_CONN_MONIT_PARAMS;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);
    
    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeTxRatePolicy()
 ****************************************************************************
 * DESCRIPTION: Write the TxRateClass configuration 
 *
 * INPUTS:
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeTxRatePolicy (TI_HANDLE hCmdBld, TTxRatePolicy *pTxRatePolicy, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXTxAttrClasses_t  TxClassCfg;
    ACXTxAttrClasses_t *pCfg  = &TxClassCfg;
    TI_UINT8 PolicyId;
    
    os_memoryZero (pCmdBld->hOs, (void *)pCfg, sizeof(*pCfg));

    /*
     * Set information element header
     * ==============================
     */
    pCfg->EleHdr.id = ACX_RATE_POLICY;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);
    pCfg->numOfClasses = pTxRatePolicy->numOfRateClasses;

    for (PolicyId = 0; PolicyId < pTxRatePolicy->numOfRateClasses; PolicyId++)
    {
        os_memoryCopy (pCmdBld->hOs,
                       (void *)&(pCfg->rateClasses[PolicyId]),
                       (void *)&(pTxRatePolicy->rateClass[PolicyId]),
                       sizeof(TTxRateClass));
    }
    
    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeRtsThreshold()
 ****************************************************************************
 * DESCRIPTION: Configure the RTS threshold
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeRtsThreshold (TI_HANDLE hCmdBld, TI_UINT16 uRtsThreshold, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    dot11RTSThreshold_t AcxElm_RtsThreshold;
    dot11RTSThreshold_t *pCfg = &AcxElm_RtsThreshold;

    /* Set information element header */
    pCfg->EleHdr.id = DOT11_RTS_THRESHOLD;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    pCfg->RTSThreshold = ENDIAN_HANDLE_WORD(uRtsThreshold);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeRtsThreshold()
 ****************************************************************************
 * DESCRIPTION: Configure the tx fragmentation threshold
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeFragmentThreshold (TI_HANDLE hCmdBld, TI_UINT16 uFragmentThreshold, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXFRAGThreshold_t AcxElm_FragmentThreshold;
    ACXFRAGThreshold_t *pCfg = &AcxElm_FragmentThreshold;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_FRAG_CFG;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    pCfg->fragThreshold = ENDIAN_HANDLE_WORD(uFragmentThreshold);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIePmConfig()
 ****************************************************************************
 * DESCRIPTION: Configure PM parameters
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIePmConfig (TI_HANDLE   hCmdBld, 
                                TI_UINT32   uHostClkSettlingTime,
                                TI_UINT8    uHostFastWakeupSupport, 
                                void *      fCb, 
                                TI_HANDLE   hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXPMConfig_t tPmConfig;
    ACXPMConfig_t *pCfg = &tPmConfig;

    /* Set information element header*/
    pCfg->EleHdr.id  = ACX_PM_CONFIG;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    pCfg->hostClkSettlingTime   = uHostClkSettlingTime;
    pCfg->hostFastWakeupSupport = uHostFastWakeupSupport;

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeTxCmpltPacing()
 ****************************************************************************
 * DESCRIPTION: Configure Tx-Complete interrupt pacing to FW
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeTxCmpltPacing (TI_HANDLE  hCmdBld,
                                     TI_UINT16  uTxCompletePacingThreshold,
                                     TI_UINT16  uTxCompletePacingTimeout,
                                     void *     fCb, 
                                     TI_HANDLE  hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXTxConfigOptions_t  tTxCmpltPacing;
    ACXTxConfigOptions_t  *pCfg = &tTxCmpltPacing;

    /* Set information element header */
    pCfg->EleHdr.id  = ACX_TX_CONFIG_OPT;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    pCfg->txCompleteThreshold = ENDIAN_HANDLE_WORD(uTxCompletePacingThreshold);
    pCfg->txCompleteTimeout   = ENDIAN_HANDLE_WORD(uTxCompletePacingTimeout);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeRxIntrPacing()
 ****************************************************************************
 * DESCRIPTION: Configure Rx-Complete interrupt pacing to FW
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeRxIntrPacing (TI_HANDLE  hCmdBld,
                                    TI_UINT16  uRxIntrPacingThreshold,
                                    TI_UINT16  uRxIntrPacingTimeout,
                                    void *     fCb, 
                                    TI_HANDLE  hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXRxBufferingConfig_t  tRxIntrPacing;
    ACXRxBufferingConfig_t  *pCfg = &tRxIntrPacing;

    /* Set information element header */
    pCfg->EleHdr.id  = ACX_RX_CONFIG_OPT;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    pCfg->rxPktThreshold    = ENDIAN_HANDLE_WORD(uRxIntrPacingThreshold);
    pCfg->rxCompleteTimeout = ENDIAN_HANDLE_WORD(uRxIntrPacingTimeout);
    pCfg->rxMblkThreshold   = ENDIAN_HANDLE_WORD(0xFFFF);    /* Set to maximum so it has no effect (only the PktThreshold is used) */
    pCfg->rxQueueType       = RX_QUEUE_TYPE_RX_LOW_PRIORITY; /* Only low priority data packets are buffered */

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
*                      cmdBld_CfgIeCtsProtection()
 ****************************************************************************
 * DESCRIPTION: Configure The Cts to self feature
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeCtsProtection (TI_HANDLE hCmdBld, TI_UINT8 ctsProtection, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXCtsProtection_t AcxElm_CtsToSelf;
    ACXCtsProtection_t *pCfg = &AcxElm_CtsToSelf;

    /* Set information element header*/
    pCfg->EleHdr.id = ACX_CTS_PROTECTION;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    pCfg->ctsProtectMode = ctsProtection;

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeRxMsduLifeTime()
 ****************************************************************************
 * DESCRIPTION: Configure The Cts to self feature
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeRxMsduLifeTime (TI_HANDLE hCmdBld, TI_UINT32 RxMsduLifeTime, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    dot11RxMsduLifeTime_t   AcxElm_RxMsduLifeTime;
    dot11RxMsduLifeTime_t *pCfg = &AcxElm_RxMsduLifeTime;

    /* Set information element header*/
    pCfg->EleHdr.id = DOT11_RX_MSDU_LIFE_TIME;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);
    pCfg->RxMsduLifeTime = RxMsduLifeTime;

    TRACE2(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, ": RxMsduLifeTime = 0x%x, len = 0x%x\n",pCfg->RxMsduLifeTime,pCfg->EleHdr.len);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIeServicePeriodTimeout()
 ****************************************************************************
 * DESCRIPTION: Configure The Rx Time Out
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeServicePeriodTimeout (TI_HANDLE hCmdBld, TRxTimeOut* pRxTimeOut, void *fCb, TI_HANDLE hCb)                            
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXRxTimeout_t AcxElm_rxTimeOut;
    ACXRxTimeout_t *pCfg = &AcxElm_rxTimeOut;

    /* Set information element header*/
    pCfg->EleHdr.id = ACX_SERVICE_PERIOD_TIMEOUT;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    pCfg->PsPollTimeout = pRxTimeOut->psPoll;
    pCfg->UpsdTimeout   = pRxTimeOut->UPSD;

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


/****************************************************************************
 *                      cmdBld_CfgIePsWmm()
 ****************************************************************************
 * DESCRIPTION: Configure The PS for WMM
 *
 * INPUTS:   TI_TRUE  - Configure PS to work on WMM mode - do not send the NULL/PS_POLL 
 *                   packets even if TIM is set.
 *           TI_FALSE - Configure PS to work on Non-WMM mode - work according to the 
 *                   standard
 *
 * RETURNS: TI_OK or TI_NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIePsWmm (TI_HANDLE hCmdBld, TI_BOOL enableWA, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXConfigPsWmm_t  ConfigPsWmm;
    ACXConfigPsWmm_t *pCfg = &ConfigPsWmm;

    /*
     * Set information element header
     */
    pCfg->EleHdr.id = ACX_CONFIG_PS_WMM;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    pCfg->ConfigPsOnWmmMode = enableWA;

    /* Report the meesage only if we are using the WiFi patch */
    if (enableWA)
    {
        TRACE0(pCmdBld->hReport, REPORT_SEVERITY_CONSOLE, "cmdBld_CfgIePsWmm: PS is on WMM mode\n");
        WLAN_OS_REPORT(("%s PS is on WMM mode\n",__FUNCTION__));
    }
    
    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}

/****************************************************************************
 *                      cmdBld_CfgIeRssiSnrTrigger()
 ****************************************************************************
 * DESCRIPTION: Configure the RSSI/SNR Trigger parameters
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: OK or NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeRssiSnrTrigger (TI_HANDLE hCmdBld, RssiSnrTriggerCfg_t *pTriggerParam, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXRssiSnrTriggerCfg_t  tAcxTriggerParameters;
    ACXRssiSnrTriggerCfg_t *pCfg = &tAcxTriggerParameters;

    pCfg->param.index       = pTriggerParam->index    ;        
    pCfg->param.threshold   = pTriggerParam->threshold;        
    pCfg->param.pacing      = pTriggerParam->pacing   ;        
    pCfg->param.metric      = pTriggerParam->metric   ;        
    pCfg->param.type        = pTriggerParam->type     ;        
    pCfg->param.direction   = pTriggerParam->direction;        
    pCfg->param.hystersis   = pTriggerParam->hystersis;        
    pCfg->param.enable      = pTriggerParam->enable   ;        

    /* Set information element header */
    pCfg->EleHdr.id = ACX_RSSI_SNR_TRIGGER;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    TRACE8(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION , "ID=%u: threshold=%u, pacing=%u, metric=%u, type=%u, dir=%u, hyst=%u, enable=%u\n", pTriggerParam->index, pTriggerParam->threshold, pTriggerParam->pacing, pTriggerParam->metric, pTriggerParam->type, pTriggerParam->direction, pTriggerParam->hystersis, pTriggerParam->enable);
                                             
    /* Send the configuration command */
    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}

/****************************************************************************
 *                      cmdBld_CfgIeRssiSnrWeights()
 ****************************************************************************
 * DESCRIPTION: Configure the RSSI/SNR Trigger parameters
 *
 * INPUTS:  None
 *
 * OUTPUT:  None
 *
 * RETURNS: OK or NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeRssiSnrWeights (TI_HANDLE hCmdBld, RssiSnrAverageWeights_t *pWeightsParam, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXRssiSnrAverageWeights_t  tAcxAverageWeights;
    ACXRssiSnrAverageWeights_t *pCfg = &tAcxAverageWeights;

    pCfg->param.rssiBeaconAverageWeight = pWeightsParam->rssiBeaconAverageWeight;        
    pCfg->param.rssiPacketAverageWeight = pWeightsParam->rssiPacketAverageWeight;        
    pCfg->param.snrBeaconAverageWeight  = pWeightsParam->snrBeaconAverageWeight ;        
    pCfg->param.snrPacketAverageWeight  = pWeightsParam->snrPacketAverageWeight ;        

    /* Set information element header */
    pCfg->EleHdr.id = ACX_RSSI_SNR_WEIGHTS;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    TRACE4(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION , "rssi-beacon-avg-weight=%u, rssi-packet-avg-weight=%u, snr-beacon-avg-weight=%u, snr-packet-avg-weight=%u", pWeightsParam->rssiBeaconAverageWeight, pWeightsParam->rssiPacketAverageWeight, pWeightsParam->snrBeaconAverageWeight, pWeightsParam->snrPacketAverageWeight);

    /* Send the configuration command */
    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}


 /*
 * ----------------------------------------------------------------------------
 * Function : cmdBld_CfgIeBet
 *
 * Input    :   enabled               - 0 to disable BET, 0 to disable BET
 *              MaximumConsecutiveET  - Max number of consecutive beacons
 *                                      that may be early terminated.
 * Output   : TI_STATUS
 * Process  :  Configures Beacon Early Termination information element.
 * Note(s)  :  None
 * -----------------------------------------------------------------------------
 */
TI_STATUS cmdBld_CfgIeBet (TI_HANDLE hCmdBld, TI_UINT8 Enable, TI_UINT8 MaximumConsecutiveET, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;

    ACXBet_Enable_t ACXBet_Enable;
    ACXBet_Enable_t* pCfg = &ACXBet_Enable;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_BET_ENABLE;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /* Set configuration fields */
    pCfg->Enable = Enable;
    pCfg->MaximumConsecutiveET = MaximumConsecutiveET;

    TRACE2(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, ": Sending info elem to firmware, Enable=%d, MaximumConsecutiveET=%d\n", (TI_UINT32)pCfg->Enable, (TI_UINT32)pCfg->MaximumConsecutiveET);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}

/****************************************************************************
 *                      cmdBld_CmdIeConfigureKeepAliveParams()
 ****************************************************************************
 * DESCRIPTION: Configure keep-alive parameters for a single template
 *
 * INPUTS:  hCmdBld     - handle to command builder object
 *          uIndex      - keep-alive index
 *          uEnaDisFlag - whether keep-alive is enabled or disables
 *          trigType    - send keep alive when TX is idle or always
 *          interval    - keep-alive interval
 *          fCB         - callback function for command complete
 *          hCb         - handle to be apssed to callback function    
 *
 * OUTPUT:  None
 *
 * RETURNS: OK or NOK
 ****************************************************************************/
TI_STATUS cmdBld_CmdIeConfigureKeepAliveParams (TI_HANDLE hCmdBld, TI_UINT8 uIndex,
                                                TI_UINT8 uEnaDisFlag, TI_UINT8 trigType,
                                                TI_UINT32 interval, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    AcxSetKeepAliveConfig_t ACXKeepAlive;

    /* set IE header */
    ACXKeepAlive.EleHdr.id = ACX_SET_KEEP_ALIVE_CONFIG;
    ACXKeepAlive.EleHdr.len = sizeof (AcxSetKeepAliveConfig_t) - sizeof (EleHdrStruct);

    /* set Keep-Alive values */
    ACXKeepAlive.index = uIndex;
    ACXKeepAlive.period = interval;
    ACXKeepAlive.trigger = trigType;
    ACXKeepAlive.valid = uEnaDisFlag;

    TRACE4(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, ": Sending info elem to firmware, index=%d, enaDis=%d, trigType=%d, interval=%d\n", (TI_UINT32)ACXKeepAlive.index, (TI_UINT32)ACXKeepAlive.valid, (TI_UINT32)ACXKeepAlive.trigger, (TI_UINT32)ACXKeepAlive.period);

    /* send the command to the FW */
    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, &ACXKeepAlive, sizeof(AcxSetKeepAliveConfig_t), fCb, hCb, NULL);
}

/****************************************************************************
 *                      cmdBld_CmdIeConfigureKeepAliveParams()
 ****************************************************************************
 * DESCRIPTION: Configure keep-alive global enable / disable flag
 *
 * INPUTS:  enable / disable flag
 *
 * OUTPUT:  None
 *
 * RETURNS: OK or NOK
 ****************************************************************************/
TI_STATUS cmdBld_CmdIeConfigureKeepAliveEnaDis (TI_HANDLE hCmdBld, TI_UINT8 enaDisFlag, 
                                                void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    AcxKeepAliveMode ACXKeepAliveMode;

    /* set IE header */
    ACXKeepAliveMode.EleHdr.id = ACX_KEEP_ALIVE_MODE;
    ACXKeepAliveMode.EleHdr.len = sizeof (AcxKeepAliveMode) - sizeof (EleHdrStruct);

    /* set Keep-Alive mode */
    ACXKeepAliveMode.modeEnabled = enaDisFlag;

    TRACE1(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, ": Sending info elem to firmware, enaDis=%d\n", (TI_UINT32)ACXKeepAliveMode.modeEnabled);

    /* send the command to the FW */
    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, &ACXKeepAliveMode, sizeof(AcxKeepAliveMode), fCb, hCb, NULL);
}

/** 
 * \fn     cmdBld_CfgIeSetFwHtCapabilities 
 * \brief  set the current AP HT Capabilities to the FW. 
 *
 * \note    
 * \return TI_OK on success or TI_NOK on failure 
 * \sa 
 */ 
TI_STATUS cmdBld_CfgIeSetFwHtCapabilities (TI_HANDLE hCmdBld,
                                           TI_UINT32 uHtCapabilites,
                                           TMacAddr  tMacAddress,
                                           TI_UINT8  uAmpduMaxLeng,
                                           TI_UINT8  uAmpduMinSpac,
                                           void      *fCb, 
                                           TI_HANDLE hCb)
{
    TCmdBld                         *pCmdBld = (TCmdBld *)hCmdBld;
    TAxcHtCapabilitiesIeFwInterface tAcxFwHtCap;
    TAxcHtCapabilitiesIeFwInterface *pCfg    = &tAcxFwHtCap;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_PEER_HT_CAP;
    pCfg->EleHdr.len = sizeof(tAcxFwHtCap) - sizeof(EleHdrStruct);

    MAC_COPY (pCfg->aMacAddress, tMacAddress);
    pCfg->uHtCapabilites = uHtCapabilites;
    pCfg->uAmpduMaxLength = uAmpduMaxLeng;
    pCfg->uAmpduMinSpacing = uAmpduMinSpac;
 
    TRACE9(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "cmdBld_CfgIeSetFwHtCapabilities: HtCapabilites=0x%x, AmpduMaxLength=%d, AmpduMinSpac=%d, MAC: %x:%x:%x:%x:%x:%x\n", uHtCapabilites, uAmpduMaxLeng, uAmpduMinSpac, pCfg->aMacAddress[0], pCfg->aMacAddress[1], pCfg->aMacAddress[2], pCfg->aMacAddress[3], pCfg->aMacAddress[4], pCfg->aMacAddress[5]);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(TAxcHtCapabilitiesIeFwInterface), fCb, hCb, NULL);
    
}

/** 
 * \fn     cmdBld_CfgIeSetFwHtInformation 
 * \brief  set the current AP HT Information to the FW. 
 *
 * \note    
 * \return TI_OK on success or TI_NOK on failure 
 * \sa 
 */ 
TI_STATUS cmdBld_CfgIeSetFwHtInformation (TI_HANDLE hCmdBld,
                                          TI_UINT8  uRifsMode,           
                                          TI_UINT8  uHtProtection,       
                                          TI_UINT8  uGfProtection,       
                                          TI_UINT8  uHtTxBurstLimit,     
                                          TI_UINT8  uDualCtsProtection,  
                                          void      *fCb, 
                                          TI_HANDLE hCb)
{
    TCmdBld                        *pCmdBld = (TCmdBld *)hCmdBld;
    TAxcHtInformationIeFwInterface tAcxFwHtInf;
    TAxcHtInformationIeFwInterface *pCfg = &tAcxFwHtInf;

    /* Set information element header */
    pCfg->EleHdr.id = ACX_HT_BSS_OPERATION;
    pCfg->EleHdr.len = sizeof(tAcxFwHtInf) - sizeof(EleHdrStruct);

    pCfg->uRifsMode = uRifsMode;
    pCfg->uHtProtection = uHtProtection;
    pCfg->uGfProtection = uGfProtection;
    pCfg->uHtTxBurstLimit = uHtTxBurstLimit;
    pCfg->uDualCtsProtection = uDualCtsProtection;
 
    TRACE5(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "cmdBld_CfgIeSetFwHtInformation: RifsMode=0x%x, HtProtection=0x%x, GfProtection=0x%x, HtTxBurstLimit=0x%x, DualCtsProtection=0x%x\n", uRifsMode, uHtProtection, uGfProtection, uHtTxBurstLimit, uDualCtsProtection);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(TAxcHtInformationIeFwInterface), fCb, hCb, NULL);
}

/** 
 * \fn     cmdBld_CfgIeSetBaSession 
 * \brief  configure BA session initiator\receiver parameters setting in the FW. 
 *
 * \note    
 * \return TI_OK on success or TI_NOK on failure 
 * \sa 
 */ 
TI_STATUS cmdBld_CfgIeSetBaSession (TI_HANDLE hCmdBld, 
                                    InfoElement_e eBaType,
                                    TI_UINT8 uTid,               
                                    TI_UINT8 uState,             
                                    TMacAddr tRa,                
                                    TI_UINT16 uWinSize,          
                                    TI_UINT16 uInactivityTimeout,
                                    void *fCb, 
                                    TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    TAxcBaSessionInitiatorResponderPolicy tAcxBaSessionPrm;
    TAxcBaSessionInitiatorResponderPolicy *pCfg = &tAcxBaSessionPrm;

    /* Set information element header */
    pCfg->EleHdr.id = eBaType;
    pCfg->EleHdr.len = sizeof(tAcxBaSessionPrm) - sizeof(EleHdrStruct);

    MAC_COPY (pCfg->aMacAddress, tRa);
    pCfg->uTid = uTid;
    pCfg->uPolicy = uState;
    pCfg->uWinSize = uWinSize;

    if (eBaType == ACX_BA_SESSION_INITIATOR_POLICY)
    {
        pCfg->uInactivityTimeout = uInactivityTimeout;
    }
    else
    {
        if (eBaType == ACX_BA_SESSION_RESPONDER_POLICY)
        {
            pCfg->uInactivityTimeout = 0;
        }
        else
        {
            TRACE1(pCmdBld->hReport, REPORT_SEVERITY_ERROR, "cmdBld_CfgIeSetBaSession: error ID=%u\n", pCfg->EleHdr.id);
            return TI_NOK;
        }
    }

    TRACE10(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "cmdBld_CfgIeSetBaSession: ID=, TID=%u, Policy=%u, MAC: %x:%x:%x:%x:%x:%x, uWinSize=%u, Timeout=%u\n", pCfg->uTid, pCfg->uPolicy, pCfg->aMacAddress[0], pCfg->aMacAddress[1], pCfg->aMacAddress[2], pCfg->aMacAddress[3], pCfg->aMacAddress[4], pCfg->aMacAddress[5], pCfg->uWinSize, pCfg->uInactivityTimeout);

    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(TAxcBaSessionInitiatorResponderPolicy), fCb, hCb, NULL);
}

/** 
 * \fn     cmdBld_CfgIeRadioParams 
 * \brief  configure radio parameters setting in the FW. 
 *
 * \note    
 * \return TI_OK on success or TI_NOK on failure 
 * \sa 
 */ 
TI_STATUS cmdBld_CfgIeRadioParams (TI_HANDLE hCmdBld, IniFileRadioParam *pIniFileRadioParams, void *fCb, TI_HANDLE hCb)
{
    static TTestCmd TestCmd;
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    TI_STATUS status = TI_NOK;
    TTestCmd *pTestCmd = &TestCmd;

    pTestCmd->testCmdId = TEST_CMD_INI_FILE_RADIO_PARAM;

    os_memoryCopy(pCmdBld->hOs, &pTestCmd->testCmd_u.IniFileRadioParams, pIniFileRadioParams, sizeof(IniFileRadioParam));

    status = cmdQueue_SendCommand (pCmdBld->hCmdQueue, 
                             CMD_TEST, 
                             (void *)pTestCmd, 
                             sizeof(IniFileRadioParam) + 4,
                             fCb, 
                             hCb, 
                             (void *)pTestCmd);
    return status;
}


TI_STATUS cmdBld_CfgPlatformGenParams (TI_HANDLE hCmdBld, IniFileGeneralParam *pGenParams, void *fCb, TI_HANDLE hCb)
{
    static TTestCmd TestCmd;
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    TI_STATUS status = TI_NOK;
    TTestCmd *pTestCmd = &TestCmd;

    pTestCmd->testCmdId = TEST_CMD_INI_FILE_GENERAL_PARAM;

    os_memoryCopy(pCmdBld->hOs, &pTestCmd->testCmd_u.IniFileGeneralParams, pGenParams, sizeof(IniFileGeneralParam));

    status = cmdQueue_SendCommand (pCmdBld->hCmdQueue, 
                              CMD_TEST, 
                              (void *)pTestCmd, 
                              sizeof(IniFileGeneralParam),
                              fCb, 
                              hCb, 
                              (void *)pTestCmd);
    return status;
}


/****************************************************************************
 *                      cmdBld_CfgIeBurstMode()
 ****************************************************************************
 * DESCRIPTION: Configure burst mode
 *
 * INPUTS:  hCmdBld     - handle to command builder object
 *          bEnabled    - is enabled flag
 *          fCB         - callback function for command complete
 *          hCb         - handle to be apssed to callback function
 *
 * OUTPUT:  None
 *
 * RETURNS: OK or NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeBurstMode (TI_HANDLE hCmdBld, TI_BOOL bEnabled, void *fCb, TI_HANDLE hCb)
{
	TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
	AcxBurstMode tAcxBurstMode;
	AcxBurstMode *pCfg = &tAcxBurstMode;

	/* set IE header */
	pCfg->EleHdr.id = ACX_BURST_MODE;
	pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

	/* set burst mode value */
	pCfg->enable = (uint8)bEnabled;

	/* send the command to the FW */
	return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}

/****************************************************************************
 *                      cmdBld_CfgIeSRstate()
 ****************************************************************************
 * DESCRIPTION: Configure sart reflex state
 *
 * INPUTS:  hCmdBld     - handle to command builder object
 *          bEnabled    - is enabled flag
 *          fCB         - callback function for command complete
 *          hCb         - handle to be apssed to callback function
 *
 * OUTPUT:  None
 *
 * RETURNS: OK or NOK
 ****************************************************************************/

TI_STATUS cmdBld_CfgIeSRState (TI_HANDLE hCmdBld, uint8 SRstate, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXSmartReflexState_t tSmartReflexState;
    ACXSmartReflexState_t *pCfg = &tSmartReflexState;

    /* set IE header */
    pCfg->EleHdr.id = ACX_SET_SMART_REFLEX_STATE;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /* set smart refelx state */
    pCfg->enable = SRstate;

    /* send the command to the FW */
    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);

}

/****************************************************************************
 *                      cmdBld_CfgIeSRParams()
 ****************************************************************************
 * DESCRIPTION: Configure sart reflex configuration
 * INPUTS:  hCmdBld     - handle to command builder object
 *          bEnabled    - is enabled flag
 *          fCB         - callback function for command complete
 *          hCb         - handle to be apssed to callback function
 *
 * OUTPUT:  None
 *
 * RETURNS: OK or NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeSRParams (TI_HANDLE hCmdBld, ACXSmartReflexConfigParams_t *pSRParam, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXSmartReflexConfigParams_t tSmartReflexParams;
    ACXSmartReflexConfigParams_t *pCfg = &tSmartReflexParams;

    /* set IE header */
    pCfg->EleHdr.id = ACX_SET_SMART_REFLEX_PARAMS;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /* copy smart reflex config params*/
    os_memoryCopy(pCmdBld->hOs, &pCfg->errorTable, pSRParam->errorTable, pCfg->EleHdr.len);

    /* send the command to the FW */
    return  cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}

/****************************************************************************
 *                      cmdBld_CfgIeSRDebug()
 ****************************************************************************
 * DESCRIPTION: Send debug param just if it's configured in ini file
 * INPUTS:  hCmdBld     - handle to command builder object
 *          bEnabled    - is enabled flag
 *          fCB         - callback function for command complete
 *          hCb         - handle to be apssed to callback function
 *
 * OUTPUT:  None
 *
 * RETURNS: OK or NOK
 ****************************************************************************/
TI_STATUS cmdBld_CfgIeSRDebug (TI_HANDLE hCmdBld, ACXSmartReflexDebugParams_t *pSRDebug, void *fCb, TI_HANDLE hCb)
{
    TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
    ACXSmartReflexDebugParams_t tSmartReflexDebug;
    ACXSmartReflexDebugParams_t *pCfg = &tSmartReflexDebug;

   /* send this command to FW just in case it's initialize in ini file */
    if (pSRDebug->senNRN == 0) {
        return TI_NOK;
    }

    /* set IE header */
    pCfg->EleHdr.id = ACX_SET_SMART_REFLEX_DEBUG;
    pCfg->EleHdr.len = sizeof(*pCfg) - sizeof(EleHdrStruct);

    /* copy smart reflex debug params*/
    os_memoryCopy(pCmdBld->hOs, &pCfg->errorTable, &pSRDebug->errorTable, pCfg->EleHdr.len);

    /* send the command to the FW */
    return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(*pCfg), fCb, hCb, NULL);
}
