/* $NetBSD: if_ecreg.h,v 1.6 2008/04/28 20:23:37 martin Exp $ */ /* * Copyright (c) 2001 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Matthew Fredette. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /* * 3Com Ethernet controller registers. */ #define EC_BUF_SZ 2048 #if __for_reference_only__ struct ec_regs { uint16_t ec_csr; /* control/status register */ uint16_t ec_backoff; /* backoff seed */ uint8_t ec_pad1[0x400 - (2 * sizeof(uint16_t))]; struct ether_addr ec_arom; /* address ROM */ uint8_t ec_pad2[0x200 - sizeof(struct ether_addr)]; struct ether_addr ec_aram; /* address RAM */ uint8_t ec_pad3[0x200 - sizeof(struct ether_addr)]; uint8_t ec_tbuf[EC_BUF_SZ]; /* transmit buffer */ uint8_t ec_abuf[EC_BUF_SZ]; /* receive buffer A */ uint8_t ec_bbuf[EC_BUF_SZ]; /* receive buffer B */ }; #endif /* Register offsets. */ #define ECREG_CSR (0) #define ECREG_BACKOFF (2) #define ECREG_AROM (1024) #define ECREG_ARAM (1536) #define ECREG_TBUF (2048) #define ECREG_ABUF (ECREG_TBUF + EC_BUF_SZ) #define ECREG_BBUF (ECREG_ABUF + EC_BUF_SZ) #define ECREG_BANK_SZ (ECREG_BBUF + EC_BUF_SZ) /* * Control/status register bits */ #define EC_CSR_BBSW 0x8000 /* B buffer empty (belongs to card) */ #define EC_CSR_ABSW 0x4000 /* A buffer empty (belongs to card) */ #define EC_CSR_TBSW 0x2000 /* T buffer full (belongs to card) */ #define EC_CSR_JAM 0x1000 /* Ethernet jammed (collision) */ #define EC_CSR_AMSW 0x0800 /* address RAM belongs to ether */ #define EC_CSR_RBBA 0x0400 /* B buffer received before A */ #define EC_CSR_RESET 0x0100 /* reset the card */ #define EC_CSR_BINT 0x0080 /* B buffer interrupt enable */ #define EC_CSR_AINT 0x0040 /* A buffer interrupt enable */ #define EC_CSR_TINT 0x0020 /* T buffer interrupt enable */ #define EC_CSR_JINT 0x0010 /* jam interrupt enable */ #define EC_CSR_INTPA 0x00ff /* mask for interrupt and PA fields */ #define EC_CSR_PAMASK 0x000f /* PA field */ #define EC_CSR_PA 0x0007 /* receive mine+broadcast-errors */ #define EC_CSR_PROMISC 0x0001 /* receive all-errors */ /* * Turns an EC_CSR_xINT value into an ECREG_xBUF value. * NB: does not work with EC_CSR_TINT. */ #define EC_CSR_INT_BUF(x) (((x) << 5) + 2048) /* * Turns an EC_CSR_xINT value into an ECREG_xBSW value. */ #define EC_CSR_INT_BSW(x) ((x) << 8) /* * Receive status bits. The first 16 bits of a receive * buffer are a status word. */ #define EC_PKT_FCSERR 0x8000 /* FCS error */ #define EC_PKT_BROADCAST 0x4000 /* packet was broadcast */ #define EC_PKT_RGERR 0x2000 /* range error */ #define EC_PKT_ADDRMATCH 0x1000 /* address match */ #define EC_PKT_FRERR 0x0800 /* framing error */ #define EC_PKT_DOFF 0x07ff /* first free byte */ #define EC_PKT_MAXTDOFF (EC_BUF_SZ - (ETHER_MIN_LEN - ETHER_CRC_LEN)) /* max xmit doff (min size) */ #define EC_PKT_RDOFF 2 /* packet offset in buffer */ #define EC_PKT_MINRDOFF (EC_PKT_RDOFF + (ETHER_MIN_LEN - ETHER_CRC_LEN)) /* min packet doff (min size) */ #define EC_PKT_MAXRDOFF (EC_BUF_SZ - EC_PKT_RDOFF) /* max packet doff (max size) */