|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1990 Microsoft Corporation
4:
5: Module Name:
6:
7: toksft.h
8:
9: Abstract:
10:
11: The main header for a IBMTOK NDIS driver.
12:
13: The overall structure is taken from the Lance driver
14: by Tony Ercolano.
15:
16: Author:
17:
18: Anthony V. Ercolano (tonye) creation-date 19-Jun-1990
19: Adam Barr (adamba) 20-Nov-1990
20:
21: Environment:
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:
33: --*/
34:
35: #ifndef _IBMTOKSFT_
36: #define _IBMTOKSFT_
37:
38:
39: #define IBMTOK_NDIS_MAJOR_VERSION 3
40: #define IBMTOK_NDIS_MINOR_VERSION 0
41:
42:
43: #if DBG
44: #define LOG 1
45: #else
46: #define LOG 0
47: #endif
48:
49: extern const NDIS_PHYSICAL_ADDRESS HighestAcceptableMax;
50:
51: #define IBMTOK_ALLOC_PHYS(pp,s) NdisAllocateMemory((PVOID *)(pp),(s),0,HighestAcceptableMax)
52: #define IBMTOK_FREE_PHYS(p,s) NdisFreeMemory((PVOID)(p),(s),0)
53: #define IBMTOK_MOVE_MEMORY(Destination,Source,Length) NdisMoveMemory((PVOID)(Destination),(PVOID)(Source),Length)
54: #define IBMTOK_ZERO_MEMORY(Destination,Length) NdisZeroMemory((PVOID)(Destination),Length)
55: #define IBMTOK_MOVE_TO_MAPPED_MEMORY(Destination,Source,Length) NdisMoveToMappedMemory((PVOID)(Destination),(PVOID)(Source),Length)
56: #define IBMTOK_MOVE_FROM_MAPPED_MEMORY(Destination,Source,Length) NdisMoveFromMappedMemory((PVOID)(Destination),(PVOID)(Source),Length)
57: #define IBMTOK_ZERO_MAPPED_MEMORY(Destination,Length) NdisZeroMappedMemory((PVOID)(Destination),Length)
58: #define IBMTOK_STORE_ULONG(Destination,Source)\
59: {\
60: PUCHAR _D = (PUCHAR)(Destination);\
61: ULONG _S = (ULONG)(Source);\
62: _D[0] = (UCHAR)(_S >> 24);\
63: _D[1] = (UCHAR)(_S >> 16);\
64: _D[2] = (UCHAR)(_S >> 8);\
65: _D[3] = (UCHAR)(_S);\
66: }
67:
68:
69: typedef struct _IBMTOK_MAC {
70:
71: //
72: // The handle returned by NdisInitializeWrapper.
73: //
74:
75: NDIS_HANDLE NdisWrapperHandle;
76:
77: //
78: // The handle returned by NdisRegisterMac.
79: //
80:
81: NDIS_HANDLE NdisMacHandle;
82:
83: } IBMTOK_MAC, *PIBMTOK_MAC;
84:
85:
86:
87: //
88: // This record type is inserted into the MacReserved portion
89: // of the packet header when the packet is going through the
90: // staged allocation of buffer space prior to the actual send.
91: //
92: typedef struct _IBMTOK_RESERVED {
93:
94: //
95: // Points to the next packet in the chain of queued packets
96: // waiting for the SRB or the ASB.
97: //
98: // The packet will start out on the Transmit queue,
99: // then move to TransmittingPacket when its transmit is
100: // in the SRB. When the correlator is assigned it is placed
101: // in CorrelatorArray (where the Next field is not used),
102: // and at that time may also be in WaitingForAsb if it
103: // needs the ASB to acknowledge the copying down of the
104: // transmit data. Packets are completed out of the
105: // CorrelatorArray.
106: //
107: //
108: PNDIS_PACKET Next;
109:
110: //
111: // This field holds the binding handle of the open binding
112: // that submitted this packet for send.
113: //
114: NDIS_HANDLE MacBindingHandle;
115:
116: //
117: // This field holds the pointer to the packet so that when
118: // the send finnaly completes it can be used to indicate to
119: // the protocol.
120: //
121: PNDIS_PACKET Packet;
122:
123: //
124: // TRUE if a command correlator has been assigned for this
125: // packet.
126: //
127: BOOLEAN CorrelatorAssigned;
128:
129: //
130: // The value of the adapter-assigned command correlator.
131: //
132: UCHAR CommandCorrelator;
133:
134: } IBMTOK_RESERVED,*PIBMTOK_RESERVED;
135:
136:
137: //
138: // This macro will return a pointer to the reserved portion
139: // of a packet given a pointer to a packet.
140: //
141: #define PIBMTOK_RESERVED_FROM_PACKET(Packet) \
142: ((PIBMTOK_RESERVED)((PVOID)((Packet)->MacReserved)))
143:
144:
145:
146: //
147: // This structure is inserted into the MacReserved section of the
148: // NDIS_REQUEST for operations that must pend. Note: the sizeof
149: // this structure must be less than or equal to 16 bytes.
150: //
151: // The flags are broken down as follows....
152: //
153: // Type == IBMTOK_PEND_MAC for requests submitted by the MAC to clear card errors.
154: // ReadLogPending == TRUE if the MAC submitted a DIR.READ.LOG command.
155: // ReadLogPending == FALSE if the MAC submitted DLC.STATISTICS.
156: //
157: // Type == IBMTOK_PEND_NDIS_CLOSE for request submitted thru Ndis.
158: // Open, the open that submitted the Ndis request.
159: //
160: // Type == IBMTOK_PEND_NDIS_SET_FILTER for request submitted thru Ndis.
161: // Open, the open that submitted the Ndis request.
162: //
163: // Type == IBMTOK_PEND_NDIS_STATISTICS for request submitted thru Ndis.
164: // ReadLogPending, Boolean if the DIR.READ.LOG command was submitted.
165: //
166: //
167: //
168: typedef struct _IBMTOK_PEND_DATA{
169:
170: //
171: // Points to the next request in the chain of queued packets
172: // waiting for the SRB.
173: //
174: // The request will start out on the PendQueue,
175: // then move to front of the queue when its operation is
176: // in the SRB.
177: //
178: //
179: struct _IBMTOK_PEND_DATA * Next;
180:
181:
182: union _COMMAND{
183:
184: struct _MAC{
185:
186: //
187: // Whether the statistics command was a
188: // DIR.READ.LOG or DLC.STATISTICS
189: //
190:
191: UINT ReadLogPending;
192:
193: }MAC;
194:
195: union _NDIS{
196:
197: struct _CLOSE{
198:
199: //
200: // This field holds the open instance which submitted the
201: // request.
202: //
203:
204: struct _IBMTOK_OPEN *Open;
205:
206: //
207: // This field holds the new filter value.
208: //
209:
210: UINT NewFilterValue;
211:
212:
213: }CLOSE;
214:
215:
216: struct _SET_FILTER{
217:
218: //
219: // The first two fields of SET_FILTER and SET_ADDRESS need
220: // to align so that the processing in FinishSetOperation
221: // is easier.
222: //
223:
224:
225: //
226: // This field holds the open instance which submitted the
227: // request.
228: //
229:
230: struct _IBMTOK_OPEN *Open;
231:
232: //
233: // This field holds the new filter value.
234: //
235:
236: UINT NewFilterValue;
237:
238: }SET_FILTER;
239:
240:
241: struct _SET_ADDRESS{
242:
243: //
244: // The first two fields of SET_FILTER and SET_ADDRESS need
245: // to align so that the processing in FinishSetOperation
246: // is easier.
247: //
248:
249:
250: //
251: // This field holds the open instance which submitted the
252: // request.
253: //
254:
255: struct _IBMTOK_OPEN *Open;
256:
257: //
258: // This field holds the new address value.
259: //
260:
261: TR_FUNCTIONAL_ADDRESS NewAddressValue;
262:
263: }SET_ADDRESS;
264:
265:
266: struct _STATISTICS{
267:
268: //
269: // Pointer into NdisRequest at the New filter value.
270: //
271:
272: BOOLEAN ReadLogPending;
273:
274:
275: }STATISTICS;
276:
277: }NDIS;
278:
279: }COMMAND;
280:
281: //
282: // Buffer to fill in Reserved section so that the next field overlaps
283: // with the RequestType in the NdisRequest.
284: //
285:
286: ULONG Buffer;
287:
288:
289: NDIS_REQUEST_TYPE RequestType;
290:
291:
292: }IBMTOK_PEND_DATA, *PIBMTOK_PEND_DATA;
293:
294: //
295: // This macro will return a pointer to the reserved area of
296: // a PNDIS_REQUEST.
297: //
298: #define PIBMTOK_PEND_DATA_FROM_PNDIS_REQUEST(Request) \
299: ((PIBMTOK_PEND_DATA)((PVOID)((Request)->MacReserved)))
300:
301: //
302: // This macros returns the enclosing NdisRequest.
303: //
304: #define PNDIS_REQUEST_FROM_PIBMTOK_PEND_DATA(PendOp)\
305: ((PNDIS_REQUEST)((PVOID)(PendOp)))
306:
307: //
308: // Define Maximum number of bytes a protocol can read during a
309: // receive data indication.
310: //
311: #define IBMTOK_MAX_LOOKAHEAD 208
312:
313:
314: typedef struct _IBMTOK_ADAPTER {
315:
316: //
317: // Holds the interrupt object for this adapter.
318: //
319: NDIS_INTERRUPT Interrupt;
320:
321: //
322: // Flag to tell if the ISR removed the interrupt.
323: //
324: UCHAR ContinuousIsrs;
325:
326: PVOID WakeUpDpc;
327: NDIS_TIMER WakeUpTimer;
328: BOOLEAN WakeUpTimeout;
329:
330: //
331: // Flag to indicate that the card initialized.
332: //
333: BOOLEAN BringUp;
334:
335: //
336: // Spinlock for the interrupt.
337: //
338: NDIS_SPIN_LOCK InterruptLock;
339:
340: //
341: // The interrupt level as read from the card.
342: //
343: UINT InterruptLevel;
344:
345: //
346: // Is the adapter running at 16 Mbps (versus 4 Mbps).
347: //
348: BOOLEAN Running16Mbps;
349:
350: //
351: // Is the adapter using the PC I/O Bus (versus MicroChannel).
352: //
353: BOOLEAN UsingPcIoBus;
354:
355: //
356: // Does the upper 512 bytes of the shared RAM have to
357: // be zeroed after initialization.
358: //
359: BOOLEAN UpperSharedRamZero;
360:
361: //
362: // Are we using Shared RAM paging.
363: //
364: BOOLEAN SharedRamPaging;
365:
366: //
367: // The size of the RAM on the adapter.
368: //
369: ULONG TotalSharedRam;
370:
371: //
372: // The amount of Shared RAM to be mapped in.
373: //
374: ULONG MappedSharedRam;
375:
376: //
377: // The maximum size of a DHB at 4 Mbps.
378: //
379: USHORT Max4MbpsDhb;
380:
381: //
382: // The maximum size of a DHB at 16 Mbps.
383: //
384: USHORT Max16MbpsDhb;
385:
386: //
387: // Value of the RRR Low register (address of Shared Ram).
388: //
389: UCHAR RrrLowValue;
390:
391: // The following fields are accessed by the ISR and must be aligned to the
392: // minimum granularity of the architecture on which it runs
393:
394: #if defined(_ALPHA_)
395:
396: union {
397: UQUAD _ForceQuadwordAlignment;
398: struct {
399:
400: #endif // defined(_ALPHA_)
401:
402: //
403: // These variables are used to hold bits stored in the ISR
404: // and read in the DPC.
405: //
406: UCHAR IsrpBits;
407:
408: //
409: // These hold ISR bits whose processing is delayed because
410: // the adapter is not accepting requests.
411: //
412: UCHAR IsrpDeferredBits;
413:
414: //
415: // Any Error conditions found in the IsrpLow register
416: //
417: UCHAR IsrpLowBits;
418:
419: #if defined(_ALPHA_)
420:
421: };
422: };
423:
424: #endif // defined(_ALPHA_)
425:
426: // End of ISR access fields
427:
428: //
429: // This boolean is used as a gate to ensure that only one thread
430: // of execution is actually processing SRB interrupts
431: //
432: BOOLEAN HandleSrbRunning;
433:
434: //
435: // This boolean is used as a gate to ensure that only one thread
436: // of execution is actually processing SRB interrupts
437: //
438: BOOLEAN HandleArbRunning;
439:
440: //
441: // The network address in use.
442: //
443: CHAR NetworkAddress[TR_LENGTH_OF_ADDRESS];
444:
445: //
446: // The network address from the hardware.
447: //
448: CHAR PermanentNetworkAddress[TR_LENGTH_OF_ADDRESS];
449:
450: //
451: // Pointer to the beginning of the IBMTOK ports.
452: //
453: ULONG IbmtokPortAddress;
454:
455: //
456: // Keeps a reference count on the current number of uses of
457: // this adapter block. Uses is defined to be the number of
458: // routines currently within the "external" interface.
459: //
460: UINT References;
461:
462: //
463: // List head for all open bindings for this adapter.
464: //
465: LIST_ENTRY OpenBindings;
466:
467: //
468: // List head for all opens that had outstanding references
469: // when an attempt was made to close them.
470: //
471: LIST_ENTRY CloseList;
472:
473: //
474: // List head for all opens that were attempted to be closed
475: // during a reset.
476: LIST_ENTRY CloseDuringResetList;
477:
478: //
479: // Spinlock to protect fields in this structure..
480: //
481: NDIS_SPIN_LOCK Lock;
482:
483: //
484: // Handle given by NDIS when the MAC registered itself.
485: //
486: NDIS_HANDLE NdisMacHandle;
487:
488: //
489: // Handle given by NDIS when the adapter was registered.
490: //
491: NDIS_HANDLE NdisAdapterHandle;
492:
493: //
494: // Pointer to the filter database for the MAC.
495: //
496: PTR_FILTER FilterDB;
497:
498: //
499: // Holds queued Pending operations.
500: //
501: PIBMTOK_PEND_DATA PendQueue;
502:
503: //
504: // Last pending operation on queue.
505: //
506: PIBMTOK_PEND_DATA EndOfPendQueue;
507:
508: //
509: // Pointer to the pended operation that is currently executing.
510: //
511: PIBMTOK_PEND_DATA PendData;
512:
513: //
514: // The current packet filter.
515: //
516: UINT CurrentPacketFilter;
517:
518: //
519: // The old packet filter (in case of failure to set to a new filter).
520: //
521: UINT OldPacketFilter;
522:
523: //
524: // The current functional address requested.
525: //
526: TR_FUNCTIONAL_ADDRESS CurrentFunctionalAddress;
527:
528: //
529: // The functional address on the card (may differ
530: // from CurrentFunctionalAddress if ALL_MULTICAST
531: // is selected).
532: //
533: TR_FUNCTIONAL_ADDRESS CurrentCardFunctional;
534:
535: //
536: // The current group address requested.
537: //
538: TR_FUNCTIONAL_ADDRESS CurrentGroupAddress;
539:
540: //
541: // The group address on the card
542: //
543: TR_FUNCTIONAL_ADDRESS CurrentCardGroup;
544:
545: //
546: // The address that the MMIO is mapped to.
547: //
548: PUCHAR MmioRegion;
549:
550: //
551: // The address that the Shared RAM is mapped to.
552: //
553: PUCHAR SharedRam;
554:
555: //
556: // Initial offset of WRB in Shared RAM (contains location
557: // of bring-up SRB).
558: //
559: USHORT InitialWrbOffset;
560:
561: //
562: // Addresses of the Shared RAM structures.
563: //
564: PVOID SrbAddress;
565: PVOID SsbAddress;
566: PVOID ArbAddress;
567: PVOID AsbAddress;
568:
569: //
570: // For Shared RAM Paging mode, the SRPR Low value needed
571: // to talk to each of the Shared RAM structures.
572: //
573: UCHAR SrbSrprLow;
574: UCHAR SsbSrprLow;
575: UCHAR ArbSrprLow;
576: UCHAR AsbSrprLow;
577:
578: //
579: // Is the SRB available.
580: //
581: BOOLEAN SrbAvailable;
582:
583: //
584: // Is the ASB available.
585: //
586: BOOLEAN AsbAvailable;
587:
588: //
589: // The next correlator number which we think we should
590: // be completing the send for.
591: //
592: UCHAR NextCorrelatorToComplete;
593:
594: //
595: // Points to the packet being transmitted if TransmitInSrb
596: // is TRUE.
597: //
598: PNDIS_PACKET TransmittingPacket;
599:
600: //
601: // The receive buffer that is waiting for the ASB.
602: //
603: SRAM_PTR ReceiveWaitingForAsbList;
604:
605: //
606: // A SRAM_PTR to the last receive buffer waiting for
607: // the ASB to indicate completion.
608: //
609: SRAM_PTR ReceiveWaitingForAsbEnd;
610:
611:
612: //
613: // The receive buffer that the transfer data should
614: // begin at (used during receive indications).
615: //
616: SRAM_PTR IndicatedReceiveBuffer;
617:
618: //
619: // Length of the header for this received indication.
620: //
621: USHORT IndicatedHeaderLength;
622:
623: //
624: // Should the ASB be used for a receive next.
625: //
626: BOOLEAN UseNextAsbForReceive;
627:
628: //
629: // The number of transmit buffers.
630: //
631: USHORT NumberOfTransmitBuffers;
632:
633: //
634: // The size of the transmit buffers.
635: //
636: USHORT TransmitBufferLength;
637:
638: //
639: // The size of the maximum packet transmittable.
640: //
641: UINT MaxTransmittablePacket;
642:
643: //
644: // The number of receive buffers.
645: //
646: USHORT NumberOfReceiveBuffers;
647:
648: //
649: // The size of the receive buffers.
650: //
651: USHORT ReceiveBufferLength;
652:
653: //
654: // Pointers to the first and last packets at a particular stage
655: // of allocation. All packets in transmit are linked
656: // via there next field.
657: //
658: // Can only be accessed when the adapter lock
659: // is held.
660: //
661: PNDIS_PACKET FirstTransmit;
662: PNDIS_PACKET LastTransmit;
663:
664: PNDIS_PACKET FirstWaitingForAsb;
665: PNDIS_PACKET LastWaitingForAsb;
666:
667: //
668: // Holds counter return by DLC.STATISTICS command.
669: //
670:
671: UINT FramesTransmitted;
672: UINT FramesReceived;
673: UINT FrameTransmitErrors;
674: UINT FrameReceiveErrors;
675:
676:
677: //
678: // Holds counter returned by the DIR.READ.LOG command.
679: //
680: UINT LineErrors;
681: UINT InternalErrors;
682: UINT BurstErrors;
683: UINT AcErrors;
684: UINT AbortDelimeters;
685: UINT LostFrames;
686: UINT ReceiveCongestionCount;
687: UINT FrameCopiedErrors;
688: UINT FrequencyErrors;
689: UINT TokenErrors;
690:
691: //
692: // Holds number of different types of RING.STATUS.CHANGE
693: // indications.
694: //
695: UINT SignalLoss;
696: UINT HardError;
697: UINT SoftError;
698: UINT TransmitBeacon;
699: UINT LobeWireFault;
700: UINT AutoRemovalError;
701: UINT RemoveReceived;
702: UINT CounterOverflow;
703: UINT SingleStation;
704: UINT RingRecovery;
705:
706: //
707: // Last ring status indicated to protocols.
708: //
709: NDIS_STATUS LastNotifyStatus;
710:
711: //
712: // Current state of the ring.
713: //
714: NDIS_802_5_RING_STATE CurrentRingState;
715:
716: //
717: // Flag that when enabled lets routines know that a reset
718: // is in progress.
719: //
720: BOOLEAN ResetInProgress;
721:
722: //
723: // The progress of the reset.
724: //
725: UINT CurrentResetStage;
726:
727: //
728: // LookAhead information
729: //
730:
731: ULONG LookAhead;
732:
733: //
734: // TRUE when the ISR is expecting the next interrupt to
735: // be the one following adapter reset.
736: //
737: BOOLEAN ResetInterruptAllowed;
738:
739: //
740: // TRUE when ISR gets the reset interrupt.
741: //
742: BOOLEAN ResetInterruptHasArrived;
743:
744: //
745: // Pointer to the binding that initiated the reset. This
746: // will be null if the reset is initiated by the MAC itself.
747: //
748: struct _IBMTOK_OPEN *ResettingOpen;
749:
750: //
751: // Will be true the first time that the hardware is initialized
752: // by the driver initialization.
753: //
754: BOOLEAN FirstInitialization;
755:
756: //
757: // Will be true if the adapter is not yet opened.
758: //
759: BOOLEAN AdapterNotOpen;
760:
761: //
762: // Will be true if the driver is being opened.
763: //
764: BOOLEAN OpenInProgress;
765:
766: //
767: // TRUE if ResetInProgress or OpenInProgress is TRUE.
768: //
769: BOOLEAN NotAcceptingRequests;
770:
771: //
772: // Last Error Code.
773: //
774: USHORT OpenErrorCode;
775:
776: //
777: // TRUE if we get a ring status indicating the cable is unplugged.
778: //
779: BOOLEAN Unplugged;
780:
781: //
782: // TRUE if we are doing a reset after the cable was unplugged
783: // to try to reenter the ring.
784: //
785: BOOLEAN UnpluggedResetInProgress;
786:
787: //
788: // TRUE if we have gotten a lobe wire fault indication,
789: // meaning the adapter is closed.
790: //
791: BOOLEAN LobeWireFaultIndicated;
792:
793: //
794: // TRUE if there exists an outstanding ASB_FREE_REQUEST
795: //
796: BOOLEAN OutstandingAsbFreeRequest;
797:
798: //
799: // The command correlator array (put this at the end since
800: // it is so big).
801: //
802: PNDIS_PACKET CorrelatorArray[MAX_COMMAND_CORRELATOR];
803:
804: } IBMTOK_ADAPTER,*PIBMTOK_ADAPTER;
805:
806:
807: //
808: // Given a MacBindingHandle this macro returns a pointer to the
809: // IBMTOK_ADAPTER.
810: //
811: #define PIBMTOK_ADAPTER_FROM_BINDING_HANDLE(Handle) \
812: (((PIBMTOK_OPEN)((PVOID)(Handle)))->OwningIbmtok)
813:
814:
815: //
816: // Given a MacContextHandle return the PIBMTOK_ADAPTER
817: // it represents.
818: //
819: #define PIBMTOK_ADAPTER_FROM_CONTEXT_HANDLE(Handle) \
820: ((PIBMTOK_ADAPTER)((PVOID)(Handle)))
821:
822:
823: //
824: // Given a pointer to a IBMTOK_ADAPTER return the
825: // proper MacContextHandle.
826: //
827: #define CONTEXT_HANDLE_FROM_PIBMTOK_ADAPTER(Ptr) \
828: ((NDIS_HANDLE)((PVOID)(Ptr)))
829:
830:
831: //
832: // One of these structures is created on each MacOpenAdapter.
833: //
834: typedef struct _IBMTOK_OPEN {
835:
836: //
837: // Linking structure for all of the open bindings of a particular
838: // adapter.
839: //
840: LIST_ENTRY OpenList;
841:
842: //
843: // The Adapter that requested this open binding.
844: //
845: PIBMTOK_ADAPTER OwningIbmtok;
846:
847: //
848: // Handle of this adapter in the filter database.
849: //
850: NDIS_HANDLE NdisFilterHandle;
851:
852: //
853: // Given by NDIS when the adapter was opened.
854: //
855: NDIS_HANDLE NdisBindingContext;
856:
857: //
858: // Counter of all the different reasons that a open binding
859: // couldn't be closed. This would be incremented each time
860: // for:
861: //
862: // While a particular interface routine is accessing this open
863: //
864: // During an indication.
865: //
866: // When the open causes a reset.
867: //
868: // A packet currently being sent.
869: //
870: // (Basically the above two mean any time the open has left
871: // some processing around to be accomplished later.)
872: //
873: // This field should only be accessed when the adapter lock is held.
874: //
875: UINT References;
876:
877: //
878: // Minimum Number of bytes for a lookahead.
879: //
880: UINT LookAhead;
881:
882: //
883: // A flag indicating that the open has pended.
884: //
885: BOOLEAN OpenPending;
886:
887: //
888: // A flag indicating that this binding is in the process of closing.
889: //
890: BOOLEAN BindingShuttingDown;
891:
892:
893: //
894: // A bogus NdisRequest to queue operations during a close.
895: //
896: NDIS_REQUEST CloseRequestChangeFilter;
897: NDIS_REQUEST CloseRequestChangeAddress;
898: NDIS_REQUEST CloseRequestChangeGroupAddress;
899:
900: } IBMTOK_OPEN,*PIBMTOK_OPEN;
901:
902:
903: //
904: // procedures which do error logging
905: //
906:
907: typedef enum _IBMTOK_PROC_ID{
908: registerAdapter,
909: openAdapter,
910: hardwareDetails,
911: handleResetStaging,
912: handleSrbSsb,
913: startPendQueueOp,
914: finishPendQueueOp,
915: handleDeferred,
916: ibmtokDpc
917: }IBMTOK_PROC_ID;
918:
919: //
920: // Error log values
921: //
922:
923: #define IBMTOK_ERRMSG_NOT_FOUND (ULONG)0x01
924: #define IBMTOK_ERRMSG_CREATE_DB (ULONG)0x02
925: #define IBMTOK_ERRMSG_INIT_INTERRUPT (ULONG)0x03
926: #define IBMTOK_ERRMSG_OPEN_DB (ULONG)0x04
927: #define IBMTOK_ERRMSG_ALLOC_MEM (ULONG)0x05
928: #define IBMTOK_ERRMSG_UNSUPPORTED_RAM (ULONG)0x06
929: #define IBMTOK_ERRMSG_BRINGUP_FAILURE (ULONG)0x07
930: #define IBMTOK_ERRMSG_INVALID_CMD (ULONG)0x08
931: #define IBMTOK_ERRMSG_BAD_OP (ULONG)0x09
932: #define IBMTOK_ERRMSG_INVALID_STATUS (ULONG)0x0A
933: #define IBMTOK_ERRMSG_INVALID_STATE (ULONG)0x0B
934: #define IBMTOK_ERRMSG_ISRP_LOW_ERROR (ULONG)0x0C
935:
936: //
937: // This macro returns a pointer to a PIBMTOK_OPEN given a MacBindingHandle.
938: //
939: #define PIBMTOK_OPEN_FROM_BINDING_HANDLE(Handle) \
940: ((PIBMTOK_OPEN)((PVOID)Handle))
941:
942:
943: //
944: // This macro returns a NDIS_HANDLE from a PIBMTOK_OPEN
945: //
946: #define BINDING_HANDLE_FROM_PIBMTOK_OPEN(Open) \
947: ((NDIS_HANDLE)((PVOID)Open))
948:
949:
950: //
951: // This macro will act a "epilogue" to every routine in the
952: // *interface*. It will check whether there any requests needed
953: // to defer there processing. It will also decrement the reference
954: // count on the adapter. If the reference count is zero and there
955: // is deferred work to do it will insert the interrupt processing
956: // routine in the DPC queue.
957: //
958: // Note that we don't need to include checking for blocked receives
959: // since blocked receives imply that there will eventually be an
960: // interrupt.
961: //
962: // NOTE: This macro assumes that it is called with the lock acquired.
963: //
964: #define IBMTOK_DO_DEFERRED(Adapter) \
965: { \
966: PIBMTOK_ADAPTER _A = (Adapter); \
967: _A->References--; \
968: if ((!_A->References) && \
969: (_A->ResetInProgress || \
970: (!IsListEmpty(&_A->CloseList)))) { \
971: IbmtokHandleDeferred(_A); \
972: NdisReleaseSpinLock(&_A->Lock); \
973: } else { \
974: NdisReleaseSpinLock(&_A->Lock); \
975: } \
976: }
977:
978:
979: //++
980: //
981: // VOID
982: // SET_INTERRUPT_RESET_FLAG(
983: // IN PIBMTOK_ADAPTER Adapter,
984: // )
985: //
986: //
987: // Routine Description:
988: //
989: // This routine uses NdisSynchronizeWithInterrupt to call the
990: // IbmtokSynchSetReset, which sets the ResetInterruptAllowed
991: // flag in the adapter structure. This is set after the
992: // adapter is reset to allow the interrupt indicating the
993: // end of the reset to come through (since all others
994: // should be blocked during the reset).
995: //
996: // Arguments:
997: //
998: // Adapter - The adapter to set the flag for.
999: //
1000: // Return Value:
1001: //
1002: // None.
1003: //
1004: //--
1005:
1006: #define SET_INTERRUPT_RESET_FLAG(A) \
1007: { \
1008: PIBMTOK_ADAPTER _A = A; \
1009: NdisSynchronizeWithInterrupt( \
1010: &_A->Interrupt, \
1011: (PVOID) IbmtokSynchSetReset, \
1012: (PVOID)_A \
1013: ); \
1014: }
1015:
1016:
1017: //
1018: // This macro is to clear the SRB/SSB and ARB/ASB bits
1019: // used by the interrupt handlers.
1020: //
1021:
1022: #define CLEAR_ISRP_BITS(A) \
1023: { \
1024: PIBMTOK_ADAPTER _A = A; \
1025: NdisSynchronizeWithInterrupt( \
1026: &_A->Interrupt, \
1027: (PVOID) IbmtokSynchClearIsrpBits, \
1028: (PVOID)_A \
1029: ); \
1030: }
1031:
1032:
1033:
1034: //
1035: // VOID
1036: // IbmtokProcessSrbRequests(
1037: // IN PIBMTOK_ADAPTER Adapter
1038: // )
1039: // /*++
1040: //
1041: // Routine Description:
1042: //
1043: // Check if the SRB is available, if so queue the next
1044: // request on it. Preferably, it is called when it is known
1045: // that there is something on the queue.
1046: //
1047: // NOTE: THIS IS CALLED WITH THE LOCK HELD!!!
1048: //
1049: // NOTE: THIS MUST BE CALLED WITH Adapter->SrbAvailable == TRUE !!!!!
1050: //
1051: // Arguments:
1052: //
1053: // Adapter - The Adapter to process interrupts for.
1054: //
1055: // Return Value:
1056: //
1057: // None.
1058: //
1059: // --*/
1060: //
1061:
1062: #define IbmtokProcessSrbRequests(_Adapter) \
1063: { \
1064: if (_Adapter->SrbAvailable) { \
1065: (_Adapter)->SrbAvailable = FALSE;\
1066: SetupSrbCommand(_Adapter); \
1067: } \
1068: }
1069:
1070:
1071: // VOID
1072: // PutPacketInCorrelatorArray(
1073: // IN PIBMTOK_ADAPTER Adapter,
1074: // IN PNDIS_PACKET Packet
1075: // )
1076: //
1077: // /*++
1078: //
1079: // Routine Description:
1080: //
1081: // This inserts a packet in the correlator array, based
1082: // on the value of its command correlator.
1083: //
1084: // Arguments:
1085: //
1086: // Adapter - The adapter that this packet is coming through.
1087: //
1088: // Packet - The packet that is to be inserted.
1089: //
1090: // Return Value:
1091: //
1092: // None.
1093: //
1094: // --*/
1095: //
1096: #define PutPacketInCorrelatorArray( _Adapter, _Packet) \
1097: { \
1098: PIBMTOK_RESERVED _Reserved = PIBMTOK_RESERVED_FROM_PACKET(_Packet); \
1099: ASSERT(_Reserved->CorrelatorAssigned); \
1100: ASSERT((_Adapter)->CorrelatorArray[_Reserved->CommandCorrelator] == (PNDIS_PACKET)NULL); \
1101: (_Adapter)->CorrelatorArray[_Reserved->CommandCorrelator] = (_Packet); \
1102: }
1103:
1104:
1105:
1106: // STATIC
1107: // VOID
1108: // RemovePacketFromCorrelatorArray(
1109: // IN PIBMTOK_ADAPTER Adapter,
1110: // IN PNDIS_PACKET Packet
1111: // )
1112: //
1113: // /*++
1114: //
1115: // Routine Description:
1116: //
1117: // This deletes a packet in the correlator array, based
1118: // on the value of its command correlator.
1119: //
1120: // Arguments:
1121: //
1122: // Adapter - The adapter that this packet is coming through.
1123: //
1124: // Packet - The packet that is to be removed.
1125: //
1126: // Return Value:
1127: //
1128: // None.
1129: //
1130: // --*/
1131: //
1132: #define RemovePacketFromCorrelatorArray(_Adapter, _Packet) \
1133: { \
1134: PIBMTOK_RESERVED _Reserved = PIBMTOK_RESERVED_FROM_PACKET(_Packet); \
1135: ASSERT(_Reserved->CorrelatorAssigned); \
1136: _Reserved->CorrelatorAssigned = FALSE; \
1137: (_Adapter)->CorrelatorArray[_Reserved->CommandCorrelator] = (PNDIS_PACKET)NULL; \
1138: }
1139:
1140:
1141:
1142:
1143:
1144: //
1145: // We define the external interfaces to the ibmtok driver.
1146: // These routines are only external to permit separate
1147: // compilation. Given a truely fast compiler they could
1148: // all reside in a single file and be static.
1149: //
1150:
1151:
1152: extern
1153: VOID
1154: IbmtokAdjustMaxLookAhead(
1155: IN PIBMTOK_ADAPTER Adapter
1156: );
1157:
1158:
1159: extern
1160: VOID
1161: IbmtokDPC(
1162: IN PVOID SystemSpecific1,
1163: IN PVOID Context,
1164: IN PVOID SystemArgument1,
1165: IN PVOID SystemArgument2
1166: );
1167:
1168: extern
1169: VOID
1170: SetupSrbCommand(
1171: IN PIBMTOK_ADAPTER Adapter
1172: );
1173:
1174: extern
1175: VOID
1176: IbmtokWakeUpDpc(
1177: IN PVOID SystemSpecific1,
1178: IN PVOID Context,
1179: IN PVOID SystemArgument1,
1180: IN PVOID SystemArgument2
1181: );
1182:
1183: extern
1184: BOOLEAN
1185: IbmtokISR(
1186: IN PVOID Context
1187: );
1188:
1189: extern
1190: VOID
1191: IbmtokHandleDeferred(
1192: IN PIBMTOK_ADAPTER Adapter
1193: );
1194:
1195: extern
1196: NDIS_STATUS
1197: IbmtokSetPacketFilter(
1198: IN PIBMTOK_ADAPTER Adapter,
1199: IN PIBMTOK_OPEN Open,
1200: IN PNDIS_REQUEST NdisRequest,
1201: IN UINT PacketFilter
1202: );
1203:
1204: extern
1205: NDIS_STATUS
1206: IbmtokChangeFunctionalAddress(
1207: IN PIBMTOK_ADAPTER Adapter,
1208: IN PIBMTOK_OPEN Open,
1209: IN PNDIS_REQUEST NdisRequest,
1210: IN PUCHAR Address
1211: );
1212:
1213: extern
1214: NDIS_STATUS
1215: IbmtokFillInGlobalData(
1216: IN PIBMTOK_ADAPTER Adapter,
1217: IN PNDIS_REQUEST NdisRequest
1218: );
1219:
1220:
1221: extern
1222: VOID
1223: IbmtokForceAdapterInterrupt(
1224: IN PIBMTOK_ADAPTER Adapter
1225: );
1226:
1227: extern
1228: VOID
1229: IbmtokSetupForReset(
1230: IN PIBMTOK_ADAPTER Adapter,
1231: IN PIBMTOK_OPEN Open
1232: );
1233:
1234: extern
1235: VOID
1236: IbmtokStartAdapterReset(
1237: IN PIBMTOK_ADAPTER Adapter
1238: );
1239:
1240: extern
1241: VOID
1242: IbmtokFinishAdapterReset(
1243: IN PIBMTOK_ADAPTER Adapter
1244: );
1245:
1246: extern
1247: BOOLEAN
1248: IbmtokSynchSetReset(
1249: IN PVOID Context
1250: );
1251:
1252: extern
1253: VOID
1254: IbmtokAbortPending(
1255: IN PIBMTOK_ADAPTER Adapter,
1256: IN NDIS_STATUS AbortStatus
1257: );
1258:
1259: extern
1260: VOID
1261: IbmtokAbortSends(
1262: IN PIBMTOK_ADAPTER Adapter,
1263: IN NDIS_STATUS AbortStatus
1264: );
1265:
1266: extern
1267: BOOLEAN
1268: IbmtokSynchClearIsrpBits(
1269: IN PVOID Context
1270: );
1271:
1272: extern
1273: NDIS_STATUS
1274: IbmtokTransferData(
1275: IN NDIS_HANDLE MacBindingHandle,
1276: IN NDIS_HANDLE MacReceiveContext,
1277: IN UINT ByteOffset,
1278: IN UINT BytesToTransfer,
1279: OUT PNDIS_PACKET Packet,
1280: OUT PUINT BytesTransferred
1281: );
1282:
1283: extern
1284: NDIS_STATUS
1285: IbmtokSend(
1286: IN NDIS_HANDLE MacBindingHandle,
1287: IN PNDIS_PACKET Packet
1288: );
1289:
1290: extern
1291: VOID
1292: IbmtokCopyFromPacketToBuffer(
1293: IN PNDIS_PACKET Packet,
1294: IN UINT Offset,
1295: IN UINT BytesToCopy,
1296: OUT PCHAR Buffer,
1297: OUT PUINT BytesCopied
1298: );
1299:
1300: extern
1301: VOID
1302: IbmtokCopyFromBufferToPacket(
1303: IN PCHAR Buffer,
1304: IN UINT BytesToCopy,
1305: IN PNDIS_PACKET Packet,
1306: IN UINT Offset,
1307: OUT PUINT BytesCopied
1308: );
1309:
1310: extern
1311: VOID
1312: IbmtokCopyFromPacketToPacket(
1313: IN PNDIS_PACKET Destination,
1314: IN UINT DestinationOffset,
1315: IN UINT BytesToCopy,
1316: IN PNDIS_PACKET Source,
1317: IN UINT SourceOffset,
1318: OUT PUINT BytesCopied
1319: );
1320:
1321: #endif // _IBMTOKSFT_
1322:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.