summaryrefslogtreecommitdiffstats
path: root/sys/dev/en/midwayvar.h
blob: 78ed63482641450fde2f96c401c8ab95c15f1240 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
/*	$NetBSD: midwayvar.h,v 1.10 1997/03/20 21:34:46 chuck Exp $	*/

/*
 *
 * Copyright (c) 1996 Charles D. Cranor and Washington University.
 * 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 D. Cranor and
 *	Washington University.
 * 4. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
 *
 * $FreeBSD$
 */

/*
 * m i d w a y v a r . h
 *
 * we define the en_softc here so that bus specific modules can allocate
 * it as the first item in their softc. 
 *
 * author: Chuck Cranor <chuck@ccrc.wustl.edu>
 */

/*
 * params needed to determine softc size
 */
#ifndef EN_NTX
#define EN_NTX          8       /* number of tx bufs to use */
#endif
#ifndef EN_TXSZ
#define EN_TXSZ         32      /* trasmit buf size in KB */
#endif
#ifndef EN_RXSZ
#define EN_RXSZ         32      /* recv buf size in KB */
#endif

/* largest possible NRX (depends on RAM size) */
#define EN_MAXNRX       ((2048 - (EN_NTX * EN_TXSZ)) / EN_RXSZ)

#ifndef EN_MAX_DMASEG
#define EN_MAX_DMASEG	32
#endif

/* number of bytes to use in the first receive buffer. This must not be larger
 * than MHLEN, should be a multiple of 64 and must be a multiple of 4. */
#define EN_RX1BUF	128

/*
 * Structure to hold DMA maps. These are handle via a typestable uma zone.
 */
struct en_map {
	uintptr_t	flags;		/* map flags */
	struct en_map	*rsvd2;		/* see uma_zalloc(9) */
	struct en_softc	*sc;		/* back pointer */
	bus_dmamap_t	map;		/* the map */
};
#define ENMAP_LOADED	0x02
#define ENMAP_ALLOC	0x01

#define EN_MAX_MAPS	400

/*
 * Statistics
 */
struct en_stats {
	uint32_t vtrash;	/* sw copy of counter */
	uint32_t otrash;	/* sw copy of counter */
	uint32_t ttrash;	/* # of RBD's with T bit set */
	uint32_t mfixaddr;	/* # of times we had to mfix an address */
	uint32_t mfixlen;	/* # of times we had to mfix a lenght*/
	uint32_t mfixfail;	/* # of times mfix failed */
	uint32_t txmbovr;	/* # of times we dropped due to mbsize */
	uint32_t dmaovr;	/* tx dma overflow count */
	uint32_t txoutspace;	/* out of space in xmit buffer */
	uint32_t txdtqout;	/* out of DTQs */
	uint32_t launch;	/* total # of launches */
	uint32_t hwpull;	/* # of pulls off hardware service list */
	uint32_t swadd;		/* # of pushes on sw service list */
	uint32_t rxqnotus;	/* # of times we pull from rx q, but fail */
	uint32_t rxqus;		/* # of good pulls from rx q */
	uint32_t rxdrqout;	/* # of times out of DRQs */
	uint32_t rxmbufout;	/* # of time out of mbufs */
	uint32_t txnomap;	/* out of DMA maps in TX */
};

/*
 * Each of these structures describes one of the eight transmit channels
 */
struct en_txslot {
	uint32_t	mbsize;		/* # mbuf bytes in use (max=TXHIWAT) */
	uint32_t	bfree;		/* # free bytes in buffer */
	uint32_t	start;		/* start of buffer area (byte offset) */
	uint32_t	stop;		/* ends of buffer area (byte offset) */
	uint32_t	cur;		/* next free area (byte offset) */
	uint32_t	nref;		/* # of VCs using this channel */
	struct ifqueue	q;		/* mbufs waiting for DMA now */
	struct ifqueue	indma;		/* mbufs waiting for DMA now */
};

/*
 * Each of these structures is used for each of the receive buffers on the
 * card.
 */
struct en_rxslot {
	uint32_t	mode;		/* saved copy of mode info */
	uint32_t	start;		/* begin of my buffer area */
	uint32_t	stop;		/* end of my buffer area */
	uint32_t	cur;		/* where I am at in the buffer */
	struct en_vcc	*vcc;		/* backpointer to VCI */
	struct ifqueue	q;		/* mbufs waiting for dma now */
	struct ifqueue	indma;		/* mbufs being dma'd now */
};

