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/****************************************************************************
37 *
38 *   MODULE:  whalTrace.c
39 *   PURPOSE: Trace on Rx/Tx packets
40 *
41 ****************************************************************************/
42
43#include "whalCommon.h"
44#include "TNETWIF.h"
45#include "whalTrace.h"
46
47
48#define SEQUNCE_TRACE
49
50#define TRACE_INTERRUPT		0x0001	/* Trace the recieved interupt only */
51#define TRACE_TX			0x0002	/* Trace all Tx path (os ->>core ->> hal) */
52#define TRACE_RX			0x0004	/* Trace all Rx path (hal ->> core ->> os) */
53#define TRACE_COPY_ONLY		0x0008	/* Trace the copy of data from and to the FW only  - for slave mode*/
54#define TRACE_BUG_ONLY		0x0010	/* Trace the ctrls that only presents an unexpected case*/
55#define TRACE_All			0xffff	/* Trace all. */
56
57
58
59/****************************************************************************
60 *                      OBJECT DATA BASE
61 ****************************************************************************
62 *
63 *	TrcDb - Rx Trace buffer of 5000 packets
64 *
65 ****************************************************************************/
66int whal_tracePrintLine(WhalTrace_T *pTrc, int EventIndex);
67
68void local_string_copy(char *str1, char *str2, int size)
69{
70	int i;
71	for (i=0; i<size; i++)
72	{
73		str1[i] = str2[i];
74		if (str2[i] == 0)
75			break;
76	}
77}
78/****************************************************************************
79 *                      whal_traceCreate()
80 ****************************************************************************
81 * DESCRIPTION:	Create the whal trace object
82 *
83 * INPUTS:
84 *
85 * OUTPUT:	None
86 *
87 * RETURNS:	The Created object
88 ****************************************************************************/
89WhalTrace_T *whal_traceCreate(TI_HANDLE hOs)
90{
91	WhalTrace_T *pObj;
92
93	pObj = os_memoryAlloc(hOs, sizeof(WhalTrace_T));
94	if (pObj == NULL)
95		return NULL;
96
97	os_memoryZero(hOs, pObj, sizeof(WhalTrace_T));
98
99	pObj->hOs = hOs;
100	pObj->hProtect = os_protectCreate(pObj->hOs);
101	if (pObj->hProtect == NULL)
102	{
103		whal_traceDestroy(pObj);
104		return NULL;
105	}
106
107	return(pObj);
108}
109
110/****************************************************************************
111 *                      whal_traceDestroy()
112 ****************************************************************************
113 * DESCRIPTION:	Destroy the object
114 *
115 * INPUTS:
116 *		pTrc		The object to free
117 *
118 * OUTPUT:	None
119 *
120 * RETURNS:	OK or NOK
121 ****************************************************************************/
122int whal_traceDestroy(WhalTrace_T *pTrc)
123{
124	if (pTrc == NULL)
125		return OK;
126
127	if (pTrc->hProtect)
128		os_protectDestroy(pTrc->hOs, pTrc->hProtect);
129	os_memoryFree(pTrc->hOs, pTrc, sizeof(WhalTrace_T));
130	return OK;
131}
132
133/****************************************************************************
134 *                      whal_traceConfig()
135 ****************************************************************************
136 * DESCRIPTION:	Config the object
137 *
138 * INPUTS:
139 *		pTrc		The object
140 *		hReport		The reports objects
141 *
142 * OUTPUT:	None
143 *
144 * RETURNS:	OK or NOK
145 ****************************************************************************/
146int whal_traceConfig(WhalTrace_T *pTrc, TI_HANDLE hTNETWIF, TI_HANDLE hReport)
147{
148	pTrc->hReport = hReport;
149	pTrc->hTNETWIF = hTNETWIF;
150	pTrc->Enable = 0; /*Hardcoded*/
151	pTrc->Idx = 0;
152	pTrc->Num = 0;
153	pTrc->MaxFreeBlks = 0;
154
155	/* configured the trace mask flag */
156	pTrc->traceMask = TRACE_BUG_ONLY;
157	return OK;
158}
159
160/****************************************************************************
161 *                      whal_traceAddTx()
162 ****************************************************************************
163 * DESCRIPTION:	Add Tx info line to the DB
164 *
165 * INPUTS:
166 *
167 * OUTPUT:	None
168 *
169 * RETURNS:	OK or NOK
170 ****************************************************************************/
171
172#ifdef TNETW_MASTER_MODE
173
174int whal_traceAddTx(WhalTrace_T *pTrc, HwTxDesc_T *pHwTxDesc, char *Action)
175{
176	TRACER_EVENT *pEvt;
177	UINT32 FrameAddress;
178	DbTescriptor local_TxDesc;
179	TRACER_DATA	*pData;
180
181#ifdef SEQUNCE_TRACE
182	return 1;
183#endif
184	/* Dm: os_protectLock(pTrc->hOs, pTrc->hProtect); */
185
186	pEvt = &pTrc->Evt[pTrc->Idx];
187	pData = &pEvt->Info.TrcData;
188
189	/*
190	 * Common
191	 */
192	local_string_copy(pEvt->Action, Action, TRACER_MAX_ACT_LEN-1);
193	local_string_copy(pEvt->Object, "Tx", TRACER_MAX_OBJ_LEN-1);
194
195    pEvt->TimStamp = os_timeStampUs(pTrc->hOs);
196
197	/*
198	 * Data
199	 */
200	whal_hwTxDesc_Copy(pHwTxDesc, &local_TxDesc);
201
202	pData->MpduLen	= local_TxDesc.length;
203	pData->Ctl		= local_TxDesc.ctl;
204	pData->Rate		= (UINT16)local_TxDesc.rate;
205
206    pData->Status[0] = 0;
207	pData->Status[1] = 0;
208	pData->Status[3] = 0;
209
210    /*
211	pData->Status[0] = local_TxDesc.ctrl2;
212	pData->Status[1] = local_TxDesc.ackFailures;
213	pData->Status[3] = local_TxDesc.rtsFailures;
214    */
215
216	FrameAddress = 4+whal_hwTxDesc_GetAcxBufAddr(pHwTxDesc);
217	TNETWIF_ReadMemSync(pTrc->hTNETWIF,
218						(UINT32)((char *)FrameAddress),
219						(UINT8 *)((char *)&pData->FrameHeader),
220						  TRACER_HDR_LEN);
221
222	pData->FrameHeader.fc = ENDIAN_HANDLE_WORD(pData->FrameHeader.fc);
223	pData->FrameHeader.seqCtrl = ENDIAN_HANDLE_WORD(pData->FrameHeader.seqCtrl);
224	pData->FrameHeader.duration = ENDIAN_HANDLE_WORD(pData->FrameHeader.duration);
225	TNETWIF_ReadMemSync(pTrc->hTNETWIF,
226						(UINT32)((char *)FrameAddress+TRACER_HDR_LEN),
227						(UINT8 *)((char *)&pData->FrameData),
228						  4);
229
230
231	/*
232	 * Prepare next index
233	 */
234	if (++pTrc->Idx >= TRACER_MAX_EVENTS)
235		pTrc->Idx = 0;
236
237	if (pTrc->Num < TRACER_MAX_EVENTS)
238		pTrc->Num++;
239
240	/* Dm: os_protectUnlock(pTrc->hOs, pTrc->hProtect); */
241
242	return(0);
243}
244
245#endif  /* TNETW_MASTER_MODE */
246
247
248/****************************************************************************
249 *                      whal_traceIsEnable()
250 ****************************************************************************
251 * DESCRIPTION:	return the enable value
252 *
253 * INPUTS:	None
254 *
255 * OUTPUT:	None
256 *
257 * RETURNS:	Enable value
258 ****************************************************************************/
259int whal_traceIsEnable(WhalTrace_T *pTrc)
260{
261	return pTrc->Enable;
262}
263
264/****************************************************************************
265 *                      whal_traceEnable()
266 ****************************************************************************
267 * DESCRIPTION:	enable the tracing
268 *
269 * INPUTS:	None
270 *
271 * OUTPUT:	None
272 *
273 * RETURNS:	None
274 ****************************************************************************/
275void whal_traceEnable(WhalTrace_T *pTrc, int val)
276{
277	pTrc->Enable = val;
278
279	if(val == 1) /* Enable case*/
280	{
281		pTrc->MinNumDescriptorFree = 0xff;
282		pTrc->MacOccupiedDescriptor = 0;
283		pTrc->MaxClearDescriptor = 0;
284		pTrc->BugCounter = 0;
285		pTrc->reBug = 0;
286		pTrc->MaxFreeBlks = 0;
287	}
288
289
290}
291
292
293
294