diff options
-rw-r--r-- | drivers/ata/libata-core.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 2556ea29defb..733eb94d055e 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -3132,16 +3132,21 @@ static int ata_dev_set_mode(struct ata_device *dev) | |||
3132 | if (rc) | 3132 | if (rc) |
3133 | return rc; | 3133 | return rc; |
3134 | 3134 | ||
3135 | /* Old CFA may refuse this command, which is just fine */ | 3135 | if (dev->xfer_shift == ATA_SHIFT_PIO) { |
3136 | if (dev->xfer_shift == ATA_SHIFT_PIO && ata_id_is_cfa(dev->id)) | 3136 | /* Old CFA may refuse this command, which is just fine */ |
3137 | ign_dev_err = 1; | 3137 | if (ata_id_is_cfa(dev->id)) |
3138 | 3138 | ign_dev_err = 1; | |
3139 | /* Some very old devices and some bad newer ones fail any kind of | 3139 | /* Catch several broken garbage emulations plus some pre |
3140 | SET_XFERMODE request but support PIO0-2 timings and no IORDY */ | 3140 | ATA devices */ |
3141 | if (dev->xfer_shift == ATA_SHIFT_PIO && !ata_id_has_iordy(dev->id) && | 3141 | if (ata_id_major_version(dev->id) == 0 && |
3142 | dev->pio_mode <= XFER_PIO_2) | 3142 | dev->pio_mode <= XFER_PIO_2) |
3143 | ign_dev_err = 1; | 3143 | ign_dev_err = 1; |
3144 | 3144 | /* Some very old devices and some bad newer ones fail | |
3145 | any kind of SET_XFERMODE request but support PIO0-2 | ||
3146 | timings and no IORDY */ | ||
3147 | if (!ata_id_has_iordy(dev->id) && dev->pio_mode <= XFER_PIO_2) | ||
3148 | ign_dev_err = 1; | ||
3149 | } | ||
3145 | /* Early MWDMA devices do DMA but don't allow DMA mode setting. | 3150 | /* Early MWDMA devices do DMA but don't allow DMA mode setting. |
3146 | Don't fail an MWDMA0 set IFF the device indicates it is in MWDMA0 */ | 3151 | Don't fail an MWDMA0 set IFF the device indicates it is in MWDMA0 */ |
3147 | if (dev->xfer_shift == ATA_SHIFT_MWDMA && | 3152 | if (dev->xfer_shift == ATA_SHIFT_MWDMA && |