/*++ Copyright (c) 1991 Microsoft Corporation Copyright (c) 1991 Nokia Data Systems AB Module Name: dlcdef.h Abstract: This module includes all defines and constants of DLC API driver. Author: Antti Saarenheimo 22-Jul-1991 Environment: Kernel mode Revision History: --*/ #include // required for PAGE_SIZE // // minima, maxima and defaults for registry parameters // #define MIN_TIMER_TICK_VALUE 1 #define MAX_TIMER_TICK_VALUE 255 #define MIN_AUTO_FRAMING_CACHE_SIZE 0 // means NO CACHING! #define MAX_AUTO_FRAMING_CACHE_SIZE 256 // arbitrary maximum // // if non-TR cards && using max ethernet frame length then 1514 is the value // we use (came from ELNKII, EE16, LANCE, et al) // #define MAX_ETHERNET_FRAME_LENGTH 1514 // // default values for parameters retrieved from registry // #define DEFAULT_SWAP_ADDRESS_BITS 1 #define DEFAULT_DIX_FORMAT 0 #define DEFAULT_T1_TICK_ONE 5 #define DEFAULT_T1_TICK_TWO 25 #define DEFAULT_T2_TICK_ONE 1 #define DEFAULT_T2_TICK_TWO 10 #define DEFAULT_Ti_TICK_ONE 25 #define DEFAULT_Ti_TICK_TWO 125 #define DEFAULT_USE_ETHERNET_FRAME_SIZE 1 #define DEFAULT_AUTO_FRAMING_CACHE_SIZE 16 // // The event and command queue structures overlaps => we cane save the // duplicate code. The defined name makes code more readable. // #define SearchAndRemoveEvent( a, b, c, d ) \ (PDLC_EVENT)SearchAndRemoveCommand( a, b, c, d ) #define MAX_SAP_STATIONS 128 #define MAX_LINK_STATIONS 255 #define GROUP_SAP_BIT 0x0100 #define DLC_INDIVIDUAL_SAP 0x04 #define XID_HANDLING_BIT 0x08 #define MIN_DLC_BUFFER_SIZE PAGE_SIZE #define MAX_FREE_SIZE_THRESHOLD 0x2000 #define INVALID_RCV_READ_OPTION 3 #define DLC_INVALID_OPTION_INDICATOR 3 #define DLC_NO_RECEIVE_COMMAND 4 #define DLC_CONTIGUOUS_MAC 0x80 #define DLC_CONTIGUOUS_DATA 0x40 #define DLC_BREAK 0x20 #if defined(ALPHA) #define DLC_BUFFER_SEGMENTS 6 // 256, 512, 1024, 2048, 4096, 8192 => 6 #else #define DLC_BUFFER_SEGMENTS 5 // 256, 512, 1024, 2048, 4096 => 5 #endif #define MAX_USER_DATA_LENGTH 128 // anything less than 256 // // Transmit timeout = 20 * 250 ms = 5 seconds // #define MAX_TRANSMIT_RETRY 20 #define TRANSMIT_RETRY_WAIT 2500000L #define LLC_RECEIVE_COMMAND_FLAG 0x80 #define DLC_IGNORE_SEARCH_HANDLE NULL #define DLC_MATCH_ANY_COMMAND (PVOID)-1 #define DLC_IGNORE_STATION_ID 0x00ff #define DLC_STATION_MASK_SPECIFIC 0xffff #define DLC_STATION_MASK_SAP 0xff00 #define DLC_STATION_MASK_ALL 0 #define IOCTL_DLC_READ_INDEX ((IOCTL_DLC_READ >> 2) & 0x0fff) #define IOCTL_DLC_RECEIVE_INDEX ((IOCTL_DLC_RECEIVE >> 2) & 0x0fff) #define IOCTL_DLC_TRANSMIT_INDEX ((IOCTL_DLC_TRANSMIT >> 2) & 0x0fff) #define IOCTL_DLC_OPEN_ADAPTER_INDEX ((IOCTL_DLC_OPEN_ADAPTER >> 2) & 0x0fff) enum _DLC_OBJECT_STATES { DLC_OBJECT_OPEN, DLC_OBJECT_CLOSING, DLC_OBJECT_CLOSED, DLC_OBJECT_INVALID_TYPE }; // // The Token-Ring status codes documented in Appendix B of the IBM LAN // Tech Reference are shifted right one bit from the NDIS values // documented in "ntddndis.h." // // In versions 3.xx of Windows NT, DLC returns a Network Status that // agrees with the NDIS values. In version 4.xx and newer, IBM // compatible values are used. // // These macros may be used to convert between the two conventions. // #define NDIS_RING_STATUS_TO_DLC_RING_STATUS(status) ((status)>>1) #define DLC_RING_STATUS_TO_NDIS_RING_STATUS(status) ((status)<<1) #define NDIS_RING_STATUS_MASK \ NDIS_RING_SIGNAL_LOSS\ |NDIS_RING_HARD_ERROR\ |NDIS_RING_SOFT_ERROR\ |NDIS_RING_TRANSMIT_BEACON\ |NDIS_RING_LOBE_WIRE_FAULT\ |NDIS_RING_AUTO_REMOVAL_ERROR\ |NDIS_RING_REMOVE_RECEIVED\ |NDIS_RING_COUNTER_OVERFLOW\ |NDIS_RING_SINGLE_STATION\ |NDIS_RING_RING_RECOVERY #define DLC_RING_STATUS_MASK NDIS_RING_STATUS_TO_DLC_RING_STATUS(NDIS_RING_STATUS_MASK) #define IS_NDIS_RING_STATUS(status) (((status)&NDIS_RING_STATUS_MASK)!=0) #define IS_DLC_RING_STATUS(status) (((status)&DLC_RING_STATUS_MASK)!=0) // // ENTER/LEAVE_DLC - acquires or releases the per-file context spin lock. Use // Ndis spin locking calls // #define ENTER_DLC(p) ACQUIRE_SPIN_LOCK(&p->SpinLock) #define LEAVE_DLC(p) RELEASE_SPIN_LOCK(&p->SpinLock) // // ACQUIRE/RELEASE_DLC_LOCK - acquires or releases global DLC spin lock. Use // kernel spin locking calls // #define ACQUIRE_DLC_LOCK(i) KeAcquireSpinLock(&DlcSpinLock, &(i)) #define RELEASE_DLC_LOCK(i) KeReleaseSpinLock(&DlcSpinLock, (i)) #define ADAPTER_ERROR_COUNTERS 11 // # adapter error log counters #define ReferenceFileContextByTwo(pFileContext) (pFileContext)->ReferenceCount += 2 #define ReferenceFileContext(pFileContext) (pFileContext)->ReferenceCount++ #if DBG #define DereferenceFileContext(pFileContext) \ if (pFileContext->ReferenceCount <= 0) { \ DbgPrint("DLC.DereferenceFileContext: Error: file context %08x: reference count %x\n",\ pFileContext, \ pFileContext->ReferenceCount \ ); \ DbgBreakPoint(); \ } \ (pFileContext)->ReferenceCount--; \ if ((pFileContext)->ReferenceCount <= 0) { \ DlcKillFileContext(pFileContext); \ } #define DereferenceFileContextByTwo(pFileContext) \ if (pFileContext->ReferenceCount <= 1) { \ DbgPrint("DLC.DereferenceFileContextByTwo: Error: file context %08x: reference count %x\n",\ pFileContext, \ pFileContext->ReferenceCount \ ); \ DbgBreakPoint(); \ } \ (pFileContext)->ReferenceCount -= 2; \ if ((pFileContext)->ReferenceCount <= 0) { \ DlcKillFileContext(pFileContext); \ } #else #define DereferenceFileContext(pFileContext) \ (pFileContext)->ReferenceCount--; \ if ((pFileContext)->ReferenceCount <= 0) { \ DlcKillFileContext(pFileContext); \ } #define DereferenceFileContextByTwo(pFileContext) \ (pFileContext)->ReferenceCount -= 2; \ if ((pFileContext)->ReferenceCount <= 0) { \ DlcKillFileContext(pFileContext); \ } #endif // DBG #define BufferPoolCount(hBufferPool) \ (((PDLC_BUFFER_POOL)hBufferPool)->FreeSpace >= (256L * 0x0000ffffL) ? \ 0xffff : \ (((PDLC_BUFFER_POOL)hBufferPool)->FreeSpace / 256)) #define BufGetUncommittedSpace(handle) \ ((PDLC_BUFFER_POOL)(handle))->UncommittedSpace #define BufCommitBuffers(handle, BufferSize) \ ExInterlockedAddUlong( \ (PULONG)&((PDLC_BUFFER_POOL)(handle))->UncommittedSpace, \ (ULONG)(-((LONG)BufferSize)), \ &(((PDLC_BUFFER_POOL)(handle))->SpinLock)) #define BufUncommitBuffers(handle, BufferSize) \ ExInterlockedAddUlong(\ (PULONG)&((PDLC_BUFFER_POOL)(handle))->UncommittedSpace,\ (ULONG)(BufferSize),\ &(((PDLC_BUFFER_POOL)(handle))->SpinLock)) /*++ BOOLEAN BufferPoolCheckThresholds( IN PDLC_BUFFER_POOL pBufferPool ) Routine Description: The function checks the minimum and maximum size Thresholds and returns TRUE, if buffer pool needs reallocation. We do this check outside the spinlocks to avoid unnecessary locking in 99 % of the cases. Arguments: pBufferPool - handle of buffer pool data structure. Return Value: Returns TRUE => Buffer pool needs extending FALSE => no need for it --*/ #define BufferPoolCheckThresholds( pBufferPool ) \ (((pBufferPool) != NULL && \ (((PDLC_BUFFER_POOL)(pBufferPool))->UncommittedSpace < 0 || \ ((PDLC_BUFFER_POOL)(pBufferPool))->MissingSize > 0) && \ ((PDLC_BUFFER_POOL)(pBufferPool))->BufferPoolSize < \ ((PDLC_BUFFER_POOL)(pBufferPool))->MaxBufferSize && \ MemoryLockFailed == FALSE) ? TRUE : FALSE) // // These routines closes a llc object, when there are no // more references to it // #define ReferenceLlcObject( pDlcObject ) (pDlcObject)->LlcReferenceCount++ #define DereferenceLlcObject( pDlcObject ) { \ (pDlcObject)->LlcReferenceCount--; \ if ((pDlcObject)->LlcReferenceCount == 0) {\ CompleteLlcObjectClose( pDlcObject ); \ } \ DLC_TRACE('O'); \ DLC_TRACE( (UCHAR)(pDlcObject)->LlcReferenceCount ); \ } // // We need the same kind of routines to reference the buffer pool. // The adapter closing have quite many times deleted the buffer pool // just before it was called (after LEAVE_DLC). // #define ReferenceBufferPool(pFileContext) (pFileContext)->BufferPoolReferenceCount++ #if DBG #define DereferenceBufferPool(pFileContext) {\ (pFileContext)->BufferPoolReferenceCount--; \ if ((pFileContext)->BufferPoolReferenceCount == 0) {\ BufferPoolDereference( \ pFileContext, \ (PDLC_BUFFER_POOL*)&(pFileContext)->hBufferPool); \ } \ } #else #define DereferenceBufferPool(pFileContext) {\ (pFileContext)->BufferPoolReferenceCount--; \ if ((pFileContext)->BufferPoolReferenceCount == 0) {\ BufferPoolDereference((PDLC_BUFFER_POOL*)&(pFileContext)->hBufferPool); \ } \ } #endif