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