Annotation of sys/dev/ic/midwayvar.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: midwayvar.h,v 1.12 2003/10/21 18:58:49 jmc 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 /* transmit 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 int
76:
77: struct device {
78: char dv_xname[IFNAMSIZ];
79: };
80:
81: #define DV_IFNET 1
82:
83: struct 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: /*
95: * softc
96: */
97:
98: struct en_softc {
99: /* bsd glue */
100: struct device sc_dev; /* system device */
101: struct ifnet enif; /* network ifnet handle */
102:
103: /* bus glue */
104: bus_space_tag_t en_memt; /* for EN_READ/EN_WRITE */
105: bus_space_handle_t en_base; /* base of en card */
106: bus_size_t en_obmemsz; /* size of en card (bytes) */
107: void (*en_busreset)(void *); /* 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: /* stats */
165: u_int32_t vtrash; /* sw copy of counter */
166: u_int32_t otrash; /* sw copy of counter */
167: u_int32_t ttrash; /* # of RBD's with T bit set */
168: u_int32_t mfix; /* # of times we had to call mfix */
169: u_int32_t mfixfail; /* # of times mfix failed */
170: u_int32_t headbyte; /* # of times we used BYTE DMA at front */
171: u_int32_t tailbyte; /* # of times we used BYTE DMA at end */
172: u_int32_t tailflush; /* # of times we had to FLUSH out DMA bytes */
173: u_int32_t txmbovr; /* # of times we dropped due to mbsize */
174: u_int32_t dmaovr; /* tx dma overflow count */
175: u_int32_t txoutspace; /* out of space in xmit buffer */
176: u_int32_t txdtqout; /* out of DTQs */
177: u_int32_t launch; /* total # of launches */
178: u_int32_t lheader; /* # of launches without OB header */
179: u_int32_t ltail; /* # of launches without OB tail */
180: u_int32_t hwpull; /* # of pulls off hardware service list */
181: u_int32_t swadd; /* # of pushes on sw service list */
182: u_int32_t rxqnotus; /* # of times we pull from rx q, but fail */
183: u_int32_t rxqus; /* # of good pulls from rx q */
184: u_int32_t rxoutboth; /* # of times out of mbufs and DRQs */
185: u_int32_t rxdrqout; /* # of times out of DRQs */
186: u_int32_t rxmbufout; /* # of time out of mbufs */
187:
188: /* random stuff */
189: u_int32_t ipl; /* sbus interrupt lvl (1 on pci?) */
190: u_int8_t bestburstcode; /* code of best burst we can use */
191: u_int8_t bestburstlen; /* length of best burst (bytes) */
192: u_int8_t bestburstshift; /* (x >> shift) == (x / bestburstlen) */
193: u_int8_t bestburstmask; /* bits to check if not multiple of burst */
194: u_int8_t alburst; /* align dma bursts? */
195: u_int8_t is_adaptec; /* adaptec version of midway? */
196: };
197:
198: /*
199: * exported functions
200: */
201:
202: void en_attach(struct en_softc *);
203: EN_INTR_TYPE en_intr(void *);
204: void en_reset(struct en_softc *);
CVSweb