diff options
author | Jens Axboe <axboe@suse.de> | 2006-01-06 03:28:07 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-06 11:36:09 -0500 |
commit | 9b847548663ef1039dd49f0eb4463d001e596bc3 (patch) | |
tree | 105a0eece522b1347bea57f609f6c04ed673fdb3 /include | |
parent | 88202a0c84e1951d6630d1d557d4801a8cc5b5ef (diff) |
[PATCH] Suspend support for libata
This patch adds suspend patch to libata, and ata_piix in particular. For
most low level drivers, they should just need to add the 4 hooks to
work. As I can only test ata_piix, I didn't enable it for more
though.
Suspend support is the single most important feature on a notebook, and
most new notebooks have sata drives. It's quite embarrassing that we
_still_ do not support this. Right now, it's perfectly possible to
suspend the drive in mid-transfer.
Signed-off-by: Jens Axboe <axboe@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/ata.h | 2 | ||||
-rw-r--r-- | include/linux/libata.h | 8 | ||||
-rw-r--r-- | include/scsi/scsi_host.h | 6 |
3 files changed, 16 insertions, 0 deletions
diff --git a/include/linux/ata.h b/include/linux/ata.h index d2873b732bb1..3eb80c391b39 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
@@ -141,6 +141,8 @@ enum { | |||
141 | ATA_CMD_PACKET = 0xA0, | 141 | ATA_CMD_PACKET = 0xA0, |
142 | ATA_CMD_VERIFY = 0x40, | 142 | ATA_CMD_VERIFY = 0x40, |
143 | ATA_CMD_VERIFY_EXT = 0x42, | 143 | ATA_CMD_VERIFY_EXT = 0x42, |
144 | ATA_CMD_STANDBYNOW1 = 0xE0, | ||
145 | ATA_CMD_IDLEIMMEDIATE = 0xE1, | ||
144 | ATA_CMD_INIT_DEV_PARAMS = 0x91, | 146 | ATA_CMD_INIT_DEV_PARAMS = 0x91, |
145 | 147 | ||
146 | /* SETFEATURES stuff */ | 148 | /* SETFEATURES stuff */ |
diff --git a/include/linux/libata.h b/include/linux/libata.h index e828e172ccbf..cdab75c209a0 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -124,6 +124,8 @@ enum { | |||
124 | ATA_FLAG_DEBUGMSG = (1 << 10), | 124 | ATA_FLAG_DEBUGMSG = (1 << 10), |
125 | ATA_FLAG_NO_ATAPI = (1 << 11), /* No ATAPI support */ | 125 | ATA_FLAG_NO_ATAPI = (1 << 11), /* No ATAPI support */ |
126 | 126 | ||
127 | ATA_FLAG_SUSPENDED = (1 << 12), /* port is suspended */ | ||
128 | |||
127 | ATA_QCFLAG_ACTIVE = (1 << 1), /* cmd not yet ack'd to scsi lyer */ | 129 | ATA_QCFLAG_ACTIVE = (1 << 1), /* cmd not yet ack'd to scsi lyer */ |
128 | ATA_QCFLAG_SG = (1 << 3), /* have s/g table? */ | 130 | ATA_QCFLAG_SG = (1 << 3), /* have s/g table? */ |
129 | ATA_QCFLAG_SINGLE = (1 << 4), /* no s/g, just a single buffer */ | 131 | ATA_QCFLAG_SINGLE = (1 << 4), /* no s/g, just a single buffer */ |
@@ -436,6 +438,8 @@ extern void ata_std_ports(struct ata_ioports *ioaddr); | |||
436 | extern int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info, | 438 | extern int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info, |
437 | unsigned int n_ports); | 439 | unsigned int n_ports); |
438 | extern void ata_pci_remove_one (struct pci_dev *pdev); | 440 | extern void ata_pci_remove_one (struct pci_dev *pdev); |
441 | extern int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t state); | ||
442 | extern int ata_pci_device_resume(struct pci_dev *pdev); | ||
439 | #endif /* CONFIG_PCI */ | 443 | #endif /* CONFIG_PCI */ |
440 | extern int ata_device_add(const struct ata_probe_ent *ent); | 444 | extern int ata_device_add(const struct ata_probe_ent *ent); |
441 | extern void ata_host_set_remove(struct ata_host_set *host_set); | 445 | extern void ata_host_set_remove(struct ata_host_set *host_set); |
@@ -445,6 +449,10 @@ extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmn | |||
445 | extern int ata_scsi_error(struct Scsi_Host *host); | 449 | extern int ata_scsi_error(struct Scsi_Host *host); |
446 | extern int ata_scsi_release(struct Scsi_Host *host); | 450 | extern int ata_scsi_release(struct Scsi_Host *host); |
447 | extern unsigned int ata_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc); | 451 | extern unsigned int ata_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc); |
452 | extern int ata_scsi_device_resume(struct scsi_device *); | ||
453 | extern int ata_scsi_device_suspend(struct scsi_device *); | ||
454 | extern int ata_device_resume(struct ata_port *, struct ata_device *); | ||
455 | extern int ata_device_suspend(struct ata_port *, struct ata_device *); | ||
448 | extern int ata_ratelimit(void); | 456 | extern int ata_ratelimit(void); |
449 | 457 | ||
450 | /* | 458 | /* |
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 6cbb1982ed03..6297885a35e7 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h | |||
@@ -296,6 +296,12 @@ struct scsi_host_template { | |||
296 | int (*proc_info)(struct Scsi_Host *, char *, char **, off_t, int, int); | 296 | int (*proc_info)(struct Scsi_Host *, char *, char **, off_t, int, int); |
297 | 297 | ||
298 | /* | 298 | /* |
299 | * suspend support | ||
300 | */ | ||
301 | int (*resume)(struct scsi_device *); | ||
302 | int (*suspend)(struct scsi_device *); | ||
303 | |||
304 | /* | ||
299 | * Name of proc directory | 305 | * Name of proc directory |
300 | */ | 306 | */ |
301 | char *proc_name; | 307 | char *proc_name; |