Merge from vendor branch HEIMDAL:
[dragonfly.git] / sys / contrib / dev / nv / adapter.h
1 /*
2     FILE:   adapter.h
3     DATE:   2/7/00
4
5     This file contains the hardware interface to the ethernet adapter.
6 */
7
8 #ifndef _ADAPTER_H_
9 #define _ADAPTER_H_
10
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14
15 #define HDA_VERSION_STRING "HDR A: $Revision: #47 $"
16
17 //////////////////////////////////////////////////////////////////
18 // For the set and get configuration calls.
19 typedef struct  _ADAPTER_CONFIG
20 {
21     ULONG   ulFlags;
22 }   ADAPTER_CONFIG, *PADAPTER_CONFIG;
23 //////////////////////////////////////////////////////////////////
24
25 #if defined(_WIN32)
26 //////////////////////////////////////////////////////////////////
27 // For the ADAPTER_Write1 call.
28 /* This scatter gather list should be same as defined in ndis.h by MS.
29    For ULONG_PTR MS header file says that it will be of same size as
30    pointer. It has been defined to take care of casting between differenet
31    sizes.
32 */
33 typedef struct _NVSCATTER_GATHER_ELEMENT {
34     ULONG PhysLow;
35     ULONG PhysHigh;
36     ULONG Length;
37     void *Reserved;
38 } NVSCATTER_GATHER_ELEMENT, *PNVSCATTER_GATHER_ELEMENT;
39
40 #pragma warning(disable:4200)
41 typedef struct _NVSCATTER_GATHER_LIST {
42     ULONG NumberOfElements;
43     void *Reserved;
44     NVSCATTER_GATHER_ELEMENT Elements[];
45 } NVSCATTER_GATHER_LIST, *PNVSCATTER_GATHER_LIST;
46 #pragma warning(default:4200)
47
48 typedef struct  _ADAPTER_WRITE_DATA1
49 {
50     ULONG                   ulTotalLength;
51     PVOID                   pvID;
52         UCHAR                                   uc8021pPriority;
53         PNVSCATTER_GATHER_LIST  pNVSGL;
54 }   ADAPTER_WRITE_DATA1, *PADAPTER_WRITE_DATA1;
55
56 #endif
57
58 // For the ADAPTER_Write call.
59 typedef struct  _ADAPTER_WRITE_ELEMENT
60 {
61     PVOID   pPhysical;
62     ULONG   ulLength;
63 }   ADAPTER_WRITE_ELEMENT, *PADAPTER_WRITE_ELEMENT;
64
65 // pvID is a value that will be passed back into OSAPI.pfnPacketWasSent
66 // when the transmission completes. if pvID is NULL, the ADAPTER code
67 // assumes the caller does not want the pfnPacketWasSent callback.
68 typedef struct  _ADAPTER_WRITE_DATA
69 {
70     ULONG                   ulNumberOfElements;
71     ULONG                   ulTotalLength;
72     PVOID                   pvID;
73         UCHAR                                   uc8021pPriority;
74     ADAPTER_WRITE_ELEMENT   sElement[100];
75 }   ADAPTER_WRITE_DATA, *PADAPTER_WRITE_DATA;
76 //////////////////////////////////////////////////////////////////
77
78
79
80 //////////////////////////////////////////////////////////////////
81 // For the ADAPTER_Read call.
82 typedef struct  _ADAPTER_READ_ELEMENT
83 {
84     PVOID   pPhysical;
85     ULONG   ulLength;
86 }   ADAPTER_READ_ELEMENT, *PADAPTER_READ_ELEMENT;
87
88 typedef struct _ADAPTER_READ_DATA
89 {
90     ULONG                   ulNumberOfElements;
91     ULONG                   ulTotalLength;
92     PVOID                   pvID;
93     ULONG                   ulFilterMatch;
94     ADAPTER_READ_ELEMENT    sElement[10];
95 }   ADAPTER_READ_DATA, *PADAPTER_READ_DATA;
96
97 // The ulFilterMatch flag can be a logical OR of the following
98 #define ADREADFL_UNICAST_MATCH          0x00000001
99 #define ADREADFL_MULTICAST_MATCH        0x00000002
100 #define ADREADFL_BROADCAST_MATCH        0x00000004
101 //////////////////////////////////////////////////////////////////
102
103
104
105 //////////////////////////////////////////////////////////////////
106 // For the ADAPTER_GetStatistics call.
107 #define MAX_TRANSMIT_COLISION_STATS 16
108 typedef struct  _ADAPTER_STATS
109 {
110     ULONG   ulSuccessfulTransmissions;
111     ULONG   ulFailedTransmissions;
112     ULONG   ulRetryErrors;
113     ULONG   ulUnderflowErrors;
114     ULONG   ulLossOfCarrierErrors;
115     ULONG   ulLateCollisionErrors;
116     ULONG   ulDeferredTransmissions;
117         ULONG   ulExcessDeferredTransmissions;
118     ULONG   aulSuccessfulTransmitsAfterCollisions[MAX_TRANSMIT_COLISION_STATS];
119
120     ULONG   ulMissedFrames;
121     ULONG   ulSuccessfulReceptions;
122     ULONG   ulFailedReceptions;
123     ULONG   ulCRCErrors;
124     ULONG   ulFramingErrors;
125     ULONG   ulOverFlowErrors;
126         ULONG   ulFrameErrorsPrivate; //Not for public.
127         ULONG   ulNullBufferReceivePrivate; //Not for public, These are the packets which we didn't indicate to OS
128
129         //interrupt related statistics
130     ULONG   ulRxInterrupt;
131     ULONG   ulRxInterruptUnsuccessful;
132     ULONG   ulTxInterrupt;
133     ULONG   ulTxInterruptUnsuccessful;
134     ULONG   ulPhyInterrupt;
135 }   ADAPTER_STATS, *PADAPTER_STATS;
136 //////////////////////////////////////////////////////////////////
137
138
139
140 //////////////////////////////////////////////////////////////////
141 // For the ADAPTER_GetPowerCapabilities call.
142 typedef struct  _ADAPTER_POWERCAPS
143 {
144     ULONG   ulPowerFlags;
145     ULONG   ulMagicPacketWakeUpFlags;
146     ULONG   ulPatternWakeUpFlags;
147     ULONG   ulLinkChangeWakeUpFlags;
148     int     iMaxWakeUpPatterns;
149 }   ADAPTER_POWERCAPS, *PADAPTER_POWERCAPS;
150
151 // For the ADAPTER_GetPowerState and ADAPTER_SetPowerState call.
152 typedef struct  _ADAPTER_POWERSTATE
153 {
154     ULONG   ulPowerFlags;
155     ULONG   ulMagicPacketWakeUpFlags;
156     ULONG   ulPatternWakeUpFlags;
157     ULONG   ulLinkChangeWakeUpFlags;
158 }   ADAPTER_POWERSTATE, *PADAPTER_POWERSTATE;
159
160 // Each of the flag fields in the POWERCAPS structure above can have
161 // any of the following bitflags set giving the capabilites of the
162 // adapter. In the case of the wake up fields, these flags mean that
163 // wake up can happen from the specified power state.
164
165 // For the POWERSTATE structure, the ulPowerFlags field should just
166 // have one of these bits set to go to that particular power state.
167 // The WakeUp fields can have one or more of these bits set to indicate
168 // what states should be woken up from.
169 #define POWER_STATE_D0          0x00000001
170 #define POWER_STATE_D1          0x00000002
171 #define POWER_STATE_D2          0x00000004
172 #define POWER_STATE_D3          0x00000008
173
174 #define POWER_STATE_ALL         (POWER_STATE_D0 | \
175                                 POWER_STATE_D1  | \
176                                 POWER_STATE_D2  | \
177                                 POWER_STATE_D3)
178 //////////////////////////////////////////////////////////////////
179
180
181
182 //////////////////////////////////////////////////////////////////
183 // The ADAPTER_GetPacketFilterCaps call returns a ULONG that can
184 // have the following capability bits set.
185 #define ACCEPT_UNICAST_PACKETS      0x00000001
186 #define ACCEPT_MULTICAST_PACKETS    0x00000002
187 #define ACCEPT_BROADCAST_PACKETS    0x00000004
188 #define ACCEPT_ALL_PACKETS          0x00000008
189
190 #define ETH_LENGTH_OF_ADDRESS           6
191
192 // The ADAPTER_SetPacketFilter call uses this structure to know what
193 // packet filter to set. The ulPacketFilter field can contain some
194 // union of the bit flags above. The acMulticastMask array holds a
195 // 48 bit MAC address mask with a 0 in every bit position that should
196 // be ignored on compare and a 1 in every bit position that should
197 // be taken into account when comparing to see if the destination
198 // address of a packet should be accepted for multicast.
199 typedef struct  _PACKET_FILTER
200 {
201     ULONG   ulFilterFlags;
202     UCHAR   acMulticastAddress[ETH_LENGTH_OF_ADDRESS];
203     UCHAR   acMulticastMask[ETH_LENGTH_OF_ADDRESS];
204 }   PACKET_FILTER, *PPACKET_FILTER;
205 //////////////////////////////////////////////////////////////////
206
207
208 //////////////////////////////////////////////////////////////////
209 // A WAKE_UP_PATTERN is a 128-byte pattern that the adapter can
210 // look for in incoming packets to decide when to wake up.  Higher-
211 // level protocols can use this to, for example, wake up the
212 // adapter whenever it sees an IP packet that is addressed to it.
213 // A pattern consists of 128 bits of byte masks that indicate
214 // which bytes in the packet are relevant to the pattern, plus
215 // values for each byte.
216 #define WAKE_UP_PATTERN_SIZE 128
217
218 typedef struct _WAKE_UP_PATTERN
219 {
220     ULONG   aulByteMask[WAKE_UP_PATTERN_SIZE/32];
221     UCHAR   acData[WAKE_UP_PATTERN_SIZE];
222 }   WAKE_UP_PATTERN, *PWAKE_UP_PATTERN;
223
224
225
226 //
227 //
228 // Adapter offload
229 //
230 typedef struct _ADAPTER_OFFLOAD {
231
232         ULONG Type;
233         ULONG Value0;
234
235 } ADAPTER_OFFLOAD, *PADAPTER_OFFLOAD;
236
237 #define ADAPTER_OFFLOAD_VLAN            0x00000001
238 #define ADAPTER_OFFLOAD_IEEE802_1P      0x00000002
239 #define ADAPTER_OFFLOAD_IEEE802_1PQ_PAD 0x00000004
240
241 //////////////////////////////////////////////////////////////////
242
243
244 //////////////////////////////////////////////////////////////////
245 // The functional typedefs for the ADAPTER Api
246 typedef int (* PFN_ADAPTER_CLOSE)  (PVOID pvContext);
247 typedef int (* PFN_ADAPTER_INIT)  (PVOID pvContext, USHORT usForcedSpeed, UCHAR ucForceDpx, UCHAR ucForceMode, UINT *puiLinkState);
248 typedef int (* PFN_ADAPTER_DEINIT)  (PVOID pvContext, UCHAR ucIsPowerDown);
249 typedef int (* PFN_ADAPTER_START)  (PVOID pvContext);
250 typedef int (* PFN_ADAPTER_STOP)   (PVOID pvContext, UCHAR ucIsPowerDown);
251 typedef int (* PFN_ADAPTER_QUERY_WRITE_SLOTS) (PVOID pvContext);
252 typedef int (* PFN_ADAPTER_WRITE) (PVOID pvContext, ADAPTER_WRITE_DATA *pADWriteData);
253
254 #if defined(_WIN32)
255 typedef int (* PFN_ADAPTER_WRITE1) (PVOID pvContext, ADAPTER_WRITE_DATA1 *pADWriteData1);
256 #endif
257
258 typedef int (* PFN_ADAPTER_QUERY_INTERRUPT) (PVOID pvContext);
259 typedef int (* PFN_ADAPTER_HANDLE_INTERRUPT) (PVOID pvContext);
260 typedef int (* PFN_ADAPTER_DISABLE_INTERRUPTS) (PVOID pvContext);
261 typedef int (* PFN_ADAPTER_ENABLE_INTERRUPTS) (PVOID pvContext);
262 typedef int (* PFN_ADAPTER_CLEAR_INTERRUPTS) (PVOID pvContext);
263 typedef int (* PFN_ADAPTER_CLEAR_TX_DESC) (PVOID pvContext);
264 typedef int (* PFN_ADAPTER_GET_LINK_SPEED) (PVOID pvContext);
265 typedef int (* PFN_ADAPTER_GET_LINK_STATE) (PVOID pvContext, ULONG *pulLinkState);
266 typedef int (* PFN_ADAPTER_IS_LINK_INITIALIZING) (PVOID pvContext);
267 typedef int (* PFN_ADAPTER_RESET_PHY_INIT_STATE) (PVOID pvContext);
268 typedef int (* PFN_ADAPTER_GET_TRANSMIT_QUEUE_SIZE) (PVOID pvContext);
269 typedef int (* PFN_ADAPTER_GET_RECEIVE_QUEUE_SIZE) (PVOID pvContext);
270 typedef int (* PFN_ADAPTER_GET_STATISTICS) (PVOID pvContext, PADAPTER_STATS pADStats);
271 typedef int (* PFN_ADAPTER_GET_POWER_CAPS) (PVOID pvContext, PADAPTER_POWERCAPS pADPowerCaps);
272 typedef int (* PFN_ADAPTER_GET_POWER_STATE) (PVOID pvContext, PADAPTER_POWERSTATE pADPowerState);
273 typedef int (* PFN_ADAPTER_SET_POWER_STATE) (PVOID pvContext, PADAPTER_POWERSTATE pADPowerState);
274 typedef int (* PFN_ADAPTER_GET_PACKET_FILTER_CAPS) (PVOID pvContext);
275 typedef int (* PFN_ADAPTER_SET_PACKET_FILTER) (PVOID pvContext, PPACKET_FILTER pPacketFilter);
276 typedef int (* PFN_ADAPTER_SET_WAKE_UP_PATTERN) (PVOID pvContext, int iPattern, PWAKE_UP_PATTERN pPattern);
277 typedef int (* PFN_ADAPTER_ENABLE_WAKE_UP_PATTERN) (PVOID pvContext, int iPattern, int iEnable);
278 typedef int (* PFN_SET_NODE_ADDRESS) (PVOID pvContext, UCHAR *pNodeAddress);
279 typedef int (* PFN_GET_NODE_ADDRESS) (PVOID pvContext, UCHAR *pNodeAddress);
280 typedef int (* PFN_GET_ADAPTER_INFO) (PVOID pvContext, PVOID pVoidPtr, int iType, int *piLength);
281 typedef int (* PFN_ADAPTER_READ_PHY)  (PVOID pvContext, ULONG ulPhyAddr, ULONG ulPhyReg, ULONG *pulValue);
282 typedef int (* PFN_ADAPTER_WRITE_PHY) (PVOID pvContext, ULONG ulPhyAddr, ULONG ulPhyReg, ULONG ulValue);
283 typedef void(* PFN_ADAPTER_SET_SPPED_DUPLEX) (PVOID pvContext);
284 typedef int (*PFN_REGISTER_OFFLOAD) (PVOID pvContext,  PADAPTER_OFFLOAD pOffload);
285 typedef int (*PFN_DEREGISTER_OFFLOAD) (PVOID pvContext, PADAPTER_OFFLOAD pOffload);
286 typedef int (*PFN_RX_BUFF_READY) (PVOID pvContext, PMEMORY_BLOCK pMemBlock, PVOID pvID);
287
288 typedef struct  _ADAPTER_API
289 {
290     // The adapter context
291     PVOID                                   pADCX;
292
293     // The adapter interface
294     PFN_ADAPTER_CLOSE                       pfnClose;
295     PFN_ADAPTER_INIT                        pfnInit;
296     PFN_ADAPTER_DEINIT                      pfnDeinit;
297     PFN_ADAPTER_START                       pfnStart;
298     PFN_ADAPTER_STOP                        pfnStop;
299     PFN_ADAPTER_QUERY_WRITE_SLOTS           pfnQueryWriteSlots;
300     PFN_ADAPTER_WRITE                       pfnWrite;
301
302 #if defined(_WIN32)
303     PFN_ADAPTER_WRITE1                      pfnWrite1;
304 #endif
305     PFN_ADAPTER_QUERY_INTERRUPT             pfnQueryInterrupt;
306     PFN_ADAPTER_HANDLE_INTERRUPT            pfnHandleInterrupt;
307     PFN_ADAPTER_DISABLE_INTERRUPTS          pfnDisableInterrupts;
308     PFN_ADAPTER_ENABLE_INTERRUPTS           pfnEnableInterrupts;
309     PFN_ADAPTER_CLEAR_INTERRUPTS            pfnClearInterrupts;
310     PFN_ADAPTER_CLEAR_TX_DESC                           pfnClearTxDesc;
311     PFN_ADAPTER_GET_LINK_SPEED              pfnGetLinkSpeed;
312     PFN_ADAPTER_GET_LINK_STATE              pfnGetLinkState;
313     PFN_ADAPTER_IS_LINK_INITIALIZING        pfnIsLinkInitializing;
314     PFN_ADAPTER_RESET_PHY_INIT_STATE            pfnResetPhyInitState;
315     PFN_ADAPTER_GET_TRANSMIT_QUEUE_SIZE     pfnGetTransmitQueueSize;
316     PFN_ADAPTER_GET_RECEIVE_QUEUE_SIZE      pfnGetReceiveQueueSize;
317     PFN_ADAPTER_GET_STATISTICS              pfnGetStatistics;
318     PFN_ADAPTER_GET_POWER_CAPS              pfnGetPowerCaps;
319     PFN_ADAPTER_GET_POWER_STATE             pfnGetPowerState;
320     PFN_ADAPTER_SET_POWER_STATE             pfnSetPowerState;
321     PFN_ADAPTER_GET_PACKET_FILTER_CAPS      pfnGetPacketFilterCaps;
322     PFN_ADAPTER_SET_PACKET_FILTER           pfnSetPacketFilter;
323     PFN_ADAPTER_SET_WAKE_UP_PATTERN         pfnSetWakeUpPattern;
324     PFN_ADAPTER_ENABLE_WAKE_UP_PATTERN      pfnEnableWakeUpPattern;
325     PFN_SET_NODE_ADDRESS                    pfnSetNodeAddress;
326     PFN_GET_NODE_ADDRESS                    pfnGetNodeAddress;
327     PFN_GET_ADAPTER_INFO                                pfnGetAdapterInfo;
328         PFN_ADAPTER_SET_SPPED_DUPLEX                    pfnSetSpeedDuplex;
329     PFN_ADAPTER_READ_PHY                                        pfnReadPhy;
330     PFN_ADAPTER_WRITE_PHY                                       pfnWritePhy;
331         PFN_REGISTER_OFFLOAD                                    pfnRegisterOffload;
332         PFN_DEREGISTER_OFFLOAD                                  pfnDeRegisterOffload;
333     PFN_RX_BUFF_READY                                           pfnRxBuffReady;
334 }   ADAPTER_API, *PADAPTER_API;
335 //////////////////////////////////////////////////////////////////
336
337 #define MAX_PACKET_TO_ACCUMULATE        16
338
339 typedef struct _ADAPTER_OPEN_PARAMS
340 {
341         PVOID pOSApi; //pointer to OSAPI structure passed from higher layer
342         PVOID pvHardwareBaseAddress; //memory mapped address passed from higher layer
343         ULONG ulPollInterval; //poll interval in micro seconds. Used in polling mode
344         ULONG MaxDpcLoop; //Maximum number of times we loop to in function ADAPTER_HandleInterrupt
345         ULONG MaxRxPkt; //Maximum number of packet we process each time in function UpdateReceiveDescRingData
346         ULONG MaxTxPkt; //Maximum number of packet we process each time in function UpdateTransmitDescRingData
347         ULONG MaxRxPktToAccumulate; //maximum number of rx packet we accumulate in UpdateReceiveDescRingData before
348                                                                 //indicating packets to OS.
349         ULONG SentPacketStatusSuccess; //Status returned from adapter layer to higher layer when packet was sent successfully
350         ULONG SentPacketStatusFailure; ////Status returned from adapter layer to higher layer when packet send was unsuccessful
351         ULONG SetForcedModeEveryNthRxPacket; //NOT USED: For experiment with descriptor based interrupt
352         ULONG SetForcedModeEveryNthTxPacket; //NOT USED: For experiment with descriptor based interrupt
353         ULONG RxForcedInterrupt; //NOT USED: For experiment with descriptor based interrupt
354         ULONG TxForcedInterrupt; //NOT USED: For experiment with descriptor based interrupt
355         ULONG DeviceId; //Of MAC
356         ULONG PollIntervalInusForThroughputMode; //Of MAC
357 }ADAPTER_OPEN_PARAMS, *PADAPTER_OPEN_PARAMS;
358
359 //////////////////////////////////////////////////////////////////
360 // This is the one function in the adapter interface that is publicly
361 // available. The rest of the interface is returned in the pAdapterApi.
362 // The first argument needs to be cast to a OSAPI structure pointer.
363 // The second argument should be cast to a ADPATER_API structure pointer.
364 int ADAPTER_Open (PADAPTER_OPEN_PARAMS pAdapterOpenParams, PVOID *pvpAdapterApi, ULONG *pulPhyAddr);
365
366 //////////////////////////////////////////////////////////////////
367
368
369
370 //////////////////////////////////////////////////////////////////
371 // Here are the error codes the adapter function calls return.
372 #define ADAPTERERR_NONE                             0x0000
373 #define ADAPTERERR_COULD_NOT_ALLOC_CONTEXT          0x0001
374 #define ADAPTERERR_COULD_NOT_CREATE_CONTEXT         0x0002
375 #define ADAPTERERR_COULD_NOT_OPEN_PHY               0x0003
376 #define ADAPTERERR_TRANSMIT_QUEUE_FULL              0x0004
377 #define ADAPTERERR_COULD_NOT_INIT_PHY               0x0005
378 #define ADAPTERERR_PHYS_SIZE_SMALL                                      0x0006
379 //////////////////////////////////////////////////////////////////
380
381 #define REDUCE_LENGTH_BY 48
382 #define EXTRA_WRITE_SLOT_TO_REDUCE_PER_SEND     3
383 #define MAX_TX_DESCS                    256 //32 //256 //512 //64 //256 
384
385 typedef struct _TX_INFO_ADAP
386 {
387         ULONG NoOfDesc; 
388         PVOID pvVar2; 
389 }TX_INFO_ADAP, *PTX_INFO_ADAP;
390
391 #define WORKAROUND_FOR_MCP3_TX_STALL
392
393 #ifdef WORKAROUND_FOR_MCP3_TX_STALL
394 int ADAPTER_WorkaroundTXHang(PVOID pvContext);
395 #endif
396
397 //#define TRACK_INIT_TIME
398
399 #ifdef TRACK_INIT_TIME
400 //This routine is defined in entry.c adapter doesn't link int64.lib
401 //We defined here so that its easy to use it in phy as well as mswin
402
403 #define MAX_PRINT_INDEX         32
404 extern void PrintTime(ULONG ulIndex);
405 #define PRINT_INIT_TIME(_a) PrintTime((_a))
406 #else
407 #define PRINT_INIT_TIME(_a)
408 #endif
409
410 #ifdef __cplusplus
411 } // extern "C"
412 #endif
413
414 #endif // _ADAPTER_H_