struct en_vcc {
	struct atmio_vcc vcc;		/* required by common code */
	void		*rxhand;
	uint		vflags;
	uint32_t	ipackets;
	uint32_t	opackets;
	uint32_t	ibytes;
	uint32_t	obytes;

	uint8_t		txspeed;
	struct en_txslot *txslot;	/* transmit slot */
	struct en_rxslot *rxslot;	/* receive slot */
};
#define	VCC_DRAIN	0x0001		/* closed, but draining rx */
#define	VCC_SWSL	0x0002		/* on rx software service list */
#define	VCC_CLOSE_RX	0x0004		/* currently closing */
#define	VCC_ASYNC	0x0008		/* async close */

/*
 * softc
 */
struct en_softc {
	/* bsd glue */
	struct ifatm	ifatm;		/* ATM network ifnet handle */
	device_t dev;

	/* bus glue */
	bus_space_tag_t en_memt;	/* for EN_READ/EN_WRITE */
	bus_space_handle_t en_base;	/* base of en card */
	bus_size_t en_obmemsz;		/* size of en card (bytes) */
	void (*en_busreset)(void *);	/* bus specific reset function */
	bus_dma_tag_t txtag;		/* TX DMA tag */

	/* serv list */
	uint32_t hwslistp;	/* hw pointer to service list (byte offset) */
	uint16_t swslist[MID_SL_N]; /* software svc list (see en_service()) */
	uint16_t swsl_head; 	/* ends of swslist (index into swslist) */
	uint16_t swsl_tail;
	uint32_t swsl_size;	/* # of items in swsl */

	/* xmit dma */
	uint32_t dtq[MID_DTQ_N];/* sw copy of dma q (see EN_DQ_MK macros) */
	uint32_t dtq_free;	/* # of dtq's free */
	uint32_t dtq_us;	/* software copy of our pointer (byte offset) */
	uint32_t dtq_chip;	/* chip's pointer (byte offset) */
	uint32_t need_dtqs;	/* true if we ran out of DTQs */

	/* recv dma */
	uint32_t drq[MID_DRQ_N];/* sw copy of dma q (see ENIDQ macros) */
	uint32_t drq_free;	/* # of drq's free */
	uint32_t drq_us;	/* software copy of our pointer (byte offset) */
	uint32_t drq_chip;	/* chip's pointer (byte offset) */
	uint32_t need_drqs;	/* true if we ran out of DRQs */

	/* xmit buf ctrl. (per channel) */
	struct en_txslot txslot[MID_NTX_CH];

	/* recv buf ctrl. (per recv slot) */
	struct en_rxslot rxslot[EN_MAXNRX];
	int en_nrx;			/* # of active rx slots */

	/* vccs */
	struct en_vcc **vccs;
	u_int vccs_open;
	struct cv cv_close;		/* close CV */

	/* stats */
	struct en_stats stats;

	/* random stuff */
	uint32_t ipl;		/* sbus interrupt lvl (1 on pci?) */
	uint8_t bestburstcode;	/* code of best burst we can use */
	uint8_t bestburstlen;	/* length of best burst (bytes) */
	uint8_t bestburstshift;	/* (x >> shift) == (x / bestburstlen) */
	uint8_t bestburstmask;	/* bits to check if not multiple of burst */
	uint8_t alburst;	/* align dma bursts? */
	uint8_t noalbursts;	/* don't use unaligned > 4 byte bursts */
	uint8_t is_adaptec;	/* adaptec version of midway? */
	struct mbuf *padbuf;	/* buffer of zeros for TX padding */

	/* mutex to protect this structure and the associated hardware */
	struct mtx en_mtx;

	/* sysctl support */
	struct sysctl_ctx_list sysctl_ctx;
	struct sysctl_oid *sysctl_tree;

	/* memory zones */
	uma_zone_t map_zone;

	/* media and phy */
	struct ifmedia media;
	struct utopia utopia;

#ifdef EN_DEBUG
	/* debugging */
	u_int debug;
#endif
};

/*
 * exported functions
 */
int	en_attach(struct en_softc *);
void	en_destroy(struct en_softc *);
void	en_intr(void *);
void	en_reset(struct en_softc *);
int	en_modevent(module_t, int, void *arg);
OpenPOWER on IntegriCloud