diff options
Diffstat (limited to 'private/ntos/ndis/ndis30/ndismini.h')
-rw-r--r-- | private/ntos/ndis/ndis30/ndismini.h | 1216 |
1 files changed, 1216 insertions, 0 deletions
diff --git a/private/ntos/ndis/ndis30/ndismini.h b/private/ntos/ndis/ndis30/ndismini.h new file mode 100644 index 000000000..38892897d --- /dev/null +++ b/private/ntos/ndis/ndis30/ndismini.h @@ -0,0 +1,1216 @@ +#include <afilter.h> +#include <efilter.h> +#include <tfilter.h> +#include <ffilter.h> + +#define NDIS_M_MAX_MULTI_LIST 32 +#define NDIS_M_MAX_LOOKAHEAD 526 + +// +// declare these first since they point to each other +// + +typedef struct _NDIS_M_DRIVER_BLOCK NDIS_M_DRIVER_BLOCK, * PNDIS_M_DRIVER_BLOCK; +typedef struct _NDIS_MINIPORT_BLOCK NDIS_MINIPORT_BLOCK, * PNDIS_MINIPORT_BLOCK; +typedef struct _NDIS_M_PROTOCOL_BLOCK NDIS_M_PROTOCOL_BLOCK, * PNDIS_M_PROTOCOL_BLOCK; +typedef struct _NDIS_M_OPEN_BLOCK NDIS_M_OPEN_BLOCK, * PNDIS_M_OPEN_BLOCK; + + +// +// Function types for NDIS_MINIPORT_CHARACTERISTICS +// + + +typedef +BOOLEAN +(*W_CHECK_FOR_HANG_HANDLER) ( + IN NDIS_HANDLE MiniportAdapterContext + ); + +typedef +VOID +(*W_DISABLE_INTERRUPT_HANDLER) ( + IN NDIS_HANDLE MiniportAdapterContext + ); + +typedef +VOID +(*W_ENABLE_INTERRUPT_HANDLER) ( + IN NDIS_HANDLE MiniportAdapterContext + ); + +typedef +VOID +(*W_HALT_HANDLER) ( + IN NDIS_HANDLE MiniportAdapterContext + ); + +typedef +VOID +(*W_HANDLE_INTERRUPT_HANDLER) ( + IN NDIS_HANDLE MiniportAdapterContext + ); + +typedef +NDIS_STATUS +(*W_INITIALIZE_HANDLER) ( + OUT PNDIS_STATUS OpenErrorStatus, + OUT PUINT SelectedMediumIndex, + IN PNDIS_MEDIUM MediumArray, + IN UINT MediumArraySize, + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE WrapperConfigurationContext + ); + +typedef +VOID +(*W_ISR_HANDLER) ( + OUT PBOOLEAN InterruptRecognized, + OUT PBOOLEAN QueueMiniportHandleInterrupt, + IN NDIS_HANDLE MiniportAdapterContext + ); + +typedef +NDIS_STATUS +(*W_QUERY_INFORMATION_HANDLER) ( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_OID Oid, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesWritten, + OUT PULONG BytesNeeded + ); + +typedef +NDIS_STATUS +(*W_RECONFIGURE_HANDLER) ( + OUT PNDIS_STATUS OpenErrorStatus, + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE WrapperConfigurationContext + ); + +typedef +NDIS_STATUS +(*W_RESET_HANDLER) ( + OUT PBOOLEAN AddressingReset, + IN NDIS_HANDLE MiniportAdapterContext + ); + +typedef +NDIS_STATUS +(*W_SEND_HANDLER) ( + IN NDIS_HANDLE MiniportAdapterContext, + IN PNDIS_PACKET Packet, + IN UINT Flags + ); + +typedef +NDIS_STATUS +(*W_SET_INFORMATION_HANDLER) ( + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_OID Oid, + IN PVOID InformationBuffer, + IN ULONG InformationBufferLength, + OUT PULONG BytesRead, + OUT PULONG BytesNeeded + ); + +typedef +NDIS_STATUS +(*W_TRANSFER_DATA_HANDLER) ( + OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred, + IN NDIS_HANDLE MiniportAdapterContext, + IN NDIS_HANDLE MiniportReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer + ); + +typedef struct _NDIS_MINIPORT_CHARACTERISTICS { + UCHAR MajorNdisVersion; + UCHAR MinorNdisVersion; + UINT Reserved; + W_CHECK_FOR_HANG_HANDLER CheckForHangHandler; + W_DISABLE_INTERRUPT_HANDLER DisableInterruptHandler; + W_ENABLE_INTERRUPT_HANDLER EnableInterruptHandler; + W_HALT_HANDLER HaltHandler; + W_HANDLE_INTERRUPT_HANDLER HandleInterruptHandler; + W_INITIALIZE_HANDLER InitializeHandler; + W_ISR_HANDLER ISRHandler; + W_QUERY_INFORMATION_HANDLER QueryInformationHandler; + W_RECONFIGURE_HANDLER ReconfigureHandler; + W_RESET_HANDLER ResetHandler; + W_SEND_HANDLER SendHandler; + W_SET_INFORMATION_HANDLER SetInformationHandler; + W_TRANSFER_DATA_HANDLER TransferDataHandler; +} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS; + +// +// one of these per Driver +// + +struct _NDIS_M_DRIVER_BLOCK { + PNDIS_MINIPORT_BLOCK MiniportQueue; // queue of mini-ports for this driver + NDIS_HANDLE MiniportIdField; + + REFERENCE Ref; // contains spinlock for MiniportQueue + UINT Length; // of this NDIS_DRIVER_BLOCK structure + NDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics; // handler addresses + PNDIS_WRAPPER_HANDLE NdisDriverInfo; // Driver information. + PNDIS_M_DRIVER_BLOCK NextDriver; + PNDIS_MAC_BLOCK FakeMac; + KEVENT MiniportsRemovedEvent; // used to find when all mini-ports are gone. + BOOLEAN Unloading; // TRUE if unloading + +}; + +typedef struct _NDIS_MINIPORT_INTERRUPT { + PKINTERRUPT InterruptObject; + KSPIN_LOCK DpcCountLock; + PVOID MiniportIdField; + W_ISR_HANDLER MiniportIsr; + W_HANDLE_INTERRUPT_HANDLER MiniportDpc; + KDPC InterruptDpc; + PNDIS_MINIPORT_BLOCK Miniport; + UCHAR DpcCount; + BOOLEAN Filler1; + + // + // This is used to tell when all the Dpcs for the adapter are completed. + // + + KEVENT DpcsCompletedEvent; + + BOOLEAN SharedInterrupt; + BOOLEAN IsrRequested; + +} NDIS_MINIPORT_INTERRUPT, *PNDIS_MINIPORT_INTERRUPT; + + +typedef struct _NDIS_MINIPORT_TIMER { + KTIMER Timer; + KDPC Dpc; + PNDIS_TIMER_FUNCTION MiniportTimerFunction; + PVOID MiniportTimerContext; + PNDIS_MINIPORT_BLOCK Miniport; + struct _NDIS_MINIPORT_TIMER *NextDeferredTimer; +} NDIS_MINIPORT_TIMER, *PNDIS_MINIPORT_TIMER; + +// +// Pending NdisOpenAdapter() structure (for miniports only). +// + +typedef struct _MINIPORT_PENDING_OPEN *PMINIPORT_PENDING_OPEN; + +typedef struct _MINIPORT_PENDING_OPEN { + + PMINIPORT_PENDING_OPEN NextPendingOpen; + PNDIS_HANDLE NdisBindingHandle; + PNDIS_MINIPORT_BLOCK Miniport; + PVOID NewOpenP; + PVOID FileObject; + NDIS_HANDLE NdisProtocolHandle; + NDIS_HANDLE ProtocolBindingContext; + PNDIS_STRING AdapterName; + UINT OpenOptions; + PSTRING AddressingInformation; + BOOLEAN UsingEncapsulation; +} MINIPORT_PENDING_OPEN; + + +// +// one of these per mini-port registered on a Driver +// + +struct _NDIS_MINIPORT_BLOCK { + ULONG Flags; // used to distinquish between MACs and mini-ports + PDEVICE_OBJECT DeviceObject; // created by the wrapper + PNDIS_M_DRIVER_BLOCK DriverHandle; // pointer to our Driver block + NDIS_HANDLE MiniportAdapterContext; // context when calling mini-port functions + NDIS_STRING MiniportName; // how mini-port refers to us + PNDIS_M_OPEN_BLOCK OpenQueue; // queue of opens for this mini-port + PNDIS_MINIPORT_BLOCK NextMiniport; // used by driver's MiniportQueue + REFERENCE Ref; // contains spinlock for OpenQueue + BOOLEAN NormalInterrupts; + BOOLEAN ProcessingDeferred; // TRUE if processing deferred operations + + // + // Synchronization stuff. + // + // The boolean is used to lock out several DPCs from running at the + // same time. The difficultly is if DPC A releases the spin lock + // and DPC B tries to run, we want to defer B until after A has + // exited. + // + BOOLEAN LockAcquired; + NDIS_SPIN_LOCK Lock; + PNDIS_MINIPORT_INTERRUPT Interrupt; + + // + // Stuff that got deferred. + // + BOOLEAN RunDpc; + BOOLEAN Timeout; + BOOLEAN InAddDriver; + BOOLEAN InInitialize; + PNDIS_MINIPORT_TIMER RunTimer; + NDIS_TIMER DpcTimer; + NDIS_TIMER WakeUpDpcTimer; + + // + // Holds media specific information + // + PETH_FILTER EthDB; + PTR_FILTER TrDB; + PFDDI_FILTER FddiDB; + PARC_FILTER ArcDB; + NDIS_MEDIUM MediaType; + + UCHAR TrResetRing; + UCHAR ArcnetAddress; + BOOLEAN ArcnetBroadcastSet; + BOOLEAN SendCompleteCalled; + + PVOID WrapperContext; + + NDIS_HANDLE ArcnetBufferPool; + PARC_BUFFER_LIST ArcnetFreeBufferList; + PARC_BUFFER_LIST ArcnetUsedBufferList; + + // + // Resource information + // + PCM_RESOURCE_LIST Resources; + + // + // contains mini-port information + // + ULONG BusNumber; + NDIS_INTERFACE_TYPE BusType; + NDIS_INTERFACE_TYPE AdapterType; + BOOLEAN Master; + + // + // Holds the map registers for this mini-port. + // + BOOLEAN Dma32BitAddresses; + PMAP_REGISTER_ENTRY MapRegisters; + ULONG PhysicalMapRegistersNeeded; + ULONG MaximumPhysicalMapping; + + // + // These two are used temporarily while allocating + // the map registers. + // + KEVENT AllocationEvent; + UINT CurrentMapRegister; + PADAPTER_OBJECT SystemAdapterObject; + + // + // Send information + // + PNDIS_PACKET FirstPacket; // This pointer serves two purposes; + // it is the head of the queue of ALL + // packets that have been sent to + // the miniport, it is also the head + // of the packets that have been sent + // down to the miniport by the wrapper. + PNDIS_PACKET LastPacket; // This is tail pointer for the global + // packet queue and this is the tail + // pointer to the queue of packets + // waiting to be sent to the miniport. + PNDIS_PACKET FirstPendingPacket; // This is head of the queue of packets + // waiting to be sent to miniport. + PNDIS_PACKET LastMiniportPacket; // This is the tail pointer of the + // queue of packets that have been + // sent to the miniport by the wrapper. + ULONG SendResourcesAvailable; + PNDIS_PACKET DeadPacket; // This pointer is used by the wake-up + // dpc to make sure that a packet that + // was sent to the miniport has been + // completed with-in a decent amount + // of time. + BOOLEAN AlreadyLoopedBack; // This flag is set if a packet that + // is waiting to be sent to the + // miniport has already been looped- + // back; + + + // + // Transfer data information + // + PNDIS_PACKET FirstTDPacket; + PNDIS_PACKET LastTDPacket; + PNDIS_PACKET LoopbackPacket; + UINT LoopbackPacketHeaderSize; + + // + // Reset information + // + PNDIS_M_OPEN_BLOCK ResetRequested; + PNDIS_M_OPEN_BLOCK ResetInProgress; + + // + // RequestInformation + // + KEVENT RequestEvent; + PNDIS_REQUEST FirstPendingRequest; + PNDIS_REQUEST LastPendingRequest; + PNDIS_REQUEST MiniportRequest; + NDIS_REQUEST InternalRequest; + NDIS_STATUS RequestStatus; + UINT MaximumLongAddresses; + UINT MaximumShortAddresses; + UINT CurrentLookahead; + UINT MaximumLookahead; + UINT MacOptions; + ULONG SupportedPacketFilters; + BOOLEAN NeedToUpdateEthAddresses; + BOOLEAN NeedToUpdatePacketFilter; + BOOLEAN NeedToUpdateFunctionalAddress; + BOOLEAN NeedToUpdateGroupAddress; + BOOLEAN NeedToUpdateFddiLongAddresses; + BOOLEAN NeedToUpdateFddiShortAddresses; + BOOLEAN RunDoRequests; + BOOLEAN ProcessOddDeferredStuff; + UCHAR MulticastBuffer[NDIS_M_MAX_MULTI_LIST][6]; + UCHAR LookaheadBuffer[NDIS_M_MAX_LOOKAHEAD]; + + BOOLEAN BeingRemoved; // TRUE if mini-port is being removed + BOOLEAN HaltingMiniport; // TRUE if mini-port halt handler needs to be called + + // + // Temp stuff for using the old NDIS functions + // + ULONG ChannelNumber; + + PMINIPORT_PENDING_OPEN FirstPendingOpen; + PMINIPORT_PENDING_OPEN LastPendingOpen; + BOOLEAN PendingRequestTimeout; +}; + +#define MINIPORT_LOCK_ACQUIRED(_Miniport) ((_Miniport)->LockAcquired) + + +// +// one of these per open on an mini-port/protocol +// + +struct _NDIS_M_OPEN_BLOCK { + PNDIS_M_DRIVER_BLOCK DriverHandle; // pointer to our driver + PNDIS_MINIPORT_BLOCK MiniportHandle; // pointer to our mini-port + PNDIS_PROTOCOL_BLOCK ProtocolHandle; // pointer to our protocol + PNDIS_OPEN_BLOCK FakeOpen; // Pointer to fake open block + NDIS_HANDLE ProtocolBindingContext; // context when calling ProtXX funcs + NDIS_HANDLE MiniportAdapterContext; // context when calling MiniportXX funcs + PNDIS_M_OPEN_BLOCK MiniportNextOpen; // used by mini-port's OpenQueue + PFILE_OBJECT FileObject; // created by operating system + BOOLEAN Closing; // TRUE when removing this struct + BOOLEAN UsingEthEncapsulation; // TRUE if running 802.3 on 878.2 + NDIS_HANDLE CloseRequestHandle; // 0 indicates an internal close + NDIS_HANDLE FilterHandle; + NDIS_SPIN_LOCK SpinLock; // guards Closing + ULONG References; + UINT CurrentLookahead; + ULONG ProtocolOptions; + + // + // These are optimizations for getting to driver routines. They are not + // necessary, but are here to save a dereference through the Driver block. + // + + W_SEND_HANDLER SendHandler; + W_TRANSFER_DATA_HANDLER TransferDataHandler; + + // + // These are optimizations for getting to PROTOCOL routines. They are not + // necessary, but are here to save a dereference through the PROTOCOL block. + // + + SEND_COMPLETE_HANDLER SendCompleteHandler; + TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler; + RECEIVE_HANDLER ReceiveHandler; + RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler; + +}; + +// +// NOTE: THIS STRUCTURE MUST, MUST, MUST ALIGN WITH THE +// NDIS_USER_OPEN_CONTEXT STRUCTURE defined in the wrapper. +// +typedef struct _NDIS_M_USER_OPEN_CONTEXT { + PDEVICE_OBJECT DeviceObject; + PNDIS_MINIPORT_BLOCK MiniportBlock; + ULONG OidCount; + PNDIS_OID OidArray; +} NDIS_M_USER_OPEN_CONTEXT, *PNDIS_M_USER_OPEN_CONTEXT; + + +typedef struct _NDIS_REQUEST_RESERVED { + PNDIS_REQUEST Next; + struct _NDIS_M_OPEN_BLOCK * Open; +} NDIS_REQUEST_RESERVED, *PNDIS_REQUEST_RESERVED; + +#define PNDIS_RESERVED_FROM_PNDIS_REQUEST(_request) \ + ((PNDIS_REQUEST_RESERVED)((_request)->MacReserved)) + + +BOOLEAN +NdisMIsr( + IN PKINTERRUPT KInterrupt, + IN PVOID Context + ); + +VOID +NdisMDpc( + IN PVOID SystemSpecific1, + IN PVOID InterruptContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3 + ); + +VOID +NdisMDpcTimer( + IN PVOID SystemSpecific1, + IN PVOID InterruptContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3 + ); + +VOID +NdisMWakeUpDpc( + PKDPC Dpc, + PVOID Context, + PVOID SystemContext1, + PVOID SystemContext2 + ); + +NDIS_STATUS +NdisMChangeEthAddresses( + IN UINT OldAddressCount, + IN CHAR OldAddresses[][6], + IN UINT NewAddressCount, + IN CHAR NewAddresses[][6], + IN NDIS_HANDLE MacBindingHandle, + IN PNDIS_REQUEST NdisRequest, + IN BOOLEAN Set + ); + +NDIS_STATUS +NdisMChangeClass( + IN UINT OldFilterClasses, + IN UINT NewFilterClasses, + IN NDIS_HANDLE MacBindingHandle, + IN PNDIS_REQUEST NdisRequest, + IN BOOLEAN Set + ); + +VOID +NdisMCloseAction( + IN NDIS_HANDLE MacBindingHandle + ); + +NDIS_STATUS +NdisMChangeFunctionalAddress( + IN TR_FUNCTIONAL_ADDRESS OldFunctionalAddress, + IN TR_FUNCTIONAL_ADDRESS NewFunctionalAddress, + IN NDIS_HANDLE MacBindingHandle, + IN PNDIS_REQUEST NdisRequest, + IN BOOLEAN Set + ); + +NDIS_STATUS +NdisMChangeGroupAddress( + IN TR_FUNCTIONAL_ADDRESS OldGroupAddress, + IN TR_FUNCTIONAL_ADDRESS NewGroupAddress, + IN NDIS_HANDLE MacBindingHandle, + IN PNDIS_REQUEST NdisRequest, + IN BOOLEAN Set + ); + +NDIS_STATUS +NdisMChangeFddiAddresses( + IN UINT oldLongAddressCount, + IN CHAR oldLongAddresses[][6], + IN UINT newLongAddressCount, + IN CHAR newLongAddresses[][6], + IN UINT oldShortAddressCount, + IN CHAR oldShortAddresses[][2], + IN UINT newShortAddressCount, + IN CHAR newShortAddresses[][2], + IN NDIS_HANDLE MacBindingHandle, + IN PNDIS_REQUEST NdisRequest, + IN BOOLEAN Set + ); + +NDIS_STATUS +NdisMSend( + IN NDIS_HANDLE NdisBindingHandle, + IN PNDIS_PACKET Packet + ); + +NDIS_STATUS +NdisMTransferData( + IN NDIS_HANDLE NdisBindingHandle, + IN NDIS_HANDLE MacReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer, + IN OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred + ); + +NDIS_STATUS +NdisMArcTransferData( + IN NDIS_HANDLE NdisBindingHandle, + IN NDIS_HANDLE MacReceiveContext, + IN UINT ByteOffset, + IN UINT BytesToTransfer, + IN OUT PNDIS_PACKET Packet, + OUT PUINT BytesTransferred + ); + +NDIS_STATUS +NdisMReset( + IN NDIS_HANDLE NdisBindingHandle + ); + +NDIS_STATUS +NdisMRequest( + IN NDIS_HANDLE NdisBindingHandle, + IN PNDIS_REQUEST NdisRequest + ); + + +// +// Operating System Requests +// + +EXPORT +NDIS_STATUS +NdisMAllocateMapRegisters( + IN NDIS_HANDLE MiniportAdapterHandle, + IN UINT DmaChannel, + IN BOOLEAN Dma32BitAddresses, + IN ULONG PhysicalMapRegistersNeeded, + IN ULONG MaximumPhysicalMapping + ); + +EXPORT +VOID +NdisMFreeMapRegisters( + IN NDIS_HANDLE MiniportAdapterHandle + ); + +EXPORT +NDIS_STATUS +NdisMRegisterIoPortRange( + OUT PVOID *PortOffset, + IN NDIS_HANDLE MiniportAdapterHandle, + IN UINT InitialPort, + IN UINT NumberOfPorts + ); + +EXPORT +VOID +NdisMDeregisterIoPortRange( + IN NDIS_HANDLE MiniportAdapterHandle, + IN UINT InitialPort, + IN UINT NumberOfPorts, + IN PVOID PortOffset + ); + +EXPORT +NDIS_STATUS +NdisMMapIoSpace( + OUT PVOID * VirtualAddress, + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, + IN UINT Length + ); + +EXPORT +VOID +NdisMUnmapIoSpace( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PVOID VirtualAddress, + IN UINT Length + ); + +EXPORT +NDIS_STATUS +NdisMRegisterInterrupt( + OUT PNDIS_MINIPORT_INTERRUPT Interrupt, + IN NDIS_HANDLE MiniportAdapterHandle, + IN UINT InterruptVector, + IN UINT InterruptLevel, + IN BOOLEAN RequestIsr, + IN BOOLEAN SharedInterrupt, + IN NDIS_INTERRUPT_MODE InterruptMode + ); + +EXPORT +VOID +NdisMDeregisterInterrupt( + IN PNDIS_MINIPORT_INTERRUPT Interrupt + ); + +EXPORT +BOOLEAN +NdisMSynchronizeWithInterrupt( + IN PNDIS_MINIPORT_INTERRUPT Interrupt, + IN PVOID SynchronizeFunction, + IN PVOID SynchronizeContext + ); + + +EXPORT +NDIS_STATUS +NdisMQueryAdapterResources( + OUT PNDIS_STATUS Status, + IN NDIS_HANDLE WrapperConfigurationContext, + OUT PNDIS_RESOURCE_LIST ResourceList, + IN OUT PUINT BufferSize + ); + +// +// Timers +// + +/*++ +VOID +NdisMSetTimer( + IN PNDIS_MINIPORT_TIMER Timer, + IN UINT MillisecondsToDelay + ); +--*/ +#define NdisMSetTimer(_Timer, _Delay) NdisSetTimer((PNDIS_TIMER)(_Timer), _Delay) + +EXPORT +VOID +NdisMInitializeTimer( + IN OUT PNDIS_MINIPORT_TIMER Timer, + IN NDIS_HANDLE MiniportAdapterHandle, + IN PNDIS_TIMER_FUNCTION TimerFunction, + IN PVOID FunctionContext + ); + +EXPORT +VOID +NdisMCancelTimer( + IN PNDIS_MINIPORT_TIMER Timer, + OUT PBOOLEAN TimerCancelled + ); + +// +// Physical Mapping +// + +#define NdisMStartBufferPhysicalMappingMacro( \ + _MiniportAdapterHandle, \ + _Buffer, \ + _PhysicalMapRegister, \ + _Write, \ + _PhysicalAddressArray, \ + _ArraySize \ + ) \ +{ \ + PNDIS_MINIPORT_BLOCK _Miniport = (PNDIS_MINIPORT_BLOCK)(_MiniportAdapterHandle); \ + PHYSICAL_ADDRESS _LogicalAddress; \ + PUCHAR _VirtualAddress; \ + ULONG _LengthRemaining; \ + ULONG _LengthMapped; \ + UINT _CurrentArrayLocation; \ + _VirtualAddress = MmGetMdlVirtualAddress(_Buffer); \ + _LengthRemaining = MmGetMdlByteCount(_Buffer); \ + _CurrentArrayLocation = 0; \ + while (_LengthRemaining > 0) { \ + _LengthMapped = _LengthRemaining; \ + _LogicalAddress = \ + IoMapTransfer( \ + NULL, \ + (_Buffer), \ + _Miniport->MapRegisters[_PhysicalMapRegister].MapRegister, \ + _VirtualAddress, \ + &_LengthMapped, \ + (_Write)); \ + (_PhysicalAddressArray)[_CurrentArrayLocation].PhysicalAddress = _LogicalAddress; \ + (_PhysicalAddressArray)[_CurrentArrayLocation].Length = _LengthMapped; \ + _LengthRemaining -= _LengthMapped; \ + _VirtualAddress += _LengthMapped; \ + ++_CurrentArrayLocation; \ + } \ + _Miniport->MapRegisters[_PhysicalMapRegister].WriteToDevice = (_Write); \ + *(_ArraySize) = _CurrentArrayLocation; \ +} + +#if BINARY_COMPATIBLE + +EXPORT +VOID +NdisMStartBufferPhysicalMapping( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PNDIS_BUFFER Buffer, + IN ULONG PhysicalMapRegister, + IN BOOLEAN WriteToDevice, + OUT PNDIS_PHYSICAL_ADDRESS_UNIT PhysicalAddressArray, + OUT PUINT ArraySize + ); + +#else + +#define NdisMStartBufferPhysicalMapping( \ + _MiniportAdapterHandle, \ + _Buffer, \ + _PhysicalMapRegister, \ + _Write, \ + _PhysicalAddressArray, \ + _ArraySize \ + ) \ + NdisMStartBufferPhysicalMappingMacro( \ + (_MiniportAdapterHandle), \ + (_Buffer), \ + (_PhysicalMapRegister), \ + (_Write), \ + (_PhysicalAddressArray), \ + (_ArraySize) \ + ) + +#endif + +#define NdisMCompleteBufferPhysicalMappingMacro( \ + _MiniportAdapterHandle, \ + _Buffer, \ + _PhysicalMapRegister \ + ) { \ + PNDIS_MINIPORT_BLOCK _Miniport = (PNDIS_MINIPORT_BLOCK)(_MiniportAdapterHandle); \ + IoFlushAdapterBuffers( \ + NULL, \ + _Buffer, \ + _Miniport->MapRegisters[_PhysicalMapRegister].MapRegister, \ + MmGetMdlVirtualAddress(_Buffer), \ + MmGetMdlByteCount(_Buffer), \ + _Miniport->MapRegisters[_PhysicalMapRegister].WriteToDevice); \ +} + +#if BINARY_COMPATIBLE + +EXPORT +VOID +NdisMCompleteBufferPhysicalMapping( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PNDIS_BUFFER Buffer, + IN ULONG PhysicalMapRegister + ); + +#else + +#define NdisMCompleteBufferPhysicalMapping( \ + _MiniportAdapterHandle, \ + _Buffer, \ + _PhysicalMapRegister \ + ) \ + NdisMCompleteBufferPhysicalMappingMacro( \ + (_MiniportAdapterHandle), \ + (_Buffer), \ + (_PhysicalMapRegister) \ + ) + +#endif + +// +// Shared memory +// + +EXPORT +VOID +NdisMAllocateSharedMemory( + IN NDIS_HANDLE MiniportAdapterHandle, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress + ); + +/*++ +VOID +NdisMUpdateSharedMemory( + IN NDIS_HANDLE MiniportAdapterHandle, + IN ULONG Length, + IN PVOID VirtualAddress, + IN NDIS_PHYSICAL_ADDRESS PhysicalAddress + ) +--*/ +#define NdisMUpdateSharedMemory(_H, _L, _V, _P) NdisUpdateSharedMemory(_H, _L, _V, _P) + + +EXPORT +VOID +NdisMFreeSharedMemory( + IN NDIS_HANDLE MiniportAdapterHandle, + IN ULONG Length, + IN BOOLEAN Cached, + IN PVOID VirtualAddress, + IN NDIS_PHYSICAL_ADDRESS PhysicalAddress + ); + + +// +// DMA operations. +// + +EXPORT +NDIS_STATUS +NdisMRegisterDmaChannel( + OUT PNDIS_HANDLE MiniportDmaHandle, + IN NDIS_HANDLE MiniportAdapterHandle, + IN UINT DmaChannel, + IN BOOLEAN Dma32BitAddresses, + IN PNDIS_DMA_DESCRIPTION DmaDescription, + IN ULONG MaximumLength + ); + + +EXPORT +VOID +NdisMDeregisterDmaChannel( + IN PNDIS_HANDLE MiniportDmaHandle + ); + +/*++ +VOID +NdisMSetupDmaTransfer( + OUT PNDIS_STATUS Status, + IN PNDIS_HANDLE MiniportDmaHandle, + IN PNDIS_BUFFER Buffer, + IN ULONG Offset, + IN ULONG Length, + IN BOOLEAN WriteToDevice + ) +--*/ +#define NdisMSetupDmaTransfer(_S, _H, _B, _O, _L, _M_) \ + NdisSetupDmaTransfer(_S, _H, _B, _O, _L, _M_) + +/*++ +VOID +NdisMCompleteDmaTransfer( + OUT PNDIS_STATUS Status, + IN PNDIS_HANDLE MiniportDmaHandle, + IN PNDIS_BUFFER Buffer, + IN ULONG Offset, + IN ULONG Length, + IN BOOLEAN WriteToDevice + ) +--*/ +#define NdisMCompleteDmaTransfer(_S, _H, _B, _O, _L, _M_) \ + NdisCompleteDmaTransfer(_S, _H, _B, _O, _L, _M_) + +EXPORT +ULONG +NdisMReadDmaCounter( + IN NDIS_HANDLE MiniportDmaHandle + ); + + +// +// Requests Used by Miniport Drivers +// + + +#define NdisMInitializeWrapper(_a,_b,_c,_d) NdisInitializeWrapper((_a),(_b),(_c),(_d)) + +EXPORT +NDIS_STATUS +NdisMRegisterMiniport( + IN NDIS_HANDLE NdisWrapperHandle, + IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics, + IN UINT CharacteristicsLength + ); + +EXPORT +VOID +NdisMSetAttributes( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE MiniportAdapterContext, + IN BOOLEAN BusMaster, + IN NDIS_INTERFACE_TYPE AdapterType + ); + +EXPORT +VOID +NdisMSendComplete( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status + ); + +EXPORT +VOID +NdisMSendResourcesAvailable( + IN NDIS_HANDLE MiniportAdapterHandle + ); + +EXPORT +VOID +NdisMTransferDataComplete( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PNDIS_PACKET Packet, + IN NDIS_STATUS Status, + IN UINT BytesTransferred + ); + +EXPORT +VOID +NdisMResetComplete( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_STATUS Status, + IN BOOLEAN AddressingReset + ); + +EXPORT +VOID +NdisMSetInformationComplete( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_STATUS Status + ); + +EXPORT +VOID +NdisMQueryInformationComplete( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_STATUS Status + ); + + +/*++ + +VOID +NdisMEthIndicateReceive( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE MiniportReceiveContext, + IN PVOID HeaderBuffer, + IN UINT HeaderBufferSize, + IN PVOID LookaheadBuffer, + IN UINT LookaheadBufferSize, + IN UINT PacketSize + ) + +--*/ +#define NdisMEthIndicateReceive( _H, _C, _B, _SZ, _L, _LSZ, _PSZ ) \ +{ \ + ASSERT(MINIPORT_LOCK_ACQUIRED((PNDIS_MINIPORT_BLOCK)(_H))); \ + EthFilterDprIndicateReceive( \ + ((PNDIS_MINIPORT_BLOCK)(_H))->EthDB, \ + _C, \ + _B, \ + _B, \ + _SZ, \ + _L, \ + _LSZ, \ + _PSZ \ + ); \ +} + +/*++ + +VOID +NdisMTrIndicateReceive( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE MiniportReceiveContext, + IN PVOID HeaderBuffer, + IN UINT HeaderBufferSize, + IN PVOID LookaheadBuffer, + IN UINT LookaheadBufferSize, + IN UINT PacketSize + ) + +--*/ +#define NdisMTrIndicateReceive( _H, _C, _B, _SZ, _L, _LSZ, _PSZ ) \ +{ \ + ASSERT(MINIPORT_LOCK_ACQUIRED((PNDIS_MINIPORT_BLOCK)(_H))); \ + TrFilterDprIndicateReceive( \ + ((PNDIS_MINIPORT_BLOCK)(_H))->TrDB, \ + _C, \ + _B, \ + _SZ, \ + _L, \ + _LSZ, \ + _PSZ \ + ); \ +} + +/*++ + +VOID +NdisMFddiIndicateReceive( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_HANDLE MiniportReceiveContext, + IN PVOID HeaderBuffer, + IN UINT HeaderBufferSize, + IN PVOID LookaheadBuffer, + IN UINT LookaheadBufferSize, + IN UINT PacketSize + ) + +--*/ + +#define NdisMFddiIndicateReceive( _H, _C, _B, _SZ, _L, _LSZ, _PSZ ) \ +{ \ + ASSERT(MINIPORT_LOCK_ACQUIRED((PNDIS_MINIPORT_BLOCK)(_H))); \ + \ + FddiFilterDprIndicateReceive( \ + ((PNDIS_MINIPORT_BLOCK)(_H))->FddiDB, \ + _C, \ + (PUCHAR)_B + 1, \ + ((((PUCHAR)_B)[0] & 0x40) ? FDDI_LENGTH_OF_LONG_ADDRESS \ + : FDDI_LENGTH_OF_SHORT_ADDRESS), \ + _B, \ + _SZ, \ + _L, \ + _LSZ, \ + _PSZ \ + ); \ +} + +/*++ + +VOID +NdisMArcIndicateReceive( + IN NDIS_HANDLE MiniportAdapterHandle, + IN PUCHAR pRawHeader, // Pointer to Arcnet frame header + IN PUCHAR pData, // Pointer to data portion of Arcnet frame + IN UINT Length // Data Length + ) + +--*/ +#define NdisMArcIndicateReceive( _H, _HD, _D, _SZ) \ +{ \ + ASSERT(MINIPORT_LOCK_ACQUIRED((PNDIS_MINIPORT_BLOCK)(_H))); \ + ArcFilterDprIndicateReceive( \ + ((PNDIS_MINIPORT_BLOCK)(_H))->ArcDB, \ + _HD, \ + _D, \ + _SZ \ + ); \ +} + +// +// Used only internally by the wrapper and filter package. +// +VOID +NdisMArcIndicateEthEncapsulatedReceive( + IN PNDIS_MINIPORT_BLOCK Miniport, + IN PVOID HeaderBuffer, + IN PVOID DataBuffer, + IN UINT Length + ); + + + + +/*++ + +VOID +NdisMEthIndicateReceiveComplete( + IN NDIS_HANDLE MiniportAdapterHandle + ); + +--*/ + +#define NdisMEthIndicateReceiveComplete( _H ) \ +{ \ + PNDIS_MINIPORT_BLOCK _M_ = (PNDIS_MINIPORT_BLOCK)_H; \ + ASSERT(MINIPORT_LOCK_ACQUIRED(_M_)); \ + EthFilterDprIndicateReceiveComplete(_M_->EthDB); \ +} + +/*++ + +VOID +NdisMTrIndicateReceiveComplete( + IN NDIS_HANDLE MiniportAdapterHandle + ); + +--*/ + +#define NdisMTrIndicateReceiveComplete( _H ) \ +{ \ + PNDIS_MINIPORT_BLOCK _M_ = (PNDIS_MINIPORT_BLOCK)_H; \ + ASSERT(MINIPORT_LOCK_ACQUIRED(_M_)); \ + TrFilterDprIndicateReceiveComplete(_M_->TrDB); \ +} + +/*++ + +VOID +NdisMFddiIndicateReceiveComplete( + IN NDIS_HANDLE MiniportAdapterHandle + ); + +--*/ + +#define NdisMFddiIndicateReceiveComplete( _H ) \ +{ \ + PNDIS_MINIPORT_BLOCK _M_ = (PNDIS_MINIPORT_BLOCK)_H; \ + ASSERT(MINIPORT_LOCK_ACQUIRED(_M_)); \ + FddiFilterDprIndicateReceiveComplete(_M_->FddiDB); \ +} + +/*++ + +VOID +NdisMArcIndicateReceiveComplete( + IN NDIS_HANDLE MiniportAdapterHandle + ); + +--*/ + +#define NdisMArcIndicateReceiveComplete( _H ) \ +{ \ + PNDIS_MINIPORT_BLOCK _M_ = (PNDIS_MINIPORT_BLOCK)_H; \ + ASSERT(MINIPORT_LOCK_ACQUIRED(_M_)); \ + \ + if ( _M_->EthDB ) { \ + EthFilterDprIndicateReceiveComplete(_M_->EthDB); \ + } \ + \ + ArcFilterDprIndicateReceiveComplete(_M_->ArcDB); \ +} + +EXPORT +VOID +NdisMIndicateStatus( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_STATUS GeneralStatus, + IN PVOID StatusBuffer, + IN UINT StatusBufferSize + ); + +EXPORT +VOID +NdisMIndicateStatusComplete( + IN NDIS_HANDLE MiniportAdapterHandle + ); + +EXPORT +VOID +NdisMRegisterAdapterShutdownHandler( + IN NDIS_HANDLE MiniportHandle, + IN PVOID ShutdownContext, + IN ADAPTER_SHUTDOWN_HANDLER ShutdownHandler + ); + +EXPORT +VOID +NdisMDeregisterAdapterShutdownHandler( + IN NDIS_HANDLE MiniportHandle + ); + +EXPORT +NDIS_STATUS +NdisMPciAssignResources( + IN NDIS_HANDLE MiniportHandle, + IN ULONG SlotNumber, + IN PNDIS_RESOURCE_LIST *AssignedResources + ); + + |