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
I'm resending this now that reverse-DNS has been fixed on our out-going mail server.
Jeff, this would be a very good thing to queue up for 2.6.22, as otherwise drives become permanent paperweights when the "power-up-in-standby" feature is turned on.
Cheers
-------- Original Message --------
Subject: [PATCH] libata: Handle drives that require a spin-up command before first access
Date: Tue, 17 Apr 2007 18:26:07 -0400
From: Mark Lord <[email protected]>
To: Jeff Garzik <[email protected]>, IDE/ATA development list <[email protected]>
CC: Tejun Heo <[email protected]>, Alan Cox <[email protected]>
(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:
Quoted 37 lines · Mark Lord
I'm resending this now that reverse-DNS has been fixed on our out-going mail server.
Jeff, this would be a very good thing to queue up for 2.6.22, as otherwise drives become permanent paperweights when the "power-up-in-standby" feature is turned on.
Cheers
-------- Original Message --------
Subject: [PATCH] libata: Handle drives that require a spin-up command before first access
Date: Tue, 17 Apr 2007 18:26:07 -0400
From: Mark Lord <[email protected]>
To: Jeff Garzik <[email protected]>, IDE/ATA development list <[email protected]>
CC: Tejun Heo <[email protected]>, Alan Cox <[email protected]>(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]>
Signature · 1 line
tejun