5 This file contains the hardware interface to the ethernet adapter.
15 #define HDA_VERSION_STRING "HDR A: $Revision: #47 $"
17 //////////////////////////////////////////////////////////////////
18 // For the set and get configuration calls.
19 typedef struct _ADAPTER_CONFIG
22 } ADAPTER_CONFIG, *PADAPTER_CONFIG;
23 //////////////////////////////////////////////////////////////////
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
33 typedef struct _NVSCATTER_GATHER_ELEMENT {
38 } NVSCATTER_GATHER_ELEMENT, *PNVSCATTER_GATHER_ELEMENT;
40 #pragma warning(disable:4200)
41 typedef struct _NVSCATTER_GATHER_LIST {
42 ULONG NumberOfElements;
44 NVSCATTER_GATHER_ELEMENT Elements[];
45 } NVSCATTER_GATHER_LIST, *PNVSCATTER_GATHER_LIST;
46 #pragma warning(default:4200)
48 typedef struct _ADAPTER_WRITE_DATA1
52 UCHAR uc8021pPriority;
53 PNVSCATTER_GATHER_LIST pNVSGL;
54 } ADAPTER_WRITE_DATA1, *PADAPTER_WRITE_DATA1;
58 // For the ADAPTER_Write call.
59 typedef struct _ADAPTER_WRITE_ELEMENT
63 } ADAPTER_WRITE_ELEMENT, *PADAPTER_WRITE_ELEMENT;
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
70 ULONG ulNumberOfElements;
73 UCHAR uc8021pPriority;
74 ADAPTER_WRITE_ELEMENT sElement[100];
75 } ADAPTER_WRITE_DATA, *PADAPTER_WRITE_DATA;
76 //////////////////////////////////////////////////////////////////
80 //////////////////////////////////////////////////////////////////
81 // For the ADAPTER_Read call.
82 typedef struct _ADAPTER_READ_ELEMENT
86 } ADAPTER_READ_ELEMENT, *PADAPTER_READ_ELEMENT;
88 typedef struct _ADAPTER_READ_DATA
90 ULONG ulNumberOfElements;
94 ADAPTER_READ_ELEMENT sElement[10];
95 } ADAPTER_READ_DATA, *PADAPTER_READ_DATA;
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 //////////////////////////////////////////////////////////////////
105 //////////////////////////////////////////////////////////////////
106 // For the ADAPTER_GetStatistics call.
107 #define MAX_TRANSMIT_COLISION_STATS 16
108 typedef struct _ADAPTER_STATS
110 ULONG ulSuccessfulTransmissions;
111 ULONG ulFailedTransmissions;
113 ULONG ulUnderflowErrors;
114 ULONG ulLossOfCarrierErrors;
115 ULONG ulLateCollisionErrors;
116 ULONG ulDeferredTransmissions;
117 ULONG ulExcessDeferredTransmissions;
118 ULONG aulSuccessfulTransmitsAfterCollisions[MAX_TRANSMIT_COLISION_STATS];
120 ULONG ulMissedFrames;
121 ULONG ulSuccessfulReceptions;
122 ULONG ulFailedReceptions;
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
129 //interrupt related statistics
131 ULONG ulRxInterruptUnsuccessful;
133 ULONG ulTxInterruptUnsuccessful;
134 ULONG ulPhyInterrupt;
135 } ADAPTER_STATS, *PADAPTER_STATS;
136 //////////////////////////////////////////////////////////////////
140 //////////////////////////////////////////////////////////////////
141 // For the ADAPTER_GetPowerCapabilities call.
142 typedef struct _ADAPTER_POWERCAPS
145 ULONG ulMagicPacketWakeUpFlags;
146 ULONG ulPatternWakeUpFlags;
147 ULONG ulLinkChangeWakeUpFlags;
148 int iMaxWakeUpPatterns;
149 } ADAPTER_POWERCAPS, *PADAPTER_POWERCAPS;
151 // For the ADAPTER_GetPowerState and ADAPTER_SetPowerState call.
152 typedef struct _ADAPTER_POWERSTATE
155 ULONG ulMagicPacketWakeUpFlags;
156 ULONG ulPatternWakeUpFlags;
157 ULONG ulLinkChangeWakeUpFlags;
158 } ADAPTER_POWERSTATE, *PADAPTER_POWERSTATE;
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.
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
174 #define POWER_STATE_ALL (POWER_STATE_D0 | \
178 //////////////////////////////////////////////////////////////////
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
190 #define ETH_LENGTH_OF_ADDRESS 6
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
202 UCHAR acMulticastAddress[ETH_LENGTH_OF_ADDRESS];
203 UCHAR acMulticastMask[ETH_LENGTH_OF_ADDRESS];
204 } PACKET_FILTER, *PPACKET_FILTER;
205 //////////////////////////////////////////////////////////////////
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
218 typedef struct _WAKE_UP_PATTERN
220 ULONG aulByteMask[WAKE_UP_PATTERN_SIZE/32];
221 UCHAR acData[WAKE_UP_PATTERN_SIZE];
222 } WAKE_UP_PATTERN, *PWAKE_UP_PATTERN;
230 typedef struct _ADAPTER_OFFLOAD {
235 } ADAPTER_OFFLOAD, *PADAPTER_OFFLOAD;
237 #define ADAPTER_OFFLOAD_VLAN 0x00000001
238 #define ADAPTER_OFFLOAD_IEEE802_1P 0x00000002
239 #define ADAPTER_OFFLOAD_IEEE802_1PQ_PAD 0x00000004
241 //////////////////////////////////////////////////////////////////
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);
255 typedef int (* PFN_ADAPTER_WRITE1) (PVOID pvContext, ADAPTER_WRITE_DATA1 *pADWriteData1);
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);
288 typedef struct _ADAPTER_API
290 // The adapter context
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;
303 PFN_ADAPTER_WRITE1 pfnWrite1;
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 //////////////////////////////////////////////////////////////////
337 #define MAX_PACKET_TO_ACCUMULATE 16
339 typedef struct _ADAPTER_OPEN_PARAMS
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;
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);
366 //////////////////////////////////////////////////////////////////
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 //////////////////////////////////////////////////////////////////
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
385 typedef struct _TX_INFO_ADAP
389 }TX_INFO_ADAP, *PTX_INFO_ADAP;
391 #define WORKAROUND_FOR_MCP3_TX_STALL
393 #ifdef WORKAROUND_FOR_MCP3_TX_STALL
394 int ADAPTER_WorkaroundTXHang(PVOID pvContext);
397 //#define TRACK_INIT_TIME
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
403 #define MAX_PRINT_INDEX 32
404 extern void PrintTime(ULONG ulIndex);
405 #define PRINT_INIT_TIME(_a) PrintTime((_a))
407 #define PRINT_INIT_TIME(_a)
414 #endif // _ADAPTER_H_