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

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

1.1       nbrk        1: /*     $OpenBSD: smc91cxxreg.h,v 1.3 2006/01/23 14:42:55 martin Exp $  */
                      2: /*     $NetBSD: smc91cxxreg.h,v 1.2 1997/09/02 00:10:58 thorpej Exp $  */
                      3:
                      4: /*
                      5:  * Copyright (c) 1996 Gardner Buchanan <gbuchanan@shl.com>
                      6:  * All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. All advertising materials mentioning features or use of this software
                     17:  *    must display the following acknowledgement:
                     18:  *      This product includes software developed by Gardner Buchanan.
                     19:  * 4. The name of Gardner Buchanan may not be used to endorse or promote
                     20:  *    products derived from this software without specific prior written
                     21:  *    permission.
                     22:  *
                     23:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     24:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     25:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     26:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     27:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     28:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     29:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     30:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     31:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     32:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     33:  *
                     34:  *   from FreeBSD Id: if_snreg.h,v 1.4 1996/03/18 15:47:30 gardner Exp
                     35:  */
                     36:
                     37: /*
                     38:  * This file contains register information and access macros for
                     39:  * the SMC91xxx chipset.
                     40:  *
                     41:  * Information contained in this file was obtained from the SMC91C92
                     42:  * and SMC91C94 manuals from SMC.  You will need one of these in order
                     43:  * to make any meaningful changes to this driver.  Information about
                     44:  * obtaining one can be found at http://www.smc.com in the components
                     45:  * division.
                     46:  *
                     47:  * This FreeBSD driver is derived in part from the smc9194 Linux driver
                     48:  * by Erik Stahlman.
                     49:  */
                     50:
                     51:
                     52: /*
                     53:  * Wait time for memory to be free.  This probably shouldn't be
                     54:  * tuned that much, as waiting for this means nothing else happens
                     55:  * in the system
                     56:  */
                     57: #define        MEMORY_WAIT_TIME        1000
                     58:
                     59:
                     60: /* The SMC91xxx uses 16 I/O ports */
                     61: #define        SMC_IOSIZE              16
                     62:
                     63:
                     64: /*
                     65:  * A description of the SMC registers is probably in order here,
                     66:  * although for details, the SMC datasheet is invaluable.
                     67:  * The data sheet I (GB) am using is "SMC91C92 Single Chip Ethernet
                     68:  * Controller With RAM", Rev. 12/0/94.  Constant definitions I give
                     69:  * here are loosely based on the mnemonic names given to them in the
                     70:  * data sheet, but there are many exceptions.
                     71:  *
                     72:  * Basically, the chip has 4 banks of registers (0 to 3), which
                     73:  * are accessed by writing a number into the BANK_SELECT register
                     74:  * (I also use a SMC_SELECT_BANK macro for this).  Registers are
                     75:  * either Byte or Word sized.  My constant definitions end in _B
                     76:  * or _W as appropriate.
                     77:  *
                     78:  * The banks are arranged so that for most purposes, bank 2 is all
                     79:  * that is needed for normal run time tasks.
                     80:  */
                     81:
                     82:
                     83: /*
                     84:  * Bank Select Register.  This also doubles as
                     85:  * a chip identification register.  This register
                     86:  * is mapped at the same position in all banks.
                     87:  */
                     88: #define        BANK_SELECT_REG_W       0x0e
                     89: #define        BSR_DETECT_MASK         0xff00
                     90: #define        BSR_DETECT_VALUE        0x3300
                     91:
                     92:
                     93: /*
                     94:  * BANK 0
                     95:  */
                     96:
                     97: /*
                     98:  * Transmit Control Register controls some aspects of the transmit
                     99:  * behavior of the Ethernet Protocol Handler.
                    100:  */
                    101: #define        TXMIT_CONTROL_REG_W     0x00
                    102:
                    103: #define        TCR_ENABLE      0x0001  /* if this is 1, we can transmit */
                    104: #define        TCR_LOOP        0x0002  /* Enable internal analogue loopback */
                    105: #define        TCR_FORCOL      0x0004  /* Force Collision on next TX */
                    106: #define        TCR_PAD_ENABLE  0x0080  /* Pad short packets to 64 bytes */
                    107: #define        TCR_NOCRC       0x0100  /* Do not append CRC */
                    108: #define        TCR_MON_CSN     0x0400  /* monitors the carrier status */
                    109: #define        TCR_FDUPLX      0x0800  /* receive packets sent out */
                    110: #define        TCR_STP_SQET    0x1000  /* stop transmitting if Signal quality error */
                    111: #define        TCR_EPH_LOOP    0x2000  /* Enable internal digital loopback */
                    112: #define        TCR_SWFDUP      0x8000  /* FEAST: Switched full-duplex (only w/ MII) */
                    113:
                    114:
                    115: /*
                    116:  * Status of the last transmitted frame and instantaneous status of
                    117:  * the Ethernet Protocol Handler jumbled together.  In auto-release
                    118:  * mode this information is simply discarded after each TX.  This info
                    119:  * is copied to the status word of in-memory packets after transmit
                    120:  * where relevent statuses can be checked.
                    121:  */
                    122: #define        EPH_STATUS_REG_W 0x02
                    123:
                    124: #define        EPHSR_TX_SUC    0x0001  /* Transmit was successful */
                    125: #define        EPHSR_SNGLCOL   0x0002  /* Single collision occurred */
                    126: #define        EPHSR_MULCOL    0x0004  /* Multiple Collisions occurred */
                    127: #define        EPHSR_LTX_MULT  0x0008  /* Transmit was a multicast */
                    128: #define        EPHSR_16COL     0x0010  /* 16 Collisions occurred, TX disabled */
                    129: #define        EPHSR_SQET      0x0020  /* SQE Test failed, TX disabled */
                    130: #define        EPHSR_LTX_BRD   0x0040  /* Transmit was a broadcast */
                    131: #define        EPHSR_DEFR      0x0080  /* TX deferred due to carrier det. */
                    132: #define        EPHSR_LATCOL    0x0200  /* Late collision detected, TX disabled */
                    133: #define        EPHSR_LOST_CAR  0x0400  /* Lost carrier sense, TX disabled */
                    134: #define        EPHSR_EXC_DEF   0x0800  /* Excessive deferrals in TX >2 MAXETHER
                    135:                                 * times */
                    136: #define        EPHSR_CTR_ROL   0x1000  /* Some ECR Counter(s) rolled over */
                    137: #define        EPHSR_RX_OVRN   0x2000  /* Receiver overrun, packets dropped */
                    138: #define        EPHSR_LINK_OK   0x4000  /* Link integrity is OK */
                    139: #define        EPHSR_TXUNRN    0x8000  /* Transmit underrun */
                    140:
                    141:
                    142: /*
                    143:  * Receiver Control Register controls some aspects of the receive
                    144:  * behavior of the Ethernet Protocol Handler.
                    145:  */
                    146: #define        RECV_CONTROL_REG_W 0x04
                    147:
                    148: #define        RCR_RX_ABORT    0x0001  /* Received huge packet */
                    149: #define        RCR_PROMISC     0x0002  /* enable promiscuous mode */
                    150: #define        RCR_ALMUL       0x0004  /* receive all multicast packets */
                    151: #define        RCR_ENABLE      0x0100  /* IFF this is set, we can receive packets */
                    152: #define        RCR_STRIP_CRC   0x0200  /* strips CRC */
                    153: #define        RCR_GAIN_BITS   0x0c00  /* PLL Gain control (for testing) */
                    154: #define        RCR_FILT_CAR    0x4000  /* Enable 12 bit carrier filter */
                    155: #define        RCR_SOFTRESET   0x8000  /* Resets the EPH logic */
                    156:
                    157:
                    158: /*
                    159:  * TX Statistics counters
                    160:  */
                    161: #define        COUNTER_REG_W   0x06
                    162:
                    163: #define        ECR_COLN_MASK   0x000f  /* Vanilla collisions */
                    164: #define        ECR_MCOLN_MASK  0x00f0  /* Multiple collisions */
                    165: #define        ECR_DTX_MASK    0x0f00  /* Deferred transmits */
                    166: #define        ECR_EXDTX_MASK  0xf000  /* Excessively deferred transmits */
                    167:
                    168:
                    169: /*
                    170:  * Memory Information
                    171:  */
                    172: #define        MEM_INFO_REG_W  0x08
                    173:
                    174: #define        MIR_FREE_MASK   0xff00  /* Free memory pages available */
                    175: #define        MIR_TOTAL_MASK  0x00ff  /* Total memory pages available */
                    176:
                    177:
                    178: /*
                    179:  * Memory Configuration
                    180:  */
                    181: #define        MEM_CFG_REG_W   0x0a
                    182:
                    183: #define MCR_MEM_MULT(x) (((x)>>9)&7)   /* Memory size multiplier */
                    184: #define        MCR_TXRSV_MASK  0x001f  /* Count of pages reserved for transmit */
                    185:
                    186:
                    187: /*
                    188:  * Bank 0, Register 0x0c is unused in the SMC91C92
                    189:  */
                    190:
                    191:
                    192: /*
                    193:  * BANK 1
                    194:  */
                    195:
                    196: /*
                    197:  * Adapter configuration
                    198:  */
                    199: #define        CONFIG_REG_W    0x00
                    200:
                    201: #define        CR_INT_SEL0     0x0002  /* Interrupt selector */
                    202: #define        CR_INT_SEL1     0x0004  /* Interrupt selector */
                    203: #define        CR_DIS_LINK     0x0040  /* Disable 10BaseT Link Test */
                    204: #define        CR_16BIT        0x0080  /* Bus width */
                    205: #define        CR_AUI_SELECT   0x0100  /* Use external (AUI) Transceiver */
                    206: #define        CR_SET_SQLCH    0x0200  /* Squelch level */
                    207: #define        CR_FULL_STEP    0x0400  /* AUI signalling mode */
                    208: #define        CR_NOW_WAIT_ST  0x1000  /* Disable bus wait states */
                    209: #define CR_MII_SELECT  0x8000  /* FEAST: MII port selected */
                    210:
                    211:
                    212: /*
                    213:  * The contents of this port are used by the adapter
                    214:  * to decode its I/O address.  We use it as a varification
                    215:  * that the adapter is detected properly when probing.
                    216:  */
                    217: #define        BASE_ADDR_REG_W 0x02    /* The selected I/O Base addr. */
                    218:
                    219:
                    220: /*
                    221:  * These registers hold the Ethernet MAC address.
                    222:  */
                    223: #define        IAR_ADDR0_REG_W 0x04    /* My Ethernet address */
                    224: #define        IAR_ADDR1_REG_W 0x06    /* My Ethernet address */
                    225: #define        IAR_ADDR2_REG_W 0x08    /* My Ethernet address */
                    226:
                    227:
                    228: /*
                    229:  * General purpose register used for talking to the EEPROM.
                    230:  */
                    231: #define        GENERAL_REG_W   0x0a
                    232:
                    233:
                    234: /*
                    235:  * Control register used for talking to the EEPROM and
                    236:  * setting some EPH functions.
                    237:  */
                    238: #define        CONTROL_REG_W   0x0c
                    239:
                    240: #define        CTR_STORE        0x0001 /* Store something to EEPROM */
                    241: #define        CTR_RELOAD       0x0002 /* Read EEPROM into registers */
                    242: #define        CTR_EEPROM_SEL   0x0004 /* Select registers for Reload/Store */
                    243: #define        CTR_TE_ENABLE    0x0020 /* Enable TX Error detection via EPH_INT */
                    244: #define        CTR_CR_ENABLE    0x0040 /* Enable Counter Rollover via EPH_INT */
                    245: #define        CTR_LE_ENABLE    0x0080 /* Enable Link Error detection via EPH_INT */
                    246: #define        CTR_AUTO_RELEASE 0x0800 /* Enable auto release mode for TX */
                    247: #define        CTR_POWERDOWN    0x2000 /* Enter powerdown mode */
                    248: #define        CTR_RCV_BAD      0x4000 /* Enable receipt of frames with bad CRC */
                    249:
                    250:
                    251: /*
                    252:  * BANK 2
                    253:  */
                    254:
                    255:
                    256: /*
                    257:  * Memory Management Unit Control Register
                    258:  * Controls allocation of memory to receive and
                    259:  * transmit functions.
                    260:  */
                    261: #define        MMU_CMD_REG_W   0x00
                    262:
                    263: #define        MMUCR_BUSY      0x0001  /* MMU busy performing a release */
                    264:
                    265: /*
                    266:  * MMU Commands:
                    267:  */
                    268: #define        MMUCR_NOP       0x0000  /* Do nothing */
                    269: #define        MMUCR_ALLOC     0x0020  /* Or with number of 256 byte packets - 1 */
                    270: #define        MMUCR_RESET     0x0040  /* Reset MMU State */
                    271: #define        MMUCR_REMOVE    0x0060  /* Dequeue (but not free) current RX packet */
                    272: #define        MMUCR_RELEASE   0x0080  /* Dequeue and free the current RX packet */
                    273: #define        MMUCR_FREEPKT   0x00a0  /* Release packet in PNR register */
                    274: #define        MMUCR_ENQUEUE   0x00c0  /* Enqueue the packet for transmit */
                    275: #define        MMUCR_RESETTX   0x00e0  /* Reset transmit queues */
                    276:
                    277: /*
                    278:  * Packet Number at TX Area
                    279:  */
                    280: #define        PACKET_NUM_REG_B 0x02
                    281:
                    282: /*
                    283:  * Packet number resulting from MMUCR_ALLOC
                    284:  */
                    285: #define        ALLOC_RESULT_REG_B 0x03
                    286: #define        ARR_FAILED      0x80
                    287:
                    288: /*
                    289:  * Transmit and receive queue heads
                    290:  */
                    291: #define        FIFO_PORTS_REG_W 0x04
                    292: #define        FIFO_REMPTY     0x8000
                    293: #define        FIFO_TEMPTY     0x0080
                    294: #define        FIFO_RX_MASK    0x7f00
                    295: #define        FIFO_TX_MASK    0x007f
                    296:
                    297:
                    298: /*
                    299:  * The address within the packet for reading/writing.  The
                    300:  * PTR_RCV bit is tricky.  When PTR_RCV==1, the packet number
                    301:  * to be read is found in the FIFO_PORTS_REG_W, FIFO_RX_MASK.
                    302:  * When PTR_RCV==0, the packet number to be written is found
                    303:  * in the PACKET_NUM_REG_B.
                    304:  */
                    305: #define        POINTER_REG_W   0x06
                    306:
                    307: #define        PTR_READ        0x2000  /* Intended access mode */
                    308: #define        PTR_AUTOINC     0x4000  /* Do auto inc after read/write */
                    309: #define        PTR_RCV         0x8000  /* FIFO_RX is packet, otherwise PNR is packet */
                    310:
                    311: /*
                    312:  * Data I/O register to be used in conjunction with
                    313:  * The pointer register to read and write data from the
                    314:  * card.  The same register can be used for byte and word
                    315:  * ops.
                    316:  */
                    317: #define        DATA_REG_W      0x08
                    318: #define        DATA_REG_B      0x08
                    319: #define        DATA_1_REG_B    0x08
                    320: #define        DATA_2_REG_B    0x0a
                    321:
                    322:
                    323: /*
                    324:  * Sense interrupt status (READ)
                    325:  */
                    326: #define        INTR_STAT_REG_B 0x0c
                    327:
                    328:
                    329: /*
                    330:  * Acknowledge interrupt sources (WRITE)
                    331:  */
                    332: #define        INTR_ACK_REG_B  0x0c
                    333:
                    334:
                    335: /*
                    336:  * Interrupt mask.  Bit set indicates interrupt allowed.
                    337:  */
                    338: #define        INTR_MASK_REG_B 0x0d
                    339:
                    340: /*
                    341:  * Interrupts
                    342:  */
                    343: #define        IM_RCV_INT      0x01    /* A packet has been received */
                    344: #define        IM_TX_INT       0x02    /* Packet TX complete */
                    345: #define        IM_TX_EMPTY_INT 0x04    /* No packets left to TX  */
                    346: #define        IM_ALLOC_INT    0x08    /* Memory allocation completed */
                    347: #define        IM_RX_OVRN_INT  0x10    /* Receiver was overrun */
                    348: #define        IM_EPH_INT      0x20    /* Misc. EPH conditions (see CONTROL_REG_W) */
                    349: #define        IM_ERCV_INT     0x40    /* not on SMC9192 */
                    350:
                    351:
                    352: /*
                    353:  * BANK 3
                    354:  */
                    355:
                    356:
                    357: /*
                    358:  * Multicast subscriptions.
                    359:  * The multicast handling in the SMC90Cxx is quite complicated.  A table
                    360:  * of multicast address subscriptions is provided and a clever way of
                    361:  * speeding the search of that table by hashing is implemented in the
                    362:  * hardware.  I have ignored this and simply subscribed to all multicasts
                    363:  * and let the kernel deal with the results.
                    364:  */
                    365: #define        MULTICAST1_REG_W 0x00
                    366: #define        MULTICAST2_REG_W 0x02
                    367: #define        MULTICAST3_REG_W 0x04
                    368: #define        MULTICAST4_REG_W 0x06
                    369:
                    370: /*
                    371:  * These registers do not exist on SMC9192, or at least
                    372:  * are not documented in the SMC91C92 data sheet.
                    373:  *
                    374:  * The REVISION_REG_W register does however seem to work.
                    375:  *
                    376:  * On the FEAST, the low nibble controls the MII interface.
                    377:  */
                    378: #define        MGMT_REG_W      0x08
                    379:
                    380: #define MR_MDOE                0x08
                    381: #define MR_MCLK                0x04
                    382: #define MR_MDI         0x02
                    383: #define MR_MDO         0x01
                    384:
                    385: #define        REVISION_REG_W  0x0a    /* (hi: chip id low: rev #) */
                    386: #define        RR_REV(x)       ((x) & 0x0f)
                    387: #define        RR_ID(x)        (((x) >> 4) & 0x0f)
                    388:
                    389: #define        ERCV_REG_W      0x0c
                    390:
                    391: /*
                    392:  * These are constants expected to be found in the
                    393:  * chip id register.
                    394:  */
                    395: #define        CHIP_9190       3
                    396: #define        CHIP_9194       4
                    397: #define        CHIP_9195       5
                    398: #define        CHIP_91100      7
                    399: #define        CHIP_91100FD    8
                    400:
                    401:
                    402: /*
                    403:  * When packets are stuffed into the card or sucked out of the card
                    404:  * they are set up more or less as follows:
                    405:  *
                    406:  * Addr msbyte   lsbyte
                    407:  * 00   SSSSSSSS SSSSSSSS - STATUS-WORD 16 bit TX or RX status
                    408:  * 02   RRRRR             - RESERVED (unused)
                    409:  * 02        CCC CCCCCCCC - BYTE COUNT (RX: always even, TX: bit 0 ignored)
                    410:  * 04   DDDDDDDD DDDDDDDD - DESTINATION ADDRESS
                    411:  * 06   DDDDDDDD DDDDDDDD        (48 bit Ethernet MAC Address)
                    412:  * 08   DDDDDDDD DDDDDDDD
                    413:  * 0A   SSSSSSSS SSSSSSSS - SOURCE ADDRESS
                    414:  * 0C   SSSSSSSS SSSSSSSS        (48 bit Ethernet MAC Address)
                    415:  * 0E   SSSSSSSS SSSSSSSS
                    416:  * 10   PPPPPPPP PPPPPPPP
                    417:  * ..   PPPPPPPP PPPPPPPP
                    418:  * C-2  CCCCCCCC          - CONTROL BYTE
                    419:  * C-2           PPPPPPPP - Last data byte (If odd length)
                    420:  *
                    421:  * The STATUS_WORD is derived from the EPH_STATUS_REG_W register
                    422:  * during transmit and is composed of another set of bits described
                    423:  * below during receive.
                    424:  */
                    425:
                    426:
                    427: /*
                    428:  * Receive status bits.  These values are found in the status word
                    429:  * field of a received packet.  For receive packets I use the RS_ODDFRAME
                    430:  * to detect whether a frame has an extra byte on it.  The CTLB_ODD
                    431:  * bit of the control byte tells the same thing.
                    432:  */
                    433: #define        RS_MULTICAST    0x0001  /* Packet is multicast */
                    434: #define        RS_HASH_MASK    0x007e  /* Mask of multicast hash value */
                    435: #define        RS_TOOSHORT     0x0400  /* Frame was a runt, <64 bytes */
                    436: #define        RS_TOOLONG      0x0800  /* Frame was giant, >1518 */
                    437: #define        RS_ODDFRAME     0x1000  /* Frame is odd lengthed */
                    438: #define        RS_BADCRC       0x2000  /* Frame had CRC error */
                    439: #define        RS_ALGNERR      0x8000  /* Frame had alignment error */
                    440: #define        RS_ERRORS       (RS_ALGNERR | RS_BADCRC | RS_TOOLONG | RS_TOOSHORT)
                    441:
                    442: #define        RLEN_MASK       0x07ff  /* Significant length bits in RX length */
                    443:
                    444: /*
                    445:  * The control byte has the following significant bits.
                    446:  * For transmit, the CTLB_ODD bit specifies whether an extra byte
                    447:  * is present in the frame.  Bit 0 of the byte count field is
                    448:  * ignored.  I just pad every frame to even length and forget about
                    449:  * it.
                    450:  */
                    451: #define        CTLB_CRC        0x10    /* Add CRC for this packet (TX only) */
                    452: #define        CTLB_ODD        0x20    /* The packet length is ODD */

CVSweb