Annotation of ntddk/src/network/ibmtok/toksft.h, revision 1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.