/* NT IBM SDLC Adapter Device Driver: Tracing */ typedef UCHAR TRC_NAME[2]; typedef USHORT TRC_WORD; typedef ULONG DWORD; #ifdef XDEBUG /* extra debugging? */ #define XASSERT(c) ASSERT(c) #else #define XASSERT(c) #endif #define assert ASSERT /* when I say assert, i mean ASSERT! */ /*****************************************************************************/ /* Tracing */ /* */ /* TRACE_OBJECT depends on the objects having a TRC_NAME. */ /* The registered code then is FfOo - 2 chars of function, 2 giving the name */ /* of the object. */ /* */ /* Every trace entry is 4 bytes. Wraparound is only checked when putting in */ /* the start of an entry. If the implementation of TRACE_OBJECT/EVENT as it */ /* stands now is too slow, we can define TRACE_EVENT_WORD(c1,c2,c3,c4) */ /* as (c1<<24)+(c2<<16) etc. and use those values directly */ /*****************************************************************************/ #ifdef IBMSYNC_TRACE #define TRC_ENTRIES 1024 /* entry count*/ #define TRC_ESIZ 4 /* entry size */ #define TRC_BUFSIZE (TRC_ENTRIES*TRC_ESIZ) #define TRC_BUFOVERRUN 4 /* see TRC_WRAPCHECK below */ #define TrcPtr2Far (TrcBuffer+sizeof(TrcBuffer) - 16) /* leave 16 bytes spare @ end to */ /* catch any overflow situations! */ #define DEBUG_PRINT(string) DbgPrint string #define TRACE_INIT() { TrcPtr = TrcBuffer; \ memset (TrcBuffer, 0, sizeof(TrcBuffer)); \ } /* WRAPCHECK's ASSERTion: we may have this sequence - check on non-interrupt side for wrap-check - get interrupt - check on interrupt side for wrap-check - now both sides feel free to increment - so can overrun TrcPtr by 4 - but this should go no further - hence check on BUFOVERRUN=4 */ #define TRC_WRAPCHECK() if (TrcPtr >= TrcPtr2Far) \ { \ ASSERT(TrcPtr<=(TrcPtr2Far+TRC_BUFOVERRUN)); \ /* mustn't go past end! */ \ TrcPtr = TrcBuffer; \ } #define TRC_IN_CHAR(c) *(TrcPtr++) = ((UCHAR) c) #define TRC_RE_SET(c) *(TrcPtr-1) = ((UCHAR) c) #define TRC_IN_WORD(wval) *(CAST(TrcPtr,TRC_WORD *)++) = CAST(wval,TRC_WORD) #define TRC_IN_DW(dval) *(((DWORD *)TrcPtr)++) = ((DWORD ) (dval)) #define TRC_IN_PWORD(wp) TRC_IN_WORD (MAKETYPE(*wp, TRC_WORD)) #define TRC_IN_PDW(dp) TRC_IN_DW (MAKETYPE(*dp, DWORD)) #define TRACE_OBJECT(f,o) { TRC_WRAPCHECK(); \ TRC_IN_PWORD(#f); /* 'f' is 2 literal chars*/\ TRC_IN_PWORD(o.Name);/* 'o' is a .Name'd objct*/\ } #define TRACE_ACTION(a,p) { TRC_WRAPCHECK(); \ TRC_IN_PWORD(#a); /* 'a' is action name */\ TRACE_WORD(p); /* 'p' is trace param */\ } #define TRACE_CHAR(c) { TRC_WRAPCHECK(); TRC_IN_CHAR(c); } #define TRACE_DWORD(d) { \ DWORD dd = CAST (d, DWORD); \ char * pd = CAST(&dd, char *); \ TRC_WRAPCHECK(); \ TRC_IN_CHAR(*(pd+3)); \ TRC_IN_CHAR(*(pd+2)); \ TRC_IN_CHAR(*(pd+1)); \ TRC_IN_CHAR(*(pd )); \ } #define TRACE_WORD(w) { \ SHORT ww = CAST (w, SHORT); \ char * pw = CAST(&ww, char *); \ TRC_WRAPCHECK(); \ TRC_IN_CHAR(*(pw+1)); \ TRC_IN_CHAR(*(pw )); \ } //#define TRACE_PDWORD(pd) TRACE_DWORD (CAST ((*pd), DWORD)) #define TRACE_EVENT(d) { TRC_WRAPCHECK(); \ TRC_IN_PDW(#d); \ } #define TRACE_EVENTNAME(d) { TRC_WRAPCHECK(); \ TRC_IN_PDW(d); \ } #define TRACE_NEWLINE() { TRACE_CHAR ('&'); \ while ((TrcPtr-TrcBuffer) & 0x0F) \ TRACE_CHAR('&'); \ } #define TRACE_RCZERO(var) { if (!var) TRACE_ACTION (Rc,0); } /*no trc if !0*/ #define TRACE_RCFALSE(var) TRACE_RCZERO(var) #define TRACE_RCNONZERO(var) {if (var) TRACE_ACTION (Rc,var); } /*no trc if 0 */ #define TRACE_NTFAILURE(v) { if (!NT_SUCCESS(v)) \ { \ TRACE_EVENT (NtFl) \ TRC_IN_DW (v); \ } \ } #define TRACE_DATABYTE(s,v) { TRACE_EVENT(s); TRC_RE_SET(v); } #define TRACE_RC(var) { TRACE_ACTION(Rc, (TRC_WORD) var); } /*****************************************************************************/ /* TRACE EVENTS. '_' == { etc. (entry) or } etc. (exit) */ /* TRACE DATABYES. '.' == databyte value */ /* */ /* Type Cmd_ Adapter command sequence */ /* ---- --------------------------------------------- */ /* Objct Ad Adapter (device extension) */ /* Call ARs_ Adapter reset (low level) */ /* Call C73_ Close8273Sequence */ /* Call DevI Device Successfully initialised */ /* Call DiNa DeviceInit: No adapter */ /* Call DiNd DeviceInit: No device allocated by create device */ /* Call DmaX Dma buffer crosses 64k */ /* Call DPC_ Routine: DPC. */ /* Call DrvF Driver Load Failure */ /* Call Entr DriverEntry called from NT */ /* Call EPC_ Routine: EntryPointClose */ /* Call EPD_ Routine: EntryPointDevIoctl */ /* Call EPO_ Routine: EntryPointOpen */ /* Call EP?_ Routine: EntryPointRogueInterrupt (Int 4 from PCA adapter) */ /* Call GV2_ Routine: Get V24 */ /* Call HwIF Hardware init failure */ /* Call IAR_ Routine: IoctlAbortRx */ /* Call IAT_ Routine: IoctlAbortTx */ /* Objct Ii Iostatus Information field set */ /* Objct In Initialise: (Buffer) */ /* Call InA_ Routine: Initialise adapter */ /* Call InRF Init RFDs */ /* Call IoC_ Routine: IoctlSetLinkCharacteristics */ /* Call IoI_ Routine: IoctlSetInterfaceRecord */ /* Call IoR_ Routine: IoctlRxFrame */ /* Call IoRN Ioctl RxFrame: nothing received (unsatisfied poll) */ /* Call IoS_ Routine: IoctlSetInterface Record */ /* Call IoT_ Routine: IoctlTxFrame */ /* Call IVI_ Routine: IoctlGetV24Input */ /* Call IVO_ Routine: IoctlSetV24Output */ /* Byte Mpc Config byte going to MPCA */ /* Call OcAs OpenCreate: Allocate of SpinLock failed */ /* Call OcCi OpenCreate: Connect to interrupt failed */ /* Call OcWb OpenCreate: Wrong bus */ /* Word Op Open adapter with base address bbbb */ /* Word Ra Rx AvailableByteCount (RxFSMActionStart) */ /* Call RAI_ Routine: RxFSMActionInvalid */ /* Objct Rb Rx Buffer number */ /* Word Rc Return code Word */ /* Rg RFDNextToGet - RFD_GOT (RFD) */ /* Word Rl Received fram length llll */ /* Call RFE_ Routine: RxFSMEvent */ /* Word Rm RxFSMActionRcvError - ErrorMapArray entry value */ /* Call ROk_ Routine: RxFSMActionRcvOK */ /* Objct Rp RFDNowBeingPut - RFD_PUT_COMPLETE (RFD) */ /* Word Rs Rx StartIndex */ /* Call RSt_ Routine: RxFSMActionStart */ /* Call RSo_ Routine: RxFSMActionStop */ /* Byte RxD Received data byte */ /* Byte RxR Receiver result byte */ /* Call SDM_ Routine: StartDMA */ /* Call SLC_ Routine: SetLinkConfig */ /* Word St Non-success NT status */ /* Call T!!! Routine: TxFSMAction Invalid! */ /* Word Ta Ta Tx BuffserSpaceAvailable */ /* Call TAb Routine: TxFSMActionAbort */ /* Word Tb Tb TxNextToBuffer */ /* Byte TEb Transmit result error byte */ /* Call TEr Routine: TxFSMActionEndError */ /* Word Tn Tn BufferSpaceNeeded */ /* Call TPIO TxPIOData pointer follows */ /* Word Tt Tt TxNextToTransmit */ /* Word Tu Tu TxStartUnusedArea */ /* Word Tx Tx LinkMaxFrameSize */ /* Byte TxD Transmit data byte */ /* Byte TxR Transmit result byte */ /* Call WaTo WAITUNTIL Timeout (leading to hardware error incremented) */ /* Call XEO_ Routine: SynchEntryPointOpen */ /* Call XR8_ Routine: SynchReset8273 */ /* Call XTA_ Routine: SynchTerminateAdapter */ /* Call ZDM_ Zap (= Mask) DMA */ /* */ /* */ /*****************************************************************************/ #else #define DEBUG_PRINT(string) #define TRACE_OBJECT(f,o) #define TRACE_ACTION(a,p) #define TRACE_CHAR(c) #define TRACE_DWORD(d) #define TRACE_PDWORD(pd) #define TRACE_EVENT(d) #define TRACE_NEWLINE() #define TRACE_RCZERO(var) #define TRACE_RCFALSE(var) #define TRACE_RCNONZERO(var) #define TRACE_NTFAILURE(v) #define TRACE_DATABYTE(s,v) #define TRACE_RC(var) #endif #ifdef XDEBUG #define XTRACE_OBJECT TRACE_OBJECT #define XTRACE_ACTION TRACE_ACTION #define XTRACE_CHAR TRACE_CHAR #define XTRACE_DWORD TRACE_DWORD #define XTRACE_PDWORD TRACE_PDWORD #define XTRACE_EVENT TRACE_EVENT #define XTRACE_NEWLINE TRACE_NEWLINE #define XTRACE_RCZERO TRACE_RCZERO #define XTRACE_RCFALSE TRACE_RCFALSE #define XTRACE_RCNONZERO TRACE_RCNONZERO #define XTRACE_NTFAILURE TRACE_NTFAILURE #define XTRACE_DATABYTE TRACE_DATABYTE #define XTRACE_RC TRACE_RC #else #define XTRACE_OBJECT(f,o) #define XTRACE_ACTION(a,p) #define XTRACE_CHAR(c) #define XTRACE_DWORD(d) #define XTRACE_PDWORD(pd) #define XTRACE_EVENT(d) #define XTRACE_NEWLINE() #define XTRACE_RCZERO(var) #define XTRACE_RCFALSE(var) #define XTRACE_RCNONZERO(var) #define XTRACE_NTFAILURE(v) #define XTRACE_DATABYTE(s,v) #define XTRACE_RC(var) #endif