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 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 ****************************************************************************/ 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 ****************************************************************************/ 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 ****************************************************************************/ 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 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 ****************************************************************************/ 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 ****************************************************************************/ 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