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 ****************************************************************************/
66 int whal_tracePrintLine(WhalTrace_T *pTrc, int EventIndex);
67
local_string_copy(char * str1,char * str2,int size)68 void 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 ****************************************************************************/
whal_traceCreate(TI_HANDLE hOs)89 WhalTrace_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 ****************************************************************************/
whal_traceDestroy(WhalTrace_T * pTrc)122 int 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 ****************************************************************************/
whal_traceConfig(WhalTrace_T * pTrc,TI_HANDLE hTNETWIF,TI_HANDLE hReport)146 int 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
whal_traceAddTx(WhalTrace_T * pTrc,HwTxDesc_T * pHwTxDesc,char * Action)174 int 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 ****************************************************************************/
whal_traceIsEnable(WhalTrace_T * pTrc)259 int 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 ****************************************************************************/
whal_traceEnable(WhalTrace_T * pTrc,int val)275 void 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