1 /* $NetBSD: dpt_eisa.c,v 1.19 2009/05/12 12:12:52 cegger Exp $ */
4 * Copyright (c) 1999, 2000, 2001 Andrew Doran <ad@NetBSD.org>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * EISA front-end for DPT EATA SCSI driver.
34 #include <sys/cdefs.h>
35 __KERNEL_RCSID(0, "$NetBSD: dpt_eisa.c,v 1.19 2009/05/12 12:12:52 cegger Exp $");
37 #include <sys/param.h>
38 #include <sys/systm.h>
39 #include <sys/device.h>
40 #include <sys/queue.h>
45 #include <dev/scsipi/scsipi_all.h>
46 #include <dev/scsipi/scsiconf.h>
48 #include <dev/eisa/eisavar.h>
50 #include <dev/ic/dptreg.h>
51 #include <dev/ic/dptvar.h>
53 #include <dev/i2o/dptivar.h>
55 #define DPT_EISA_SLOT_OFFSET 0x0c00
56 #define DPT_EISA_IOSIZE 0x0100
57 #define DPT_EISA_IOCONF 0x90
58 #define DPT_EISA_EATA_REG_OFFSET 0x88
60 static void dpt_eisa_attach(device_t
, device_t
, void *);
61 static int dpt_eisa_irq(bus_space_tag_t
, bus_space_handle_t
, int *);
62 static int dpt_eisa_match(device_t
, cfdata_t
, void *);
64 CFATTACH_DECL(dpt_eisa
, sizeof(struct dpt_softc
),
65 dpt_eisa_match
, dpt_eisa_attach
, NULL
, NULL
);
67 static const char * const dpt_eisa_boards
[] = {
85 dpt_eisa_irq(bus_space_tag_t iot
, bus_space_handle_t ioh
, int *irq
)
88 switch (bus_space_read_1(iot
, ioh
, DPT_EISA_IOCONF
) & 0x38) {
106 dpt_eisa_match(device_t parent
, cfdata_t match
,
109 struct eisa_attach_args
*ea
;
114 for (i
= 0; dpt_eisa_boards
[i
] != NULL
; i
++)
115 if (strcmp(ea
->ea_idstring
, dpt_eisa_boards
[i
]) == 0)
118 return (dpt_eisa_boards
[i
] != NULL
);
122 dpt_eisa_attach(device_t parent
, device_t self
, void *aux
)
124 struct eisa_attach_args
*ea
;
125 bus_space_handle_t ioh
;
126 eisa_chipset_tag_t ec
;
127 eisa_intr_handle_t ih
;
128 struct dpt_softc
*sc
;
134 sc
= device_private(self
);
140 if (bus_space_map(iot
, EISA_SLOT_ADDR(ea
->ea_slot
) +
141 DPT_EISA_SLOT_OFFSET
, DPT_EISA_IOSIZE
, 0, &ioh
)) {
142 printf("can't map i/o space\n");
148 sc
->sc_dmat
= ea
->ea_dmat
;
150 /* Map and establish the interrupt. */
151 if (dpt_eisa_irq(iot
, ioh
, &irq
)) {
152 printf("HBA on invalid IRQ\n");
156 if (eisa_intr_map(ec
, irq
, &ih
)) {
157 printf("can't map interrupt (%d)\n", irq
);
161 intrstr
= eisa_intr_string(ec
, ih
);
162 sc
->sc_ih
= eisa_intr_establish(ec
, ih
, IST_LEVEL
, IPL_BIO
,
164 if (sc
->sc_ih
== NULL
) {
165 printf("can't establish interrupt");
167 printf(" at %s", intrstr
);
172 /* Read the EATA configuration. */
173 if (dpt_readcfg(sc
)) {
174 aprint_error_dev(&sc
->sc_dv
, "readcfg failed - see dpt(4)\n");
178 sc
->sc_bustype
= SI_EISA_BUS
;
179 sc
->sc_isaport
= EISA_SLOT_ADDR(ea
->ea_slot
) + DPT_EISA_SLOT_OFFSET
;
182 /* Now attach to the bus-independent code. */
183 dpt_init(sc
, intrstr
);