update for HEAD-2003091401
[reactos.git] / drivers / net / ndis / include / miniport.h
1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS NDIS library
4  * FILE:        ndis/miniport.h
5  * PURPOSE:     Definitions for routines used by NDIS miniport drivers
6  */
7
8 #ifndef __MINIPORT_H
9 #define __MINIPORT_H
10
11 #include <ndissys.h>
12
13
14 typedef struct _HARDWARE_ADDRESS {
15     union {
16         UCHAR Medium802_3[ETH_LENGTH_OF_ADDRESS];
17     } Type;
18 } HARDWARE_ADDRESS, *PHARDWARE_ADDRESS;
19
20 /* Information about a miniport */
21 typedef struct _MINIPORT_DRIVER {
22     LIST_ENTRY                      ListEntry;          /* Entry on global list */
23     KSPIN_LOCK                      Lock;               /* Protecting spin lock */
24     ULONG                           RefCount;           /* Reference count */
25     NDIS_MINIPORT_CHARACTERISTICS   Chars;              /* Miniport characteristics */
26     WORK_QUEUE_ITEM                 WorkItem;           /* Work item */
27     PDRIVER_OBJECT                  DriverObject;       /* Driver object of miniport */
28     LIST_ENTRY                      AdapterListHead;    /* Adapters created by miniport */
29     PUNICODE_STRING                 RegistryPath;       /* SCM Registry key */
30 } MINIPORT_DRIVER, *PMINIPORT_DRIVER;
31
32 /* resources allocated on behalf on the miniport */
33 #define MINIPORT_RESOURCE_TYPE_MEMORY 0
34 typedef struct _MINIPORT_RESOURCE {
35     LIST_ENTRY     ListEntry;
36     ULONG          ResourceType;
37     PVOID          Resource;
38 } MINIPORT_RESOURCE, *PMINIPORT_RESOURCE;
39
40 /* Configuration context */
41 typedef struct _MINIPORT_CONFIGURATION_CONTEXT {
42     NDIS_HANDLE    Handle;
43     LIST_ENTRY     ResourceListHead;
44     KSPIN_LOCK     ResourceLock;
45 } MINIPORT_CONFIGURATION_CONTEXT, *PMINIPORT_CONFIGURATION_CONTEXT;
46
47 /* Bugcheck callback context */
48 typedef struct _MINIPORT_BUGCHECK_CONTEXT {
49     PVOID                       DriverContext;
50     ADAPTER_SHUTDOWN_HANDLER    ShutdownHandler;
51     PKBUGCHECK_CALLBACK_RECORD  CallbackRecord;
52 } MINIPORT_BUGCHECK_CONTEXT, *PMINIPORT_BUGCHECK_CONTEXT;
53
54 /* allocated map register list */
55 typedef struct _ADAPTER_MAP_REGISTER_LIST {
56     LIST_ENTRY  ListEntry;
57     UINT        NumRegisters;
58     PVOID       MapRegister;
59 } ADAPTER_MAP_REGISTER_LIST, *PADAPTER_MAP_REGISTER_LIST;
60
61 /* a miniport's shared memory */
62 typedef struct _MINIPORT_SHARED_MEMORY {
63     PADAPTER_OBJECT   AdapterObject;
64     ULONG             Length;
65     PHYSICAL_ADDRESS  PhysicalAddress;
66     PVOID             VirtualAddress;
67     BOOLEAN           Cached;
68 } MINIPORT_SHARED_MEMORY, *PMINIPORT_SHARED_MEMORY;
69
70 #define GET_MINIPORT_DRIVER(Handle)((PMINIPORT_DRIVER)Handle)
71
72 /* detected adapters that are driverless */
73 typedef struct _ORPHAN_ADATER {
74     LIST_ENTRY        ListEntry;
75     NDIS_STRING       RegistryPath;
76     INTERFACE_TYPE    BusType;
77     ULONG             BusNumber;
78     ULONG             SlotNumber;
79 } ORPHAN_ADAPTER, *PORPHAN_ADAPTER;
80
81 /* Information about a logical adapter */
82 typedef struct _LOGICAL_ADAPTER {
83     NDIS_MINIPORT_BLOCK NdisMiniportBlock;                                /* NDIS defined fields */
84
85     KDPC                        MiniportDpc;            /* DPC routine for adapter */
86     BOOLEAN                     MiniportBusy;           /* A MiniportXxx routine is executing */
87     NDIS_HANDLE                 MiniportAdapterBinding; /* Binding handle for current caller */
88     ULONG                       WorkQueueLevel;         /* Number of used work item buffers */
89     NDIS_MINIPORT_WORK_ITEM     WorkQueue[NDIS_MINIPORT_WORK_QUEUE_SIZE];
90     PNDIS_MINIPORT_WORK_ITEM    WorkQueueHead;          /* Head of work queue */
91     PNDIS_MINIPORT_WORK_ITEM    WorkQueueTail;          /* Tail of work queue */
92
93     LIST_ENTRY                  ListEntry;              /* Entry on global list */
94     LIST_ENTRY                  MiniportListEntry;      /* Entry on miniport driver list */
95     LIST_ENTRY                  ProtocolListHead;       /* List of bound protocols */
96     ULONG                       RefCount;               /* Reference count */
97     PMINIPORT_DRIVER            Miniport;               /* Miniport owning this adapter */
98     UNICODE_STRING              DeviceName;             /* Device name of this adapter */
99     ULONG                       Attributes;             /* Attributes of adapter */
100     /* TRUE if the miniport has called NdisSetAttributes(Ex) for this adapter */
101     BOOLEAN                     AttributesSet;
102     PVOID                       QueryBuffer;            /* Buffer to use for queries */
103     ULONG                       QueryBufferLength;      /* Length of QueryBuffer */
104     ULONG                       MediumHeaderSize;       /* Size of medium header */
105     HARDWARE_ADDRESS            Address;                /* Hardware address of adapter */
106     ULONG                       AddressLength;          /* Length of hardware address */
107     PUCHAR                      LookaheadBuffer;        /* Pointer to lookahead buffer */
108     ULONG                       LookaheadLength;        /* Length of lookahead buffer */
109     ULONG                       CurLookaheadLength;     /* Current (selected) length of lookahead buffer */
110     ULONG                       MaxLookaheadLength;     /* Maximum length of lookahead buffer */
111
112     PNDIS_PACKET                PacketQueueHead;        /* Head of packet queue */
113     PNDIS_PACKET                PacketQueueTail;        /* Head of packet queue */
114
115     PNDIS_PACKET                LoopPacket;             /* Current packet beeing looped */
116     PMINIPORT_BUGCHECK_CONTEXT  BugcheckContext;        /* Adapter's shutdown handler */
117     UINT                        MapRegistersRequested;  /* Number of outstanding map registers requested */
118     PADAPTER_OBJECT             AdapterObject;          /* Adapter object for DMA ops */
119     ADAPTER_MAP_REGISTER_LIST   MapRegisterList;        /* List of allocated map registers */
120     KEVENT                      DmaEvent;               /* Event to support DMA register allocation */
121     KSPIN_LOCK                  DmaLock;                /* Spinlock to protect the dma list */
122     UINT                        BusNumber;
123     INTERFACE_TYPE              BusType;
124     UINT                        SlotNumber;
125     ULONG                       Irql;
126     ULONG                       Vector;
127     KAFFINITY                   Affinity;
128     PHYSICAL_ADDRESS            BaseIoAddress;
129     PHYSICAL_ADDRESS            BaseMemoryAddress;      /* multiple ranges? */
130     ULONG                       DmaChannel;
131     ULONG                       DmaPort;
132     PNDIS_MINIPORT_TIMER        Timer;
133 } LOGICAL_ADAPTER, *PLOGICAL_ADAPTER;
134
135 #define GET_LOGICAL_ADAPTER(Handle)((PLOGICAL_ADAPTER)Handle)
136
137 extern LIST_ENTRY MiniportListHead;
138 extern KSPIN_LOCK MiniportListLock;
139 extern LIST_ENTRY AdapterListHead;
140 extern KSPIN_LOCK AdapterListLock;
141
142
143 #ifdef DBG
144 VOID
145 MiniDisplayPacket(
146     PNDIS_PACKET Packet);
147 #endif /* DBG */
148
149 VOID
150 MiniIndicateData(
151     PLOGICAL_ADAPTER    Adapter,
152     NDIS_HANDLE         MacReceiveContext,
153     PVOID               HeaderBuffer,
154     UINT                HeaderBufferSize,
155     PVOID               LookaheadBuffer,
156     UINT                LookaheadBufferSize,
157     UINT                PacketSize);
158
159 BOOLEAN
160 MiniAdapterHasAddress(
161     PLOGICAL_ADAPTER Adapter,
162     PNDIS_PACKET Packet);
163
164 PLOGICAL_ADAPTER
165 MiniLocateDevice(
166     PNDIS_STRING AdapterName);
167
168 NDIS_STATUS
169 MiniQueryInformation(
170     PLOGICAL_ADAPTER    Adapter,
171     NDIS_OID            Oid,
172     ULONG               Size,
173     PULONG              BytesWritten);
174
175 NDIS_STATUS
176 FASTCALL
177 MiniQueueWorkItem(
178     PLOGICAL_ADAPTER    Adapter,
179     NDIS_WORK_ITEM_TYPE WorkItemType,
180     PVOID               WorkItemContext,
181     NDIS_HANDLE         Initiator);
182
183 NDIS_STATUS
184 FASTCALL
185 MiniDequeueWorkItem(
186     PLOGICAL_ADAPTER    Adapter,
187     NDIS_WORK_ITEM_TYPE *WorkItemType,
188     PVOID               *WorkItemContext,
189     NDIS_HANDLE         *Initiator);
190
191 NDIS_STATUS
192 MiniDoRequest(
193     PLOGICAL_ADAPTER Adapter,
194     PNDIS_REQUEST NdisRequest);
195
196 BOOLEAN 
197 NdisFindDevice(
198     UINT   VendorID, 
199     UINT   DeviceID, 
200     PUINT  BusNumber, 
201     PUINT  SlotNumber);
202
203 VOID
204 NdisStartDevices();
205
206 #endif /* __MINIPORT_H */
207
208 /* EOF */