2 * Copyright (c) 1999 Luoqi Chen.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * $FreeBSD: src/sys/dev/aic/aic_pccard.c,v 1.1 2000/01/14 23:42:36 imp Exp $
27 * $DragonFly: src/sys/dev/disk/aic/aic_pccard.c,v 1.9 2008/01/05 07:27:09 pavalos Exp $
30 #include <sys/param.h>
31 #include <sys/kernel.h>
32 #include <sys/module.h>
38 #include <bus/pccard/pccardvar.h>
39 #include <bus/pccard/pccarddevs.h>
43 struct aic_pccard_softc
{
44 struct aic_softc sc_aic
;
45 struct resource
*sc_port
;
46 struct resource
*sc_irq
;
50 static int aic_pccard_alloc_resources (device_t
);
51 static void aic_pccard_release_resources (device_t
);
52 static int aic_pccard_probe (device_t
);
53 static int aic_pccard_attach (device_t
);
55 static const struct pccard_product aic_pccard_products
[] = {
56 PCMCIA_CARD(ADAPTEC
, APA1460
, 0),
57 PCMCIA_CARD(ADAPTEC
, APA1460A
, 0),
58 PCMCIA_CARD(NEWMEDIA
, BUSTOASTER
, 0),
59 PCMCIA_CARD(NEWMEDIA
, BUSTOASTER2
, 0),
60 PCMCIA_CARD(NEWMEDIA
, BUSTOASTER3
, 0),
64 #define AIC_PCCARD_PORTSIZE 0x20
67 aic_pccard_alloc_resources(device_t dev
)
69 struct aic_pccard_softc
*sc
= device_get_softc(dev
);
72 sc
->sc_port
= sc
->sc_irq
= 0;
75 sc
->sc_port
= bus_alloc_resource(dev
, SYS_RES_IOPORT
, &rid
,
76 0ul, ~0ul, AIC_PCCARD_PORTSIZE
, RF_ACTIVE
);
81 sc
->sc_irq
= bus_alloc_resource_any(dev
, SYS_RES_IRQ
, &rid
, RF_ACTIVE
);
83 aic_pccard_release_resources(dev
);
87 sc
->sc_aic
.unit
= device_get_unit(dev
);
88 sc
->sc_aic
.tag
= rman_get_bustag(sc
->sc_port
);
89 sc
->sc_aic
.bsh
= rman_get_bushandle(sc
->sc_port
);
94 aic_pccard_release_resources(device_t dev
)
96 struct aic_pccard_softc
*sc
= device_get_softc(dev
);
99 bus_release_resource(dev
, SYS_RES_IOPORT
, 0, sc
->sc_port
);
101 bus_release_resource(dev
, SYS_RES_IRQ
, 0, sc
->sc_irq
);
102 sc
->sc_port
= sc
->sc_irq
= 0;
106 aic_pccard_probe(device_t dev
)
108 const struct pccard_product
*pp
;
110 if ((pp
= pccard_product_lookup(dev
, aic_pccard_products
,
111 sizeof(aic_pccard_products
[0]), NULL
)) != NULL
) {
112 if (pp
->pp_name
!= NULL
)
113 device_set_desc(dev
, pp
->pp_name
);
120 aic_pccard_attach(device_t dev
)
122 struct aic_pccard_softc
*sc
= device_get_softc(dev
);
123 struct aic_softc
*aic
= &sc
->sc_aic
;
126 if (aic_pccard_alloc_resources(dev
))
128 if (aic_probe(aic
)) {
129 aic_pccard_release_resources(dev
);
133 device_set_desc(dev
, "Adaptec 6260/6360 SCSI controller");
135 error
= aic_attach(aic
);
137 device_printf(dev
, "attach failed\n");
138 aic_pccard_release_resources(dev
);
142 error
= bus_setup_intr(dev
, sc
->sc_irq
, 0, aic_intr
,
143 aic
, &sc
->sc_ih
, NULL
);
145 device_printf(dev
, "failed to register interrupt handler\n");
146 aic_pccard_release_resources(dev
);
153 aic_pccard_detach(device_t dev
)
155 struct aic_pccard_softc
*sc
= device_get_softc(dev
);
156 struct aic_softc
*aic
= &sc
->sc_aic
;
159 error
= bus_teardown_intr(dev
, sc
->sc_irq
, sc
->sc_ih
);
161 device_printf(dev
, "failed to unregister interrupt handler\n");
164 error
= aic_detach(aic
);
166 device_printf(dev
, "detach failed\n");
170 aic_pccard_release_resources(dev
);
174 static device_method_t aic_pccard_methods
[] = {
175 /* Device interface */
176 DEVMETHOD(device_probe
, aic_pccard_probe
),
177 DEVMETHOD(device_attach
, aic_pccard_attach
),
178 DEVMETHOD(device_detach
, aic_pccard_detach
),
183 static driver_t aic_pccard_driver
= {
185 aic_pccard_methods
, sizeof(struct aic_pccard_softc
),
188 extern devclass_t aic_devclass
;
190 MODULE_DEPEND(aic
, cam
, 1,1,1);
191 DRIVER_MODULE(aic
, pccard
, aic_pccard_driver
, aic_devclass
, 0, 0);