[BACK]Return to aic6915.h CVS log [TXT][DIR] Up to [local] / sys / dev / ic

Annotation of sys/dev/ic/aic6915.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: aic6915.h,v 1.2 2006/12/07 13:30:24 martin Exp $      */
                      2: /*     $NetBSD: aic6915reg.h,v 1.4 2005/12/11 12:21:25 christos Exp $  */
                      3:
                      4: /*-
                      5:  * Copyright (c) 2001 The NetBSD Foundation, Inc.
                      6:  * All rights reserved.
                      7:  *
                      8:  * This code is derived from software contributed to The NetBSD Foundation
                      9:  * by Jason R. Thorpe.
                     10:  *
                     11:  * Redistribution and use in source and binary forms, with or without
                     12:  * modification, are permitted provided that the following conditions
                     13:  * are met:
                     14:  * 1. Redistributions of source code must retain the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer.
                     16:  * 2. Redistributions in binary form must reproduce the above copyright
                     17:  *    notice, this list of conditions and the following disclaimer in the
                     18:  *    documentation and/or other materials provided with the distribution.
                     19:  * 3. All advertising materials mentioning features or use of this software
                     20:  *    must display the following acknowledgement:
                     21:  *     This product includes software developed by the NetBSD
                     22:  *     Foundation, Inc. and its contributors.
                     23:  * 4. Neither the name of The NetBSD Foundation nor the names of its
                     24:  *    contributors may be used to endorse or promote products derived
                     25:  *    from this software without specific prior written permission.
                     26:  *
                     27:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     28:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     29:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     30:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     31:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     32:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     33:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     34:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     35:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     36:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     37:  * POSSIBILITY OF SUCH DAMAGE.
                     38:  */
                     39:
                     40: #ifndef _DEV_IC_AIC6915_H_
                     41: #define        _DEV_IC_AIC6915_H_
                     42:
                     43: #include <sys/timeout.h>
                     44:
                     45: /*
                     46:  * Register description for the Adaptec AIC-6915 (``Starfire'')
                     47:  * 10/100 Ethernet controller.
                     48:  */
                     49:
                     50: /*
                     51:  * Receive Buffer Descriptor (One-size, 32-bit addressing)
                     52:  */
                     53: struct sf_rbd32 {
                     54:        uint32_t        rbd32_addr;             /* address, flags */
                     55: };
                     56:
                     57: /*
                     58:  * Receive Buffer Descriptor (One-size, 64-bit addressing)
                     59:  */
                     60: struct sf_rbd64 {
                     61:        uint32_t        rbd64_addr_lo;          /* address (LSD), flags */
                     62:        uint32_t        rbd64_addr_hi;          /* address (MDS) */
                     63: };
                     64:
                     65: #define        RBD_V           (1U << 0)       /* valid descriptor */
                     66: #define        RBD_E           (1U << 1)       /* end of ring */
                     67:
                     68: /*
                     69:  * Short (Type 0) Completion Descriptor
                     70:  */
                     71: struct sf_rcd_short {
                     72:        uint32_t        rcd_word0;      /* length, end index, status1 */
                     73: };
                     74:
                     75: /*
                     76:  * Basic (Type 1) Completion Descriptor
                     77:  */
                     78: struct sf_rcd_basic {
                     79:        uint32_t        rcd_word0;      /* length, end index, status1 */
                     80:        uint32_t        rcd_word1;      /* VLAN ID, status2 */
                     81: };
                     82:
                     83: /*
                     84:  * Checksum (Type 2) Completion Descriptor
                     85:  */
                     86: struct sf_rcd_checksum {
                     87:        uint32_t        rcd_word0;      /* length, end index, status1 */
                     88:        uint32_t        rcd_word1;      /* partial TCP/UDP checksum, status2 */
                     89: };
                     90:
                     91: /*
                     92:  * Full (Type 3) Completion Descriptor
                     93:  */
                     94: struct sf_rcd_full {
                     95:        uint32_t        rcd_word0;      /* length, end index, status1 */
                     96:        uint32_t        rcd_word1;      /* start index, status3, status2 */
                     97:        uint32_t        rcd_word2;      /* VLAN ID + priority, TCP/UDP csum */
                     98:        uint32_t        rcd_timestamp;  /* timestamp */
                     99: };
                    100:
                    101: #define        RCD_W0_ID               (1U << 30)
                    102:
                    103: #define        RCD_W0_Length(x)        ((x) & 0xffff)
                    104: #define        RCD_W0_EndIndex(x)      (((x) >> 16) & 0x7ff)
                    105: #define        RCD_W0_BufferQueue      (1U << 27)      /* 1 == Queue 2 */
                    106: #define        RCD_W0_FifoFull         (1U << 28)      /* FIFO full */
                    107: #define        RCD_W0_OK               (1U << 29)      /* packet is OK */
                    108:
                    109: /* Status2 field */
                    110: #define        RCD_W1_FrameType        (7U << 16)
                    111: #define        RCD_W1_FrameType_Unknown (0 << 16)
                    112: #define        RCD_W1_FrameType_IPv4   (1U << 16)
                    113: #define        RCD_W1_FrameType_IPv6   (2U << 16)
                    114: #define        RCD_W1_FrameType_IPX    (3U << 16)
                    115: #define        RCD_W1_FrameType_ICMP   (4U << 16)
                    116: #define        RCD_W1_FrameType_Unsupported (5U << 16)
                    117: #define        RCD_W1_UdpFrame         (1U << 19)
                    118: #define        RCD_W1_TcpFrame         (1U << 20)
                    119: #define        RCD_W1_Fragmented       (1U << 21)
                    120: #define        RCD_W1_PartialChecksumValid (1U << 22)
                    121: #define        RCD_W1_ChecksumBad      (1U << 23)
                    122: #define        RCD_W1_ChecksumOk       (1U << 24)
                    123: #define        RCD_W1_VlanFrame        (1U << 25)
                    124: #define        RCD_W1_ReceiveCodeViolation (1U << 26)
                    125: #define        RCD_W1_Dribble          (1U << 27)
                    126: #define        RCD_W1_ISLCRCerror      (1U << 28)
                    127: #define        RCD_W1_CRCerror         (1U << 29)
                    128: #define        RCD_W1_Hash             (1U << 30)
                    129: #define        RCD_W1_Perfect          (1U << 31)
                    130:
                    131: #define        RCD_W1_VLANID(x)        ((x) & 0xffff)
                    132: #define        RCD_W1_TCP_UDP_Checksum(x) ((x) & 0xffff)
                    133:
                    134: /* Status3 field */
                    135: #define        RCD_W1_Trailer          (1U << 11)
                    136: #define        RCD_W1_Header           (1U << 12)
                    137: #define        RCD_W1_ControlFrame     (1U << 13)
                    138: #define        RCD_W1_PauseFrame       (1U << 14)
                    139: #define        RCD_W1_IslFrame         (1U << 15)
                    140:
                    141: #define        RCD_W1_StartIndex(x)    ((x) & 0x7ff)
                    142:
                    143: #define        RCD_W2_TCP_UDP_Checksum(x) ((x) >> 16)
                    144: #define        RCD_W2_VLANID(x)        ((x) & 0xffff)
                    145:
                    146: /*
                    147:  * Number of transmit buffer fragments we use.  This is arbitrary, but
                    148:  * we choose it carefully; see blow.
                    149:  */
                    150: #define        SF_NTXFRAGS             15
                    151:
                    152: /*
                    153:  * Type 0, 32-bit addressing mode (Frame Descriptor) Transmit Descriptor
                    154:  *
                    155:  * NOTE: The total length of this structure is: 8 + (15 * 8) == 128
                    156:  * This means 16 Tx indices per Type 0 descriptor.  This is important later
                    157:  * on; see below.
                    158:  */
                    159: struct sf_txdesc0 {
                    160:        /* skip field */
                    161:        uint32_t        td_word0;       /* ID, flags */
                    162:        uint32_t        td_word1;       /* Tx buffer count */
                    163:        struct {
                    164:                uint32_t fr_addr;       /* address */
                    165:                uint32_t fr_len;        /* length */
                    166:        } td_frags[SF_NTXFRAGS];
                    167: };
                    168:
                    169: #define        TD_W1_NTXBUFS           (0xff << 0)
                    170:
                    171: /*
                    172:  * Type 1, 32-bit addressing mode (Buffer Descriptor) Transmit Descriptor
                    173:  */
                    174: struct sf_txdesc1 {
                    175:        /* skip field */
                    176:        uint32_t        td_word0;       /* ID, flags */
                    177:        uint32_t        td_addr;        /* buffer address */
                    178: };
                    179:
                    180: #define        TD_W0_ID                (0xb << 28)
                    181: #define        TD_W0_INTR              (1U << 27)
                    182: #define        TD_W0_END               (1U << 26)
                    183: #define        TD_W0_CALTCP            (1U << 25)
                    184: #define        TD_W0_CRCEN             (1U << 24)
                    185: #define        TD_W0_LEN               (0xffff << 0)
                    186: #define        TD_W0_NTXBUFS           (0xff << 16)
                    187: #define        TD_W0_NTXBUFS_SHIFT     16
                    188:
                    189: /*
                    190:  * Type 2, 64-bit addressing mode (Buffer Descriptor) Transmit Descriptor
                    191:  */
                    192: struct sf_txdesc2 {
                    193:        /* skip field */
                    194:        uint32_t        td_word0;       /* ID, flags */
                    195:        uint32_t        td_reserved;
                    196:        uint32_t        td_addr_lo;     /* buffer address (LSD) */
                    197:        uint32_t        td_addr_hi;     /* buffer address (MSD) */
                    198: };
                    199:
                    200: /*
                    201:  * Transmit Completion Descriptor.
                    202:  */
                    203: struct sf_tcd {
                    204:        uint32_t        tcd_word0;      /* index, priority, flags */
                    205: };
                    206:
                    207: #define        TCD_DMA_ID              (0x4 << 29)
                    208: #define        TCD_INDEX(x)            ((x) & 0x7fff)
                    209: #define        TCD_PR                  (1U << 15)
                    210: #define        TCD_TIMESTAMP(x)        (((x) >> 16) & 0x1fff)
                    211:
                    212: #define        TCD_TX_ID               (0x5 << 29)
                    213: #define        TCD_CRCerror            (1U << 16)
                    214: #define        TCD_FieldLengthCkError  (1U << 17)
                    215: #define        TCD_FieldLengthRngError (1U << 18)
                    216: #define        TCD_PacketTxOk          (1U << 19)
                    217: #define        TCD_Deferred            (1U << 20)
                    218: #define        TCD_ExDeferral          (1U << 21)
                    219: #define        TCD_ExCollisions        (1U << 22)
                    220: #define        TCD_LateCollision       (1U << 23)
                    221: #define        TCD_LongFrame           (1U << 24)
                    222: #define        TCD_FIFOUnderrun        (1U << 25)
                    223: #define        TCD_ControlTx           (1U << 26)
                    224: #define        TCD_PauseTx             (1U << 27)
                    225: #define        TCD_TxPaused            (1U << 28)
                    226:
                    227: /*
                    228:  * The Tx indices are in units of 8 bytes, and since we are using
                    229:  * Tx descriptors that are 128 bytes long, we need to divide by 16
                    230:  * to get the actual index that we care about.
                    231:  */
                    232: #define        SF_TXDINDEX_TO_HOST(x)          ((x) >> 4)
                    233: #define        SF_TXDINDEX_TO_CHIP(x)          ((x) << 4)
                    234:
                    235: /*
                    236:  * To make matters worse, the manual lies about the indices in the
                    237:  * completion queue entires.  It claims they are in 8-byte units,
                    238:  * but they're actually *BYTES*, which means we need to divide by
                    239:  * 128 to get the actual index.
                    240:  */
                    241: #define        SF_TCD_INDEX_TO_HOST(x)         ((x) >> 7)
                    242:
                    243: /*
                    244:  * PCI configuration space addresses.
                    245:  */
                    246: #define        SF_PCI_MEMBA            (PCI_MAPREG_START + 0x00)
                    247: #define        SF_PCI_IOBA             (PCI_MAPREG_START + 0x08)
                    248:
                    249: #define        SF_GENREG_OFFSET        0x50000
                    250: #define        SF_FUNCREG_SIZE         0x100
                    251:
                    252: /*
                    253:  * PCI functional registers.
                    254:  */
                    255: #define        SF_PciDeviceConfig      0x40
                    256: #define        PDC_EnDpeInt            (1U << 31)      /* enable DPE PCIint */
                    257: #define        PDC_EnSseInt            (1U << 30)      /* enable SSE PCIint */
                    258: #define        PDC_EnRmaInt            (1U << 29)      /* enable RMA PCIint */
                    259: #define        PDC_EnRtaInt            (1U << 28)      /* enable RTA PCIint */
                    260: #define        PDC_EnStaInt            (1U << 27)      /* enable STA PCIint */
                    261: #define        PDC_EnDprInt            (1U << 24)      /* enable DPR PCIint */
                    262: #define        PDC_IntEnable           (1U << 23)      /* enable PCI_INTA_ */
                    263: #define        PDC_ExternalRegCsWidth  (7U << 20)      /* external chip-sel width */
                    264: #define        PDC_StopMWrOnCacheLineDis (1U << 19)
                    265: #define        PDC_EpromCsWidth        (7U << 16)
                    266: #define        PDC_EnBeLogic           (1U << 15)
                    267: #define        PDC_LatencyStopOnCacheLine (1U << 14)
                    268: #define        PDC_PCIMstDmaEn         (1U << 13)
                    269: #define        PDC_StopOnCachelineEn   (1U << 12)
                    270: #define        PDC_FifoThreshold       (0xf << 8)
                    271: #define        PDC_FifoThreshold_SHIFT 8
                    272: #define        PDC_MemRdCmdEn          (1U << 7)
                    273: #define        PDC_StopOnPerr          (1U << 6)
                    274: #define        PDC_AbortOnAddrParityErr (1U << 5)
                    275: #define        PDC_EnIncrement         (1U << 4)
                    276: #define        PDC_System64            (1U << 2)
                    277: #define        PDC_Force64             (1U << 1)
                    278: #define        PDC_SoftReset           (1U << 0)
                    279:
                    280: #define        SF_BacControl           0x44
                    281: #define        BC_DescSwapMode         (0x3 << 6)
                    282: #define        BC_DataSwapMode         (0x3 << 4)
                    283: #define        BC_SingleDmaMode        (1U << 3)
                    284: #define        BC_PreferTxDmaReq       (1U << 2)
                    285: #define        BC_PreferRxDmaReq       (1U << 1)
                    286: #define        BC_BacDmaEn             (1U << 0)
                    287:
                    288: #define        SF_PciMonitor1          0x48
                    289:
                    290: #define        SF_PciMonitor2          0x4c
                    291:
                    292: #define        SF_PMC                  0x50
                    293:
                    294: #define        SF_PMCSR                0x54
                    295:
                    296: #define        SF_PMEvent              0x58
                    297:
                    298: #define        SF_SerialEpromControl   0x60
                    299: #define        SEC_InitDone            (1U << 3)
                    300: #define        SEC_Idle                (1U << 2)
                    301: #define        SEC_WriteEnable         (1U << 1)
                    302: #define        SEC_WriteDisable        (1U << 0)
                    303:
                    304: #define        SF_PciComplianceTesting 0x64
                    305:
                    306: #define        SF_IndirectIoAccess     0x68
                    307:
                    308: #define        SF_IndirectIoDataPort   0x6c
                    309:
                    310: /*
                    311:  * Ethernet functional registers.
                    312:  */
                    313: #define        SF_GeneralEthernetCtrl  0x70
                    314: #define        GEC_SetSoftInt          (1U << 8)
                    315: #define        GEC_TxGfpEn             (1U << 5)
                    316: #define        GEC_RxGfpEn             (1U << 4)
                    317: #define        GEC_TxDmaEn             (1U << 3)
                    318: #define        GEC_RxDmaEn             (1U << 2)
                    319: #define        GEC_TransmitEn          (1U << 1)
                    320: #define        GEC_ReceiveEn           (1U << 0)
                    321:
                    322: #define        SF_TimersControl        0x74
                    323: #define        TC_EarlyRxQ1IntDelayDisable     (1U << 31)
                    324: #define        TC_RxQ1DoneIntDelayDisable      (1U << 30)
                    325: #define        TC_EarlyRxQ2IntDelayDisable     (1U << 29)
                    326: #define        TC_RxQ2DoneIntDelayDisable      (1U << 28)
                    327: #define        TC_TimeStampResolution          (1U << 26)
                    328: #define        TC_GeneralTimerResolution       (1U << 25)
                    329: #define        TC_OneShotMode                  (1U << 24)
                    330: #define        TC_GeneralTimerInterval         (0xff << 16)
                    331: #define        TC_GeneralTimerInterval_SHIFT   16
                    332: #define        TC_TxFrameCompleteIntDelayDisable (1U << 15)
                    333: #define        TC_TxQueueDoneIntDelayDisable   (1U << 14)
                    334: #define        TC_TxDmaDoneIntDelayDisable     (1U << 13)
                    335: #define        TC_RxHiPrBypass                 (1U << 12)
                    336: #define        TC_Timer10X                     (1U << 11)
                    337: #define        TC_SmallRxFrame                 (3U << 9)
                    338: #define        TC_SmallFrameBypass             (1U << 8)
                    339: #define        TC_IntMaskMode                  (3U << 5)
                    340: #define        TC_IntMaskPeriod                (0x1f << 0)
                    341:
                    342: #define        SF_CurrentTime          0x78
                    343:
                    344: #define        SF_InterruptStatus      0x80
                    345: #define        IS_GPIO3                        (1U << 31)
                    346: #define        IS_GPIO2                        (1U << 30)
                    347: #define        IS_GPIO1                        (1U << 29)
                    348: #define        IS_GPIO0                        (1U << 28)
                    349: #define        IS_StatisticWrapInt             (1U << 27)
                    350: #define        IS_AbnormalInterrupt            (1U << 25)
                    351: #define        IS_GeneralTimerInt              (1U << 24)
                    352: #define        IS_SoftInt                      (1U << 23)
                    353: #define        IS_RxCompletionQueue1Int        (1U << 22)
                    354: #define        IS_TxCompletionQueueInt         (1U << 21)
                    355: #define        IS_PCIInt                       (1U << 20)
                    356: #define        IS_DmaErrInt                    (1U << 19)
                    357: #define        IS_TxDataLowInt                 (1U << 18)
                    358: #define        IS_RxCompletionQueue2Int        (1U << 17)
                    359: #define        IS_RxQ1LowBuffersInt            (1U << 16)
                    360: #define        IS_NormalInterrupt              (1U << 15)
                    361: #define        IS_TxFrameCompleteInt           (1U << 14)
                    362: #define        IS_TxDmaDoneInt                 (1U << 13)
                    363: #define        IS_TxQueueDoneInt               (1U << 12)
                    364: #define        IS_EarlyRxQ2Int                 (1U << 11)
                    365: #define        IS_EarlyRxQ1Int                 (1U << 10)
                    366: #define        IS_RxQ2DoneInt                  (1U << 9)
                    367: #define        IS_RxQ1DoneInt                  (1U << 8)
                    368: #define        IS_RxGfpNoResponseInt           (1U << 7)
                    369: #define        IS_RxQ2LowBuffersInt            (1U << 6)
                    370: #define        IS_NoTxChecksumInt              (1U << 5)
                    371: #define        IS_TxLowPrMismatchInt           (1U << 4)
                    372: #define        IS_TxHiPrMismatchInt            (1U << 3)
                    373: #define        IS_GfpRxInt                     (1U << 2)
                    374: #define        IS_GfpTxInt                     (1U << 1)
                    375: #define        IS_PCIPadInt                    (1U << 0)
                    376:
                    377: #define        SF_ShadowInterruptStatus 0x84
                    378:
                    379: #define        SF_InterruptEn          0x88
                    380:
                    381: #define        SF_GPIO                 0x8c
                    382: #define        GPIOCtrl(x)             (1U << (24 + (x)))
                    383: #define        GPIOOutMode(x)          (1U << (16 + (x)))
                    384: #define        GPIOInpMode(x, y)       ((y) << (8 + ((x) * 2)))
                    385: #define        GPIOData(x)             (1U << (x))
                    386:
                    387: #define        SF_TxDescQueueCtrl      0x90
                    388: #define        TDQC_TxHighPriorityFifoThreshold(x)     ((x) << 24)
                    389: #define        TDQC_SkipLength(x)                      ((x) << 16)
                    390: #define        TDQC_TxDmaBurstSize(x)                  ((x) << 8)
                    391: #define        TDQC_TxDescQueue64bitAddr               (1U << 7)
                    392: #define        TDQC_MinFrameSpacing(x)                 ((x) << 4)
                    393: #define        TDQC_DisableTxDmaCompletion             (1U << 3)
                    394: #define        TDQC_TxDescType(x)                      ((x) << 0)
                    395:
                    396: #define        SF_HiPrTxDescQueueBaseAddr 0x94
                    397:
                    398: #define        SF_LoPrTxDescQueueBaseAddr 0x98
                    399:
                    400: #define        SF_TxDescQueueHighAddr  0x9c
                    401:
                    402: #define        SF_TxDescQueueProducerIndex 0xa0
                    403: #define        TDQPI_HiPrTxProducerIndex(x)            ((x) << 16)
                    404: #define        TDQPI_LoPrTxProducerIndex(x)            ((x) << 0)
                    405: #define        TDQPI_HiPrTxProducerIndex_get(x)        (((x) >> 16) & 0x7ff)
                    406: #define        TDQPI_LoPrTxProducerIndex_get(x)        (((x) >> 0) & 0x7ff)
                    407:
                    408: #define        SF_TxDescQueueConsumerIndex 0xa4
                    409: #define        TDQCI_HiPrTxConsumerIndex(x)            (((x) >> 16) & 0x7ff)
                    410: #define        TDQCI_LoPrTxConsumerIndex(s)            (((x) >> 0) & 0x7ff)
                    411:
                    412: #define        SF_TxDmaStatus1         0xa8
                    413:
                    414: #define        SF_TxDmaStatus2         0xac
                    415:
                    416: #define        SF_TransmitFrameCSR     0xb0
                    417: #define        TFCSR_TxFrameStatus                     (0xff << 16)
                    418: #define        TFCSR_TxDebugConfigBits                 (0x7f << 9)
                    419: #define        TFCSR_DmaCompletionAfterTransmitComplete (1U << 8)
                    420: #define        TFCSR_TransmitThreshold(x)              ((x) << 0)
                    421:
                    422: #define        SF_CompletionQueueHighAddr 0xb4
                    423:
                    424: #define        SF_TxCompletionQueueCtrl 0xb8
                    425: #define        TCQC_TxCompletionBaseAddress            0xffffff00
                    426: #define        TCQC_TxCompletion64bitAddress           (1U << 7)
                    427: #define        TCQC_TxCompletionProducerWe             (1U << 6)
                    428: #define        TCQC_TxCompletionSize                   (1U << 5)
                    429: #define        TCQC_CommonQueueMode                    (1U << 4)
                    430: #define        TCQC_TxCompletionQueueThreshold         ((x) << 0)
                    431:
                    432: #define        SF_RxCompletionQueue1Ctrl 0xbc
                    433: #define        RCQ1C_RxCompletionQ1BaseAddress         0xffffff00
                    434: #define        RCQ1C_RxCompletionQ164bitAddress        (1U << 7)
                    435: #define        RCQ1C_RxCompletionQ1ProducerWe          (1U << 6)
                    436: #define        RCQ1C_RxCompletionQ1Type(x)             ((x) << 4)
                    437: #define        RCQ1C_RxCompletionQ1Threshold(x)        ((x) << 0)
                    438:
                    439: #define        SF_RxCompletionQueue2Ctrl 0xc0
                    440: #define        RCQ1C_RxCompletionQ2BaseAddress         0xffffff00
                    441: #define        RCQ1C_RxCompletionQ264bitAddress        (1U << 7)
                    442: #define        RCQ1C_RxCompletionQ2ProducerWe          (1U << 6)
                    443: #define        RCQ1C_RxCompletionQ2Type(x)             ((x) << 4)
                    444: #define        RCQ1C_RxCompletionQ2Threshold(x)        ((x) << 0)
                    445:
                    446: #define        SF_CompletionQueueConsumerIndex 0xc4
                    447: #define        CQCI_TxCompletionThresholdMode          (1U << 31)
                    448: #define        CQCI_TxCompletionConsumerIndex(x)       ((x) << 16)
                    449: #define        CQCI_TxCompletionConsumerIndex_get(x)   (((x) >> 16) & 0x7ff)
                    450: #define        CQCI_RxCompletionQ1ThresholdMode        (1U << 15)
                    451: #define        CQCI_RxCompletionQ1ConsumerIndex(x)     ((x) << 0)
                    452: #define        CQCI_RxCompletionQ1ConsumerIndex_get(x) ((x) & 0x7ff)
                    453:
                    454: #define        SF_CompletionQueueProducerIndex 0xc8
                    455: #define        CQPI_TxCompletionProducerIndex(x)       ((x) << 16)
                    456: #define        CQPI_TxCompletionProducerIndex_get(x)   (((x) >> 16) & 0x7ff)
                    457: #define        CQPI_RxCompletionQ1ProducerIndex(x)     ((x) << 0)
                    458: #define        CQPI_RxCompletionQ1ProducerIndex_get(x) ((x) & 0x7ff)
                    459:
                    460: #define        SF_RxHiPrCompletionPtrs 0xcc
                    461: #define        RHPCP_RxCompletionQ2ProducerIndex(x)    ((x) << 16)
                    462: #define        RHPCP_RxCompletionQ2ThresholdMode       (1U << 15)
                    463: #define        RHPCP_RxCompletionQ2ConsumerIndex(x)    ((x) << 0)
                    464:
                    465: #define        SF_RxDmaCtrl            0xd0
                    466: #define        RDC_RxReportBadFrames                   (1U << 31)
                    467: #define        RDC_RxDmaShortFrames                    (1U << 30)
                    468: #define        RDC_RxDmaBadFrames                      (1U << 29)
                    469: #define        RDC_RxDmaCrcErrorFrames                 (1U << 28)
                    470: #define        RDC_RxDmaControlFrame                   (1U << 27)
                    471: #define        RDC_RxDmaPauseFrame                     (1U << 26)
                    472: #define        RDC_RxChecksumMode(x)                   ((x) << 24)
                    473: #define        RDC_RxCompletionQ2Enable                (1U << 23)
                    474: #define        RDC_RxDmaQueueMode(x)                   ((x) << 20)
                    475: #define        RDC_RxUseBackupQueue                    (1U << 19)
                    476: #define        RDC_RxDmaCrc                            (1U << 18)
                    477: #define        RDC_RxEarlyIntThreshold(x)              ((x) << 12)
                    478: #define        RDC_RxHighPriorityThreshold(x)          ((x) << 8)
                    479: #define        RDC_RxBurstSize(x)                      ((x) << 0)
                    480:
                    481: #define        SF_RxDescQueue1Ctrl     0xd4
                    482: #define        RDQ1C_RxQ1BufferLength(x)               ((x) << 16)
                    483: #define        RDQ1C_RxPrefetchDescriptorsMode         (1U << 15)
                    484: #define        RDQ1C_RxDescQ1Entries                   (1U << 14)
                    485: #define        RDQ1C_RxVariableSizeQueues              (1U << 13)
                    486: #define        RDQ1C_Rx64bitBufferAddresses            (1U << 12)
                    487: #define        RDQ1C_Rx64bitDescQueueAddress           (1U << 11)
                    488: #define        RDQ1C_RxDescSpacing(x)                  ((x) << 8)
                    489: #define        RDQ1C_RxQ1ConsumerWe                    (1U << 7)
                    490: #define        RDQ1C_RxQ1MinDescriptorsThreshold(x)    ((x) << 0)
                    491:
                    492: #define        SF_RxDescQueue2Ctrl     0xd8
                    493: #define        RDQ2C_RxQ2BufferLength(x)               ((x) << 16)
                    494: #define        RDQ2C_RxDescQ2Entries                   (1U << 14)
                    495: #define        RDQ2C_RxQ2MinDescriptorsThreshold(x)    ((x) << 0)
                    496:
                    497: #define        SF_RxDescQueueHighAddress 0xdc
                    498:
                    499: #define        SF_RxDescQueue1LowAddress 0xe0
                    500:
                    501: #define        SF_RxDescQueue2LowAddress 0xe4
                    502:
                    503: #define        SF_RxDescQueue1Ptrs     0xe8
                    504: #define        RXQ1P_RxDescQ1Consumer(x)               ((x) << 16)
                    505: #define        RXQ1P_RxDescQ1Producer(x)               ((x) << 0)
                    506: #define        RXQ1P_RxDescQ1Producer_get(x)           ((x) & 0x7ff)
                    507:
                    508: #define        SF_RxDescQueue2Ptrs     0xec
                    509: #define        RXQ2P_RxDescQ2Consumer(x)               ((x) << 16)
                    510: #define        RXQ2P_RxDescQ2Producer(x)               ((x) << 0)
                    511:
                    512: #define        SF_RxDmaStatus          0xf0
                    513: #define        RDS_RxFramesLostCount(x)                ((x) & 0xffff)
                    514:
                    515: #define        SF_RxAddressFilteringCtl 0xf4
                    516: #define        RAFC_PerfectAddressPriority(x)          (1U << ((x) + 16))
                    517: #define        RAFC_MinVlanPriority(x)                 ((x) << 13)
                    518: #define        RAFC_PassMulticastExceptBroadcast       (1U << 12)
                    519: #define        RAFC_WakeupMode(x)                      ((x) << 10)
                    520: #define        RAFC_VlanMode(x)                        ((x) << 8)
                    521: #define        RAFC_PerfectFilteringMode(x)            ((x) << 6)
                    522: #define        RAFC_HashFilteringMode(x)               ((x) << 4)
                    523: #define        RAFC_HashPriorityEnable                 (1U << 3)
                    524: #define        RAFC_PassBroadcast                      (1U << 2)
                    525: #define        RAFC_PassMulticast                      (1U << 1)
                    526: #define        RAFC_PromiscuousMode                    (1U << 0)
                    527:
                    528: #define        SF_RxFrameTestOut       0xf8
                    529:
                    530: /*
                    531:  * Additional PCI registers.  To access these registers via I/O space,
                    532:  * indirect access must be used.
                    533:  */
                    534: #define        SF_PciTargetStatus      0x100
                    535:
                    536: #define        SF_PciMasterStatus1     0x104
                    537:
                    538: #define        SF_PciMasterStatus2     0x108
                    539:
                    540: #define        SF_PciDmaLowHostAddr    0x10c
                    541:
                    542: #define        SF_BacDmaDiagnostic0    0x110
                    543:
                    544: #define        SF_BacDmaDiagnostic1    0x114
                    545:
                    546: #define        SF_BacDmaDiagnostic2    0x118
                    547:
                    548: #define        SF_BacDmaDiagnostic3    0x11c
                    549:
                    550: #define        SF_MacAddr1             0x120
                    551:
                    552: #define        SF_MacAddr2             0x124
                    553:
                    554: #define        SF_FunctionEvent        0x130
                    555:
                    556: #define        SF_FunctionEventMask    0x134
                    557:
                    558: #define        SF_FunctionPresentState 0x138
                    559:
                    560: #define        SF_ForceFunction        0x13c
                    561:
                    562: #define        SF_EEPROM_BASE          0x1000
                    563:
                    564: #define        SF_MII_BASE             0x2000
                    565: #define        MiiDataValid            (1U << 31)
                    566: #define        MiiBusy                 (1U << 30)
                    567: #define        MiiRegDataPort(x)       ((x) & 0xffff)
                    568:
                    569: #define        SF_MII_PHY_REG(p, r)    (SF_MII_BASE +                          \
                    570:                                 ((p) * 32 * sizeof(uint32_t)) +        \
                    571:                                 ((r) * sizeof(uint32_t)))
                    572:
                    573: #define        SF_TestMode             0x4000
                    574:
                    575: #define        SF_RxFrameProcessorCtrl 0x4004
                    576:
                    577: #define        SF_TxFrameProcessorCtrl 0x4008
                    578:
                    579: #define        SF_MacConfig1           0x5000
                    580: #define        MC1_SoftRst                     (1U << 15)
                    581: #define        MC1_MiiLoopBack                 (1U << 14)
                    582: #define        MC1_TestMode(x)                 ((x) << 12)
                    583: #define        MC1_TxFlowEn                    (1U << 11)
                    584: #define        MC1_RxFlowEn                    (1U << 10)
                    585: #define        MC1_PreambleDetectCount         (1U << 9)
                    586: #define        MC1_PassAllRxPackets            (1U << 8)
                    587: #define        MC1_PurePreamble                (1U << 7)
                    588: #define        MC1_LengthCheck                 (1U << 6)
                    589: #define        MC1_NoBackoff                   (1U << 5)
                    590: #define        MC1_DelayCRC                    (1U << 4)
                    591: #define        MC1_TxHalfDuplexJam             (1U << 3)
                    592: #define        MC1_PadEn                       (1U << 2)
                    593: #define        MC1_FullDuplex                  (1U << 1)
                    594: #define        MC1_HugeFrame                   (1U << 0)
                    595:
                    596: #define        SF_MacConfig2           0x5004
                    597: #define        MC2_TxCRCerr                    (1U << 15)
                    598: #define        MC2_TxIslCRCerr                 (1U << 14)
                    599: #define        MC2_RxCRCerr                    (1U << 13)
                    600: #define        MC2_RxIslCRCerr                 (1U << 12)
                    601: #define        MC2_TXCF                        (1U << 11)
                    602: #define        MC2_CtlSoftRst                  (1U << 10)
                    603: #define        MC2_RxSoftRst                   (1U << 9)
                    604: #define        MC2_TxSoftRst                   (1U << 8)
                    605: #define        MC2_RxISLEn                     (1U << 7)
                    606: #define        MC2_BackPressureNoBackOff       (1U << 6)
                    607: #define        MC2_AutoVlanPad                 (1U << 5)
                    608: #define        MC2_MandatoryVLANPad            (1U << 4)
                    609: #define        MC2_TxISLAppen                  (1U << 3)
                    610: #define        MC2_TxISLEn                     (1U << 2)
                    611: #define        MC2_SimuRst                     (1U << 1)
                    612: #define        MC2_TxXmtEn                     (1U << 0)
                    613:
                    614: #define        SF_BkToBkIPG            0x5008
                    615:
                    616: #define        SF_NonBkToBkIPG         0x500c
                    617:
                    618: #define        SF_ColRetry             0x5010
                    619:
                    620: #define        SF_MaxLength            0x5014
                    621:
                    622: #define        SF_TxNibbleCnt          0x5018
                    623:
                    624: #define        SF_TxByteCnt            0x501c
                    625:
                    626: #define        SF_ReTxCnt              0x5020
                    627:
                    628: #define        SF_RandomNumGen         0x5024
                    629:
                    630: #define        SF_MskRandomNum         0x5028
                    631:
                    632: #define        SF_TotalTxCnt           0x5034
                    633:
                    634: #define        SF_RxByteCnt            0x5040
                    635:
                    636: #define        SF_TxPauseTimer         0x5060
                    637:
                    638: #define        SF_VLANType             0x5064
                    639:
                    640: #define        SF_MiiStatus            0x5070
                    641:
                    642: #define        SF_PERFECT_BASE         0x6000
                    643: #define        SF_PERFECT_SIZE         0x100
                    644:
                    645: #define        SF_HASH_BASE            0x6100
                    646: #define        SF_HASH_SIZE            0x200
                    647:
                    648: #define        SF_STATS_BASE           0x7000
                    649: struct sf_stats {
                    650:        uint32_t        TransmitOKFrames;
                    651:        uint32_t        SingleCollisionFrames;
                    652:        uint32_t        MultipleCollisionFrames;
                    653:        uint32_t        TransmitCRCErrors;
                    654:        uint32_t        TransmitOKOctets;
                    655:        uint32_t        TransmitDeferredFrames;
                    656:        uint32_t        TransmitLateCollisionCount;
                    657:        uint32_t        TransmitPauseControlFrames;
                    658:        uint32_t        TransmitControlFrames;
                    659:        uint32_t        TransmitAbortDueToExcessiveCollisions;
                    660:        uint32_t        TransmitAbortDueToExcessingDeferral;
                    661:        uint32_t        MulticastFramesTransmittedOK;
                    662:        uint32_t        BroadcastFramesTransmittedOK;
                    663:        uint32_t        FramesLostDueToInternalTransmitErrors;
                    664:        uint32_t        ReceiveOKFrames;
                    665:        uint32_t        ReceiveCRCErrors;
                    666:        uint32_t        AlignmentErrors;
                    667:        uint32_t        ReceiveOKOctets;
                    668:        uint32_t        PauseFramesReceivedOK;
                    669:        uint32_t        ControlFramesReceivedOK;
                    670:        uint32_t        ControlFramesReceivedWithUnsupportedOpcode;
                    671:        uint32_t        ReceiveFramesTooLong;
                    672:        uint32_t        ReceiveFramesTooShort;
                    673:        uint32_t        ReceiveFramesJabbersError;
                    674:        uint32_t        ReceiveFramesFragments;
                    675:        uint32_t        ReceivePackets64Bytes;
                    676:        uint32_t        ReceivePackets127Bytes;
                    677:        uint32_t        ReceivePackets255Bytes;
                    678:        uint32_t        ReceivePackets511Bytes;
                    679:        uint32_t        ReceivePackets1023Bytes;
                    680:        uint32_t        ReceivePackets1518Bytes;
                    681:        uint32_t        FramesLostDueToInternalReceiveErrors;
                    682:        uint32_t        TransmitFifoUnderflowCounts;
                    683: };
                    684:
                    685: #define        SF_TxGfpMem             0x8000
                    686:
                    687: #define        SF_RxGfpMem             0xa000
                    688:
                    689: /*
                    690:  * Data structure definitions for the Adaptec AIC-6915 (``Starfire'')
                    691:  * PCI 10/100 Ethernet controller driver.
                    692:  */
                    693:
                    694: /*
                    695:  * Transmit descriptor list size.
                    696:  */
                    697: #define        SF_NTXDESC              256
                    698: #define        SF_NTXDESC_MASK         (SF_NTXDESC - 1)
                    699: #define        SF_NEXTTX(x)            ((x + 1) & SF_NTXDESC_MASK)
                    700:
                    701: /*
                    702:  * Transmit completion queue size.  1024 is a hardware requirement.
                    703:  */
                    704: #define        SF_NTCD                 1024
                    705: #define        SF_NTCD_MASK            (SF_NTCD - 1)
                    706: #define        SF_NEXTTCD(x)           ((x + 1) & SF_NTCD_MASK)
                    707:
                    708: /*
                    709:  * Receive descriptor list size.
                    710:  */
                    711: #define        SF_NRXDESC              256
                    712: #define        SF_NRXDESC_MASK         (SF_NRXDESC - 1)
                    713: #define        SF_NEXTRX(x)            ((x + 1) & SF_NRXDESC_MASK)
                    714:
                    715: /*
                    716:  * Receive completion queue size.  1024 is a hardware requirement.
                    717:  */
                    718: #define        SF_NRCD                 1024
                    719: #define        SF_NRCD_MASK            (SF_NRCD - 1)
                    720: #define        SF_NEXTRCD(x)           ((x + 1) & SF_NRCD_MASK)
                    721:
                    722: /*
                    723:  * Control structures are DMA to the Starfire chip.  We allocate them in
                    724:  * a single clump that maps to a single DMA segment to make several things
                    725:  * easier.
                    726:  */
                    727: struct sf_control_data {
                    728:        /*
                    729:         * The transmit descriptors.
                    730:         */
                    731:        struct sf_txdesc0 scd_txdescs[SF_NTXDESC];
                    732:
                    733:        /*
                    734:         * The transmit completion queue entires.
                    735:         */
                    736:        struct sf_tcd scd_txcomp[SF_NTCD];
                    737:
                    738:        /*
                    739:         * The receive buffer descriptors.
                    740:         */
                    741:        struct sf_rbd32 scd_rxbufdescs[SF_NRXDESC];
                    742:
                    743:        /*
                    744:         * The receive completion queue entries.
                    745:         */
                    746:        struct sf_rcd_full scd_rxcomp[SF_NRCD];
                    747: };
                    748:
                    749: #define        SF_CDOFF(x)             offsetof(struct sf_control_data, x)
                    750: #define        SF_CDTXDOFF(x)          SF_CDOFF(scd_txdescs[(x)])
                    751: #define        SF_CDTXCOFF(x)          SF_CDOFF(scd_txcomp[(x)])
                    752: #define        SF_CDRXDOFF(x)          SF_CDOFF(scd_rxbufdescs[(x)])
                    753: #define        SF_CDRXCOFF(x)          SF_CDOFF(scd_rxcomp[(x)])
                    754:
                    755: /*
                    756:  * Software state for transmit and receive descriptors.
                    757:  */
                    758: struct sf_descsoft {
                    759:        struct mbuf *ds_mbuf;           /* head of mbuf chain */
                    760:        bus_dmamap_t ds_dmamap;         /* our DMA map */
                    761: };
                    762:
                    763: /*
                    764:  * Software state per device.
                    765:  */
                    766: struct sf_softc {
                    767:        struct device sc_dev;           /* generic device information */
                    768:        bus_space_tag_t sc_st;          /* bus space tag */
                    769:        bus_space_handle_t sc_sh;       /* bus space handle */
                    770:        bus_space_handle_t sc_sh_func;  /* sub-handle for func regs */
                    771:        bus_dma_tag_t sc_dmat;          /* bus DMA tag */
                    772:        struct arpcom sc_arpcom;        /* ethernet common data */
                    773:        void *sc_sdhook;                /* shutdown hook */
                    774:        int sc_iomapped;                /* are we I/O mapped? */
                    775:        int sc_flags;                   /* misc. flags */
                    776:
                    777:        struct mii_data sc_mii;         /* MII/media information */
                    778:        struct timeout sc_mii_timeout;  /* MII callout */
                    779:
                    780:        bus_dmamap_t sc_cddmamap;       /* control data DMA map */
                    781: #define        sc_cddma        sc_cddmamap->dm_segs[0].ds_addr
                    782:
                    783:        /*
                    784:         * Software state for transmit and receive descriptors.
                    785:         */
                    786:        struct sf_descsoft sc_txsoft[SF_NTXDESC];
                    787:        struct sf_descsoft sc_rxsoft[SF_NRXDESC];
                    788:
                    789:        /*
                    790:         * Control data structures.
                    791:         */
                    792:        struct sf_control_data *sc_control_data;
                    793: #define        sc_txdescs      sc_control_data->scd_txdescs
                    794: #define        sc_txcomp       sc_control_data->scd_txcomp
                    795: #define        sc_rxbufdescs   sc_control_data->scd_rxbufdescs
                    796: #define        sc_rxcomp       sc_control_data->scd_rxcomp
                    797:
                    798:        int     sc_txpending;           /* number of Tx requests pending */
                    799:
                    800:        uint32_t sc_InterruptEn;        /* prototype InterruptEn register */
                    801:
                    802:        uint32_t sc_TransmitFrameCSR;   /* prototype TransmitFrameCSR reg */
                    803:        uint32_t sc_TxDescQueueCtrl;    /* prototype TxDescQueueCtrl reg */
                    804:        int     sc_txthresh;            /* current Tx threshold */
                    805:
                    806:        uint32_t sc_MacConfig1;         /* prototype MacConfig1 register */
                    807:
                    808:        uint32_t sc_RxAddressFilteringCtl;
                    809: };
                    810:
                    811: #define        SF_CDTXDADDR(sc, x)     ((sc)->sc_cddma + SF_CDTXDOFF((x)))
                    812: #define        SF_CDTXCADDR(sc, x)     ((sc)->sc_cddma + SF_CDTXCOFF((x)))
                    813: #define        SF_CDRXDADDR(sc, x)     ((sc)->sc_cddma + SF_CDRXDOFF((x)))
                    814: #define        SF_CDRXCADDR(sc, x)     ((sc)->sc_cddma + SF_CDRXCOFF((x)))
                    815:
                    816: #define        SF_CDTXDSYNC(sc, x, ops)                                        \
                    817:        bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap,               \
                    818:            SF_CDTXDOFF((x)), sizeof(struct sf_txdesc0), (ops))
                    819:
                    820: #define        SF_CDTXCSYNC(sc, x, ops)                                        \
                    821:        bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap,               \
                    822:            SF_CDTXCOFF((x)), sizeof(struct sf_tcd), (ops))
                    823:
                    824: #define        SF_CDRXDSYNC(sc, x, ops)                                        \
                    825:        bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap,               \
                    826:            SF_CDRXDOFF((x)), sizeof(struct sf_rbd32), (ops))
                    827:
                    828: #define        SF_CDRXCSYNC(sc, x, ops)                                        \
                    829:        bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap,               \
                    830:            SF_CDRXCOFF((x)), sizeof(struct sf_rcd_full), (ops))
                    831:
                    832: #define        SF_INIT_RXDESC(sc, x)                                           \
                    833: do {                                                                   \
                    834:        struct sf_descsoft *__ds = &sc->sc_rxsoft[(x)];                 \
                    835:                                                                        \
                    836:        (sc)->sc_rxbufdescs[(x)].rbd32_addr =                           \
                    837:            __ds->ds_dmamap->dm_segs[0].ds_addr | RBD_V;                \
                    838:        SF_CDRXDSYNC((sc), (x), BUS_DMASYNC_PREWRITE);                  \
                    839: } while (/*CONSTCOND*/0)
                    840:
                    841: #ifdef _KERNEL
                    842: void   sf_attach(struct sf_softc *);
                    843: int    sf_intr(void *);
                    844: #endif /* _KERNEL */
                    845:
                    846: #endif /* _DEV_IC_AIC6915_H_ */

CVSweb