/* $NetBSD: i82586var.h,v 1.4 1997/08/01 20:33:03 pk Exp $ */ /*- * Copyright (c) 1993, 1994, 1995 Charles Hannum. * Copyright (c) 1992, 1993, University of Vermont and State * Agricultural College. * Copyright (c) 1992, 1993, Garrett A. Wollman. * * Portions: * Copyright (c) 1994, 1995, Rafal K. Boni * Copyright (c) 1990, 1991, William F. Jolitz * Copyright (c) 1990, The Regents of the University of California * * All rights reserved. * * 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. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by Charles Hannum, by the * University of Vermont and State Agricultural College and Garrett A. * Wollman, by William F. Jolitz, and by the University of California, * Berkeley, Lawrence Berkeley Laboratory, and its contributors. * 4. Neither the names of the Universities nor the names of the authors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 UNIVERSITY OR AUTHORS 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. */ /* * Intel 82586 Ethernet chip * Register, bit, and structure definitions. * * Original StarLAN driver written by Garrett Wollman with reference to the * Clarkson Packet Driver code for this chip written by Russ Nelson and others. * * BPF support code taken from hpdev/if_le.c, supplied with tcpdump. * * 3C507 support is loosely based on code donated to NetBSD by Rafal Boni. * * Majorly cleaned up and 3C507 code merged by Charles Hannum. * * Converted to SUN ie driver by Charles D. Cranor, * October 1994, January 1995. * This sun version based on i386 version 1.30. */ #define IEDEBUG #define IED_RINT 0x01 #define IED_TINT 0x02 #define IED_RNR 0x04 #define IED_CNA 0x08 #define IED_READFRAME 0x10 #define IED_ENQ 0x20 #define IED_XMIT 0x40 #define IED_ALL 0x7f #define ETHER_MIN_LEN 64 #define ETHER_MAX_LEN 1518 #define ETHER_ADDR_LEN 6 #define B_PER_F 3 /* recv buffers per frame */ #define MAXFRAMES 300 /* max number of recv frames */ #define MAXRXBUF (MAXFRAMES*B_PER_F) /* number of buffers to allocate */ #define IE_RBUF_SIZE 256 /* size of each receive buffer; MUST BE POWER OF TWO */ #define NTXBUF 2 /* number of transmit commands */ #define IE_TBUF_SIZE ETHER_MAX_LEN /* length of transmit buffer */ /* * Ethernet status, per interface. * * hardware addresses/sizes to know (all KVA): * sc_iobase = base of chip's 24 bit address space * sc_maddr = base address of chip RAM as stored in ie_base of iscp * sc_msize = size of chip's RAM * sc_reg = address of card dependent registers * * the chip uses two types of pointers: 16 bit and 24 bit * 16 bit pointers are offsets from sc_maddr/ie_base * KVA(16 bit offset) = offset + sc_maddr * 24 bit pointers are offset from sc_iobase in KVA * KVA(24 bit address) = address + sc_iobase * * on the vme/multibus we have the page map to control where ram appears * in the address space. we choose to have RAM start at 0 in the * 24 bit address space. this means that sc_iobase == sc_maddr! * to get the phyiscal address of the board's RAM you must take the * top 12 bits of the physical address of the register address * and or in the 4 bits from the status word as bits 17-20 (remember that * the board ignores the chip's top 4 address lines). * For example: * if the register is @ 0xffe88000, then the top 12 bits are 0xffe00000. * to get the 4 bits from the the status word just do status & IEVME_HADDR. * suppose the value is "4". Then just shift it left 16 bits to get * it into bits 17-20 (e.g. 0x40000). Then or it to get the * address of RAM (in our example: 0xffe40000). see the attach routine! * * on the onboard ie interface the 24 bit address space is hardwired * to be 0xff000000 -> 0xffffffff of KVA. this means that sc_iobase * will be 0xff000000. sc_maddr will be where ever we allocate RAM * in KVA. note that since the SCP is at a fixed address it means * that we have to allocate a fixed KVA for the SCP. */ struct ie_softc { struct device sc_dev; /* device structure */ bus_space_tag_t bt; bus_space_handle_t bh; caddr_t sc_iobase; /* KVA of base of 24 bit addr space */ caddr_t sc_maddr; /* KVA of base of chip's RAM (16bit addr sp.)*/ u_int sc_msize; /* how much RAM we have/use */ caddr_t sc_reg; /* KVA of car's register */ struct ethercom sc_ethercom;/* system ethercom structure */ void (*hwreset) __P((struct ie_softc *)); /* card dependent reset function */ void (*hwinit) __P((struct ie_softc *)); /* card dependent "go on-line" function */ void (*chan_attn) __P((struct ie_softc *)); /* card dependent attn function */ void (*memcopy) __P((const void *, void *, u_int)); /* card dependent memory copy function */ void (*memzero) __P((void *, u_int)); /* card dependent memory zero function */ caddr_t (*align) __P((caddr_t)); /* arch dependent alignment function */ int (*intrhook) __P((struct ie_softc *)); /* card dependent interrupt handling */ int want_mcsetup; /* mcsetup flag */ int promisc; /* are we in promisc mode? */ /* * pointers to the 3 major control structures */ volatile struct ie_sys_conf_ptr *scp; volatile struct ie_int_sys_conf_ptr *iscp; volatile struct ie_sys_ctl_block *scb; /* * pointer and size of a block of KVA where the buffers * are to be allocated from */ caddr_t buf_area; int buf_area_sz; /* * the actual buffers (recv and xmit) */ volatile struct ie_recv_frame_desc *rframes[MAXFRAMES]; volatile struct ie_recv_buf_desc *rbuffs[MAXRXBUF]; volatile char *cbuffs[MAXRXBUF]; int rfhead, rftail, rbhead, rbtail; volatile struct ie_cmd_common *nop_cmds[NTXBUF+1]; volatile struct ie_xmit_cmd *xmit_cmds[NTXBUF]; volatile struct ie_xmit_buf *xmit_buffs[NTXBUF]; u_char *xmit_cbuffs[NTXBUF]; int xmit_busy; int xchead, xctail; struct ie_en_addr mcast_addrs[MAXMCAST + 1]; int mcast_count; int nframes; /* number of frames in use */ int nrxbuf; /* number of recv buffs in use */ #ifdef IEDEBUG int sc_debug; #endif }; void ie_attach __P((struct ie_softc *, char *, u_int8_t *)); int ieintr __P((void *));