/*
* CmdBldCfgIE.c
*
* Copyright(c) 1998 - 2010 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 = pDmaParams->NumRxBlocks;
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,
EArpFilterType filterType,
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_UINT8)filterType;
/* 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), filterType);
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)
{
TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
TI_STATUS status = TI_NOK;
TTestCmd *pTestCmd;
pTestCmd = os_memoryAlloc(pCmdBld->hOs, sizeof(TTestCmd));
if (!pTestCmd)
{
return status;
}
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,
NULL);
os_memoryFree(pCmdBld->hOs, pTestCmd, sizeof(TTestCmd));
return status;
}
/**
* \fn cmdBld_CfgIeExtendedRadioParams
* \brief configure extended radio parameters setting in the
* FW.
*
* \note
* \return TI_OK on success or TI_NOK on failure
* \sa
*/
TI_STATUS cmdBld_CfgIeExtendedRadioParams (TI_HANDLE hCmdBld,
IniFileExtendedRadioParam *pIniFileExtRadioParams,
void *fCb,
TI_HANDLE hCb)
{
TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
TI_STATUS status = TI_NOK;
TTestCmd *pTestCmd;
pTestCmd = os_memoryAlloc(pCmdBld->hOs, sizeof(TTestCmd));
if (!pTestCmd)
{
return status;
}
pTestCmd->testCmdId = TEST_CMD_INI_FILE_RF_EXTENDED_PARAM;
os_memoryCopy(pCmdBld->hOs, &pTestCmd->testCmd_u.IniFileExtendedRadioParams,
pIniFileExtRadioParams, sizeof(IniFileExtendedRadioParam));
status = cmdQueue_SendCommand (pCmdBld->hCmdQueue,
CMD_TEST,
(void *)pTestCmd,
sizeof(IniFileExtendedRadioParam) + 4,
fCb,
hCb,
NULL);
os_memoryFree(pCmdBld->hOs, pTestCmd, sizeof(TTestCmd));
return status;
}
TI_STATUS cmdBld_CfgPlatformGenParams (TI_HANDLE hCmdBld, IniFileGeneralParam *pGenParams, void *fCb, TI_HANDLE hCb)
{
TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
TI_STATUS status = TI_NOK;
TTestCmd *pTestCmd;
pTestCmd = os_memoryAlloc(pCmdBld->hOs, sizeof(TTestCmd));
if (!pTestCmd)
{
return status;
}
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,
NULL);
os_memoryFree(pCmdBld->hOs, pTestCmd, sizeof(TTestCmd));
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_CfgIeDcoItrimParams()
****************************************************************************
* DESCRIPTION: Configure/Interrogate the DCO Itrim parameters
*
* INPUTS:
*
* OUTPUT: None
*
* RETURNS: TI_OK or TI_NOK
****************************************************************************/
TI_STATUS cmdBld_CfgIeDcoItrimParams (TI_HANDLE hCmdBld, TI_BOOL enable, TI_UINT32 moderationTimeoutUsec, void *fCb, TI_HANDLE hCb)
{
TCmdBld *pCmdBld = (TCmdBld *)hCmdBld;
ACXDCOItrimParams_t ACXBeaconFilterOptions;
ACXDCOItrimParams_t *pCfg = &ACXBeaconFilterOptions;
pCfg->enable = enable;
pCfg->moderation_timeout_usec = moderationTimeoutUsec;
/* Set information element header */
pCfg->EleHdr.id = ACX_SET_DCO_ITRIM_PARAMS;
pCfg->EleHdr.len = sizeof(ACXDCOItrimParams_t) - sizeof(EleHdrStruct);
TRACE3(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION , "ID=%u: enable=%u, moderation_timeout_usec=%u\n", pCfg->EleHdr.id, enable, moderationTimeoutUsec);
return cmdQueue_SendCommand (pCmdBld->hCmdQueue, CMD_CONFIGURE, pCfg, sizeof(ACXDCOItrimParams_t), fCb, hCb, NULL);
}