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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
|
/* $OpenBSD: i82596var.h,v 1.9 2002/10/13 14:21:49 mickey Exp $ */
/* $NetBSD: i82586var.h,v 1.10 1998/08/15 04:42:42 mycroft Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Paul Kranenburg and Charles M. Hannum.
*
* 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 the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION OR CONTRIBUTORS
* 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.
*/
/*-
* 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 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/82596 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 I82596_DEBUG */
/* Debug elements */
#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_CMDS 0x80
#define IED_ALL 0xff
#define B_PER_F 6 /* recv buffers per frame */
#define IE_RBUF_SIZE 256 /* size of each receive buffer;
MUST BE POWER OF TWO */
#define NTXBUF 4 /* number of transmit commands */
#define IE_TBUF_SIZE ETHER_MAX_LEN /* length of transmit buffer */
#define IE_MAXMCAST (IE_TBUF_SIZE/6)/* must fit in transmit buffer */
#define IE_INTR_ENRCV 1 /* receive pkt interrupt */
#define IE_INTR_ENSND 2 /* send pkt interrupt */
#define IE_INTR_LOOP 3 /* a loop for next one*/
#define IE_INTR_EXIT 4 /* done w/ interrupts */
#define IE_CHIP_PROBE 0 /* reset called from chip probe */
#define IE_CARD_RESET 1 /* reset called from card reset */
#define IE_PORT_RESET 0
#define IE_PORT_TEST 1
#define IE_PORT_SCP 2
#define IE_PORT_DUMP 3
/*
* Ethernet status, per interface.
*
* The chip uses two types of pointers: 16 bit and 24 bit
* 24 bit pointers cover the board's memory.
* 16 bit pointers are offsets from the ISCP's `ie_base'
*
* The board's memory is represented by the bus handle `bh'. The MI
* i82586/596 driver deals exclusively with offsets relative to the
* board memory bus handle. The `ie_softc' fields below that are marked
* `MD' are in the domain of the front-end driver; they opaque to the
* MI driver part.
*
* The front-end is required to manage the SCP and ISCP structures. i.e.
* allocate room for them on the board's memory, and arrange to point the
* chip at the SCB stucture, the offset of which is passed to the MI
* driver in `sc_scb'.
*
* The following functions provide the glue necessary to deal with
* host and bus idiosyncracies:
*
* hwreset - board reset
* hwinit - board initialization
* chan_attn - get chip to look at prepared commands
* intrhook - board dependent interrupt processing
*
* All of the following shared-memory access function use an offset
* relative to the bus handle to indicate the shared memory location.
* The bus_{read/write}N function take or return offset into the
* shared memory in the host's byte-order.
*
* memcopyin - copy device memory: board to KVA
* memcopyout - copy device memory: KVA to board
* bus_read16 - read a 16-bit i82586 pointer
`offset' argument will be 16-bit aligned
* bus_write16 - write a 16-bit i82586 pointer
`offset' argument will be 16-bit aligned
* bus_write24 - write a 24-bit i82586 pointer
`offset' argument will be 32-bit aligned
*
*/
struct ie_softc {
struct device sc_dev; /* device structure */
void *sc_ih;
bus_space_tag_t iot; /* bus-space tag of card registers */
bus_space_handle_t ioh; /* bus-space handle of card registers */
bus_space_tag_t bt; /* bus-space tag of card memory */
bus_space_handle_t bh; /* bus-space handle of card memory */
const char *sc_type; /* (MD) hardware type */
int sc_vers; /* (MD) hardvare version */
int sc_irq; /* (MD) irq in md format */
void *sc_iobase; /* (MD) KVA of base of 24 bit addr space */
u_long sc_maddr; /* (MD) base of chip's RAM (16bit addr space) */
u_int sc_msize; /* (MD) how much RAM we have/use */
u_int sc_flags; /* (MI/MD) flags */
#define IEMD_FLAG0 0x00010000
#define IEMD_FLAG1 0x00020000
#define IEMD_FLAG2 0x00040000
#define IEMD_FLAG3 0x00080000
#define IEMD_FLAG4 0x00100000
#define IEMD_FLAG5 0x00200000
#define IEMD_FLAG6 0x00400000
#define IEMD_FLAG7 0x00800000
struct arpcom sc_arpcom; /* system ethercom structure */
struct ifmedia sc_media; /* supported media information */
/* Bus glue */
void (*hwreset)(struct ie_softc *, int);
void (*hwinit)(struct ie_softc *);
void (*chan_attn)(struct ie_softc *);
void (*port)(struct ie_softc *, u_int);
int (*intrhook)(struct ie_softc *, int where);
void (*memcopyin)(struct ie_softc *, void *, int, size_t);
void (*memcopyout)(struct ie_softc *, const void *,
int, size_t);
u_int16_t (*ie_bus_read16)(struct ie_softc *, int offset);
void (*ie_bus_write16)(struct ie_softc *, int offset,
u_int16_t value);
void (*ie_bus_write24)(struct ie_softc *, int offset,
int addr);
/* Media management */
int (*sc_mediachange)(struct ie_softc *);
/* card dependent media change */
void (*sc_mediastatus)(struct ie_softc *, struct ifmediareq *);
/* card dependent media status */
/*
* Offsets (relative to bus handle) of the i82586 SYSTEM structures.
*/
int scp; /* Offset to the SCP (set by front-end) */
int iscp; /* Offset to the ISCP (set by front-end) */
int scb; /* Offset to SCB (set by front-end) */
/*
* Offset and size of a block of board memory where the buffers
* are to be allocated from (initialized by front-end).
*/
int buf_area; /* Start of descriptors and buffers */
int buf_area_sz; /* Size of above */
/* SYSBUS byte */
int sysbus;
/*
* The buffers & descriptors (recv and xmit)
*/
int rframes; /* Offset to `nrxbuf' frame descriptors */
int rbds; /* Offset to `nrxbuf' buffer descriptors */
int rbufs; /* Offset to `nrxbuf' receive buffers */
#define IE_RBUF_ADDR(sc, i) (sc->rbufs + ((i) * IE_RBUF_SIZE))
int rfhead, rftail;
int rbhead, rbtail;
int nframes; /* number of frames in use */
int nrxbuf; /* number of recv buffs in use */
int rnr_expect; /* XXX - expect a RCVR not ready interrupt */
int nop_cmds; /* Offset to NTXBUF no-op commands */
int xmit_cmds; /* Offset to NTXBUF transmit commands */
int xbds; /* Offset to NTXBUF buffer descriptors */
int xbufs; /* Offset to NTXBUF transmit buffers */
#define IE_XBUF_ADDR(sc, i) (sc->xbufs + ((i) * IE_TBUF_SIZE))
int xchead, xctail;
int xmit_busy;
int do_xmitnopchain; /* Controls use of xmit NOP chains */
/* Multicast addresses */
char *mcast_addrs; /* Current MC filter addresses */
int mcast_addrs_size; /* Current size of MC buffer */
int mcast_count; /* Current # of addrs in buffer */
int want_mcsetup; /* run mcsetup at next opportunity */
int promisc; /* are we in promisc mode? */
int async_cmd_inprogress; /* we didn't wait for 586 to accept
a command */
#ifdef I82596_DEBUG
int sc_debug;
#endif
};
/* Exported functions */
int i82596_intr(void *);
int i82596_probe(struct ie_softc *);
int i82596_proberam(struct ie_softc *);
void i82596_attach(struct ie_softc *, const char *, u_int8_t *,
int *, int, int);
int i82596_start_cmd(struct ie_softc *, int, int, int, int);
/*
* Interrupt Acknowledge.
*/
static __inline__ void
ie_ack(struct ie_softc *sc, u_int mask) /* in native byte-order */
{
register u_int status;
bus_space_barrier(sc->bt, sc->bh, 0, 0, BUS_SPACE_BARRIER_READ);
status = (sc->ie_bus_read16)(sc, IE_SCB_STATUS(sc->scb));
i82596_start_cmd(sc, status & mask, 0, 0, 0);
}
|