NT4/private/ntos/ndis/sonic/sonicsft.h
2020-09-30 17:12:29 +02:00

1040 lines
24 KiB
C

/*++
Copyright (c) 1990-1992 Microsoft Corporation
Module Name:
sonicsft.h
Abstract:
The main header for a SONIC NDIS driver.
The overall structure is taken from the Lance driver
by Tony Ercolano.
Author:
Anthony V. Ercolano (tonye) creation-date 19-Jun-1990
Adam Barr (adamba) 20-Nov-1990
Environment:
This driver is expected to work in DOS, OS2 and NT at the equivalent
of kernel mode.
Architecturally, there is an assumption in this driver that we are
on a little endian machine.
Revision History:
--*/
#ifndef _SONICSFT_
#define _SONICSFT_
//
// We use STATIC to define procedures that will be static in the
// final build but which we now make extern to allow them to be
// debugged (breakpoints can be set on them).
//
#if DEVL
#define STATIC
#else
#define STATIC static
#endif
//
// This variable is used to control debug output.
//
#if DBG
extern INT SonicDbg;
#endif
//
// Used when registering ourselves with NDIS.
//
#define SONIC_NDIS_MAJOR_VERSION 3
#define SONIC_NDIS_MINOR_VERSION 0
//
// The maximum number of bytes that we will pass to an NDIS
// indication (since we receive packets contiguously, there is
// no reason to limit this). This number includes header and
// data.
//
#define SONIC_INDICATE_MAXIMUM 1514
//
// The maximum number of bytes we will pass to a loopback
// indication (unless it all is in one buffer). This number
// includes only data, not the header.
//
#define SONIC_LOOPBACK_MAXIMUM 208
//
// Used for parsing OIDs
//
#define OID_TYPE_MASK 0xffff0000
#define OID_TYPE_GENERAL_OPERATIONAL 0x00010000
#define OID_TYPE_GENERAL_STATISTICS 0x00020000
#define OID_TYPE_802_3_OPERATIONAL 0x01010000
#define OID_TYPE_802_3_STATISTICS 0x01020000
#define OID_REQUIRED_MASK 0x0000ff00
#define OID_REQUIRED_MANDATORY 0x00000100
#define OID_REQUIRED_OPTIONAL 0x00000200
#define OID_INDEX_MASK 0x000000ff
//
// Indexes in the GeneralMandatory array.
//
#define GM_TRANSMIT_GOOD 0x00
#define GM_RECEIVE_GOOD 0x01
#define GM_TRANSMIT_BAD 0x02
#define GM_RECEIVE_BAD 0x03
#define GM_RECEIVE_NO_BUFFER 0x04
#define GM_ARRAY_SIZE 0x05
//
// Indexes in the GeneralOptional array. There are
// two sections, the ones up to COUNT_ARRAY_SIZE
// have entries for number (4 bytes) and number of
// bytes (8 bytes), the rest are a normal array.
//
#define GO_DIRECTED_TRANSMITS 0x00
#define GO_MULTICAST_TRANSMITS 0x01
#define GO_BROADCAST_TRANSMITS 0x02
#define GO_DIRECTED_RECEIVES 0x03
#define GO_MULTICAST_RECEIVES 0x04
#define GO_BROADCAST_RECEIVES 0x05
#define GO_COUNT_ARRAY_SIZE 0x06
#define GO_ARRAY_START 0x0C
#define GO_RECEIVE_CRC 0x0C
#define GO_TRANSMIT_QUEUE_LENGTH 0x0D
#define GO_ARRAY_SIZE 0x0E
//
// Indexes in the MediaMandatory array.
//
#define MM_RECEIVE_ERROR_ALIGNMENT 0x00
#define MM_TRANSMIT_ONE_COLLISION 0x01
#define MM_TRANSMIT_MORE_COLLISIONS 0x02
#define MM_ARRAY_SIZE 0x03
//
// Indexes in the MediaOptional array.
//
#define MO_TRANSMIT_DEFERRED 0x00
#define MO_TRANSMIT_MAX_COLLISIONS 0x01
#define MO_RECEIVE_OVERRUN 0x02
#define MO_TRANSMIT_UNDERRUN 0x03
#define MO_TRANSMIT_HEARTBEAT_FAILURE 0x04
#define MO_TRANSMIT_TIMES_CRS_LOST 0x05
#define MO_TRANSMIT_LATE_COLLISIONS 0x06
#define MO_ARRAY_SIZE 0x07
//
// Macros used for memory allocation and deallocation.
//
// Note that for regular memory we put no limit on the physical
// address, but for contiguous and noncached we limit it to
// 32 bits since that is all the card can handle (presumably
// such memory will be DMAed to/from by the card).
//
#define SONIC_ALLOC_MEMORY(_Status, _Address, _Length) \
{ \
NDIS_PHYSICAL_ADDRESS Temp = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1); \
*(_Status) = NdisAllocateMemory( \
(PVOID)(_Address), \
(_Length), \
0, \
Temp \
); \
}
#define SONIC_FREE_MEMORY(_Address, _Length) \
NdisFreeMemory( \
(PVOID)(_Address), \
(_Length), \
0 \
)
#define SONIC_ALLOC_CONTIGUOUS_MEMORY(_Status, _Address, _Length) \
{ \
NDIS_PHYSICAL_ADDRESS Temp = NDIS_PHYSICAL_ADDRESS_CONST(-1, 0); \
*(_Status) = NdisAllocateMemory( \
(PVOID)(_Address), \
(_Length), \
NDIS_MEMORY_CONTIGUOUS, \
Temp \
); \
}
#define SONIC_FREE_CONTIGUOUS_MEMORY(_Address, _Length) \
NdisFreeMemory( \
(PVOID)(_Address), \
(_Length), \
NDIS_MEMORY_CONTIGUOUS \
)
#define SONIC_ALLOC_NONCACHED_MEMORY(_Status, _Address, _Length) \
{ \
NDIS_PHYSICAL_ADDRESS Temp = NDIS_PHYSICAL_ADDRESS_CONST(-1, 0); \
*(_Status) = NdisAllocateMemory( \
(PVOID)(_Address), \
(_Length), \
NDIS_MEMORY_CONTIGUOUS | NDIS_MEMORY_NONCACHED, \
Temp \
); \
}
#define SONIC_FREE_NONCACHED_MEMORY(_Address, _Length) \
NdisFreeMemory( \
(PVOID)(_Address), \
(_Length), \
NDIS_MEMORY_CONTIGUOUS | NDIS_MEMORY_NONCACHED \
)
//
// Macros to move and zero memory.
//
#define SONIC_MOVE_MEMORY(Destination,Source,Length) NdisMoveMemory(Destination,Source,Length)
#define SONIC_ZERO_MEMORY(Destination,Length) NdisZeroMemory(Destination,Length)
//
// Used to record the 8-byte counters.
//
typedef struct _SONIC_LARGE_INTEGER {
ULONG LowPart;
ULONG HighPart;
} SONIC_LARGE_INTEGER, *PSONIC_LARGE_INTEGER;
//
// This initializes an 8-byte counter.
//
#define SonicZeroLargeInteger(LargeInteger) \
{ \
LargeInteger.LowPart = 0L;\
LargeInteger.HighPart = 0L; \
}
//
// This adds a longword to an 8-byte counter.
//
#define SonicAddUlongToLargeInteger(LargeInteger, Ulong) \
{ \
PSONIC_LARGE_INTEGER TmpLarge = (LargeInteger); \
TmpLarge->LowPart += (ULONG)Ulong; \
if (TmpLarge->LowPart < (ULONG)Ulong) { \
++TmpLarge->HighPart; \
} \
}
//
// This flushes a buffer for write.
//
#define SONIC_FLUSH_WRITE_BUFFER(Buffer) \
NdisFlushBuffer( \
Buffer, \
TRUE \
)
//
// This record type is used to store sonic global data.
//
typedef struct _SONIC_DRIVER {
//
// The handle returned by NdisMInitializeWrapper.
//
NDIS_HANDLE WrapperHandle;
} SONIC_DRIVER, *PSONIC_DRIVER;
//
// This identifies the type of the packet for quick reference
// in the SONIC_PACKET_RESERVED.PacketType field.
//
#define SONIC_DIRECTED 1
#define SONIC_MULTICAST 2
#define SONIC_BROADCAST 3
#define SONIC_LOOPBACK 4
//
// This record type is inserted into the MiniportReserved portion
// of the packet header.
//
typedef struct _SONIC_PACKET_RESERVED {
//
// Points to the next packet in the chain of queued packets
// being allocated, or waiting for the finish of transmission.
//
// The packet will either be on the stage list for allocation,
// or on an adapter wide doubly linked list (see below) for
// post transmission processing.
//
PNDIS_PACKET Next;
//
// If TRUE then the packet caused an adapter buffer to
// be allocated.
//
BOOLEAN UsedSonicBuffer;
//
// If the previous field was TRUE then this gives the
// index into the array of adapter buffer descriptors that
// contains the old packet information.
//
UCHAR SonicBuffersIndex;
//
// Gives the index into the ring to packet structure as well
// as the ring descriptors.
//
USHORT DescriptorIndex;
} SONIC_PACKET_RESERVED,*PSONIC_PACKET_RESERVED;
//
// This macro will return a pointer to the sonic reserved portion
// of a packet given a pointer to a packet.
//
#define PSONIC_RESERVED_FROM_PACKET(Packet) \
((PSONIC_PACKET_RESERVED)((PVOID)((Packet)->MiniportReserved)))
//
// The return code from a multicast operation.
//
typedef enum { CAM_LOADED, CAM_NOT_LOADED } MULTICAST_STATUS;
//
// This structure is used to map entries in the ring descriptors
// back to the packets from which the data in the ring descriptor
// originated.
//
typedef struct _SONIC_DESCRIPTOR_TO_PACKET {
//
// Points to the packet from which data is being transmitted
// through this ring entry.
//
PNDIS_PACKET OwningPacket;
//
// Location of our link field.
//
SONIC_PHYSICAL_ADDRESS * LinkPointer;
//
// Location of the previous link field.
//
SONIC_PHYSICAL_ADDRESS * PrevLinkPointer;
//
// When a packet is submitted to the hardware we record
// here whether it used adapter buffers and if so, the buffer
// index.
//
UINT SonicBuffersIndex;
BOOLEAN UsedSonicBuffer;
} SONIC_DESCRIPTOR_TO_PACKET,*PSONIC_DESCRIPTOR_TO_PACKET;
//
// If an ndis packet does not meet the hardware contraints then
// an adapter buffer will be allocated. Enough data will be copied
// out of the ndis packet so that by using a combination of the
// adapter buffer and remaining ndis buffers the hardware
// constraints are satisfied.
//
// In the SONIC_ADAPTER structure three threaded lists are kept in
// one array. One points to a list of SONIC_BUFFER_DESCRIPTORS
// that point to small adapter buffers. Another is for medium sized
// buffers and the last for full sized (large) buffers.
//
// The allocation is controlled via a free list head and
// the free lists are "threaded" by a field in the adapter buffer
// descriptor.
//
typedef struct _SONIC_BUFFER_DESCRIPTOR {
//
// A Physical pointer to a small, medium, or large buffer.
//
NDIS_PHYSICAL_ADDRESS PhysicalSonicBuffer;
//
// A virtual pointer to a small, medium, or large buffer.
//
PVOID VirtualSonicBuffer;
//
// This is used to flush the buffer when it is used.
//
PNDIS_BUFFER FlushBuffer;
//
// Threads the elements of an array of these descriptors into
// a free list. -1 implies no more entries in the list.
//
INT Next;
//
// Holds the length of data placed into the buffer. This
// can (and likely will) be less that the actual buffers
// length.
//
UINT DataLength;
} SONIC_BUFFER_DESCRIPTOR,*PSONIC_BUFFER_DESCRIPTOR;
//
// This is the basic structure that defines the state of an
// adapter. There is one of these allocate per adapter that
// the sonic driver supports.
//
typedef struct _SONIC_ADAPTER {
//
// Will be true the first time that the hardware is initialized
// by the driver initialization.
//
BOOLEAN FirstInitialization;
//
// The type of the adapter; current supported values are:
//
// 1: EISA 9010E/B card from National Semiconductor
// 2: Sonic chip on the MIPS R4000 motherbaord.
//
UCHAR AdapterType;
//
// TRUE if the permanent address is valid. On some cards the
// permanent address is read by SonicHardwareGetDetails;
// if not, it is read later by SonicHardwareGetAddress.
//
BOOLEAN PermanentAddressValid;
//
// The burned-in network address from the hardware.
//
CHAR PermanentNetworkAddress[ETH_LENGTH_OF_ADDRESS];
//
// The current network address from the hardware.
//
CHAR CurrentNetworkAddress[ETH_LENGTH_OF_ADDRESS];
//
// This is the buffer pool used to allocate flush buffers
// out of.
//
NDIS_HANDLE FlushBufferPoolHandle;
//
// Holds the interrupt object for this adapter.
//
NDIS_MINIPORT_INTERRUPT Interrupt;
//
// TRUE if the adapter is latched, FALSE for level-sensitive.
//
BOOLEAN InterruptLatched;
//
// Holds a value for simulating an interrupt.
//
USHORT SimulatedIsr;
//
// The current value to put in the Receive Control Register.
//
USHORT ReceiveControlRegister;
//
// The value that the Data Configuration Register should be
// initialized to.
//
USHORT DataConfigurationRegister;
//
// Have we receive an unacknowledged Receive Buffers
// Exhausted interrupt.
//
BOOLEAN ReceiveBuffersExhausted;
//
// Have we receive an unacknowledged Receive Descriptors
// Exhausted interrupt.
//
BOOLEAN ReceiveDescriptorsExhausted;
//
// Flag used for checking if a transmit interrupt was dropped.
//
BOOLEAN WakeUpTimeout;
//
// Used to limit the number of error log entries written.
//
UCHAR WakeUpErrorCount;
//
// Location of the beginning of the SONIC ports.
//
ULONG SonicPortAddress;
//
// Number of ports in use
//
UINT NumberOfPorts;
//
// Hardware address of the first port.
//
UINT InitialPort;
//
// The number of bits that port numbers need to be shifted left
// before adding them to PortAddress (1 for 16-bit ports, 2
// for 32-bit ports).
//
UINT PortShift;
//
// The virtual address of the blank buffer used for padding.
//
PUCHAR BlankBuffer;
//
// The Physical address of the blank buffer used for padding.
//
NDIS_PHYSICAL_ADDRESS BlankBufferAddress;
//
// Handle given by NDIS when the adapter was registered.
//
NDIS_HANDLE MiniportAdapterHandle;
//
// The current packet filter.
//
UINT CurrentPacketFilter;
//
// The value of the bits in CamEnable, except for
// the first one (which is for our network address);
// as opposed to the value stored in the real CamEnable,
// which may have some bits off if multicast addresses
// are not included in the current packet filter.
//
UINT MulticastCamEnableBits;
//
// The number of transmit descriptors.
//
UINT NumberOfTransmitDescriptors;
//
// The number of receive buffers
//
UINT NumberOfReceiveBuffers;
//
// The number of receive descriptors
//
UINT NumberOfReceiveDescriptors;
//
// Pointer to the transmit descriptors (this is
// allocated to be of size NumberOfTransmitDescriptors).
//
PSONIC_TRANSMIT_DESCRIPTOR TransmitDescriptorArea;
//
// The physical address of the transmit descriptor area.
//
NDIS_PHYSICAL_ADDRESS TransmitDescriptorAreaPhysical;
//
// Pointer to the last transmit descriptor.
//
PSONIC_TRANSMIT_DESCRIPTOR LastTransmitDescriptor;
//
// Counter that records the number of transmit rings currently
// available for allocation.
//
UINT NumberOfAvailableDescriptors;
//
// This is used to determine whether to use the programmable
// interrupt on a packet or not.
//
UINT PacketsSinceLastInterrupt;
//
// Pointer to transmit descriptor ring entry that is the
// first ring entry available for allocation of transmit
// buffers.
//
// Can only be accessed when the adapter lock
// is held.
//
PSONIC_TRANSMIT_DESCRIPTOR AllocateableDescriptor;
//
// Pointer to a transmit descriptor ring entry that is the
// first ring entry that the MAC currently has made available
// for transmission.
//
// Can only be accessed when the adapter lock
// is held.
//
PSONIC_TRANSMIT_DESCRIPTOR TransmittingDescriptor;
//
// Pointer to the first packet that has been allocated to
// a transmit packet but has not yet been relinquished to
// the hardware. We need this pointer to keep the transmit
// post processing from running into a packet that has not
// been transmitted.
//
PSONIC_TRANSMIT_DESCRIPTOR FirstUncommittedDescriptor;
//
// Pointer to an array of structs that map transmit ring entries
// back to a packet (this is allocated to be of size
// NumberOfTransmitDescriptors).
//
PSONIC_DESCRIPTOR_TO_PACKET DescriptorToPacket;
//
// Pointer to the receive resource area (this is
// allocated to be of size NumberofReceiveBuffers).
//
PSONIC_RECEIVE_RESOURCE ReceiveResourceArea;
//
// The physical address of ReceiveResourceArea.
//
NDIS_PHYSICAL_ADDRESS ReceiveResourceAreaPhysical;
//
// Pointer to the array holding the receive buffers (this
// is allocated to be of size NumberofReceiveBuffers).
//
PVOID * ReceiveBufferArea;
PNDIS_BUFFER * ReceiveNdisBufferArea;
//
// The RBA which we are currently taking packets out of
// (will be one of the entries in the ReceiveBufferArea
// array).
//
UINT CurrentReceiveBufferIndex;
//
// Pointer to the receive descriptor area
// (this is allocated to be of size NumberOfReceiveDescriptors).
//
PSONIC_RECEIVE_DESCRIPTOR ReceiveDescriptorArea;
//
// The physical address of ReceiveDescriptorArea
//
NDIS_PHYSICAL_ADDRESS ReceiveDescriptorAreaPhysical;
//
// The last receive descriptor in the area.
//
PSONIC_RECEIVE_DESCRIPTOR LastReceiveDescriptor;
//
// The index receive descriptor we should look at next (will be
// one of the entries in ReceiveDescriptorArea).
//
UINT CurrentReceiveDescriptorIndex;
//
// Pointer to the CAM descriptor area. This will be
// located directly after the receive resource area,
// the separate pointer is for convenience.
//
PSONIC_CAM_DESCRIPTOR_AREA CamDescriptorArea;
//
// The physical address corresponding to CamDescriptorArea.
// This is stored as a 4-byte address since it is just
// a fixed offset from ReceiveResourceAreaPhysical and
// is not allocated with NdisAllocateSharedMemory.
//
SONIC_PHYSICAL_ADDRESS CamDescriptorAreaPhysical;
//
// This is used to flush the CAM descriptor area.
//
PNDIS_BUFFER CamDescriptorAreaFlushBuffer;
//
// The last entry in the CAM that is used.
//
UINT CamDescriptorAreaSize;
//
// An bitmask showing which entries in the CAM are
// used or reserved for use.
//
UINT CamDescriptorsUsed;
//
// Pointer to the first transmitting packet that is actually
// sending.
//
PNDIS_PACKET FirstFinishTransmit;
//
// Pointer to the last transmitting packet that is actually
// sending.
//
PNDIS_PACKET LastFinishTransmit;
//
// Listheads for the adapters buffers. If the list
// head is equal to -1 then there are no free elements
// on the list.
//
// The list heads must only be accessed when the
// adapter lock is held.
//
// Note that the listhead at index 0 will always be -1.
//
INT SonicBufferListHeads[4];
//
// Pointers to an array of adapter buffer descriptors.
// The array will actually be threaded together by
// three free lists. The lists will be for small,
// medium and full sized packets.
//
PSONIC_BUFFER_DESCRIPTOR SonicBuffers;
//
// This holds the actual memory used by the small
// sonic buffers (so that it can be a single piece
// of memory and therefore only use a single physical
// address.
//
PVOID SmallSonicBuffers;
//
// This holds the memory for the medium sonic buffers.
//
PVOID MediumSonicBuffers;
//
// Flag that when enabled lets routines know that a reset
// is in progress, for the purposes of blocking other
// requests (except other resets).
//
BOOLEAN ResetInProgress;
//
// Has there been a hardware failure
//
BOOLEAN HardwareFailure;
//
// Count how often we log an error from finding a packet in
// the wrong RBA.
//
USHORT WrongRbaErrorLogCount;
//
// These hold adapter statistics.
//
ULONG GeneralMandatory[GM_ARRAY_SIZE];
SONIC_LARGE_INTEGER GeneralOptionalByteCount[GO_COUNT_ARRAY_SIZE];
ULONG GeneralOptionalFrameCount[GO_COUNT_ARRAY_SIZE];
ULONG GeneralOptional[GO_ARRAY_SIZE - GO_ARRAY_START];
ULONG MediaMandatory[MM_ARRAY_SIZE];
ULONG MediaOptional[MO_ARRAY_SIZE];
//
// For indicating loopback packets.
//
UCHAR Loopback[SONIC_LOOPBACK_MAXIMUM];
} SONIC_ADAPTER,*PSONIC_ADAPTER;
//
// Given a MacContextHandle return the PSONIC_ADAPTER
// it represents.
//
#define PSONIC_ADAPTER_FROM_CONTEXT_HANDLE(Handle) \
((PSONIC_ADAPTER)((PVOID)(Handle)))
//
// procedures which do error logging
//
typedef enum _SONIC_PROC_ID{
registerAdapter,
openAdapter,
hardwareDetails,
handleDeferred,
processReceiveInterrupts
} SONIC_PROC_ID;
//
// Error log values
//
#define SONIC_ERRMSG_INIT_INTERRUPT (ULONG)0x01
#define SONIC_ERRMSG_CREATE_FILTER (ULONG)0x02
#define SONIC_ERRMSG_ALLOC_MEMORY (ULONG)0x03
#define SONIC_ERRMSG_REGISTER_ADAPTER (ULONG)0x04
#define SONIC_ERRMSG_ALLOC_DEVICE_NAME (ULONG)0x05
#define SONIC_ERRMSG_ALLOC_ADAPTER (ULONG)0x06
#define SONIC_ERRMSG_INITIAL_INIT (ULONG)0x07
#define SONIC_ERRMSG_OPEN_DB (ULONG)0x08
#define SONIC_ERRMSG_ALLOC_OPEN (ULONG)0x09
#define SONIC_ERRMSG_HARDWARE_ADDRESS (ULONG)0x0A
#define SONIC_ERRMSG_WRONG_RBA (ULONG)0x0B
//
// Definitions of sonic functions which are used by multiple
// source files.
//
//
// alloc.c
//
extern
BOOLEAN
AllocateAdapterMemory(
IN PSONIC_ADAPTER Adapter
);
extern
VOID
DeleteAdapterMemory(
IN PSONIC_ADAPTER Adapter
);
//
// interrup.c
//
extern
VOID
SonicDisableInterrupt(
IN NDIS_HANDLE MiniportAdapterContext
);
extern
VOID
SonicEnableInterrupt(
IN NDIS_HANDLE MiniportAdapterContext
);
extern
VOID
SonicHandleInterrupt(
IN NDIS_HANDLE MiniportAdapterContext
);
extern
VOID
SonicInterruptService(
OUT PBOOLEAN InterruptRecognized,
OUT PBOOLEAN QueueDpc,
IN PVOID Context
);
extern
BOOLEAN
SonicCheckForHang(
IN PVOID MiniportAdapterContext
);
//
// request.c
//
extern
NDIS_STATUS
SonicQueryInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded
);
extern
NDIS_STATUS
SonicSetInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded
);
extern
NDIS_STATUS
SonicChangeClass(
IN UINT OldFilterClasses,
IN UINT NewFilterClasses,
IN NDIS_HANDLE NdisBindingContext,
IN PNDIS_REQUEST NdisRequest,
IN BOOLEAN Set
);
extern
NDIS_STATUS
SonicChangeAddresses(
IN UINT OldAddressCount,
IN CHAR OldAddresses[][ETH_LENGTH_OF_ADDRESS],
IN UINT NewAddressCount,
IN CHAR NewAddresses[][ETH_LENGTH_OF_ADDRESS],
IN NDIS_HANDLE MacBindingHandle,
IN PNDIS_REQUEST NdisRequest,
IN BOOLEAN Set
);
//
// send.c
//
extern
NDIS_STATUS
SonicSend(
IN NDIS_HANDLE MiniportAdapterHandle,
IN PNDIS_PACKET Packet,
IN UINT SendFlags
);
//
// sonic.c
//
extern
VOID
SonicStartChip(
IN PSONIC_ADAPTER Adapter
);
extern
VOID
StartAdapterReset(
IN PSONIC_ADAPTER Adapter
);
extern
VOID
SetupForReset(
IN PSONIC_ADAPTER Adapter
);
extern
VOID
SonicStartCamReload(
IN PSONIC_ADAPTER Adapter
);
extern
NDIS_STATUS
SonicInitialize(
OUT PNDIS_STATUS OpenErrorStatus,
OUT PUINT SelectedMediumIndex,
IN PNDIS_MEDIUM MediumArray,
IN UINT MediumArraySize,
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_HANDLE ConfigurationHandle
);
//
// transfer.c
//
extern
NDIS_STATUS
SonicTransferData(
OUT PNDIS_PACKET Packet,
OUT PUINT BytesTransferred,
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_HANDLE MiniportReceiveContext,
IN UINT ByteOffset,
IN UINT BytesToTransfer
);
#endif // _SONICSFT_