Home | History | Annotate | Download | only in Test
      1 /*
      2  * TWD_Debug.c
      3  *
      4  * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  *  * Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  *  * Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in
     15  *    the documentation and/or other materials provided with the
     16  *    distribution.
     17  *  * Neither the name Texas Instruments nor the names of its
     18  *    contributors may be used to endorse or promote products derived
     19  *    from this software without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32  */
     33 
     34 #include "tidef.h"
     35 #include "TWDriver.h"
     36 #include "rxXfer_api.h"
     37 #include "report.h"
     38 #include "osApi.h"
     39 #include "eventMbox_api.h"
     40 #include "CmdQueue_api.h"
     41 #include "CmdMBox_api.h"
     42 #include "FwEvent_api.h"
     43 #include "fwDebug_api.h"
     44 #include "CmdBld.h"
     45 
     46 
     47 /* Phony address used by host access */
     48 #define BB_REGISTER_ADDR_BASE              0x820000
     49 
     50 /* Used for TWD Debug Tests */
     51 typedef enum
     52 {
     53 /*
     54  * General
     55  */
     56 /*	0x00	*/	TWD_PRINT_HELP,
     57 /*	0x01	*/	TWD_PRINT_SYS_INFO,
     58 /*	0x02	*/	TWD_SET_GENERIC_ADDR,
     59 /*	0x03	*/	TWD_READ_MEM,
     60 /*	0x04	*/	TWD_WRITE_MEM,
     61 
     62 /*	0x05	*/	TWD_PRINT_ISTART,
     63 
     64 /*	0x06	*/	TWD_PRINT_MBOX_QUEUE_INFO,
     65 /*	0x07	*/	TWD_PRINT_MBOX_PRINT_CMD,
     66 /*	0x08	*/	TWD_MAILBOX_HISTORY_PRINT,
     67 
     68 /*	0x09	*/	TWD_MAC_REG,
     69 /*	0x0A	*/	TWD_SET_ARM_CLOCK,
     70 /*	0x0B	*/	TWD_SET_MAC_CLOCK,
     71 
     72 /*
     73  * Rx
     74  */
     75 /*	0x0C	*/	TWD_PRINT_RX_INFO,
     76 /*	0x0D	*/	TWD_CLEAR_RX_INFO,
     77 
     78 /*
     79  * Acx
     80  */
     81 /*	0x0E	*/	TWD_PRINT_ACX_MAP,
     82 /*	0x0F	*/	TWD_PRINT_ACX_STAT,
     83 
     84 /*
     85  * General Debug
     86  */
     87 /*	0x10	*/	TWD_PWR_SV_DBG,
     88 
     89 /*	0x11	*/	TWD_PRINT_LIST_REGS_THROG_MBOX,
     90 /*	0x12	*/	TWD_PRINT_LIST_MEM_THROG_MBOX,
     91 /*	0x13	*/	TWD_SET_MAC_REGISTER_THROG_MBOX,
     92 /*	0x14	*/	TWD_SET_PHY_REGISTER_THROG_MBOX,
     93 /*	0x15	*/	TWD_SET_MEMORY_THROG_MBOX,
     94 
     95 /*
     96  * Recover Debug
     97  */
     98 /*	0x16	*/	TWD_CHECK_HW,
     99 /*	0x17	*/	TWD_PRINT_HW_STATUS,
    100 
    101 /*
    102  * Event MailBox
    103  */
    104 /*	0x18	*/	TWD_PRINT_EVENT_MBOX_INFO,
    105 /*	0x19	*/	TWD_PRINT_EVENT_MBOX_MASK,
    106 /*	0x1A	*/	TWD_PRINT_EVENT_MBOX_UNMASK,
    107 
    108 /*
    109  * Other
    110  */
    111 TWD_PRINT_FW_EVENT_INFO,
    112 TWD_PRINT_TW_IF_INFO,
    113 TWD_PRINT_MBOX_INFO,
    114 TWD_FORCE_TEMPLATES_RATES,
    115 
    116 				TWD_DEBUG_TEST_MAX = 0xFF	/* mast be last!!! */
    117 
    118 } TWD_DebugTest_e;
    119 
    120 
    121 /* Used for Memory or Registers reading/writing*/
    122 typedef enum
    123 {
    124    TNETW_INTERNAL_RAM,
    125    TNETW_MAC_REGISTERS,
    126    TNETW_PHY_REGISTERS
    127 
    128 } readWrite_MemoryType_e;
    129 
    130 static void TWD_PrintMemRegsCB (TI_HANDLE hTWD, TI_UINT32 cmdCbStatus)
    131 {
    132     TTwd    *pTWD = (TTwd *)hTWD;
    133     int      i;
    134     TI_UINT8   *pBuf;
    135     TI_UINT32   result;
    136 
    137     if (cmdCbStatus != TI_OK)
    138     {
    139         WLAN_OS_REPORT(("Command complete error \n\n"));
    140         return;
    141     }
    142 
    143     result = (((TI_UINT32)pTWD->tPrintRegsBuf.addr) & 0xFFFF0000);
    144 
    145     switch (result)
    146     {
    147         case REGISTERS_BASE:
    148                 WLAN_OS_REPORT(("MAC REGS (Base=0x%08x) = 0x%08x\n",
    149                                ((TI_UINT32)pTWD->tPrintRegsBuf.addr)&0xFFFF,
    150                                *(TI_UINT32*)(pTWD->tPrintRegsBuf.value)));
    151                 break;
    152 
    153         case BB_REGISTER_ADDR_BASE:
    154                 WLAN_OS_REPORT(("PHY REGS (Base=0x%08x) = 0x%08x\n",
    155                                ((TI_UINT32)pTWD->tPrintRegsBuf.addr)&0xFFFF,
    156                                *(TI_UINT32*)(pTWD->tPrintRegsBuf.value)));
    157                 break;
    158 
    159         default: /* Memory*/
    160                 for (i=0, pBuf = pTWD->tPrintRegsBuf.value; i < 256; i += 16, pBuf += 16)
    161                 {
    162                     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",
    163 									pTWD->tPrintRegsBuf.addr+i,
    164 									pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4], pBuf[5], pBuf[6], pBuf[7],
    165 									pBuf[8], pBuf[9], pBuf[10], pBuf[11], pBuf[12], pBuf[13], pBuf[14], pBuf[15]));
    166                 }
    167                 break;
    168     }
    169 }
    170 
    171 
    172 static void TWD_PrintMemRegs (TI_HANDLE hTWD, TI_UINT32 address, TI_UINT32 len, readWrite_MemoryType_e memType)
    173 {
    174     TTwd  *pTWD = (TTwd *)hTWD;
    175     ReadWriteCommand_t  AcxCmd_ReadMemory;
    176     ReadWriteCommand_t* pCmd = &AcxCmd_ReadMemory;
    177 
    178     os_memoryZero (pTWD->hOs, (void *)pCmd, sizeof (*pCmd));
    179 
    180     switch (memType)
    181     {
    182         case TNETW_INTERNAL_RAM:
    183             pCmd->addr = (TI_UINT32)ENDIAN_HANDLE_LONG (address);
    184             pCmd->size = ENDIAN_HANDLE_LONG (len);
    185             break;
    186 
    187         case TNETW_MAC_REGISTERS:
    188             pCmd->addr = (TI_UINT32)ENDIAN_HANDLE_LONG (((address&0xFFFF) | REGISTERS_BASE));
    189             pCmd->size = 4;
    190             break;
    191 
    192         case TNETW_PHY_REGISTERS:
    193             pCmd->addr = (TI_UINT32)ENDIAN_HANDLE_LONG (((address&0xFFFF) | BB_REGISTER_ADDR_BASE));
    194             pCmd->size = 4;
    195             break;
    196 
    197         default:
    198             WLAN_OS_REPORT(("Wrong memory type %d\n\n", memType));
    199             return;
    200     }
    201 
    202     os_memoryZero (pTWD->hOs, (void *)&pTWD->tPrintRegsBuf, sizeof(pTWD->tPrintRegsBuf));
    203 
    204     cmdQueue_SendCommand (pTWD->hCmdQueue,
    205                       CMD_READ_MEMORY,
    206                       (char *)pCmd,
    207                       sizeof(*pCmd),
    208                       (void *)TWD_PrintMemRegsCB,
    209                       hTWD,
    210                       &pTWD->tPrintRegsBuf);
    211 }
    212 
    213 static TI_STATUS TWD_PrintMemoryMapCb (TI_HANDLE hTWD, TI_STATUS status, void *pData)
    214 {
    215 #ifdef REPORT_LOG
    216     TTwd        *pTWD = (TTwd *)hTWD;
    217     MemoryMap_t  *pMemMap = &pTWD->MemMap;
    218 
    219     /* Print the memory map */
    220     WLAN_OS_REPORT (("TWD_PrintMemoryMap:\n"));
    221     WLAN_OS_REPORT (("\tCode  (0x%08x, 0x%08x)\n\tWep  (0x%08x, 0x%08x)\n\tTmpl (0x%08x, 0x%08x)\n "
    222                     "\tQueue (0x%08x, 0x%08x)\n\tPool (0x%08x, 0x%08x)\n\tTraceBuffer (A = 0x%08x, B = 0x%08x)\n",
    223                     pMemMap->codeStart,
    224                     pMemMap->codeEnd,
    225                     pMemMap->wepDefaultKeyStart,
    226                     pMemMap->wepDefaultKeyEnd,
    227                     pMemMap->packetTemplateStart,
    228                     pMemMap->packetTemplateEnd,
    229                     pMemMap->queueMemoryStart,
    230                     pMemMap->queueMemoryEnd,
    231                     pMemMap->packetMemoryPoolStart,
    232                     pMemMap->packetMemoryPoolEnd,
    233                     pMemMap->debugBuffer1Start,
    234                     pMemMap->debugBuffer2Start));
    235 #endif
    236 
    237     return TI_OK;
    238 }
    239 
    240 
    241 /****************************************************************************
    242  *                      TWD_PrintMemoryMap ()
    243  ****************************************************************************
    244  * DESCRIPTION: Print some of the MemoryMap information element fields
    245  *
    246  * INPUTS:
    247  *          HwMboxConfig_T* pHwMboxConfig pointer to the acx mailbox
    248  *
    249  * OUTPUT:  None
    250  *
    251  * RETURNS: None
    252  ****************************************************************************/
    253 static void TWD_PrintMemoryMap (TI_HANDLE hTWD)
    254 {
    255     TTwd *pTWD = (TTwd *)hTWD;
    256 
    257     TWD_ItrMemoryMap (pTWD, &pTWD->MemMap, (void *)TWD_PrintMemoryMapCb, hTWD);
    258 }
    259 
    260 
    261 /****************************************************************************
    262  *                      TWD_StatisticsReadCB ()
    263  ****************************************************************************
    264  * DESCRIPTION: Interrogate Statistics from the wlan hardware
    265  *
    266  * INPUTS:  None
    267  *
    268  * OUTPUT:  None
    269  *
    270  * RETURNS: TI_OK or TI_NOK
    271  ****************************************************************************/
    272 static TI_STATUS TWD_StatisticsReadCB (TI_HANDLE hTWD, TI_UINT16 MboxStatus, ACXStatistics_t* pElem)
    273 {
    274     if (MboxStatus != TI_OK)
    275     {
    276         return TI_NOK;
    277     }
    278 
    279     /*
    280      *  Handle FW statistics endianess
    281      *  ==============================
    282      */
    283 
    284     /* Ring */
    285     pElem->ringStat.numOfTxProcs       = ENDIAN_HANDLE_LONG(pElem->ringStat.numOfTxProcs);
    286     pElem->ringStat.numOfPreparedDescs = ENDIAN_HANDLE_LONG(pElem->ringStat.numOfPreparedDescs);
    287     pElem->ringStat.numOfTxXfr         = ENDIAN_HANDLE_LONG(pElem->ringStat.numOfTxXfr);
    288     pElem->ringStat.numOfTxDma         = ENDIAN_HANDLE_LONG(pElem->ringStat.numOfTxDma);
    289     pElem->ringStat.numOfTxCmplt       = ENDIAN_HANDLE_LONG(pElem->ringStat.numOfTxCmplt);
    290     pElem->ringStat.numOfRxProcs       = ENDIAN_HANDLE_LONG(pElem->ringStat.numOfRxProcs);
    291     pElem->ringStat.numOfRxData        = ENDIAN_HANDLE_LONG(pElem->ringStat.numOfRxData);
    292 
    293     /* Debug */
    294     pElem->debug.debug1                = ENDIAN_HANDLE_LONG(pElem->debug.debug1);
    295     pElem->debug.debug2                = ENDIAN_HANDLE_LONG(pElem->debug.debug2);
    296     pElem->debug.debug3                = ENDIAN_HANDLE_LONG(pElem->debug.debug3);
    297     pElem->debug.debug4                = ENDIAN_HANDLE_LONG(pElem->debug.debug4);
    298     pElem->debug.debug5                = ENDIAN_HANDLE_LONG(pElem->debug.debug5);
    299     pElem->debug.debug6                = ENDIAN_HANDLE_LONG(pElem->debug.debug6);
    300 
    301     /* Isr */
    302     pElem->isr.IRQs                    = ENDIAN_HANDLE_LONG(pElem->isr.IRQs);
    303 
    304     /* Rx */
    305     pElem->rx.RxOutOfMem               = ENDIAN_HANDLE_LONG(pElem->rx.RxOutOfMem            );
    306     pElem->rx.RxHdrOverflow            = ENDIAN_HANDLE_LONG(pElem->rx.RxHdrOverflow         );
    307     pElem->rx.RxHWStuck                = ENDIAN_HANDLE_LONG(pElem->rx.RxHWStuck             );
    308     pElem->rx.RxDroppedFrame           = ENDIAN_HANDLE_LONG(pElem->rx.RxDroppedFrame        );
    309     pElem->rx.RxCompleteDroppedFrame   = ENDIAN_HANDLE_LONG(pElem->rx.RxCompleteDroppedFrame);
    310     pElem->rx.RxAllocFrame             = ENDIAN_HANDLE_LONG(pElem->rx.RxAllocFrame          );
    311     pElem->rx.RxDoneQueue              = ENDIAN_HANDLE_LONG(pElem->rx.RxDoneQueue           );
    312     pElem->rx.RxDone                   = ENDIAN_HANDLE_LONG(pElem->rx.RxDone                );
    313     pElem->rx.RxDefrag                 = ENDIAN_HANDLE_LONG(pElem->rx.RxDefrag              );
    314     pElem->rx.RxDefragEnd              = ENDIAN_HANDLE_LONG(pElem->rx.RxDefragEnd           );
    315     pElem->rx.RxMic                    = ENDIAN_HANDLE_LONG(pElem->rx.RxMic                 );
    316     pElem->rx.RxMicEnd                 = ENDIAN_HANDLE_LONG(pElem->rx.RxMicEnd              );
    317     pElem->rx.RxXfr                    = ENDIAN_HANDLE_LONG(pElem->rx.RxXfr                 );
    318     pElem->rx.RxXfrEnd                 = ENDIAN_HANDLE_LONG(pElem->rx.RxXfrEnd              );
    319     pElem->rx.RxCmplt                  = ENDIAN_HANDLE_LONG(pElem->rx.RxCmplt               );
    320     pElem->rx.RxPreCmplt               = ENDIAN_HANDLE_LONG(pElem->rx.RxPreCmplt            );
    321     pElem->rx.RxCmpltTask              = ENDIAN_HANDLE_LONG(pElem->rx.RxCmpltTask           );
    322     pElem->rx.RxPhyHdr                 = ENDIAN_HANDLE_LONG(pElem->rx.RxPhyHdr              );
    323     pElem->rx.RxTimeout                = ENDIAN_HANDLE_LONG(pElem->rx.RxTimeout             );
    324 
    325     /* Tx */
    326     pElem->tx.numOfTxTemplatePrepared  	= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxTemplatePrepared);
    327 	pElem->tx.numOfTxDataPrepared  		= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxDataPrepared);
    328 	pElem->tx.numOfTxTemplateProgrammed = ENDIAN_HANDLE_LONG(pElem->tx.numOfTxTemplateProgrammed);
    329 	pElem->tx.numOfTxDataProgrammed  	= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxDataProgrammed);
    330 	pElem->tx.numOfTxBurstProgrammed  	= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxBurstProgrammed);
    331 	pElem->tx.numOfTxStarts  			= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxStarts);
    332 	pElem->tx.numOfTxImmResp  			= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxImmResp);
    333 	pElem->tx.numOfTxStartTempaltes  	= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxStartTempaltes);
    334 	pElem->tx.numOfTxStartIntTemplate  	= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxStartIntTemplate);
    335 	pElem->tx.numOfTxStartFwGen  		= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxStartFwGen);
    336 	pElem->tx.numOfTxStartData  		= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxStartData);
    337 	pElem->tx.numOfTxStartNullFrame  	= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxStartNullFrame);
    338 	pElem->tx.numOfTxExch  				= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxExch);
    339 	pElem->tx.numOfTxRetryTemplate  	= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxRetryTemplate);
    340 	pElem->tx.numOfTxRetryData  		= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxRetryData);
    341 	pElem->tx.numOfTxExchPending  		= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxExchPending);
    342 	pElem->tx.numOfTxExchExpiry  		= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxExchExpiry);
    343 	pElem->tx.numOfTxExchMismatch  		= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxExchMismatch);
    344 	pElem->tx.numOfTxDoneTemplate  		= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxDoneTemplate);
    345 	pElem->tx.numOfTxDoneData  			= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxDoneData);
    346 	pElem->tx.numOfTxDoneIntTemplate  	= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxDoneIntTemplate);
    347 	pElem->tx.numOfTxPreXfr  			= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxPreXfr);
    348 	pElem->tx.numOfTxXfr  				= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxXfr);
    349 	pElem->tx.numOfTxXfrOutOfMem  		= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxXfrOutOfMem);
    350 	pElem->tx.numOfTxDmaProgrammed  	= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxDmaProgrammed);
    351 	pElem->tx.numOfTxDmaDone  			= ENDIAN_HANDLE_LONG(pElem->tx.numOfTxDmaDone);
    352 
    353     /* Dma */
    354     pElem->dma.RxDMAErrors             = ENDIAN_HANDLE_LONG(pElem->dma.RxDMAErrors);
    355     pElem->dma.TxDMAErrors             = ENDIAN_HANDLE_LONG(pElem->dma.TxDMAErrors);
    356 
    357     /* Wep */
    358     pElem->wep.WepAddrKeyCount         = ENDIAN_HANDLE_LONG(pElem->wep.WepAddrKeyCount);
    359     pElem->wep.WepDefaultKeyCount      = ENDIAN_HANDLE_LONG(pElem->wep.WepDefaultKeyCount);
    360     pElem->wep.WepKeyNotFound          = ENDIAN_HANDLE_LONG(pElem->wep.WepKeyNotFound);
    361     pElem->wep.WepDecryptFail          = ENDIAN_HANDLE_LONG(pElem->wep.WepDecryptFail);
    362 
    363     /* AES */
    364     pElem->aes.AesEncryptFail          = ENDIAN_HANDLE_LONG(pElem->aes.AesEncryptFail);
    365     pElem->aes.AesDecryptFail          = ENDIAN_HANDLE_LONG(pElem->aes.AesDecryptFail);
    366     pElem->aes.AesEncryptPackets       = ENDIAN_HANDLE_LONG(pElem->aes.AesEncryptPackets);
    367     pElem->aes.AesDecryptPackets       = ENDIAN_HANDLE_LONG(pElem->aes.AesDecryptPackets);
    368     pElem->aes.AesEncryptInterrupt     = ENDIAN_HANDLE_LONG(pElem->aes.AesEncryptInterrupt);
    369     pElem->aes.AesDecryptInterrupt     = ENDIAN_HANDLE_LONG(pElem->aes.AesDecryptInterrupt);
    370 
    371     /* Events */
    372     pElem->event.calibration           = ENDIAN_HANDLE_LONG(pElem->event.calibration);
    373     pElem->event.rxMismatch            = ENDIAN_HANDLE_LONG(pElem->event.rxMismatch);
    374     pElem->event.rxMemEmpty            = ENDIAN_HANDLE_LONG(pElem->event.rxMemEmpty);
    375 
    376     /* PS */
    377     pElem->pwr.MissingBcnsCnt          	= ENDIAN_HANDLE_LONG(pElem->pwr.MissingBcnsCnt);
    378     pElem->pwr.RcvdBeaconsCnt          	= ENDIAN_HANDLE_LONG(pElem->pwr.RcvdBeaconsCnt);
    379     pElem->pwr.ConnectionOutOfSync     	= ENDIAN_HANDLE_LONG(pElem->pwr.ConnectionOutOfSync);
    380     pElem->pwr.ContMissBcnsSpread[0]   	= ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[0]);
    381     pElem->pwr.ContMissBcnsSpread[1]   	= ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[1]);
    382     pElem->pwr.ContMissBcnsSpread[2]   	= ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[2]);
    383     pElem->pwr.ContMissBcnsSpread[3]   	= ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[3]);
    384     pElem->pwr.ContMissBcnsSpread[4]   	= ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[4]);
    385     pElem->pwr.ContMissBcnsSpread[5]   	= ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[5]);
    386     pElem->pwr.ContMissBcnsSpread[6]   	= ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[6]);
    387     pElem->pwr.ContMissBcnsSpread[7]   	= ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[7]);
    388     pElem->pwr.ContMissBcnsSpread[8]   	= ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[8]);
    389     pElem->pwr.ContMissBcnsSpread[9]   	= ENDIAN_HANDLE_LONG(pElem->pwr.ContMissBcnsSpread[9]);
    390 
    391     pElem->ps.psPollTimeOuts           	= ENDIAN_HANDLE_LONG(pElem->ps.psPollTimeOuts);
    392     pElem->ps.upsdTimeOuts             	= ENDIAN_HANDLE_LONG(pElem->ps.upsdTimeOuts);
    393     pElem->ps.upsdMaxAPturn            	= ENDIAN_HANDLE_LONG(pElem->ps.upsdMaxAPturn);
    394     pElem->ps.psPollMaxAPturn          	= ENDIAN_HANDLE_LONG(pElem->ps.psPollMaxAPturn);
    395     pElem->ps.psPollUtilization        	= ENDIAN_HANDLE_LONG(pElem->ps.psPollUtilization);
    396     pElem->ps.upsdUtilization          	= ENDIAN_HANDLE_LONG(pElem->ps.upsdUtilization);
    397 
    398 	pElem->rxFilter.arpFilter		   	= ENDIAN_HANDLE_LONG(pElem->rxFilter.arpFilter);
    399 	pElem->rxFilter.beaconFilter	   	= ENDIAN_HANDLE_LONG(pElem->rxFilter.beaconFilter);
    400 	pElem->rxFilter.dataFilter		   	= ENDIAN_HANDLE_LONG(pElem->rxFilter.dataFilter);
    401 	pElem->rxFilter.dupFilter		   	= ENDIAN_HANDLE_LONG(pElem->rxFilter.dupFilter);
    402 	pElem->rxFilter.MCFilter		   	= ENDIAN_HANDLE_LONG(pElem->rxFilter.MCFilter);
    403 	pElem->rxFilter.ibssFilter		   	= ENDIAN_HANDLE_LONG(pElem->rxFilter.ibssFilter);
    404 
    405 	pElem->radioCal.calStateFail	   	= ENDIAN_HANDLE_LONG(pElem->radioCal.calStateFail);
    406 	pElem->radioCal.initCalTotal	   	= ENDIAN_HANDLE_LONG(pElem->radioCal.initCalTotal);
    407 	pElem->radioCal.initRadioBandsFail 	= ENDIAN_HANDLE_LONG(pElem->radioCal.initRadioBandsFail);
    408 	pElem->radioCal.initRxIqMmFail		= ENDIAN_HANDLE_LONG(pElem->radioCal.initRxIqMmFail);
    409 	pElem->radioCal.initSetParams		= ENDIAN_HANDLE_LONG(pElem->radioCal.initSetParams);
    410 	pElem->radioCal.initTxClpcFail		= ENDIAN_HANDLE_LONG(pElem->radioCal.initTxClpcFail);
    411 	pElem->radioCal.tuneCalTotal		= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneCalTotal);
    412 	pElem->radioCal.tuneDrpwChanTune	= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwChanTune);
    413 	pElem->radioCal.tuneDrpwLnaTank		= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwLnaTank);
    414 	pElem->radioCal.tuneDrpwPdBufFail	= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwPdBufFail);
    415 	pElem->radioCal.tuneDrpwRTrimFail	= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwRTrimFail);
    416 	pElem->radioCal.tuneDrpwRxDac		= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwRxDac);
    417 	pElem->radioCal.tuneDrpwRxIf2Gain	= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwRxIf2Gain);
    418 	pElem->radioCal.tuneDrpwRxTxLpf		= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwRxTxLpf);
    419 	pElem->radioCal.tuneDrpwTaCal		= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwTaCal);
    420 	pElem->radioCal.tuneDrpwTxMixFreqFail = ENDIAN_HANDLE_LONG(pElem->radioCal.tuneDrpwTxMixFreqFail);
    421 	pElem->radioCal.tuneRxAnaDcFail		= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneRxAnaDcFail);
    422 	pElem->radioCal.tuneRxIqMmFail		= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneRxIqMmFail);
    423 	pElem->radioCal.tuneTxClpcFail		= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneTxClpcFail);
    424 	pElem->radioCal.tuneTxIqMmFail		= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneTxIqMmFail);
    425 	pElem->radioCal.tuneTxLOLeakFail	= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneTxLOLeakFail);
    426 	pElem->radioCal.tuneTxPdetFail		= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneTxPdetFail);
    427 	pElem->radioCal.tuneTxPPAFail		= ENDIAN_HANDLE_LONG(pElem->radioCal.tuneTxPPAFail);
    428 
    429 
    430     /*
    431      *  Print FW statistics
    432      *  ===================
    433      */
    434 
    435     /* Ring */
    436     WLAN_OS_REPORT(("------  Ring statistics  -------------------\n"));
    437     WLAN_OS_REPORT(("numOfTxProcs       = %d\n", pElem->ringStat.numOfTxProcs));
    438     WLAN_OS_REPORT(("numOfPreparedDescs = %d\n", pElem->ringStat.numOfPreparedDescs));
    439     WLAN_OS_REPORT(("numOfTxXfr         = %d\n", pElem->ringStat.numOfTxXfr));
    440     WLAN_OS_REPORT(("numOfTxDma         = %d\n", pElem->ringStat.numOfTxDma));
    441     WLAN_OS_REPORT(("numOfTxCmplt       = %d\n", pElem->ringStat.numOfTxCmplt));
    442     WLAN_OS_REPORT(("numOfRxProcs       = %d\n", pElem->ringStat.numOfRxProcs));
    443     WLAN_OS_REPORT(("numOfRxData        = %d\n", pElem->ringStat.numOfRxData));
    444 
    445     /* Debug */
    446     WLAN_OS_REPORT(("------  Debug statistics  -------------------\n"));
    447     WLAN_OS_REPORT(("debug1 = %d\n", pElem->debug.debug1));
    448     WLAN_OS_REPORT(("debug2 = %d\n", pElem->debug.debug2));
    449     WLAN_OS_REPORT(("debug3 = %d\n", pElem->debug.debug3));
    450     WLAN_OS_REPORT(("debug4 = %d\n", pElem->debug.debug4));
    451     WLAN_OS_REPORT(("debug5 = %d\n", pElem->debug.debug5));
    452     WLAN_OS_REPORT(("debug6 = %d\n", pElem->debug.debug6));
    453 
    454     /* Isr */
    455     WLAN_OS_REPORT(("------  Isr statistics  -------------------\n"));
    456     WLAN_OS_REPORT(("IRQs = %d\n", pElem->isr.IRQs));
    457 
    458     /* Rx */
    459     WLAN_OS_REPORT(("------  Rx  statistics  -------------------\n"));
    460     WLAN_OS_REPORT(("RxOutOfMem             = %d\n", pElem->rx.RxOutOfMem            ));
    461     WLAN_OS_REPORT(("RxHdrOverflow          = %d\n", pElem->rx.RxHdrOverflow         ));
    462     WLAN_OS_REPORT(("RxHWStuck              = %d\n", pElem->rx.RxHWStuck             ));
    463     WLAN_OS_REPORT(("RxDroppedFrame         = %d\n", pElem->rx.RxDroppedFrame        ));
    464     WLAN_OS_REPORT(("RxCompleteDroppedFrame = %d\n", pElem->rx.RxCompleteDroppedFrame));
    465     WLAN_OS_REPORT(("RxAllocFrame           = %d\n", pElem->rx.RxAllocFrame          ));
    466     WLAN_OS_REPORT(("RxDoneQueue            = %d\n", pElem->rx.RxDoneQueue           ));
    467     WLAN_OS_REPORT(("RxDone                 = %d\n", pElem->rx.RxDone                ));
    468     WLAN_OS_REPORT(("RxDefrag               = %d\n", pElem->rx.RxDefrag              ));
    469     WLAN_OS_REPORT(("RxDefragEnd            = %d\n", pElem->rx.RxDefragEnd           ));
    470     WLAN_OS_REPORT(("RxMic                  = %d\n", pElem->rx.RxMic                 ));
    471     WLAN_OS_REPORT(("RxMicEnd               = %d\n", pElem->rx.RxMicEnd              ));
    472     WLAN_OS_REPORT(("RxXfr                  = %d\n", pElem->rx.RxXfr                 ));
    473     WLAN_OS_REPORT(("RxXfrEnd               = %d\n", pElem->rx.RxXfrEnd              ));
    474     WLAN_OS_REPORT(("RxCmplt                = %d\n", pElem->rx.RxCmplt               ));
    475     WLAN_OS_REPORT(("RxPreCmplt             = %d\n", pElem->rx.RxPreCmplt            ));
    476     WLAN_OS_REPORT(("RxCmpltTask            = %d\n", pElem->rx.RxCmpltTask           ));
    477     WLAN_OS_REPORT(("RxPhyHdr               = %d\n", pElem->rx.RxPhyHdr              ));
    478     WLAN_OS_REPORT(("RxTimeout              = %d\n", pElem->rx.RxTimeout             ));
    479 
    480     WLAN_OS_REPORT(("------  RxFilters statistics  --------------\n"));
    481 	WLAN_OS_REPORT(("arpFilter    = %d\n", pElem->rxFilter.arpFilter));
    482 	WLAN_OS_REPORT(("beaconFilter = %d\n", pElem->rxFilter.beaconFilter));
    483 	WLAN_OS_REPORT(("dataFilter   = %d\n", pElem->rxFilter.dataFilter));
    484 	WLAN_OS_REPORT(("dupFilter    = %d\n", pElem->rxFilter.dupFilter));
    485 	WLAN_OS_REPORT(("MCFilter     = %d\n", pElem->rxFilter.MCFilter));
    486 	WLAN_OS_REPORT(("ibssFilter   = %d\n", pElem->rxFilter.ibssFilter));
    487 
    488     /* Tx */
    489     WLAN_OS_REPORT(("------  Tx  statistics  -------------------\n"));
    490 	WLAN_OS_REPORT(("numOfTxTemplatePrepared    = %d\n", pElem->tx.numOfTxTemplatePrepared));
    491 	WLAN_OS_REPORT(("numOfTxDataPrepared        = %d\n", pElem->tx.numOfTxDataPrepared));
    492 	WLAN_OS_REPORT(("numOfTxTemplateProgrammed  = %d\n", pElem->tx.numOfTxTemplateProgrammed));
    493 	WLAN_OS_REPORT(("numOfTxDataProgrammed      = %d\n", pElem->tx.numOfTxDataProgrammed));
    494 	WLAN_OS_REPORT(("numOfTxBurstProgrammed     = %d\n", pElem->tx.numOfTxBurstProgrammed));
    495 	WLAN_OS_REPORT(("numOfTxStarts              = %d\n", pElem->tx.numOfTxStarts));
    496 	WLAN_OS_REPORT(("numOfTxImmResp             = %d\n", pElem->tx.numOfTxImmResp));
    497 	WLAN_OS_REPORT(("numOfTxStartTempaltes      = %d\n", pElem->tx.numOfTxStartTempaltes));
    498 	WLAN_OS_REPORT(("numOfTxStartIntTemplate    = %d\n", pElem->tx.numOfTxStartIntTemplate));
    499 	WLAN_OS_REPORT(("numOfTxStartFwGen          = %d\n", pElem->tx.numOfTxStartFwGen));
    500 	WLAN_OS_REPORT(("numOfTxStartData           = %d\n", pElem->tx.numOfTxStartData));
    501 	WLAN_OS_REPORT(("numOfTxStartNullFrame      = %d\n", pElem->tx.numOfTxStartNullFrame));
    502 	WLAN_OS_REPORT(("numOfTxExch                = %d\n", pElem->tx.numOfTxExch));
    503 	WLAN_OS_REPORT(("numOfTxRetryTemplate       = %d\n", pElem->tx.numOfTxRetryTemplate));
    504 	WLAN_OS_REPORT(("numOfTxRetryData           = %d\n", pElem->tx.numOfTxRetryData));
    505 	WLAN_OS_REPORT(("numOfTxExchPending         = %d\n", pElem->tx.numOfTxExchPending));
    506 	WLAN_OS_REPORT(("numOfTxExchExpiry          = %d\n", pElem->tx.numOfTxExchExpiry));
    507 	WLAN_OS_REPORT(("numOfTxExchMismatch        = %d\n", pElem->tx.numOfTxExchMismatch));
    508 	WLAN_OS_REPORT(("numOfTxDoneTemplate        = %d\n", pElem->tx.numOfTxDoneTemplate));
    509 	WLAN_OS_REPORT(("numOfTxDoneData            = %d\n", pElem->tx.numOfTxDoneData));
    510 	WLAN_OS_REPORT(("numOfTxDoneIntTemplate     = %d\n", pElem->tx.numOfTxDoneIntTemplate));
    511 	WLAN_OS_REPORT(("numOfTxPreXfr              = %d\n", pElem->tx.numOfTxPreXfr));
    512 	WLAN_OS_REPORT(("numOfTxXfr                 = %d\n", pElem->tx.numOfTxXfr));
    513 	WLAN_OS_REPORT(("numOfTxXfrOutOfMem         = %d\n", pElem->tx.numOfTxXfrOutOfMem));
    514 	WLAN_OS_REPORT(("numOfTxDmaProgrammed       = %d\n", pElem->tx.numOfTxDmaProgrammed));
    515 	WLAN_OS_REPORT(("numOfTxDmaDone             = %d\n", pElem->tx.numOfTxDmaDone));
    516 
    517     /* Dma */
    518     WLAN_OS_REPORT(("------  Dma  statistics  -------------------\n"));
    519     WLAN_OS_REPORT(("RxDMAErrors  = %d\n", pElem->dma.RxDMAErrors));
    520     WLAN_OS_REPORT(("TxDMAErrors  = %d\n", pElem->dma.TxDMAErrors));
    521 
    522     /* Wep */
    523     WLAN_OS_REPORT(("------  Wep statistics  -------------------\n"));
    524     WLAN_OS_REPORT(("WepAddrKeyCount   = %d\n", pElem->wep.WepAddrKeyCount));
    525     WLAN_OS_REPORT(("WepDefaultKeyCount= %d\n", pElem->wep.WepDefaultKeyCount));
    526     WLAN_OS_REPORT(("WepKeyNotFound    = %d\n", pElem->wep.WepKeyNotFound));
    527     WLAN_OS_REPORT(("WepDecryptFail    = %d\n", pElem->wep.WepDecryptFail));
    528 
    529     /* AES */
    530     WLAN_OS_REPORT(("------------  AES Statistics --------------\n"));
    531     WLAN_OS_REPORT(("AesEncryptFail      = %d\n", pElem->aes.AesEncryptFail));
    532     WLAN_OS_REPORT(("AesDecryptFail      = %d\n", pElem->aes.AesDecryptFail));
    533     WLAN_OS_REPORT(("AesEncryptPackets   = %d\n", pElem->aes.AesEncryptPackets));
    534     WLAN_OS_REPORT(("AesDecryptPackets   = %d\n", pElem->aes.AesDecryptPackets));
    535     WLAN_OS_REPORT(("AesEncryptInterrupt = %d\n", pElem->aes.AesEncryptInterrupt));
    536     WLAN_OS_REPORT(("AesDecryptInterrupt = %d\n", pElem->aes.AesDecryptInterrupt));
    537 
    538     /* Events */
    539     WLAN_OS_REPORT(("------  Events  -------------------\n"));
    540     WLAN_OS_REPORT(("Calibration   = %d\n", pElem->event.calibration));
    541     WLAN_OS_REPORT(("rxMismatch    = %d\n", pElem->event.rxMismatch));
    542     WLAN_OS_REPORT(("rxMemEmpty    = %d\n", pElem->event.rxMemEmpty));
    543 
    544    /* PsPoll/Upsd */
    545     WLAN_OS_REPORT(("----------- PsPoll / Upsd -----------\n"));
    546     WLAN_OS_REPORT(("psPollTimeOuts     = %d\n",pElem->ps.psPollTimeOuts));
    547     WLAN_OS_REPORT(("upsdTimeOuts       = %d\n",pElem->ps.upsdTimeOuts));
    548     WLAN_OS_REPORT(("upsdMaxAPturn      = %d\n",pElem->ps.upsdMaxAPturn));
    549     WLAN_OS_REPORT(("psPollMaxAPturn    = %d\n",pElem->ps.psPollMaxAPturn));
    550     WLAN_OS_REPORT(("psPollUtilization  = %d\n",pElem->ps.psPollUtilization));
    551     WLAN_OS_REPORT(("upsdUtilization    = %d\n",pElem->ps.upsdUtilization));
    552 
    553 
    554 
    555 	/* Calibration */
    556 	WLAN_OS_REPORT(("----------- Calibrations -------------\n"));
    557 	WLAN_OS_REPORT(("calStateFail         	= %d\n", pElem->radioCal.calStateFail));
    558 	WLAN_OS_REPORT(("initCalTotal   		= %d\n", pElem->radioCal.initCalTotal));
    559 	WLAN_OS_REPORT(("initRadioBandsFail   	= %d\n", pElem->radioCal.initRadioBandsFail));
    560 	WLAN_OS_REPORT(("initRxIqMmFail   		= %d\n", pElem->radioCal.initRxIqMmFail));
    561 	WLAN_OS_REPORT(("initSetParams   		= %d\n", pElem->radioCal.initSetParams));
    562 	WLAN_OS_REPORT(("initTxClpcFail   		= %d\n", pElem->radioCal.initTxClpcFail));
    563 	WLAN_OS_REPORT(("tuneCalTotal   		= %d\n", pElem->radioCal.tuneCalTotal));
    564 	WLAN_OS_REPORT(("tuneDrpwChanTune		= %d\n", pElem->radioCal.tuneDrpwChanTune));
    565 	WLAN_OS_REPORT(("tuneDrpwLnaTank		= %d\n", pElem->radioCal.tuneDrpwLnaTank));
    566 	WLAN_OS_REPORT(("tuneDrpwPdBufFail		= %d\n", pElem->radioCal.tuneDrpwPdBufFail));
    567 	WLAN_OS_REPORT(("tuneDrpwRTrimFail		= %d\n", pElem->radioCal.tuneDrpwRTrimFail));
    568 	WLAN_OS_REPORT(("tuneDrpwRxDac			= %d\n", pElem->radioCal.tuneDrpwRxDac));
    569 	WLAN_OS_REPORT(("tuneDrpwRxIf2Gain		= %d\n", pElem->radioCal.tuneDrpwRxIf2Gain));
    570 	WLAN_OS_REPORT(("tuneDrpwRxTxLpf		= %d\n", pElem->radioCal.tuneDrpwRxTxLpf));
    571 	WLAN_OS_REPORT(("tuneDrpwTaCal			= %d\n", pElem->radioCal.tuneDrpwTaCal));
    572 	WLAN_OS_REPORT(("tuneDrpwTxMixFreqFail	= %d\n", pElem->radioCal.tuneDrpwTxMixFreqFail));
    573 	WLAN_OS_REPORT(("tuneRxAnaDcFail   		= %d\n", pElem->radioCal.tuneRxAnaDcFail));
    574 	WLAN_OS_REPORT(("tuneRxIqMmFail   		= %d\n", pElem->radioCal.tuneRxIqMmFail));
    575 	WLAN_OS_REPORT(("tuneTxClpcFail   		= %d\n", pElem->radioCal.tuneTxClpcFail));
    576 	WLAN_OS_REPORT(("tuneTxIqMmFail   		= %d\n", pElem->radioCal.tuneTxIqMmFail));
    577 	WLAN_OS_REPORT(("tuneTxLOLeakFail   	= %d\n", pElem->radioCal.tuneTxLOLeakFail));
    578 	WLAN_OS_REPORT(("tuneTxPdetFail   		= %d\n", pElem->radioCal.tuneTxPdetFail));
    579 	WLAN_OS_REPORT(("tuneTxPPAFail   		= %d\n", pElem->radioCal.tuneTxPPAFail));
    580 
    581 
    582 
    583     /* Power Save Counters */
    584     WLAN_OS_REPORT(("------  Power management  ----------\n"));
    585     if(pElem->pwr.RcvdBeaconsCnt != 0)
    586     {
    587         WLAN_OS_REPORT(("MissingBcnsCnt    = %d (percentage <= %d) \n",
    588                 pElem->pwr.MissingBcnsCnt,
    589                 ((pElem->pwr.MissingBcnsCnt * 100) / (pElem->pwr.RcvdBeaconsCnt + pElem->pwr.MissingBcnsCnt)) ));
    590     }
    591     else
    592     {
    593         WLAN_OS_REPORT(("MissingBcnsCnt    = %d (percentage = 0) \n", pElem->pwr.MissingBcnsCnt));
    594     }
    595     WLAN_OS_REPORT(("RcvdBeaconsCnt    = %d\n", pElem->pwr.RcvdBeaconsCnt));
    596     WLAN_OS_REPORT(("ConnectionOutOfSync    = %d\n\n", pElem->pwr.ConnectionOutOfSync));
    597     WLAN_OS_REPORT(("Single Missed Beacon           = %d\n", (pElem->pwr.ContMissBcnsSpread[0] & 0xFFFF)));
    598     WLAN_OS_REPORT(("2 Continuous Missed Beacons    = %d\n", (pElem->pwr.ContMissBcnsSpread[1] & 0xFFFF)));
    599     WLAN_OS_REPORT(("3 Continuous Missed Beacons    = %d\n", (pElem->pwr.ContMissBcnsSpread[2] & 0xFFFF)));
    600     WLAN_OS_REPORT(("4 Continuous Missed Beacons    = %d\n", (pElem->pwr.ContMissBcnsSpread[3] & 0xFFFF)));
    601     WLAN_OS_REPORT(("5 Continuous Missed Beacons    = %d\n", (pElem->pwr.ContMissBcnsSpread[4] & 0xFFFF)));
    602     WLAN_OS_REPORT(("6 Continuous Missed Beacons    = %d\n", (pElem->pwr.ContMissBcnsSpread[5] & 0xFFFF)));
    603     WLAN_OS_REPORT(("7 Continuous Missed Beacons    = %d\n", (pElem->pwr.ContMissBcnsSpread[6] & 0xFFFF)));
    604     WLAN_OS_REPORT(("8 Continuous Missed Beacons    = %d\n", (pElem->pwr.ContMissBcnsSpread[7] & 0xFFFF)));
    605     WLAN_OS_REPORT(("9 Continuous Missed Beacons    = %d\n", (pElem->pwr.ContMissBcnsSpread[8] & 0xFFFF)));
    606     WLAN_OS_REPORT((">=10 Continuous Missed Beacons = %d\n\n", (pElem->pwr.ContMissBcnsSpread[9] & 0xFFFF)));
    607 
    608     WLAN_OS_REPORT(("RcvdAwakeBeaconsCnt    = %d\n", pElem->pwr.RcvdAwakeBeaconsCnt));
    609     WLAN_OS_REPORT(("Single Missed Beacon        [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[0] >> 16)));
    610     WLAN_OS_REPORT(("2 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[1] >> 16)));
    611     WLAN_OS_REPORT(("3 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[2] >> 16)));
    612     WLAN_OS_REPORT(("4 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[3] >> 16)));
    613     WLAN_OS_REPORT(("5 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[4] >> 16)));
    614     WLAN_OS_REPORT(("6 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[5] >> 16)));
    615     WLAN_OS_REPORT(("7 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[6] >> 16)));
    616     WLAN_OS_REPORT(("8 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[7] >> 16)));
    617     WLAN_OS_REPORT(("9 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[8] >> 16)));
    618     WLAN_OS_REPORT((">=10 Continuous Missed Beacons [Awake] = %d\n", (pElem->pwr.ContMissBcnsSpread[9] >> 16)));
    619 
    620     return TI_OK;
    621 }
    622 
    623 TI_STATUS TWD_Debug (TI_HANDLE hTWD, TI_UINT32 funcType, void *pParam)
    624 {
    625     TTwd *pTWD			= (TTwd *)hTWD;
    626     TI_UINT32 GenericVal;
    627     TFwDebugParams* pMemDebug	= (TFwDebugParams*)pParam;
    628 
    629     static TI_UINT32 GenericAddr;
    630 #ifdef REPORT_LOG
    631     static int    iStart[100]; /* Note: it is not used properly anyway */
    632 #endif
    633 	/* check paramemters validity */
    634 	if (pMemDebug == NULL)
    635 	{
    636 		WLAN_OS_REPORT(("TWD_Debug: Error - pParam is NULL\n"));
    637 		return TI_NOK;
    638 	}
    639 
    640     switch (funcType)
    641     {
    642 	case TWD_PRINT_SYS_INFO:
    643 		WLAN_OS_REPORT(("PLATFORM = TNETW125x\n"));
    644 		WLAN_OS_REPORT(("ACCESS MODE = SLAVE\n"));
    645 		break;
    646 
    647 	case TWD_SET_GENERIC_ADDR:
    648 		/* check paramemters validity */
    649 		if (pParam == NULL)
    650 		{
    651 			WLAN_OS_REPORT(("TWD_Debug, TWD_SET_GENERIC_ADDR Error: No Perameter received\n"));
    652 			return TI_NOK;
    653 		}
    654 		GenericAddr = *(TI_UINT32 *)pParam;
    655         break;
    656 
    657 	case TWD_READ_MEM:
    658         WLAN_OS_REPORT(("TWD_Debug, TWD_READ_MEM, Addr:	0x%X\n", pMemDebug->addr));
    659 
    660 		/* check paramemters validity */
    661 		if (pMemDebug == NULL)
    662 		{
    663 			WLAN_OS_REPORT(("TWD_Debug, TWD_READ_MEM Error: No Perameters received\n"));
    664 			return TI_NOK;
    665 		}
    666 
    667 		/* validate length */
    668 		*(TI_UINT32*)&pMemDebug->length = 4;
    669 
    670 		/* If Address in valid Memory area and there is enough space for Length to R/W */
    671 		if (TWD_isValidMemoryAddr(hTWD, pMemDebug) == TI_TRUE)
    672 		{
    673 			WLAN_OS_REPORT(("TWD_Debug, TWD_READ_MEM: Reading Valid memory Address\n"));
    674 
    675 			/* Init buf before reading */
    676 			os_memorySet(pTWD->hOs, (void*)pMemDebug->UBuf.buf8, 0, 4);
    677 			if ( TWD_readMem (hTWD, pMemDebug, NULL, NULL) != TI_OK )
    678 			{
    679 				WLAN_OS_REPORT(("TWD_Debug, read memory failed\n"));
    680 				return TI_NOK;
    681 			}
    682 		}
    683 
    684 		else if (TWD_isValidRegAddr(hTWD, pMemDebug) == TI_TRUE)
    685 		{
    686 			WLAN_OS_REPORT(("TWD_Debug, TWD_READ_MEM: Reading Valid register Address\n"));
    687 
    688 			/* Init buf before reading */
    689 			*(TI_UINT32*)&pMemDebug->UBuf.buf32 = 0;
    690 
    691 			if ( TWD_readMem (hTWD, pMemDebug, NULL, NULL) != TI_OK )
    692 			{
    693 				WLAN_OS_REPORT(("TWD_Debug, read register failed\n"));
    694 				return TI_NOK;
    695 			}
    696 
    697 		}
    698 
    699 		/* address Not in valid Area */
    700 		else
    701 		{
    702 			WLAN_OS_REPORT(("TWD_Debug, TWD_READ_MEM Address is not Valid\n"));
    703 			return TI_NOK;
    704 		}
    705 
    706 		/* print read memory */
    707 		{
    708 
    709 			WLAN_OS_REPORT(("Read from MEM Addr 0x%x the following values:\n", ((TFwDebugParams*)pMemDebug)->addr));
    710 
    711 			WLAN_OS_REPORT(("0x%X	",((TFwDebugParams*)pMemDebug)->UBuf.buf32[0]));
    712 			WLAN_OS_REPORT(("\n"));
    713 		}
    714 
    715 		break;
    716 
    717 	case TWD_WRITE_MEM:
    718         WLAN_OS_REPORT(("TWD_Debug, TWD_WRITE_MEM, Addr:	0x%X\n", pMemDebug->addr));
    719 
    720 		/* check paramemters validity */
    721 		if (pMemDebug == NULL)
    722 		{
    723 			WLAN_OS_REPORT(("TWD_Debug, TWD_WRITE_MEM Error: No Perameters received\n"));
    724 			return TI_NOK;
    725 		}
    726 
    727 		/* validate length */
    728 		*(TI_UINT32*)&pMemDebug->length = 4;
    729 
    730 		/* If Address in valid Memory area and there is enough space for Length to R/W */
    731 		if (TWD_isValidMemoryAddr(hTWD, pMemDebug) == TI_TRUE)
    732 		{
    733 			WLAN_OS_REPORT(("TWD_Debug, TWD_WRITE_MEM:	Writing Valid memory Address\n"));
    734 
    735 
    736 			return ( TWD_writeMem (hTWD, pMemDebug, NULL, NULL) );
    737 		}
    738 
    739 		else if (TWD_isValidRegAddr(hTWD, pMemDebug) == TI_TRUE)
    740 		{
    741 
    742 			WLAN_OS_REPORT(("TWD_Debug, TWD_WRITE_MEM: Writing Valid register Address\n"));
    743 
    744 			return ( TWD_writeMem (hTWD, pMemDebug, NULL, NULL) );
    745 		}
    746 		/* address Not in valid Area */
    747 
    748 		else
    749 		{
    750 			WLAN_OS_REPORT(("TWD_Debug, TWD_WRITE_MEM Address is not Valid\n"));
    751 			return TI_NOK;
    752 		}
    753 
    754 		break;
    755 
    756          /*  HAL Control functions */
    757 
    758 	case TWD_PRINT_MBOX_QUEUE_INFO:
    759 		cmdQueue_Print (pTWD->hCmdQueue);
    760         break;
    761 
    762 	case TWD_PRINT_MBOX_PRINT_CMD:
    763 		/* check paramemters validity */
    764 		if (pParam == NULL)
    765 		{
    766 			WLAN_OS_REPORT(("TWD_Debug, TWD_PRINT_MBOX_PRINT_CMD Error: No Perameter received\n"));
    767 			return TI_NOK;
    768 		}
    769 		cmdQueue_PrintHistory (pTWD->hCmdQueue, *(int *)pParam);
    770         break;
    771 
    772 	case TWD_PRINT_EVENT_MBOX_INFO:
    773 		eventMbox_Print (pTWD->hEventMbox);
    774         break;
    775 
    776 	case TWD_PRINT_EVENT_MBOX_MASK:
    777 		/* check paramemters validity */
    778 		if (pParam == NULL)
    779 		{
    780 			WLAN_OS_REPORT(("TWD_Debug, TWD_PRINT_EVENT_MBOX_MASK Error: No Perameter received\n"));
    781 			return TI_NOK;
    782 		}
    783 		if ( eventMbox_MaskEvent (pTWD->hEventMbox, *(int *)pParam, NULL, NULL) == TI_NOK )
    784 		{
    785 			WLAN_OS_REPORT(("TWD_Debug, TWD_PRINT_EVENT_MBOX_MASK Error: eventMbox_EvMask failed\n"));
    786 			return(TI_NOK);
    787 		}
    788         break;
    789 
    790 	case TWD_PRINT_EVENT_MBOX_UNMASK:
    791 		/* check paramemters validity */
    792 		if (pParam == NULL)
    793 		{
    794 			WLAN_OS_REPORT(("TWD_Debug, TWD_PRINT_EVENT_MBOX_UNMASK Error: No Perameter received\n"));
    795 			return TI_NOK;
    796 		}
    797 		if ( eventMbox_UnMaskEvent (pTWD->hEventMbox, *(int *)pParam, NULL, NULL) == TI_NOK )
    798 		{
    799 			WLAN_OS_REPORT(("TWD_Debug, TWD_PRINT_EVENT_MBOX_UNMASK Error: eventMbox_EvUnMask failed\n"));
    800 			return(TI_NOK);
    801 		}
    802         break;
    803 
    804 	case TWD_PRINT_ISTART:
    805 		{
    806 			int i;
    807             for (i=0; i<20; i+=4)
    808             {
    809 				WLAN_OS_REPORT(("%4d: %08d %08d %08d %08d\n",
    810 								i, iStart[i+0], iStart[i+1], iStart[i+2], iStart[i+3]));
    811 			}
    812 		}
    813         break;
    814 
    815 	case TWD_PRINT_LIST_REGS_THROG_MBOX:
    816 		{
    817 			int i;
    818             TI_UINT32 RegAddr;
    819 
    820 			RegAddr = *(TI_UINT32 *)pParam;
    821 			WLAN_OS_REPORT (("PrintListRegsThroughMbox ---------------------\n"));
    822 
    823 			for (i = 0; i < 8; i++, RegAddr += 16)
    824             {
    825 				TWD_PrintMemRegs (hTWD, RegAddr +  0, 4, TNETW_MAC_REGISTERS);
    826                 TWD_PrintMemRegs (hTWD, RegAddr +  4, 4, TNETW_MAC_REGISTERS);
    827 				TWD_PrintMemRegs (hTWD, RegAddr +  8, 4, TNETW_MAC_REGISTERS);
    828 				TWD_PrintMemRegs (hTWD, RegAddr + 12, 4, TNETW_MAC_REGISTERS);
    829 			}
    830 		}
    831         break;
    832 
    833 	case TWD_PRINT_LIST_MEM_THROG_MBOX:
    834 		/* check paramemters validity */
    835 		if (pParam == NULL)
    836 		{
    837 			WLAN_OS_REPORT(("TWD_Debug, TWD_PRINT_LIST_MEM_THROG_MBOX Error: No Perameter received\n"));
    838 			return TI_NOK;
    839 		}
    840 		TWD_PrintMemRegs (hTWD, *(TI_UINT32*)pParam, 256, TNETW_INTERNAL_RAM);
    841         break;
    842 
    843 	case TWD_SET_MAC_CLOCK:
    844 		/* check paramemters validity */
    845 		if (pParam == NULL)
    846 		{
    847 			WLAN_OS_REPORT(("TWD_Debug, TWD_SET_MAC_CLOCK Error: No Perameter received\n"));
    848 			return TI_NOK;
    849 		}
    850 
    851 		GenericVal = *(TI_UINT32*)pParam;
    852         TWD_CfgMacClock (hTWD, GenericVal);
    853         break;
    854 
    855 #if defined(TNETW1150)
    856 	case TWD_SET_ARM_CLOCK:
    857 		/* check paramemters validity */
    858 		if (pParam == NULL)
    859 		{
    860 			WLAN_OS_REPORT(("TWD_Debug, TWD_SET_ARM_CLOCK Error: No Perameter received\n"));
    861 			return TI_NOK;
    862 		}
    863 
    864 		GenericVal = *(TI_UINT32*)pParam;
    865         TWD_ArmClockSet (hTWD, GenericVal);
    866         break;
    867 #endif
    868 
    869 	/*
    870     * Rx functions
    871     */
    872 #ifdef TI_DBG
    873     case TWD_PRINT_RX_INFO:
    874 		rxXfer_PrintStats (pTWD->hRxXfer);
    875         break;
    876 
    877 	case TWD_CLEAR_RX_INFO:
    878 		rxXfer_ClearStats (pTWD->hRxXfer);
    879         break;
    880 
    881 #endif /* TI_DBG */
    882 
    883 	/*
    884     * Acx functions
    885     */
    886     case TWD_PRINT_ACX_MAP:
    887 		TWD_PrintMemoryMap (hTWD);
    888         break;
    889 
    890 	case TWD_PRINT_ACX_STAT:
    891 		TWD_ItrStatistics (hTWD, (void*)TWD_StatisticsReadCB, hTWD, (void *)&pTWD->acxStatistic);
    892         break;
    893 
    894 	/*
    895 	* General functions
    896     */
    897     case TWD_PRINT_HELP:
    898 
    899 		WLAN_OS_REPORT(("Registers: \n"));
    900         WLAN_OS_REPORT(("        %02d - TWD_PRINT_SYS_INFO \n\n", TWD_PRINT_SYS_INFO));
    901         WLAN_OS_REPORT(("        %02d - TWD_SET_GENERIC_ADDR \n", TWD_SET_GENERIC_ADDR));
    902 		WLAN_OS_REPORT(("        %02d - TWD_READ_REG_OR_4_BYTES_MEM <addr (reg base=0x300000, mem base=0x40000)>\n", TWD_READ_MEM));
    903 		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));
    904 
    905         WLAN_OS_REPORT(("Control: \n"));
    906         WLAN_OS_REPORT(("        %02d - TWD_PRINT_MBOX_QUEUE_INFO \n",TWD_PRINT_MBOX_QUEUE_INFO));
    907         WLAN_OS_REPORT(("        %02d - TWD_PRINT_MBOX_QUEUE_PRINT_CMD \n",TWD_PRINT_MBOX_PRINT_CMD));
    908         WLAN_OS_REPORT(("        %02d - TWD_MAILBOX_HISTORY_PRINT \n", TWD_MAILBOX_HISTORY_PRINT));
    909         WLAN_OS_REPORT(("        %02d - TWD_MAC_REG \n", TWD_MAC_REG));
    910         WLAN_OS_REPORT(("        %02d - TWD_SET_ARM_CLOCK \n", TWD_SET_ARM_CLOCK));
    911         WLAN_OS_REPORT(("        %02d - TWD_SET_MAC_CLOCK \n", TWD_SET_MAC_CLOCK));
    912 
    913         WLAN_OS_REPORT(("Rx: \n"));
    914         WLAN_OS_REPORT(("        %02d - TWD_PRINT_RX_INFO \n", TWD_PRINT_RX_INFO));
    915         WLAN_OS_REPORT(("        %02d - TWD_CLEAR_RX_INFO \n", TWD_CLEAR_RX_INFO));
    916 
    917         WLAN_OS_REPORT(("ACX: \n"));
    918         WLAN_OS_REPORT(("        %02d - TWD_PRINT_ACX_MAP \n", TWD_PRINT_ACX_MAP));
    919 		WLAN_OS_REPORT(("        %02d - TWD_PRINT_ACX_STAT \n", TWD_PRINT_ACX_STAT));
    920 
    921         WLAN_OS_REPORT(("General: \n"));
    922         WLAN_OS_REPORT(("        %02d - TWD_PRINT_LIST_REGS_THROG_MBOX \n",  TWD_PRINT_LIST_REGS_THROG_MBOX));
    923         WLAN_OS_REPORT(("        %02d - TWD_PRINT_LIST_MEM_THROG_MBOX \n",  TWD_PRINT_LIST_MEM_THROG_MBOX));
    924 
    925         WLAN_OS_REPORT(("Recovery: \n"));
    926         WLAN_OS_REPORT(("        %02d - TWD_CHECK_HW \n", TWD_CHECK_HW));
    927         WLAN_OS_REPORT(("        %02d - TWD_PRINT_HW_STATUS \n", TWD_PRINT_HW_STATUS));
    928 
    929 		WLAN_OS_REPORT(("Event Mail Box: \n"));
    930         WLAN_OS_REPORT(("        %02d - PRINT EVENT MBOX INFO \n",  TWD_PRINT_EVENT_MBOX_INFO));
    931         WLAN_OS_REPORT(("        %02d - PRINT EVENT MBOX MASK \n",  TWD_PRINT_EVENT_MBOX_MASK));
    932         WLAN_OS_REPORT(("        %02d - PRINT EVENT MBOX UNMASK \n",TWD_PRINT_EVENT_MBOX_UNMASK));
    933 
    934 		WLAN_OS_REPORT(("Other: \n"));
    935         WLAN_OS_REPORT(("        %02d - TWD_PRINT_FW_EVENT_INFO \n",  TWD_PRINT_FW_EVENT_INFO));
    936         WLAN_OS_REPORT(("        %02d - TWD_PRINT_TW_IF_INFO \n",  TWD_PRINT_TW_IF_INFO));
    937         WLAN_OS_REPORT(("        %02d - TWD_PRINT_MBOX_INFO \n",  TWD_PRINT_MBOX_INFO));
    938         WLAN_OS_REPORT(("        %02d - TWD_FORCE_TEMPLATES_RATES \n",  TWD_FORCE_TEMPLATES_RATES));
    939         break;
    940 
    941 	case TWD_PRINT_FW_EVENT_INFO:
    942         fwEvent_PrintStat(pTWD->hFwEvent);
    943         break;
    944 	case TWD_PRINT_TW_IF_INFO:
    945         twIf_PrintQueues(pTWD->hTwIf);
    946         break;
    947 	case TWD_PRINT_MBOX_INFO:
    948         cmdMbox_PrintInfo(pTWD->hCmdMbox);
    949         break;
    950 
    951     /*
    952     * Recovery functions
    953     */
    954 	case TWD_CHECK_HW:
    955 		{
    956 			int Stt;
    957 
    958             Stt = TWD_CmdHealthCheck (hTWD);
    959             WLAN_OS_REPORT(("CheckHwStatus=%d \n", Stt));
    960 		}
    961         break;
    962 
    963 	case TWD_MAILBOX_HISTORY_PRINT:
    964 		WLAN_OS_REPORT (("PrintMailBoxHistory called \n"));
    965 #ifdef TI_DBG
    966 		/* check paramemters validity */
    967 		if (pParam == NULL)
    968 		{
    969 			WLAN_OS_REPORT(("TWD_Debug, TWD_MAILBOX_HISTORY_PRINT Error: No Perameter received\n"));
    970 			return TI_NOK;
    971 		}
    972 
    973         cmdQueue_PrintHistory (pTWD->hCmdQueue, *(int *)pParam);
    974 #endif
    975         break;
    976 
    977 	case TWD_FORCE_TEMPLATES_RATES:
    978 		if (pParam == NULL)
    979 		{
    980 			WLAN_OS_REPORT(("TWD_Debug, TWD_FORCE_TEMPLATES_RATES Error: No Perameter received\n"));
    981 			return TI_NOK;
    982 		}
    983 		cmdBld_DbgForceTemplatesRates (pTWD->hCmdBld, *(TI_UINT32 *)pParam);
    984         break;
    985 
    986 
    987 	default:
    988 		WLAN_OS_REPORT (("Invalid function type=%d\n\n", funcType));
    989         break;
    990 
    991 	} /* switch (funcType) */
    992 
    993     return TI_OK;
    994 }
    995 
    996