Make CFA SETXFER failure handling into HORKAGE. This will be used to allow other cases to ignore SETXFER failure. Signed-off-by: Tejun Heo <htejun@xxxxxxxxx> --- drivers/ata/libata-core.c | 15 ++++++++++----- include/linux/libata.h | 1 + 2 files changed, 11 insertions(+), 5 deletions(-) Index: work/drivers/ata/libata-core.c =================================================================== --- work.orig/drivers/ata/libata-core.c +++ work/drivers/ata/libata-core.c @@ -1898,7 +1898,7 @@ int ata_dev_configure(struct ata_device * common ATA, ATAPI feature tests */ - /* find max transfer mode; for printk only */ + /* determine xfermask */ xfer_mask = ata_id_xfermask(id); if (ata_msg_probe(ap)) @@ -1919,8 +1919,13 @@ int ata_dev_configure(struct ata_device "supports DRM functions and may " "not be fully accessable.\n"); snprintf(revbuf, 7, "CFA"); - } - else + + /* Old CFA may refuse SETFEATURES_XFER, which + * is just fine + */ + if (!(xfer_mask & ~ATA_MASK_PIO)) + dev->horkage |= ATA_HORKAGE_SETXFER; + } else snprintf(revbuf, 7, "ATA-%d", ata_id_major_version(id)); dev->n_sectors = ata_id_n_sectors(id); @@ -2775,8 +2780,8 @@ static int ata_dev_set_mode(struct ata_d dev->flags |= ATA_DFLAG_PIO; err_mask = ata_dev_set_xfermode(dev); - /* Old CFA may refuse this command, which is just fine */ - if (dev->xfer_shift == ATA_SHIFT_PIO && ata_id_is_cfa(dev->id)) + + if (dev->horkage & ATA_HORKAGE_SETXFER) err_mask &= ~AC_ERR_DEV; if (err_mask) { Index: work/include/linux/libata.h =================================================================== --- work.orig/include/linux/libata.h +++ work/include/linux/libata.h @@ -298,6 +298,7 @@ enum { ATA_HORKAGE_NODMA = (1 << 1), /* DMA problems */ ATA_HORKAGE_NONCQ = (1 << 2), /* Don't use NCQ */ ATA_HORKAGE_MAX_SEC_128 = (1 << 3), /* Limit max sects to 128 */ + ATA_HORKAGE_SETXFER = (1 << 4), /* SETFEATURES_XFER may fail */ }; enum hsm_task_states { - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html