| /* |
| * 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 REPORT_LOG |
| 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 |
| |
| 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; |
| #ifdef REPORT_LOG |
| static int iStart[100]; /* Note: it is not used properly anyway */ |
| #endif |
| /* 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; |
| } |
| |