|
|
/*++
Copyright (c) 1998-1999 Microsoft Corporation
Module Name:
macros.h
Abstract:
Macros used in ATMEPVC
Author:
Revision History:
Who When What -------- -------- ---- ADube 03-23-00 created, .
--*/
#ifndef _MACROS_H
#define _MACROS_H
#define FALL_THROUGH // For informational purpose in a switch statement
// Warning -- FAIL(NDIS_STATUS_PENDING) == TRUE
//
#define FAIL(_Status) ((_Status) != NDIS_STATUS_SUCCESS)
#define PEND(_Status) ((_Status) == NDIS_STATUS_PENDING)
#if RM_EXTRA_CHECKING
#define LOCKHDR(_pHdr, _psr) \
RmWriteLockObject((_pHdr), dbg_func_locid, (_psr)) #else // !RM_EXTRA_CHECKING
#define LOCKHDR(_pHdr, _psr) \
RmWriteLockObject((_pHdr), (_psr)) #endif // !RM_EXTRA_CHECKING
#define LOCKOBJ(_pObj, _psr) \
LOCKHDR(&(_pObj)->Hdr, (_psr))
#define UNLOCKHDR(_pHdr, _psr) \
RmUnlockObject((_pHdr), (_psr)) #define UNLOCKOBJ(_pObj, _psr) \
UNLOCKHDR(&(_pObj)->Hdr, (_psr))
#define EPVC_ALLOCSTRUCT(_p, _tag) \
NdisAllocateMemoryWithTag(&(_p), sizeof(*(_p)), (_tag))
#define EPVC_FREE(_p) NdisFreeMemory((_p), 0, 0)
#define EPVC_ZEROSTRUCT(_p) \
NdisZeroMemory((_p), sizeof(*(_p)))
#define ARRAY_LENGTH(_array) (sizeof(_array)/sizeof((_array)[0]))
#if RM_EXTRA_CHECKING
#define DBG_ADDASSOC(_phdr, _e1, _e2, _assoc, _fmt, _psr)\
RmDbgAddAssociation( \ dbg_func_locid, \ (_phdr), \ (UINT_PTR) (_e1), \ (UINT_PTR) (_e2), \ (_assoc), \ (_fmt), \ (_psr) \ )
#define DBG_DELASSOC(_phdr, _e1, _e2, _assoc, _psr) \
RmDbgDeleteAssociation( \ dbg_func_locid, \ (_phdr), \ (UINT_PTR) (_e1), \ (UINT_PTR) (_e2), \ (_assoc), \ (_psr) \ )
// (debug only) Enumeration of types of associations.
//
#else // !RM_EXTRA_CHECKING
#define DBG_ADDASSOC(_phdr, _e1, _e2, _assoc, _fmt, _psr) (0)
#define DBG_DELASSOC(_phdr, _e1, _e2, _assoc, _psr) (0)
#endif // !RM_EXTRA_CHECKING
#define EPVC_ATPASSIVE() (KeGetCurrentIrql()==PASSIVE_LEVEL)
#if DO_TIMESTAMPS
void epvcTimeStamp( char *szFormatString, UINT Val ); #define TIMESTAMP(_FormatString) \
epvcTimeStamp( "TIMESTAMP %lu:%lu.%lu ATMEPVC " _FormatString "\n", 0) #define TIMESTAMP1(_FormatString, _Val) \
epvcTimeStamp( "TIMESTAMP %lu:%lu.%lu ATMEPVC " _FormatString "\n", (_Val))
#else // !DO_TIMESTAMPS
#define TIMESTAMP(_FormatString)
#define TIMESTAMP1(_FormatString, _Val)
#endif // !DO_TIMESTAMPS
#define TRACE_BREAK(_Mod, Str) \
TRACE (TL_A, _Mod, Str); \ ASSERT (NdisStatus == NDIS_STATUS_SUCCESS); \ break;
#define GET_ADAPTER_FROM_MINIPORT(_pM) _pM->pAdapter
//
// Miniport Flag access routines
//
#define MiniportTestFlag(_A, _F) ((epvcReadFlags(&(_A)->Hdr.State) & (_F))!= 0)
#define MiniportSetFlag(_A, _F) (epvcSetFlags(&(_A)->Hdr.State, (_F)))
#define MiniportClearFlag(_A, _F) (epvcClearFlags(&(_A)->Hdr.State, (_F)))
#define MiniportTestFlags(_A, _F) ((epvcReadFlags(&(_A)->Hdr.State) & (_F)) == (_F))
//
// Adapter Flag access routines
//
#define AdapterTestFlag(_A, _F) ((epvcReadFlags(&(_A)->Hdr.State) & (_F))!= 0)
#define AdapterSetFlag(_A, _F) (epvcSetFlags(&(_A)->Hdr.State, (_F)))
#define AdapterClearFlag(_A, _F) (epvcClearFlags(&(_A)->Hdr.State, (_F)))
#define AdapterTestFlags(_A, _F) ((epvcReadFlags(&(_A)->Hdr.State) & (_F)) == (_F))
#define epvcLinkToExternal(_Hdr, _Luid, _Ext, _Num, _Str, _sr) \
RmLinkToExternalEx (_Hdr,_Luid,_Ext,_Num,_Str,_sr);
#define epvcUnlinkFromExternal(_Hdr, _Luid, _Ext, _Assoc, _sr) \
RmUnlinkFromExternalEx( \ _Hdr, \ _Luid, \ _Ext, \ _Assoc, \ _sr \ );
/*++
ULONG LINKSPEED_TO_CPS( IN ULONG LinkSpeed ) Convert from NDIS "Link Speed" to cells per second --*/ #define LINKSPEED_TO_CPS(_LinkSpeed) (((_LinkSpeed)*100)/(48*8))
#define CALL_PARAMETER_SIZE sizeof(CO_CALL_PARAMETERS) + \
sizeof(CO_CALL_MANAGER_PARAMETERS) + \ sizeof(CO_MEDIA_PARAMETERS) + \ sizeof(ATM_MEDIA_PARAMETERS)
#define MP_OFFSET(field) ((UINT)FIELD_OFFSET(EPVC_I_MINIPORT,field))
#define MP_SIZE(field) sizeof(((PEPVC_I_MINIPORT)0)->field)
// All memory allocations and frees are done with these ALLOC_*/FREE_*
// macros/inlines to allow memory management scheme changes without global
// editing. For example, might choose to lump several lookaside lists of
// nearly equal sized items into a single list for efficiency.
//
// NdisFreeMemory requires the length of the allocation as an argument. NT
// currently doesn't use this for non-paged memory, but according to JameelH,
// Windows95 does. These inlines stash the length at the beginning of the
// allocation, providing the traditional malloc/free interface. The
// stash-area is a ULONGLONG so that all allocated blocks remain ULONGLONG
// aligned as they would be otherwise, preventing problems on Alphas.
//
__inline VOID* ALLOC_NONPAGED( IN ULONG ulBufLength, IN ULONG ulTag ) { CHAR* pBuf;
NdisAllocateMemoryWithTag( &pBuf, (UINT )(ulBufLength + MEMORY_ALLOCATION_ALIGNMENT), ulTag ); if (!pBuf) { return NULL; }
((ULONG* )pBuf)[ 0 ] = ulBufLength; ((ULONG* )pBuf)[ 1 ] = ulTag; return (pBuf + MEMORY_ALLOCATION_ALIGNMENT); }
__inline VOID FREE_NONPAGED( IN VOID* pBuf ) { ULONG ulBufLen;
ulBufLen = *((ULONG* )(((CHAR* )pBuf) - MEMORY_ALLOCATION_ALIGNMENT)); NdisFreeMemory( ((CHAR* )pBuf) - MEMORY_ALLOCATION_ALIGNMENT, (UINT )(ulBufLen + MEMORY_ALLOCATION_ALIGNMENT), 0 ); }
#define CanMiniportIndicate(_M) (MiniportTestFlag(_M, fMP_MiniportInitialized)== TRUE)
#define epvcIncrementMallocFailure()
#define ASSERTAndBreak(_condition) ASSERT(_condition); break;
#define epvcSetSendPktStats()
#define epvcSendCompleteStats()
#endif
|