midwayvar.h revision 37939
1/* $NetBSD: midwayvar.h,v 1.10 1997/03/20 21:34:46 chuck Exp $ */ 2 3/* 4 * 5 * Copyright (c) 1996 Charles D. Cranor and Washington University. 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 Charles D. Cranor and 19 * Washington University. 20 * 4. The name of the author may not be used to endorse or promote products 21 * derived from this software without specific prior written 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 35/* 36 * m i d w a y v a r . h 37 * 38 * we define the en_softc here so that bus specific modules can allocate 39 * it as the first item in their softc. note that BSD-required 40 * "struct device" is in the mid_softc! 41 * 42 * author: Chuck Cranor <chuck@ccrc.wustl.edu> 43 */ 44 45/* 46 * params needed to determine softc size 47 */ 48 49#ifndef EN_NTX 50#define EN_NTX 8 /* number of tx bufs to use */ 51#endif 52#ifndef EN_TXSZ 53#define EN_TXSZ 32 /* trasmit buf size in KB */ 54#endif 55#ifndef EN_RXSZ 56#define EN_RXSZ 32 /* recv buf size in KB */ 57#endif 58#define EN_MAXNRX ((2048-(EN_NTX*EN_TXSZ))/EN_RXSZ) 59 /* largest possible NRX (depends on RAM size) */ 60 61 62#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) 63#define EN_INTR_TYPE int 64#define EN_INTR_RET(X) return(X) 65#if defined(__NetBSD__) || defined(__OpenBSD__) 66#define EN_IOCTL_CMDT u_long 67#elif defined(__bsdi__) 68#define EN_IOCTL_CMDT int 69#endif 70 71#elif defined(__FreeBSD__) 72 73#define EN_INTR_TYPE void 74#define EN_INTR_RET(X) return 75#define EN_IOCTL_CMDT u_long 76 77struct device { 78 char dv_xname[IFNAMSIZ]; 79}; 80 81#define DV_IFNET 1 82 83struct cfdriver { 84 int zero; 85 char *name; 86 int one; 87 int cd_ndevs; 88 void *cd_devs[NEN]; 89}; 90 91#endif 92 93/* 94 * softc 95 */ 96 97struct en_softc { 98 /* bsd glue */ 99 struct device sc_dev; /* system device */ 100 struct ifnet enif; /* network ifnet handle */ 101 102 /* bus glue */ 103 bus_space_tag_t en_memt; /* for EN_READ/EN_WRITE */ 104 bus_space_handle_t en_base; /* base of en card */ 105 bus_size_t en_obmemsz; /* size of en card (bytes) */ 106 void (*en_busreset) __P((void *)); 107 /* bus specific reset function */ 108 109 /* serv list */ 110 u_int32_t hwslistp; /* hw pointer to service list (byte offset) */ 111 u_int16_t swslist[MID_SL_N]; /* software service list (see en_service()) */ 112 u_int16_t swsl_head, /* ends of swslist (index into swslist) */ 113 swsl_tail; 114 u_int32_t swsl_size; /* # of items in swsl */ 115 116 117 /* xmit dma */ 118 u_int32_t dtq[MID_DTQ_N]; /* sw copy of dma q (see ENIDQ macros) */ 119 u_int32_t dtq_free; /* # of dtq's free */ 120 u_int32_t dtq_us; /* software copy of our pointer (byte offset) */ 121 u_int32_t dtq_chip; /* chip's pointer (byte offset) */ 122 u_int32_t need_dtqs; /* true if we ran out of DTQs */ 123 124 /* recv dma */ 125 u_int32_t drq[MID_DRQ_N]; /* sw copy of dma q (see ENIDQ macros) */ 126 u_int32_t drq_free; /* # of drq's free */ 127 u_int32_t drq_us; /* software copy of our pointer (byte offset) */ 128 u_int32_t drq_chip; /* chip's pointer (byte offset) */ 129 u_int32_t need_drqs; /* true if we ran out of DRQs */ 130 131 /* xmit buf ctrl. (per channel) */ 132 struct { 133 u_int32_t mbsize; /* # mbuf bytes we are using (max=TXHIWAT) */ 134 u_int32_t bfree; /* # free bytes in buffer (not dma or xmit) */ 135 u_int32_t start, stop; /* ends of buffer area (byte offset) */ 136 u_int32_t cur; /* next free area (byte offset) */ 137 u_int32_t nref; /* # of VCs using this channel */ 138 struct ifqueue indma; /* mbufs being dma'd now */ 139 struct ifqueue q; /* mbufs waiting for dma now */ 140 } txslot[MID_NTX_CH]; 141 142 /* xmit vc ctrl. (per vc) */ 143 u_int8_t txspeed[MID_N_VC]; /* speed of tx on a VC */ 144 u_int8_t txvc2slot[MID_N_VC]; /* map VC to slot */ 145 146 /* recv vc ctrl. (per vc). maps VC number to recv slot */ 147 u_int16_t rxvc2slot[MID_N_VC]; 148 int en_nrx; /* # of active rx slots */ 149 150 /* recv buf ctrl. (per recv slot) */ 151 struct { 152 void *rxhand; /* recv. handle if doing direct delivery */ 153 u_int32_t mode; /* saved copy of mode info */ 154 u_int32_t start, stop; /* ends of my buffer area */ 155 u_int32_t cur; /* where I am at */ 156 u_int16_t atm_vci; /* backpointer to VCI */ 157 u_int8_t atm_flags; /* copy of atm_flags from atm_ph */ 158 u_int8_t oth_flags; /* other flags */ 159 u_int32_t raw_threshold; /* for raw mode */ 160 struct ifqueue indma; /* mbufs being dma'd now */ 161 struct ifqueue q; /* mbufs waiting for dma now */ 162 } rxslot[EN_MAXNRX]; /* recv info */ 163 164 u_int8_t macaddr[6]; /* card unique mac address */ 165 166 /* stats */ 167 u_int32_t vtrash; /* sw copy of counter */ 168 u_int32_t otrash; /* sw copy of counter */ 169 u_int32_t ttrash; /* # of RBD's with T bit set */ 170 u_int32_t mfix; /* # of times we had to call mfix */ 171 u_int32_t mfixfail; /* # of times mfix failed */ 172 u_int32_t headbyte; /* # of times we used BYTE DMA at front */ 173 u_int32_t tailbyte; /* # of times we used BYTE DMA at end */ 174 u_int32_t tailflush; /* # of times we had to FLUSH out DMA bytes */ 175 u_int32_t txmbovr; /* # of times we dropped due to mbsize */ 176 u_int32_t dmaovr; /* tx dma overflow count */ 177 u_int32_t txoutspace; /* out of space in xmit buffer */ 178 u_int32_t txdtqout; /* out of DTQs */ 179 u_int32_t launch; /* total # of launches */ 180 u_int32_t lheader; /* # of launches without OB header */ 181 u_int32_t ltail; /* # of launches without OB tail */ 182 u_int32_t hwpull; /* # of pulls off hardware service list */ 183 u_int32_t swadd; /* # of pushes on sw service list */ 184 u_int32_t rxqnotus; /* # of times we pull from rx q, but fail */ 185 u_int32_t rxqus; /* # of good pulls from rx q */ 186 u_int32_t rxoutboth; /* # of times out of mbufs and DRQs */ 187 u_int32_t rxdrqout; /* # of times out of DRQs */ 188 u_int32_t rxmbufout; /* # of time out of mbufs */ 189 190 /* random stuff */ 191 u_int32_t ipl; /* sbus interrupt lvl (1 on pci?) */ 192 u_int8_t bestburstcode; /* code of best burst we can use */ 193 u_int8_t bestburstlen; /* length of best burst (bytes) */ 194 u_int8_t bestburstshift; /* (x >> shift) == (x / bestburstlen) */ 195 u_int8_t bestburstmask; /* bits to check if not multiple of burst */ 196 u_int8_t alburst; /* align dma bursts? */ 197 u_int8_t is_adaptec; /* adaptec version of midway? */ 198}; 199 200/* 201 * exported functions 202 */ 203 204void en_attach __P((struct en_softc *)); 205EN_INTR_TYPE en_intr __P((void *)); 206void en_reset __P((struct en_softc *)); 207