summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2003-05-04 09:34:14 +0000
committersos <sos@FreeBSD.org>2003-05-04 09:34:14 +0000
commit874ca2095201b33067662145c3d85a2666c1f091 (patch)
treeac4daa951f65c242e0cb23730580c8fb422bd2a5 /sys
parent0383b05a471b8801aeeed579da284decf6139a4a (diff)
downloadFreeBSD-src-874ca2095201b33067662145c3d85a2666c1f091.zip
FreeBSD-src-874ca2095201b33067662145c3d85a2666c1f091.tar.gz
Grap the ATA lock on all channels before suspend, this makes certain
that we have no outstanding ops in transit, which would cause problems on resume.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ata/ata-all.c13
-rw-r--r--sys/dev/ata/ata-all.h1
-rw-r--r--sys/dev/ata/ata-pci.c1
3 files changed, 15 insertions, 0 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c
index c3dbe6e..9a5daf7 100644
--- a/sys/dev/ata/ata-all.c
+++ b/sys/dev/ata/ata-all.c
@@ -241,6 +241,19 @@ ata_detach(device_t dev)
}
int
+ata_suspend(device_t dev)
+{
+ struct ata_channel *ch;
+
+ if (!dev || !(ch = device_get_softc(dev)))
+ return ENXIO;
+
+ ch->locking(ch, ATA_LF_LOCK);
+ ATA_SLEEPLOCK_CH(ch, ATA_CONTROL);
+ return 0;
+}
+
+int
ata_resume(device_t dev)
{
struct ata_channel *ch;
diff --git a/sys/dev/ata/ata-all.h b/sys/dev/ata/ata-all.h
index 8f261cb..44cb042 100644
--- a/sys/dev/ata/ata-all.h
+++ b/sys/dev/ata/ata-all.h
@@ -282,6 +282,7 @@ extern struct intr_config_hook *ata_delayed_attach;
int ata_probe(device_t);
int ata_attach(device_t);
int ata_detach(device_t);
+int ata_suspend(device_t);
int ata_resume(device_t);
void ata_start(struct ata_channel *);
void ata_reset(struct ata_channel *);
diff --git a/sys/dev/ata/ata-pci.c b/sys/dev/ata/ata-pci.c
index 217e35f..0636194 100644
--- a/sys/dev/ata/ata-pci.c
+++ b/sys/dev/ata/ata-pci.c
@@ -522,6 +522,7 @@ static device_method_t ata_pcisub_methods[] = {
DEVMETHOD(device_probe, ata_pcisub_probe),
DEVMETHOD(device_attach, ata_attach),
DEVMETHOD(device_detach, ata_detach),
+ DEVMETHOD(device_suspend, ata_suspend),
DEVMETHOD(device_resume, ata_resume),
{ 0, 0 }
};
OpenPOWER on IntegriCloud