2 * Copyright (c) 1998,1999,2000,2001,2002 Søren Schmidt <sos@FreeBSD.org>
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 * without modification, immediately at the beginning of the file.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. 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 ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 * $FreeBSD: src/sys/dev/ata/ata-card.c,v 1.4.2.1 2002/03/18 08:37:33 sos Exp $
29 * $DragonFly: src/sys/dev/disk/ata/ata-card.c,v 1.7 2007/07/05 12:08:53 sephe Exp $
32 #include <sys/param.h>
33 #include <sys/systm.h>
34 #include <sys/kernel.h>
35 #include <sys/module.h>
37 #include <sys/malloc.h>
40 #include <machine/stdarg.h>
43 #include <bus/pccard/pccard_cis.h>
44 #include <bus/pccard/pccardreg.h>
45 #include <bus/pccard/pccardvar.h>
46 #include <bus/pccard/pccarddevs.h>
48 static const struct pccard_product ata_pccard_products
[] = {
49 PCMCIA_CARD(FREECOM
, PCCARDIDE
, 0),
50 PCMCIA_CARD(EXP
, EXPMULTIMEDIA
, 0),
51 PCMCIA_CARD(IODATA3
, CBIDE2
, 0),
52 PCMCIA_CARD(OEM2
, CDROM1
, 0),
53 PCMCIA_CARD(OEM2
, IDE
, 0),
54 PCMCIA_CARD(PANASONIC
, KXLC005
, 0),
55 PCMCIA_CARD(TEAC
, IDECARDII
, 0),
60 ata_pccard_match(device_t dev
)
62 const struct pccard_product
*pp
;
63 u_int32_t fcn
= PCCARD_FUNCTION_UNSPEC
;
65 fcn
= pccard_get_function_number(dev
);
67 /* if it says its a disk we should register it */
68 if (fcn
== PCCARD_FUNCTION_DISK
)
71 /* match other devices here, primarily cdrom/dvd rom */
72 if ((pp
= pccard_product_lookup(dev
, ata_pccard_products
,
73 sizeof(ata_pccard_products
[0]), NULL
))) {
75 device_set_desc(dev
, pp
->pp_name
);
82 ata_pccard_probe(device_t dev
)
84 struct ata_channel
*ch
= device_get_softc(dev
);
86 int rid
, len
, start
, end
;
89 /* allocate the io range to get start and length */
91 len
= bus_get_resource_count(dev
, SYS_RES_IOPORT
, rid
);
92 io
= bus_alloc_resource(dev
, SYS_RES_IOPORT
, &rid
, 0, ~0,
93 ATA_IOSIZE
, RF_ACTIVE
);
97 /* reallocate the io address to only cover the io ports */
98 start
= rman_get_start(io
);
99 end
= start
+ ATA_IOSIZE
- 1;
100 bus_release_resource(dev
, SYS_RES_IOPORT
, rid
, io
);
101 io
= bus_alloc_resource(dev
, SYS_RES_IOPORT
, &rid
,
102 start
, end
, ATA_IOSIZE
, RF_ACTIVE
);
103 bus_release_resource(dev
, SYS_RES_IOPORT
, rid
, io
);
106 * if we got more than the default ATA_IOSIZE ports, this is likely
107 * a pccard system where the altio ports are located at offset 14
108 * otherwise its the normal altio offset
110 if (bus_get_resource(dev
, SYS_RES_IOPORT
, ATA_ALTADDR_RID
, &tmp
, &tmp
)) {
111 if (len
> ATA_IOSIZE
) {
112 bus_set_resource(dev
, SYS_RES_IOPORT
, ATA_ALTADDR_RID
,
113 start
+ ATA_PCCARD_ALTOFFSET
, ATA_ALTIOSIZE
);
116 bus_set_resource(dev
, SYS_RES_IOPORT
, ATA_ALTADDR_RID
,
117 start
+ ATA_ALTOFFSET
, ATA_ALTIOSIZE
);
124 ch
->flags
|= (ATA_USE_16BIT
| ATA_NO_SLAVE
);
125 return ata_probe(dev
);
128 static device_method_t ata_pccard_methods
[] = {
129 /* device interface */
130 DEVMETHOD(device_probe
, pccard_compat_probe
),
131 DEVMETHOD(device_attach
, pccard_compat_attach
),
132 DEVMETHOD(device_detach
, ata_detach
),
135 DEVMETHOD(card_compat_match
, ata_pccard_match
),
136 DEVMETHOD(card_compat_probe
, ata_pccard_probe
),
137 DEVMETHOD(card_compat_attach
, ata_attach
),
142 static driver_t ata_pccard_driver
= {
145 sizeof(struct ata_channel
),
148 DRIVER_MODULE(ata
, pccard
, ata_pccard_driver
, ata_devclass
, 0, 0);