Sync with trunk r58740.
[reactos.git] / drivers / network / dd / rtl8139 / include / nic.h
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Novell Eagle 2000 driver
4 * FILE: include/ne2000.h
5 * PURPOSE: NE2000 driver definitions
6 */
7
8 #define NDIS_MINIPORT_DRIVER 1
9 #define NDIS_LEGACY_MINIPORT 1
10 #define NDIS51_MINIPORT 1
11 #include <ndis.h>
12 #include <8139.h>
13 #include <debug.h>
14
15 /* Define NOCARD to test NDIS without a card */
16 //#define NOCARD
17
18 /* NE2000 sepcific constants */
19 #define NIC_DATA 0x10 /* Data register */
20 #define NIC_RESET 0x1F /* Reset register */
21
22
23 /* Global constants */
24
25 #define DRIVER_NDIS_MAJOR_VERSION 0x05
26 #define DRIVER_NDIS_MINOR_VERSION 0
27
28 #define DRIVER_DEFAULT_IO_BASE_ADDRESS 0x280 /* bochs default */
29 #define DRIVER_DEFAULT_INTERRUPT_NUMBER 9 /* bochs default */
30 #define DRIVER_DEFAULT_INTERRUPT_SHARED FALSE
31 #define DRIVER_DEFAULT_INTERRUPT_MODE NdisInterruptLatched
32
33 #define DRIVER_MAX_MULTICAST_LIST_SIZE 8
34
35 #define DRIVER_VENDOR_DESCRIPTION "RTL 8139 Adapter."
36 #define DRIVER_VENDOR_DRIVER_VERSION 0x0100 /* 1.0 */
37
38 #define DRIVER_FRAME_SIZE 1514 /* Size of an ethernet frame */
39 #define DRIVER_HEADER_SIZE 14 /* Size of an ethernet header */
40 #define DRIVER_LENGTH_OF_ADDRESS 6 /* Size of an ethernet address */
41
42 /* Maximum lookahead buffer size */
43 #define DRIVER_MAXIMUM_LOOKAHEAD (252 - DRIVER_HEADER_SIZE)
44
45 /* Size of a block in a buffer ring */
46 #define DRIVER_BLOCK_SIZE 256
47
48
49 /* Default number of transmit buffers */
50 #define DRIVER_DEFAULT_TX_BUFFER_COUNT 12
51 #define BUFFERS_PER_TX_BUF 1
52
53 /* Interrupt Mask Register value */
54 #define DRIVER_INTERRUPT_MASK IMR_ALLE - IMR_RDCE
55
56 /* Maximum number of interrupts handled per call to MiniportHandleInterrupt */
57 #define INTERRUPT_LIMIT 10
58
59 /* Global structures */
60
61 typedef struct _MINIPORT_RESERVED
62 {
63 PNDIS_PACKET Next;
64 } MINIPORT_RESERVED, *PMINIPORT_RESERVED;
65
66 #define RESERVED(Packet) ((PMINIPORT_RESERVED)((Packet)->MiniportReserved))
67
68 typedef UCHAR DRIVER_HARDWARE_ADDRESS[DRIVER_LENGTH_OF_ADDRESS];
69
70 /* Information about an adapter */
71 typedef struct _NIC_ADAPTER
72 {
73 /* Entry on global adapter list */
74 LIST_ENTRY ListEntry;
75 /* Adapter handle */
76 NDIS_HANDLE MiniportAdapterHandle;
77 /* NDIS interrupt object */
78 NDIS_MINIPORT_INTERRUPT Interrupt;
79
80 /* I/O base address and interrupt number of adapter */
81 ULONG_PTR IoBaseAddress;
82 ULONG InterruptLevel;
83 ULONG InterruptVector;
84 BOOLEAN InterruptShared;
85 KINTERRUPT_MODE InterruptMode;
86
87 /* Mapped address of the I/O base port */
88 PUCHAR IOBase;
89
90 /* TRUE if the NIC can transfer in word mode */
91 BOOLEAN WordMode;
92
93 /* Base address and size of the onboard memory window */
94 PUCHAR RamBase;
95 UINT RamSize;
96
97 /* Station Address PROM (SAPROM) */
98 UCHAR SAPROM[16];
99
100 /* Onboard ethernet address from the manufacturer */
101 DRIVER_HARDWARE_ADDRESS PermanentAddress;
102
103 /* Ethernet address currently in use */
104 DRIVER_HARDWARE_ADDRESS StationAddress;
105
106 /* Maximum number of multicast addresses this adapter supports */
107 ULONG MaxMulticastListSize;
108
109 /* List of multicast addresses in use */
110 DRIVER_HARDWARE_ADDRESS Addresses[DRIVER_MAX_MULTICAST_LIST_SIZE];
111
112 /* Current multicast address mask */
113 UCHAR MulticastAddressMask[8];
114
115 /* Masked interrupts (IMR value) */
116 ULONG InterruptMask;
117
118 /* Interrupts that have occurred */
119 UCHAR InterruptStatus;
120
121 /* Current packet filter */
122 ULONG PacketFilter;
123
124 /* Lookahead buffer */
125 UINT LookaheadSize;
126 UCHAR Lookahead[DRIVER_MAXIMUM_LOOKAHEAD + DRIVER_HEADER_SIZE];
127
128 /* Receive buffer ring */
129 UINT PageStart;
130 UINT PageStop;
131 UINT CurrentPage;
132 UINT NextPacket;
133
134 /* TRUE if there was a buffer overflow */
135 BOOLEAN BufferOverflow;
136
137 /* TRUE if an error occurred during reception of a packet */
138 BOOLEAN ReceiveError;
139
140 /* TRUE if an error occurred during transmission of a packet */
141 BOOLEAN TransmitError;
142
143 /* TRUE if a transmit interrupt is pending */
144 BOOLEAN TransmitPending;
145
146 /* Received packet header */
147 PACKET_HEADER PacketHeader;
148
149 /* Offset in onboard RAM of received packet */
150 ULONG PacketOffset;
151
152 /* TRUE if receive indications are done and should be completed */
153 BOOLEAN DoneIndicating;
154
155 /* Transmit buffers */
156 UINT TXStart; /* Start block of transmit buffer ring */
157 UINT TXCount; /* Number of blocks in transmit buffer ring */
158 UINT TXFree; /* Number of free transmit buffers */
159 UINT TXNext; /* Next buffer to use */
160 /* Length of packet. 0 means buffer is unused */
161 UINT TXSize[DRIVER_DEFAULT_TX_BUFFER_COUNT];
162 INT TXCurrent; /* Current buffer beeing transmitted. -1 means none */
163
164 /* Head of transmit queue */
165 PNDIS_PACKET TXQueueHead;
166 /* Tail of transmit queue */
167 PNDIS_PACKET TXQueueTail;
168
169 /* Statistics */
170 ULONG FrameAlignmentErrors;
171 ULONG CrcErrors;
172 ULONG MissedPackets;
173
174 /* Flags used for driver cleanup */
175 BOOLEAN IOPortRangeRegistered;
176 BOOLEAN InterruptRegistered;
177 BOOLEAN ShutdownHandlerRegistered;
178 } NIC_ADAPTER, *PNIC_ADAPTER;
179
180 /* Global driver information */
181 typedef struct _DRIVER_INFORMATION
182 {
183 NDIS_HANDLE NdisWrapperHandle; /* Returned from NdisInitializeWrapper */
184 NDIS_HANDLE NdisMacHandle; /* Returned from NdisRegisterMac */
185 LIST_ENTRY AdapterListHead; /* Adapters this driver control */
186 } DRIVER_INFORMATION, *PDRIVER_INFORMATION;
187
188
189
190 /* Global variable */
191
192 extern DRIVER_INFORMATION DriverInfo;
193 extern NDIS_PHYSICAL_ADDRESS HighestAcceptableMax;
194
195
196
197 /* Prototypes */
198
199 BOOLEAN NICCheck(
200 PNIC_ADAPTER Adapter);
201
202 NDIS_STATUS NICInitialize(
203 PNIC_ADAPTER Adapter);
204
205 NDIS_STATUS NICSetup(
206 PNIC_ADAPTER Adapter);
207
208 NDIS_STATUS NICStart(
209 PNIC_ADAPTER Adapter);
210
211 NDIS_STATUS NICStop(
212 PNIC_ADAPTER Adapter);
213
214 NDIS_STATUS NICReset(
215 PNIC_ADAPTER Adapter);
216
217 VOID NICUpdateCounters(
218 PNIC_ADAPTER Adapter);
219
220 VOID NICReadDataAlign(
221 PNIC_ADAPTER Adapter,
222 PUSHORT Target,
223 ULONG_PTR Source,
224 USHORT Length);
225
226 VOID NICWriteDataAlign(
227 PNIC_ADAPTER Adapter,
228 ULONG_PTR Target,
229 PUSHORT Source,
230 USHORT Length);
231
232 VOID NICReadData(
233 PNIC_ADAPTER Adapter,
234 PUCHAR Target,
235 ULONG_PTR Source,
236 USHORT Length);
237
238 VOID NICWriteData(
239 PNIC_ADAPTER Adapter,
240 ULONG_PTR Target,
241 PUCHAR Source,
242 USHORT Length);
243
244 VOID NICTransmit(
245 PNIC_ADAPTER Adapter);
246
247 /* EOF */