ata: libata-scsi: Disable scsi device manage_system_start_stop
[linux-2.6-microblaze.git] / drivers / ata / libata-core.c
index 8e35afe..a0bc016 100644 (file)
@@ -1972,6 +1972,96 @@ retry:
        return rc;
 }
 
+/**
+ *     ata_dev_power_set_standby - Set a device power mode to standby
+ *     @dev: target device
+ *
+ *     Issue a STANDBY IMMEDIATE command to set a device power mode to standby.
+ *     For an HDD device, this spins down the disks.
+ *
+ *     LOCKING:
+ *     Kernel thread context (may sleep).
+ */
+void ata_dev_power_set_standby(struct ata_device *dev)
+{
+       unsigned long ap_flags = dev->link->ap->flags;
+       struct ata_taskfile tf;
+       unsigned int err_mask;
+
+       /* Issue STANDBY IMMEDIATE command only if supported by the device */
+       if (dev->class != ATA_DEV_ATA && dev->class != ATA_DEV_ZAC)
+               return;
+
+       /*
+        * Some odd clown BIOSes issue spindown on power off (ACPI S4 or S5)
+        * causing some drives to spin up and down again. For these, do nothing
+        * if we are being called on shutdown.
+        */
+       if ((ap_flags & ATA_FLAG_NO_POWEROFF_SPINDOWN) &&
+           system_state == SYSTEM_POWER_OFF)
+               return;
+
+       if ((ap_flags & ATA_FLAG_NO_HIBERNATE_SPINDOWN) &&
+           system_entering_hibernation())
+               return;
+
+       ata_tf_init(dev, &tf);
+       tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR;
+       tf.protocol = ATA_PROT_NODATA;
+       tf.command = ATA_CMD_STANDBYNOW1;
+
+       ata_dev_notice(dev, "Entering standby power mode\n");
+
+       err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0);
+       if (err_mask)
+               ata_dev_err(dev, "STANDBY IMMEDIATE failed (err_mask=0x%x)\n",
+                           err_mask);
+}
+
+/**
+ *     ata_dev_power_set_active -  Set a device power mode to active
+ *     @dev: target device
+ *
+ *     Issue a VERIFY command to enter to ensure that the device is in the
+ *     active power mode. For a spun-down HDD (standby or idle power mode),
+ *     the VERIFY command will complete after the disk spins up.
+ *
+ *     LOCKING:
+ *     Kernel thread context (may sleep).
+ */
+void ata_dev_power_set_active(struct ata_device *dev)
+{
+       struct ata_taskfile tf;
+       unsigned int err_mask;
+
+       /*
+        * Issue READ VERIFY SECTORS command for 1 sector at lba=0 only
+        * if supported by the device.
+        */
+       if (dev->class != ATA_DEV_ATA && dev->class != ATA_DEV_ZAC)
+               return;
+
+       ata_tf_init(dev, &tf);
+       tf.flags |= ATA_TFLAG_DEVICE | ATA_TFLAG_ISADDR;
+       tf.protocol = ATA_PROT_NODATA;
+       tf.command = ATA_CMD_VERIFY;
+       tf.nsect = 1;
+       if (dev->flags & ATA_DFLAG_LBA) {
+               tf.flags |= ATA_TFLAG_LBA;
+               tf.device |= ATA_LBA;
+       } else {
+               /* CHS */
+               tf.lbal = 0x1; /* sect */
+       }
+
+       ata_dev_notice(dev, "Entering active power mode\n");
+
+       err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0, 0);
+       if (err_mask)
+               ata_dev_err(dev, "VERIFY failed (err_mask=0x%x)\n",
+                           err_mask);
+}
+
 /**
  *     ata_read_log_page - read a specific log page
  *     @dev: target device