2 * FreeBSD, EISA product support functions
5 * Copyright (c) 1994-1998, 2000, 2001 Justin T. Gibbs.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice immediately at the beginning of the file, without modification,
13 * this list of conditions, and the following disclaimer.
14 * 2. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
21 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * $Id: //depot/aic7xxx/freebsd/dev/aic7xxx/ahc_eisa.c#13 $
31 * $FreeBSD: src/sys/dev/aic7xxx/ahc_eisa.c,v 1.34 2004/08/17 00:14:30 gibbs Exp $
32 * $DragonFly: src/sys/dev/disk/aic7xxx/ahc_eisa.c,v 1.10 2008/05/18 20:30:21 pavalos Exp $
35 #include "aic7xxx_osm.h"
37 #include <bus/eisa/eisaconf.h>
40 aic7770_probe(device_t dev
)
42 struct aic7770_identity
*entry
;
43 struct resource
*regs
;
45 bus_space_handle_t bsh
;
54 entry
= aic7770_find_device(eisa_get_id(dev
));
57 device_set_desc(dev
, entry
->name
);
59 iobase
= (eisa_get_slot(dev
) * EISA_SLOT_SIZE
) + AHC_EISA_SLOT_OFFSET
;
61 eisa_add_iospace(dev
, iobase
, AHC_EISA_IOSIZE
, RESVADDR_NONE
);
64 regs
= bus_alloc_resource_any(dev
, SYS_RES_IOPORT
, &rid
, RF_ACTIVE
);
66 device_printf(dev
, "Unable to map I/O space?!\n");
70 tag
= rman_get_bustag(regs
);
71 bsh
= rman_get_bushandle(regs
);
74 /* Pause the card preseving the IRQ type */
75 hcntrl
= bus_space_read_1(tag
, bsh
, HCNTRL
) & IRQMS
;
76 bus_space_write_1(tag
, bsh
, HCNTRL
, hcntrl
| PAUSE
);
77 while ((bus_space_read_1(tag
, bsh
, HCNTRL
) & PAUSE
) == 0)
80 /* Make sure we have a valid interrupt vector */
81 intdef
= bus_space_read_1(tag
, bsh
, INTDEF
);
82 shared
= (intdef
& EDGE_TRIG
) ? EISA_TRIGGER_EDGE
: EISA_TRIGGER_LEVEL
;
83 irq
= intdef
& VECTOR
;
93 kprintf("aic7770 at slot %d: illegal irq setting %d\n",
94 eisa_get_slot(dev
), intdef
);
99 eisa_add_intr(dev
, irq
, shared
);
101 bus_release_resource(dev
, SYS_RES_IOPORT
, rid
, regs
);
106 aic7770_attach(device_t dev
)
108 struct aic7770_identity
*entry
;
109 struct ahc_softc
*ahc
;
113 entry
= aic7770_find_device(eisa_get_id(dev
));
118 * Allocate a softc for this card and
119 * set it up for attachment by our
120 * common detect routine.
122 name
= kmalloc(strlen(device_get_nameunit(dev
)) + 1, M_DEVBUF
, M_INTWAIT
);
123 strcpy(name
, device_get_nameunit(dev
));
124 ahc
= ahc_alloc(dev
, name
);
128 ahc_set_unit(ahc
, device_get_unit(dev
));
130 /* Allocate a dmatag for our SCB DMA maps */
131 /* XXX Should be a child of the PCI bus dma tag */
132 error
= aic_dma_tag_create(ahc
, /*parent*/NULL
, /*alignment*/1,
134 /*lowaddr*/BUS_SPACE_MAXADDR_32BIT
,
135 /*highaddr*/BUS_SPACE_MAXADDR
,
136 /*filter*/NULL
, /*filterarg*/NULL
,
137 /*maxsize*/BUS_SPACE_MAXSIZE_32BIT
,
138 /*nsegments*/AHC_NSEG
,
139 /*maxsegsz*/AHC_MAXTRANSFER_SIZE
,
144 kprintf("ahc_eisa_attach: Could not allocate DMA tag "
145 "- error %d\n", error
);
149 ahc
->dev_softc
= dev
;
150 error
= aic7770_config(ahc
, entry
, /*unused ioport arg*/0);
161 static device_method_t ahc_eisa_device_methods
[] = {
162 /* Device interface */
163 DEVMETHOD(device_probe
, aic7770_probe
),
164 DEVMETHOD(device_attach
, aic7770_attach
),
165 DEVMETHOD(device_detach
, ahc_detach
),
169 static driver_t ahc_eisa_driver
= {
171 ahc_eisa_device_methods
,
172 sizeof(struct ahc_softc
)
175 DRIVER_MODULE(ahc_eisa
, eisa
, ahc_eisa_driver
, ahc_devclass
, 0, 0);
176 MODULE_DEPEND(ahc_eisa
, ahc
, 1, 1, 1);
177 MODULE_VERSION(ahc_eisa
, 1);