+++ /dev/null
-From 8794806469a35ab09378e9ee7ad39da6284cb8ff Mon Sep 17 00:00:00 2001
-From: Rafael J. Wysocki <rjw@sisk.pl>
-Date: Mon, 3 Nov 2008 19:01:04 +0900
-Subject: [PATCH] SATA: Blacklisting of systems that spin off disks during ACPI power off (rev. 2)
-References: bnc#441721
-
-Introduce new libata flags ATA_FLAG_NO_POWEROFF_SPINDOWN and
-ATA_FLAG_NO_HIBERNATE_SPINDOWN that, if set, will prevent disks from
-being spun off during system power off and hibernation, respectively
-(to handle the hibernation case we need the new system state
-SYSTEM_HIBERNATE_ENTER that can be checked against by libata, in
-analogy with SYSTEM_POWER_OFF).
-
-Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
-Signed-off-by: Tejun Heo <tj@kernel.org>
-Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
-Signed-off-by: Tejun Heo <teheo@suse.de>
----
- drivers/ata/libata-scsi.c | 20 +++++++++++++++++---
- include/linux/libata.h | 2 ++
- 2 files changed, 19 insertions(+), 3 deletions(-)
-
-Index: linux-2.6.27/drivers/ata/libata-scsi.c
-===================================================================
---- linux-2.6.27.orig/drivers/ata/libata-scsi.c
-+++ linux-2.6.27/drivers/ata/libata-scsi.c
-@@ -46,6 +46,7 @@
- #include <linux/libata.h>
- #include <linux/hdreg.h>
- #include <linux/uaccess.h>
-+#include <linux/suspend.h>
-
- #include "libata.h"
-
-@@ -1181,6 +1182,17 @@ static unsigned int ata_scsi_start_stop_
-
- tf->command = ATA_CMD_VERIFY; /* READ VERIFY */
- } else {
-+ /* Some odd clown BIOSen issue spindown on power off (ACPI S4
-+ * or S5) causing some drives to spin up and down again.
-+ */
-+ if ((qc->ap->flags & ATA_FLAG_NO_POWEROFF_SPINDOWN) &&
-+ system_state == SYSTEM_POWER_OFF)
-+ goto skip;
-+
-+ if ((qc->ap->flags & ATA_FLAG_NO_HIBERNATE_SPINDOWN) &&
-+ system_entering_hibernation())
-+ goto skip;
-+
- /* XXX: This is for backward compatibility, will be
- * removed. Read Documentation/feature-removal-schedule.txt
- * for more info.
-@@ -1204,8 +1216,7 @@ static unsigned int ata_scsi_start_stop_
- scmd->scsi_done = qc->scsidone;
- qc->scsidone = ata_delayed_done;
- }
-- scmd->result = SAM_STAT_GOOD;
-- return 1;
-+ goto skip;
- }
-
- /* Issue ATA STANDBY IMMEDIATE command */
-@@ -1221,10 +1232,13 @@ static unsigned int ata_scsi_start_stop_
-
- return 0;
-
--invalid_fld:
-+ invalid_fld:
- ata_scsi_set_sense(scmd, ILLEGAL_REQUEST, 0x24, 0x0);
- /* "Invalid field in cbd" */
- return 1;
-+ skip:
-+ scmd->result = SAM_STAT_GOOD;
-+ return 1;
- }
-
-
-Index: linux-2.6.27/include/linux/libata.h
-===================================================================
---- linux-2.6.27.orig/include/linux/libata.h
-+++ linux-2.6.27/include/linux/libata.h
-@@ -186,6 +186,8 @@ enum {
- ATA_FLAG_PIO_POLLING = (1 << 9), /* use polling PIO if LLD
- * doesn't handle PIO interrupts */
- ATA_FLAG_NCQ = (1 << 10), /* host supports NCQ */
-+ ATA_FLAG_NO_POWEROFF_SPINDOWN = (1 << 11), /* don't spindown before poweroff */
-+ ATA_FLAG_NO_HIBERNATE_SPINDOWN = (1 << 12), /* don't spindown before hibernation */
- ATA_FLAG_DEBUGMSG = (1 << 13),
- ATA_FLAG_IGN_SIMPLEX = (1 << 15), /* ignore SIMPLEX */
- ATA_FLAG_NO_IORDY = (1 << 16), /* controller lacks iordy */