• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
TWD_PrintMemRegsCB(TI_HANDLE hTWD,TI_UINT32 cmdCbStatus)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 
TWD_PrintMemRegs(TI_HANDLE hTWD,TI_UINT32 address,TI_UINT32 len,readWrite_MemoryType_e memType)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 
TWD_PrintMemoryMapCb(TI_HANDLE hTWD,TI_STATUS status,void * pData)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  ****************************************************************************/
TWD_PrintMemoryMap(TI_HANDLE hTWD)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  ****************************************************************************/
TWD_StatisticsReadCB(TI_HANDLE hTWD,TI_UINT16 MboxStatus,ACXStatistics_t * pElem)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 
TWD_Debug(TI_HANDLE hTWD,TI_UINT32 funcType,void * pParam)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