diff options
author | Dmitry Shmidt <dimitrysh@google.com> | 2010-01-28 13:44:01 -0800 |
---|---|---|
committer | Dmitry Shmidt <dimitrysh@google.com> | 2010-01-28 13:44:01 -0800 |
commit | a615fb1650af6e111053506f1b764b28a5b4631d (patch) | |
tree | 331681301f38dbc47007e77f21039b0d82c2741c /wl1271/Test/TWD_Debug.c | |
parent | 3295ef74aeb37c12e327c5b1b258c1d84bcd2fa5 (diff) | |
download | wlan-a615fb1650af6e111053506f1b764b28a5b4631d.tar.gz |
wl1271: Initial M4 drop based on WiLink_Driver_6.1.0.0.115
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
Diffstat (limited to 'wl1271/Test/TWD_Debug.c')
-rw-r--r-- | wl1271/Test/TWD_Debug.c | 994 |
1 files changed, 994 insertions, 0 deletions
diff --git a/wl1271/Test/TWD_Debug.c b/wl1271/Test/TWD_Debug.c new file mode 100644 index 00000000..9493d8dc --- /dev/null +++ b/wl1271/Test/TWD_Debug.c @@ -0,0 +1,994 @@ +/* + * TWD_Debug.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. + */ + +#include "tidef.h" +#include "TWDriver.h" +#include "rxXfer_api.h" +#include "report.h" +#include "osApi.h" +#include "eventMbox_api.h" +#include "CmdQueue_api.h" +#include "CmdMBox_api.h" +#include "FwEvent_api.h" +#include "fwDebug_api.h" +#include "CmdBld.h" + + +/* Phony address used by host access */ +#define BB_REGISTER_ADDR_BASE 0x820000 + +/* Used for TWD Debug Tests */ +typedef enum +{ +/* + * General + */ +/* 0x00 */ TWD_PRINT_HELP, +/* 0x01 */ TWD_PRINT_SYS_INFO, +/* 0x02 */ TWD_SET_GENERIC_ADDR, +/* 0x03 */ TWD_READ_MEM, +/* 0x04 */ TWD_WRITE_MEM, + +/* 0x05 */ TWD_PRINT_ISTART, + +/* 0x06 */ TWD_PRINT_MBOX_QUEUE_INFO, +/* 0x07 */ TWD_PRINT_MBOX_PRINT_CMD, +/* 0x08 */ TWD_MAILBOX_HISTORY_PRINT, + +/* 0x09 */ TWD_MAC_REG, +/* 0x0A */ TWD_SET_ARM_CLOCK, +/* 0x0B */ TWD_SET_MAC_CLOCK, + +/* + * Rx + */ +/* 0x0C */ TWD_PRINT_RX_INFO, +/* 0x0D */ TWD_CLEAR_RX_INFO, + +/* + * Acx + */ +/* 0x0E */ TWD_PRINT_ACX_MAP, +/* 0x0F */ TWD_PRINT_ACX_STAT, + +/* + * General Debug + */ +/* 0x10 */ TWD_PWR_SV_DBG, + +/* 0x11 */ TWD_PRINT_LIST_REGS_THROG_MBOX, +/* 0x12 */ TWD_PRINT_LIST_MEM_THROG_MBOX, +/* 0x13 */ TWD_SET_MAC_REGISTER_THROG_MBOX, +/* 0x14 */ TWD_SET_PHY_REGISTER_THROG_MBOX, +/* 0x15 */ TWD_SET_MEMORY_THROG_MBOX, + +/* + * Recover Debug + */ +/* 0x16 */ TWD_CHECK_HW, +/* 0x17 */ TWD_PRINT_HW_STATUS, + +/* + * Event MailBox + */ +/* 0x18 */ TWD_PRINT_EVENT_MBOX_INFO, +/* 0x19 */ TWD_PRINT_EVENT_MBOX_MASK, +/* 0x1A */ TWD_PRINT_EVENT_MBOX_UNMASK, + +/* + * Other + */ +TWD_PRINT_FW_EVENT_INFO, +TWD_PRINT_TW_IF_INFO, +TWD_PRINT_MBOX_INFO, +TWD_FORCE_TEMPLATES_RATES, + + TWD_DEBUG_TEST_MAX = 0xFF /* mast be last!!! */ + +} TWD_DebugTest_e; + + +/* Used for Memory or Registers reading/writing*/ +typedef enum +{ + TNETW_INTERNAL_RAM, + TNETW_MAC_REGISTERS, + TNETW_PHY_REGISTERS + +} readWrite_MemoryType_e; + +static void TWD_PrintMemRegsCB (TI_HANDLE hTWD, TI_UINT32 cmdCbStatus) +{ + TTwd *pTWD = (TTwd *)hTWD; + int i; + TI_UINT8 *pBuf; + TI_UINT32 result; + + if (cmdCbStatus != TI_OK) + { + WLAN_OS_REPORT(("Command complete error \n\n")); + return; + } + + result = (((TI_UINT32)pTWD->tPrintRegsBuf.addr) & 0xFFFF0000); + + switch (result) + { + case REGISTERS_BASE: + WLAN_OS_REPORT(("MAC REGS (Base=0x%08x) = 0x%08x\n", + ((TI_UINT32)pTWD->tPrintRegsBuf.addr)&0xFFFF, + *(TI_UINT32*)(pTWD->tPrintRegsBuf.value))); + break; + + case BB_REGISTER_ADDR_BASE: + WLAN_OS_REPORT(("PHY REGS (Base=0x%08x) = 0x%08x\n", + ((TI_UINT32)pTWD->tPrintRegsBuf.addr)&0xFFFF, + *(TI_UINT32*)(pTWD->tPrintRegsBuf.value))); + break; + + default: /* Memory*/ + for (i=0, pBuf = pTWD->tPrintRegsBuf.value; i < 256; i += 16, pBuf += 16) + { + WLAN_OS_REPORT(("PrintBuf: 0x%08x: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", + pTWD->tPrintRegsBuf.addr+i, + pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4], pBuf[5], pBuf[6], pBuf[7], + pBuf[8], pBuf[9], pBuf[10], pBuf[11], pBuf[12], pBuf[13], pBuf[14], pBuf[15])); + } + break; + } +} + + +static void TWD_PrintMemRegs (TI_HANDLE hTWD, TI_UINT32 address, TI_UINT32 len, readWrite_MemoryType_e memType) +{ + TTwd *pTWD = (TTwd *)hTWD; + ReadWriteCommand_t AcxCmd_ReadMemory; + ReadWriteCommand_t* pCmd = &AcxCmd_ReadMemory; + + os_memoryZero (pTWD->hOs, (void *)pCmd, sizeof (*pCmd)); + + switch (memType) + { + case TNETW_INTERNAL_RAM: + pCmd->addr = (TI_UINT32)ENDIAN_HANDLE_LONG (address); + pCmd->size = ENDIAN_HANDLE_LONG (len); + break; + + case TNETW_MAC_REGISTERS: + pCmd->addr = (TI_UINT32)ENDIAN_HANDLE_LONG (((address&0xFFFF) | REGISTERS_BASE)); + pCmd->size = 4; + break; + + case TNETW_PHY_REGISTERS: + pCmd->addr = (TI_UINT32)ENDIAN_HANDLE_LONG (((address&0xFFFF) | BB_REGISTER_ADDR_BASE)); + pCmd->size = 4; + break; + + default: + WLAN_OS_REPORT(("Wrong memory type %d\n\n", memType)); + return; + } + + os_memoryZero (pTWD->hOs, (void *)&pTWD->tPrintRegsBuf, sizeof(pTWD->tPrintRegsBuf)); + + cmdQueue_SendCommand (pTWD->hCmdQueue, + CMD_READ_MEMORY, + (char *)pCmd, + sizeof(*pCmd), + (void *)TWD_PrintMemRegsCB, + hTWD, + &pTWD->tPrintRegsBuf); +} + +static TI_STATUS TWD_PrintMemoryMapCb (TI_HANDLE hTWD, TI_STATUS status, void *pData) +{ +#ifdef TI_DBG + TTwd *pTWD = (TTwd *)hTWD; + MemoryMap_t *pMemMap = &pTWD->MemMap; + + /* Print the memory map */ + WLAN_OS_REPORT (("TWD_PrintMemoryMap:\n")); + WLAN_OS_REPORT (("\tCode (0x%08x, 0x%08x)\n\tWep (0x%08x, 0x%08x)\n\tTmpl (0x%08x, 0x%08x)\n " + "\tQueue (0x%08x, 0x%08x)\n\tPool (0x%08x, 0x%08x)\n\tTraceBuffer (A = 0x%08x, B = 0x%08x)\n", + pMemMap->codeStart, + pMemMap->codeEnd, + pMemMap->wepDefaultKeyStart, + pMemMap->wepDefaultKeyEnd, + pMemMap->packetTemplateStart, + pMemMap->packetTemplateEnd, + pMemMap->queueMemoryStart, + pMemMap->queueMemoryEnd, + pMemMap->packetMemoryPoolStart, + pMemMap->packetMemoryPoolEnd, + pMemMap->debugBuffer1Start, + pMemMap->debugBuffer2Start)); +#endif /* TI_DBG */ + + return TI_OK; +} + + +/**************************************************************************** + * TWD_PrintMemoryMap () + **************************************************************************** + * DESCRIPTION: Print some of the MemoryMap information element fields + * + * INPUTS: + * HwMboxConfig_T* pHwMboxConfig pointer to the acx mailbox + * + * OUTPUT: None + * + * RETURNS: None + ****************************************************************************/ +static void TWD_PrintMemoryMap (TI_HANDLE hTWD) +{ + TTwd *pTWD = (TTwd *)hTWD; + + TWD_ItrMemoryMap (pTWD, &pTWD->MemMap, (void *)TWD_PrintMemoryMapCb, hTWD); +} + + +/**************************************************************************** + * TWD_StatisticsReadCB () + **************************************************************************** + * DESCRIPTION: Interrogate Statistics from the wlan hardware + * + * INPUTS: None + * + * OUTPUT: None + * + * RETURNS: TI_OK or TI_NOK + ****************************************************************************/ +static TI_STATUS TWD_StatisticsReadCB (TI_HANDLE hTWD, TI_UINT16 MboxStatus, ACXStatistics_t* pElem) +{ + if (MboxStatus != TI_OK) + { + return TI_NOK; + } + + /* + * Handle FW statistics endianess + * ============================== + */ + + /* Ring */ + pElem->ringStat.numOfTxProcs = ENDIAN_HANDLE_LONG(pElem->ringStat.numOfTxProcs); + pElem->ringStat.numOfPreparedDescs = ENDIAN_HANDLE_LONG(pElem->ringStat.numOfPreparedDescs); + pElem->ringStat.numOfTxXfr = ENDIAN_HANDLE_LONG(pElem->ringStat.numOfTxXfr); + pElem->ringStat.numOfTxDma = ENDIAN_HANDLE_LONG(pElem->ringStat.numOfTxDma); + pElem->ringStat.numOfTxCmplt = ENDIAN_HANDLE_LONG(pElem->ringStat.numOfTxCmplt); + pElem->ringStat.numOfRxProcs = ENDIAN_HANDLE_LONG(pElem->ringStat.numOfRxProcs); + pElem->ringStat.numOfRxData = ENDIAN_HANDLE_LONG(pElem->ringStat.numOfRxData); + + /* Debug */ + pElem->debug.debug1 = ENDIAN_HANDLE_LONG(pElem->debug.debug1); + pElem->debug.debug2 = ENDIAN_HANDLE_LONG(pElem->debug.debug2); + pElem->debug.debug3 = ENDIAN_HANDLE_LONG(pElem->debug.debug3); + pElem->debug.debug4 = ENDIAN_HANDLE_LONG(pElem->debug.debug4); + pElem->debug.debug5 = ENDIAN_HANDLE_LONG(pElem->debug.debug5); + pElem->debug.debug6 = ENDIAN_HANDLE_LONG(pElem->debug.debug6); + + /* Isr */ + pElem->isr.IRQs = ENDIAN_HANDLE_LONG(pElem->isr.IRQs); + + /* Rx */ + pElem->rx.RxOutOfMem = ENDIAN_HANDLE_LONG(pElem->rx.RxOutOfMem ); + pElem->rx.RxHdrOverflow = ENDIAN_HANDLE_LONG(pElem->rx.RxHdrOverflow ); + pElem->rx.RxHWStuck = ENDIAN_HANDLE_LONG(pElem->rx.RxHWStuck ); + pElem->rx.RxDroppedFrame = ENDIAN_HANDLE_LONG(pElem->rx.RxDroppedFrame ); + pElem->rx.RxCompleteDroppedFrame = ENDIAN_HANDLE_LONG(pElem->rx.RxCompleteDroppedFrame); + pElem->rx.RxAllocFrame = ENDIAN_HANDLE_LONG(pElem->rx.RxAllocFrame ); + pElem->rx.RxDoneQueue = ENDIAN_HANDLE_LONG(pElem->rx.RxDoneQueue ); + pElem->rx.RxDone = ENDIAN_HANDLE_LONG(pElem->rx.RxDone ); + pElem->rx.RxDefrag = ENDIAN_HANDLE_LONG(pElem->rx.RxDefrag ); + pElem->rx.RxDefragEnd = ENDIAN_HANDLE_LONG(pElem->rx.RxDefragEnd ); + pElem->rx.RxMic = ENDIAN_HANDLE_LONG(pElem->rx.RxMic ); + pElem->rx.RxMicEnd = ENDIAN_HANDLE_LONG(pElem->rx.RxMicEnd ); + pElem->rx.RxXfr = ENDIAN_HANDLE_LONG(pElem->rx.RxXfr ); + pElem->rx.RxXfrEnd = ENDIAN_HANDLE_LONG(pElem->rx.RxXfrEnd ); + pElem->rx.RxCmplt = ENDIAN_HANDLE_LONG(pElem->rx.RxCmplt ); + pElem->rx.RxPreCmplt = ENDIAN_HANDLE_LONG(pElem->rx.RxPreCmplt ); + pElem->rx.RxCmpltTask = ENDIAN_HANDLE_LONG(pElem->rx.RxCmpltTask ); + pElem->rx.RxPhyHdr = ENDIAN_HANDLE_LONG(pElem->rx.RxPhyHdr ); + pElem->rx.RxTimeout = ENDIAN_HANDLE_LONG(pElem->rx.RxTimeout ); + + /* Tx */ + pElem->tx.numOfTxTemplatePrepared = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxTemplatePrepared); + pElem->tx.numOfTxDataPrepared = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxDataPrepared); + pElem->tx.numOfTxTemplateProgrammed = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxTemplateProgrammed); + pElem->tx.numOfTxDataProgrammed = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxDataProgrammed); + pElem->tx.numOfTxBurstProgrammed = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxBurstProgrammed); + pElem->tx.numOfTxStarts = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxStarts); + pElem->tx.numOfTxImmResp = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxImmResp); + pElem->tx.numOfTxStartTempaltes = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxStartTempaltes); + pElem->tx.numOfTxStartIntTemplate = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxStartIntTemplate); + pElem->tx.numOfTxStartFwGen = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxStartFwGen); + pElem->tx.numOfTxStartData = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxStartData); + pElem->tx.numOfTxStartNullFrame = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxStartNullFrame); + pElem->tx.numOfTxExch = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxExch); + pElem->tx.numOfTxRetryTemplate = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxRetryTemplate); + pElem->tx.numOfTxRetryData = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxRetryData); + pElem->tx.numOfTxExchPending = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxExchPending); + pElem->tx.numOfTxExchExpiry = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxExchExpiry); + pElem->tx.numOfTxExchMismatch = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxExchMismatch); + pElem->tx.numOfTxDoneTemplate = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxDoneTemplate); + pElem->tx.numOfTxDoneData = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxDoneData); + pElem->tx.numOfTxDoneIntTemplate = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxDoneIntTemplate); + pElem->tx.numOfTxPreXfr = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxPreXfr); + pElem->tx.numOfTxXfr = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxXfr); + pElem->tx.numOfTxXfrOutOfMem = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxXfrOutOfMem); + pElem->tx.numOfTxDmaProgrammed = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxDmaProgrammed); + pElem->tx.numOfTxDmaDone = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxDmaDone); + + /* Dma */ + pElem->dma.RxDMAErrors = ENDIAN_HANDLE_LONG(pElem->dma.RxDMAErrors); + pElem->dma.TxDMAErrors = ENDIAN_HANDLE_LONG(pElem->dma.TxDMAErrors); + + /* Wep */ + pElem->wep.WepAddrKeyCount = ENDIAN_HANDLE_LONG(pElem->wep.WepAddrKeyCount); + pElem->wep.WepDefaultKeyCount = ENDIAN_HANDLE_LONG(pElem->wep.WepDefaultKeyCount); + pElem->wep.WepKeyNotFound = ENDIAN_HANDLE_LONG(pElem->wep.WepKeyNotFound); + pElem->wep.WepDecryptFail = ENDIAN_HANDLE_LONG(pElem->wep.WepDecryptFail); + + /* AES */ + pElem->aes.AesEncryptFail = ENDIAN_HANDLE_LONG(pElem->aes.AesEncryptFail); + pElem->aes.AesDecryptFail = ENDIAN_HANDLE_LONG(pElem->aes.AesDecryptFail); + pElem->aes.AesEncryptPackets = ENDIAN_HANDLE_LONG(pElem->aes.AesEncryptPackets); + pElem->aes.AesDecryptPackets = ENDIAN_HANDLE_LONG(pElem->aes.AesDecryptPackets); + pElem->aes.AesEncryptInterrupt = ENDIAN_HANDLE_LONG(pElem->aes.AesEncryptInterrupt); + pElem->aes.AesDecryptInterrupt = ENDIAN_HANDLE_LONG(pElem->aes.AesDecryptInterrupt); + + /* Events */ + pElem->event.calibration = ENDIAN_HANDLE_LONG(pElem->event.calibration); + pElem->event.rxMismatch = ENDIAN_HANDLE_LONG(pElem->event.rxMismatch); + pElem->event.rxMemEmpty = ENDIAN_HANDLE_LONG(pElem->event.rxMemEmpty); + + /* PS */ + pElem->pwr.MissingBcnsCnt = ENDIAN_HANDLE_LONG(pElem->pwr.MissingBcnsCnt); + pElem->pwr.RcvdBeaconsCnt = ENDIAN_HANDLE_LONG(pElem->pwr.RcvdBeaconsCnt); + pElem->pwr.ConnectionOutOfSync = ENDIAN_HANDLE_LONG(pElem->pwr.ConnectionOutOfSync); + pElem->pwr.ContMissBcnsSpread[0] = ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[0]); + pElem->pwr.ContMissBcnsSpread[1] = ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[1]); + pElem->pwr.ContMissBcnsSpread[2] = ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[2]); + pElem->pwr.ContMissBcnsSpread[3] = ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[3]); + pElem->pwr.ContMissBcnsSpread[4] = ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[4]); + pElem->pwr.ContMissBcnsSpread[5] = ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[5]); + pElem->pwr.ContMissBcnsSpread[6] = ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[6]); + pElem->pwr.ContMissBcnsSpread[7] = ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[7]); + pElem->pwr.ContMissBcnsSpread[8] = ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[8]); + pElem->pwr.ContMissBcnsSpread[9] = ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[9]); + + pElem->ps.psPollTimeOuts = ENDIAN_HANDLE_LONG(pElem->ps.psPollTimeOuts); + pElem->ps.upsdTimeOuts = ENDIAN_HANDLE_LONG(pElem->ps.upsdTimeOuts); + pElem->ps.upsdMaxAPturn = ENDIAN_HANDLE_LONG(pElem->ps.upsdMaxAPturn); + pElem->ps.psPollMaxAPturn = ENDIAN_HANDLE_LONG(pElem->ps.psPollMaxAPturn); + pElem->ps.psPollUtilization = ENDIAN_HANDLE_LONG(pElem->ps.psPollUtilization); + pElem->ps.upsdUtilization = ENDIAN_HANDLE_LONG(pElem->ps.upsdUtilization); + + pElem->rxFilter.arpFilter = ENDIAN_HANDLE_LONG(pElem->rxFilter.arpFilter); + pElem->rxFilter.beaconFilter = ENDIAN_HANDLE_LONG(pElem->rxFilter.beaconFilter); + pElem->rxFilter.dataFilter = ENDIAN_HANDLE_LONG(pElem->rxFilter.dataFilter); + pElem->rxFilter.dupFilter = ENDIAN_HANDLE_LONG(pElem->rxFilter.dupFilter); + pElem->rxFilter.MCFilter = ENDIAN_HANDLE_LONG(pElem->rxFilter.MCFilter); + pElem->rxFilter.ibssFilter = ENDIAN_HANDLE_LONG(pElem->rxFilter.ibssFilter); + + pElem->radioCal.calStateFail = ENDIAN_HANDLE_LONG(pElem->radioCal.calStateFail); + pElem->radioCal.initCalTotal = ENDIAN_HANDLE_LONG(pElem->radioCal.initCalTotal); + pElem->radioCal.initRadioBandsFail = ENDIAN_HANDLE_LONG(pElem->radioCal.initRadioBandsFail); + pElem->radioCal.initRxIqMmFail = ENDIAN_HANDLE_LONG(pElem->radioCal.initRxIqMmFail); + pElem->radioCal.initSetParams = ENDIAN_HANDLE_LONG(pElem->radioCal.initSetParams); + pElem->radioCal.initTxClpcFail = ENDIAN_HANDLE_LONG(pElem->radioCal.initTxClpcFail); + pElem->radioCal.tuneCalTotal = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneCalTotal); + pElem->radioCal.tuneDrpwChanTune = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwChanTune); + pElem->radioCal.tuneDrpwLnaTank = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwLnaTank); + pElem->radioCal.tuneDrpwPdBufFail = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwPdBufFail); + pElem->radioCal.tuneDrpwRTrimFail = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwRTrimFail); + pElem->radioCal.tuneDrpwRxDac = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwRxDac); + pElem->radioCal.tuneDrpwRxIf2Gain = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwRxIf2Gain); + pElem->radioCal.tuneDrpwRxTxLpf = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwRxTxLpf); + pElem->radioCal.tuneDrpwTaCal = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwTaCal); + pElem->radioCal.tuneDrpwTxMixFreqFail = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwTxMixFreqFail); + pElem->radioCal.tuneRxAnaDcFail = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneRxAnaDcFail); + pElem->radioCal.tuneRxIqMmFail = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneRxIqMmFail); + pElem->radioCal.tuneTxClpcFail = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneTxClpcFail); + pElem->radioCal.tuneTxIqMmFail = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneTxIqMmFail); + pElem->radioCal.tuneTxLOLeakFail = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneTxLOLeakFail); + pElem->radioCal.tuneTxPdetFail = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneTxPdetFail); + pElem->radioCal.tuneTxPPAFail = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneTxPPAFail); + + + /* + * Print FW statistics + * =================== + */ + + /* Ring */ + WLAN_OS_REPORT(("------ Ring statistics -------------------\n")); + WLAN_OS_REPORT(("numOfTxProcs = %d\n", pElem->ringStat.numOfTxProcs)); + WLAN_OS_REPORT(("numOfPreparedDescs = %d\n", pElem->ringStat.numOfPreparedDescs)); + WLAN_OS_REPORT(("numOfTxXfr = %d\n", pElem->ringStat.numOfTxXfr)); + WLAN_OS_REPORT(("numOfTxDma = %d\n", pElem->ringStat.numOfTxDma)); + WLAN_OS_REPORT(("numOfTxCmplt = %d\n", pElem->ringStat.numOfTxCmplt)); + WLAN_OS_REPORT(("numOfRxProcs = %d\n", pElem->ringStat.numOfRxProcs)); + WLAN_OS_REPORT(("numOfRxData = %d\n", pElem->ringStat.numOfRxData)); + + /* Debug */ + WLAN_OS_REPORT(("------ Debug statistics -------------------\n")); + WLAN_OS_REPORT(("debug1 = %d\n", pElem->debug.debug1)); + WLAN_OS_REPORT(("debug2 = %d\n", pElem->debug.debug2)); + WLAN_OS_REPORT(("debug3 = %d\n", pElem->debug.debug3)); + WLAN_OS_REPORT(("debug4 = %d\n", pElem->debug.debug4)); + WLAN_OS_REPORT(("debug5 = %d\n", pElem->debug.debug5)); + WLAN_OS_REPORT(("debug6 = %d\n", pElem->debug.debug6)); + + /* Isr */ + WLAN_OS_REPORT(("------ Isr statistics -------------------\n")); + WLAN_OS_REPORT(("IRQs = %d\n", pElem->isr.IRQs)); + + /* Rx */ + WLAN_OS_REPORT(("------ Rx statistics -------------------\n")); + WLAN_OS_REPORT(("RxOutOfMem = %d\n", pElem->rx.RxOutOfMem )); + WLAN_OS_REPORT(("RxHdrOverflow = %d\n", pElem->rx.RxHdrOverflow )); + WLAN_OS_REPORT(("RxHWStuck = %d\n", pElem->rx.RxHWStuck )); + WLAN_OS_REPORT(("RxDroppedFrame = %d\n", pElem->rx.RxDroppedFrame )); + WLAN_OS_REPORT(("RxCompleteDroppedFrame = %d\n", pElem->rx.RxCompleteDroppedFrame)); + WLAN_OS_REPORT(("RxAllocFrame = %d\n", pElem->rx.RxAllocFrame )); + WLAN_OS_REPORT(("RxDoneQueue = %d\n", pElem->rx.RxDoneQueue )); + WLAN_OS_REPORT(("RxDone = %d\n", pElem->rx.RxDone )); + WLAN_OS_REPORT(("RxDefrag = %d\n", pElem->rx.RxDefrag )); + WLAN_OS_REPORT(("RxDefragEnd = %d\n", pElem->rx.RxDefragEnd )); + WLAN_OS_REPORT(("RxMic = %d\n", pElem->rx.RxMic )); + WLAN_OS_REPORT(("RxMicEnd = %d\n", pElem->rx.RxMicEnd )); + WLAN_OS_REPORT(("RxXfr = %d\n", pElem->rx.RxXfr )); + WLAN_OS_REPORT(("RxXfrEnd = %d\n", pElem->rx.RxXfrEnd )); + WLAN_OS_REPORT(("RxCmplt = %d\n", pElem->rx.RxCmplt )); + WLAN_OS_REPORT(("RxPreCmplt = %d\n", pElem->rx.RxPreCmplt )); + WLAN_OS_REPORT(("RxCmpltTask = %d\n", pElem->rx.RxCmpltTask )); + WLAN_OS_REPORT(("RxPhyHdr = %d\n", pElem->rx.RxPhyHdr )); + WLAN_OS_REPORT(("RxTimeout = %d\n", pElem->rx.RxTimeout )); + + WLAN_OS_REPORT(("------ RxFilters statistics --------------\n")); + WLAN_OS_REPORT(("arpFilter = %d\n", pElem->rxFilter.arpFilter)); + WLAN_OS_REPORT(("beaconFilter = %d\n", pElem->rxFilter.beaconFilter)); + WLAN_OS_REPORT(("dataFilter = %d\n", pElem->rxFilter.dataFilter)); + WLAN_OS_REPORT(("dupFilter = %d\n", pElem->rxFilter.dupFilter)); + WLAN_OS_REPORT(("MCFilter = %d\n", pElem->rxFilter.MCFilter)); + WLAN_OS_REPORT(("ibssFilter = %d\n", pElem->rxFilter.ibssFilter)); + + /* Tx */ + WLAN_OS_REPORT(("------ Tx statistics -------------------\n")); + WLAN_OS_REPORT(("numOfTxTemplatePrepared = %d\n", pElem->tx.numOfTxTemplatePrepared)); + WLAN_OS_REPORT(("numOfTxDataPrepared = %d\n", pElem->tx.numOfTxDataPrepared)); + WLAN_OS_REPORT(("numOfTxTemplateProgrammed = %d\n", pElem->tx.numOfTxTemplateProgrammed)); + WLAN_OS_REPORT(("numOfTxDataProgrammed = %d\n", pElem->tx.numOfTxDataProgrammed)); + WLAN_OS_REPORT(("numOfTxBurstProgrammed = %d\n", pElem->tx.numOfTxBurstProgrammed)); + WLAN_OS_REPORT(("numOfTxStarts = %d\n", pElem->tx.numOfTxStarts)); + WLAN_OS_REPORT(("numOfTxImmResp = %d\n", pElem->tx.numOfTxImmResp)); + WLAN_OS_REPORT(("numOfTxStartTempaltes = %d\n", pElem->tx.numOfTxStartTempaltes)); + WLAN_OS_REPORT(("numOfTxStartIntTemplate = %d\n", pElem->tx.numOfTxStartIntTemplate)); + WLAN_OS_REPORT(("numOfTxStartFwGen = %d\n", pElem->tx.numOfTxStartFwGen)); + WLAN_OS_REPORT(("numOfTxStartData = %d\n", pElem->tx.numOfTxStartData)); + WLAN_OS_REPORT(("numOfTxStartNullFrame = %d\n", pElem->tx.numOfTxStartNullFrame)); + WLAN_OS_REPORT(("numOfTxExch = %d\n", pElem->tx.numOfTxExch)); + WLAN_OS_REPORT(("numOfTxRetryTemplate = %d\n", pElem->tx.numOfTxRetryTemplate)); + WLAN_OS_REPORT(("numOfTxRetryData = %d\n", pElem->tx.numOfTxRetryData)); + WLAN_OS_REPORT(("numOfTxExchPending = %d\n", pElem->tx.numOfTxExchPending)); + WLAN_OS_REPORT(("numOfTxExchExpiry = %d\n", pElem->tx.numOfTxExchExpiry)); + WLAN_OS_REPORT(("numOfTxExchMismatch = %d\n", pElem->tx.numOfTxExchMismatch)); + WLAN_OS_REPORT(("numOfTxDoneTemplate = %d\n", pElem->tx.numOfTxDoneTemplate)); + WLAN_OS_REPORT(("numOfTxDoneData = %d\n", pElem->tx.numOfTxDoneData)); + WLAN_OS_REPORT(("numOfTxDoneIntTemplate = %d\n", pElem->tx.numOfTxDoneIntTemplate)); + WLAN_OS_REPORT(("numOfTxPreXfr = %d\n", pElem->tx.numOfTxPreXfr)); + WLAN_OS_REPORT(("numOfTxXfr = %d\n", pElem->tx.numOfTxXfr)); + WLAN_OS_REPORT(("numOfTxXfrOutOfMem = %d\n", pElem->tx.numOfTxXfrOutOfMem)); + WLAN_OS_REPORT(("numOfTxDmaProgrammed = %d\n", pElem->tx.numOfTxDmaProgrammed)); + WLAN_OS_REPORT(("numOfTxDmaDone = %d\n", pElem->tx.numOfTxDmaDone)); + + /* Dma */ + WLAN_OS_REPORT(("------ Dma statistics -------------------\n")); + WLAN_OS_REPORT(("RxDMAErrors = %d\n", pElem->dma.RxDMAErrors)); + WLAN_OS_REPORT(("TxDMAErrors = %d\n", pElem->dma.TxDMAErrors)); + + /* Wep */ + WLAN_OS_REPORT(("------ Wep statistics -------------------\n")); + WLAN_OS_REPORT(("WepAddrKeyCount = %d\n", pElem->wep.WepAddrKeyCount)); + WLAN_OS_REPORT(("WepDefaultKeyCount= %d\n", pElem->wep.WepDefaultKeyCount)); + WLAN_OS_REPORT(("WepKeyNotFound = %d\n", pElem->wep.WepKeyNotFound)); + WLAN_OS_REPORT(("WepDecryptFail = %d\n", pElem->wep.WepDecryptFail)); + + /* AES */ + WLAN_OS_REPORT(("------------ AES Statistics --------------\n")); + WLAN_OS_REPORT(("AesEncryptFail = %d\n", pElem->aes.AesEncryptFail)); + WLAN_OS_REPORT(("AesDecryptFail = %d\n", pElem->aes.AesDecryptFail)); + WLAN_OS_REPORT(("AesEncryptPackets = %d\n", pElem->aes.AesEncryptPackets)); + WLAN_OS_REPORT(("AesDecryptPackets = %d\n", pElem->aes.AesDecryptPackets)); + WLAN_OS_REPORT(("AesEncryptInterrupt = %d\n", pElem->aes.AesEncryptInterrupt)); + WLAN_OS_REPORT(("AesDecryptInterrupt = %d\n", pElem->aes.AesDecryptInterrupt)); + + /* Events */ + WLAN_OS_REPORT(("------ Events -------------------\n")); + WLAN_OS_REPORT(("Calibration = %d\n", pElem->event.calibration)); + WLAN_OS_REPORT(("rxMismatch = %d\n", pElem->event.rxMismatch)); + WLAN_OS_REPORT(("rxMemEmpty = %d\n", pElem->event.rxMemEmpty)); + + /* PsPoll/Upsd */ + WLAN_OS_REPORT(("----------- PsPoll / Upsd -----------\n")); + WLAN_OS_REPORT(("psPollTimeOuts = %d\n",pElem->ps.psPollTimeOuts)); + WLAN_OS_REPORT(("upsdTimeOuts = %d\n",pElem->ps.upsdTimeOuts)); + WLAN_OS_REPORT(("upsdMaxAPturn = %d\n",pElem->ps.upsdMaxAPturn)); + WLAN_OS_REPORT(("psPollMaxAPturn = %d\n",pElem->ps.psPollMaxAPturn)); + WLAN_OS_REPORT(("psPollUtilization = %d\n",pElem->ps.psPollUtilization)); + WLAN_OS_REPORT(("upsdUtilization = %d\n",pElem->ps.upsdUtilization)); + + + + /* Calibration */ + WLAN_OS_REPORT(("----------- Calibrations -------------\n")); + WLAN_OS_REPORT(("calStateFail = %d\n", pElem->radioCal.calStateFail)); + WLAN_OS_REPORT(("initCalTotal = %d\n", pElem->radioCal.initCalTotal)); + WLAN_OS_REPORT(("initRadioBandsFail = %d\n", pElem->radioCal.initRadioBandsFail)); + WLAN_OS_REPORT(("initRxIqMmFail = %d\n", pElem->radioCal.initRxIqMmFail)); + WLAN_OS_REPORT(("initSetParams = %d\n", pElem->radioCal.initSetParams)); + WLAN_OS_REPORT(("initTxClpcFail = %d\n", pElem->radioCal.initTxClpcFail)); + WLAN_OS_REPORT(("tuneCalTotal = %d\n", pElem->radioCal.tuneCalTotal)); + WLAN_OS_REPORT(("tuneDrpwChanTune = %d\n", pElem->radioCal.tuneDrpwChanTune)); + WLAN_OS_REPORT(("tuneDrpwLnaTank = %d\n", pElem->radioCal.tuneDrpwLnaTank)); + WLAN_OS_REPORT(("tuneDrpwPdBufFail = %d\n", pElem->radioCal.tuneDrpwPdBufFail)); + WLAN_OS_REPORT(("tuneDrpwRTrimFail = %d\n", pElem->radioCal.tuneDrpwRTrimFail)); + WLAN_OS_REPORT(("tuneDrpwRxDac = %d\n", pElem->radioCal.tuneDrpwRxDac)); + WLAN_OS_REPORT(("tuneDrpwRxIf2Gain = %d\n", pElem->radioCal.tuneDrpwRxIf2Gain)); + WLAN_OS_REPORT(("tuneDrpwRxTxLpf = %d\n", pElem->radioCal.tuneDrpwRxTxLpf)); + WLAN_OS_REPORT(("tuneDrpwTaCal = %d\n", pElem->radioCal.tuneDrpwTaCal)); + WLAN_OS_REPORT(("tuneDrpwTxMixFreqFail = %d\n", pElem->radioCal.tuneDrpwTxMixFreqFail)); + WLAN_OS_REPORT(("tuneRxAnaDcFail = %d\n", pElem->radioCal.tuneRxAnaDcFail)); + WLAN_OS_REPORT(("tuneRxIqMmFail = %d\n", pElem->radioCal.tuneRxIqMmFail)); + WLAN_OS_REPORT(("tuneTxClpcFail = %d\n", pElem->radioCal.tuneTxClpcFail)); + WLAN_OS_REPORT(("tuneTxIqMmFail = %d\n", pElem->radioCal.tuneTxIqMmFail)); + WLAN_OS_REPORT(("tuneTxLOLeakFail = %d\n", pElem->radioCal.tuneTxLOLeakFail)); + WLAN_OS_REPORT(("tuneTxPdetFail = %d\n", pElem->radioCal.tuneTxPdetFail)); + WLAN_OS_REPORT(("tuneTxPPAFail = %d\n", pElem->radioCal.tuneTxPPAFail)); + + + + /* Power Save Counters */ + WLAN_OS_REPORT(("------ Power management ----------\n")); + if(pElem->pwr.RcvdBeaconsCnt != 0) + { + WLAN_OS_REPORT(("MissingBcnsCnt = %d (percentage <= %d) \n", + pElem->pwr.MissingBcnsCnt, + ((pElem->pwr.MissingBcnsCnt * 100) / (pElem->pwr.RcvdBeaconsCnt + pElem->pwr.MissingBcnsCnt)) )); + } + else + { + WLAN_OS_REPORT(("MissingBcnsCnt = %d (percentage = 0) \n", pElem->pwr.MissingBcnsCnt)); + } + WLAN_OS_REPORT(("RcvdBeaconsCnt = %d\n", pElem->pwr.RcvdBeaconsCnt)); + WLAN_OS_REPORT(("ConnectionOutOfSync = %d\n\n", pElem->pwr.ConnectionOutOfSync)); + WLAN_OS_REPORT(("Single Missed Beacon = %d\n", (pElem->pwr.ContMissBcnsSpread[0] & 0xFFFF))); + WLAN_OS_REPORT(("2 Continuous Missed Beacons = %d\n", (pElem->pwr.ContMissBcnsSpread[1] & 0xFFFF))); + WLAN_OS_REPORT(("3 Continuous Missed Beacons = %d\n", (pElem->pwr.ContMissBcnsSpread[2] & 0xFFFF))); + WLAN_OS_REPORT(("4 Continuous Missed Beacons = %d\n", (pElem->pwr.ContMissBcnsSpread[3] & 0xFFFF))); + WLAN_OS_REPORT(("5 Continuous Missed Beacons = %d\n", (pElem->pwr.ContMissBcnsSpread[4] & 0xFFFF))); + WLAN_OS_REPORT(("6 Continuous Missed Beacons = %d\n", (pElem->pwr.ContMissBcnsSpread[5] & 0xFFFF))); + WLAN_OS_REPORT(("7 Continuous Missed Beacons = %d\n", (pElem->pwr.ContMissBcnsSpread[6] & 0xFFFF))); + WLAN_OS_REPORT(("8 Continuous Missed Beacons = %d\n", (pElem->pwr.ContMissBcnsSpread[7] & 0xFFFF))); + WLAN_OS_REPORT(("9 Continuous Missed Beacons = %d\n", (pElem->pwr.ContMissBcnsSpread[8] & 0xFFFF))); + WLAN_OS_REPORT((">=10 Continuous Missed Beacons = %d\n\n", (pElem->pwr.ContMissBcnsSpread[9] & 0xFFFF))); + + WLAN_OS_REPORT(("RcvdAwakeBeaconsCnt = %d\n", pElem->pwr.RcvdAwakeBeaconsCnt)); + WLAN_OS_REPORT(("Single Missed Beacon [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[0] >> 16))); + WLAN_OS_REPORT(("2 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[1] >> 16))); + WLAN_OS_REPORT(("3 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[2] >> 16))); + WLAN_OS_REPORT(("4 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[3] >> 16))); + WLAN_OS_REPORT(("5 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[4] >> 16))); + WLAN_OS_REPORT(("6 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[5] >> 16))); + WLAN_OS_REPORT(("7 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[6] >> 16))); + WLAN_OS_REPORT(("8 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[7] >> 16))); + WLAN_OS_REPORT(("9 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[8] >> 16))); + WLAN_OS_REPORT((">=10 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[9] >> 16))); + + return TI_OK; +} + +TI_STATUS TWD_Debug (TI_HANDLE hTWD, TI_UINT32 funcType, void *pParam) +{ + TTwd *pTWD = (TTwd *)hTWD; + TI_UINT32 GenericVal; + TFwDebugParams* pMemDebug = (TFwDebugParams*)pParam; + + static TI_UINT32 GenericAddr; + static int iStart[100]; + + /* check paramemters validity */ + if (pMemDebug == NULL) + { + WLAN_OS_REPORT(("TWD_Debug: Error - pParam is NULL\n")); + return TI_NOK; + } + + switch (funcType) + { + case TWD_PRINT_SYS_INFO: + WLAN_OS_REPORT(("PLATFORM = TNETW125x\n")); + WLAN_OS_REPORT(("ACCESS MODE = SLAVE\n")); + break; + + case TWD_SET_GENERIC_ADDR: + /* check paramemters validity */ + if (pParam == NULL) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_SET_GENERIC_ADDR Error: No Perameter received\n")); + return TI_NOK; + } + GenericAddr = *(TI_UINT32 *)pParam; + break; + + case TWD_READ_MEM: + WLAN_OS_REPORT(("TWD_Debug, TWD_READ_MEM, Addr: 0x%X\n", pMemDebug->addr)); + + /* check paramemters validity */ + if (pMemDebug == NULL) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_READ_MEM Error: No Perameters received\n")); + return TI_NOK; + } + + /* validate length */ + *(TI_UINT32*)&pMemDebug->length = 4; + + /* If Address in valid Memory area and there is enough space for Length to R/W */ + if (TWD_isValidMemoryAddr(hTWD, pMemDebug) == TI_TRUE) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_READ_MEM: Reading Valid memory Address\n")); + + /* Init buf before reading */ + os_memorySet(pTWD->hOs, (void*)pMemDebug->UBuf.buf8, 0, 4); + if ( TWD_readMem (hTWD, pMemDebug, NULL, NULL) != TI_OK ) + { + WLAN_OS_REPORT(("TWD_Debug, read memory failed\n")); + return TI_NOK; + } + } + + else if (TWD_isValidRegAddr(hTWD, pMemDebug) == TI_TRUE) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_READ_MEM: Reading Valid register Address\n")); + + /* Init buf before reading */ + *(TI_UINT32*)&pMemDebug->UBuf.buf32 = 0; + + if ( TWD_readMem (hTWD, pMemDebug, NULL, NULL) != TI_OK ) + { + WLAN_OS_REPORT(("TWD_Debug, read register failed\n")); + return TI_NOK; + } + + } + + /* address Not in valid Area */ + else + { + WLAN_OS_REPORT(("TWD_Debug, TWD_READ_MEM Address is not Valid\n")); + return TI_NOK; + } + + /* print read memory */ + { + + WLAN_OS_REPORT(("Read from MEM Addr 0x%x the following values:\n", ((TFwDebugParams*)pMemDebug)->addr)); + + WLAN_OS_REPORT(("0x%X ",((TFwDebugParams*)pMemDebug)->UBuf.buf32[0])); + WLAN_OS_REPORT(("\n")); + } + + break; + + case TWD_WRITE_MEM: + WLAN_OS_REPORT(("TWD_Debug, TWD_WRITE_MEM, Addr: 0x%X\n", pMemDebug->addr)); + + /* check paramemters validity */ + if (pMemDebug == NULL) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_WRITE_MEM Error: No Perameters received\n")); + return TI_NOK; + } + + /* validate length */ + *(TI_UINT32*)&pMemDebug->length = 4; + + /* If Address in valid Memory area and there is enough space for Length to R/W */ + if (TWD_isValidMemoryAddr(hTWD, pMemDebug) == TI_TRUE) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_WRITE_MEM: Writing Valid memory Address\n")); + + + return ( TWD_writeMem (hTWD, pMemDebug, NULL, NULL) ); + } + + else if (TWD_isValidRegAddr(hTWD, pMemDebug) == TI_TRUE) + { + + WLAN_OS_REPORT(("TWD_Debug, TWD_WRITE_MEM: Writing Valid register Address\n")); + + return ( TWD_writeMem (hTWD, pMemDebug, NULL, NULL) ); + } + /* address Not in valid Area */ + + else + { + WLAN_OS_REPORT(("TWD_Debug, TWD_WRITE_MEM Address is not Valid\n")); + return TI_NOK; + } + + break; + + /* HAL Control functions */ + + case TWD_PRINT_MBOX_QUEUE_INFO: + cmdQueue_Print (pTWD->hCmdQueue); + break; + + case TWD_PRINT_MBOX_PRINT_CMD: + /* check paramemters validity */ + if (pParam == NULL) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_PRINT_MBOX_PRINT_CMD Error: No Perameter received\n")); + return TI_NOK; + } + cmdQueue_PrintHistory (pTWD->hCmdQueue, *(int *)pParam); + break; + + case TWD_PRINT_EVENT_MBOX_INFO: + eventMbox_Print (pTWD->hEventMbox); + break; + + case TWD_PRINT_EVENT_MBOX_MASK: + /* check paramemters validity */ + if (pParam == NULL) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_PRINT_EVENT_MBOX_MASK Error: No Perameter received\n")); + return TI_NOK; + } + if ( eventMbox_MaskEvent (pTWD->hEventMbox, *(int *)pParam, NULL, NULL) == TI_NOK ) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_PRINT_EVENT_MBOX_MASK Error: eventMbox_EvMask failed\n")); + return(TI_NOK); + } + break; + + case TWD_PRINT_EVENT_MBOX_UNMASK: + /* check paramemters validity */ + if (pParam == NULL) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_PRINT_EVENT_MBOX_UNMASK Error: No Perameter received\n")); + return TI_NOK; + } + if ( eventMbox_UnMaskEvent (pTWD->hEventMbox, *(int *)pParam, NULL, NULL) == TI_NOK ) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_PRINT_EVENT_MBOX_UNMASK Error: eventMbox_EvUnMask failed\n")); + return(TI_NOK); + } + break; + + case TWD_PRINT_ISTART: + { + int i; + for (i=0; i<20; i+=4) + { + WLAN_OS_REPORT(("%4d: %08d %08d %08d %08d\n", + i, iStart[i+0], iStart[i+1], iStart[i+2], iStart[i+3])); + } + } + break; + + case TWD_PRINT_LIST_REGS_THROG_MBOX: + { + int i; + TI_UINT32 RegAddr; + + RegAddr = *(TI_UINT32 *)pParam; + WLAN_OS_REPORT (("PrintListRegsThroughMbox ---------------------\n")); + + for (i = 0; i < 8; i++, RegAddr += 16) + { + TWD_PrintMemRegs (hTWD, RegAddr + 0, 4, TNETW_MAC_REGISTERS); + TWD_PrintMemRegs (hTWD, RegAddr + 4, 4, TNETW_MAC_REGISTERS); + TWD_PrintMemRegs (hTWD, RegAddr + 8, 4, TNETW_MAC_REGISTERS); + TWD_PrintMemRegs (hTWD, RegAddr + 12, 4, TNETW_MAC_REGISTERS); + } + } + break; + + case TWD_PRINT_LIST_MEM_THROG_MBOX: + /* check paramemters validity */ + if (pParam == NULL) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_PRINT_LIST_MEM_THROG_MBOX Error: No Perameter received\n")); + return TI_NOK; + } + TWD_PrintMemRegs (hTWD, *(TI_UINT32*)pParam, 256, TNETW_INTERNAL_RAM); + break; + + case TWD_SET_MAC_CLOCK: + /* check paramemters validity */ + if (pParam == NULL) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_SET_MAC_CLOCK Error: No Perameter received\n")); + return TI_NOK; + } + + GenericVal = *(TI_UINT32*)pParam; + TWD_CfgMacClock (hTWD, GenericVal); + break; + +#if defined(TNETW1150) + case TWD_SET_ARM_CLOCK: + /* check paramemters validity */ + if (pParam == NULL) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_SET_ARM_CLOCK Error: No Perameter received\n")); + return TI_NOK; + } + + GenericVal = *(TI_UINT32*)pParam; + TWD_ArmClockSet (hTWD, GenericVal); + break; +#endif + + /* + * Rx functions + */ +#ifdef TI_DBG + case TWD_PRINT_RX_INFO: + rxXfer_PrintStats (pTWD->hRxXfer); + break; + + case TWD_CLEAR_RX_INFO: + rxXfer_ClearStats (pTWD->hRxXfer); + break; + +#endif /* TI_DBG */ + + /* + * Acx functions + */ + case TWD_PRINT_ACX_MAP: + TWD_PrintMemoryMap (hTWD); + break; + + case TWD_PRINT_ACX_STAT: + TWD_ItrStatistics (hTWD, (void*)TWD_StatisticsReadCB, hTWD, (void *)&pTWD->acxStatistic); + break; + + /* + * General functions + */ + case TWD_PRINT_HELP: + + WLAN_OS_REPORT(("Registers: \n")); + WLAN_OS_REPORT((" %02d - TWD_PRINT_SYS_INFO \n\n", TWD_PRINT_SYS_INFO)); + WLAN_OS_REPORT((" %02d - TWD_SET_GENERIC_ADDR \n", TWD_SET_GENERIC_ADDR)); + WLAN_OS_REPORT((" %02d - TWD_READ_REG_OR_4_BYTES_MEM <addr (reg base=0x300000, mem base=0x40000)>\n", TWD_READ_MEM)); + WLAN_OS_REPORT((" %02d - TWD_WRITE_REG_OR_4_BYTES_MEM <addr (reg base=0x300000, mem base=0x40000)> <val (chars<=4)>\n", TWD_WRITE_MEM)); + + WLAN_OS_REPORT(("Control: \n")); + WLAN_OS_REPORT((" %02d - TWD_PRINT_MBOX_QUEUE_INFO \n",TWD_PRINT_MBOX_QUEUE_INFO)); + WLAN_OS_REPORT((" %02d - TWD_PRINT_MBOX_QUEUE_PRINT_CMD \n",TWD_PRINT_MBOX_PRINT_CMD)); + WLAN_OS_REPORT((" %02d - TWD_MAILBOX_HISTORY_PRINT \n", TWD_MAILBOX_HISTORY_PRINT)); + WLAN_OS_REPORT((" %02d - TWD_MAC_REG \n", TWD_MAC_REG)); + WLAN_OS_REPORT((" %02d - TWD_SET_ARM_CLOCK \n", TWD_SET_ARM_CLOCK)); + WLAN_OS_REPORT((" %02d - TWD_SET_MAC_CLOCK \n", TWD_SET_MAC_CLOCK)); + + WLAN_OS_REPORT(("Rx: \n")); + WLAN_OS_REPORT((" %02d - TWD_PRINT_RX_INFO \n", TWD_PRINT_RX_INFO)); + WLAN_OS_REPORT((" %02d - TWD_CLEAR_RX_INFO \n", TWD_CLEAR_RX_INFO)); + + WLAN_OS_REPORT(("ACX: \n")); + WLAN_OS_REPORT((" %02d - TWD_PRINT_ACX_MAP \n", TWD_PRINT_ACX_MAP)); + WLAN_OS_REPORT((" %02d - TWD_PRINT_ACX_STAT \n", TWD_PRINT_ACX_STAT)); + + WLAN_OS_REPORT(("General: \n")); + WLAN_OS_REPORT((" %02d - TWD_PRINT_LIST_REGS_THROG_MBOX \n", TWD_PRINT_LIST_REGS_THROG_MBOX)); + WLAN_OS_REPORT((" %02d - TWD_PRINT_LIST_MEM_THROG_MBOX \n", TWD_PRINT_LIST_MEM_THROG_MBOX)); + + WLAN_OS_REPORT(("Recovery: \n")); + WLAN_OS_REPORT((" %02d - TWD_CHECK_HW \n", TWD_CHECK_HW)); + WLAN_OS_REPORT((" %02d - TWD_PRINT_HW_STATUS \n", TWD_PRINT_HW_STATUS)); + + WLAN_OS_REPORT(("Event Mail Box: \n")); + WLAN_OS_REPORT((" %02d - PRINT EVENT MBOX INFO \n", TWD_PRINT_EVENT_MBOX_INFO)); + WLAN_OS_REPORT((" %02d - PRINT EVENT MBOX MASK \n", TWD_PRINT_EVENT_MBOX_MASK)); + WLAN_OS_REPORT((" %02d - PRINT EVENT MBOX UNMASK \n",TWD_PRINT_EVENT_MBOX_UNMASK)); + + WLAN_OS_REPORT(("Other: \n")); + WLAN_OS_REPORT((" %02d - TWD_PRINT_FW_EVENT_INFO \n", TWD_PRINT_FW_EVENT_INFO)); + WLAN_OS_REPORT((" %02d - TWD_PRINT_TW_IF_INFO \n", TWD_PRINT_TW_IF_INFO)); + WLAN_OS_REPORT((" %02d - TWD_PRINT_MBOX_INFO \n", TWD_PRINT_MBOX_INFO)); + WLAN_OS_REPORT((" %02d - TWD_FORCE_TEMPLATES_RATES \n", TWD_FORCE_TEMPLATES_RATES)); + break; + + case TWD_PRINT_FW_EVENT_INFO: + fwEvent_PrintStat(pTWD->hFwEvent); + break; + case TWD_PRINT_TW_IF_INFO: + twIf_PrintQueues(pTWD->hTwIf); + break; + case TWD_PRINT_MBOX_INFO: + cmdMbox_PrintInfo(pTWD->hCmdMbox); + break; + + /* + * Recovery functions + */ + case TWD_CHECK_HW: + { + int Stt; + + Stt = TWD_CmdHealthCheck (hTWD); + WLAN_OS_REPORT(("CheckHwStatus=%d \n", Stt)); + } + break; + + case TWD_MAILBOX_HISTORY_PRINT: + WLAN_OS_REPORT (("PrintMailBoxHistory called \n")); +#ifdef TI_DBG + /* check paramemters validity */ + if (pParam == NULL) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_MAILBOX_HISTORY_PRINT Error: No Perameter received\n")); + return TI_NOK; + } + + cmdQueue_PrintHistory (pTWD->hCmdQueue, *(int *)pParam); +#endif + break; + + case TWD_FORCE_TEMPLATES_RATES: + if (pParam == NULL) + { + WLAN_OS_REPORT(("TWD_Debug, TWD_FORCE_TEMPLATES_RATES Error: No Perameter received\n")); + return TI_NOK; + } + cmdBld_DbgForceTemplatesRates (pTWD->hCmdBld, *(TI_UINT32 *)pParam); + break; + + + default: + WLAN_OS_REPORT (("Invalid function type=%d\n\n", funcType)); + break; + + } /* switch (funcType) */ + + return TI_OK; +} + |