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 */
51typedef 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 */
111TWD_PRINT_FW_EVENT_INFO,
112TWD_PRINT_TW_IF_INFO,
113TWD_PRINT_MBOX_INFO,
114TWD_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*/
122typedef enum
123{
124   TNETW_INTERNAL_RAM,
125   TNETW_MAC_REGISTERS,
126   TNETW_PHY_REGISTERS
127
128} readWrite_MemoryType_e;
129
130static 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
172static 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
213static 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 ****************************************************************************/
253static 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 ****************************************************************************/
272static 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
623TI_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