libata: Handle drives that require a spin-up command before first access
PATCH 1/1 libata: Handle drives that require a spin-up command before first access
(S)ATA drives can be configured for "power-up in standby", a mode whereby a specific "spin up now!" command is required before the first media access.
Currently, a drive with this feature enabled can not be used at all with libata, and once in this mode, the drive becomes a doorstop.
The older drivers/ide subsystem at least enumerates the drive, so that it can be woken up after the fact from a userspace HDIO_* command, but not libata.
This patch adds support to libata for the "power-up in standby" mode where a "spin up now!" command (SET_FEATURES) is needed. With this, libata will recognize such drives, spin them up, and then re-IDENTIFY them if necessary to get a full/complete set of drive features data.
Drives in this state are determined by looking for special values in id[2], as documented in the current ATA specs.
---
drivers/ata/libata-core.c +0 -0
@@ -1453,6 +1453,7 @@
struct ata_taskfile tf; unsigned int err_mask = 0; const char *reason; + int tried_spinup = 0; int rc; if (ata_msg_ctl(ap)) @@ -1460,7 +1461,6 @@ __FUNCTION__, ap->id, dev->devno); ata_dev_select(ap, dev->devno, 1, 1); /* select device 0/1 */ - retry: ata_tf_init(dev, &tf);
@@ -1508,6 +1508,32 @@
goto err_out; }
+ if (!tried_spinup && (id[2] == 0x37c8 || id[2] == 0x738c)) {
+ tried_spinup = 1;
+ /*
+ * Drive powered-up in standby mode, and requires a specific
+ * SET_FEATURES spin-up subcommand before it will accept
+ * anything other than the original IDENTIFY command.
+ */
+ ata_tf_init(dev, &tf);
+ tf.command = ATA_CMD_SET_FEATURES;
+ tf.feature = SETFEATURES_SPINUP;
+ tf.protocol = ATA_PROT_NODATA;
+ tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
+ err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
+ if (err_mask) {
+ rc = -EIO;
+ reason = "SPINUP failed";
+ goto err_out;
+ }
+ /*
+ * If the drive initially returned incomplete IDENTIFY info,
+ * we now must reissue the IDENTIFY command.
+ */
+ if (id[2] == 0x37c8)
+ goto retry;
+ }
+
if ((flags & ATA_READID_POSTRESET) && class == ATA_DEV_ATA) {
/*
* The exact sequence expected by certain pre-ATA4 drives is:include/linux/ata.h +0 -0
@@ -190,6 +190,8 @@
SETFEATURES_WC_ON = 0x02, /* Enable write cache */ SETFEATURES_WC_OFF = 0x82, /* Disable write cache */
+ SETFEATURES_SPINUP = 0x07, /* Spin-up drive */
+
/* ATAPI stuff */ ATAPI_PKT_DMA = (1 << 0), ATAPI_DMADIR = (1 << 2), /* ATAPI data dir:
Jeff Garzik
AppliedQuoted 18 lines · Mark Lord
(S)ATA drives can be configured for "power-up in standby", a mode whereby a specific "spin up now!" command is required before the first media access.
Currently, a drive with this feature enabled can not be used at all with libata, and once in this mode, the drive becomes a doorstop.
The older
drivers/idesubsystem at least enumerates the drive, so that it can be woken up after the fact from a userspace HDIO_* command, but not libata.This patch adds support to libata for the "power-up in standby" mode where a "spin up now!" command (
SET_FEATURES) is needed. With this, libata will recognize such drives, spin them up, and then re-IDENTIFY them if necessary to get a full/complete set of drive features data.
Quoted 4 lines
Drives in this state are determined by looking for special values in id[2], as documented in the current ATA specs.
Signed-off-by Mark Lord <[email protected]>
applied
though I'm curious where the verify step went, that was in the previous rev of the patch
Quoted 8 lines · Jeff Garzik
Quoted 6 lines · Mark Lord
This patch adds support to libata for the "power-up in standby" mode where a "spin up now!" command (
SET_FEATURES) is needed. With this, libata will recognize such drives, spin them up, and then re-IDENTIFY them if necessary to get a full/complete set of drive features data.
Quoted 8 lines
Quoted 4 lines
Drives in this state are determined by looking for special values in id[2], as documented in the current ATA specs.
Signed-off-by Mark Lord <[email protected]>applied
though I'm curious where the verify step went, that was in the previous rev of the patch
Hi Jeff,
The difference between this patch and the first RFC version, is that I've dropped the code that attempted to deal with the *other* kind of power-up-in-standby that some drives use.
That form is enabled with a Jumper setting on the drive (eg. WD 37GB Raptor drives) rather than through software, and I was unable to figure out exactly what they wanted while I still had them here to experiment on.
Those drives are no longer in my possession, so.. no support.
The majority of drives use the software enable/disable form, which is (still) fully addressed by the patch you applied.
Thanks!
-ml