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

Annotation of sys/dev/pci/if_tlreg.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: if_tlreg.h,v 1.9 2005/12/17 07:31:27 miod Exp $       */
                      2:
                      3: /*
                      4:  * Copyright (c) 1997, 1998
                      5:  *     Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
                      6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  * 2. Redistributions in binary form must reproduce the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer in the
                     14:  *    documentation and/or other materials provided with the distribution.
                     15:  * 3. All advertising materials mentioning features or use of this software
                     16:  *    must display the following acknowledgement:
                     17:  *     This product includes software developed by Bill Paul.
                     18:  * 4. Neither the name of the author nor the names of any co-contributors
                     19:  *    may be used to endorse or promote products derived from this software
                     20:  *    without specific prior written permission.
                     21:  *
                     22:  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
                     23:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     24:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     25:  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
                     26:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     27:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     28:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     29:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     30:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     31:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
                     32:  * THE POSSIBILITY OF SUCH DAMAGE.
                     33:  *
                     34:  * $FreeBSD: src/sys/pci/if_tlreg.h,v 1.17 2001/02/09 06:11:21 bmilekic Exp $
                     35:  */
                     36:
                     37:
                     38: struct tl_type {
                     39:        u_int16_t               tl_vid;
                     40:        u_int16_t               tl_did;
                     41:        char                    *tl_name;
                     42: };
                     43:
                     44: /*
                     45:  * ThunderLAN TX/RX list format. The TX and RX lists are pretty much
                     46:  * identical: the list begins with a 32-bit forward pointer which points
                     47:  * at the next list in the chain, followed by 16 bits for the total
                     48:  * frame size, and a 16 bit status field. This is followed by a series
                     49:  * of 10 32-bit data count/data address pairs that point to the fragments
                     50:  * that make up the complete frame.
                     51:  */
                     52:
                     53: #define TL_MAXFRAGS            10
                     54: #define TL_RX_LIST_CNT         20
                     55: #define TL_TX_LIST_CNT         64
                     56: #define TL_MIN_FRAMELEN                128
                     57:
                     58: struct tl_frag {
                     59:        u_int32_t               tlist_dcnt;
                     60:        u_int32_t               tlist_dadr;
                     61: };
                     62:
                     63: struct tl_list {
                     64:        u_int32_t               tlist_fptr;     /* phys address of next list */
                     65:        u_int16_t               tlist_cstat;    /* status word */
                     66:        u_int16_t               tlist_frsize;   /* size of data in frame */
                     67:        struct tl_frag          tl_frag[TL_MAXFRAGS];
                     68: };
                     69:
                     70: /*
                     71:  * This is a special case of an RX list. By setting the One_Frag
                     72:  * bit in the NETCONFIG register, the driver can force the ThunderLAN
                     73:  * chip to use only one fragment when DMAing RX frames.
                     74:  */
                     75:
                     76: struct tl_list_onefrag {
                     77:        u_int32_t               tlist_fptr;
                     78:        u_int16_t               tlist_cstat;
                     79:        u_int16_t               tlist_frsize;
                     80:        struct tl_frag          tl_frag;
                     81: };
                     82:
                     83: struct tl_list_data {
                     84:        struct tl_list_onefrag  tl_rx_list[TL_RX_LIST_CNT];
                     85:        struct tl_list          tl_tx_list[TL_TX_LIST_CNT];
                     86:        unsigned char           tl_pad[TL_MIN_FRAMELEN];
                     87: };
                     88:
                     89: struct tl_chain {
                     90:        struct tl_list          *tl_ptr;
                     91:        struct mbuf             *tl_mbuf;
                     92:        struct tl_chain         *tl_next;
                     93: };
                     94:
                     95: struct tl_chain_onefrag {
                     96:        struct tl_list_onefrag  *tl_ptr;
                     97:        struct mbuf             *tl_mbuf;
                     98:        struct tl_chain_onefrag *tl_next;
                     99: };
                    100:
                    101: struct tl_chain_data {
                    102:        struct tl_chain_onefrag tl_rx_chain[TL_RX_LIST_CNT];
                    103:        struct tl_chain         tl_tx_chain[TL_TX_LIST_CNT];
                    104:
                    105:        struct tl_chain_onefrag *tl_rx_head;
                    106:        struct tl_chain_onefrag *tl_rx_tail;
                    107:
                    108:        struct tl_chain         *tl_tx_head;
                    109:        struct tl_chain         *tl_tx_tail;
                    110:        struct tl_chain         *tl_tx_free;
                    111: };
                    112:
                    113: struct tl_products {
                    114:        u_int16_t       tp_vend;
                    115:        u_int16_t       tp_prod;
                    116:        u_int32_t       tp_tlphymedia;
                    117: };
                    118:
                    119: struct tl_softc {
                    120:        struct device           sc_dev;         /* generic device structure */
                    121:        void *                  sc_ih;          /* interrupt handler cookie */
                    122:        struct arpcom           arpcom;         /* interface info */
                    123:        struct ifmedia          ifmedia;        /* media info */
                    124:        struct timeout          tl_stats_tmo, tl_wait_tmo;
                    125:        bus_space_handle_t      tl_bhandle;
                    126:        bus_space_tag_t         tl_btag;
                    127:        bus_dma_tag_t           sc_dmat;
                    128:        struct tl_type          *tl_dinfo;      /* ThunderLAN adapter info */
                    129:        struct tl_type          *tl_pinfo;      /* PHY info struct */
                    130:        int                     tl_if_flags;
                    131:        u_int8_t                tl_ctlr;        /* chip number */
                    132:        u_int8_t                tl_eeaddr;
                    133:        struct tl_list_data     *tl_ldata;      /* TX/RX lists and mbufs */
                    134:        struct tl_chain_data    tl_cdata;
                    135:        u_int8_t                tl_txeoc;
                    136:        u_int8_t                tl_bitrate;
                    137:        struct mii_data         sc_mii;
                    138:        const struct tl_products *tl_product;
                    139: };
                    140:
                    141: /*
                    142:  * Transmit interrupt threshold.
                    143:  */
                    144: #define TX_THR         0x00000004
                    145:
                    146: /*
                    147:  * General constants that are fun to know.
                    148:  *
                    149:  * The ThunderLAN controller is made by Texas Instruments. The
                    150:  * manual indicates that if the EEPROM checksum fails, the PCI
                    151:  * vendor and device ID registers will be loaded with TI-specific
                    152:  * values.
                    153:  */
                    154: #define        TI_VENDORID             0x104C
                    155: #define        TI_DEVICEID_THUNDERLAN  0x0500
                    156:
                    157: /*
                    158:  * These are the PCI vendor and device IDs for Compaq ethernet
                    159:  * adapters based on the ThunderLAN controller.
                    160:  */
                    161: #define COMPAQ_VENDORID                                0x0E11
                    162: #define COMPAQ_DEVICEID_NETEL_10_100           0xAE32
                    163: #define COMPAQ_DEVICEID_NETEL_UNKNOWN          0xAE33
                    164: #define COMPAQ_DEVICEID_NETEL_10               0xAE34
                    165: #define COMPAQ_DEVICEID_NETFLEX_3P_INTEGRATED  0xAE35
                    166: #define COMPAQ_DEVICEID_NETEL_10_100_DUAL      0xAE40
                    167: #define COMPAQ_DEVICEID_NETEL_10_100_PROLIANT  0xAE43
                    168: #define COMPAQ_DEVICEID_NETEL_10_100_EMBEDDED  0xB011
                    169: #define COMPAQ_DEVICEID_NETEL_10_T2_UTP_COAX   0xB012
                    170: #define COMPAQ_DEVICEID_NETEL_10_100_TX_UTP    0xB030
                    171: #define COMPAQ_DEVICEID_NETFLEX_3P             0xF130
                    172: #define COMPAQ_DEVICEID_NETFLEX_3P_BNC         0xF150
                    173:
                    174: /*
                    175:  * These are the PCI vendor and device IDs for Olicom
                    176:  * adapters based on the ThunderLAN controller.
                    177:  */
                    178: #define OLICOM_VENDORID                                0x108D
                    179: #define OLICOM_DEVICEID_OC2183                 0x0013
                    180: #define OLICOM_DEVICEID_OC2325                 0x0012
                    181: #define OLICOM_DEVICEID_OC2326                 0x0014
                    182:
                    183: /*
                    184:  * PCI low memory base and low I/O base
                    185:  */
                    186: #define TL_PCI_LOIO            0x10
                    187: #define TL_PCI_LOMEM           0x14
                    188:
                    189: /*
                    190:  * PCI latency timer (it's actually 0x0D, but we want a value
                    191:  * that's longword aligned).
                    192:  */
                    193: #define TL_PCI_LATENCY_TIMER   0x0C
                    194:
                    195: #define        TL_DIO_ADDR_INC         0x8000  /* Increment addr on each read */
                    196: #define TL_DIO_RAM_SEL         0x4000  /* RAM address select */
                    197: #define        TL_DIO_ADDR_MASK        0x3FFF  /* address bits mask */
                    198:
                    199: /*
                    200:  * Interrupt types
                    201:  */
                    202: #define TL_INTR_INVALID                0x0
                    203: #define TL_INTR_TXEOF          0x1
                    204: #define TL_INTR_STATOFLOW      0x2
                    205: #define TL_INTR_RXEOF          0x3
                    206: #define TL_INTR_DUMMY          0x4
                    207: #define TL_INTR_TXEOC          0x5
                    208: #define TL_INTR_ADCHK          0x6
                    209: #define TL_INTR_RXEOC          0x7
                    210:
                    211: #define TL_INT_MASK            0x001C
                    212: #define TL_VEC_MASK            0x1FE0
                    213: /*
                    214:  * Host command register bits
                    215:  */
                    216: #define TL_CMD_GO               0x80000000
                    217: #define TL_CMD_STOP             0x40000000
                    218: #define TL_CMD_ACK              0x20000000
                    219: #define TL_CMD_CHSEL7          0x10000000
                    220: #define TL_CMD_CHSEL6          0x08000000
                    221: #define TL_CMD_CHSEL5          0x04000000
                    222: #define TL_CMD_CHSEL4          0x02000000
                    223: #define TL_CMD_CHSEL3          0x01000000
                    224: #define TL_CMD_CHSEL2           0x00800000
                    225: #define TL_CMD_CHSEL1           0x00400000
                    226: #define TL_CMD_CHSEL0           0x00200000
                    227: #define TL_CMD_EOC              0x00100000
                    228: #define TL_CMD_RT               0x00080000
                    229: #define TL_CMD_NES              0x00040000
                    230: #define TL_CMD_ZERO0            0x00020000
                    231: #define TL_CMD_ZERO1            0x00010000
                    232: #define TL_CMD_ADRST            0x00008000
                    233: #define TL_CMD_LDTMR            0x00004000
                    234: #define TL_CMD_LDTHR            0x00002000
                    235: #define TL_CMD_REQINT           0x00001000
                    236: #define TL_CMD_INTSOFF          0x00000800
                    237: #define TL_CMD_INTSON          0x00000400
                    238: #define TL_CMD_RSVD0           0x00000200
                    239: #define TL_CMD_RSVD1           0x00000100
                    240: #define TL_CMD_ACK7            0x00000080
                    241: #define TL_CMD_ACK6            0x00000040
                    242: #define TL_CMD_ACK5            0x00000020
                    243: #define TL_CMD_ACK4            0x00000010
                    244: #define TL_CMD_ACK3            0x00000008
                    245: #define TL_CMD_ACK2            0x00000004
                    246: #define TL_CMD_ACK1            0x00000002
                    247: #define TL_CMD_ACK0            0x00000001
                    248:
                    249: #define TL_CMD_CHSEL_MASK      0x01FE0000
                    250: #define TL_CMD_ACK_MASK                0xFF
                    251:
                    252: /*
                    253:  * EEPROM address where station address resides.
                    254:  */
                    255: #define TL_EEPROM_EADDR                0x83
                    256: #define TL_EEPROM_EADDR2       0x99
                    257: #define TL_EEPROM_EADDR3       0xAF
                    258: #define TL_EEPROM_EADDR_OC     0xF8    /* Olicom cards use a different
                    259:                                           address than Compaqs. */
                    260: /*
                    261:  * ThunderLAN host command register offsets.
                    262:  * (Can be accessed either by IO ports or memory map.)
                    263:  */
                    264: #define TL_HOSTCMD             0x00
                    265: #define TL_CH_PARM             0x04
                    266: #define TL_DIO_ADDR            0x08
                    267: #define TL_HOST_INT            0x0A
                    268: #define TL_DIO_DATA            0x0C
                    269:
                    270: /*
                    271:  * ThunderLAN internal registers
                    272:  */
                    273: #define TL_NETCMD              0x00
                    274: #define TL_NETSIO              0x01
                    275: #define TL_NETSTS              0x02
                    276: #define TL_NETMASK             0x03
                    277:
                    278: #define TL_NETCONFIG           0x04
                    279: #define TL_MANTEST             0x06
                    280:
                    281: #define TL_VENID_LSB           0x08
                    282: #define TL_VENID_MSB           0x09
                    283: #define TL_DEVID_LSB           0x0A
                    284: #define TL_DEVID_MSB           0x0B
                    285:
                    286: #define TL_REVISION            0x0C
                    287: #define TL_SUBCLASS            0x0D
                    288: #define TL_MINLAT              0x0E
                    289: #define TL_MAXLAT              0x0F
                    290:
                    291: #define TL_AREG0_B5            0x10
                    292: #define TL_AREG0_B4            0x11
                    293: #define TL_AREG0_B3            0x12
                    294: #define TL_AREG0_B2            0x13
                    295:
                    296: #define TL_AREG0_B1            0x14
                    297: #define TL_AREG0_B0            0x15
                    298: #define TL_AREG1_B5            0x16
                    299: #define TL_AREG1_B4            0x17
                    300:
                    301: #define TL_AREG1_B3            0x18
                    302: #define TL_AREG1_B2            0x19
                    303: #define TL_AREG1_B1            0x1A
                    304: #define TL_AREG1_B0            0x1B
                    305:
                    306: #define TL_AREG2_B5            0x1C
                    307: #define TL_AREG2_B4            0x1D
                    308: #define TL_AREG2_B3            0x1E
                    309: #define TL_AREG2_B2            0x1F
                    310:
                    311: #define TL_AREG2_B1            0x20
                    312: #define TL_AREG2_B0            0x21
                    313: #define TL_AREG3_B5            0x22
                    314: #define TL_AREG3_B4            0x23
                    315:
                    316: #define TL_AREG3_B3            0x24
                    317: #define TL_AREG3_B2            0x25
                    318: #define TL_AREG3_B1            0x26
                    319: #define TL_AREG3_B0            0x27
                    320:
                    321: #define TL_HASH1               0x28
                    322: #define TL_HASH2               0x2C
                    323: #define TL_TXGOODFRAMES                0x30
                    324: #define TL_TXUNDERRUN          0x33
                    325: #define TL_RXGOODFRAMES                0x34
                    326: #define TL_RXOVERRUN           0x37
                    327: #define TL_DEFEREDTX           0x38
                    328: #define TL_CRCERROR            0x3A
                    329: #define TL_CODEERROR           0x3B
                    330: #define TL_MULTICOLTX          0x3C
                    331: #define TL_SINGLECOLTX         0x3E
                    332: #define TL_EXCESSIVECOL                0x40
                    333: #define TL_LATECOL             0x41
                    334: #define TL_CARRIERLOSS         0x42
                    335: #define TL_ACOMMIT             0x43
                    336: #define TL_LDREG               0x44
                    337: #define TL_BSIZEREG            0x45
                    338: #define TL_MAXRX               0x46
                    339:
                    340: /*
                    341:  * ThunderLAN SIO register bits
                    342:  */
                    343: #define TL_SIO_MINTEN          0x80
                    344: #define TL_SIO_ECLOK           0x40
                    345: #define TL_SIO_ETXEN           0x20
                    346: #define TL_SIO_EDATA           0x10
                    347: #define TL_SIO_NMRST           0x08
                    348: #define TL_SIO_MCLK            0x04
                    349: #define TL_SIO_MTXEN           0x02
                    350: #define TL_SIO_MDATA           0x01
                    351:
                    352: /*
                    353:  * Thunderlan NETCONFIG bits
                    354:  */
                    355: #define TL_CFG_RCLKTEST                0x8000
                    356: #define TL_CFG_TCLKTEST                0x4000
                    357: #define TL_CFG_BITRATE         0x2000
                    358: #define TL_CFG_RXCRC           0x1000
                    359: #define TL_CFG_PEF             0x0800
                    360: #define TL_CFG_ONEFRAG         0x0400
                    361: #define TL_CFG_ONECHAN         0x0200
                    362: #define TL_CFG_MTEST           0x0100
                    363: #define TL_CFG_PHYEN           0x0080
                    364: #define TL_CFG_MACSEL6         0x0040
                    365: #define TL_CFG_MACSEL5         0x0020
                    366: #define TL_CFG_MACSEL4         0x0010
                    367: #define TL_CFG_MACSEL3         0x0008
                    368: #define TL_CFG_MACSEL2         0x0004
                    369: #define TL_CFG_MACSEL1         0x0002
                    370: #define TL_CFG_MACSEL0         0x0001
                    371:
                    372: /*
                    373:  * ThunderLAN NETSTS bits
                    374:  */
                    375: #define TL_STS_MIRQ            0x80
                    376: #define TL_STS_HBEAT           0x40
                    377: #define TL_STS_TXSTOP          0x20
                    378: #define TL_STS_RXSTOP          0x10
                    379:
                    380: /*
                    381:  * ThunderLAN NETCMD bits
                    382:  */
                    383: #define TL_CMD_NRESET          0x80
                    384: #define TL_CMD_NWRAP           0x40
                    385: #define TL_CMD_CSF             0x20
                    386: #define TL_CMD_CAF             0x10
                    387: #define TL_CMD_NOBRX           0x08
                    388: #define TL_CMD_DUPLEX          0x04
                    389: #define TL_CMD_TRFRAM          0x02
                    390: #define TL_CMD_TXPACE          0x01
                    391:
                    392: /*
                    393:  * ThunderLAN NETMASK bits
                    394:  */
                    395: #define TL_MASK_MASK7          0x80
                    396: #define TL_MASK_MASK6          0x40
                    397: #define TL_MASK_MASK5          0x20
                    398: #define TL_MASK_MASK4          0x10
                    399:
                    400: /*
                    401:  * MII frame format
                    402:  */
                    403: #ifdef ANSI_DOESNT_ALLOW_BITFIELDS
                    404: struct tl_mii_frame {
                    405:        u_int16_t               mii_stdelim:2,
                    406:                                mii_opcode:2,
                    407:                                mii_phyaddr:5,
                    408:                                mii_regaddr:5,
                    409:                                mii_turnaround:2;
                    410:        u_int16_t               mii_data;
                    411: };
                    412: #else
                    413: struct tl_mii_frame {
                    414:        u_int8_t                mii_stdelim;
                    415:        u_int8_t                mii_opcode;
                    416:        u_int8_t                mii_phyaddr;
                    417:        u_int8_t                mii_regaddr;
                    418:        u_int8_t                mii_turnaround;
                    419:        u_int16_t               mii_data;
                    420: };
                    421: #endif
                    422: /*
                    423:  * MII constants
                    424:  */
                    425: #define TL_MII_STARTDELIM      0x01
                    426: #define TL_MII_READOP          0x02
                    427: #define TL_MII_WRITEOP         0x01
                    428: #define TL_MII_TURNAROUND      0x02
                    429:
                    430: #define TL_LAST_FRAG           0x80000000
                    431: #define TL_CSTAT_UNUSED                0x8000
                    432: #define TL_CSTAT_FRAMECMP      0x4000
                    433: #define TL_CSTAT_READY         0x3000
                    434: #define TL_CSTAT_UNUSED13      0x2000
                    435: #define TL_CSTAT_UNUSED12      0x1000
                    436: #define TL_CSTAT_EOC           0x0800
                    437: #define TL_CSTAT_RXERROR       0x0400
                    438: #define TL_CSTAT_PASSCRC       0x0200
                    439: #define TL_CSTAT_DPRIO         0x0100
                    440:
                    441: #define TL_FRAME_MASK          0x00FFFFFF
                    442: #define tl_tx_goodframes(x)    (x.tl_txstat & TL_FRAME_MASK)
                    443: #define tl_tx_underrun(x)      ((x.tl_txstat & ~TL_FRAME_MASK) >> 24)
                    444: #define tl_rx_goodframes(x)    (x.tl_rxstat & TL_FRAME_MASK)
                    445: #define tl_rx_overrun(x)       ((x.tl_rxstat & ~TL_FRAME_MASK) >> 24)
                    446:
                    447: struct tl_stats {
                    448:        u_int32_t               tl_txstat;
                    449:        u_int32_t               tl_rxstat;
                    450:        u_int16_t               tl_deferred;
                    451:        u_int8_t                tl_crc_errors;
                    452:        u_int8_t                tl_code_errors;
                    453:        u_int16_t               tl_tx_multi_collision;
                    454:        u_int16_t               tl_tx_single_collision;
                    455:        u_int8_t                tl_excessive_collision;
                    456:        u_int8_t                tl_late_collision;
                    457:        u_int8_t                tl_carrier_loss;
                    458:        u_int8_t                acommit;
                    459: };
                    460:
                    461: /*
                    462:  * ACOMMIT register bits. These are used only when a bitrate
                    463:  * PHY is selected ('bitrate' bit in netconfig register is set).
                    464:  */
                    465: #define TL_AC_MTXER            0x01    /* reserved */
                    466: #define TL_AC_MTXD1            0x02    /* 0 == 10baseT 1 == AUI */
                    467: #define TL_AC_MTXD2            0x04    /* loopback disable */
                    468: #define TL_AC_MTXD3            0x08    /* full duplex disable */
                    469:
                    470: #define TL_AC_TXTHRESH         0xF0
                    471: #define TL_AC_TXTHRESH_16LONG  0x00
                    472: #define TL_AC_TXTHRESH_32LONG  0x10
                    473: #define TL_AC_TXTHRESH_64LONG  0x20
                    474: #define TL_AC_TXTHRESH_128LONG 0x30
                    475: #define TL_AC_TXTHRESH_256LONG 0x40
                    476: #define TL_AC_TXTHRESH_WHOLEPKT        0x50
                    477:
                    478: /*
                    479:  * PCI burst size register (TL_BSIZEREG).
                    480:  */
                    481: #define TL_RXBURST             0x0F
                    482: #define TL_TXBURST             0xF0
                    483:
                    484: #define TL_RXBURST_4LONG       0x00
                    485: #define TL_RXBURST_8LONG       0x01
                    486: #define TL_RXBURST_16LONG      0x02
                    487: #define TL_RXBURST_32LONG      0x03
                    488: #define TL_RXBURST_64LONG      0x04
                    489: #define TL_RXBURST_128LONG     0x05
                    490:
                    491: #define TL_TXBURST_4LONG       0x00
                    492: #define TL_TXBURST_8LONG       0x10
                    493: #define TL_TXBURST_16LONG      0x20
                    494: #define TL_TXBURST_32LONG      0x30
                    495: #define TL_TXBURST_64LONG      0x40
                    496: #define TL_TXBURST_128LONG     0x50
                    497:
                    498: /*
                    499:  * register space access macros
                    500:  */
                    501: #define CSR_WRITE_4(sc, reg, val) \
                    502:        bus_space_write_4(sc->tl_btag, sc->tl_bhandle, reg, val)
                    503: #define CSR_WRITE_2(sc, reg, val) \
                    504:        bus_space_write_2(sc->tl_btag, sc->tl_bhandle, reg, val)
                    505: #define CSR_WRITE_1(sc, reg, val) \
                    506:        bus_space_write_1(sc->tl_btag, sc->tl_bhandle, reg, val)
                    507:
                    508: #define CSR_READ_4(sc, reg) \
                    509:        bus_space_read_4(sc->tl_btag, sc->tl_bhandle, reg)
                    510: #define CSR_READ_2(sc, reg) \
                    511:        bus_space_read_2(sc->tl_btag, sc->tl_bhandle, reg)
                    512: #define CSR_READ_1(sc, reg) \
                    513:        bus_space_read_1(sc->tl_btag, sc->tl_bhandle, reg)
                    514:
                    515: #define CMD_PUT(sc, x) CSR_WRITE_4(sc, TL_HOSTCMD, x)
                    516: #define CMD_SET(sc, x) \
                    517:        CSR_WRITE_4(sc, TL_HOSTCMD, CSR_READ_4(sc, TL_HOSTCMD) | (x))
                    518: #define CMD_CLR(sc, x) \
                    519:        CSR_WRITE_4(sc, TL_HOSTCMD, CSR_READ_4(sc, TL_HOSTCMD) & ~(x))
                    520:
                    521: /*
                    522:  * ThunderLAN adapters typically have a serial EEPROM containing
                    523:  * configuration information. The main reason we're interested in
                    524:  * it is because it also contains the adapters's station address.
                    525:  *
                    526:  * Access to the EEPROM is a bit goofy since it is a serial device:
                    527:  * you have to do reads and writes one bit at a time. The state of
                    528:  * the DATA bit can only change while the CLOCK line is held low.
                    529:  * Transactions work basically like this:
                    530:  *
                    531:  * 1) Send the EEPROM_START sequence to prepare the EEPROM for
                    532:  *    accepting commands. This pulls the clock high, sets
                    533:  *    the data bit to 0, enables transmission to the EEPROM,
                    534:  *    pulls the data bit up to 1, then pulls the clock low.
                    535:  *    The idea is to do a 0 to 1 transition of the data bit
                    536:  *    while the clock pin is held high.
                    537:  *
                    538:  * 2) To write a bit to the EEPROM, set the TXENABLE bit, then
                    539:  *    set the EDATA bit to send a 1 or clear it to send a 0.
                    540:  *    Finally, set and then clear ECLOK. Strobing the clock
                    541:  *    transmits the bit. After 8 bits have been written, the
                    542:  *    EEPROM should respond with an ACK, which should be read.
                    543:  *
                    544:  * 3) To read a bit from the EEPROM, clear the TXENABLE bit,
                    545:  *    then set ECLOK. The bit can then be read by reading EDATA.
                    546:  *    ECLOCK should then be cleared again. This can be repeated
                    547:  *    8 times to read a whole byte, after which the
                    548:  *
                    549:  * 4) We need to send the address byte to the EEPROM. For this
                    550:  *    we have to send the write control byte to the EEPROM to
                    551:  *    tell it to accept data. The byte is 0xA0. The EEPROM should
                    552:  *    ack this. The address byte can be send after that.
                    553:  *
                    554:  * 5) Now we have to tell the EEPROM to send us data. For that we
                    555:  *    have to transmit the read control byte, which is 0xA1. This
                    556:  *    byte should also be acked. We can then read the data bits
                    557:  *    from the EEPROM.
                    558:  *
                    559:  * 6) When we're all finished, send the EEPROM_STOP sequence.
                    560:  *
                    561:  * Note that we use the ThunderLAN's NetSio register to access the
                    562:  * EEPROM, however there is an alternate method. There is a PCI NVRAM
                    563:  * register at PCI offset 0xB4 which can also be used with minor changes.
                    564:  * The difference is that access to PCI registers via pci_conf_read()
                    565:  * and pci_conf_write() is done using programmed I/O, which we want to
                    566:  * avoid.
                    567:  */
                    568:
                    569: /*
                    570:  * Note that EEPROM_START leaves transmission enabled.
                    571:  */
                    572: #define EEPROM_START                                                   \
                    573:        tl_dio_setbit(sc, TL_NETSIO, TL_SIO_ECLOK); /* Pull clock pin high */\
                    574:        tl_dio_setbit(sc, TL_NETSIO, TL_SIO_EDATA); /* Set DATA bit to 1 */     \
                    575:        tl_dio_setbit(sc, TL_NETSIO, TL_SIO_ETXEN); /* Enable xmit to write bit */\
                    576:        tl_dio_clrbit(sc, TL_NETSIO, TL_SIO_EDATA); /* Pull DATA bit to 0 again */\
                    577:        tl_dio_clrbit(sc, TL_NETSIO, TL_SIO_ECLOK); /* Pull clock low again */
                    578:
                    579: /*
                    580:  * EEPROM_STOP ends access to the EEPROM and clears the ETXEN bit so
                    581:  * that no further data can be written to the EEPROM I/O pin.
                    582:  */
                    583: #define EEPROM_STOP                                                    \
                    584:        tl_dio_clrbit(sc, TL_NETSIO, TL_SIO_ETXEN); /* Disable xmit */  \
                    585:        tl_dio_clrbit(sc, TL_NETSIO, TL_SIO_EDATA); /* Pull DATA to 0 */        \
                    586:        tl_dio_setbit(sc, TL_NETSIO, TL_SIO_ECLOK); /* Pull clock high */       \
                    587:        tl_dio_setbit(sc, TL_NETSIO, TL_SIO_ETXEN); /* Enable xmit */   \
                    588:        tl_dio_setbit(sc, TL_NETSIO, TL_SIO_EDATA); /* Toggle DATA to 1 */      \
                    589:        tl_dio_clrbit(sc, TL_NETSIO, TL_SIO_ETXEN); /* Disable xmit. */ \
                    590:        tl_dio_clrbit(sc, TL_NETSIO, TL_SIO_ECLOK); /* Pull clock low again */
                    591:
                    592: /*
                    593:  * Microchip Technology 24Cxx EEPROM control bytes
                    594:  */
                    595: #define EEPROM_CTL_READ                        0xA1    /* 0101 0001 */
                    596: #define EEPROM_CTL_WRITE               0xA0    /* 0101 0000 */
                    597:
                    598: #ifdef __alpha__
                    599: #undef vtophys
                    600: #define vtophys(va)            alpha_XXX_dmamap((vaddr_t)va)
                    601: #endif

CVSweb