if_ie_sebuf.c revision 1.1 1 /* $NetBSD: if_ie_sebuf.c,v 1.1 1997/10/17 03:39:44 gwr Exp $ */
2
3 /*-
4 * Copyright (c) 1996 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Gordon W. Ross.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the NetBSD
21 * Foundation, Inc. and its contributors.
22 * 4. Neither the name of The NetBSD Foundation nor the names of its
23 * contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39 /*
40 * Machine-dependent glue for the Intel Ethernet (ie) driver,
41 * as found on the Sun3/E SCSI/Ethernet board.
42 */
43
44 #include <sys/param.h>
45 #include <sys/systm.h>
46 #include <sys/device.h>
47 #include <sys/protosw.h>
48 #include <sys/socket.h>
49 #include <net/if.h>
50 #include <net/if_ether.h>
51
52 #ifdef INET
53 #include <netinet/in.h>
54 #include <netinet/in_systm.h>
55 #include <netinet/in_var.h>
56 #include <netinet/ip.h>
57 #include <netinet/if_inarp.h>
58 #endif
59
60 #include <machine/autoconf.h>
61 #include <machine/cpu.h>
62 #include <machine/dvma.h>
63 #include <machine/idprom.h>
64 #include <machine/vmparam.h>
65
66 #include "i82586.h"
67 #include "if_iereg.h"
68 #include "if_ievar.h"
69 #include "sereg.h"
70 #include "sevar.h"
71
72 static void ie_sebuf_reset __P((struct ie_softc *));
73 static void ie_sebuf_attend __P((struct ie_softc *));
74 static void ie_sebuf_run __P((struct ie_softc *));
75
76 /*
77 * New-style autoconfig attachment
78 */
79
80 static int ie_sebuf_match __P((struct device *, struct cfdata *, void *));
81 static void ie_sebuf_attach __P((struct device *, struct device *, void *));
82
83 struct cfattach ie_sebuf_ca = {
84 sizeof(struct ie_softc), ie_sebuf_match, ie_sebuf_attach
85 };
86
87
88 static int
89 ie_sebuf_match(parent, cf, args)
90 struct device *parent;
91 struct cfdata *cf;
92 void *args;
93 {
94 struct sebuf_attach_args *aa = args;
95
96 /* Match by name. */
97 if (strcmp(aa->name, "ie"))
98 return (0);
99
100 /* Force same unit number as parent. */
101 if (parent->dv_unit != cf->cf_unit)
102 return (0);
103
104 return (1);
105 }
106
107 static void
108 ie_sebuf_attach(parent, self, args)
109 struct device *parent;
110 struct device *self;
111 void *args;
112 {
113 struct ie_softc *sc = (void *) self;
114 struct sebuf_attach_args *aa = args;
115 volatile struct ie_regs *regs;
116 int off;
117
118 sc->hard_type = IE_VME3E;
119 sc->reset_586 = ie_sebuf_reset;
120 sc->chan_attn = ie_sebuf_attend;
121 sc->run_586 = ie_sebuf_run;
122 sc->sc_bcopy = bcopy;
123 sc->sc_bzero = bzero;
124
125 /*
126 * Note: the NCR registers occupy the first 32 bytes
127 * of space before the buffer pointer passed to us.
128 * The Ethernet chip actually address space actually
129 * starts _on_top_of_ those 32 bytes. Otherwise the
130 * addressing is a simple 16-bit implementation.
131 */
132 sc->sc_iobase = aa->buf - sizeof(struct se_regs);
133 sc->sc_maddr = aa->buf;
134 sc->sc_msize = aa->blen;
135 sc->sc_reg = aa->regs;
136 regs = (volatile struct ie_regs *) sc->sc_reg;
137
138 /* Clear the memory. */
139 (sc->sc_bzero)(sc->sc_maddr, sc->sc_msize);
140
141 /*
142 * Set the System Configuration Pointer (SCP).
143 * Its location is system-dependent because the
144 * i82586 reads it from a fixed physical address.
145 * On this hardware, the i82586 address is just
146 * masked down to 16 bits, so the SCP is found
147 * at the end of the RAM on the VME board.
148 */
149 off = IE_SCP_ADDR & 0xFFFF;
150 sc->scp = (volatile void *) (sc->sc_iobase + off);
151
152 /*
153 * The rest of ram is used for buffers, etc.
154 */
155 sc->buf_area = sc->sc_maddr;
156 sc->buf_area_sz = sc->sc_msize;
157
158 /* Set the ethernet address. */
159 idprom_etheraddr(sc->sc_addr);
160
161 /* Install interrupt handler. */
162 regs->ie_ivec = aa->ca.ca_intvec;
163 isr_add_vectored(ie_intr, (void *)sc,
164 aa->ca.ca_intpri, aa->ca.ca_intvec);
165
166 /* Do machine-independent parts of attach. */
167 ie_attach(sc);
168
169 }
170
171
172 /*
173 * MULTIBUS/VME support
174 */
175 void
176 ie_sebuf_reset(sc)
177 struct ie_softc *sc;
178 {
179 volatile struct ie_regs *regs = (struct ie_regs *) sc->sc_reg;
180 regs->ie_csr = IE_CSR_RESET;
181 delay(10);
182 regs->ie_csr = 0;
183 }
184
185 void
186 ie_sebuf_attend(sc)
187 struct ie_softc *sc;
188 {
189 volatile struct ie_regs *regs = (struct ie_regs *) sc->sc_reg;
190
191 regs->ie_csr |= IE_CSR_ATTEN; /* flag! */
192 regs->ie_csr &= ~IE_CSR_ATTEN; /* down. */
193 }
194
195 void
196 ie_sebuf_run(sc)
197 struct ie_softc *sc;
198 {
199 volatile struct ie_regs *regs = (struct ie_regs *) sc->sc_reg;
200
201 regs->ie_csr |= IE_CSR_IENAB;
202 }
203