/*++

Copyright (c) 1997 FORE Systems, Inc.
Copyright (c) 1997 Microsoft Corporation

Module Name:

	debug.h

Abstract:

	This file contains debugging support declarations.

Author:

	Larry Cleeton, FORE Systems	(v-lcleet@microsoft.com, lrc@fore.com)		

Environment:

	Kernel mode

Revision History:

--*/

#ifndef __ATMLANE_DEBUG_H
#define __ATMLANE_DEBUG_H

#if DBG

#define DBG_OUTBUF_SIZE 128

extern ULONG 		DbgVerbosity;
extern ULONG 		DbgLogSize;

#if	DBG_TRACE
extern TRACELOG		TraceLog;
extern PUCHAR		pTraceLogSpace;
#endif

struct _string_table {
	PUCHAR string;
	ULONG value;
	};

extern struct _string_table oid_string_table[];

extern struct _string_table irp_string_table[];

#define DBGP(x) DbgOut x

extern
VOID
DbgOut(ULONG Level, PUCHAR Message, ...);

extern
PUCHAR
UnicodeToString(PUNICODE_STRING unicodeString);

extern
PUCHAR
MacAddrToString(PVOID In);

extern
PUCHAR
AtmAddrToString(PVOID In);

extern
PUCHAR
OidToString(ULONG Oid);

extern
PUCHAR
IrpToString(ULONG Irp);

VOID
DbgPrintHexDump(
	IN	ULONG			Level,
	IN	PUCHAR			pBuffer,
	IN	ULONG			Length
);

#define STRUCT_ASSERT(s, t)												\
		if ((s)->t##_sig != t##_signature) 								\
		{																\
			DbgPrint("Structure assertion failure at %p for type " #t 	\
					   " in file %s, line %d\n", s, __FILE__, __LINE__);\
			DbgBreakPoint();											\
		}
		
#if	DBG_TRACE

#define TRACELOGWRITE(x) TraceLogWrite x
#define TRACELOGWRITEPKT(x) TraceLogWritePkt x

extern
VOID
TraceLogWritePkt(
	IN	PTRACELOG		pTraceLog,
	IN	PNDIS_PACKET	pNdisPacket
);

#else

#define TRACELOGWRITE(x)

#define TRACELOGWRITEPKT(x)
#endif

#if MYASSERT

#undef ASSERT

#define ASSERT( exp ) \
    if (!(exp)) \
    { \
    	DbgPrint("Assertion Failed ("#exp") in file %s line %d\n", __FILE__, __LINE__); \
    	DbgBreakPoint(); \
	}
	
#endif


#else

#define DBGP(x)

#define MacAddrToString(x)

#define AtmAddrToString(x)

#define OidToString(x)

#define DbgPrintHexDump(x)

#define STRUCT_ASSERT(s, t)

#define TRACELOGWRITE(x)

#define TRACELOGWRITEPKT(x)

#endif


#ifdef TRACE

#define TRACEIN(x)  DBGP((5, "--> "#x"\n"))
#define TRACEOUT(x) DBGP((5, "<-- "#x"\n"))

#else

#define TRACEIN(x)  {}
#define TRACEOUT(x)	{}

#endif


#if DEBUG_IRQL

#define GET_ENTRY_IRQL(_Irql)			\
			_Irql = KeGetCurrentIrql()
			
#define CHECK_EXIT_IRQL(_EntryIrql)											\
		{																	\
			KIRQL _ExitIrql;												\
			_ExitIrql = KeGetCurrentIrql();									\
			if (_ExitIrql != _EntryIrql)									\
			{																\
				DbgPrint("File %s, Line %d, Exit IRQ %d != Entry IRQ %d\n",	\
						__FILE__, __LINE__, _ExitIrql, _EntryIrql);			\
				DbgBreakPoint();											\
			}																\
		}
#else

#define GET_ENTRY_IRQL(x)
#define CHECK_EXIT_IRQL(x)

#endif // DEBUG_IRQL


#if DEBUG_SPIN_LOCK

#define LOCK_FILE_NAME_LEN		48

typedef struct _ATMLANE_LOCK
{
	ULONG					Signature;
	ULONG					IsAcquired;
	PKTHREAD				OwnerThread;
	UCHAR					TouchedByFileName[LOCK_FILE_NAME_LEN];
	ULONG					TouchedInLineNumber;
	NDIS_SPIN_LOCK			NdisLock;
} ATMLANE_LOCK, *PATMLANE_LOCK;

#define ATMLANE_LOCK_SIG	'KCOL'

extern ULONG				SpinLockInitDone;
extern NDIS_SPIN_LOCK		LockLock;

extern
VOID
AtmLaneAllocateSpinLock(
    IN  PATMLANE_LOCK       pLock,
    IN	PUCHAR				String,
    IN  PUCHAR              FileName,
    IN  ULONG               LineNumber
);

extern
VOID
AtmLaneAcquireSpinLock(
    IN  PATMLANE_LOCK		pLock,
    IN	PUCHAR				String,
    IN  PUCHAR              FileName,
    IN  ULONG               LineNumber
);

extern
VOID
AtmLaneReleaseSpinLock(
    IN  PATMLANE_LOCK       pLock,
    IN	PUCHAR				String,
    IN  PUCHAR              FileName,
    IN  ULONG               LineNumber
);

extern
VOID
AtmLaneFreeSpinLock(
	IN	PATMLANE_LOCK		pLock,
	IN	PUCHAR				String,
	IN	PUCHAR				FileName,
	IN	ULONG				LineNumber
);

#else

#define ATMLANE_LOCK	NDIS_SPIN_LOCK
#define PATMLANE_LOCK	PNDIS_SPIN_LOCK

#endif	// DEBUG_SPIN_LOCK

#endif  //  __ATMLANE_DEBUG_H