Annotation of sys/arch/vax/if/if_le.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: if_le.c,v 1.13 2005/07/02 09:28:40 miod Exp $ */
2: /* $NetBSD: if_le.c,v 1.14 1999/08/14 18:40:23 ragge Exp $ */
3:
4: /*-
5: * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
6: * All rights reserved.
7: *
8: * This code is derived from software contributed to The NetBSD Foundation
9: * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace
10: * Simulation Facility, NASA Ames Research Center.
11: *
12: * Redistribution and use in source and binary forms, with or without
13: * modification, are permitted provided that the following conditions
14: * are met:
15: * 1. Redistributions of source code must retain the above copyright
16: * notice, this list of conditions and the following disclaimer.
17: * 2. Redistributions in binary form must reproduce the above copyright
18: * notice, this list of conditions and the following disclaimer in the
19: * documentation and/or other materials provided with the distribution.
20: * 3. All advertising materials mentioning features or use of this software
21: * must display the following acknowledgement:
22: * This product includes software developed by the NetBSD
23: * Foundation, Inc. and its contributors.
24: * 4. Neither the name of The NetBSD Foundation nor the names of its
25: * contributors may be used to endorse or promote products derived
26: * from this software without specific prior written permission.
27: *
28: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
29: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
30: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
32: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38: * POSSIBILITY OF SUCH DAMAGE.
39: */
40:
41: /*-
42: * Copyright (c) 1992, 1993
43: * The Regents of the University of California. All rights reserved.
44: *
45: * This code is derived from software contributed to Berkeley by
46: * Ralph Campbell and Rick Macklem.
47: *
48: * Redistribution and use in source and binary forms, with or without
49: * modification, are permitted provided that the following conditions
50: * are met:
51: * 1. Redistributions of source code must retain the above copyright
52: * notice, this list of conditions and the following disclaimer.
53: * 2. Redistributions in binary form must reproduce the above copyright
54: * notice, this list of conditions and the following disclaimer in the
55: * documentation and/or other materials provided with the distribution.
56: * 3. Neither the name of the University nor the names of its contributors
57: * may be used to endorse or promote products derived from this software
58: * without specific prior written permission.
59: *
60: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
61: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
62: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
63: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
64: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
65: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
66: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
67: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
68: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
69: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
70: * SUCH DAMAGE.
71: *
72: * @(#)if_le.c 8.2 (Berkeley) 11/16/93
73: */
74:
75: #include "bpfilter.h"
76:
77: #include <sys/param.h>
78: #include <sys/syslog.h>
79: #include <sys/socket.h>
80: #include <sys/device.h>
81: #include <sys/reboot.h>
82:
83: #include <uvm/uvm_extern.h>
84:
85: #include <net/if.h>
86: #include <net/if_media.h>
87:
88: #if INET
89: #include <netinet/in.h>
90: #endif
91: #include <netinet/if_ether.h>
92:
93: #include <machine/cpu.h>
94: #include <machine/nexus.h>
95: #include <machine/rpb.h>
96: #include <machine/scb.h>
97:
98: #include <dev/ic/am7990reg.h>
99: #include <dev/ic/am7990var.h>
100:
101: #define ETHER_MIN_LEN 64 /* minimum frame length, including CRC */
102: #define LEVEC 0xd4 /* Interrupt vector on 3300/3400 */
103:
104: struct le_softc {
105: struct am7990_softc sc_am7990; /* Must be first */
106: struct evcount sc_intrcnt;
107: int sc_vec;
108: volatile u_short *sc_rap;
109: volatile u_short *sc_rdp;
110: };
111:
112: int le_ibus_match(struct device *, void *, void *);
113: void le_ibus_attach(struct device *, struct device *, void *);
114: void lewrcsr(struct am7990_softc *, u_int16_t, u_int16_t);
115: u_int16_t lerdcsr(struct am7990_softc *, u_int16_t);
116: void lance_copytobuf_gap2(struct am7990_softc *, void *, int, int);
117: void lance_copyfrombuf_gap2(struct am7990_softc *, void *, int, int);
118: void lance_zerobuf_gap2(struct am7990_softc *, int, int);
119:
120: struct cfattach le_ibus_ca = {
121: sizeof(struct le_softc), le_ibus_match, le_ibus_attach
122: };
123:
124: void
125: lewrcsr(ls, port, val)
126: struct am7990_softc *ls;
127: u_int16_t port, val;
128: {
129: struct le_softc *sc = (void *)ls;
130:
131: *sc->sc_rap = port;
132: *sc->sc_rdp = val;
133: }
134:
135: u_int16_t
136: lerdcsr(ls, port)
137: struct am7990_softc *ls;
138: u_int16_t port;
139: {
140: struct le_softc *sc = (void *)ls;
141:
142: *sc->sc_rap = port;
143: return *sc->sc_rdp;
144: }
145:
146: int
147: le_ibus_match(parent, cf, aux)
148: struct device *parent;
149: void *cf;
150: void *aux;
151: {
152: struct bp_conf *bp = aux;
153:
154: if (strcmp("lance", bp->type))
155: return 0;
156: return 1;
157: }
158:
159: void
160: le_ibus_attach(parent, self, aux)
161: struct device *parent, *self;
162: void *aux;
163: {
164: struct le_softc *sc = (void *)self;
165: int *lance_addr;
166: int i, br;
167:
168: sc->sc_rdp = (short *)vax_map_physmem(0x20084400, 1);
169: sc->sc_rap = sc->sc_rdp + 2;
170:
171: /*
172: * Set interrupt vector, by forcing an interrupt.
173: */
174: scb_vecref(0, 0); /* Clear vector ref */
175: *sc->sc_rap = LE_CSR0;
176: *sc->sc_rdp = LE_C0_STOP;
177: DELAY(100);
178: *sc->sc_rdp = LE_C0_INIT|LE_C0_INEA;
179: DELAY(100000);
180: i = scb_vecref(&sc->sc_vec, &br);
181: if (i == 0 || sc->sc_vec == 0)
182: return;
183: scb_vecalloc(sc->sc_vec, (void *)am7990_intr, sc,
184: SCB_ISTACK, &sc->sc_intrcnt);
185: evcount_attach(&sc->sc_intrcnt, self->dv_xname,
186: (void *)&sc->sc_vec, &evcount_intr);
187:
188: printf(": vec %d ipl %x\n%s", sc->sc_vec, br, self->dv_xname);
189: /*
190: * MD functions.
191: */
192: sc->sc_am7990.sc_rdcsr = lerdcsr;
193: sc->sc_am7990.sc_wrcsr = lewrcsr;
194: sc->sc_am7990.sc_nocarrier = NULL;
195:
196: sc->sc_am7990.sc_mem =
197: (void *)uvm_km_valloc(kernel_map, (128 * 1024));
198: if (sc->sc_am7990.sc_mem == 0)
199: return;
200:
201: ioaccess((vaddr_t)sc->sc_am7990.sc_mem, 0x20120000,
202: (128 * 1024) >> VAX_PGSHIFT);
203:
204:
205: sc->sc_am7990.sc_addr = 0;
206: sc->sc_am7990.sc_memsize = (64 * 1024);
207:
208: sc->sc_am7990.sc_copytodesc = lance_copytobuf_gap2;
209: sc->sc_am7990.sc_copyfromdesc = lance_copyfrombuf_gap2;
210: sc->sc_am7990.sc_copytobuf = lance_copytobuf_gap2;
211: sc->sc_am7990.sc_copyfrombuf = lance_copyfrombuf_gap2;
212: sc->sc_am7990.sc_zerobuf = lance_zerobuf_gap2;
213:
214: /*
215: * Get the ethernet address out of rom
216: */
217: lance_addr = (int *)vax_map_physmem(0x20084200, 1);
218: for (i = 0; i < 6; i++)
219: sc->sc_am7990.sc_arpcom.ac_enaddr[i] = (u_char)lance_addr[i];
220: vax_unmap_physmem((vaddr_t)lance_addr, 1);
221:
222: bcopy(self->dv_xname, sc->sc_am7990.sc_arpcom.ac_if.if_xname,
223: IFNAMSIZ);
224: am7990_config(&sc->sc_am7990);
225: }
226:
227: /*
228: * gap2: two bytes of data followed by two bytes of pad.
229: *
230: * Buffers must be 4-byte aligned. The code doesn't worry about
231: * doing an extra byte.
232: */
233:
234: void
235: lance_copytobuf_gap2(sc, fromv, boff, len)
236: struct am7990_softc *sc;
237: void *fromv;
238: int boff;
239: register int len;
240: {
241: volatile caddr_t buf = sc->sc_mem;
242: register caddr_t from = fromv;
243: register volatile u_int16_t *bptr;
244:
245: if (boff & 0x1) {
246: /* handle unaligned first byte */
247: bptr = ((volatile u_int16_t *)buf) + (boff - 1);
248: *bptr = (*from++ << 8) | (*bptr & 0xff);
249: bptr += 2;
250: len--;
251: } else
252: bptr = ((volatile u_int16_t *)buf) + boff;
253: while (len > 1) {
254: *bptr = (from[1] << 8) | (from[0] & 0xff);
255: bptr += 2;
256: from += 2;
257: len -= 2;
258: }
259: if (len == 1)
260: *bptr = (u_int16_t)*from;
261: }
262:
263: void
264: lance_copyfrombuf_gap2(sc, tov, boff, len)
265: struct am7990_softc *sc;
266: void *tov;
267: int boff, len;
268: {
269: volatile caddr_t buf = sc->sc_mem;
270: register caddr_t to = tov;
271: register volatile u_int16_t *bptr;
272: register u_int16_t tmp;
273:
274: if (boff & 0x1) {
275: /* handle unaligned first byte */
276: bptr = ((volatile u_int16_t *)buf) + (boff - 1);
277: *to++ = (*bptr >> 8) & 0xff;
278: bptr += 2;
279: len--;
280: } else
281: bptr = ((volatile u_int16_t *)buf) + boff;
282: while (len > 1) {
283: tmp = *bptr;
284: *to++ = tmp & 0xff;
285: *to++ = (tmp >> 8) & 0xff;
286: bptr += 2;
287: len -= 2;
288: }
289: if (len == 1)
290: *to = *bptr & 0xff;
291: }
292:
293: void
294: lance_zerobuf_gap2(sc, boff, len)
295: struct am7990_softc *sc;
296: int boff, len;
297: {
298: volatile caddr_t buf = sc->sc_mem;
299: register volatile u_int16_t *bptr;
300:
301: if ((unsigned)boff & 0x1) {
302: bptr = ((volatile u_int16_t *)buf) + (boff - 1);
303: *bptr &= 0xff;
304: bptr += 2;
305: len--;
306: } else
307: bptr = ((volatile u_int16_t *)buf) + boff;
308: while (len > 0) {
309: *bptr = 0;
310: bptr += 2;
311: len -= 2;
312: }
313: }
CVSweb