projects/linux·commit 81afe893

libata: clear TF before IDENTIFYing

81afe893 · Tejun Heo <[email protected]> · 2007-02-07 12:37:41 -08:00

Some devices chock if Feature is not clear when IDENTIFY is issued.
Set ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE for IDENTIFY such that whole
TF is cleared when reading ID data.

Kudos to Art Haas for testing various futile patches over several
months and Mark Lord for pointing out the fix.

Signed-off-by: Tejun Heo <[email protected]>
Cc: Art Haas <[email protected]>
Cc: Mark Lord <[email protected]>
Signed-off-by: Jeff Garzik <[email protected]>
Commit
81afe893181b283f9d182ea8637ce6ccdbe1a56a
Parents
f834e49f

Changes

1 files changed · +10 −1

FileStatusAddDelContent
drivers/ata/libata-core.cmodified+10−1View file

drivers/ata/libata-core.c

View file
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 25d8d3f..2cf8251 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -1410,7 +1410,16 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
}
tf.protocol = ATA_PROT_PIO;
- tf.flags |= ATA_TFLAG_POLLING; /* for polling presence detection */
+
+ /* Some devices choke if TF registers contain garbage. Make
+ * sure those are properly initialized.
+ */
+ tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
+
+ /* Device presence detection is unreliable on some
+ * controllers. Always poll IDENTIFY if available.
+ */
+ tf.flags |= ATA_TFLAG_POLLING;
err_mask = ata_exec_internal(dev, &tf, NULL, DMA_FROM_DEVICE,
id, sizeof(id[0]) * ATA_ID_WORDS);