|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1990 Microsoft Corporation
4:
5: Module Name:
6:
7: lancesft.h
8:
9: Abstract:
10:
11: The main header for a LANCE (Local Area Network Controller
12: Am 7990) MAC driver.
13:
14: Author:
15:
16: Anthony V. Ercolano (tonye) creation-date 19-Jun-1990
17:
18: Environment:
19:
20: This driver is expected to work in DOS, OS2 and NT at the equivalent
21: of kernal mode.
22:
23: Architecturally, there is an assumption in this driver that we are
24: on a little endian machine.
25:
26: Notes:
27:
28: optional-notes
29:
30: Revision History:
31:
32: 31-Jul-1992 R.D. Lanser:
33:
34: Changed DECST card type to DECTC for the DEC TurboChannel option
35: PMAD-AA (Lance ethernet). This option will be available for all
36: TurboChannel systems regardless of CPU type or system.
37:
38: Added InterruptRequestLevel to the _LANCE_ADAPTER structure because
39: 'lance.c' was passing the InterruptVector as the IRQL to the interrupt
40: connect routine which is not correct. This works on JAZZ because the
41: JAZZ HalGetInterruptVector is hardcoded to return a fixed IRQL for
42: EISA devices.
43:
44: Removed PhysicalBuffersContained and UsedLanceBuffer field from
45: _ADAPTER structure. SeanSe says that the code related to this
46: field was used for adevice that is no longer supported. I removed
47: the dependent code(or at least what was obvious) from 'send.c'.
48:
49: --*/
50:
51: #ifndef _LANCESFT_
52: #define _LANCESFT_
53:
54: #define LANCE_NDIS_MAJOR_VERSION 3
55: #define LANCE_NDIS_MINOR_VERSION 0
56:
57: #if DBG
58:
59: #define LANCELOG 1
60: #define LANCE_TRACE 0
61:
62: #else
63:
64: #define LANCELOG 0
65: #define LANCE_TRACE 0
66:
67: #endif
68:
69: #if LANCELOG
70:
71: #define LOG_SIZE 256
72:
73: #define TIMER '.'
74: #define IN_ISR 'i'
75: #define OUT_ISR 'I'
76: #define IN_DPC 'd'
77: #define OUT_DPC 'D'
78: #define RECEIVE 'R'
79: #define TRANSMIT 'x'
80: #define TRANSMIT_COMPLETE 'X'
81: #define PEND 'p'
82: #define UNPEND 'P'
83: #define INDICATE 'r'
84: #define IN_SEND 's'
85: #define OUT_SEND 'S'
86: #define START 'G'
87: #define RESET_STEP_1 '1'
88: #define RESET_STEP_2 '2'
89: #define RESET_SAVE_PACKET 'b'
90: #define RESET_RECOVER_PACKET 'B'
91: #define RESET_COMPLETE_PACKET 'c'
92: #define RESET_STEP_3 '3'
93:
94:
95:
96: extern UCHAR Log[LOG_SIZE];
97:
98: extern UCHAR LogPlace;
99: extern UCHAR LogWrapped;
100:
101:
102:
103: #define LOG(c) { Log[LogPlace] = (c); Log[(LogPlace+3) % 255] ='\0'; \
104: LogPlace = (LogPlace + 1) % 255; }
105:
106: #else
107:
108: #define LOG(c)
109:
110: #endif
111:
112:
113:
114: extern NDIS_PHYSICAL_ADDRESS HighestAcceptableMax;
115:
116: //
117: // ZZZ These macros are peculiar to NT.
118: //
119:
120: #define LANCE_ALLOC_PHYS(pp, s) NdisAllocateMemory((PVOID *)(pp),(s),0,HighestAcceptableMax)
121: #define LANCE_FREE_PHYS(p, s) NdisFreeMemory((PVOID)(p),(s),0)
122: #define LANCE_MOVE_MEMORY(Destination,Source,Length) NdisMoveMemory(Destination,Source,Length)
123: #define LANCE_ZERO_MEMORY(Destination,Length) NdisZeroMemory(Destination,Length)
124:
125:
126:
127: //
128: // Definitions for all the different card types.
129: //
130:
131:
132: #define LANCE_DE100 0x01 // DE100 card
133: #define LANCE_DE201 0x02 // DE201 card
134: #define LANCE_DEPCA 0x04 // Card in a Dec PC x86 machine
135: #define LANCE_DECST 0x08 // Card in a decstation
136: #define LANCE_DE422 0x10 // DE422 card
137: #define LANCE_DECTC 0x20 // TurboChannel PMAD-AA option
138:
139: #define LANCE_DE100_NAME LANCE_DEFAULT_NAME
140: #define LANCE_DE201_NAME LANCE_DEFAULT_NAME
141: #define LANCE_DEPCA_NAME LANCE_DEFAULT_NAME
142: #define LANCE_DECST_NAME LANCE_DEFAULT_NAME
143: #define LANCE_DE422_NAME LANCE_DEFAULT_NAME
144: #define LANCE_DECTC_NAME LANCE_DEFAULT_NAME
145: #define LANCE_DEFAULT_NAME "\\Device\\Lance01"
146:
147:
148: //
149: // This structure is passed as context from the receive interrupt
150: // processor. Eventually it will be used as a parameter to
151: // LanceTransferData. LanceTransferData can get two kinds of
152: // context. It will receive either an ndis packet or it will
153: // receive a LANCE_RECEIVE_CONTEXT. It will be able to tell
154: // the difference since the LANCE_RECEIVE_CONTEXT will have
155: // its low bit set. No pointer to an ndis packet can have its low
156: // bit set.
157: //
158: typedef union _LANCE_RECEIVE_CONTEXT {
159:
160: UINT WholeThing;
161: struct _INFO {
162: //
163: // Used to mark that this is context rather than a pointer
164: // to a packet.
165: //
166: UINT IsContext:1;
167:
168: //
169: // The first receive ring descriptor used to hold the packet.
170: //
171: UINT FirstBuffer:7;
172:
173: //
174: // The last receive ring descriptor used to hold the packet.
175: //
176: UINT LastBuffer:7;
177: } INFO;
178:
179: } LANCE_RECEIVE_CONTEXT,*PLANCE_RECEIVE_CONTEXT;
180:
181:
182:
183:
184:
185:
186: //
187: // This record type is inserted into the MacReserved portion
188: // of the packet header when the packet is going through the
189: // staged allocation of buffer space prior to the actual send.
190: //
191: typedef struct _LANCE_RESERVED {
192:
193: //
194: // Points to the next packet in the chain of queued packets
195: // being allocated, loopbacked, or waiting for the finish
196: // of transmission.
197: //
198: // The packet will either be on the stage list for allocation,
199: // the loopback list for loopback processing, on an adapter
200: // wide doubly linked list (see below) for post transmission
201: // processing.
202: //
203: // We always keep the packet on a list so that in case the
204: // the adapter is closing down or resetting, all the packets
205: // can easily be located and "canceled".
206: //
207: PNDIS_PACKET Next;
208:
209: //
210: // This field holds the binding handle of the open binding
211: // that submitted this packet for send.
212: //
213: NDIS_HANDLE MacBindingHandle;
214:
215: //
216: // This gives the index into the array of adapter buffer
217: // descriptors that contains the packet information.
218: //
219: USHORT LanceBuffersIndex;
220:
221: //
222: // When the hardware send is done this will record whether
223: // the send was successful or not.
224: //
225: BOOLEAN SuccessfulTransmit;
226:
227: } LANCE_RESERVED,*PLANCE_RESERVED;
228:
229: //
230: // This macro will return a pointer to the lance reserved portion
231: // of a packet given a pointer to a packet.
232: //
233: #define PLANCE_RESERVED_FROM_PACKET(Packet) \
234: ((PLANCE_RESERVED)((Packet)->MacReserved))
235:
236: //
237: // This structure is used to map entries in the ring descriptors
238: // back to the packets from which the data in the ring descriptor
239: // originated.
240: //
241:
242: typedef struct _LANCE_RING_TO_PACKET {
243:
244: //
245: // Points to the packet from which data is being transmitted
246: // through this ring entry.
247: //
248: PNDIS_PACKET OwningPacket;
249:
250: //
251: // Index of the ring entry that is being used by the packet.
252: //
253: UINT RingIndex;
254:
255: //
256: // When a packet is submitted to the hardware we record
257: // here whether it used adapter buffers and if so, the buffer
258: // index.
259: //
260: UINT LanceBuffersIndex;
261:
262: } LANCE_RING_TO_PACKET,*PLANCE_RING_TO_PACKET;
263:
264: //
265: // If an ndis packet does not meet the hardware contraints then
266: // an adapter buffer will be allocated. Enough data will be copied
267: // out of the ndis packet so that by using a combination of the
268: // adapter buffer and remaining ndis buffers the hardware
269: // constraints are satisfied.
270: //
271: // In the LANCE_ADAPTER structure three threaded lists are kept in
272: // one array. One points to a list of LANCE_BUFFER_DESCRIPTORS
273: // that point to small adapter buffers. Another is for medium sized
274: // buffers and the last for full sized (large) buffers.
275: //
276: // The allocation is controlled via a free list head and
277: // the free lists are "threaded" by a field in the adapter buffer
278: // descriptor.
279: //
280: typedef struct _LANCE_BUFFER_DESCRIPTOR {
281:
282: //
283: // A virtual pointer to a small, medium, or large buffer.
284: //
285: PVOID VirtualLanceBuffer;
286:
287: //
288: // Threads the elements of an array of these descriptors into
289: // a free list. -1 implies no more entries in the list.
290: //
291: INT Next;
292:
293: //
294: // Holds the amount of space (in bytes) available in the buffer
295: //
296: UINT BufferSize;
297:
298: //
299: // Holds the length of data placed into the buffer. This
300: // can (and likely will) be less that the actual buffers
301: // length.
302: //
303: UINT DataLength;
304:
305: } LANCE_BUFFER_DESCRIPTOR,*PLANCE_BUFFER_DESCRIPTOR;
306:
307:
308:
309: //
310: // Used to contain a queued operation.
311: //
312:
313: typedef struct _LANCE_PEND_DATA {
314: PNDIS_REQUEST Next;
315: struct _LANCE_OPEN * Open;
316: NDIS_REQUEST_TYPE RequestType;
317: } LANCE_PEND_DATA, * PLANCE_PEND_DATA;
318:
319: //
320: // This macro will return a pointer to the reserved area of
321: // a PNDIS_REQUEST.
322: //
323: #define PLANCE_PEND_DATA_FROM_PNDIS_REQUEST(Request) \
324: ((PLANCE_PEND_DATA)((PVOID)((Request)->MacReserved)))
325:
326: //
327: // This macros returns the enclosing NdisRequest.
328: //
329: #define PNDIS_REQUEST_FROM_PLANCE_PEND_DATA(PendOp)\
330: ((PNDIS_REQUEST)((PVOID)(PendOp)))
331:
332:
333:
334: //
335: // Define the size of the ethernet header.
336: //
337: #define LANCE_HEADER_SIZE 14
338:
339: //
340: // Define Maximum number of bytes a protocol can read during a
341: // receive data indication.
342: //
343: #define LANCE_MAX_LOOKAHEAD ( 248 - LANCE_HEADER_SIZE )
344:
345:
346:
347:
348:
349: typedef struct _LANCE_ADAPTER {
350:
351: //
352: // The card type of this adapter.
353: //
354: UCHAR LanceCard;
355:
356: //
357: // Holds the interrupt object for this adapter.
358: //
359: NDIS_INTERRUPT Interrupt;
360:
361: //
362: // Normal processing DPC.
363: //
364: PVOID InterruptDPC;
365:
366: //
367: // Dpc for handling loopback.
368: //
369: PVOID LoopbackDPC;
370:
371: //
372: // Non OS fields of the adapter.
373: //
374:
375: //
376: // Contains Address first byte of adapter memory is mapped to.
377: //
378: PVOID MmMappedBaseAddr;
379:
380: //
381: // Contains address of the hardware memory.
382: //
383: PVOID HardwareBaseAddr;
384:
385: //
386: // Offset for Init block from the Lance chip's point of view.
387: //
388: ULONG HardwareBaseOffset;
389:
390: //
391: // Amount of memory
392: //
393: ULONG AmountOfHardwareMemory;
394:
395: //
396: // For lance implementation that uses dual ported memory this
397: // field is used to point to the first available memory.
398: //
399: PVOID CurrentMemoryFirstFree;
400:
401: //
402: // Address of the first byte following the memory.
403: //
404: PVOID MemoryFirstUnavailable;
405:
406: //
407: // Pointer to the RAP register.
408: //
409: ULONG RAP;
410:
411: //
412: // Pointer to the RDP register.
413: //
414: ULONG RDP;
415:
416: //
417: // Pointer to the NICSR register.
418: //
419: ULONG Nicsr;
420:
421: //
422: // Slot Number the De422 is in.
423: //
424: UINT SlotNumber;
425:
426: //
427: // Default information to add to the NICSR register value
428: //
429: USHORT NicsrDefaultValue;
430:
431: //
432: // Have the interrupts from the card been turned off.
433: //
434: BOOLEAN InterruptsStopped;
435:
436: //
437: // Address in memory of the network address
438: //
439: ULONG NetworkHardwareAddress;
440:
441: //
442: // The network address from the hardware.
443: //
444: CHAR NetworkAddress[ETH_LENGTH_OF_ADDRESS];
445:
446: //
447: // The network address from the hardware.
448: //
449: CHAR CurrentNetworkAddress[ETH_LENGTH_OF_ADDRESS];
450:
451: //
452: // Interrupt number
453: //
454: CCHAR InterruptNumber;
455:
456: //
457: // IRQL
458: //
459: CCHAR InterruptRequestLevel;
460:
461: // The following fields are accessed by the ISR and must be aligned to the
462: // minimum granularity of the architecture on which it runs
463:
464: #if defined(_ALPHA_)
465:
466: union {
467: UQUAD _ForceQuadwordAlignment;
468: struct {
469:
470: #endif // defined(_ALPHA_)
471:
472: //
473: // Holds a value of CSR0 from one or more interrupts.
474: // This value is only set by the interrupt service routine
475: // and cleared by the interrupt synchronization routine.
476: //
477: USHORT CSR0Value;
478:
479: #if defined(_ALPHA_)
480:
481: };
482: };
483:
484: #endif // defined(_ALPHA_)
485:
486: // End of ISR access fields
487:
488: //
489: // Holds the number of transmit ring entries.
490: //
491: // NOTE NOTE NOTE
492: //
493: // There is code that depends on the number of transmit entries
494: // being a power of two.
495: //
496: UINT NumberOfTransmitRings;
497:
498: //
499: // Holds the number of receive ring entries.
500: //
501: UINT NumberOfReceiveRings;
502:
503: //
504: // Holds the size of receive buffers.
505: //
506: UINT SizeOfReceiveBuffer;
507:
508: //
509: // Holds number of each buffer size.
510: //
511: UINT NumberOfSmallBuffers;
512: UINT NumberOfMediumBuffers;
513: UINT NumberOfLargeBuffers;
514:
515: //
516: // The log base two of the number of transmit ring entries.
517: //
518: UINT LogNumberTransmitRings;
519:
520: //
521: // The log base two of the number of receive ring entries.
522: //
523: UINT LogNumberReceiveRings;
524:
525: //
526: // Keeps a reference count on the current number of uses of
527: // this adapter block. Uses is defined to be the number of
528: // routines currently within the "external" interface.
529: //
530: UINT References;
531:
532: //
533: // List head for all open bindings for this adapter.
534: //
535: LIST_ENTRY OpenBindings;
536:
537: //
538: // List head for all opens that had outstanding references
539: // when an attempt was made to close them.
540: //
541: LIST_ENTRY CloseList;
542:
543: //
544: // Spinlock to protect fields in this structure..
545: //
546: NDIS_SPIN_LOCK Lock;
547:
548: //
549: // Handle given by NDIS when the MAC registered itself.
550: //
551: NDIS_HANDLE NdisMacHandle;
552:
553: //
554: // Handle given by NDIS when the adapter was registered.
555: //
556: NDIS_HANDLE NdisAdapterHandle;
557:
558: //
559: // Timer for Deferred Processing.
560: //
561: NDIS_TIMER DeferredTimer;
562:
563: //
564: // Flag if we have a ProcessInterrupt call in progress
565: //
566: BOOLEAN ProcessInterruptRunning;
567:
568: //
569: // Pointer to the filter database for the MAC.
570: //
571: PETH_FILTER FilterDB;
572:
573: //
574: // Pointer to the LANCE initialization block.
575: //
576: PLANCE_INITIALIZATION_BLOCK InitBlock;
577:
578: //
579: // Counter that records the number of transmit rings currently
580: // available for allocation.
581: //
582: UINT NumberOfAvailableRings;
583:
584: //
585: // Pointer to transmit descriptor ring entry that is the
586: // first ring entry available for allocation of transmit
587: // buffers.
588: //
589: // Can only be accessed when the adapter lock
590: // is held.
591: //
592: PLANCE_TRANSMIT_ENTRY AllocateableRing;
593:
594: //
595: // Pointer to a transmit descriptor ring entry that is the
596: // first ring entry that the MAC currently has made available
597: // for transmission.
598: //
599: // Can only be accessed when the adapter lock
600: // is held.
601: //
602: PLANCE_TRANSMIT_ENTRY TransmittingRing;
603:
604: //
605: // Pointer to the first packet that has been allocated to
606: // a transmit packet but has not yet been relinquished to
607: // the hardware. We need this pointer to keep the transmit
608: // post processing from running into a packet that has not
609: // been transmitted.
610: //
611: PLANCE_TRANSMIT_ENTRY FirstUncommittedRing;
612:
613: //
614: // Pointer to an array of structs that map transmit ring entries
615: // back to a packet.
616: //
617: PLANCE_RING_TO_PACKET RingToPacket;
618:
619: //
620: // Pointer to the transmit ring.
621: //
622: PLANCE_TRANSMIT_ENTRY TransmitRing;
623:
624: //
625: // Pointer to the last transmit ring entry.
626: //
627: PLANCE_TRANSMIT_ENTRY LastTransmitRingEntry;
628:
629: //
630: // Pointer to the receive ring.
631: //
632: PLANCE_RECEIVE_ENTRY ReceiveRing;
633:
634: //
635: // Pointer to the first packet on the loopback list.
636: //
637: // Can only be accessed when the adapter lock
638: // is held.
639: //
640: PNDIS_PACKET FirstLoopBack;
641:
642: //
643: // Pointer to the last packet on the loopback list.
644: //
645: // Can only be accessed when the adapter lock
646: // is held.
647: //
648: PNDIS_PACKET LastLoopBack;
649:
650: //
651: // Pointer to the first transmitting packet that is actually
652: // sending, or done with the living on the loopback queue.
653: //
654: // Can only be accessed when the adapter lock
655: // is held.
656: //
657: PNDIS_PACKET FirstFinishTransmit;
658:
659: //
660: // Pointer to the last transmitting packet that is actually
661: // sending, or done with the living on the loopback queue.
662: //
663: // Can only be accessed when the adapter lock
664: // is held.
665: //
666: PNDIS_PACKET LastFinishTransmit;
667:
668: //
669: // Listheads for the adapters buffers. If the list
670: // head is equal to -1 then there are no free elements
671: // on the list.
672: //
673: // The list heads must only be accessed when the
674: // adapter lock is held.
675: //
676: // Note that the listhead at index 0 will always be -1.
677: //
678: INT LanceBufferListHeads[4];
679:
680: //
681: // Pointers to an array of adapter buffer descriptors.
682: // The array will actually be threaded together by
683: // three free lists. The lists will be for small,
684: // medium and full sized packets.
685: //
686: PLANCE_BUFFER_DESCRIPTOR LanceBuffers;
687:
688: //
689: // These fields let the send allocation code know that it's
690: // futile to even try to move a packet along to that stage.
691: //
692: // All of the stages would be closed to close a binding
693: // or to reset the adapter.
694: //
695: // These variables can only be accessed when the adapter
696: // lock is held.
697: //
698: BOOLEAN StageOpen;
699:
700: //
701: // These AlreadyProcessingStage variables are set up to keep
702: // more than one thread from accessing a particular thread
703: // a one time.
704: //
705: // These variables can only be accessed when the adapter
706: // lock is held.
707: //
708: BOOLEAN AlreadyProcessingStage;
709:
710: //
711: // Did we indicate a packet? Used to tell if NdisIndicateReceiveComplete
712: // should be called.
713: //
714: BOOLEAN IndicatedAPacket;
715:
716: //
717: // Pointers to the first and last packets at a particular stage
718: // of allocation. All packets in transmit are linked
719: // via there next field.
720: //
721: // Can only be accessed when the adapter lock
722: // is held.
723: //
724: PNDIS_PACKET FirstStage1Packet;
725: PNDIS_PACKET LastStage1Packet;
726:
727: //
728: // Pointer to an array of virtual addresses that describe
729: // the virtual address of each receive ring descriptor buffer.
730: //
731: PVOID *ReceiveVAs;
732:
733: //
734: // Index of the receive ring descriptor that started the
735: // last packet not completely received by the hardware.
736: //
737: UINT CurrentReceiveIndex;
738:
739: //
740: // Counters to hold the various number of errors/statistics for both
741: // reception and transmission.
742: //
743: // Can only be accessed when the adapter lock is held.
744: //
745: UINT OutOfReceiveBuffers;
746: UINT CRCError;
747: UINT FramingError;
748: UINT RetryFailure;
749: UINT LostCarrier;
750: UINT LateCollision;
751: UINT UnderFlow;
752: UINT Deferred;
753: UINT OneRetry;
754: UINT MoreThanOneRetry;
755:
756: //
757: // Holds counts of more global errors for the driver. If we
758: // get a memory error then the device needs to be reset.
759: //
760: UINT MemoryError;
761: UINT Babble;
762: UINT MissedPacket;
763:
764: //
765: // Holds other cool counts.
766: //
767:
768: ULONG Transmit;
769: ULONG Receive;
770:
771: //
772: // Flag that when enabled lets routines know that a reset
773: // is in progress.
774: //
775: BOOLEAN ResetInProgress;
776:
777: //
778: // Flag that when enabled lets routines know that a reset
779: // is in progress and the initialization needs doing.
780: //
781: BOOLEAN ResetInitStarted;
782:
783: //
784: // Pointer to the binding that initiated the reset. This
785: // will be null if the reset is initiated by the MAC itself.
786: //
787: struct _LANCE_OPEN *ResettingOpen;
788:
789: //
790: // The NdisRequest that is causing the reset (either set
791: // packet filter or set multicast list)
792: //
793: PNDIS_REQUEST ResetNdisRequest;
794:
795: //
796: // The type of the request that caused the adapter to reset.
797: //
798: NDIS_REQUEST_TYPE ResetRequestType;
799:
800:
801: //
802: // A queue of NdisRequests that were queued during a reset.
803: //
804: PNDIS_REQUEST PendQueue;
805: PNDIS_REQUEST PendQueueTail;
806:
807: //
808: // During an indication this is set to the current indications context
809: //
810: LANCE_RECEIVE_CONTEXT IndicatingMacReceiveContext;
811:
812:
813: //
814: // Look ahead information.
815: //
816:
817: ULONG MaxLookAhead;
818:
819: //
820: // Open information
821: //
822: UCHAR MaxMulticastList;
823:
824: //
825: // Will be true the first time that the hardware is initialized
826: // by the driver initialization.
827: //
828: BOOLEAN FirstInitialization;
829:
830: //
831: // Will be true if the hardware fails for some reason
832: //
833: BOOLEAN HardwareFailure;
834:
835: //
836: // For handling missing interrupts (caused by user mis-configs)
837: //
838:
839: PVOID WakeUpDpc;
840: NDIS_TIMER WakeUpTimer;
841: BOOLEAN WakeUpTimeout;
842: UCHAR TimeoutCount;
843:
844: //
845: // Lookahead buffer for loopback packets
846: //
847: UCHAR Lookahead[LANCE_MAX_LOOKAHEAD + LANCE_HEADER_SIZE];
848:
849: } LANCE_ADAPTER,*PLANCE_ADAPTER;
850:
851: //
852: // Given a MacBindingHandle this macro returns a pointer to the
853: // LANCE_ADAPTER.
854: //
855: #define PLANCE_ADAPTER_FROM_BINDING_HANDLE(Handle) \
856: (((PLANCE_OPEN)(Handle))->OwningLance)
857:
858: //
859: // Given a MacContextHandle return the PLANCE_ADAPTER
860: // it represents.
861: //
862: #define PLANCE_ADAPTER_FROM_CONTEXT_HANDLE(Handle) \
863: ((PLANCE_ADAPTER)(Handle))
864:
865: //
866: // Given a pointer to a LANCE_ADAPTER return the
867: // proper MacContextHandle.
868: //
869: #define CONTEXT_HANDLE_FROM_PLANCE_ADAPTER(Ptr) \
870: ((NDIS_HANDLE)(Ptr))
871:
872:
873: //
874: // One of these structures is created on each MacOpenAdapter.
875: //
876: typedef struct _LANCE_OPEN {
877:
878: //
879: // Linking structure for all of the open bindings of a particular
880: // adapter. This MUST be the first item in the structure.
881: //
882: LIST_ENTRY OpenList;
883:
884: //
885: // The Adapter that requested this open binding.
886: //
887: PLANCE_ADAPTER OwningLance;
888:
889: //
890: // Handle of this adapter in the filter database.
891: //
892: NDIS_HANDLE NdisFilterHandle;
893:
894: //
895: // Given by NDIS when the adapter was opened.
896: //
897: NDIS_HANDLE NdisBindingContext;
898:
899: //
900: // Minimum Number of bytes for a lookahead.
901: //
902: UINT LookAhead;
903:
904: //
905: // Counter of all the different reasons that a open binding
906: // couldn't be closed. This would be incremented each time
907: // for:
908: //
909: // While a particular interface routine is accessing this open
910: //
911: // During an indication.
912: //
913: // When the open causes a reset.
914: //
915: // A packet currently being sent.
916: //
917: // (Basically the above two mean any time the open has left
918: // some processing around to be accomplished later.)
919: //
920: // This field should only be accessed when the adapter lock is held.
921: //
922: UINT References;
923:
924: //
925: // A flag indicating that this binding is in the process of closing.
926: //
927: BOOLEAN BindingShuttingDown;
928:
929: LANCE_PEND_DATA CloseMulticastRequest;
930:
931: LANCE_PEND_DATA CloseFilterRequest;
932:
933: } LANCE_OPEN,*PLANCE_OPEN;
934:
935: //
936: // This macro returns a pointer to a PLANCE_OPEN given a MacBindingHandle.
937: //
938: #define PLANCE_OPEN_FROM_BINDING_HANDLE(Handle) \
939: ((PLANCE_OPEN)(Handle))
940:
941: //
942: // This macro returns a NDIS_HANDLE from a PLANCE_OPEN
943: //
944: #define BINDING_HANDLE_FROM_PLANCE_OPEN(Open) \
945: ((NDIS_HANDLE)(Open))
946:
947:
948: //
949: // This macro will act a "epilogue" to every routine in the
950: // *interface*. It will check whether any requests need
951: // to defer their processing. It will also decrement the reference
952: // count on the adapter. If the reference count is zero and there
953: // is deferred work to do it will insert the interrupt processing
954: // routine in the DPC queue.
955: //
956: // Note that we don't need to include checking for blocked receives
957: // since blocked receives imply that there will eventually be an
958: // interrupt.
959: //
960: // NOTE: This macro assumes that it is called with the lock acquired.
961: //
962: // ZZZ This routine is NT specific.
963: //
964: #define LANCE_DO_DEFERRED(Adapter) \
965: { \
966: PLANCE_ADAPTER _A = (Adapter); \
967: _A->References--; \
968: if ((!_A->References) && \
969: (_A->ResetInProgress || \
970: _A->FirstLoopBack || \
971: (!IsListEmpty(&_A->CloseList)))) { \
972: NdisReleaseSpinLock(&_A->Lock); \
973: NdisSetTimer(&_A->DeferredTimer, 0);\
974: } else { \
975: NdisReleaseSpinLock(&_A->Lock); \
976: } \
977: }
978:
979:
980:
981:
982: //
983: // Procedures which log errors.
984: //
985:
986: typedef enum _LANCE_PROC_ID {
987: openAdapter,
988: processInterrupt
989: } LANCE_PROC_ID;
990:
991:
992: #define LANCE_ERRMSG_NDIS_ALLOC_MEM (ULONG)0x01
993:
994:
995:
996:
997:
998:
999:
1000:
1001:
1002:
1003:
1004:
1005:
1006:
1007: //
1008: // This macro is used to "allocate" memory for the structures that
1009: // must be shared with the hardware. It assigns a pvoid that is
1010: // at least quadword aligned.
1011: //
1012: #define LANCE_ALLOCATE_MEMORY_FOR_HARDWARE(A,S,P) \
1013: { \
1014: PLANCE_ADAPTER _Adapter = (A); \
1015: UINT _Size = (((S) + 7)/8)*8; \
1016: PVOID _HighWater; \
1017: if (!_Size) { \
1018: *(P) = NULL; \
1019: } else { \
1020: _HighWater = ((PCHAR)_Adapter->CurrentMemoryFirstFree) + _Size; \
1021: if (((PUCHAR)_HighWater) > \
1022: (((PUCHAR)_Adapter->MemoryFirstUnavailable) + 1)) { \
1023: *(P) = NULL; \
1024: } else { \
1025: *(P) = _Adapter->CurrentMemoryFirstFree; \
1026: _Adapter->CurrentMemoryFirstFree = _HighWater; \
1027: } \
1028: } \
1029: }
1030:
1031: //
1032: // We now convert the virtual address to the actual physical address.
1033: //
1034: #ifdef NDIS_NT
1035:
1036: #define LANCE_GET_HARDWARE_PHYSICAL_ADDRESS(A,P) \
1037: (RtlConvertUlongToLargeInteger((ULONG) \
1038: ((ULONG)((PVOID)P) - (ULONG)((PVOID)A->MmMappedBaseAddr) + (A->HardwareBaseOffset))))
1039:
1040: #else
1041:
1042: #define LANCE_GET_HARDWARE_PHYSICAL_ADDRESS(A,P) \
1043: ((ULONG)((PUCHAR)(A->HardwareBaseAddr) +\
1044: ((ULONG)((PVOID)P) - (ULONG)((PVOID)A->MmMappedBaseAddr))))
1045:
1046: #endif //NDIS_NT
1047:
1048:
1049: //
1050: // This macro is used to "deallocate the memory from the hardware.
1051: // Since this is hardware memory that is only allocated and deallocated
1052: // once this macro really doesn't do anything.
1053: //
1054: #define LANCE_DEALLOCATE_MEMORY_FOR_HARDWARE(A,P)\
1055: {\
1056: }
1057:
1058:
1059:
1060:
1061:
1062: //
1063: // These are routines for synchronizing with the ISR
1064: //
1065:
1066:
1067: //
1068: // This structure is used to synchronize reading and writing to ports
1069: // with the ISR.
1070: //
1071:
1072: typedef struct _LANCE_SYNCH_CONTEXT {
1073:
1074: //
1075: // Pointer to the lance adapter for which interrupts are
1076: // being synchronized.
1077: //
1078: PLANCE_ADAPTER Adapter;
1079:
1080: //
1081: // Pointer to a local variable that will receive the value
1082: //
1083: PUSHORT LocalRead;
1084:
1085: //
1086: // Value to write
1087: //
1088: USHORT LocalWrite;
1089:
1090: } LANCE_SYNCH_CONTEXT,*PLANCE_SYNCH_CONTEXT;
1091:
1092:
1093:
1094: #define LANCE_WRITE_RAP(A,C) { \
1095: PLANCE_ADAPTER _A = A; \
1096: LANCE_SYNCH_CONTEXT _C; \
1097: _C.Adapter = _A; \
1098: _C.LocalWrite = (C); \
1099: NdisSynchronizeWithInterrupt( \
1100: &(_A)->Interrupt, \
1101: LanceSyncWriteRAP, \
1102: &_C \
1103: ); \
1104: }
1105:
1106:
1107: #define LANCE_WRITE_RDP(A,C) { \
1108: PLANCE_ADAPTER _A = A; \
1109: LANCE_SYNCH_CONTEXT _C; \
1110: _C.Adapter = _A; \
1111: _C.LocalWrite = (C); \
1112: NdisSynchronizeWithInterrupt( \
1113: &(_A)->Interrupt, \
1114: LanceSyncWriteRDP, \
1115: &_C \
1116: ); \
1117: }
1118:
1119: #define LANCE_READ_RDP(A,C) { \
1120: PLANCE_ADAPTER _A = A; \
1121: LANCE_SYNCH_CONTEXT _C; \
1122: _C.Adapter = _A; \
1123: _C.LocalRead = (C); \
1124: NdisSynchronizeWithInterrupt( \
1125: &(_A)->Interrupt, \
1126: LanceSyncReadRDP, \
1127: &_C \
1128: ); \
1129: }
1130:
1131: #define LANCE_WRITE_NICSR(A,C) { \
1132: PLANCE_ADAPTER _A = A; \
1133: LANCE_SYNCH_CONTEXT _C; \
1134: _C.Adapter = _A; \
1135: _C.LocalWrite = (C | _A->NicsrDefaultValue); \
1136: NdisSynchronizeWithInterrupt( \
1137: &(_A)->Interrupt, \
1138: LanceSyncWriteNicsr, \
1139: &_C \
1140: ); \
1141: }
1142:
1143:
1144:
1145: BOOLEAN
1146: LanceSyncWriteRAP(
1147: IN PVOID Context
1148: );
1149:
1150: BOOLEAN
1151: LanceSyncWriteRDP(
1152: IN PVOID Context
1153: );
1154:
1155: BOOLEAN
1156: LanceSyncReadRDP(
1157: IN PVOID Context
1158: );
1159:
1160: BOOLEAN
1161: LanceSyncWriteNicsr(
1162: IN PVOID Context
1163: );
1164:
1165: BOOLEAN
1166: LanceSyncGetInterruptsStopped(
1167: IN PVOID Context
1168: );
1169:
1170: BOOLEAN
1171: LanceSyncStopChip(
1172: IN PVOID Context
1173: );
1174:
1175:
1176: //
1177: // We define the external interfaces to the lance driver.
1178: // These routines are only external to permit separate
1179: // compilation. Given a truely fast compiler they could
1180: // all reside in a single file and be static.
1181: //
1182:
1183: extern
1184: NDIS_STATUS
1185: LanceTransferData(
1186: IN NDIS_HANDLE MacBindingHandle,
1187: IN NDIS_HANDLE MacReceiveContext,
1188: IN UINT ByteOffset,
1189: IN UINT BytesToTransfer,
1190: OUT PNDIS_PACKET Packet,
1191: OUT PUINT BytesTransferred
1192: );
1193:
1194: extern
1195: NDIS_STATUS
1196: LanceSend(
1197: IN NDIS_HANDLE MacBindingHandle,
1198: IN PNDIS_PACKET Packet
1199: );
1200:
1201:
1202: extern
1203: VOID
1204: LanceStagedAllocation(
1205: IN PLANCE_ADAPTER Adapter
1206: );
1207:
1208: extern
1209: VOID
1210: LanceCopyFromPacketToBuffer(
1211: IN PNDIS_PACKET Packet,
1212: IN UINT Offset,
1213: IN UINT BytesToCopy,
1214: OUT PCHAR Buffer,
1215: OUT PUINT BytesCopied
1216: );
1217:
1218: extern
1219: VOID
1220: LanceCopyFromPacketToPacket(
1221: IN PNDIS_PACKET Destination,
1222: IN UINT DestinationOffset,
1223: IN UINT BytesToCopy,
1224: IN PNDIS_PACKET Source,
1225: IN UINT SourceOffset,
1226: OUT PUINT BytesCopied
1227: );
1228:
1229: extern
1230: VOID
1231: LanceProcessLoopback(
1232: IN PLANCE_ADAPTER Adapter
1233: );
1234:
1235: extern
1236: BOOLEAN
1237: LanceHardwareDetails(
1238: IN PLANCE_ADAPTER Adapter
1239: );
1240:
1241: extern
1242: NDIS_STATUS
1243: LanceRegisterAdapter(
1244: IN PLANCE_ADAPTER Adapter
1245: );
1246:
1247: NDIS_STATUS
1248: LanceAddAdapter(
1249: IN NDIS_HANDLE MacMacContext,
1250: IN NDIS_HANDLE ConfigurationHandle,
1251: IN PNDIS_STRING AdaptName
1252: );
1253:
1254: VOID
1255: LanceRemoveAdapter(
1256: IN PVOID MacAdapterContext
1257: );
1258:
1259: VOID
1260: SetupAllocate(
1261: IN PLANCE_ADAPTER Adapter,
1262: IN NDIS_HANDLE MacBindingHandle,
1263: IN PNDIS_PACKET Packet
1264: );
1265:
1266: VOID
1267: LanceWakeUpDpc(
1268: IN PVOID SystemSpecific1,
1269: IN PVOID Context,
1270: IN PVOID SystemSpecific2,
1271: IN PVOID SystemSpecific3
1272: );
1273:
1274: #endif // _LANCESFT_
1275:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.