1 /****************************************************************************
2 **+-----------------------------------------------------------------------+**
3 **| |**
4 **| Copyright(c) 1998 - 2008 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 ****************************************************************************/
35
36 #ifdef TI_DBG
37
38 #include "FwEvent_api.h"
39 #include "whalParams.h"
40 #include "DebugTraceXfer_api.h"
41 #include "report.h"
42 #include "whalBus_Defs.h"
43 #include "TNETWIF.h"
44 #include "utils.h"
45 #if !defined(GWSI_DRIVER) && !defined(GWSI_LIB)
46 #include "memMngrEx.h"
47 #endif
48 #include "whalCommon.h"
49
50
51
52 /*****************************************************************************
53 ** UDP Packet Build **
54 *****************************************************************************/
55 #define Ether_Type 0x0800 /* For IP Protocol */
56
57 /* This is an Ethernet Version 2 frame: 14 Byte */
58 typedef struct {
59 UINT8 ether_dst[6];
60 UINT8 ether_src[6];
61 UINT16 ether_Type;
62 } etherHeader;
63
64
65 #define IP_Version 0x45 /* IP Ver - 4 Length Of IP Header 5 UINT32 (20 Byte) */
66 #define IP_TimeToLive 128 /* limit the number of Router Hops */
67 #define IP_Protocol 0x11 /* UDP protocol */
68
69 /* This is an IP frame: 20 Byte */
70 typedef struct
71 {
72 UINT8 IpVer;
73 UINT8 TypeOfService;
74 UINT16 Totallen;
75 UINT16 Indentification;
76 UINT16 FragOffset;
77 UINT8 TimeToLive;
78 UINT8 protocol;
79 UINT16 csum;
80 UINT8 src[4];
81 UINT8 dst[4];
82 } ipstruct;
83
84 #define Source_Port 0
85 #define Destination_Port 5555
86
87 /* This is a UDP frame: 8 Byte */
88 typedef struct {
89 UINT16 src_port;
90 UINT16 dst_port;
91 UINT16 UDP_len;
92 UINT16 UDP_Csum;
93 } UDPStruct;
94
95 /* This is a Trace Frame:*/
96 #pragma pack(1)
97 typedef struct {
98 etherHeader Ether_Header;
99 ipstruct IP_Header;
100 UDPStruct UDP_Header;
101 } TraceFrame;
102 #pragma pack()
103
104 /*****************************************************************************
105 ** Structures **
106 *****************************************************************************/
107 typedef enum
108 {
109 DEBUG_TRACE_STATE_IDLE,
110 DEBUG_TRACE_STATE_READ_BUF,
111 DEBUG_TRACE_STATE_ACK_EVENT
112 } debugTraceState_e;
113 /*
114 * DebugTraceXfer: The Debug Trace Object
115 */
116 typedef struct
117 {
118 TraceFrame FrameHeader; /* Do Not Change Place */
119
120 /* use a struct to read buffers from the bus - used for extra bytes reserving */
121 PADDING (UINT32 debugWords[TRACE_BUFFER_MAX_SIZE * 2]) /* *2 for the 2 buffers */
122
123 BOOL bDoPrint;
124 BOOL bUdpSend;
125 BOOL bSync; /* indicate if we are in Synch bus or not */
126
127 UINT32 TraceBufferSize;
128
129 UINT32 BufferOffset[2]; /* holds the offset of Buffer A and Buffer B */
130 UINT8 currBuffer; /* switch between 0 and 1 according to the buffer used */
131
132 debugTraceState_e state;
133 TI_STATUS returnValue;
134
135 TI_HANDLE hOs;
136 TI_HANDLE hReport;
137 TI_HANDLE hFwEvent;
138 TI_HANDLE hMemMgr;
139 TI_HANDLE hTNETWIF;
140 } DebugTrace_t;
141
142 /****************************************************************************
143 * static function declaration
144 ****************************************************************************/
145 #if !defined(GWSI_DRIVER) && !defined(GWSI_LIB)
146 static void debugTrace_BuildFrame(DebugTrace_t *pDebugTrace, UINT8* MacAddress);
147 #endif
148 static void debugTrace_StateMachine(TI_HANDLE hDebugTrace,UINT8 module_id ,TI_STATUS status);
149
150 /****************************************************************************
151 * debugTrace_Create()
152 *****************************************************************************
153 * DESCRIPTION: Create
154 *
155 * INPUTS:
156 *
157 * RETURNS:
158 *
159 *****************************************************************************/
debugTrace_Create(TI_HANDLE hOs)160 TI_HANDLE debugTrace_Create(TI_HANDLE hOs)
161 {
162 DebugTrace_t *pDebugTrace;
163
164 pDebugTrace = os_memoryAlloc(hOs, sizeof(DebugTrace_t));
165 if (pDebugTrace == NULL)
166 {
167 WLAN_OS_REPORT(("debugTrace_Create: Error Creating Trace Buffer \n"));
168 return NULL;
169 }
170
171 os_memoryZero(hOs, pDebugTrace, sizeof(DebugTrace_t));
172
173 pDebugTrace->hOs = hOs;
174
175 return((TI_HANDLE)pDebugTrace);
176 }
177
178 /****************************************************************************
179 * debugTrace_Destroy()
180 *****************************************************************************
181 * DESCRIPTION: Destroy
182 *
183 * INPUTS:
184 *
185 * RETURNS:
186 *
187 *****************************************************************************/
debugTrace_Destroy(TI_HANDLE hDebugTrace)188 void debugTrace_Destroy(TI_HANDLE hDebugTrace)
189 {
190 DebugTrace_t *pDebugTrace = (DebugTrace_t *)hDebugTrace;
191
192 if (pDebugTrace)
193 {
194 os_memoryFree(pDebugTrace->hOs, pDebugTrace, sizeof(DebugTrace_t));
195 }
196 }
197
198 /****************************************************************************
199 * debugTrace_Config()
200 *****************************************************************************
201 * DESCRIPTION: Config
202 *
203 * INPUTS:
204 *
205 * RETURNS:
206 *
207 *****************************************************************************/
debugTrace_Config(TI_HANDLE hDebugTrace,TI_HANDLE hWhalParams,TI_HANDLE hReport,TI_HANDLE hMemMgr,TI_HANDLE hTNETWIF,TI_HANDLE hFwEvent)208 void debugTrace_Config(TI_HANDLE hDebugTrace, TI_HANDLE hWhalParams, TI_HANDLE hReport,
209 TI_HANDLE hMemMgr, TI_HANDLE hTNETWIF, TI_HANDLE hFwEvent)
210 {
211 DebugTrace_t *pDebugTrace = (DebugTrace_t *)hDebugTrace;
212
213 pDebugTrace->hReport = hReport;
214 pDebugTrace->hMemMgr = hMemMgr;
215 pDebugTrace->hTNETWIF = hTNETWIF;
216 pDebugTrace->hFwEvent = hFwEvent;
217
218 /* next 2 parameters are TRUE & FALSE by default but can be changed in run time */
219 pDebugTrace->bUdpSend = FALSE;
220 pDebugTrace->bDoPrint = TRUE;
221 pDebugTrace->TraceBufferSize = whal_ParamsGetTraceBufferSize(hWhalParams);
222 pDebugTrace->currBuffer = 0;
223
224 #if !defined(GWSI_DRIVER) && !defined(GWSI_LIB)
225 /* Build Frame to be send to the OS */
226 debugTrace_BuildFrame(pDebugTrace, whal_ParamsGetSrcMac(hWhalParams));
227 #endif
228
229 /* Enable Trace Interrupts - actual interrupts will be raised only after init phase */
230 FwEvent_Enable(pDebugTrace->hFwEvent, ACX_INTR_TRACE_A);
231 FwEvent_Enable(pDebugTrace->hFwEvent, ACX_INTR_TRACE_B);
232 }
233
234 /****************************************************************************
235 * debugTrace_ConfigHw()
236 *****************************************************************************
237 * DESCRIPTION: Initialize the address to read the buffer from the FW
238 *
239 * INPUTS: hDebugTrace - Debug Trace object
240 *
241 * RETURNS:
242 *
243 *****************************************************************************/
debugTrace_ConfigHw(TI_HANDLE hDebugTrace,UINT32 TraceAddA,UINT32 TraceAddB)244 void debugTrace_ConfigHw(TI_HANDLE hDebugTrace,UINT32 TraceAddA, UINT32 TraceAddB)
245 {
246 DebugTrace_t *pDebugTrace = (DebugTrace_t *)hDebugTrace;
247
248 pDebugTrace->BufferOffset[0] = TraceAddA;
249 pDebugTrace->BufferOffset[1] = TraceAddB;
250
251 WLAN_REPORT_INIT(pDebugTrace->hReport, HAL_HW_CTRL_MODULE_LOG,
252 ("debugTrace_ConfigHw: Buffer A offSet =0x%x, Buffer B offSet =0x%x, TraceBufferSize = %d \n"
253 ,pDebugTrace->BufferOffset[0], pDebugTrace->BufferOffset[1],pDebugTrace->TraceBufferSize));
254
255 }
256
257 /****************************************************************************
258 * debugTrace_Event()
259 *****************************************************************************
260 * DESCRIPTION: Called upon an interrupt of debug trace kind.
261 *
262 * INPUTS: hDebugTrace - Debug Trace object
263 *
264 * RETURNS:
265 *
266 *****************************************************************************/
debugTrace_Event(TI_HANDLE hDebugTrace)267 TI_STATUS debugTrace_Event(TI_HANDLE hDebugTrace)
268 {
269 DebugTrace_t *pDebugTrace = (DebugTrace_t *)hDebugTrace;
270
271 WLAN_REPORT_INFORMATION(pDebugTrace->hReport, HAL_HW_CTRL_MODULE_LOG,
272 (" debugTrace_Event: Reading from Buffer %d \n",pDebugTrace->currBuffer));
273
274 /* assume that we are in synch bus until otherwise is proven */
275 pDebugTrace->bSync = TRUE;
276
277 debugTrace_StateMachine(pDebugTrace,0,(TI_STATUS)0);
278
279 return pDebugTrace->returnValue;
280 }
281
282
283 /****************************************************************************
284 * debugTrace_StateMachine()
285 ****************************************************************************
286 * DESCRIPTION: Manage the Debug trace state machine
287 *
288 * The SM is running one event at a time (buffer A or B) .
289 * The order of the states is always the same: IDLE --> READ_BUF --> ACK_EVENT
290 * The difference is whether we are using Synch or Asynch API.
291 * In the Synch case (SDIO) we are looping in the while-loop till we return to IDLE, and we return
292 * to FwEvent module a TNETWIF_OK status.
293 * In the Asynch case we use the SM CB to return to the SM after each Asynch call
294 * (In that case the return status is TNETWIF_PENDING, and we are waiting for the CB).
295 * In the Asynch case the FwEvent module gets TNETWIF_PENDING in return, and waits for
296 * the FwEvent_EventComplete() call in order to move the FwEvent SM.
297 *
298 * INPUTS: hFwEvent - The object
299 * module_id - not used (for CB API only)
300 * status - not used (for CB API only)
301 *
302 * OUTPUT: None
303 *
304 * RETURNS: TNETWIF_PENDING in case of Async and TNETWIF_OK on Sync
305 ****************************************************************************/
debugTrace_StateMachine(TI_HANDLE hDebugTrace,UINT8 module_id,TI_STATUS status)306 static void debugTrace_StateMachine(TI_HANDLE hDebugTrace,UINT8 module_id ,TI_STATUS status)
307 {
308 DebugTrace_t *pDebugTrace = (DebugTrace_t *)hDebugTrace;
309
310 pDebugTrace->returnValue = OK;
311
312 while(pDebugTrace->returnValue != TNETWIF_PENDING)
313 {
314 switch(pDebugTrace->state)
315 {
316 case DEBUG_TRACE_STATE_IDLE:
317
318 pDebugTrace->returnValue = TNETWIF_ReadMemOpt (pDebugTrace->hTNETWIF,
319 pDebugTrace->BufferOffset[pDebugTrace->currBuffer],
320 PADREAD (pDebugTrace->debugWords),
321 pDebugTrace->TraceBufferSize,
322 FW_EVENT_MODULE_ID,
323 debugTrace_StateMachine,
324 pDebugTrace);
325
326 pDebugTrace->state = DEBUG_TRACE_STATE_READ_BUF;
327
328 break;
329
330 case DEBUG_TRACE_STATE_READ_BUF:
331 /* Now, handle the buffer */
332 /* Print on every Trace */
333 if(pDebugTrace->bDoPrint)
334 {
335 debugTrace_Print(pDebugTrace);
336 }
337
338 #if !defined(GWSI_DRIVER) && !defined(GWSI_LIB)
339 /* Handle The Trace */
340 if(pDebugTrace->bUdpSend)
341 {
342 debugTrace_handleBuffer(hDebugTrace);
343 }
344 #endif
345
346 /*Trigger the FW when finishing handle the event */
347 pDebugTrace->returnValue = TNETWIF_WriteRegOpt(pDebugTrace->hTNETWIF, ACX_REG_INTERRUPT_TRIG, INTR_TRIG_DEBUG_ACK,
348 FW_EVENT_MODULE_ID,debugTrace_StateMachine,pDebugTrace);
349
350 pDebugTrace->state = DEBUG_TRACE_STATE_ACK_EVENT;
351
352 break;
353
354 case DEBUG_TRACE_STATE_ACK_EVENT:
355
356 /* Handling of the event is done. Now switch to the next buffer for the next time */
357 pDebugTrace->currBuffer = (++pDebugTrace->currBuffer) & 0x1; /* &0x1 is %2 */
358
359 if (FALSE == pDebugTrace->bSync )
360 {
361 /* Async bus - call FwEvent for notifying the completion */
362 FwEvent_EventComplete(pDebugTrace->hFwEvent, TNETWIF_OK);
363 }
364 else /* This is the Sync case and we return TNETWIF_OK */
365 {
366 pDebugTrace->returnValue = TNETWIF_OK;
367 }
368 /* Exit SM */
369 pDebugTrace->state = DEBUG_TRACE_STATE_IDLE;
370 return;
371
372 /* break; */
373
374 default:
375 WLAN_REPORT_ERROR(pDebugTrace->hReport, HAL_HW_CTRL_MODULE_LOG,
376 ("debugTrace_StateMachine: unKnown state !!!\n"));
377
378 break;
379 }
380 }
381 /* if we are here - we got TNETWIF_PENDING, so we are in Async mode */
382 pDebugTrace->bSync = FALSE;
383
384 if (pDebugTrace->returnValue == TNETWIF_ERROR)
385 {
386 WLAN_REPORT_ERROR(pDebugTrace->hReport, HAL_HW_CTRL_MODULE_LOG,
387 ("debugTrace_StateMachine: rc = TNETWIF_ERROR in state %d \n",pDebugTrace->state));
388 }
389 }
390
391 /****************************************************************************
392 * debugTrace_Disable()
393 *****************************************************************************
394 * DESCRIPTION: disable receiving interrupts of this kind (debug trace)
395 *
396 * INPUTS: hDebugTrace - Debug Trace object
397 *
398 * RETURNS:
399 *
400 *****************************************************************************/
debugTrace_Disable(TI_HANDLE hDebugTrace)401 void debugTrace_Disable(TI_HANDLE hDebugTrace)
402 {
403 DebugTrace_t *pDebugTrace = (DebugTrace_t *)hDebugTrace;
404
405 FwEvent_Disable(pDebugTrace->hFwEvent, ACX_INTR_TRACE_A);
406 FwEvent_Disable(pDebugTrace->hFwEvent, ACX_INTR_TRACE_B);
407
408 WLAN_REPORT_INFORMATION(pDebugTrace->hReport, HAL_HW_CTRL_MODULE_LOG,
409 ("whal_DebugTrace_t_Disable: Trace Disable \n"));
410
411 }
412
413 /****************************************************************************
414 * debugTrace_Enable()
415 *****************************************************************************
416 * DESCRIPTION: Enables receiving interrupts of this kind (debug trace)
417 *
418 * INPUTS: hDebugTrace - Debug Trace object
419 *
420 * RETURNS:
421 *
422 *****************************************************************************/
debugTrace_Enable(TI_HANDLE hDebugTrace)423 void debugTrace_Enable(TI_HANDLE hDebugTrace)
424 {
425 DebugTrace_t *pDebugTrace = (DebugTrace_t *)hDebugTrace;
426
427 FwEvent_Enable(pDebugTrace->hFwEvent, ACX_INTR_TRACE_A);
428 FwEvent_Enable(pDebugTrace->hFwEvent, ACX_INTR_TRACE_B);
429
430 WLAN_REPORT_INFORMATION(pDebugTrace->hReport, HAL_CTRL_MODULE_LOG,
431 ("whal_DebugTrace_tEnable: Trace Enable \n"));
432 }
433
434 /****************************************************************************
435 * debugTrace_Print()
436 *****************************************************************************
437 * DESCRIPTION: Print the current buffer
438 *
439 * INPUTS: hDebugTrace - Debug Trace object
440 *
441 * RETURNS:
442 *
443 *****************************************************************************/
debugTrace_Print(TI_HANDLE hDebugTrace)444 void debugTrace_Print(TI_HANDLE hDebugTrace)
445 {
446 DebugTrace_t *pDebugTrace = (DebugTrace_t *)hDebugTrace;
447
448 UINT32 index;
449
450 WLAN_OS_REPORT(("Trace buffer size = %d\n",pDebugTrace->TraceBufferSize));
451
452 for(index = 0; index < pDebugTrace->TraceBufferSize / 4 ; index+=2)
453 {
454 WLAN_OS_REPORT(("0x%08X 0x%08X\n",
455 pDebugTrace->debugWords[index],
456 pDebugTrace->debugWords[index+1]));
457 }
458 }
459
460 /****************************************************************************
461 * debugTrace_EnablePrint()
462 *****************************************************************************
463 * DESCRIPTION: enable printing on each interrupt
464 *
465 * INPUTS: hDebugTrace - Debug Trace object
466 *
467 * RETURNS:
468 *
469 *****************************************************************************/
debugTrace_EnablePrint(TI_HANDLE hDebugTrace)470 void debugTrace_EnablePrint(TI_HANDLE hDebugTrace)
471 {
472 DebugTrace_t *pDebugTrace = (DebugTrace_t *)hDebugTrace;
473
474 pDebugTrace->bDoPrint = TRUE;
475
476 WLAN_OS_REPORT(("whal_DebugTrace_t_EnablePrint: Print Enabled \n"));
477
478 }
479
480 /****************************************************************************
481 * debugTrace_DisablePrint()
482 *****************************************************************************
483 * DESCRIPTION: disable printing on each interrupt
484 *
485 * INPUTS: hDebugTrace - Debug Trace object
486 *
487 * RETURNS:
488 *
489 *****************************************************************************/
debugTrace_DisablePrint(TI_HANDLE hDebugTrace)490 void debugTrace_DisablePrint(TI_HANDLE hDebugTrace)
491 {
492 DebugTrace_t *pDebugTrace = (DebugTrace_t *)hDebugTrace;
493
494 pDebugTrace->bDoPrint = FALSE;
495
496 WLAN_OS_REPORT(("whal_DebugTrace_t_DisablePrint: Print Disabled \n"));
497
498 }
499
500 /****************************************************************************
501 * debugTrace_UdpEnable()
502 *****************************************************************************
503 * DESCRIPTION: enable sending udp on each interrupt
504 *
505 * INPUTS: hDebugTrace - Debug Trace object
506 *
507 * RETURNS:
508 *
509 *****************************************************************************/
debugTrace_UdpEnable(TI_HANDLE hDebugTrace)510 void debugTrace_UdpEnable(TI_HANDLE hDebugTrace)
511 {
512 DebugTrace_t *pDebugTrace = (DebugTrace_t *)hDebugTrace;
513
514 pDebugTrace->bUdpSend = TRUE;
515
516 WLAN_OS_REPORT(("whal_DebugTrace_t_UdpEnable: Enable UDP trace send\n"));
517 }
518
519 /****************************************************************************
520 * debugTrace_UdpDisable()
521 *****************************************************************************
522 * DESCRIPTION: disable sending udp on each interrupt
523 *
524 * INPUTS: hDebugTrace - Debug Trace object
525 *
526 * RETURNS:
527 *
528 *****************************************************************************/
debugTrace_UdpDisable(TI_HANDLE hDebugTrace)529 void debugTrace_UdpDisable(TI_HANDLE hDebugTrace)
530 {
531 DebugTrace_t *pDebugTrace = (DebugTrace_t *)hDebugTrace;
532
533 pDebugTrace->bUdpSend = FALSE;
534
535 WLAN_OS_REPORT(("whal_DebugTrace_t_UdpEnable: Disable UDP trace send\n"));
536
537 }
538
539 #if !defined(GWSI_DRIVER) && !defined(GWSI_LIB)
540 /****************************************************************************
541 * debugTrace_handleBuffer()
542 *****************************************************************************
543 * DESCRIPTION:
544 *
545 * INPUTS: hDebugTrace - Debug Trace object
546 *
547 * RETURNS:
548 *
549 *****************************************************************************/
debugTrace_handleBuffer(TI_HANDLE hDebugTrace)550 void debugTrace_handleBuffer(TI_HANDLE hDebugTrace)
551 {
552 DebugTrace_t *pDebugTrace = (DebugTrace_t *)hDebugTrace;
553 mem_MSDU_T *pMsdu;
554 mem_BD_T *pBd;
555 UINT8 *srcDataPtr;
556 int Stt;
557 int AcxMpduLen;
558
559 /* The Msdu Len should be The IP total Length + the Ethernet header length */
560 AcxMpduLen = wlan_ntohs(pDebugTrace->FrameHeader.IP_Header.Totallen)
561 + sizeof(pDebugTrace->FrameHeader.Ether_Header);
562
563 /*
564 * allocate host msdu
565 */
566 Stt = wlan_memMngrAllocMSDU(pDebugTrace->hMemMgr, &pMsdu, AcxMpduLen, TRACE_BUFFER_MODULE);
567 if (Stt != OK)
568 {
569 WLAN_REPORT_ERROR(pDebugTrace->hReport, HAL_HW_DATA_MODULE_LOG,
570 ("whal_DebugTrace_t_handleBuffer: wlan_memMngrAllocMSDU error\n"));
571 return ;
572 }
573
574 /* set the lastBDPtr */
575 pBd = pMsdu->firstBDPtr;
576 while (pBd->nextBDPtr != NULL)
577 pBd = pBd->nextBDPtr;
578
579 pMsdu->lastBDPtr = pBd;
580
581 /* Get the Address of the Data filed in the Msdu */
582 srcDataPtr = (UINT8 *)memMgr_MsduHdrAddr(pMsdu);
583
584 /* Copy the Frame Header */
585 os_memoryCopy(pDebugTrace->hOs, srcDataPtr, &pDebugTrace->FrameHeader, sizeof(pDebugTrace->FrameHeader));
586
587 /* Copy the Trace Data */
588 os_memoryCopy(pDebugTrace->hOs, srcDataPtr + sizeof(pDebugTrace->FrameHeader), pDebugTrace->debugWords, pDebugTrace->TraceBufferSize);
589
590 memMgr_BufLength(pMsdu->firstBDPtr) = AcxMpduLen;
591
592 pMsdu->dataLen = AcxMpduLen;
593
594 /* send the packet to the OS */
595 os_receivePacket(pDebugTrace->hOs, pMsdu, (UINT16)pMsdu->dataLen);
596 }
597
598 /****************************************************************************
599 * debugTrace_BuildFrame()
600 *****************************************************************************
601 * DESCRIPTION: Build the Trace Frame to be send to the OS
602 *
603 * INPUTS: pDebugTrace - Debug Trace object
604 * MacAddress - for the Ethernet Header
605 * RETURNS:
606 *
607 *****************************************************************************/
debugTrace_BuildFrame(DebugTrace_t * pDebugTrace,UINT8 * MacAddress)608 static void debugTrace_BuildFrame(DebugTrace_t *pDebugTrace, UINT8* MacAddress)
609 {
610 TraceFrame *Frame = &pDebugTrace->FrameHeader;
611 UINT32 i;
612 UINT16 local_csum = 0;
613 UINT16 *pShortData = (UINT16 *)&Frame->IP_Header;
614
615 /*
616 * Calculate each Frame Length
617 */
618 /* UDP length should Be !024 of Trace Buffet Size + 8 Byte of UDP header 1032) */
619 Frame->UDP_Header.UDP_len = wlan_htons(pDebugTrace->TraceBufferSize + sizeof(Frame->UDP_Header));
620
621 /* IP length should Be UDP length + IP header */
622 Frame->IP_Header.Totallen = wlan_htons(wlan_htons(Frame->UDP_Header.UDP_len) + sizeof(Frame->IP_Header));
623
624 /*
625 * initialize the Ethernet Header
626 */
627 os_memoryCopy(pDebugTrace->hOs, (UINT8 *)Frame->Ether_Header.ether_dst,
628 MacAddress, 6);
629
630 Frame->Ether_Header.ether_Type = wlan_htons (Ether_Type);
631
632 /*
633 * initialize the IP Header
634 */
635 Frame->IP_Header.IpVer = IP_Version;
636
637 Frame->IP_Header.TimeToLive = IP_TimeToLive;
638
639 Frame->IP_Header.protocol = IP_Protocol;
640
641 /* Set the Local host IP */
642 Frame->IP_Header.dst[0] = Frame->IP_Header.src[0] = 127;
643 Frame->IP_Header.dst[1] = Frame->IP_Header.src[1] = 0 ;
644 Frame->IP_Header.dst[2] = Frame->IP_Header.src[2] = 0;
645 Frame->IP_Header.dst[3] = Frame->IP_Header.src[3] = 1;
646
647 /* calculate check sum on words of 16 bits */
648 for (i=0; i<sizeof(Frame->IP_Header)/2; i++)
649 local_csum += pShortData[i];
650
651 Frame->IP_Header.csum = 0xFFFF - local_csum;
652
653 /*
654 * initialize the UDP Header
655 */
656 Frame->UDP_Header.src_port = wlan_htons( Source_Port );
657 Frame->UDP_Header.dst_port = wlan_htons( Destination_Port );
658 }
659 #endif /* !defined(GWSI_DRIVER) && !defined(GWSI_LIB) */
660
661 #endif /* TI_DBG */
662
663