From 6b9bd149e06e1dbb9510de4af27e72d027d051ad Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Tue, 8 Apr 2008 16:36:44 +0100 Subject: [PATCH] --- yaml --- r: 89287 b: refs/heads/master c: b93fda12357b3f1aa55cf69d8e088372788ea9ea h: refs/heads/master i: 89285: b478818a58a6cca598e2f066c0034eb46c9f9d54 89283: 619052ad1d5b2e44f20a9089645bf272df38b124 89279: ec46b249990d5607d8f67c9e82940ed0eb4b5a3e v: v3 --- [refs] | 2 +- trunk/drivers/ata/libata-core.c | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/[refs] b/[refs] index da1cc944b1de..4d5ecdcdb357 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f792068e43a3a156139569304b29ec8fc5dec4e3 +refs/heads/master: b93fda12357b3f1aa55cf69d8e088372788ea9ea diff --git a/trunk/drivers/ata/libata-core.c b/trunk/drivers/ata/libata-core.c index 2556ea29defb..733eb94d055e 100644 --- a/trunk/drivers/ata/libata-core.c +++ b/trunk/drivers/ata/libata-core.c @@ -3132,16 +3132,21 @@ static int ata_dev_set_mode(struct ata_device *dev) if (rc) return rc; - /* Old CFA may refuse this command, which is just fine */ - if (dev->xfer_shift == ATA_SHIFT_PIO && ata_id_is_cfa(dev->id)) - ign_dev_err = 1; - - /* 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) - ign_dev_err = 1; - + if (dev->xfer_shift == ATA_SHIFT_PIO) { + /* Old CFA may refuse this command, which is just fine */ + if (ata_id_is_cfa(dev->id)) + ign_dev_err = 1; + /* Catch several broken garbage emulations plus some pre + ATA devices */ + if (ata_id_major_version(dev->id) == 0 && + dev->pio_mode <= XFER_PIO_2) + ign_dev_err = 1; + /* 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 (!ata_id_has_iordy(dev->id) && dev->pio_mode <= XFER_PIO_2) + ign_dev_err = 1; + } /* Early MWDMA devices do DMA but don't allow DMA mode setting. Don't fail an MWDMA0 set IFF the device indicates it is in MWDMA0 */ if (dev->xfer_shift == ATA_SHIFT_MWDMA &&