|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1990-1992 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: sonicsft.h ! 8: ! 9: Abstract: ! 10: ! 11: The main header for a SONIC 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: This driver is expected to work in DOS, OS2 and NT at the equivalent ! 24: of kernel mode. ! 25: ! 26: Architecturally, there is an assumption in this driver that we are ! 27: on a little endian machine. ! 28: ! 29: Revision History: ! 30: ! 31: ! 32: --*/ ! 33: ! 34: #ifndef _SONICSFT_ ! 35: #define _SONICSFT_ ! 36: ! 37: ! 38: // ! 39: // We use STATIC to define procedures that will be static in the ! 40: // final build but which we now make extern to allow them to be ! 41: // debugged (breakpoints can be set on them). ! 42: // ! 43: ! 44: #if DEVL ! 45: #define STATIC ! 46: #else ! 47: #define STATIC static ! 48: #endif ! 49: ! 50: ! 51: // ! 52: // This variable is used to control debug output. ! 53: // ! 54: ! 55: #if DBG ! 56: extern INT SonicDbg; ! 57: #endif ! 58: ! 59: ! 60: ! 61: // ! 62: // Used when registering ourselves with NDIS. ! 63: // ! 64: ! 65: #define SONIC_NDIS_MAJOR_VERSION 3 ! 66: #define SONIC_NDIS_MINOR_VERSION 0 ! 67: ! 68: ! 69: // ! 70: // The maximum number of bytes that we will pass to an NDIS ! 71: // indication (since we receive packets contiguously, there is ! 72: // no reason to limit this). This number includes header and ! 73: // data. ! 74: // ! 75: ! 76: #define SONIC_INDICATE_MAXIMUM 1514 ! 77: ! 78: // ! 79: // The maximum number of bytes we will pass to a loopback ! 80: // indication (unless it all is in one buffer). This number ! 81: // includes only data, not the header. ! 82: // ! 83: ! 84: #define SONIC_LOOPBACK_MAXIMUM 208 ! 85: ! 86: // ! 87: // Used for parsing OIDs ! 88: // ! 89: ! 90: #define OID_TYPE_MASK 0xffff0000 ! 91: #define OID_TYPE_GENERAL_OPERATIONAL 0x00010000 ! 92: #define OID_TYPE_GENERAL_STATISTICS 0x00020000 ! 93: #define OID_TYPE_802_3_OPERATIONAL 0x01010000 ! 94: #define OID_TYPE_802_3_STATISTICS 0x01020000 ! 95: ! 96: #define OID_REQUIRED_MASK 0x0000ff00 ! 97: #define OID_REQUIRED_MANDATORY 0x00000100 ! 98: #define OID_REQUIRED_OPTIONAL 0x00000200 ! 99: ! 100: #define OID_INDEX_MASK 0x000000ff ! 101: ! 102: // ! 103: // Indexes in the GeneralMandatory array. ! 104: // ! 105: ! 106: #define GM_TRANSMIT_GOOD 0x00 ! 107: #define GM_RECEIVE_GOOD 0x01 ! 108: #define GM_TRANSMIT_BAD 0x02 ! 109: #define GM_RECEIVE_BAD 0x03 ! 110: #define GM_RECEIVE_NO_BUFFER 0x04 ! 111: #define GM_ARRAY_SIZE 0x05 ! 112: ! 113: // ! 114: // Indexes in the GeneralOptional array. There are ! 115: // two sections, the ones up to COUNT_ARRAY_SIZE ! 116: // have entries for number (4 bytes) and number of ! 117: // bytes (8 bytes), the rest are a normal array. ! 118: // ! 119: ! 120: #define GO_DIRECTED_TRANSMITS 0x00 ! 121: #define GO_MULTICAST_TRANSMITS 0x01 ! 122: #define GO_BROADCAST_TRANSMITS 0x02 ! 123: #define GO_DIRECTED_RECEIVES 0x03 ! 124: #define GO_MULTICAST_RECEIVES 0x04 ! 125: #define GO_BROADCAST_RECEIVES 0x05 ! 126: #define GO_COUNT_ARRAY_SIZE 0x06 ! 127: ! 128: #define GO_ARRAY_START 0x0C ! 129: #define GO_RECEIVE_CRC 0x0C ! 130: #define GO_TRANSMIT_QUEUE_LENGTH 0x0D ! 131: #define GO_ARRAY_SIZE 0x0E ! 132: ! 133: // ! 134: // Indexes in the MediaMandatory array. ! 135: // ! 136: ! 137: #define MM_RECEIVE_ERROR_ALIGNMENT 0x00 ! 138: #define MM_TRANSMIT_ONE_COLLISION 0x01 ! 139: #define MM_TRANSMIT_MORE_COLLISIONS 0x02 ! 140: #define MM_ARRAY_SIZE 0x03 ! 141: ! 142: // ! 143: // Indexes in the MediaOptional array. ! 144: // ! 145: ! 146: #define MO_TRANSMIT_DEFERRED 0x00 ! 147: #define MO_TRANSMIT_MAX_COLLISIONS 0x01 ! 148: #define MO_RECEIVE_OVERRUN 0x02 ! 149: #define MO_TRANSMIT_UNDERRUN 0x03 ! 150: #define MO_TRANSMIT_HEARTBEAT_FAILURE 0x04 ! 151: #define MO_TRANSMIT_TIMES_CRS_LOST 0x05 ! 152: #define MO_TRANSMIT_LATE_COLLISIONS 0x06 ! 153: #define MO_ARRAY_SIZE 0x07 ! 154: ! 155: ! 156: ! 157: // ! 158: // Macros used for memory allocation and deallocation. ! 159: // ! 160: // Note that for regular memory we put no limit on the physical ! 161: // address, but for contiguous and noncached we limit it to ! 162: // 32 bits since that is all the card can handle (presumably ! 163: // such memory will be DMAed to/from by the card). ! 164: // ! 165: ! 166: #define SONIC_ALLOC_MEMORY(_Status, _Address, _Length) \ ! 167: { \ ! 168: NDIS_PHYSICAL_ADDRESS Temp = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1); \ ! 169: *(_Status) = NdisAllocateMemory( \ ! 170: (PVOID)(_Address), \ ! 171: (_Length), \ ! 172: 0, \ ! 173: Temp \ ! 174: ); \ ! 175: } ! 176: ! 177: #define SONIC_FREE_MEMORY(_Address, _Length) \ ! 178: NdisFreeMemory( \ ! 179: (PVOID)(_Address), \ ! 180: (_Length), \ ! 181: 0 \ ! 182: ) ! 183: ! 184: ! 185: #define SONIC_ALLOC_CONTIGUOUS_MEMORY(_Status, _Address, _Length) \ ! 186: { \ ! 187: NDIS_PHYSICAL_ADDRESS Temp = NDIS_PHYSICAL_ADDRESS_CONST(-1, 0); \ ! 188: *(_Status) = NdisAllocateMemory( \ ! 189: (PVOID)(_Address), \ ! 190: (_Length), \ ! 191: NDIS_MEMORY_CONTIGUOUS, \ ! 192: Temp \ ! 193: ); \ ! 194: } ! 195: ! 196: #define SONIC_FREE_CONTIGUOUS_MEMORY(_Address, _Length) \ ! 197: NdisFreeMemory( \ ! 198: (PVOID)(_Address), \ ! 199: (_Length), \ ! 200: NDIS_MEMORY_CONTIGUOUS \ ! 201: ) ! 202: ! 203: ! 204: #define SONIC_ALLOC_NONCACHED_MEMORY(_Status, _Address, _Length) \ ! 205: { \ ! 206: NDIS_PHYSICAL_ADDRESS Temp = NDIS_PHYSICAL_ADDRESS_CONST(-1, 0); \ ! 207: *(_Status) = NdisAllocateMemory( \ ! 208: (PVOID)(_Address), \ ! 209: (_Length), \ ! 210: NDIS_MEMORY_CONTIGUOUS | NDIS_MEMORY_NONCACHED, \ ! 211: Temp \ ! 212: ); \ ! 213: } ! 214: ! 215: #define SONIC_FREE_NONCACHED_MEMORY(_Address, _Length) \ ! 216: NdisFreeMemory( \ ! 217: (PVOID)(_Address), \ ! 218: (_Length), \ ! 219: NDIS_MEMORY_CONTIGUOUS | NDIS_MEMORY_NONCACHED \ ! 220: ) ! 221: ! 222: ! 223: ! 224: // ! 225: // Macros to move and zero memory. ! 226: // ! 227: ! 228: #define SONIC_MOVE_MEMORY(Destination,Source,Length) NdisMoveMemory(Destination,Source,Length) ! 229: #define SONIC_ZERO_MEMORY(Destination,Length) NdisZeroMemory(Destination,Length) ! 230: ! 231: ! 232: // ! 233: // Used to record the 8-byte counters. ! 234: // ! 235: ! 236: typedef struct _SONIC_LARGE_INTEGER { ! 237: ULONG LowPart; ! 238: ULONG HighPart; ! 239: } SONIC_LARGE_INTEGER, *PSONIC_LARGE_INTEGER; ! 240: ! 241: // ! 242: // This initializes an 8-byte counter. ! 243: // ! 244: ! 245: #define SonicZeroLargeInteger(LargeInteger) \ ! 246: { \ ! 247: LargeInteger.LowPart = 0L;\ ! 248: LargeInteger.HighPart = 0L; \ ! 249: } ! 250: ! 251: // ! 252: // This adds a longword to an 8-byte counter. ! 253: // ! 254: ! 255: #define SonicAddUlongToLargeInteger(LargeInteger, Ulong) \ ! 256: { \ ! 257: PSONIC_LARGE_INTEGER TmpLarge = (LargeInteger); \ ! 258: TmpLarge->LowPart += (ULONG)Ulong; \ ! 259: if (TmpLarge->LowPart < (ULONG)Ulong) { \ ! 260: ++TmpLarge->HighPart; \ ! 261: } \ ! 262: } ! 263: ! 264: ! 265: ! 266: // ! 267: // This flushes a buffer for write. ! 268: // ! 269: ! 270: #define SONIC_FLUSH_WRITE_BUFFER(Buffer) \ ! 271: NdisFlushBuffer( \ ! 272: Buffer, \ ! 273: TRUE \ ! 274: ) ! 275: ! 276: ! 277: // ! 278: // This record type is used to store sonic global data. ! 279: // It is used as the MacMacContext in the call to ! 280: // NdisRegisterMac. ! 281: // ! 282: ! 283: typedef struct _SONIC_MAC { ! 284: ! 285: // ! 286: // The handle returned by NdisInitializeWrapper. ! 287: // ! 288: ! 289: NDIS_HANDLE WrapperHandle; ! 290: ! 291: // ! 292: // The handle returned by NdisRegisterMac. ! 293: // ! 294: ! 295: NDIS_HANDLE MacHandle; ! 296: ! 297: } SONIC_MAC, *PSONIC_MAC; ! 298: ! 299: ! 300: // ! 301: // This identifies the type of the packet for quick reference ! 302: // in the SONIC_PACKET_RESERVED.PacketType field. ! 303: // ! 304: ! 305: #define SONIC_DIRECTED 1 ! 306: #define SONIC_MULTICAST 2 ! 307: #define SONIC_BROADCAST 3 ! 308: #define SONIC_LOOPBACK 4 ! 309: ! 310: ! 311: // ! 312: // This record type is inserted into the MacReserved portion ! 313: // of the packet header when the packet is going through the ! 314: // staged allocation of buffer space prior to the actual send. ! 315: // ! 316: typedef struct _SONIC_PACKET_RESERVED { ! 317: ! 318: // ! 319: // Points to the next packet in the chain of queued packets ! 320: // being allocated, loopbacked, or waiting for the finish ! 321: // of transmission. ! 322: // ! 323: // The packet will either be on the stage list for allocation, ! 324: // the loopback list for loopback processing, on an adapter ! 325: // wide doubly linked list (see below) for post transmission ! 326: // processing. ! 327: // ! 328: // We always keep the packet on a list so that in case the ! 329: // the adapter is closing down or resetting, all the packets ! 330: // can easily be located and "canceled". ! 331: // ! 332: PNDIS_PACKET Next; ! 333: ! 334: // ! 335: // This field holds the binding handle of the open binding ! 336: // that submitted this packet for send. ! 337: // ! 338: NDIS_HANDLE MacBindingHandle; ! 339: ! 340: // ! 341: // The length of the packet. ! 342: // ! 343: USHORT PacketLength; ! 344: ! 345: // ! 346: // This identifies the type of the packet. ! 347: // ! 348: UCHAR PacketType; ! 349: ! 350: // ! 351: // Was the transmit successful? ! 352: // ! 353: BOOLEAN SuccessfulTransmit; ! 354: ! 355: // ! 356: // If TRUE then the packet caused an adapter buffer to ! 357: // be allocated. ! 358: // ! 359: BOOLEAN UsedSonicBuffer; ! 360: ! 361: // ! 362: // If the previous field was TRUE then this gives the ! 363: // index into the array of adapter buffer descriptors that ! 364: // contains the old packet information. ! 365: // ! 366: UCHAR SonicBuffersIndex; ! 367: ! 368: // ! 369: // Gives the index into the ring to packet structure as well ! 370: // as the ring descriptors. ! 371: // ! 372: USHORT DescriptorIndex; ! 373: ! 374: } SONIC_PACKET_RESERVED,*PSONIC_PACKET_RESERVED; ! 375: ! 376: ! 377: // ! 378: // This macro will return a pointer to the sonic reserved portion ! 379: // of a packet given a pointer to a packet. ! 380: // ! 381: #define PSONIC_RESERVED_FROM_PACKET(Packet) \ ! 382: ((PSONIC_PACKET_RESERVED)((PVOID)((Packet)->MacReserved))) ! 383: ! 384: ! 385: ! 386: // ! 387: // This structure is used in the MacReserved field of ! 388: // an NDIS_REQUEST_BLOCK, passed in during multicast ! 389: // address/packet filter operations. ! 390: // ! 391: ! 392: typedef struct _SONIC_REQUEST_RESERVED { ! 393: PNDIS_REQUEST Next; ! 394: struct _SONIC_OPEN * OpenBlock; ! 395: } _SONIC_REQUEST_RESERVED, * PSONIC_REQUEST_RESERVED; ! 396: ! 397: ! 398: // ! 399: // This macro will return a pointer to the sonic reserved portion ! 400: // of a request given a pointer to the request. ! 401: // ! 402: #define PSONIC_RESERVED_FROM_REQUEST(Request) \ ! 403: ((PSONIC_REQUEST_RESERVED)((PVOID)((Request)->MacReserved))) ! 404: ! 405: ! 406: ! 407: // ! 408: // The return code from a multicast operation. ! 409: // ! 410: typedef enum { CAM_LOADED, CAM_NOT_LOADED } MULTICAST_STATUS; ! 411: ! 412: ! 413: // ! 414: // This structure is used to map entries in the ring descriptors ! 415: // back to the packets from which the data in the ring descriptor ! 416: // originated. ! 417: // ! 418: ! 419: typedef struct _SONIC_DESCRIPTOR_TO_PACKET { ! 420: ! 421: // ! 422: // Points to the packet from which data is being transmitted ! 423: // through this ring entry. ! 424: // ! 425: PNDIS_PACKET OwningPacket; ! 426: ! 427: // ! 428: // Location of our link field. ! 429: // ! 430: SONIC_PHYSICAL_ADDRESS * LinkPointer; ! 431: ! 432: // ! 433: // Location of the previous link field. ! 434: // ! 435: SONIC_PHYSICAL_ADDRESS * PrevLinkPointer; ! 436: ! 437: // ! 438: // When a packet is submitted to the hardware we record ! 439: // here whether it used adapter buffers and if so, the buffer ! 440: // index. ! 441: // ! 442: UINT SonicBuffersIndex; ! 443: BOOLEAN UsedSonicBuffer; ! 444: ! 445: } SONIC_DESCRIPTOR_TO_PACKET,*PSONIC_DESCRIPTOR_TO_PACKET; ! 446: ! 447: ! 448: // ! 449: // If an ndis packet does not meet the hardware contraints then ! 450: // an adapter buffer will be allocated. Enough data will be copied ! 451: // out of the ndis packet so that by using a combination of the ! 452: // adapter buffer and remaining ndis buffers the hardware ! 453: // constraints are satisfied. ! 454: // ! 455: // In the SONIC_ADAPTER structure three threaded lists are kept in ! 456: // one array. One points to a list of SONIC_BUFFER_DESCRIPTORS ! 457: // that point to small adapter buffers. Another is for medium sized ! 458: // buffers and the last for full sized (large) buffers. ! 459: // ! 460: // The allocation is controlled via a free list head and ! 461: // the free lists are "threaded" by a field in the adapter buffer ! 462: // descriptor. ! 463: // ! 464: ! 465: typedef struct _SONIC_BUFFER_DESCRIPTOR { ! 466: ! 467: // ! 468: // A Physical pointer to a small, medium, or large buffer. ! 469: // ! 470: NDIS_PHYSICAL_ADDRESS PhysicalSonicBuffer; ! 471: ! 472: // ! 473: // A virtual pointer to a small, medium, or large buffer. ! 474: // ! 475: PVOID VirtualSonicBuffer; ! 476: ! 477: // ! 478: // This is used to flush the buffer when it is used. ! 479: // ! 480: PNDIS_BUFFER FlushBuffer; ! 481: ! 482: // ! 483: // Threads the elements of an array of these descriptors into ! 484: // a free list. -1 implies no more entries in the list. ! 485: // ! 486: INT Next; ! 487: ! 488: // ! 489: // Holds the length of data placed into the buffer. This ! 490: // can (and likely will) be less that the actual buffers ! 491: // length. ! 492: // ! 493: UINT DataLength; ! 494: ! 495: } SONIC_BUFFER_DESCRIPTOR,*PSONIC_BUFFER_DESCRIPTOR; ! 496: ! 497: ! 498: // ! 499: // This is the basic structure that defines the state of an ! 500: // adapter. There is one of these allocate per adapter that ! 501: // the sonic driver supports. ! 502: // ! 503: ! 504: typedef struct _SONIC_ADAPTER { ! 505: ! 506: // ! 507: // Will be true the first time that the hardware is initialized ! 508: // by the driver initialization. ! 509: // ! 510: BOOLEAN FirstInitialization; ! 511: ! 512: // ! 513: // TRUE if RemoveAdapter has been called or if Shutdown is in progress. ! 514: // ! 515: BOOLEAN Removed; ! 516: ! 517: // ! 518: // The type of the adapter; current supported values are: ! 519: // ! 520: // 1: EISA 9010E/B card from National Semiconductor ! 521: // 2: Sonic chip on the MIPS R4000 motherbaord. ! 522: // ! 523: UCHAR AdapterType; ! 524: ! 525: // ! 526: // TRUE if the permanent address is valid. On some cards the ! 527: // permanent address is read by SonicHardwareGetDetails; ! 528: // if not, it is read later by SonicHardwareGetAddress. ! 529: // ! 530: BOOLEAN PermanentAddressValid; ! 531: ! 532: // ! 533: // The burned-in network address from the hardware. ! 534: // ! 535: CHAR PermanentNetworkAddress[ETH_LENGTH_OF_ADDRESS]; ! 536: ! 537: // ! 538: // The current network address from the hardware. ! 539: // ! 540: CHAR CurrentNetworkAddress[ETH_LENGTH_OF_ADDRESS]; ! 541: ! 542: // ! 543: // This is the buffer pool used to allocate flush buffers ! 544: // out of. ! 545: // ! 546: NDIS_HANDLE FlushBufferPoolHandle; ! 547: ! 548: // ! 549: // These are boolean, used as a gate to ensure that only one thread ! 550: // of execution is actually processing the specified source of ! 551: // deferred processing. ! 552: // ! 553: ! 554: BOOLEAN ProcessingReceiveInterrupt; ! 555: BOOLEAN ProcessingGeneralInterrupt; ! 556: BOOLEAN ProcessingDeferredOperations; ! 557: ! 558: // ! 559: // Used to queue deferred operations. ! 560: // ! 561: NDIS_TIMER DeferredTimer; ! 562: ! 563: // ! 564: // Holds the interrupt object for this adapter. ! 565: // ! 566: NDIS_INTERRUPT Interrupt; ! 567: ! 568: // ! 569: // TRUE if the adapter is latched, FALSE for level-sensitive. ! 570: // ! 571: BOOLEAN InterruptLatched; ! 572: ! 573: // The following fields are accessed by the ISR and must be aligned to the ! 574: // minimum granularity of the architecture on which it runs ! 575: ! 576: #if defined(_ALPHA_) ! 577: ! 578: union { ! 579: UQUAD _ForceQuadwordAlignment; ! 580: struct { ! 581: ! 582: #endif // defined(_ALPHA_) ! 583: ! 584: // ! 585: // Holds a value of the ISR from one or more interrupts. ! 586: // This value is only set by the interrupt service routine ! 587: // and cleared by the interrupt synchronization routine. ! 588: // ! 589: USHORT IsrValue; ! 590: ! 591: // ! 592: // The current value to put in the Interrupt Mask Register. ! 593: // ! 594: USHORT InterruptMaskRegister; ! 595: ! 596: #if defined(_ALPHA_) ! 597: ! 598: }; ! 599: }; ! 600: ! 601: #endif // defined(_ALPHA_) ! 602: ! 603: // ! 604: // The current value to put in the Receive Control Register. ! 605: // ! 606: USHORT ReceiveControlRegister; ! 607: ! 608: // ! 609: // The value that the Data Configuration Register should be ! 610: // initialized to. ! 611: // ! 612: USHORT DataConfigurationRegister; ! 613: ! 614: // ! 615: // Have we receive an unacknowledged Receive Buffers ! 616: // Exhausted interrupt. ! 617: // ! 618: BOOLEAN ReceiveBuffersExhausted; ! 619: ! 620: // ! 621: // Have we receive an unacknowledged Receive Descriptors ! 622: // Exhausted interrupt. ! 623: // ! 624: BOOLEAN ReceiveDescriptorsExhausted; ! 625: ! 626: // ! 627: // Location of the beginning of the SONIC ports. ! 628: // ! 629: ULONG SonicPortAddress; ! 630: ! 631: // ! 632: // The number of bits that port numbers need to be shifted left ! 633: // before adding them to PortAddress (1 for 16-bit ports, 2 ! 634: // for 32-bit ports). ! 635: // ! 636: UINT PortShift; ! 637: ! 638: // ! 639: // The virtual address of the blank buffer used for padding. ! 640: // ! 641: PUCHAR BlankBuffer; ! 642: ! 643: // ! 644: // The Physical address of the blank buffer used for padding. ! 645: // ! 646: NDIS_PHYSICAL_ADDRESS BlankBufferAddress; ! 647: ! 648: // ! 649: // Keeps a reference count on the current number of uses of ! 650: // this adapter block. Uses is defined to be the number of ! 651: // routines currently within the "external" interface. ! 652: // ! 653: UINT References; ! 654: ! 655: // ! 656: // List head for all open bindings for this adapter. ! 657: // ! 658: LIST_ENTRY OpenBindings; ! 659: ! 660: // ! 661: // Number of open bindings. ! 662: // ! 663: UINT OpenCount; ! 664: ! 665: // ! 666: // List head for all opens that had outstanding references ! 667: // when an attempt was made to close them. ! 668: // ! 669: LIST_ENTRY CloseList; ! 670: ! 671: // ! 672: // Spinlock to protect fields in this structure.. ! 673: // ! 674: NDIS_SPIN_LOCK Lock; ! 675: ! 676: // ! 677: // Handle given by NDIS when the adapter was registered. ! 678: // ! 679: NDIS_HANDLE NdisAdapterHandle; ! 680: ! 681: // ! 682: // Pointer to the filter database for the MAC. ! 683: // ! 684: PETH_FILTER FilterDB; ! 685: ! 686: // ! 687: // The head of the request queue for this adapter. ! 688: // ! 689: PNDIS_REQUEST FirstRequest; ! 690: ! 691: // ! 692: // The tail of the request queue for this adapter. ! 693: // ! 694: PNDIS_REQUEST LastRequest; ! 695: ! 696: // ! 697: // The current packet filter. ! 698: // ! 699: UINT CurrentPacketFilter; ! 700: ! 701: // ! 702: // The value of the bits in CamEnable, except for ! 703: // the first one (which is for our network address); ! 704: // as opposed to the value stored in the real CamEnable, ! 705: // which may have some bits off if multicast addresses ! 706: // are not included in the current packet filter. ! 707: // ! 708: UINT MulticastCamEnableBits; ! 709: ! 710: // ! 711: // The number of transmit descriptors. ! 712: // ! 713: UINT NumberOfTransmitDescriptors; ! 714: ! 715: // ! 716: // The number of receive buffers ! 717: // ! 718: UINT NumberOfReceiveBuffers; ! 719: ! 720: // ! 721: // The number of receive descriptors ! 722: // ! 723: UINT NumberOfReceiveDescriptors; ! 724: ! 725: // ! 726: // Pointer to the transmit descriptors (this is ! 727: // allocated to be of size NumberOfTransmitDescriptors). ! 728: // ! 729: PSONIC_TRANSMIT_DESCRIPTOR TransmitDescriptorArea; ! 730: ! 731: // ! 732: // The physical address of the transmit descriptor area. ! 733: // ! 734: NDIS_PHYSICAL_ADDRESS TransmitDescriptorAreaPhysical; ! 735: ! 736: // ! 737: // Pointer to the last transmit descriptor. ! 738: // ! 739: PSONIC_TRANSMIT_DESCRIPTOR LastTransmitDescriptor; ! 740: ! 741: // ! 742: // Counter that records the number of transmit rings currently ! 743: // available for allocation. ! 744: // ! 745: UINT NumberOfAvailableDescriptors; ! 746: ! 747: // ! 748: // This is used to determine whether to use the programmable ! 749: // interrupt on a packet or not. ! 750: // ! 751: UINT PacketsSinceLastInterrupt; ! 752: ! 753: // ! 754: // Pointer to transmit descriptor ring entry that is the ! 755: // first ring entry available for allocation of transmit ! 756: // buffers. ! 757: // ! 758: // Can only be accessed when the adapter lock ! 759: // is held. ! 760: // ! 761: PSONIC_TRANSMIT_DESCRIPTOR AllocateableDescriptor; ! 762: ! 763: // ! 764: // Pointer to a transmit descriptor ring entry that is the ! 765: // first ring entry that the MAC currently has made available ! 766: // for transmission. ! 767: // ! 768: // Can only be accessed when the adapter lock ! 769: // is held. ! 770: // ! 771: PSONIC_TRANSMIT_DESCRIPTOR TransmittingDescriptor; ! 772: ! 773: // ! 774: // Pointer to the first packet that has been allocated to ! 775: // a transmit packet but has not yet been relinquished to ! 776: // the hardware. We need this pointer to keep the transmit ! 777: // post processing from running into a packet that has not ! 778: // been transmitted. ! 779: // ! 780: PSONIC_TRANSMIT_DESCRIPTOR FirstUncommittedDescriptor; ! 781: ! 782: // ! 783: // Pointer to an array of structs that map transmit ring entries ! 784: // back to a packet (this is allocated to be of size ! 785: // NumberOfTransmitDescriptors). ! 786: // ! 787: PSONIC_DESCRIPTOR_TO_PACKET DescriptorToPacket; ! 788: ! 789: // ! 790: // Pointer to the receive resource area (this is ! 791: // allocated to be of size NumberofReceiveBuffers). ! 792: // ! 793: PSONIC_RECEIVE_RESOURCE ReceiveResourceArea; ! 794: ! 795: // ! 796: // The physical address of ReceiveResourceArea. ! 797: // ! 798: NDIS_PHYSICAL_ADDRESS ReceiveResourceAreaPhysical; ! 799: ! 800: // ! 801: // Pointer to the array holding the receive buffers (this ! 802: // is allocated to be of size NumberofReceiveBuffers). ! 803: // ! 804: PVOID * ReceiveBufferArea; ! 805: ! 806: // ! 807: // The RBA which we are currently taking packets out of ! 808: // (will be one of the entries in the ReceiveBufferArea ! 809: // array). ! 810: // ! 811: UINT CurrentReceiveBufferIndex; ! 812: ! 813: // ! 814: // Pointer to the receive descriptor area ! 815: // (this is allocated to be of size NumberOfReceiveDescriptors). ! 816: // ! 817: PSONIC_RECEIVE_DESCRIPTOR ReceiveDescriptorArea; ! 818: ! 819: // ! 820: // The physical address of ReceiveDescriptorArea ! 821: // ! 822: NDIS_PHYSICAL_ADDRESS ReceiveDescriptorAreaPhysical; ! 823: ! 824: // ! 825: // The last receive descriptor in the area. ! 826: // ! 827: PSONIC_RECEIVE_DESCRIPTOR LastReceiveDescriptor; ! 828: ! 829: // ! 830: // The index receive descriptor we should look at next (will be ! 831: // one of the entries in ReceiveDescriptorArea). ! 832: // ! 833: UINT CurrentReceiveDescriptorIndex; ! 834: ! 835: // ! 836: // Pointer to the CAM descriptor area. This will be ! 837: // located directly after the receive resource area, ! 838: // the separate pointer is for convenience. ! 839: // ! 840: PSONIC_CAM_DESCRIPTOR_AREA CamDescriptorArea; ! 841: ! 842: // ! 843: // The physical address corresponding to CamDescriptorArea. ! 844: // This is stored as a 4-byte address since it is just ! 845: // a fixed offset from ReceiveResourceAreaPhysical and ! 846: // is not allocated with NdisAllocateSharedMemory. ! 847: // ! 848: SONIC_PHYSICAL_ADDRESS CamDescriptorAreaPhysical; ! 849: ! 850: // ! 851: // This is used to flush the CAM descriptor area. ! 852: // ! 853: PNDIS_BUFFER CamDescriptorAreaFlushBuffer; ! 854: ! 855: // ! 856: // The last entry in the CAM that is used. ! 857: // ! 858: UINT CamDescriptorAreaSize; ! 859: ! 860: // ! 861: // An bitmask showing which entries in the CAM are ! 862: // used or reserved for use. ! 863: // ! 864: UINT CamDescriptorsUsed; ! 865: ! 866: // ! 867: // Pointer to the first packet on the loopback list. ! 868: // ! 869: // Can only be accessed when the adapter lock ! 870: // is held. ! 871: // ! 872: PNDIS_PACKET FirstLoopBack; ! 873: ! 874: // ! 875: // Pointer to the last packet on the loopback list. ! 876: // ! 877: // Can only be accessed when the adapter lock ! 878: // is held. ! 879: // ! 880: PNDIS_PACKET LastLoopBack; ! 881: ! 882: // ! 883: // non-zero if an indication is for a loopback packet. ! 884: // ! 885: PNDIS_PACKET CurrentLoopbackPacket; ! 886: ! 887: // ! 888: // Pointer to the first transmitting packet that is actually ! 889: // sending, or done with the living on the loopback queue. ! 890: // ! 891: // Can only be accessed when the adapter lock ! 892: // is held. ! 893: // ! 894: PNDIS_PACKET FirstFinishTransmit; ! 895: ! 896: // ! 897: // Pointer to the last transmitting packet that is actually ! 898: // sending, or done with the living on the loopback queue. ! 899: // ! 900: // Can only be accessed when the adapter lock ! 901: // is held. ! 902: // ! 903: PNDIS_PACKET LastFinishTransmit; ! 904: ! 905: // ! 906: // Listheads for the adapters buffers. If the list ! 907: // head is equal to -1 then there are no free elements ! 908: // on the list. ! 909: // ! 910: // The list heads must only be accessed when the ! 911: // adapter lock is held. ! 912: // ! 913: // Note that the listhead at index 0 will always be -1. ! 914: // ! 915: INT SonicBufferListHeads[4]; ! 916: ! 917: // ! 918: // Pointers to an array of adapter buffer descriptors. ! 919: // The array will actually be threaded together by ! 920: // three free lists. The lists will be for small, ! 921: // medium and full sized packets. ! 922: // ! 923: PSONIC_BUFFER_DESCRIPTOR SonicBuffers; ! 924: ! 925: // ! 926: // This holds the actual memory used by the small ! 927: // sonic buffers (so that it can be a single piece ! 928: // of memory and therefore only use a single physical ! 929: // address. ! 930: // ! 931: PVOID SmallSonicBuffers; ! 932: ! 933: // ! 934: // This holds the memory for the medium sonic buffers. ! 935: // ! 936: PVOID MediumSonicBuffers; ! 937: ! 938: // ! 939: // Holds the open that queued a reset. ! 940: // ! 941: struct _SONIC_OPEN * ResettingOpen; ! 942: ! 943: // ! 944: // Flag that when enabled lets routines know that a reset ! 945: // is in progress, for the purposes of blocking other ! 946: // requests (except other resets). ! 947: // ! 948: BOOLEAN ResetInProgress; ! 949: ! 950: // ! 951: // Flag the lets us know that we are indicating RESET_START ! 952: // to all the protocols. During this time we can reject ! 953: // NdisReset requests with the status RESET_IN_PROGRESS. ! 954: // ! 955: BOOLEAN IndicatingResetStart; ! 956: ! 957: // ! 958: // Flag that says that we are indicating RESET_END to all ! 959: // the protocols. If this is set when a reset comes in, then ! 960: // we cannot indicating RESET_START right away; the thread ! 961: // indicating RESET_END will indicate the RESET_START if ! 962: // it fines that BlockResets has come on while it was ! 963: // indicating RESET_END. ! 964: // ! 965: BOOLEAN IndicatingResetEnd; ! 966: ! 967: // ! 968: // TRUE if a request is being processed. ! 969: // ! 970: BOOLEAN RequestInProgress; ! 971: ! 972: // ! 973: // This field lets the send allocation code know that it's ! 974: // futile to even try to move a packet along to that stage. ! 975: // ! 976: // The stage will be closed to close a binding ! 977: // or to reset the adapter. ! 978: // ! 979: // This variable can only be accessed when the adapter ! 980: // lock is held. ! 981: // ! 982: BOOLEAN SendStageOpen; ! 983: ! 984: // ! 985: // The AlreadyProcessingSendStage variable are set up to keep ! 986: // more than one thread from accessing a particular send ! 987: // a one time. ! 988: // ! 989: // This variable can only be accessed when the adapter ! 990: // lock is held. ! 991: // ! 992: BOOLEAN AlreadyProcessingSendStage; ! 993: ! 994: // ! 995: // Pointers to the first and last packets that are waiting to ! 996: // be sent. All packets in transmit are linked ! 997: // via there next field. ! 998: // ! 999: // Can only be accessed when the adapter lock ! 1000: // is held. ! 1001: // ! 1002: PNDIS_PACKET FirstSendStagePacket; ! 1003: PNDIS_PACKET LastSendStagePacket; ! 1004: ! 1005: // ! 1006: // These hold adapter statistics. ! 1007: // ! 1008: ULONG GeneralMandatory[GM_ARRAY_SIZE]; ! 1009: SONIC_LARGE_INTEGER GeneralOptionalByteCount[GO_COUNT_ARRAY_SIZE]; ! 1010: ULONG GeneralOptionalFrameCount[GO_COUNT_ARRAY_SIZE]; ! 1011: ULONG GeneralOptional[GO_ARRAY_SIZE - GO_ARRAY_START]; ! 1012: ULONG MediaMandatory[MM_ARRAY_SIZE]; ! 1013: ULONG MediaOptional[MO_ARRAY_SIZE]; ! 1014: ! 1015: // ! 1016: // For handling missing interrupts (caused by user mis-configs) ! 1017: // ! 1018: ! 1019: PVOID WakeUpDpc; ! 1020: NDIS_TIMER WakeUpTimer; ! 1021: BOOLEAN WakeUpTimeout; ! 1022: ! 1023: // ! 1024: // Count how often we log an error from finding a packet in ! 1025: // the wrong RBA. ! 1026: // ! 1027: ! 1028: USHORT WrongRbaErrorLogCount; ! 1029: ! 1030: // ! 1031: // For indicating loopback packets. ! 1032: // ! 1033: ! 1034: UCHAR Loopback[SONIC_LOOPBACK_MAXIMUM]; ! 1035: ! 1036: } SONIC_ADAPTER,*PSONIC_ADAPTER; ! 1037: ! 1038: ! 1039: // ! 1040: // Given a MacBindingHandle this macro returns a pointer to the ! 1041: // SONIC_ADAPTER. ! 1042: // ! 1043: ! 1044: #define PSONIC_ADAPTER_FROM_BINDING_HANDLE(Handle) \ ! 1045: (((PSONIC_OPEN)((PVOID)(Handle)))->OwningSonic) ! 1046: ! 1047: ! 1048: // ! 1049: // Given a MacContextHandle return the PSONIC_ADAPTER ! 1050: // it represents. ! 1051: // ! 1052: ! 1053: #define PSONIC_ADAPTER_FROM_CONTEXT_HANDLE(Handle) \ ! 1054: ((PSONIC_ADAPTER)((PVOID)(Handle))) ! 1055: ! 1056: ! 1057: ! 1058: // ! 1059: // One of these structures is created on each MacOpenAdapter. ! 1060: // ! 1061: ! 1062: typedef struct _SONIC_OPEN { ! 1063: ! 1064: // ! 1065: // Linking structure for all of the open bindings of a particular ! 1066: // adapter. ! 1067: // ! 1068: LIST_ENTRY OpenList; ! 1069: ! 1070: // ! 1071: // The Adapter that requested this open binding. ! 1072: // ! 1073: PSONIC_ADAPTER OwningSonic; ! 1074: ! 1075: // ! 1076: // Handle of this adapter in the filter database. ! 1077: // ! 1078: NDIS_HANDLE NdisFilterHandle; ! 1079: ! 1080: // ! 1081: // Given by NDIS when the adapter was opened. ! 1082: // ! 1083: NDIS_HANDLE NdisBindingContext; ! 1084: ! 1085: // ! 1086: // Counter of all the different reasons that a open binding ! 1087: // couldn't be closed. This would be incremented each time ! 1088: // for: ! 1089: // ! 1090: // While a particular interface routine is accessing this open ! 1091: // ! 1092: // During an indication. ! 1093: // ! 1094: // When the open causes a reset. ! 1095: // ! 1096: // A packet currently being sent. ! 1097: // ! 1098: // (Basically the above two mean any time the open has left ! 1099: // some processing around to be accomplished later.) ! 1100: // ! 1101: // This field should only be accessed when the adapter lock is held. ! 1102: // ! 1103: UINT References; ! 1104: ! 1105: // ! 1106: // A request that we use to queue the open or close request on ! 1107: // the adapter's queue. ! 1108: // ! 1109: NDIS_REQUEST OpenCloseRequest; ! 1110: ! 1111: // ! 1112: // A flag indicating that this binding is in the process of closing. ! 1113: // ! 1114: BOOLEAN BindingShuttingDown; ! 1115: ! 1116: } SONIC_OPEN,*PSONIC_OPEN; ! 1117: ! 1118: ! 1119: // ! 1120: // This macro returns a pointer to a PSONIC_OPEN given a MacBindingHandle. ! 1121: // ! 1122: ! 1123: #define PSONIC_OPEN_FROM_BINDING_HANDLE(Handle) \ ! 1124: ((PSONIC_OPEN)((PVOID)Handle)) ! 1125: ! 1126: ! 1127: // ! 1128: // This macro returns a NDIS_HANDLE from a PSONIC_OPEN ! 1129: // ! 1130: ! 1131: #define BINDING_HANDLE_FROM_PSONIC_OPEN(Open) \ ! 1132: ((NDIS_HANDLE)((PVOID)Open)) ! 1133: ! 1134: ! 1135: // ! 1136: // procedures which do error logging ! 1137: // ! 1138: ! 1139: typedef enum _SONIC_PROC_ID{ ! 1140: registerAdapter, ! 1141: openAdapter, ! 1142: hardwareDetails, ! 1143: handleDeferred, ! 1144: processReceiveInterrupts ! 1145: } SONIC_PROC_ID; ! 1146: ! 1147: ! 1148: // ! 1149: // Error log values ! 1150: // ! 1151: ! 1152: #define SONIC_ERRMSG_INIT_INTERRUPT (ULONG)0x01 ! 1153: #define SONIC_ERRMSG_CREATE_FILTER (ULONG)0x02 ! 1154: #define SONIC_ERRMSG_ALLOC_MEMORY (ULONG)0x03 ! 1155: #define SONIC_ERRMSG_REGISTER_ADAPTER (ULONG)0x04 ! 1156: #define SONIC_ERRMSG_ALLOC_DEVICE_NAME (ULONG)0x05 ! 1157: #define SONIC_ERRMSG_ALLOC_ADAPTER (ULONG)0x06 ! 1158: #define SONIC_ERRMSG_INITIAL_INIT (ULONG)0x07 ! 1159: #define SONIC_ERRMSG_OPEN_DB (ULONG)0x08 ! 1160: #define SONIC_ERRMSG_ALLOC_OPEN (ULONG)0x09 ! 1161: #define SONIC_ERRMSG_HARDWARE_ADDRESS (ULONG)0x0A ! 1162: #define SONIC_ERRMSG_WRONG_RBA (ULONG)0x0B ! 1163: ! 1164: ! 1165: ! 1166: // ! 1167: // This macro will act a "epilogue" to every routine in the ! 1168: // *interface*. It will check whether there any requests needed ! 1169: // to defer there processing. It will also decrement the reference ! 1170: // count on the adapter. If the reference count is zero and there ! 1171: // is deferred work to do it will insert the interrupt processing ! 1172: // routine in the DPC queue. ! 1173: // ! 1174: // Note that we don't need to include checking for blocked receives ! 1175: // since blocked receives imply that there will eventually be an ! 1176: // interrupt. ! 1177: // ! 1178: // NOTE: This macro assumes that it is called with the lock acquired. ! 1179: // ! 1180: ! 1181: #define SONIC_DO_DEFERRED(Adapter) \ ! 1182: { \ ! 1183: PSONIC_ADAPTER _A = (Adapter); \ ! 1184: if ((!_A->ProcessingDeferredOperations) && \ ! 1185: (((_A->References == 2) && \ ! 1186: _A->ResetInProgress) || \ ! 1187: _A->FirstLoopBack || \ ! 1188: (!IsListEmpty(&_A->CloseList)))) { \ ! 1189: _A->ProcessingDeferredOperations = TRUE; \ ! 1190: NdisReleaseSpinLock(&_A->Lock); \ ! 1191: NdisSetTimer(&_A->DeferredTimer,0); \ ! 1192: } else { \ ! 1193: _A->References--; \ ! 1194: NdisReleaseSpinLock(&_A->Lock); \ ! 1195: } \ ! 1196: } ! 1197: ! 1198: ! 1199: ! 1200: // ! 1201: // Definitions of sonic functions which are used by multiple ! 1202: // source files. ! 1203: // ! 1204: ! 1205: ! 1206: // ! 1207: // alloc.c ! 1208: // ! 1209: ! 1210: extern ! 1211: BOOLEAN ! 1212: AllocateAdapterMemory( ! 1213: IN PSONIC_ADAPTER Adapter ! 1214: ); ! 1215: ! 1216: extern ! 1217: VOID ! 1218: DeleteAdapterMemory( ! 1219: IN PSONIC_ADAPTER Adapter ! 1220: ); ! 1221: ! 1222: ! 1223: // ! 1224: // interrup.c ! 1225: // ! 1226: ! 1227: extern ! 1228: VOID ! 1229: SonicDeferredProcessing( ! 1230: IN PVOID SystemSpecific1, ! 1231: IN PVOID Context, ! 1232: IN PVOID SystemSpecific2, ! 1233: IN PVOID SystemSpecific3 ! 1234: ); ! 1235: ! 1236: extern ! 1237: BOOLEAN ! 1238: SonicInterruptService( ! 1239: IN PVOID Context ! 1240: ); ! 1241: ! 1242: extern ! 1243: VOID ! 1244: SonicTimerProcess( ! 1245: IN PVOID SystemSpecific1, ! 1246: IN PVOID Context, ! 1247: IN PVOID SystemSpecific2, ! 1248: IN PVOID SystemSpecific3 ! 1249: ); ! 1250: ! 1251: VOID ! 1252: SonicWakeUpDpc( ! 1253: IN PVOID SystemSpecific1, ! 1254: IN PVOID Context, ! 1255: IN PVOID SystemSpecific2, ! 1256: IN PVOID SystemSpecific3 ! 1257: ); ! 1258: ! 1259: // ! 1260: // loopback.c ! 1261: // ! 1262: ! 1263: extern ! 1264: VOID ! 1265: SonicProcessLoopback( ! 1266: IN PSONIC_ADAPTER Adapter ! 1267: ); ! 1268: ! 1269: extern ! 1270: VOID ! 1271: SonicPutPacketOnLoopBack( ! 1272: IN PSONIC_ADAPTER Adapter, ! 1273: IN PNDIS_PACKET Packet, ! 1274: IN BOOLEAN SuccessfulTransmit ! 1275: ); ! 1276: ! 1277: // ! 1278: // packet.c ! 1279: // ! 1280: ! 1281: extern ! 1282: VOID ! 1283: SonicCopyFromPacketToBuffer( ! 1284: IN PNDIS_PACKET Packet, ! 1285: IN UINT Offset, ! 1286: IN UINT BytesToCopy, ! 1287: OUT PCHAR Buffer, ! 1288: OUT PUINT BytesCopied ! 1289: ); ! 1290: ! 1291: extern ! 1292: VOID ! 1293: SonicCopyFromBufferToPacket( ! 1294: IN PCHAR Buffer, ! 1295: IN UINT BytesToCopy, ! 1296: IN PNDIS_PACKET Packet, ! 1297: IN UINT Offset, ! 1298: OUT PUINT BytesCopied ! 1299: ); ! 1300: ! 1301: extern ! 1302: VOID ! 1303: SonicCopyFromPacketToPacket( ! 1304: IN PNDIS_PACKET Destination, ! 1305: IN UINT DestinationOffset, ! 1306: IN UINT BytesToCopy, ! 1307: IN PNDIS_PACKET Source, ! 1308: IN UINT SourceOffset, ! 1309: OUT PUINT BytesCopied ! 1310: ); ! 1311: ! 1312: ! 1313: // ! 1314: // request.c ! 1315: // ! 1316: ! 1317: extern ! 1318: NDIS_STATUS ! 1319: SonicRequest( ! 1320: IN NDIS_HANDLE MacBindingHandle, ! 1321: IN PNDIS_REQUEST NdisRequest ! 1322: ); ! 1323: ! 1324: extern ! 1325: NDIS_STATUS ! 1326: SonicQueryGlobalStatistics( ! 1327: IN NDIS_HANDLE MacAdapterContext, ! 1328: IN PNDIS_REQUEST NdisRequest ! 1329: ); ! 1330: ! 1331: extern ! 1332: VOID ! 1333: SonicQueueRequest( ! 1334: IN PSONIC_ADAPTER Adapter, ! 1335: IN PNDIS_REQUEST NdisRequest ! 1336: ); ! 1337: ! 1338: extern ! 1339: VOID ! 1340: SonicProcessRequestQueue( ! 1341: IN PSONIC_ADAPTER Adapter ! 1342: ); ! 1343: ! 1344: extern ! 1345: NDIS_STATUS ! 1346: SonicChangeClass( ! 1347: IN UINT OldFilterClasses, ! 1348: IN UINT NewFilterClasses, ! 1349: IN NDIS_HANDLE NdisBindingContext, ! 1350: IN PNDIS_REQUEST NdisRequest, ! 1351: IN BOOLEAN Set ! 1352: ); ! 1353: ! 1354: extern ! 1355: NDIS_STATUS ! 1356: SonicChangeAddresses( ! 1357: IN UINT OldAddressCount, ! 1358: IN CHAR OldAddresses[][ETH_LENGTH_OF_ADDRESS], ! 1359: IN UINT NewAddressCount, ! 1360: IN CHAR NewAddresses[][ETH_LENGTH_OF_ADDRESS], ! 1361: IN NDIS_HANDLE MacBindingHandle, ! 1362: IN PNDIS_REQUEST NdisRequest, ! 1363: IN BOOLEAN Set ! 1364: ); ! 1365: ! 1366: extern ! 1367: VOID ! 1368: SonicCloseAction( ! 1369: IN NDIS_HANDLE MacBindingHandle ! 1370: ); ! 1371: ! 1372: ! 1373: // ! 1374: // send.c ! 1375: // ! 1376: ! 1377: extern ! 1378: NDIS_STATUS ! 1379: SonicSend( ! 1380: IN NDIS_HANDLE MacBindingHandle, ! 1381: IN PNDIS_PACKET Packet ! 1382: ); ! 1383: ! 1384: ! 1385: extern ! 1386: VOID ! 1387: SonicStagedAllocation( ! 1388: IN PSONIC_ADAPTER Adapter ! 1389: ); ! 1390: ! 1391: ! 1392: // ! 1393: // sonic.c ! 1394: // ! 1395: ! 1396: extern ! 1397: VOID ! 1398: SonicStartChip( ! 1399: IN PSONIC_ADAPTER Adapter ! 1400: ); ! 1401: ! 1402: extern ! 1403: VOID ! 1404: StartAdapterReset( ! 1405: IN PSONIC_ADAPTER Adapter ! 1406: ); ! 1407: ! 1408: extern ! 1409: VOID ! 1410: SetupForReset( ! 1411: IN PSONIC_ADAPTER Adapter, ! 1412: IN PSONIC_OPEN Open ! 1413: ); ! 1414: ! 1415: extern ! 1416: VOID ! 1417: SonicStartCamReload( ! 1418: IN PSONIC_ADAPTER Adapter ! 1419: ); ! 1420: ! 1421: ! 1422: // ! 1423: // transfer.c ! 1424: // ! 1425: ! 1426: extern ! 1427: NDIS_STATUS ! 1428: SonicTransferData( ! 1429: IN NDIS_HANDLE MacBindingHandle, ! 1430: IN NDIS_HANDLE MacReceiveContext, ! 1431: IN UINT ByteOffset, ! 1432: IN UINT BytesToTransfer, ! 1433: OUT PNDIS_PACKET Packet, ! 1434: OUT PUINT BytesTransferred ! 1435: ); ! 1436: ! 1437: #endif // _SONICSFT_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.