summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/ata-card.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2009-02-19 12:47:24 +0000
committermav <mav@FreeBSD.org>2009-02-19 12:47:24 +0000
commit6127a7d95a93e81e644a76241dcd28a7f41925f7 (patch)
treeebbbf416f6cb65d574f788efa836329c852e5273 /sys/dev/ata/ata-card.c
parentfacbd7451d55460587d9d7295154cd25a90ae8d5 (diff)
downloadFreeBSD-src-6127a7d95a93e81e644a76241dcd28a7f41925f7.zip
FreeBSD-src-6127a7d95a93e81e644a76241dcd28a7f41925f7.tar.gz
Use channel driver's attach/detach routines instead of ata_attach()/
ata_detach() to implement IOCATAATTACH/IOCATADETACH ioctls. This will permit channel drivers to properly shutdown port hardware on channel detach and init it on attach.
Diffstat (limited to 'sys/dev/ata/ata-card.c')
-rw-r--r--sys/dev/ata/ata-card.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/dev/ata/ata-card.c b/sys/dev/ata/ata-card.c
index 9a66419..09a2c9f 100644
--- a/sys/dev/ata/ata-card.c
+++ b/sys/dev/ata/ata-card.c
@@ -91,6 +91,10 @@ ata_pccard_attach(device_t dev)
struct resource *io, *ctlio;
int i, rid, err;
+ if (ch->attached)
+ return (0);
+ ch->attached = 1;
+
/* allocate the io range to get start and length */
rid = ATA_IOADDR_RID;
if (!(io = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0,
@@ -142,6 +146,10 @@ ata_pccard_detach(device_t dev)
struct ata_channel *ch = device_get_softc(dev);
int i;
+ if (!ch->attached)
+ return (0);
+ ch->attached = 0;
+
ata_detach(dev);
if (ch->r_io[ATA_CONTROL].res != ch->r_io[ATA_DATA].res)
bus_release_resource(dev, SYS_RES_IOPORT, ATA_CTLADDR_RID,
OpenPOWER on IntegriCloud