diff options
author | sos <sos@FreeBSD.org> | 2003-05-04 09:34:14 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 2003-05-04 09:34:14 +0000 |
commit | 874ca2095201b33067662145c3d85a2666c1f091 (patch) | |
tree | ac4daa951f65c242e0cb23730580c8fb422bd2a5 /sys | |
parent | 0383b05a471b8801aeeed579da284decf6139a4a (diff) | |
download | FreeBSD-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.c | 13 | ||||
-rw-r--r-- | sys/dev/ata/ata-all.h | 1 | ||||
-rw-r--r-- | sys/dev/ata/ata-pci.c | 1 |
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 } }; |