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

Annotation of sys/dev/ic/xlreg.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: xlreg.h,v 1.19 2004/05/30 23:49:39 brad 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: if_xlreg.h,v 1.26 2000/08/28 20:40:03 wpaul Exp $
        !            35:  */
        !            36:
        !            37: #define XL_EE_READ     0x0080  /* read, 5 bit address */
        !            38: #define XL_EE_8BIT_READ        0x0200  /* read, 8 bit address */
        !            39: #define XL_EE_WRITE    0x0040  /* write, 5 bit address */
        !            40: #define XL_EE_ERASE    0x00c0  /* erase, 5 bit address */
        !            41: #define XL_EE_EWEN     0x0030  /* erase, no data needed */
        !            42: #define XL_EE_BUSY     0x8000
        !            43:
        !            44: #define XL_EE_EADDR0   0x00    /* station address, first word */
        !            45: #define XL_EE_EADDR1   0x01    /* station address, next word, */
        !            46: #define XL_EE_EADDR2   0x02    /* station address, last word */
        !            47: #define XL_EE_PRODID   0x03    /* product ID code */
        !            48: #define XL_EE_MDATA_DATE       0x04    /* manufacturing data, date */
        !            49: #define XL_EE_MDATA_DIV                0x05    /* manufacturing data, division */
        !            50: #define XL_EE_MDATA_PCODE      0x06    /* manufacturing data, product code */
        !            51: #define XL_EE_MFG_ID   0x07
        !            52: #define XL_EE_PCI_PARM 0x08
        !            53: #define XL_EE_ROM_ONFO 0x09
        !            54: #define XL_EE_OEM_ADR0 0x0A
        !            55: #define        XL_EE_OEM_ADR1  0x0B
        !            56: #define XL_EE_OEM_ADR2 0x0C
        !            57: #define XL_EE_SOFTINFO1        0x0D
        !            58: #define XL_EE_COMPAT   0x0E
        !            59: #define XL_EE_SOFTINFO2        0x0F
        !            60: #define XL_EE_CAPS     0x10    /* capabilities word */
        !            61: #define XL_EE_RSVD0    0x11
        !            62: #define XL_EE_ICFG_0   0x12
        !            63: #define XL_EE_ICFG_1   0x13
        !            64: #define XL_EE_RSVD1    0x14
        !            65: #define XL_EE_SOFTINFO3        0x15
        !            66: #define XL_EE_RSVD_2   0x16
        !            67:
        !            68: /*
        !            69:  * Bits in the capabilities word
        !            70:  */
        !            71: #define XL_CAPS_PNP            0x0001
        !            72: #define XL_CAPS_FULL_DUPLEX    0x0002
        !            73: #define XL_CAPS_LARGE_PKTS     0x0004
        !            74: #define XL_CAPS_SLAVE_DMA      0x0008
        !            75: #define XL_CAPS_SECOND_DMA     0x0010
        !            76: #define XL_CAPS_FULL_BM                0x0020
        !            77: #define XL_CAPS_FRAG_BM                0x0040
        !            78: #define XL_CAPS_CRC_PASSTHRU   0x0080
        !            79: #define XL_CAPS_TXDONE         0x0100
        !            80: #define XL_CAPS_NO_TXLENGTH    0x0200
        !            81: #define XL_CAPS_RX_REPEAT      0x0400
        !            82: #define XL_CAPS_SNOOPING       0x0800
        !            83: #define XL_CAPS_100MBPS                0x1000
        !            84: #define XL_CAPS_PWRMGMT                0x2000
        !            85:
        !            86: #define XL_PACKET_SIZE 1540
        !            87:
        !            88: #define XL_MAX_FRAMELEN        (ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN)
        !            89:
        !            90: /*
        !            91:  * Register layouts.
        !            92:  */
        !            93: #define XL_COMMAND             0x0E
        !            94: #define XL_STATUS              0x0E
        !            95:
        !            96: #define XL_TX_STATUS           0x1B
        !            97: #define XL_TX_FREE             0x1C
        !            98: #define XL_DMACTL              0x20
        !            99: #define XL_DOWNLIST_PTR                0x24
        !           100: #define XL_DOWN_POLL           0x2D    /* 3c90xB only */
        !           101: #define XL_TX_FREETHRESH       0x2F
        !           102: #define XL_UPLIST_PTR          0x38
        !           103: #define XL_UPLIST_STATUS       0x30
        !           104: #define XL_UP_POLL             0x3D    /* 3c90xB only */
        !           105:
        !           106: #define XL_PKTSTAT_UP_STALLED          0x00002000
        !           107: #define XL_PKTSTAT_UP_ERROR            0x00004000
        !           108: #define XL_PKTSTAT_UP_CMPLT            0x00008000
        !           109:
        !           110: #define XL_DMACTL_DN_CMPLT_REQ         0x00000002
        !           111: #define XL_DMACTL_DOWN_STALLED         0x00000004
        !           112: #define XL_DMACTL_UP_CMPLT             0x00000008
        !           113: #define XL_DMACTL_DOWN_CMPLT           0x00000010
        !           114: #define XL_DMACTL_UP_RX_EARLY          0x00000020
        !           115: #define XL_DMACTL_ARM_COUNTDOWN                0x00000040
        !           116: #define XL_DMACTL_DOWN_INPROG          0x00000080
        !           117: #define XL_DMACTL_COUNTER_SPEED                0x00000100
        !           118: #define XL_DMACTL_DOWNDOWN_MODE                0x00000200
        !           119: #define XL_DMACTL_TARGET_ABORT         0x40000000
        !           120: #define XL_DMACTL_MASTER_ABORT         0x80000000
        !           121:
        !           122: /*
        !           123:  * Command codes. Some command codes require that we wait for
        !           124:  * the CMD_BUSY flag to clear. Those codes are marked as 'mustwait.'
        !           125:  */
        !           126: #define XL_CMD_RESET           0x0000  /* mustwait */
        !           127: #define XL_CMD_WINSEL          0x0800
        !           128: #define XL_CMD_COAX_START      0x1000
        !           129: #define XL_CMD_RX_DISABLE      0x1800
        !           130: #define XL_CMD_RX_ENABLE       0x2000
        !           131: #define XL_CMD_RX_RESET                0x2800  /* mustwait */
        !           132: #define XL_CMD_UP_STALL                0x3000  /* mustwait */
        !           133: #define XL_CMD_UP_UNSTALL      0x3001
        !           134: #define XL_CMD_DOWN_STALL      0x3002  /* mustwait */
        !           135: #define XL_CMD_DOWN_UNSTALL    0x3003
        !           136: #define XL_CMD_RX_DISCARD      0x4000
        !           137: #define XL_CMD_TX_ENABLE       0x4800
        !           138: #define XL_CMD_TX_DISABLE      0x5000
        !           139: #define XL_CMD_TX_RESET                0x5800  /* mustwait */
        !           140: #define XL_CMD_INTR_FAKE       0x6000
        !           141: #define XL_CMD_INTR_ACK                0x6800
        !           142: #define XL_CMD_INTR_ENB                0x7000
        !           143: #define XL_CMD_STAT_ENB                0x7800
        !           144: #define XL_CMD_RX_SET_FILT     0x8000
        !           145: #define XL_CMD_RX_SET_THRESH   0x8800
        !           146: #define XL_CMD_TX_SET_THRESH   0x9000
        !           147: #define XL_CMD_TX_SET_START    0x9800
        !           148: #define XL_CMD_DMA_UP          0xA000
        !           149: #define XL_CMD_DMA_STOP                0xA001
        !           150: #define XL_CMD_STATS_ENABLE    0xA800
        !           151: #define XL_CMD_STATS_DISABLE   0xB000
        !           152: #define XL_CMD_COAX_STOP       0xB800
        !           153:
        !           154: #define XL_CMD_SET_TX_RECLAIM  0xC000 /* 3c905B only */
        !           155: #define XL_CMD_RX_SET_HASH     0xC800 /* 3c905B only */
        !           156:
        !           157: #define XL_HASH_SET            0x0400
        !           158: #define XL_HASHFILT_SIZE       256
        !           159:
        !           160: /*
        !           161:  * status codes
        !           162:  * Note that bits 15 to 13 indicate the currently visible register window
        !           163:  * which may be anything from 0 to 7.
        !           164:  */
        !           165: #define XL_STAT_INTLATCH       0x0001  /* 0 */
        !           166: #define XL_STAT_ADFAIL         0x0002  /* 1 */
        !           167: #define XL_STAT_TX_COMPLETE    0x0004  /* 2 */
        !           168: #define XL_STAT_TX_AVAIL       0x0008  /* 3 first generation */
        !           169: #define XL_STAT_RX_COMPLETE    0x0010  /* 4 */
        !           170: #define XL_STAT_RX_EARLY       0x0020  /* 5 */
        !           171: #define XL_STAT_INTREQ         0x0040  /* 6 */
        !           172: #define XL_STAT_STATSOFLOW     0x0080  /* 7 */
        !           173: #define XL_STAT_DMADONE                0x0100  /* 8 first generation */
        !           174: #define XL_STAT_LINKSTAT       0x0100  /* 8 3c509B */
        !           175: #define XL_STAT_DOWN_COMPLETE  0x0200  /* 9 */
        !           176: #define XL_STAT_UP_COMPLETE    0x0400  /* 10 */
        !           177: #define XL_STAT_DMABUSY                0x0800  /* 11 first generation */
        !           178: #define XL_STAT_CMDBUSY                0x1000  /* 12 */
        !           179:
        !           180: /*
        !           181:  * Interrupts we normally want enabled.
        !           182:  */
        !           183: #define XL_INTRS                                                       \
        !           184:        (XL_STAT_UP_COMPLETE|XL_STAT_STATSOFLOW|XL_STAT_ADFAIL|         \
        !           185:         XL_STAT_DOWN_COMPLETE|XL_STAT_TX_COMPLETE|XL_STAT_INTLATCH)
        !           186:
        !           187: /*
        !           188:  * Window 0 registers
        !           189:  */
        !           190: #define XL_W0_EE_DATA          0x0C
        !           191: #define XL_W0_EE_CMD           0x0A
        !           192: #define XL_W0_RSRC_CFG         0x08
        !           193: #define XL_W0_ADDR_CFG         0x06
        !           194: #define XL_W0_CFG_CTRL         0x04
        !           195:
        !           196: #define XL_W0_PROD_ID          0x02
        !           197: #define XL_W0_MFG_ID           0x00
        !           198:
        !           199: /*
        !           200:  * Window 1
        !           201:  */
        !           202:
        !           203: #define XL_W1_TX_FIFO          0x10
        !           204:
        !           205: #define XL_W1_FREE_TX          0x0C
        !           206: #define XL_W1_TX_STATUS                0x0B
        !           207: #define XL_W1_TX_TIMER         0x0A
        !           208: #define XL_W1_RX_STATUS                0x08
        !           209: #define XL_W1_RX_FIFO          0x00
        !           210:
        !           211: /*
        !           212:  * RX status codes
        !           213:  */
        !           214: #define XL_RXSTATUS_OVERRUN    0x01
        !           215: #define XL_RXSTATUS_RUNT       0x02
        !           216: #define XL_RXSTATUS_ALIGN      0x04
        !           217: #define XL_RXSTATUS_CRC                0x08
        !           218: #define XL_RXSTATUS_OVERSIZE   0x10
        !           219: #define XL_RXSTATUS_DRIBBLE    0x20
        !           220:
        !           221: /*
        !           222:  * TX status codes
        !           223:  */
        !           224: #define XL_TXSTATUS_RECLAIM    0x02 /* 3c905B only */
        !           225: #define XL_TXSTATUS_OVERFLOW   0x04
        !           226: #define XL_TXSTATUS_MAXCOLS    0x08
        !           227: #define XL_TXSTATUS_UNDERRUN   0x10
        !           228: #define XL_TXSTATUS_JABBER     0x20
        !           229: #define XL_TXSTATUS_INTREQ     0x40
        !           230: #define XL_TXSTATUS_COMPLETE   0x80
        !           231:
        !           232: /*
        !           233:  * Window 2
        !           234:  */
        !           235: #define XL_W2_RESET_OPTIONS    0x0C    /* 3c905B only */
        !           236: #define XL_W2_STATION_MASK_HI  0x0A
        !           237: #define XL_W2_STATION_MASK_MID 0x08
        !           238: #define XL_W2_STATION_MASK_LO  0x06
        !           239: #define XL_W2_STATION_ADDR_HI  0x04
        !           240: #define XL_W2_STATION_ADDR_MID 0x02
        !           241: #define XL_W2_STATION_ADDR_LO  0x00
        !           242:
        !           243: #define XL_RESETOPT_FEATUREMASK        0x0001|0x0002|0x004
        !           244: #define XL_RESETOPT_D3RESETDIS 0x0008
        !           245: #define XL_RESETOPT_DISADVFD   0x0010
        !           246: #define XL_RESETOPT_DISADV100  0x0020
        !           247: #define XL_RESETOPT_DISAUTONEG 0x0040
        !           248: #define XL_RESETOPT_DEBUGMODE  0x0080
        !           249: #define XL_RESETOPT_FASTAUTO   0x0100
        !           250: #define XL_RESETOPT_FASTEE     0x0200
        !           251: #define XL_RESETOPT_FORCEDCONF 0x0400
        !           252: #define XL_RESETOPT_TESTPDTPDR 0x0800
        !           253: #define XL_RESETOPT_TEST100TX  0x1000
        !           254: #define XL_RESETOPT_TEST100RX  0x2000
        !           255:
        !           256: #define XL_RESETOPT_INVERT_LED 0x0010
        !           257: #define XL_RESETOPT_INVERT_MII 0x4000
        !           258:
        !           259: /*
        !           260:  * Window 3 (fifo management)
        !           261:  */
        !           262: #define XL_W3_INTERNAL_CFG     0x00
        !           263: #define XL_W3_MAXPKTSIZE       0x04            /* 3C905B only */
        !           264: #define XL_W3_RESET_OPT                0x08
        !           265: #define XL_W3_FREE_TX          0x0C
        !           266: #define XL_W3_FREE_RX          0x0A
        !           267: #define XL_W3_MAC_CTRL         0x06
        !           268:
        !           269: #define XL_ICFG_CONNECTOR_MASK 0x00F00000
        !           270: #define XL_ICFG_CONNECTOR_BITS 20
        !           271:
        !           272: #define XL_ICFG_RAMSIZE_MASK   0x00000007
        !           273: #define XL_ICFG_RAMWIDTH       0x00000008
        !           274: #define XL_ICFG_ROMSIZE_MASK   (0x00000040|0x00000080)
        !           275: #define XL_ICFG_DISABLE_BASSD  0x00000100
        !           276: #define XL_ICFG_RAMLOC         0x00000200
        !           277: #define XL_ICFG_RAMPART                (0x00010000|0x00020000)
        !           278: #define XL_ICFG_XCVRSEL                (0x00100000|0x00200000|0x00400000)
        !           279: #define XL_ICFG_AUTOSEL                0x01000000
        !           280:
        !           281: #define XL_XCVR_10BT           0x00
        !           282: #define XL_XCVR_AUI            0x01
        !           283: #define XL_XCVR_RSVD_0         0x02
        !           284: #define XL_XCVR_COAX           0x03
        !           285: #define XL_XCVR_100BTX         0x04
        !           286: #define XL_XCVR_100BFX         0x05
        !           287: #define XL_XCVR_MII            0x06
        !           288: #define XL_XCVR_RSVD_1         0x07
        !           289: #define XL_XCVR_AUTO           0x08    /* 3c905B only */
        !           290: #define XL_XCVR_NWAY           0x09    /* 3CCFE575CT CardBus */
        !           291:
        !           292: #define XL_MACCTRL_DEFER_EXT_END       0x0001
        !           293: #define XL_MACCTRL_DEFER_0             0x0002
        !           294: #define XL_MACCTRL_DEFER_1             0x0004
        !           295: #define XL_MACCTRL_DEFER_2             0x0008
        !           296: #define XL_MACCTRL_DEFER_3             0x0010
        !           297: #define XL_MACCTRL_DUPLEX              0x0020
        !           298: #define XL_MACCTRL_ALLOW_LARGE_PACK    0x0040
        !           299: #define XL_MACCTRL_EXTEND_AFTER_COL    0x0080 (3c905B only)
        !           300: #define XL_MACCTRL_FLOW_CONTROL_ENB    0x0100 (3c905B only)
        !           301: #define XL_MACCTRL_VLT_END             0x0200 (3c905B only)
        !           302:
        !           303: /*
        !           304:  * The 'reset options' register contains power-on reset values
        !           305:  * loaded from the EEPROM. This includes the supported media
        !           306:  * types on the card. It is also known as the media options register.
        !           307:  */
        !           308: #define XL_W3_MEDIA_OPT                0x08
        !           309:
        !           310: #define XL_MEDIAOPT_BT4                0x0001  /* MII */
        !           311: #define XL_MEDIAOPT_BTX                0x0002  /* on-chip */
        !           312: #define XL_MEDIAOPT_BFX                0x0004  /* on-chip */
        !           313: #define XL_MEDIAOPT_BT         0x0008  /* on-chip */
        !           314: #define XL_MEDIAOPT_BNC                0x0010  /* on-chip */
        !           315: #define XL_MEDIAOPT_AUI                0x0020  /* on-chip */
        !           316: #define XL_MEDIAOPT_MII                0x0040  /* MII */
        !           317: #define XL_MEDIAOPT_VCO                0x0100  /* 1st gen chip only */
        !           318:
        !           319: #define XL_MEDIAOPT_10FL       0x0100  /* 3x905B only, on-chip */
        !           320: #define XL_MEDIAOPT_MASK       0x01FF
        !           321:
        !           322: /*
        !           323:  * Window 4 (diagnostics)
        !           324:  */
        !           325: #define XL_W4_UPPERBYTESOK     0x0D
        !           326: #define XL_W4_BADSSD           0x0C
        !           327: #define XL_W4_MEDIA_STATUS     0x0A
        !           328: #define XL_W4_PHY_MGMT         0x08
        !           329: #define XL_W4_NET_DIAG         0x06
        !           330: #define XL_W4_FIFO_DIAG                0x04
        !           331: #define XL_W4_VCO_DIAG         0x02
        !           332:
        !           333: #define XL_W4_CTRLR_STAT       0x08
        !           334: #define XL_W4_TX_DIAG          0x00
        !           335:
        !           336: #define XL_MII_CLK             0x01
        !           337: #define XL_MII_DATA            0x02
        !           338: #define XL_MII_DIR             0x04
        !           339:
        !           340: #define XL_MEDIA_SQE           0x0008
        !           341: #define XL_MEDIA_10TP          0x00C0
        !           342: #define XL_MEDIA_LNK           0x0080
        !           343: #define XL_MEDIA_LNKBEAT       0x0800
        !           344:
        !           345: #define XL_MEDIASTAT_CRCSTRIP  0x0004
        !           346: #define XL_MEDIASTAT_SQEENB    0x0008
        !           347: #define XL_MEDIASTAT_COLDET    0x0010
        !           348: #define XL_MEDIASTAT_CARRIER   0x0020
        !           349: #define XL_MEDIASTAT_JABGUARD  0x0040
        !           350: #define XL_MEDIASTAT_LINKBEAT  0x0080
        !           351: #define XL_MEDIASTAT_JABDETECT 0x0200
        !           352: #define XL_MEDIASTAT_POLREVERS 0x0400
        !           353: #define XL_MEDIASTAT_LINKDETECT        0x0800
        !           354: #define XL_MEDIASTAT_TXINPROG  0x1000
        !           355: #define XL_MEDIASTAT_DCENB     0x4000
        !           356: #define XL_MEDIASTAT_AUIDIS    0x8000
        !           357:
        !           358: #define XL_NETDIAG_TEST_LOWVOLT                0x0001
        !           359: #define XL_NETDIAG_ASIC_REVMASK                (0x0002|0x0004|0x0008|0x0010|0x0020)
        !           360: #define XL_NETDIAG_UPPER_BYTES_ENABLE  0x0040
        !           361: #define XL_NETDIAG_STATS_ENABLED       0x0080
        !           362: #define XL_NETDIAG_TX_FATALERR         0x0100
        !           363: #define XL_NETDIAG_TRANSMITTING                0x0200
        !           364: #define XL_NETDIAG_RX_ENABLED          0x0400
        !           365: #define XL_NETDIAG_TX_ENABLED          0x0800
        !           366: #define XL_NETDIAG_FIFO_LOOPBACK       0x1000
        !           367: #define XL_NETDIAG_MAC_LOOPBACK                0x2000
        !           368: #define XL_NETDIAG_ENDEC_LOOPBACK      0x4000
        !           369: #define XL_NETDIAG_EXTERNAL_LOOP       0x8000
        !           370:
        !           371: /*
        !           372:  * Window 5
        !           373:  */
        !           374: #define XL_W5_STAT_ENB         0x0C
        !           375: #define XL_W5_INTR_ENB         0x0A
        !           376: #define XL_W5_RECLAIM_THRESH   0x09    /* 3c905B only */
        !           377: #define XL_W5_RX_FILTER                0x08
        !           378: #define XL_W5_RX_EARLYTHRESH   0x06
        !           379: #define XL_W5_TX_AVAILTHRESH   0x02
        !           380: #define XL_W5_TX_STARTTHRESH   0x00
        !           381:
        !           382: /*
        !           383:  * RX filter bits
        !           384:  */
        !           385: #define XL_RXFILTER_INDIVIDUAL 0x01
        !           386: #define XL_RXFILTER_ALLMULTI   0x02
        !           387: #define XL_RXFILTER_BROADCAST  0x04
        !           388: #define XL_RXFILTER_ALLFRAMES  0x08
        !           389: #define XL_RXFILTER_MULTIHASH  0x10 /* 3c905B only */
        !           390:
        !           391: /*
        !           392:  * Window 6 (stats)
        !           393:  */
        !           394: #define XL_W6_TX_BYTES_OK      0x0C
        !           395: #define XL_W6_RX_BYTES_OK      0x0A
        !           396: #define XL_W6_UPPER_FRAMES_OK  0x09
        !           397: #define XL_W6_DEFERRED         0x08
        !           398: #define XL_W6_RX_OK            0x07
        !           399: #define XL_W6_TX_OK            0x06
        !           400: #define XL_W6_RX_OVERRUN       0x05
        !           401: #define XL_W6_COL_LATE         0x04
        !           402: #define XL_W6_COL_SINGLE       0x03
        !           403: #define XL_W6_COL_MULTIPLE     0x02
        !           404: #define XL_W6_SQE_ERRORS       0x01
        !           405: #define XL_W6_CARRIER_LOST     0x00
        !           406:
        !           407: /*
        !           408:  * Window 7 (bus master control)
        !           409:  */
        !           410: #define XL_W7_BM_ADDR          0x00
        !           411: #define XL_W7_BM_LEN           0x06
        !           412: #define XL_W7_BM_STATUS                0x0B
        !           413: #define XL_W7_BM_TIMEr         0x0A
        !           414:
        !           415: /*
        !           416:  * bus master control registers
        !           417:  */
        !           418: #define XL_BM_PKTSTAT          0x20
        !           419: #define XL_BM_DOWNLISTPTR      0x24
        !           420: #define XL_BM_FRAGADDR         0x28
        !           421: #define XL_BM_FRAGLEN          0x2C
        !           422: #define XL_BM_TXFREETHRESH     0x2F
        !           423: #define XL_BM_UPPKTSTAT                0x30
        !           424: #define XL_BM_UPLISTPTR                0x38
        !           425:
        !           426: #define XL_LAST_FRAG           0x80000000
        !           427:
        !           428: /*
        !           429:  * Boomerang/Cyclone TX/RX list structure.
        !           430:  * For the TX lists, bits 0 to 12 of the status word indicate
        !           431:  * length.
        !           432:  * This looks suspiciously like the ThunderLAN, doesn't it.
        !           433:  */
        !           434: struct xl_frag {
        !           435:        u_int32_t               xl_addr;        /* 63 addr/len pairs */
        !           436:        u_int32_t               xl_len;
        !           437: };
        !           438:
        !           439: struct xl_list {
        !           440:        u_int32_t               xl_next;        /* final entry has 0 nextptr */
        !           441:        u_int32_t               xl_status;
        !           442:        struct xl_frag          xl_frag[63];
        !           443: };
        !           444:
        !           445: struct xl_list_onefrag {
        !           446:        u_int32_t               xl_next;        /* final entry has 0 nextptr */
        !           447:        u_int32_t               xl_status;
        !           448:        struct xl_frag          xl_frag;
        !           449: };
        !           450:
        !           451: #define XL_MAXFRAGS            63
        !           452: #define XL_RX_LIST_CNT         32
        !           453: #define XL_TX_LIST_CNT         32
        !           454: #define XL_MIN_FRAMELEN                60
        !           455: #define XL_INC(x, y)           (x) = (x + 1) % (y)
        !           456:
        !           457: struct xl_list_data {
        !           458:        struct xl_list_onefrag  xl_rx_list[XL_RX_LIST_CNT];
        !           459:        struct xl_list          xl_tx_list[XL_TX_LIST_CNT];
        !           460:        unsigned char           xl_pad[XL_MIN_FRAMELEN];
        !           461: };
        !           462:
        !           463: struct xl_chain {
        !           464:        struct xl_list          *xl_ptr;
        !           465:        struct mbuf             *xl_mbuf;
        !           466:        struct xl_chain         *xl_next;
        !           467:        struct xl_chain         *xl_prev;
        !           468:        u_int32_t               xl_phys;
        !           469:        bus_dmamap_t            map;
        !           470: };
        !           471:
        !           472: struct xl_chain_onefrag {
        !           473:        struct xl_list_onefrag  *xl_ptr;
        !           474:        struct mbuf             *xl_mbuf;
        !           475:        struct xl_chain_onefrag *xl_next;
        !           476:        bus_dmamap_t            map;
        !           477: };
        !           478:
        !           479: struct xl_chain_data {
        !           480:        struct xl_chain_onefrag xl_rx_chain[XL_RX_LIST_CNT];
        !           481:        struct xl_chain         xl_tx_chain[XL_TX_LIST_CNT];
        !           482:
        !           483:        struct xl_chain_onefrag *xl_rx_head;
        !           484:
        !           485:        /* 3c90x "boomerang" queuing stuff */
        !           486:        struct xl_chain         *xl_tx_head;
        !           487:        struct xl_chain         *xl_tx_tail;
        !           488:        struct xl_chain         *xl_tx_free;
        !           489:
        !           490:        /* 3c90xB "cyclone/hurricane/tornado" stuff */
        !           491:        int                     xl_tx_prod;
        !           492:        int                     xl_tx_cons;
        !           493:        int                     xl_tx_cnt;
        !           494: };
        !           495:
        !           496: #define XL_RXSTAT_LENMASK      0x00001FFF
        !           497: #define XL_RXSTAT_UP_ERROR     0x00004000
        !           498: #define XL_RXSTAT_UP_CMPLT     0x00008000
        !           499: #define XL_RXSTAT_UP_OVERRUN   0x00010000
        !           500: #define XL_RXSTAT_RUNT         0x00020000
        !           501: #define XL_RXSTAT_ALIGN                0x00040000
        !           502: #define XL_RXSTAT_CRC          0x00080000
        !           503: #define XL_RXSTAT_OVERSIZE     0x00100000
        !           504: #define XL_RXSTAT_DRIBBLE      0x00800000
        !           505: #define XL_RXSTAT_UP_OFLOW     0x01000000
        !           506: #define XL_RXSTAT_IPCKERR      0x02000000      /* 3c905B only */
        !           507: #define XL_RXSTAT_TCPCKERR     0x04000000      /* 3c905B only */
        !           508: #define XL_RXSTAT_UDPCKERR     0x08000000      /* 3c905B only */
        !           509: #define XL_RXSTAT_BUFEN                0x10000000      /* 3c905B only */
        !           510: #define XL_RXSTAT_IPCKOK       0x20000000      /* 3c905B only */
        !           511: #define XL_RXSTAT_TCPCKOK      0x40000000      /* 3c905B only */
        !           512: #define XL_RXSTAT_UDPCKOK      0x80000000      /* 3c905B only */
        !           513:
        !           514: #define XL_TXSTAT_LENMASK      0x00001FFF
        !           515: #define XL_TXSTAT_CRCDIS       0x00002000
        !           516: #define XL_TXSTAT_TX_INTR      0x00008000
        !           517: #define XL_TXSTAT_DL_COMPLETE  0x00010000
        !           518: #define XL_TXSTAT_IPCKSUM      0x02000000      /* 3c905B only */
        !           519: #define XL_TXSTAT_TCPCKSUM     0x04000000      /* 3c905B only */
        !           520: #define XL_TXSTAT_UDPCKSUM     0x08000000      /* 3c905B only */
        !           521: #define XL_TXSTAT_RND_DEFEAT   0x10000000      /* 3c905B only */
        !           522: #define XL_TXSTAT_EMPTY                0x20000000      /* 3c905B only */
        !           523: #define XL_TXSTAT_DL_INTR      0x80000000
        !           524:
        !           525: #define XL_CAPABILITY_BM       0x20
        !           526:
        !           527: struct xl_type {
        !           528:        u_int16_t               xl_vid;
        !           529:        u_int16_t               xl_did;
        !           530:        char                    *xl_name;
        !           531: };
        !           532:
        !           533: struct xl_mii_frame {
        !           534:        u_int8_t                mii_stdelim;
        !           535:        u_int8_t                mii_opcode;
        !           536:        u_int8_t                mii_phyaddr;
        !           537:        u_int8_t                mii_regaddr;
        !           538:        u_int8_t                mii_turnaround;
        !           539:        u_int16_t               mii_data;
        !           540: };
        !           541:
        !           542: /*
        !           543:  * MII constants
        !           544:  */
        !           545: #define XL_MII_STARTDELIM      0x01
        !           546: #define XL_MII_READOP          0x02
        !           547: #define XL_MII_WRITEOP         0x01
        !           548: #define XL_MII_TURNAROUND      0x02
        !           549:
        !           550: /*
        !           551:  * The 3C905B adapters implement a few features that we want to
        !           552:  * take advantage of, namely the multicast hash filter. With older
        !           553:  * chips, you only have the option of turning on reception of all
        !           554:  * multicast frames, which is kind of lame.
        !           555:  *
        !           556:  * We also use this to decide on a transmit strategy. For the 3c90xB
        !           557:  * cards, we can use polled descriptor mode, which reduces CPU overhead.
        !           558:  */
        !           559: #define XL_TYPE_905B   1
        !           560: #define XL_TYPE_90X    2
        !           561:
        !           562: #define XL_FLAG_FUNCREG                        0x0001
        !           563: #define XL_FLAG_PHYOK                  0x0002
        !           564: #define XL_FLAG_EEPROM_OFFSET_30       0x0004
        !           565: #define XL_FLAG_WEIRDRESET             0x0008
        !           566: #define XL_FLAG_8BITROM                        0x0010
        !           567: #define XL_FLAG_INVERT_LED_PWR         0x0020
        !           568: #define XL_FLAG_INVERT_MII_PWR         0x0040
        !           569: #define XL_FLAG_NO_XCVR_PWR            0x0080
        !           570: #define XL_FLAG_USE_MMIO               0x0100
        !           571: #define XL_FLAG_NO_MMIO                        0x0200
        !           572:
        !           573: #define XL_NO_XCVR_PWR_MAGICBITS       0x0900
        !           574:
        !           575: struct xl_softc {
        !           576:        struct device           sc_dev;         /* generic device structure */
        !           577:        void *                  xl_intrhand;    /* interrupt handler cookie */
        !           578:        struct timeout          xl_stsup_tmo;   /* stats update timeout */
        !           579:        struct arpcom           sc_arpcom;              /* interface info */
        !           580:        struct ifmedia          ifmedia;        /* media info */
        !           581:        mii_data_t              sc_mii;         /* mii bus */
        !           582:        bus_space_handle_t      xl_bhandle;
        !           583:        bus_space_tag_t         xl_btag;
        !           584:        bus_space_handle_t      xl_funch;
        !           585:        bus_space_tag_t         xl_funct;
        !           586:        struct xl_type          *xl_info;       /* 3Com adapter info */
        !           587:        u_int8_t                xl_hasmii;      /* whether we have mii or not */
        !           588:        u_int8_t                xl_type;
        !           589:        u_int32_t               xl_xcvr;
        !           590:        u_int16_t               xl_media;
        !           591:        u_int16_t               xl_caps;
        !           592:        u_int8_t                xl_stats_no_timeout;
        !           593:        u_int16_t               xl_tx_thresh;
        !           594:        int                     xl_if_flags;
        !           595:        struct xl_list_data     *xl_ldata;
        !           596:        struct xl_chain_data    xl_cdata;
        !           597:        int                     xl_flags;
        !           598:        void (*intr_ack)(struct xl_softc *);
        !           599:        void *                  sc_sdhook, *sc_pwrhook;
        !           600:        bus_dma_tag_t           sc_dmat;
        !           601:        bus_dmamap_t            sc_listmap;
        !           602:        bus_dma_segment_t       sc_listseg[1];
        !           603:        int                     sc_listnseg;
        !           604:        caddr_t                 sc_listkva;
        !           605:        bus_dmamap_t            sc_rx_sparemap;
        !           606:        bus_dmamap_t            sc_tx_sparemap;
        !           607: };
        !           608:
        !           609: #define xl_rx_goodframes(x) \
        !           610:        ((x.xl_upper_frames_ok & 0x03) << 8) | x.xl_rx_frames_ok
        !           611:
        !           612: #define xl_tx_goodframes(x) \
        !           613:        ((x.xl_upper_frames_ok & 0x30) << 4) | x.xl_tx_frames_ok
        !           614:
        !           615: struct xl_stats {
        !           616:        u_int8_t                xl_carrier_lost;
        !           617:        u_int8_t                xl_sqe_errs;
        !           618:        u_int8_t                xl_tx_multi_collision;
        !           619:        u_int8_t                xl_tx_single_collision;
        !           620:        u_int8_t                xl_tx_late_collision;
        !           621:        u_int8_t                xl_rx_overrun;
        !           622:        u_int8_t                xl_tx_frames_ok;
        !           623:        u_int8_t                xl_rx_frames_ok;
        !           624:        u_int8_t                xl_tx_deferred;
        !           625:        u_int8_t                xl_upper_frames_ok;
        !           626:        u_int16_t               xl_rx_bytes_ok;
        !           627:        u_int16_t               xl_tx_bytes_ok;
        !           628:        u_int16_t               status;
        !           629: };
        !           630:
        !           631: /*
        !           632:  * register space access macros
        !           633:  */
        !           634: #define CSR_WRITE_4(sc, reg, val)      \
        !           635:        bus_space_write_4(sc->xl_btag, sc->xl_bhandle, reg, val)
        !           636: #define CSR_WRITE_2(sc, reg, val)      \
        !           637:        bus_space_write_2(sc->xl_btag, sc->xl_bhandle, reg, val)
        !           638: #define CSR_WRITE_1(sc, reg, val)      \
        !           639:        bus_space_write_1(sc->xl_btag, sc->xl_bhandle, reg, val)
        !           640:
        !           641: #define CSR_READ_4(sc, reg)            \
        !           642:        bus_space_read_4(sc->xl_btag, sc->xl_bhandle, reg)
        !           643: #define CSR_READ_2(sc, reg)            \
        !           644:        bus_space_read_2(sc->xl_btag, sc->xl_bhandle, reg)
        !           645: #define CSR_READ_1(sc, reg)            \
        !           646:        bus_space_read_1(sc->xl_btag, sc->xl_bhandle, reg)
        !           647:
        !           648: #define XL_SEL_WIN(x)  \
        !           649:        CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_WINSEL | x)
        !           650: #define XL_TIMEOUT             2000
        !           651:
        !           652: /*
        !           653:  * General constants that are fun to know.
        !           654:  *
        !           655:  * 3Com PCI vendor ID
        !           656:  */
        !           657: #define        TC_VENDORID             0x10B7
        !           658:
        !           659: /*
        !           660:  * 3Com PCI chip device IDs.
        !           661:  */
        !           662: #define TC_DEVICEID_TORNADO_HOMECONNECT                0x4500
        !           663: #define TC_DEVICEID_HURRICANE_555              0x5055
        !           664: #define TC_DEVICEID_HURRICANE_575A             0x5057
        !           665: #define TC_DEVICEID_HURRICANE_575B             0x5157
        !           666: #define TC_DEVICEID_HURRICANE_575C             0x5257
        !           667: #define TC_DEVICEID_HURRICANE_656              0x6560
        !           668: #define TC_DEVICEID_HURRICANE_656B             0x6562
        !           669: #define TC_DEVICEID_TORNADO_656C               0x6564
        !           670: #define TC_DEVICEID_HURRICANE_556              0x6055
        !           671: #define TC_DEVICEID_HURRICANE_556B             0x6056
        !           672: #define TC_DEVICEID_HURRICANE_SOHO100TX                0x7646
        !           673: #define TC_DEVICEID_BOOMERANG_10BT             0x9000
        !           674: #define TC_DEVICEID_BOOMERANG_10BT_COMBO       0x9001
        !           675: #define TC_DEVICEID_BOOMERANG_10_100BT         0x9050
        !           676: #define TC_DEVICEID_BOOMERANG_100BT4           0x9051
        !           677: #define TC_DEVICEID_KRAKATOA_10BT              0x9004
        !           678: #define TC_DEVICEID_KRAKATOA_10BT_COMBO                0x9005
        !           679: #define TC_DEVICEID_KRAKATOA_10BT_TPC          0x9006
        !           680: #define TC_DEVICEID_CYCLONE_10FL               0x900A
        !           681: #define TC_DEVICEID_HURRICANE_10_100BT         0x9055
        !           682: #define TC_DEVICEID_CYCLONE_10_100BT4          0x9056
        !           683: #define TC_DEVICEID_CYCLONE_10_100_COMBO       0x9058
        !           684: #define TC_DEVICEID_CYCLONE_10_100FX           0x905A
        !           685: #define TC_DEVICEID_TORNADO_10_100BT           0x9200
        !           686: #define TC_DEVICEID_TORNADO_10_100BT_920B      0x9201
        !           687: #define TC_DEVICEID_HURRICANE_10_100BT_SERV    0x9800
        !           688: #define TC_DEVICEID_TORNADO_10_100BT_SERV      0x9805
        !           689:
        !           690: /*
        !           691:  * 3Com CardBus chip device IDs.
        !           692:  *
        !           693:  * The third character of the model number indicates either a dongle ('C')
        !           694:  * or X-Jack ('X') connector. Presumably, "FE" means "Fast Ethernet", and
        !           695:  * the 'M' indicates a NIC/modem combo card.
        !           696:  */
        !           697: #define TC_DEVICEID_3C575_CARDBUS              0x5057
        !           698: #define TC_DEVICEID_3CCFE575BT_CARDBUS         0x5157  /* also 3CXFE575BT */
        !           699: #define TC_DEVICEID_3CCFE575CT_CARDBUS         0x5257  /* also 3CXFE575CT */
        !           700: #define TC_DEVICEID_3CCFEM656_CARDBUS          0x6560  /* also 3CXFEM656 */
        !           701: #define TC_DEVICEID_3CCFEM656B_CARDBUS         0x6562
        !           702: #define TC_DEVICEID_3CCFEM656C_CARDBUS         0x6564  /* also 3CXFEM656C */
        !           703:
        !           704: #define XL_CARDBUS_INTR                                0x0004
        !           705: #define XL_CARDBUS_INTR_ACK                    0x8000
        !           706:
        !           707: /*
        !           708:  * PCI low memory base and low I/O base register, and
        !           709:  * other PCI registers. Note: some are only available on
        !           710:  * the 3c905B, in particular those that related to power management.
        !           711:  */
        !           712:
        !           713: #define XL_PCI_VENDOR_ID       0x00
        !           714: #define XL_PCI_DEVICE_ID       0x02
        !           715: #define XL_PCI_COMMAND         0x04
        !           716: #define XL_PCI_STATUS          0x06
        !           717: #define XL_PCI_CLASSCODE       0x09
        !           718: #define XL_PCI_LATENCY_TIMER   0x0D
        !           719: #define XL_PCI_HEADER_TYPE     0x0E
        !           720: #define XL_PCI_LOIO            0x10
        !           721: #define XL_PCI_LOMEM           0x14
        !           722: #define XL_PCI_BIOSROM         0x30
        !           723: #define XL_PCI_INTLINE         0x3C
        !           724: #define XL_PCI_INTPIN          0x3D
        !           725: #define XL_PCI_MINGNT          0x3E
        !           726: #define XL_PCI_MINLAT          0x0F
        !           727: #define XL_PCI_RESETOPT                0x48
        !           728: #define XL_PCI_EEPROM_DATA     0x4C
        !           729:
        !           730: /* 3c905B-only registers */
        !           731: #define XL_PCI_CAPID           0xDC /* 8 bits */
        !           732: #define XL_PCI_NEXTPTR         0xDD /* 8 bits */
        !           733: #define XL_PCI_PWRMGMTCAP      0xDE /* 16 bits */
        !           734: #define XL_PCI_PWRMGMTCTRL     0xE0 /* 16 bits */
        !           735:
        !           736: #define XL_PSTATE_MASK         0x0003
        !           737: #define XL_PSTATE_D0           0x0000
        !           738: #define XL_PSTATE_D1           0x0002
        !           739: #define XL_PSTATE_D2           0x0002
        !           740: #define XL_PSTATE_D3           0x0003
        !           741: #define XL_PME_EN              0x0010
        !           742: #define XL_PME_STATUS          0x8000
        !           743:
        !           744: extern int xl_intr(void *);
        !           745: extern void xl_attach(struct xl_softc *);
        !           746: extern int xl_detach(struct xl_softc *);

CVSweb