|
@@ -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);
|