Annotation of ntddk/src/network/sonic/sonichrd.h, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1990-1992  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     sonichrd.h
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     This file contains the hardware-related definitions for
        !            12:     the SONIC driver.
        !            13: 
        !            14:     The overall structure is taken from the Lance driver
        !            15:     by Tony Ercolano.
        !            16: 
        !            17: Author:
        !            18: 
        !            19:     Anthony V. Ercolano (tonye) creation-date 19-Jun-1990
        !            20:     Adam Barr (adamba) 16-Nov-1990
        !            21: 
        !            22: Environment:
        !            23: 
        !            24:     This driver is expected to work in DOS, OS2 and NT at the equivalent
        !            25:     of kernel mode.
        !            26: 
        !            27:     Architecturally, there is an assumption in this driver that we are
        !            28:     on a little endian machine.
        !            29: 
        !            30: Revision History:
        !            31: 
        !            32: 
        !            33: --*/
        !            34: 
        !            35: #ifndef _SONICHARDWARE_
        !            36: #define _SONICHARDWARE_
        !            37: 
        !            38: 
        !            39: //
        !            40: // Include processor-specific definitions needed by the sonic.
        !            41: // This defines the SONIC_READ_PORT and SONIC_WRITE_PORT macros,
        !            42: // as well as whether SONIC_EISA and SONIC_INTERNAL are defined.
        !            43: //
        !            44: 
        !            45: #include <sonicdet.h>
        !            46: 
        !            47: 
        !            48: //
        !            49: // Offsets from the base of the Sonic registers.
        !            50: //
        !            51: // All registers are 16 bits.
        !            52: //
        !            53: 
        !            54: #define SONIC_COMMAND                     0x00
        !            55: #define SONIC_DATA_CONFIGURATION          0x01
        !            56: #define SONIC_RECEIVE_CONTROL             0x02
        !            57: #define SONIC_TRANSMIT_CONTROL            0x03
        !            58: #define SONIC_INTERRUPT_MASK              0x04
        !            59: #define SONIC_INTERRUPT_STATUS            0x05
        !            60: 
        !            61: #define SONIC_UPPER_TRANSMIT_DESCRIPTOR   0x06
        !            62: #define SONIC_CURR_TRANSMIT_DESCRIPTOR    0x07
        !            63: 
        !            64: #define SONIC_UPPER_RECEIVE_DESCRIPTOR    0x0d
        !            65: #define SONIC_CURR_RECEIVE_DESCRIPTOR     0x0e
        !            66: #define SONIC_END_OF_BUFFER_WORD_COUNT    0x13
        !            67: #define SONIC_UPPER_RECEIVE_RESOURCE      0x14
        !            68: #define SONIC_RESOURCE_START              0x15
        !            69: #define SONIC_RESOURCE_END                0x16
        !            70: #define SONIC_RESOURCE_READ               0x17
        !            71: #define SONIC_RESOURCE_WRITE              0x18
        !            72: #define SONIC_RECEIVE_SEQUENCE            0x2b
        !            73: 
        !            74: #define SONIC_CAM_ENTRY_POINTER           0x21
        !            75: #define SONIC_CAM_ADDRESS_PORT_2          0x22
        !            76: #define SONIC_CAM_ADDRESS_PORT_1          0x23
        !            77: #define SONIC_CAM_ADDRESS_PORT_0          0x24
        !            78: #define SONIC_CAM_ENABLE                  0x25
        !            79: #define SONIC_CAM_DESCRIPTOR              0x26
        !            80: #define SONIC_CAM_DESCRIPTOR_COUNT        0x27
        !            81: 
        !            82: #define SONIC_CRC_ERROR                   0x2c
        !            83: #define SONIC_FRAME_ALIGNMENT_ERROR       0x2d
        !            84: #define SONIC_MISSED_PACKET               0x2e
        !            85: 
        !            86: #define SONIC_WATCHDOG_TIMER_0            0x29
        !            87: #define SONIC_WATCHDOG_TIMER_1            0x2a
        !            88: 
        !            89: #define SONIC_SILICON_REVISION            0x28
        !            90: 
        !            91: 
        !            92: //
        !            93: // Constants for the SONIC_COMMAND register.
        !            94: //
        !            95: 
        !            96: #define SONIC_CR_LOAD_CAM                 ((USHORT)(0x0200))
        !            97: #define SONIC_CR_READ_RRA                 ((USHORT)(0x0100))
        !            98: #define SONIC_CR_SOFTWARE_RESET           ((USHORT)(0x0080))
        !            99: #define SONIC_CR_START_TIMER              ((USHORT)(0x0020))
        !           100: #define SONIC_CR_STOP_TIMER               ((USHORT)(0x0010))
        !           101: #define SONIC_CR_RECEIVER_ENABLE          ((USHORT)(0x0008))
        !           102: #define SONIC_CR_RECEIVER_DISABLE         ((USHORT)(0x0004))
        !           103: #define SONIC_CR_TRANSMIT_PACKETS         ((USHORT)(0x0002))
        !           104: #define SONIC_CR_HALT_TRANSMISSION        ((USHORT)(0x0001))
        !           105: 
        !           106: 
        !           107: //
        !           108: // Constants for the SONIC_DATA_CONFIGURATION register.
        !           109: //
        !           110: 
        !           111: #define SONIC_DCR_LATCHED_BUS_RETRY       ((USHORT)(0x2000))
        !           112: #define SONIC_DCR_PROGRAMMABLE_OUTPUT_1   ((USHORT)(0x1000))
        !           113: #define SONIC_DCR_PROGRAMMABLE_OUTPUT_0   ((USHORT)(0x0800))
        !           114: #define SONIC_DCR_SYNCH_TERMINATION       ((USHORT)(0x0400))
        !           115: #define SONIC_DCR_USER_DEFINABLE_1        ((USHORT)(0x0200))
        !           116: #define SONIC_DCR_USER_DEFINABLE_0        ((USHORT)(0x0100))
        !           117: #define SONIC_DCR_0_WAIT_STATE            ((USHORT)(0x0000))
        !           118: #define SONIC_DCR_1_WAIT_STATE            ((USHORT)(0x0040))
        !           119: #define SONIC_DCR_2_WAIT_STATE            ((USHORT)(0x0080))
        !           120: #define SONIC_DCR_3_WAIT_STATE            ((USHORT)(0x00c0))
        !           121: #define SONIC_DCR_32_BIT_DATA_WIDTH       ((USHORT)(0x0020))
        !           122: #define SONIC_DCR_16_BIT_DATA_WIDTH       ((USHORT)(0x0000))
        !           123: #define SONIC_DCR_BLOCK_MODE_DMA          ((USHORT)(0x0010))
        !           124: #define SONIC_DCR_EMPTY_FILL_DMA          ((USHORT)(0x0000))
        !           125: #define SONIC_DCR_FIFO_MASK               ((USHORT)(0xfff0))
        !           126: #define SONIC_DCR_12_WORD_RECEIVE_FIFO    ((USHORT)(0x000c))
        !           127: #define SONIC_DCR_8_WORD_RECEIVE_FIFO     ((USHORT)(0x0008))
        !           128: #define SONIC_DCR_4_WORD_RECEIVE_FIFO     ((USHORT)(0x0004))
        !           129: #define SONIC_DCR_2_WORD_RECEIVE_FIFO     ((USHORT)(0x0000))
        !           130: #define SONIC_DCR_14_WORD_TRANSMIT_FIFO   ((USHORT)(0x0003))
        !           131: #define SONIC_DCR_12_WORD_TRANSMIT_FIFO   ((USHORT)(0x0002))
        !           132: #define SONIC_DCR_8_WORD_TRANSMIT_FIFO    ((USHORT)(0x0001))
        !           133: #define SONIC_DCR_4_WORD_TRANSMIT_FIFO    ((USHORT)(0x0000))
        !           134: 
        !           135: 
        !           136: //
        !           137: // Constants for the SONIC_RECEIVE_CONTROL register.
        !           138: //
        !           139: 
        !           140: #define SONIC_RCR_ACCEPT_CRC_ERRORS       ((USHORT)(0x8000))
        !           141: #define SONIC_RCR_ACCEPT_RUNT_PACKETS     ((USHORT)(0x4000))
        !           142: #define SONIC_RCR_ACCEPT_BROADCAST        ((USHORT)(0x2000))
        !           143: #define SONIC_RCR_PROMISCUOUS_PHYSICAL    ((USHORT)(0x1000))
        !           144: #define SONIC_RCR_ACCEPT_ALL_MULTICAST    ((USHORT)(0x0800))
        !           145: #define SONIC_RCR_TRANSCEIVER_LOOPBACK    ((USHORT)(0x0600))
        !           146: #define SONIC_RCR_ENDEC_LOOPBACK          ((USHORT)(0x0400))
        !           147: #define SONIC_RCR_MAC_LOOPBACK            ((USHORT)(0x0200))
        !           148: #define SONIC_RCR_NO_LOOPBACK             ((USHORT)(0x0000))
        !           149: 
        !           150: #define SONIC_RCR_MULTICAST_RECEIVED      ((USHORT)(0x0100))
        !           151: #define SONIC_RCR_BROADCAST_RECEIVED      ((USHORT)(0x0080))
        !           152: #define SONIC_RCR_LAST_PACKET_IN_RBA      ((USHORT)(0x0040))
        !           153: #define SONIC_RCR_CARRIER_SENSE           ((USHORT)(0x0020))
        !           154: #define SONIC_RCR_COLLISION               ((USHORT)(0x0010))
        !           155: #define SONIC_RCR_CRC_ERROR               ((USHORT)(0x0008))
        !           156: #define SONIC_RCR_FRAME_ALIGNMENT         ((USHORT)(0x0004))
        !           157: #define SONIC_RCR_LOOPBACK_RECEIVED       ((USHORT)(0x0002))
        !           158: #define SONIC_RCR_PACKET_RECEIVED_OK      ((USHORT)(0x0001))
        !           159: 
        !           160: 
        !           161: //
        !           162: // This is needed due to a problem with the SONIC while attempting
        !           163: // to ignore these packets.
        !           164: //
        !           165: 
        !           166: #define SONIC_RCR_DEFAULT_VALUE           ((USHORT) \
        !           167:                                            (SONIC_RCR_ACCEPT_CRC_ERRORS | \
        !           168:                                            SONIC_RCR_ACCEPT_RUNT_PACKETS))
        !           169: 
        !           170: 
        !           171: //
        !           172: // Constants for the SONIC_TRANSMIT_CONTROL register.
        !           173: //
        !           174: 
        !           175: #define SONIC_TCR_PROG_INTERRUPT          ((USHORT)(0x8000))
        !           176: #define SONIC_TCR_CRC_INHIBIT             ((USHORT)(0x2000))
        !           177: #define SONIC_TCR_EXCESSIVE_DEFERRAL      ((USHORT)(0x0400))
        !           178: #define SONIC_TCR_DEFERRED_TRANSMISSION   ((USHORT)(0x0200))
        !           179: #define SONIC_TCR_NO_CARRIER_SENSE        ((USHORT)(0x0100))
        !           180: #define SONIC_TCR_CARRIER_LOST            ((USHORT)(0x0080))
        !           181: #define SONIC_TCR_EXCESSIVE_COLLISIONS    ((USHORT)(0x0040))
        !           182: #define SONIC_TCR_OUT_OF_WINDOW           ((USHORT)(0x0020))
        !           183: #define SONIC_TCR_FIFO_UNDERRUN           ((USHORT)(0x0004))
        !           184: #define SONIC_TCR_BYTE_COUNT_MISMATCH     ((USHORT)(0x0002))
        !           185: #define SONIC_TCR_PACKET_TRANSMITTED_OK   ((USHORT)(0x0001))
        !           186: 
        !           187: #define SONIC_TCR_STATUS_MASK             ((USHORT)(0x07ff))
        !           188: #define SONIC_TCR_COLLISIONS_MASK         ((USHORT)(0xf800))
        !           189: #define SONIC_TCR_COLLISIONS_SHIFT        11
        !           190: 
        !           191: 
        !           192: //
        !           193: // Constants for the SONIC_INTERRUPT_MASK and
        !           194: // SONIC_INTERRUPT_STATUS registers.
        !           195: //
        !           196: 
        !           197: #define SONIC_INT_BUS_RETRY               ((USHORT)(0x4000))
        !           198: #define SONIC_INT_HEARTBEAT_LOST          ((USHORT)(0x2000))
        !           199: #define SONIC_INT_LOAD_CAM_DONE           ((USHORT)(0x1000))
        !           200: #define SONIC_INT_PROG_INTERRUPT          ((USHORT)(0x0800))
        !           201: #define SONIC_INT_PACKET_RECEIVED         ((USHORT)(0x0400))
        !           202: #define SONIC_INT_PACKET_TRANSMITTED      ((USHORT)(0x0200))
        !           203: #define SONIC_INT_TRANSMIT_ERROR          ((USHORT)(0x0100))
        !           204: #define SONIC_INT_TIMER_COMPLETE          ((USHORT)(0x0080))
        !           205: #define SONIC_INT_RECEIVE_DESCRIPTORS     ((USHORT)(0x0040))
        !           206: #define SONIC_INT_RECEIVE_BUFFERS         ((USHORT)(0x0020))
        !           207: #define SONIC_INT_RECEIVE_OVERFLOW        ((USHORT)(0x0010))
        !           208: #define SONIC_INT_CRC_TALLY_ROLLOVER      ((USHORT)(0x0008))
        !           209: #define SONIC_INT_FAE_TALLY_ROLLOVER      ((USHORT)(0x0004))
        !           210: #define SONIC_INT_MP_TALLY_ROLLOVER       ((USHORT)(0x0002))
        !           211: 
        !           212: //
        !           213: // By default, the interrupts we unmask.
        !           214: //
        !           215: 
        !           216: #define SONIC_INT_DEFAULT_VALUE           ((USHORT) \
        !           217:                                            (SONIC_INT_BUS_RETRY | \
        !           218:                                             SONIC_INT_LOAD_CAM_DONE | \
        !           219:                                             SONIC_INT_PROG_INTERRUPT | \
        !           220:                                             SONIC_INT_PACKET_RECEIVED | \
        !           221:                                             SONIC_INT_PACKET_TRANSMITTED | \
        !           222:                                             SONIC_INT_TRANSMIT_ERROR | \
        !           223:                                             SONIC_INT_RECEIVE_DESCRIPTORS | \
        !           224:                                             SONIC_INT_RECEIVE_BUFFERS | \
        !           225:                                             SONIC_INT_RECEIVE_OVERFLOW | \
        !           226:                                             SONIC_INT_CRC_TALLY_ROLLOVER | \
        !           227:                                             SONIC_INT_FAE_TALLY_ROLLOVER | \
        !           228:                                             SONIC_INT_MP_TALLY_ROLLOVER))
        !           229: 
        !           230: //
        !           231: // The interrupts we acknowledge immediately.
        !           232: //
        !           233: 
        !           234: #define SONIC_INT_IMMEDIATE_ACK           ((USHORT) \
        !           235:                                            (SONIC_INT_DEFAULT_VALUE & \
        !           236:                                             ~(SONIC_INT_RECEIVE_DESCRIPTORS | \
        !           237:                                               SONIC_INT_RECEIVE_BUFFERS)))
        !           238: 
        !           239: 
        !           240: 
        !           241: //
        !           242: // The maximum number of fragments that a transmit descriptor
        !           243: // can hold. If a packet has more than this, we have to merge
        !           244: // it into a single buffer before we transmit it. Increasing
        !           245: // this will prevent us from merging packets with more fragments
        !           246: // (which are rare) but use more memory in our transmit descriptors
        !           247: // (which are permanently allocated). For every one that we
        !           248: // increase this, memory usage goes up by 12 bytes in each
        !           249: // descriptor.
        !           250: //
        !           251: 
        !           252: #define SONIC_MAX_FRAGMENTS 4
        !           253: 
        !           254: 
        !           255: //
        !           256: // The smallest size that a fragment can be. This is due to
        !           257: // their potentially being underrun problems if a fragment
        !           258: // shorted than this is transmitted. If a packet has a fragment
        !           259: // that is too short, we merge it into a single buffer before
        !           260: // we transmit it. This should not change unless the hardware
        !           261: // changes in some way.
        !           262: //
        !           263: 
        !           264: #define SONIC_MIN_FRAGMENT_SIZE 12
        !           265: 
        !           266: 
        !           267: //
        !           268: // The smallest Ethernet packet size. Packets smaller than this
        !           269: // have blanks appended to pad them out to this length.
        !           270: //
        !           271: 
        !           272: #define SONIC_MIN_PACKET_SIZE 60
        !           273: 
        !           274: 
        !           275: //
        !           276: // The number of entries in the CAM. The CAM (Content Addressable
        !           277: // Memory) holds the directed and multicast addresses that we
        !           278: // monitor. We reserve one of these spots for our directed address,
        !           279: // allowing us SONIC_CAM_ENTRIES - 1 multicast addresses. Changing
        !           280: // this allows us to handle more multicast addresses without
        !           281: // forcing the protocol into "all multicast" mode, but allocates
        !           282: // more memory in the CAM (16 bytes per entry).
        !           283: //
        !           284: 
        !           285: #define SONIC_CAM_ENTRIES 16
        !           286: 
        !           287: 
        !           288: //
        !           289: // The number of transmit descriptors in the ring we allocate,
        !           290: // each of which can hold SONIC_MAX_FRAGMENTS fragments.
        !           291: // The size of a transmit descriptor is ~100 bytes, varying
        !           292: // based on SONIC_MAX_FRAGMENTS.
        !           293: //
        !           294: 
        !           295: #define SONIC_NUMBER_OF_TRANSMIT_DESCRIPTORS 5
        !           296: 
        !           297: 
        !           298: //
        !           299: // The number and size of the receive buffers we allocate,
        !           300: // which hold the actual data received off the network. Increasing
        !           301: // this allows us to receive more large packets, but the
        !           302: // number of receive descriptors also needs to be increased.
        !           303: //
        !           304: 
        !           305: #define SONIC_NUMBER_OF_RECEIVE_BUFFERS 10
        !           306: #define SONIC_SIZE_OF_RECEIVE_BUFFERS 4000
        !           307: 
        !           308: 
        !           309: //
        !           310: // This seems to have to be a multiple of four
        !           311: // (not just two). When there is less than this
        !           312: // amount left in a Receive Buffer after packet
        !           313: // reception, the sonic will use the next
        !           314: // ReceiveBuffer for the next packet. We define it
        !           315: // larger than the maximum Ethernet packet size,
        !           316: // so we never get a buffer overflow.
        !           317: //
        !           318: 
        !           319: #define SONIC_END_OF_BUFFER_COUNT 1520
        !           320: 
        !           321: 
        !           322: //
        !           323: // The number of receive descriptors we allocate, which hold
        !           324: // pointers to packets received in the receive buffers. This
        !           325: // is now kept at twice the number of receive buffers since
        !           326: // two full-size packets can be received into each receive
        !           327: // buffer.
        !           328: //
        !           329: 
        !           330: #define SONIC_NUMBER_OF_RECEIVE_DESCRIPTORS 20
        !           331: 
        !           332: 
        !           333: //
        !           334: // The small, medium and large buffers are used for merging
        !           335: // packets that violate our constraints (two many fragments,
        !           336: // fragments too small). The packet is merged into the smallest
        !           337: // buffer that can hold it. These should not be increased unless
        !           338: // there is a problem with many packets being merged; in that
        !           339: // case it might be better to increase SONIC_MAX_FRAGMENTS
        !           340: // first (if the problem is too many fragments).
        !           341: //
        !           342: 
        !           343: #define SONIC_SMALL_BUFFER_SIZE ((UINT)64)
        !           344: #define SONIC_MEDIUM_BUFFER_SIZE ((UINT)256)
        !           345: #define SONIC_LARGE_BUFFER_SIZE ((UINT)1514)
        !           346: 
        !           347: #define SONIC_NUMBER_OF_SMALL_BUFFERS ((UINT)10)
        !           348: #define SONIC_NUMBER_OF_MEDIUM_BUFFERS ((UINT)10)
        !           349: #define SONIC_NUMBER_OF_LARGE_BUFFERS ((UINT)3)
        !           350: 
        !           351: 
        !           352: //
        !           353: // This bit in a link field signifies "end of list" to the
        !           354: // sonic.
        !           355: //
        !           356: 
        !           357: #define SONIC_END_OF_LIST 0x01
        !           358: 
        !           359: 
        !           360: //
        !           361: // These are used in the InUse field of Receive Descriptors.
        !           362: //
        !           363: 
        !           364: #define SONIC_OWNED_BY_SYSTEM 0x00
        !           365: #define SONIC_OWNED_BY_SONIC 0x01
        !           366: 
        !           367: 
        !           368: //
        !           369: // This type defines the physical addresses used by the Sonic
        !           370: // chip itself. This should always be four bytes.
        !           371: //
        !           372: 
        !           373: typedef ULONG SONIC_PHYSICAL_ADDRESS, *PSONIC_PHYSICAL_ADDRESS;
        !           374: 
        !           375: 
        !           376: 
        !           377: //
        !           378: // Describes a Receive Buffer Area; the Receive Resource
        !           379: // Area is an array of these structures. In 32-bit mode the
        !           380: // upper 16 bits of all the elements are not used.
        !           381: //
        !           382: 
        !           383: typedef struct _SONIC_RECEIVE_RESOURCE {
        !           384: 
        !           385:     //
        !           386:     // Pointer to the receive buffer. It must be
        !           387:     // longword (4 bytes) aligned.
        !           388:     //
        !           389: 
        !           390:     SONIC_PHYSICAL_ADDRESS LowBufferAddress;
        !           391:     SONIC_PHYSICAL_ADDRESS HighBufferAddress;
        !           392: 
        !           393:     //
        !           394:     // The number of WORDS in the receive buffer.
        !           395:     //
        !           396: 
        !           397:     UINT LowBufferWordCount;
        !           398:     UINT HighBufferWordCount;
        !           399: 
        !           400: } SONIC_RECEIVE_RESOURCE, * PSONIC_RECEIVE_RESOURCE;
        !           401: 
        !           402: 
        !           403: //
        !           404: // A receive descriptor; the Receive Descriptor Area is a
        !           405: // linked list of these structures.
        !           406: //
        !           407: 
        !           408: typedef struct _SONIC_RECEIVE_DESCRIPTOR {
        !           409: 
        !           410:     //
        !           411:     // After reception this field will contain the contents
        !           412:     // of the SONIC_RECEIVE_CONTROL register. Bits 8-0 are
        !           413:     // status bits.
        !           414:     //
        !           415: 
        !           416:     UINT ReceiveStatus;
        !           417: 
        !           418:     //
        !           419:     // The length of the packet (including the CRC field).
        !           420:     //
        !           421: 
        !           422:     UINT ByteCount;
        !           423: 
        !           424:     //
        !           425:     // A pointer to the location in the RBA where the packet
        !           426:     // resides. A packet is always received into a contiguous
        !           427:     // piece of memory.
        !           428:     //
        !           429: 
        !           430:     SONIC_PHYSICAL_ADDRESS LowPacketAddress;
        !           431:     SONIC_PHYSICAL_ADDRESS HighPacketAddress;
        !           432: 
        !           433:     //
        !           434:     // Contains the RBA and packet sequence number.
        !           435:     //
        !           436: 
        !           437:     UINT SequenceNumber;
        !           438: 
        !           439:     //
        !           440:     // A link to the next receive descriptor. This is set up
        !           441:     // at initialization and is not modified by the SONIC.
        !           442:     // The low bit is the EOL bit, indicating the end of
        !           443:     // the linked list of receive descriptors.
        !           444:     //
        !           445: 
        !           446:     SONIC_PHYSICAL_ADDRESS Link;
        !           447: 
        !           448:     //
        !           449:     // Denotes the ownership of this receive descriptor.
        !           450:     // 0 = driver, non-zero = SONIC.
        !           451:     //
        !           452: 
        !           453:     UINT InUse;
        !           454: 
        !           455: } SONIC_RECEIVE_DESCRIPTOR, * PSONIC_RECEIVE_DESCRIPTOR;
        !           456: 
        !           457: 
        !           458: 
        !           459: //
        !           460: // Describes a fragment of a packet.
        !           461: //
        !           462: 
        !           463: typedef struct _SONIC_TRANSMIT_FRAGMENT {
        !           464: 
        !           465:     //
        !           466:     // A pointer to the fragment. May be aligned on any
        !           467:     // byte boundary.
        !           468:     //
        !           469: 
        !           470:     SONIC_PHYSICAL_ADDRESS LowFragmentAddress;
        !           471:     SONIC_PHYSICAL_ADDRESS HighFragmentAddress;
        !           472: 
        !           473:     //
        !           474:     // The size of the fragment.
        !           475:     //
        !           476: 
        !           477:     UINT FragmentByteCount;
        !           478: 
        !           479: } SONIC_TRANSMIT_FRAGMENT, * PSONIC_TRANSMIT_FRAGMENT;
        !           480: 
        !           481: 
        !           482: //
        !           483: // A transmit descriptor for a packet (containing up to
        !           484: // SONIC_MAX_PACKET_FRAGMENTS pieces); the Transmit
        !           485: // Descriptor Area is a linked list of these structures.
        !           486: // If there are fewer than SONIC_MAX_PACKET_FRAGMENTS
        !           487: // pieces, then the Link field will not be used and
        !           488: // the link value will instead be put in
        !           489: // PacketFragments[FragmentCount].FragmentPointerLsb;
        !           490: // however at initialization the value will be put in
        !           491: // Link and that is the value that must be used.
        !           492: //
        !           493: 
        !           494: typedef struct _SONIC_TRANSMIT_DESCRIPTOR {
        !           495: 
        !           496:     //
        !           497:     // Contains the status after transmission. The status
        !           498:     // is bits 10-0 of the SONIC_TRANSMIT_CONTROL register.
        !           499:     //
        !           500: 
        !           501:     UINT TransmitStatus;
        !           502: 
        !           503:     //
        !           504:     // Before transmission, bits 15-12 of this field are
        !           505:     // copied into the SONIC_TRANSMIT_CONTROL register.
        !           506:     //
        !           507: 
        !           508:     UINT TransmitConfiguration;
        !           509: 
        !           510:     //
        !           511:     // The size of the packet to be transmitted, in bytes.
        !           512:     //
        !           513: 
        !           514:     UINT PacketSize;
        !           515: 
        !           516:     //
        !           517:     // The number of fragments in the packet.
        !           518:     //
        !           519: 
        !           520:     UINT FragmentCount;
        !           521: 
        !           522:     //
        !           523:     // Location and size of each fragment.
        !           524:     //
        !           525: 
        !           526:     SONIC_TRANSMIT_FRAGMENT Fragments[SONIC_MAX_FRAGMENTS];
        !           527: 
        !           528:     //
        !           529:     // A pointer to the next Transmit Descriptor. This will
        !           530:     // be set at initialization time and will not change.
        !           531:     // However, its value will be copied into the beginning
        !           532:     // of the first unused Fragments[] structure if FragmentCount
        !           533:     // is less than SONIC_MAX_FRAGMENTS (since the Link field
        !           534:     // must follow the last fragment descriptor).
        !           535:     //
        !           536: 
        !           537:     SONIC_PHYSICAL_ADDRESS Link;
        !           538: 
        !           539: } SONIC_TRANSMIT_DESCRIPTOR, * PSONIC_TRANSMIT_DESCRIPTOR;
        !           540: 
        !           541: 
        !           542: 
        !           543: //
        !           544: // Describes an entry in the CAM Descriptor Area.
        !           545: //
        !           546: 
        !           547: typedef struct _SONIC_CAM_FRAGMENT {
        !           548: 
        !           549:     //
        !           550:     // The index (0-15) of the CAM entry
        !           551:     //
        !           552: 
        !           553:     UINT CamEntryPointer;
        !           554: 
        !           555:     //
        !           556:     // The Ethernet address, divided into three pieces in
        !           557:     // order from most significant to least significant.
        !           558:     // In each piece only the low-order 16 bits are
        !           559:     // used. I.e., for an Ethernet address 01-02-03-04-05-06,
        !           560:     // CamAddressPort0 would be 0x0102, CamAddressPort1
        !           561:     // would be 0x0304, and CamAddressPort2 would be 0x0506.
        !           562:     //
        !           563: 
        !           564:     UINT CamAddressPort0;
        !           565:     UINT CamAddressPort1;
        !           566:     UINT CamAddressPort2;
        !           567: 
        !           568: } SONIC_CAM_FRAGMENT, * PSONIC_CAM_FRAGMENT;
        !           569: 
        !           570: 
        !           571: 
        !           572: //
        !           573: // The entire CAM Descriptor Area. In general, the CamEnable
        !           574: // field is not needed; the value will be stored in the
        !           575: // CamEntryPointer of the SONIC_CAM_FRAGMENT after the last
        !           576: // one used. However, the current value will also be
        !           577: // maintained in CamEnable.
        !           578: //
        !           579: 
        !           580: typedef struct _SONIC_CAM_DESCRIPTOR_AREA {
        !           581: 
        !           582:     //
        !           583:     // Holds the index and value of each of the entries.
        !           584:     //
        !           585: 
        !           586:     SONIC_CAM_FRAGMENT CamFragments[SONIC_CAM_ENTRIES];
        !           587: 
        !           588:     //
        !           589:     // A bit mask indicating which of the entries are enabled
        !           590:     // (only the low 16 bits are used).
        !           591:     //
        !           592: 
        !           593:     UINT CamEnable;
        !           594: 
        !           595: } SONIC_CAM_DESCRIPTOR_AREA, * PSONIC_CAM_DESCRIPTOR_AREA;
        !           596: 
        !           597: 
        !           598: 
        !           599: //
        !           600: // Identifies the AdapterType values that the driver supports.
        !           601: //
        !           602: 
        !           603: #define SONIC_ADAPTER_TYPE_EISA       1
        !           604: #define SONIC_ADAPTER_TYPE_INTERNAL   2
        !           605: 
        !           606: 
        !           607: //
        !           608: // Macros to get MSB and LSB of an address.
        !           609: //
        !           610: 
        !           611: #define SONIC_GET_LOW_PART_ADDRESS(Adr) ((USHORT)((Adr) & 0xffff))
        !           612: #define SONIC_GET_HIGH_PART_ADDRESS(Adr) ((UCHAR)(((Adr) & 0xffff0000) >> 16))
        !           613: 
        !           614: 
        !           615: //
        !           616: // Set up a SONIC_CAM_FRAGMENT given the entry pointer and
        !           617: // Ethernet address.
        !           618: //
        !           619: // Cfp is a pointer to a CAM Fragment.
        !           620: //
        !           621: // Ep is the entry pointer.
        !           622: //
        !           623: // Addr is the Ethernet address.
        !           624: //
        !           625: 
        !           626: #define SONIC_LOAD_CAM_FRAGMENT(Cfp, Ep, Addr) \
        !           627: { \
        !           628:     PSONIC_CAM_FRAGMENT _Cfp = (Cfp); \
        !           629:     UINT _Ep = (Ep); \
        !           630:     PVOID _Addr = (Addr); \
        !           631:     _Cfp->CamEntryPointer = _Ep; \
        !           632:     NdisWriteRegisterUlong((PULONG)(&_Cfp->CamAddressPort0), (ULONG)(((PUSHORT)Addr)[0])); \
        !           633:     NdisWriteRegisterUlong((PULONG)(&_Cfp->CamAddressPort1), (ULONG)(((PUSHORT)Addr)[1])); \
        !           634:     NdisWriteRegisterUlong((PULONG)(&_Cfp->CamAddressPort2), (ULONG)(((PUSHORT)Addr)[2])); \
        !           635: }
        !           636: 
        !           637: 
        !           638: //
        !           639: // Set up a SONIC_CAM_FRAGMENT to hold the CamEnable value
        !           640: // in it.
        !           641: //
        !           642: // Cfp is a pointer to the CAM Fragment.
        !           643: //
        !           644: // Ce is the value for CAM Enable.
        !           645: //
        !           646: 
        !           647: #define SONIC_LOAD_CAM_ENABLE(_Cfp, _Ce) \
        !           648:     NdisWriteRegisterUlong((PULONG)(&(_Cfp)->CamEntryPointer), (ULONG)(_Ce))
        !           649: 
        !           650: 
        !           651: //
        !           652: // Set a link field to be the end of a list.
        !           653: //
        !           654: // Plink is a pointer to a link field.
        !           655: //
        !           656: 
        !           657: #define SONIC_SET_END_OF_LIST(Plink) \
        !           658:     { \
        !           659:         ULONG _Data; \
        !           660:         NdisReadRegisterUlong((PULONG)(Plink), (PULONG)(&_Data)); \
        !           661:         NdisWriteRegisterUlong((PULONG)(Plink),(ULONG)(_Data | SONIC_END_OF_LIST)); \
        !           662:     }
        !           663: 
        !           664: //
        !           665: // Set a link field to not be the end of a list.
        !           666: //
        !           667: // Plink is a pointer to a link field.
        !           668: //
        !           669: 
        !           670: #define SONIC_REMOVE_END_OF_LIST(Plink) \
        !           671:     { \
        !           672:         ULONG _Data; \
        !           673:         NdisReadRegisterUlong((PULONG)(Plink), (PULONG)(&_Data)); \
        !           674:         NdisWriteRegisterUlong((PULONG)(Plink), (ULONG)(_Data & ~SONIC_END_OF_LIST)); \
        !           675:     }
        !           676: 
        !           677: //
        !           678: // Used to set the address of a transmit descriptor fragment.
        !           679: //
        !           680: // Tdf is a pointer to a transmit descriptor fragment.
        !           681: //
        !           682: // Adr is a *physical* address.
        !           683: //
        !           684: 
        !           685: #define SONIC_SET_TRANSMIT_FRAGMENT_ADDRESS(Tdf,Adr) \
        !           686: { \
        !           687:     SONIC_PHYSICAL_ADDRESS _Adr = (Adr); \
        !           688:     PSONIC_TRANSMIT_FRAGMENT _Tdf = (Tdf); \
        !           689:     _Tdf->LowFragmentAddress = (SONIC_PHYSICAL_ADDRESS)_Adr; \
        !           690:     _Tdf->HighFragmentAddress = (SONIC_PHYSICAL_ADDRESS)(SONIC_GET_HIGH_PART_ADDRESS(_Adr)); \
        !           691: }
        !           692: 
        !           693: 
        !           694: //
        !           695: // Used to retrieve the address of a transmit descriptor fragment.
        !           696: // It takes advantage of the fact that we store the entire address
        !           697: // at LowFragmentAddress, not just the low bits.
        !           698: //
        !           699: // Tdf is a pointer to a transmit descriptor fragment.
        !           700: //
        !           701: #define SONIC_GET_TRANSMIT_FRAGMENT_ADDRESS(Tdf) \
        !           702:     (Tdf)->LowFragmentAddress
        !           703: 
        !           704: 
        !           705: //
        !           706: // Used to set the length of the transmit descriptor fragment.
        !           707: //
        !           708: // Tdf is a pointer to a transmit descriptor fragment.
        !           709: //
        !           710: // Len is the unsigned short length of the buffer.
        !           711: //
        !           712: #define SONIC_SET_TRANSMIT_FRAGMENT_LENGTH(Tdf,Len) \
        !           713:     (Tdf)->FragmentByteCount = (UINT)(Len)
        !           714: 
        !           715: 
        !           716: //
        !           717: // Used to put the link field on top of a transmit descriptor
        !           718: // fragment.
        !           719: //
        !           720: // Tdf is a pointer to a transmit descriptor fragment.
        !           721: //
        !           722: // Link is the link field to copy.
        !           723: //
        !           724: #define SONIC_SET_TRANSMIT_LINK(Tdf,Link) \
        !           725:     NdisWriteRegisterUlong((PULONG)(&(Tdf)->LowFragmentAddress), (ULONG)((Link) | SONIC_END_OF_LIST))
        !           726: 
        !           727: 
        !           728: 
        !           729: //
        !           730: // Used to set the address of a receive resource.
        !           731: //
        !           732: // Rrp is a pointer to a receive resource.
        !           733: //
        !           734: // Adr is a *physical* address.
        !           735: //
        !           736: #define SONIC_SET_RECEIVE_RESOURCE_ADDRESS(Rrp,Adr) \
        !           737: { \
        !           738:     SONIC_PHYSICAL_ADDRESS _Adr = (Adr); \
        !           739:     PSONIC_RECEIVE_RESOURCE _Rrp = (Rrp); \
        !           740:     NdisWriteRegisterUlong((PULONG)(&_Rrp->LowBufferAddress), (ULONG)(_Adr)); \
        !           741:     NdisWriteRegisterUlong((PULONG)(&_Rrp->HighBufferAddress), (ULONG)(SONIC_GET_HIGH_PART_ADDRESS(_Adr))); \
        !           742: }
        !           743: 
        !           744: 
        !           745: //
        !           746: // Used to retrieve the address of a receive resource.
        !           747: // It takes advantage of the fact that we store the entire address
        !           748: // at LowBufferAddress, not just the low bits.
        !           749: //
        !           750: // Rrp is a pointer to a receive resource.
        !           751: //
        !           752: #define SONIC_GET_RECEIVE_RESOURCE_ADDRESS(Rrp) \
        !           753:     (Rrp)->LowBufferAddress
        !           754: 
        !           755: 
        !           756: //
        !           757: // Used to set the length of a receive resource.
        !           758: //
        !           759: // Rrp is a pointer to a receive resource.
        !           760: //
        !           761: // Len is the length of the buffer.
        !           762: //
        !           763: #define SONIC_SET_RECEIVE_RESOURCE_LENGTH(Rrp,Len) \
        !           764: { \
        !           765:     ULONG _Len = (Len); \
        !           766:     PSONIC_RECEIVE_RESOURCE _Rrp = (Rrp); \
        !           767:     NdisWriteRegisterUlong((PULONG)(&_Rrp->LowBufferWordCount), (ULONG)(((_Len) & 0x1ffff) >> 1)); \
        !           768:     NdisWriteRegisterUlong((PULONG)(&_Rrp->HighBufferWordCount), (ULONG)((_Len) >> 17)); \
        !           769: }
        !           770: 
        !           771: 
        !           772: #endif // _SONICHARDWARE_
        !           773: 

unix.superglobalmegacorp.com

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