if_we_vme.c revision 1.2.4.2 1 1.2.4.2 yamt /* $NetBSD: if_we_vme.c,v 1.2.4.2 2010/08/11 22:51:47 yamt Exp $ */
2 1.2.4.2 yamt
3 1.2.4.2 yamt /*-
4 1.2.4.2 yamt * Copyright (c) 1997, 1998, 2010 The NetBSD Foundation, Inc.
5 1.2.4.2 yamt * All rights reserved.
6 1.2.4.2 yamt *
7 1.2.4.2 yamt * This code is derived from software contributed to The NetBSD Foundation
8 1.2.4.2 yamt * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9 1.2.4.2 yamt * NASA Ames Research Center.
10 1.2.4.2 yamt *
11 1.2.4.2 yamt * Redistribution and use in source and binary forms, with or without
12 1.2.4.2 yamt * modification, are permitted provided that the following conditions
13 1.2.4.2 yamt * are met:
14 1.2.4.2 yamt * 1. Redistributions of source code must retain the above copyright
15 1.2.4.2 yamt * notice, this list of conditions and the following disclaimer.
16 1.2.4.2 yamt * 2. Redistributions in binary form must reproduce the above copyright
17 1.2.4.2 yamt * notice, this list of conditions and the following disclaimer in the
18 1.2.4.2 yamt * documentation and/or other materials provided with the distribution.
19 1.2.4.2 yamt *
20 1.2.4.2 yamt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21 1.2.4.2 yamt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 1.2.4.2 yamt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 1.2.4.2 yamt * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24 1.2.4.2 yamt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 1.2.4.2 yamt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 1.2.4.2 yamt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 1.2.4.2 yamt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 1.2.4.2 yamt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 1.2.4.2 yamt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 1.2.4.2 yamt * POSSIBILITY OF SUCH DAMAGE.
31 1.2.4.2 yamt */
32 1.2.4.2 yamt
33 1.2.4.2 yamt /*
34 1.2.4.2 yamt * Device driver for National Semiconductor DS8390/WD83C690 based ethernet
35 1.2.4.2 yamt * adapters.
36 1.2.4.2 yamt *
37 1.2.4.2 yamt * Copyright (c) 1994, 1995 Charles M. Hannum. All rights reserved.
38 1.2.4.2 yamt *
39 1.2.4.2 yamt * Copyright (C) 1993, David Greenman. This software may be used, modified,
40 1.2.4.2 yamt * copied, distributed, and sold, in both source and binary form provided that
41 1.2.4.2 yamt * the above copyright and these terms are retained. Under no circumstances is
42 1.2.4.2 yamt * the author responsible for the proper functioning of this software, nor does
43 1.2.4.2 yamt * the author assume any responsibility for damages incurred with its use.
44 1.2.4.2 yamt */
45 1.2.4.2 yamt
46 1.2.4.2 yamt /*
47 1.2.4.2 yamt * Device driver for the SMC Elite Ultra (8216) with SMC_TT VME-ISA bridge.
48 1.2.4.2 yamt * Based on:
49 1.2.4.2 yamt * NetBSD: if_we_isa.c,v 1.20 2008/04/28 20:23:52 martin Exp
50 1.2.4.2 yamt */
51 1.2.4.2 yamt
52 1.2.4.2 yamt #include <sys/cdefs.h>
53 1.2.4.2 yamt __KERNEL_RCSID(0, "$NetBSD: if_we_vme.c,v 1.2.4.2 2010/08/11 22:51:47 yamt Exp $");
54 1.2.4.2 yamt
55 1.2.4.2 yamt #include <sys/param.h>
56 1.2.4.2 yamt #include <sys/systm.h>
57 1.2.4.2 yamt #include <sys/device.h>
58 1.2.4.2 yamt #include <sys/socket.h>
59 1.2.4.2 yamt #include <sys/mbuf.h>
60 1.2.4.2 yamt #include <sys/syslog.h>
61 1.2.4.2 yamt
62 1.2.4.2 yamt #include <net/if.h>
63 1.2.4.2 yamt #include <net/if_dl.h>
64 1.2.4.2 yamt #include <net/if_types.h>
65 1.2.4.2 yamt #include <net/if_media.h>
66 1.2.4.2 yamt
67 1.2.4.2 yamt #include <net/if_ether.h>
68 1.2.4.2 yamt
69 1.2.4.2 yamt #include <sys/bus.h>
70 1.2.4.2 yamt #include <sys/intr.h>
71 1.2.4.2 yamt
72 1.2.4.2 yamt #include <machine/cpu.h>
73 1.2.4.2 yamt #include <machine/iomap.h>
74 1.2.4.2 yamt #include <machine/scu.h>
75 1.2.4.2 yamt
76 1.2.4.2 yamt #include <atari/vme/vmevar.h>
77 1.2.4.2 yamt
78 1.2.4.2 yamt #include <dev/ic/dp8390reg.h>
79 1.2.4.2 yamt #include <dev/ic/dp8390var.h>
80 1.2.4.2 yamt #include <dev/ic/wereg.h>
81 1.2.4.2 yamt #include <dev/ic/wevar.h>
82 1.2.4.2 yamt
83 1.2.4.2 yamt /* #define WE_DEBUG */
84 1.2.4.2 yamt #ifdef WE_DEBUG
85 1.2.4.2 yamt #define DPRINTF(x) printf x
86 1.2.4.2 yamt #else
87 1.2.4.2 yamt #define DPRINTF(x) /**/
88 1.2.4.2 yamt #endif
89 1.2.4.2 yamt
90 1.2.4.2 yamt /* VME space mapped by SMC_TT VME-ISA bridge */
91 1.2.4.2 yamt #define SMCTT_MEM_BASE 0xFE000000 /* base for shared memory space */
92 1.2.4.2 yamt #define SMCTT_IOE_BASE 0xFE200000 /* base for I/O ports at even address */
93 1.2.4.2 yamt #define SMCTT_IOO_BASE 0xFE300000 /* base for I/O ports at odd address */
94 1.2.4.2 yamt
95 1.2.4.2 yamt #define SMCTT_IO_OFFSET (SMCTT_IOO_BASE - SMCTT_IOE_BASE)
96 1.2.4.2 yamt
97 1.2.4.2 yamt /* default SMC8216 settings for SMC_TT specified by a jumper switch at No.2 */
98 1.2.4.2 yamt #define SMCTT_MEM_ADDR 0xD0000
99 1.2.4.2 yamt #define SMCTT_IO_ADDR 0x280
100 1.2.4.2 yamt
101 1.2.4.2 yamt /* SMC_TT uses IRQ4 on VME, IRQ3 on ISA, and interrupt vector 0xAA */
102 1.2.4.2 yamt #define SMCTT_VME_IRQ 4
103 1.2.4.2 yamt #define SMCTT_ISA_IRQ 3
104 1.2.4.2 yamt #define SMCTT_VECTOR 0xAA
105 1.2.4.2 yamt
106 1.2.4.2 yamt static int we_vme_probe(device_t, cfdata_t , void *);
107 1.2.4.2 yamt static void we_vme_attach(device_t, device_t, void *);
108 1.2.4.2 yamt
109 1.2.4.2 yamt static uint8_t smctt_bus_space_read_1(bus_space_tag_t, bus_space_handle_t,
110 1.2.4.2 yamt bus_size_t);
111 1.2.4.2 yamt static void smctt_bus_space_write_1(bus_space_tag_t, bus_space_handle_t,
112 1.2.4.2 yamt bus_size_t, uint8_t);
113 1.2.4.2 yamt static int smctt_bus_space_peek_1(bus_space_tag_t, bus_space_handle_t,
114 1.2.4.2 yamt bus_size_t);
115 1.2.4.2 yamt
116 1.2.4.2 yamt struct we_vme_softc {
117 1.2.4.2 yamt struct we_softc sc_we;
118 1.2.4.2 yamt struct atari_bus_space sc_bs;
119 1.2.4.2 yamt };
120 1.2.4.2 yamt
121 1.2.4.2 yamt CFATTACH_DECL_NEW(we_vme, sizeof(struct we_vme_softc),
122 1.2.4.2 yamt we_vme_probe, we_vme_attach, NULL, NULL);
123 1.2.4.2 yamt
124 1.2.4.2 yamt static const int we_790_irq[] = {
125 1.2.4.2 yamt -1, 9, 3, 5, 7, 10, 11, 15,
126 1.2.4.2 yamt };
127 1.2.4.2 yamt
128 1.2.4.2 yamt static int
129 1.2.4.2 yamt we_vme_probe(device_t parent, cfdata_t cf, void *aux)
130 1.2.4.2 yamt {
131 1.2.4.2 yamt struct vme_attach_args *va = aux;
132 1.2.4.2 yamt struct atari_bus_space t;
133 1.2.4.2 yamt bus_space_tag_t asict, memt;
134 1.2.4.2 yamt bus_space_handle_t asich, asich1, memh;
135 1.2.4.2 yamt bus_size_t memsize;
136 1.2.4.2 yamt bool asich_valid, asich1_valid, memh_valid;
137 1.2.4.2 yamt int i, rv;
138 1.2.4.2 yamt uint8_t sum, reg, type, hwr;
139 1.2.4.2 yamt
140 1.2.4.2 yamt rv = 0;
141 1.2.4.2 yamt asich_valid = false;
142 1.2.4.2 yamt asich1_valid = false;
143 1.2.4.2 yamt memh_valid = false;
144 1.2.4.2 yamt
145 1.2.4.2 yamt if (va->va_iobase != IOBASEUNK &&
146 1.2.4.2 yamt va->va_iobase != SMCTT_IOE_BASE + SMCTT_IO_ADDR)
147 1.2.4.2 yamt return 0;
148 1.2.4.2 yamt if (va->va_maddr != IOBASEUNK &&
149 1.2.4.2 yamt va->va_maddr != SMCTT_MEM_BASE + SMCTT_MEM_ADDR)
150 1.2.4.2 yamt return 0;
151 1.2.4.2 yamt if (va->va_irq != IRQUNK &&
152 1.2.4.2 yamt va->va_irq != SMCTT_VME_IRQ)
153 1.2.4.2 yamt return 0;
154 1.2.4.2 yamt
155 1.2.4.2 yamt /* SMC_TT has a bit weird I/O address mappings */
156 1.2.4.2 yamt asict = beb_alloc_bus_space_tag(&t);
157 1.2.4.2 yamt /* XXX setup only simple byte functions used in MI we(4) driver */
158 1.2.4.2 yamt asict->abs_r_1 = smctt_bus_space_read_1;
159 1.2.4.2 yamt asict->abs_w_1 = smctt_bus_space_write_1;
160 1.2.4.2 yamt asict->abs_p_1 = smctt_bus_space_peek_1;
161 1.2.4.2 yamt
162 1.2.4.2 yamt /*
163 1.2.4.2 yamt * Only 16 bit accesses are allowed for memory space on SMC_TT,
164 1.2.4.2 yamt * but MI we(4) uses them on 16 bit mode.
165 1.2.4.2 yamt */
166 1.2.4.2 yamt memt = va->va_memt;
167 1.2.4.2 yamt
168 1.2.4.2 yamt /* Attempt to map the device. */
169 1.2.4.2 yamt if (bus_space_map(asict, SMCTT_IOE_BASE + SMCTT_IO_ADDR, WE_NPORTS,
170 1.2.4.2 yamt 0, &asich) != 0) {
171 1.2.4.2 yamt DPRINTF(("%s: failed to map even I/O space", __func__));
172 1.2.4.2 yamt goto out;
173 1.2.4.2 yamt }
174 1.2.4.2 yamt asich_valid = true;
175 1.2.4.2 yamt
176 1.2.4.2 yamt if (bus_space_map(asict, SMCTT_IOO_BASE + SMCTT_IO_ADDR, WE_NPORTS,
177 1.2.4.2 yamt 0, &asich1) != 0) {
178 1.2.4.2 yamt DPRINTF(("%s: failed to map odd I/O space", __func__));
179 1.2.4.2 yamt goto out;
180 1.2.4.2 yamt }
181 1.2.4.2 yamt asich1_valid = true;
182 1.2.4.2 yamt
183 1.2.4.2 yamt /* XXX abuse stride for offset of odd ports from even ones */
184 1.2.4.2 yamt asict->stride =
185 1.2.4.2 yamt (vaddr_t)bus_space_vaddr(asict, asich1) -
186 1.2.4.2 yamt (vaddr_t)bus_space_vaddr(asict, asich);
187 1.2.4.2 yamt
188 1.2.4.2 yamt /* check if register regions are valid */
189 1.2.4.2 yamt if (bus_space_peek_1(asict, asich, WE_PROM + 0) == 0 ||
190 1.2.4.2 yamt bus_space_peek_1(asict, asich, WE_PROM + 1) == 0)
191 1.2.4.2 yamt goto out;
192 1.2.4.2 yamt
193 1.2.4.2 yamt /*
194 1.2.4.2 yamt * Attempt to do a checksum over the station address PROM.
195 1.2.4.2 yamt * If it fails, it's probably not an SMC_TT board.
196 1.2.4.2 yamt */
197 1.2.4.2 yamt DPRINTF(("%s: WE_PROM: ", __func__));
198 1.2.4.2 yamt sum = 0;
199 1.2.4.2 yamt for (i = 0; i < 8; i++) {
200 1.2.4.2 yamt reg = bus_space_read_1(asict, asich, WE_PROM + i);
201 1.2.4.2 yamt DPRINTF(("%02x ", reg));
202 1.2.4.2 yamt sum += reg;
203 1.2.4.2 yamt }
204 1.2.4.2 yamt DPRINTF(("\n"));
205 1.2.4.2 yamt DPRINTF(("%s: WE_ROM_SUM: 0x%02x\n", __func__, sum));
206 1.2.4.2 yamt
207 1.2.4.2 yamt if (sum != WE_ROM_CHECKSUM_TOTAL)
208 1.2.4.2 yamt goto out;
209 1.2.4.2 yamt
210 1.2.4.2 yamt /*
211 1.2.4.2 yamt * Reset the card to force it into a known state.
212 1.2.4.2 yamt */
213 1.2.4.2 yamt bus_space_write_1(asict, asich, WE_MSR, WE_MSR_RST);
214 1.2.4.2 yamt delay(100);
215 1.2.4.2 yamt
216 1.2.4.2 yamt bus_space_write_1(asict, asich, WE_MSR,
217 1.2.4.2 yamt bus_space_read_1(asict, asich, WE_MSR) & ~WE_MSR_RST);
218 1.2.4.2 yamt
219 1.2.4.2 yamt /* Wait in case the card is reading it's EEPROM. */
220 1.2.4.2 yamt delay(5000);
221 1.2.4.2 yamt
222 1.2.4.2 yamt /*
223 1.2.4.2 yamt * Check card type.
224 1.2.4.2 yamt */
225 1.2.4.2 yamt type = bus_space_read_1(asict, asich, WE_CARD_ID);
226 1.2.4.2 yamt /* Assume SMT_TT has only 8216 */
227 1.2.4.2 yamt if (type != WE_TYPE_SMC8216C && type != WE_TYPE_SMC8216T)
228 1.2.4.2 yamt goto out;
229 1.2.4.2 yamt
230 1.2.4.2 yamt hwr = bus_space_read_1(asict, asich, WE790_HWR);
231 1.2.4.2 yamt bus_space_write_1(asict, asich, WE790_HWR, hwr | WE790_HWR_SWH);
232 1.2.4.2 yamt switch (bus_space_read_1(asict, asich, WE790_RAR) & WE790_RAR_SZ64) {
233 1.2.4.2 yamt case WE790_RAR_SZ64:
234 1.2.4.2 yamt memsize = 65536;
235 1.2.4.2 yamt break;
236 1.2.4.2 yamt case WE790_RAR_SZ32:
237 1.2.4.2 yamt memsize = 32768;
238 1.2.4.2 yamt break;
239 1.2.4.2 yamt case WE790_RAR_SZ16:
240 1.2.4.2 yamt memsize = 16384;
241 1.2.4.2 yamt break;
242 1.2.4.2 yamt case WE790_RAR_SZ8:
243 1.2.4.2 yamt memsize = 8192;
244 1.2.4.2 yamt break;
245 1.2.4.2 yamt default:
246 1.2.4.2 yamt memsize = 16384;
247 1.2.4.2 yamt break;
248 1.2.4.2 yamt }
249 1.2.4.2 yamt bus_space_write_1(asict, asich, WE790_HWR, hwr);
250 1.2.4.2 yamt
251 1.2.4.2 yamt /* Attempt to map the memory space. */
252 1.2.4.2 yamt if (bus_space_map(memt, SMCTT_MEM_BASE + SMCTT_MEM_ADDR, memsize,
253 1.2.4.2 yamt 0, &memh) != 0) {
254 1.2.4.2 yamt DPRINTF(("%s: failed to map shared memory", __func__));
255 1.2.4.2 yamt goto out;
256 1.2.4.2 yamt }
257 1.2.4.2 yamt memh_valid = true;
258 1.2.4.2 yamt
259 1.2.4.2 yamt /* check if memory region is valid */
260 1.2.4.2 yamt if (bus_space_peek_2(memt, memh, 0) == 0)
261 1.2.4.2 yamt goto out;
262 1.2.4.2 yamt
263 1.2.4.2 yamt /*
264 1.2.4.2 yamt * Check the assigned interrupt number from the card.
265 1.2.4.2 yamt */
266 1.2.4.2 yamt
267 1.2.4.2 yamt /* Assemble together the encoded interrupt number. */
268 1.2.4.2 yamt hwr = bus_space_read_1(asict, asich, WE790_HWR);
269 1.2.4.2 yamt bus_space_write_1(asict, asich, WE790_HWR, hwr | WE790_HWR_SWH);
270 1.2.4.2 yamt
271 1.2.4.2 yamt reg = bus_space_read_1(asict, asich, WE790_GCR);
272 1.2.4.2 yamt i = ((reg & WE790_GCR_IR2) >> 4) |
273 1.2.4.2 yamt ((reg & (WE790_GCR_IR1|WE790_GCR_IR0)) >> 2);
274 1.2.4.2 yamt bus_space_write_1(asict, asich, WE790_HWR, hwr & ~WE790_HWR_SWH);
275 1.2.4.2 yamt
276 1.2.4.2 yamt if (we_790_irq[i] != SMCTT_ISA_IRQ) {
277 1.2.4.2 yamt DPRINTF(("%s: wrong IRQ (%d); check jumper settings\n",
278 1.2.4.2 yamt __func__, we_790_irq[i]));
279 1.2.4.2 yamt goto out;
280 1.2.4.2 yamt }
281 1.2.4.2 yamt
282 1.2.4.2 yamt /* So, we say we've found it! */
283 1.2.4.2 yamt va->va_iobase = SMCTT_IOE_BASE + SMCTT_IO_ADDR;
284 1.2.4.2 yamt va->va_iosize = WE_NPORTS;
285 1.2.4.2 yamt va->va_maddr = SMCTT_MEM_BASE + SMCTT_MEM_ADDR;
286 1.2.4.2 yamt va->va_msize = memsize;
287 1.2.4.2 yamt va->va_irq = SMCTT_VME_IRQ;
288 1.2.4.2 yamt
289 1.2.4.2 yamt rv = 1;
290 1.2.4.2 yamt
291 1.2.4.2 yamt out:
292 1.2.4.2 yamt if (asich_valid)
293 1.2.4.2 yamt bus_space_unmap(asict, asich, WE_NPORTS);
294 1.2.4.2 yamt if (asich1_valid)
295 1.2.4.2 yamt bus_space_unmap(asict, asich1, WE_NPORTS);
296 1.2.4.2 yamt if (memh_valid)
297 1.2.4.2 yamt bus_space_unmap(memt, memh, memsize);
298 1.2.4.2 yamt return rv;
299 1.2.4.2 yamt }
300 1.2.4.2 yamt
301 1.2.4.2 yamt void
302 1.2.4.2 yamt we_vme_attach(device_t parent, device_t self, void *aux)
303 1.2.4.2 yamt {
304 1.2.4.2 yamt struct we_vme_softc *wvsc = device_private(self);
305 1.2.4.2 yamt struct we_softc *wsc = &wvsc->sc_we;
306 1.2.4.2 yamt struct dp8390_softc *sc = &wsc->sc_dp8390;
307 1.2.4.2 yamt struct vme_attach_args *va = aux;
308 1.2.4.2 yamt bus_space_tag_t nict, asict, memt;
309 1.2.4.2 yamt bus_space_handle_t nich, asich, asich1, memh;
310 1.2.4.2 yamt const char *typestr;
311 1.2.4.2 yamt
312 1.2.4.2 yamt aprint_normal("\n");
313 1.2.4.2 yamt
314 1.2.4.2 yamt sc->sc_dev = self;
315 1.2.4.2 yamt
316 1.2.4.2 yamt /* See comments in the above probe function */
317 1.2.4.2 yamt asict = beb_alloc_bus_space_tag(&wvsc->sc_bs);
318 1.2.4.2 yamt asict->abs_r_1 = smctt_bus_space_read_1;
319 1.2.4.2 yamt asict->abs_w_1 = smctt_bus_space_write_1;
320 1.2.4.2 yamt nict = asict;
321 1.2.4.2 yamt
322 1.2.4.2 yamt memt = va->va_memt;
323 1.2.4.2 yamt
324 1.2.4.2 yamt /* Map the device. */
325 1.2.4.2 yamt if (bus_space_map(asict, va->va_iobase, WE_NPORTS, 0, &asich) != 0) {
326 1.2.4.2 yamt aprint_error_dev(self, "can't map even I/O space\n");
327 1.2.4.2 yamt return;
328 1.2.4.2 yamt }
329 1.2.4.2 yamt if (bus_space_map(asict, va->va_iobase + SMCTT_IO_OFFSET, WE_NPORTS,
330 1.2.4.2 yamt 0, &asich1) != 0) {
331 1.2.4.2 yamt aprint_error_dev(self, "can't map odd I/O space\n");
332 1.2.4.2 yamt goto out;
333 1.2.4.2 yamt }
334 1.2.4.2 yamt asict->stride =
335 1.2.4.2 yamt (vaddr_t)bus_space_vaddr(asict, asich1) -
336 1.2.4.2 yamt (vaddr_t)bus_space_vaddr(asict, asich);
337 1.2.4.2 yamt
338 1.2.4.2 yamt if (bus_space_subregion(asict, asich, WE_NIC_OFFSET, WE_NIC_NPORTS,
339 1.2.4.2 yamt &nich) != 0) {
340 1.2.4.2 yamt aprint_error_dev(self, "can't subregion I/O space\n");
341 1.2.4.2 yamt goto out1;
342 1.2.4.2 yamt }
343 1.2.4.2 yamt
344 1.2.4.2 yamt /* Map memory space. */
345 1.2.4.2 yamt if (bus_space_map(memt, va->va_maddr, va->va_msize, 0, &memh) != 0) {
346 1.2.4.2 yamt aprint_error_dev(self, "can't map shared memory\n");
347 1.2.4.2 yamt goto out1;
348 1.2.4.2 yamt }
349 1.2.4.2 yamt
350 1.2.4.2 yamt wsc->sc_asict = asict;
351 1.2.4.2 yamt wsc->sc_asich = asich;
352 1.2.4.2 yamt
353 1.2.4.2 yamt sc->sc_regt = nict;
354 1.2.4.2 yamt sc->sc_regh = nich;
355 1.2.4.2 yamt
356 1.2.4.2 yamt sc->sc_buft = memt;
357 1.2.4.2 yamt sc->sc_bufh = memh;
358 1.2.4.2 yamt
359 1.2.4.2 yamt wsc->sc_maddr = va->va_maddr & 0xfffff;
360 1.2.4.2 yamt sc->mem_size = va->va_msize;
361 1.2.4.2 yamt
362 1.2.4.2 yamt /* Interface is always enabled. */
363 1.2.4.2 yamt sc->sc_enabled = 1;
364 1.2.4.2 yamt
365 1.2.4.2 yamt /* SMC_TT assumes SMC8216 */
366 1.2.4.2 yamt sc->is790 = 1;
367 1.2.4.2 yamt
368 1.2.4.2 yamt /* SMC_TT supports only 16 bit access for shared memory */
369 1.2.4.2 yamt wsc->sc_flags |= WE_16BIT_ENABLE;
370 1.2.4.2 yamt
371 1.2.4.2 yamt /* Appeal the Atari spirit :-) */
372 1.2.4.2 yamt typestr = "SMC8216 with SMC_TT VME-ISA bridge";
373 1.2.4.2 yamt
374 1.2.4.2 yamt if (we_config(self, wsc, typestr) != 0)
375 1.2.4.2 yamt goto out2;
376 1.2.4.2 yamt
377 1.2.4.2 yamt /*
378 1.2.4.2 yamt * Enable the configured interrupt.
379 1.2.4.2 yamt */
380 1.2.4.2 yamt bus_space_write_1(asict, asich, WE790_ICR,
381 1.2.4.2 yamt bus_space_read_1(asict, asich, WE790_ICR) | WE790_ICR_EIL);
382 1.2.4.2 yamt
383 1.2.4.2 yamt /* Establish interrupt handler. */
384 1.2.4.2 yamt wsc->sc_ih = intr_establish(SMCTT_VECTOR - 64, USER_VEC, 0,
385 1.2.4.2 yamt (hw_ifun_t)dp8390_intr, sc);
386 1.2.4.2 yamt if (wsc->sc_ih == NULL) {
387 1.2.4.2 yamt aprint_error_dev(self, "can't establish interrupt\n");
388 1.2.4.2 yamt goto out2;
389 1.2.4.2 yamt }
390 1.2.4.2 yamt /*
391 1.2.4.2 yamt * Unmask the VME interrupt we're on.
392 1.2.4.2 yamt */
393 1.2.4.2 yamt if ((machineid & ATARI_TT) != 0)
394 1.2.4.2 yamt SCU->vme_mask |= 1 << va->va_irq;
395 1.2.4.2 yamt
396 1.2.4.2 yamt return;
397 1.2.4.2 yamt
398 1.2.4.2 yamt out2:
399 1.2.4.2 yamt bus_space_unmap(memt, memh, va->va_msize);
400 1.2.4.2 yamt out1:
401 1.2.4.2 yamt bus_space_unmap(asict, asich1, WE_NPORTS);
402 1.2.4.2 yamt out:
403 1.2.4.2 yamt bus_space_unmap(asict, asich, WE_NPORTS);
404 1.2.4.2 yamt }
405 1.2.4.2 yamt
406 1.2.4.2 yamt static uint8_t
407 1.2.4.2 yamt smctt_bus_space_read_1(bus_space_tag_t bt, bus_space_handle_t bh,
408 1.2.4.2 yamt bus_size_t reg)
409 1.2.4.2 yamt {
410 1.2.4.2 yamt uint8_t rv;
411 1.2.4.2 yamt
412 1.2.4.2 yamt if ((reg & 0x01) != 0) {
413 1.2.4.2 yamt /* odd address space */
414 1.2.4.2 yamt rv = *(volatile uint8_t *)(bh + bt->stride + (reg & ~0x01));
415 1.2.4.2 yamt } else {
416 1.2.4.2 yamt /* even address space */
417 1.2.4.2 yamt rv = *(volatile uint8_t *)(bh + reg);
418 1.2.4.2 yamt }
419 1.2.4.2 yamt
420 1.2.4.2 yamt return rv;
421 1.2.4.2 yamt }
422 1.2.4.2 yamt
423 1.2.4.2 yamt static void
424 1.2.4.2 yamt smctt_bus_space_write_1(bus_space_tag_t bt, bus_space_handle_t bh,
425 1.2.4.2 yamt bus_size_t reg, uint8_t val)
426 1.2.4.2 yamt {
427 1.2.4.2 yamt
428 1.2.4.2 yamt if ((reg & 0x01) != 0) {
429 1.2.4.2 yamt /* odd address space */
430 1.2.4.2 yamt *(volatile uint8_t *)(bh + bt->stride + (reg & ~0x01)) = val;
431 1.2.4.2 yamt } else {
432 1.2.4.2 yamt /* even address space */
433 1.2.4.2 yamt *(volatile uint8_t *)(bh + reg) = val;
434 1.2.4.2 yamt }
435 1.2.4.2 yamt }
436 1.2.4.2 yamt
437 1.2.4.2 yamt static int
438 1.2.4.2 yamt smctt_bus_space_peek_1(bus_space_tag_t bt, bus_space_handle_t bh,
439 1.2.4.2 yamt bus_size_t reg)
440 1.2.4.2 yamt {
441 1.2.4.2 yamt uint8_t *va;
442 1.2.4.2 yamt
443 1.2.4.2 yamt if ((reg & 0x01) != 0) {
444 1.2.4.2 yamt /* odd address space */
445 1.2.4.2 yamt va = (uint8_t *)(bh + bt->stride + (reg & ~0x01));
446 1.2.4.2 yamt } else {
447 1.2.4.2 yamt /* even address space */
448 1.2.4.2 yamt va = (uint8_t *)(bh + reg);
449 1.2.4.2 yamt }
450 1.2.4.2 yamt
451 1.2.4.2 yamt return !badbaddr(va, sizeof(uint8_t));
452 1.2.4.2 yamt }
453