|
@@ -2759,7 +2759,11 @@ static int ata_dev_set_mode(struct ata_device *dev)
|
|
|
/* Old CFA may refuse this command, which is just fine */
|
|
|
if (dev->xfer_shift == ATA_SHIFT_PIO && ata_id_is_cfa(dev->id))
|
|
|
err_mask &= ~AC_ERR_DEV;
|
|
|
-
|
|
|
+ /* Some very old devices and some bad newer ones fail any kind of
|
|
|
+ SET_XFERMODE request but support PIO0-2 timings and no IORDY */
|
|
|
+ if (dev->xfer_shift == ATA_SHIFT_PIO && !ata_id_has_iordy(dev->id) &&
|
|
|
+ dev->pio_mode <= XFER_PIO_2)
|
|
|
+ err_mask &= ~AC_ERR_DEV;
|
|
|
if (err_mask) {
|
|
|
ata_dev_printk(dev, KERN_ERR, "failed to set xfermode "
|
|
|
"(err_mask=0x%x)\n", err_mask);
|