diff options
-rw-r--r-- | drivers/ata/libata-core.c | 11 | ||||
-rw-r--r-- | drivers/ata/libata-scsi.c | 3 | ||||
-rw-r--r-- | include/linux/ata.h | 5 | ||||
-rw-r--r-- | include/linux/libata.h | 1 |
4 files changed, 17 insertions, 3 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 9812bbf05e62..1845119cc7f0 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -2396,6 +2396,7 @@ int ata_dev_configure(struct ata_device *dev) | |||
2396 | else if (dev->class == ATA_DEV_ATAPI) { | 2396 | else if (dev->class == ATA_DEV_ATAPI) { |
2397 | const char *cdb_intr_string = ""; | 2397 | const char *cdb_intr_string = ""; |
2398 | const char *atapi_an_string = ""; | 2398 | const char *atapi_an_string = ""; |
2399 | const char *dma_dir_string = ""; | ||
2399 | u32 sntf; | 2400 | u32 sntf; |
2400 | 2401 | ||
2401 | rc = atapi_cdb_len(id); | 2402 | rc = atapi_cdb_len(id); |
@@ -2436,13 +2437,19 @@ int ata_dev_configure(struct ata_device *dev) | |||
2436 | cdb_intr_string = ", CDB intr"; | 2437 | cdb_intr_string = ", CDB intr"; |
2437 | } | 2438 | } |
2438 | 2439 | ||
2440 | if (atapi_dmadir || atapi_id_dmadir(dev->id)) { | ||
2441 | dev->flags |= ATA_DFLAG_DMADIR; | ||
2442 | dma_dir_string = ", DMADIR"; | ||
2443 | } | ||
2444 | |||
2439 | /* print device info to dmesg */ | 2445 | /* print device info to dmesg */ |
2440 | if (ata_msg_drv(ap) && print_info) | 2446 | if (ata_msg_drv(ap) && print_info) |
2441 | ata_dev_printk(dev, KERN_INFO, | 2447 | ata_dev_printk(dev, KERN_INFO, |
2442 | "ATAPI: %s, %s, max %s%s%s\n", | 2448 | "ATAPI: %s, %s, max %s%s%s%s\n", |
2443 | modelbuf, fwrevbuf, | 2449 | modelbuf, fwrevbuf, |
2444 | ata_mode_string(xfer_mask), | 2450 | ata_mode_string(xfer_mask), |
2445 | cdb_intr_string, atapi_an_string); | 2451 | cdb_intr_string, atapi_an_string, |
2452 | dma_dir_string); | ||
2446 | } | 2453 | } |
2447 | 2454 | ||
2448 | /* determine max_sectors */ | 2455 | /* determine max_sectors */ |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index f888babc8283..0562b0a49f3b 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -2582,7 +2582,8 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) | |||
2582 | qc->tf.protocol = ATAPI_PROT_DMA; | 2582 | qc->tf.protocol = ATAPI_PROT_DMA; |
2583 | qc->tf.feature |= ATAPI_PKT_DMA; | 2583 | qc->tf.feature |= ATAPI_PKT_DMA; |
2584 | 2584 | ||
2585 | if (atapi_dmadir && (scmd->sc_data_direction != DMA_TO_DEVICE)) | 2585 | if ((dev->flags & ATA_DFLAG_DMADIR) && |
2586 | (scmd->sc_data_direction != DMA_TO_DEVICE)) | ||
2586 | /* some SATA bridges need us to indicate data xfer direction */ | 2587 | /* some SATA bridges need us to indicate data xfer direction */ |
2587 | qc->tf.feature |= ATAPI_DMADIR; | 2588 | qc->tf.feature |= ATAPI_DMADIR; |
2588 | } | 2589 | } |
diff --git a/include/linux/ata.h b/include/linux/ata.h index 78bbacaed8c4..1c622e2b0504 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
@@ -659,6 +659,11 @@ static inline int atapi_command_packet_set(const u16 *dev_id) | |||
659 | return (dev_id[0] >> 8) & 0x1f; | 659 | return (dev_id[0] >> 8) & 0x1f; |
660 | } | 660 | } |
661 | 661 | ||
662 | static inline int atapi_id_dmadir(const u16 *dev_id) | ||
663 | { | ||
664 | return ata_id_major_version(dev_id) >= 7 && (dev_id[62] & 0x8000); | ||
665 | } | ||
666 | |||
662 | static inline int is_multi_taskfile(struct ata_taskfile *tf) | 667 | static inline int is_multi_taskfile(struct ata_taskfile *tf) |
663 | { | 668 | { |
664 | return (tf->command == ATA_CMD_READ_MULTI) || | 669 | return (tf->command == ATA_CMD_READ_MULTI) || |
diff --git a/include/linux/libata.h b/include/linux/libata.h index ce7603a73156..a05f60013642 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -138,6 +138,7 @@ enum { | |||
138 | ATA_DFLAG_AN = (1 << 7), /* AN configured */ | 138 | ATA_DFLAG_AN = (1 << 7), /* AN configured */ |
139 | ATA_DFLAG_HIPM = (1 << 8), /* device supports HIPM */ | 139 | ATA_DFLAG_HIPM = (1 << 8), /* device supports HIPM */ |
140 | ATA_DFLAG_DIPM = (1 << 9), /* device supports DIPM */ | 140 | ATA_DFLAG_DIPM = (1 << 9), /* device supports DIPM */ |
141 | ATA_DFLAG_DMADIR = (1 << 10), /* device requires DMADIR */ | ||
141 | ATA_DFLAG_CFG_MASK = (1 << 12) - 1, | 142 | ATA_DFLAG_CFG_MASK = (1 << 12) - 1, |
142 | 143 | ||
143 | ATA_DFLAG_PIO = (1 << 12), /* device limited to PIO mode */ | 144 | ATA_DFLAG_PIO = (1 << 12), /* device limited to PIO mode */ |