| 1 | /* $NetBSD: midwayvar.h,v 1.19 2012/10/27 17:18:21 chs Exp $ */ |
| 2 | |
| 3 | /* |
| 4 | * Copyright (c) 1996 Charles D. Cranor and Washington University. |
| 5 | * 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 | * |
| 16 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
| 17 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| 18 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| 19 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
| 20 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| 21 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 22 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 23 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| 25 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 26 | */ |
| 27 | |
| 28 | /* |
| 29 | * m i d w a y v a r . h |
| 30 | * |
| 31 | * we define the en_softc here so that bus specific modules can allocate |
| 32 | * it as the first item in their softc. note that BSD-required |
| 33 | * device_t is in the mid_softc! |
| 34 | * |
| 35 | * author: Chuck Cranor <chuck@netbsd> |
| 36 | */ |
| 37 | |
| 38 | /* |
| 39 | * params needed to determine softc size |
| 40 | */ |
| 41 | |
| 42 | #ifndef EN_NTX |
| 43 | #define EN_NTX 8 /* number of tx bufs to use */ |
| 44 | #endif |
| 45 | #ifndef EN_TXSZ |
| 46 | #define EN_TXSZ 32 /* transmit buf size in KB */ |
| 47 | #endif |
| 48 | #ifndef EN_RXSZ |
| 49 | #define EN_RXSZ 32 /* recv buf size in KB */ |
| 50 | #endif |
| 51 | #define EN_MAXNRX ((2048-(EN_NTX*EN_TXSZ))/EN_RXSZ) |
| 52 | /* largest possible NRX (depends on RAM size) */ |
| 53 | |
| 54 | |
| 55 | #if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) |
| 56 | #define EN_INTR_TYPE int |
| 57 | #define EN_INTR_RET(X) return(X) |
| 58 | #if defined(__NetBSD__) || defined(__OpenBSD__) |
| 59 | #define EN_IOCTL_CMDT u_long |
| 60 | #elif defined(__bsdi__) |
| 61 | #define EN_IOCTL_CMDT int |
| 62 | #endif |
| 63 | |
| 64 | #elif defined(__FreeBSD__) |
| 65 | |
| 66 | #define EN_INTR_TYPE void |
| 67 | #define EN_INTR_RET(X) return |
| 68 | #define EN_IOCTL_CMDT int |
| 69 | |
| 70 | struct device { |
| 71 | char dv_xname[IFNAMSIZ]; |
| 72 | }; |
| 73 | |
| 74 | #define DV_IFNET 1 |
| 75 | |
| 76 | struct cfdriver { |
| 77 | int zero; |
| 78 | char *name; |
| 79 | int one; |
| 80 | int cd_ndevs; |
| 81 | void *cd_devs[NEN]; |
| 82 | }; |
| 83 | |
| 84 | #endif |
| 85 | |
| 86 | #if 1 /* for ATM_PVCEXT */ |
| 87 | #include <sys/queue.h> |
| 88 | |
| 89 | /* round-robin scheduler */ |
| 90 | struct rrp { |
| 91 | struct rrp *next; |
| 92 | struct ifnet *ifp; |
| 93 | int nref; |
| 94 | }; |
| 95 | #endif |
| 96 | |
| 97 | /* |
| 98 | * softc |
| 99 | */ |
| 100 | |
| 101 | struct en_softc { |
| 102 | /* bsd glue */ |
| 103 | device_t sc_dev; /* system device */ |
| 104 | struct ifnet enif; /* network ifnet handle */ |
| 105 | |
| 106 | /* bus glue */ |
| 107 | bus_space_tag_t en_memt; /* for EN_READ/EN_WRITE */ |
| 108 | bus_space_handle_t en_base; /* base of en card */ |
| 109 | bus_size_t en_obmemsz; /* size of en card (bytes) */ |
| 110 | void (*en_busreset)(void *); |
| 111 | /* bus specific reset function */ |
| 112 | |
| 113 | /* serv list */ |
| 114 | u_int32_t hwslistp; /* hw pointer to service list (byte offset) */ |
| 115 | u_int16_t swslist[MID_SL_N]; /* software service list (see en_service()) */ |
| 116 | u_int16_t swsl_head, /* ends of swslist (index into swslist) */ |
| 117 | swsl_tail; |
| 118 | u_int32_t swsl_size; /* # of items in swsl */ |
| 119 | |
| 120 | |
| 121 | /* xmit DMA */ |
| 122 | u_int32_t dtq[MID_DTQ_N]; /* sw copy of DMA q (see ENIDQ macros) */ |
| 123 | u_int32_t dtq_free; /* # of dtq's free */ |
| 124 | u_int32_t dtq_us; /* software copy of our pointer (byte offset) */ |
| 125 | u_int32_t dtq_chip; /* chip's pointer (byte offset) */ |
| 126 | u_int32_t need_dtqs; /* true if we ran out of DTQs */ |
| 127 | |
| 128 | /* recv DMA */ |
| 129 | u_int32_t drq[MID_DRQ_N]; /* sw copy of DMA q (see ENIDQ macros) */ |
| 130 | u_int32_t drq_free; /* # of drq's free */ |
| 131 | u_int32_t drq_us; /* software copy of our pointer (byte offset) */ |
| 132 | u_int32_t drq_chip; /* chip's pointer (byte offset) */ |
| 133 | u_int32_t need_drqs; /* true if we ran out of DRQs */ |
| 134 | |
| 135 | /* xmit buf ctrl. (per channel) */ |
| 136 | struct { |
| 137 | u_int32_t mbsize; /* # mbuf bytes we are using (max=TXHIWAT) */ |
| 138 | u_int32_t bfree; /* # free bytes in buffer (not DMA or xmit) */ |
| 139 | u_int32_t start, stop; /* ends of buffer area (byte offset) */ |
| 140 | u_int32_t cur; /* next free area (byte offset) */ |
| 141 | u_int32_t nref; /* # of VCs using this channel */ |
| 142 | struct ifqueue indma; /* mbufs being DMA'd now */ |
| 143 | struct ifqueue q; /* mbufs waiting for DMA now */ |
| 144 | } txslot[MID_NTX_CH]; |
| 145 | |
| 146 | /* xmit vc ctrl. (per vc) */ |
| 147 | u_int8_t txspeed[MID_N_VC]; /* speed of tx on a VC */ |
| 148 | u_int8_t txvc2slot[MID_N_VC]; /* map VC to slot */ |
| 149 | |
| 150 | #if 1 /* for ATM_PVCEXT */ |
| 151 | struct rrp *txrrp; /* round-robin pointer to ifnet */ |
| 152 | #endif |
| 153 | |
| 154 | /* recv vc ctrl. (per vc). maps VC number to recv slot */ |
| 155 | u_int16_t rxvc2slot[MID_N_VC]; |
| 156 | int en_nrx; /* # of active rx slots */ |
| 157 | |
| 158 | /* recv buf ctrl. (per recv slot) */ |
| 159 | struct { |
| 160 | void *rxhand; /* recv. handle if doing direct delivery */ |
| 161 | u_int32_t mode; /* saved copy of mode info */ |
| 162 | u_int32_t start, stop; /* ends of my buffer area */ |
| 163 | u_int32_t cur; /* where I am at */ |
| 164 | u_int16_t atm_vci; /* backpointer to VCI */ |
| 165 | u_int8_t atm_flags; /* copy of atm_flags from atm_ph */ |
| 166 | u_int8_t oth_flags; /* other flags */ |
| 167 | u_int32_t raw_threshold; /* for raw mode */ |
| 168 | struct ifqueue indma; /* mbufs being DMA'd now */ |
| 169 | struct ifqueue q; /* mbufs waiting for DMA now */ |
| 170 | } rxslot[EN_MAXNRX]; /* recv info */ |
| 171 | |
| 172 | u_int8_t macaddr[6]; /* card unique mac address */ |
| 173 | |
| 174 | /* stats */ |
| 175 | u_int32_t vtrash; /* sw copy of counter */ |
| 176 | u_int32_t otrash; /* sw copy of counter */ |
| 177 | u_int32_t ttrash; /* # of RBD's with T bit set */ |
| 178 | u_int32_t mfix; /* # of times we had to call mfix */ |
| 179 | u_int32_t mfixfail; /* # of times mfix failed */ |
| 180 | u_int32_t headbyte; /* # of times we used BYTE DMA at front */ |
| 181 | u_int32_t tailbyte; /* # of times we used BYTE DMA at end */ |
| 182 | u_int32_t tailflush; /* # of times we had to FLUSH out DMA bytes */ |
| 183 | u_int32_t txmbovr; /* # of times we dropped due to mbsize */ |
| 184 | u_int32_t dmaovr; /* tx DMA overflow count */ |
| 185 | u_int32_t txoutspace; /* out of space in xmit buffer */ |
| 186 | u_int32_t txdtqout; /* out of DTQs */ |
| 187 | u_int32_t launch; /* total # of launches */ |
| 188 | u_int32_t ; /* # of launches without OB header */ |
| 189 | u_int32_t ltail; /* # of launches without OB tail */ |
| 190 | u_int32_t hwpull; /* # of pulls off hardware service list */ |
| 191 | u_int32_t swadd; /* # of pushes on sw service list */ |
| 192 | u_int32_t rxqnotus; /* # of times we pull from rx q, but fail */ |
| 193 | u_int32_t rxqus; /* # of good pulls from rx q */ |
| 194 | u_int32_t rxoutboth; /* # of times out of mbufs and DRQs */ |
| 195 | u_int32_t rxdrqout; /* # of times out of DRQs */ |
| 196 | u_int32_t rxmbufout; /* # of time out of mbufs */ |
| 197 | |
| 198 | /* random stuff */ |
| 199 | u_int32_t ipl; /* sbus interrupt lvl (1 on pci?) */ |
| 200 | u_int8_t bestburstcode; /* code of best burst we can use */ |
| 201 | u_int8_t bestburstlen; /* length of best burst (bytes) */ |
| 202 | u_int8_t bestburstshift; /* (x >> shift) == (x / bestburstlen) */ |
| 203 | u_int8_t bestburstmask; /* bits to check if not multiple of burst */ |
| 204 | u_int8_t alburst; /* align DMA bursts? */ |
| 205 | u_int8_t is_adaptec; /* adaptec version of midway? */ |
| 206 | |
| 207 | #if 1 /* for ATM_PVCEXT */ |
| 208 | LIST_HEAD(sif_list, pvcsif) sif_list; /* pvc subinterface list */ |
| 209 | #endif |
| 210 | }; |
| 211 | |
| 212 | /* |
| 213 | * exported functions |
| 214 | */ |
| 215 | |
| 216 | void en_attach(struct en_softc *); |
| 217 | EN_INTR_TYPE en_intr(void *); |
| 218 | void en_reset(struct en_softc *); |
| 219 | |