diff options
author | Hannes Reinecke <hare@suse.de> | 2016-07-13 20:05:48 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2016-07-15 08:08:13 -0400 |
commit | 5b844b63ddfb65aef923eaabe0420196fd71dd13 (patch) | |
tree | 6bc13465e720117bdeb105fd0e8df481c2fe2711 | |
parent | 5b51ba6178f5502e6ab1bba75e91a365bc4c718b (diff) |
ata: Handle ATA NCQ NO-DATA commands correctly
Add a new taskfile protocol ATA_PROT_NCQ_NODATA to handle
ATA NCQ NO-DATA commands correctly.
And fixup ata_scsi_zbc_out_xlat() to use it.
Signed-off-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Tejun Heo <tj@kernel.org>
-rw-r--r-- | drivers/ata/libata-eh.c | 3 | ||||
-rw-r--r-- | drivers/ata/libata-scsi.c | 5 | ||||
-rw-r--r-- | drivers/ata/sata_dwc_460ex.c | 2 | ||||
-rw-r--r-- | include/linux/ata.h | 1 | ||||
-rw-r--r-- | include/linux/libata.h | 2 | ||||
-rw-r--r-- | include/trace/events/libata.h | 1 |
6 files changed, 12 insertions, 2 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 5688b86b192d..d551378bc60e 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -2611,7 +2611,8 @@ static void ata_eh_link_report(struct ata_link *link) | |||
2611 | [ATA_PROT_NODATA] = "nodata", | 2611 | [ATA_PROT_NODATA] = "nodata", |
2612 | [ATA_PROT_PIO] = "pio", | 2612 | [ATA_PROT_PIO] = "pio", |
2613 | [ATA_PROT_DMA] = "dma", | 2613 | [ATA_PROT_DMA] = "dma", |
2614 | [ATA_PROT_NCQ] = "ncq", | 2614 | [ATA_PROT_NCQ] = "ncq dma", |
2615 | [ATA_PROT_NCQ_NODATA] = "ncq nodata", | ||
2615 | [ATAPI_PROT_NODATA] = "nodata", | 2616 | [ATAPI_PROT_NODATA] = "nodata", |
2616 | [ATAPI_PROT_PIO] = "pio", | 2617 | [ATAPI_PROT_PIO] = "pio", |
2617 | [ATAPI_PROT_DMA] = "dma", | 2618 | [ATAPI_PROT_DMA] = "dma", |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 0447a391fb7a..901b46a6e993 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -3082,6 +3082,9 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc) | |||
3082 | goto invalid_fld; | 3082 | goto invalid_fld; |
3083 | } | 3083 | } |
3084 | 3084 | ||
3085 | if (ata_is_ncq(tf->protocol) && (cdb[2] & 0x3) == 0) | ||
3086 | tf->protocol = ATA_PROT_NCQ_NODATA; | ||
3087 | |||
3085 | /* enable LBA */ | 3088 | /* enable LBA */ |
3086 | tf->flags |= ATA_TFLAG_LBA; | 3089 | tf->flags |= ATA_TFLAG_LBA; |
3087 | 3090 | ||
@@ -3548,7 +3551,7 @@ static unsigned int ata_scsi_zbc_out_xlat(struct ata_queued_cmd *qc) | |||
3548 | 3551 | ||
3549 | if (ata_ncq_enabled(qc->dev) && | 3552 | if (ata_ncq_enabled(qc->dev) && |
3550 | ata_fpdma_zac_mgmt_out_supported(qc->dev)) { | 3553 | ata_fpdma_zac_mgmt_out_supported(qc->dev)) { |
3551 | tf->protocol = ATA_PROT_NCQ; | 3554 | tf->protocol = ATA_PROT_NCQ_NODATA; |
3552 | tf->command = ATA_CMD_NCQ_NON_DATA; | 3555 | tf->command = ATA_CMD_NCQ_NON_DATA; |
3553 | tf->hob_nsect = ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT; | 3556 | tf->hob_nsect = ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT; |
3554 | tf->nsect = qc->tag << 3; | 3557 | tf->nsect = qc->tag << 3; |
diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_460ex.c index 00c2af1d211b..fa1530a9dc03 100644 --- a/drivers/ata/sata_dwc_460ex.c +++ b/drivers/ata/sata_dwc_460ex.c | |||
@@ -290,6 +290,8 @@ static const char *get_prot_descript(u8 protocol) | |||
290 | return "ATA DMA"; | 290 | return "ATA DMA"; |
291 | case ATA_PROT_NCQ: | 291 | case ATA_PROT_NCQ: |
292 | return "ATA NCQ"; | 292 | return "ATA NCQ"; |
293 | case ATA_PROT_NCQ_NODATA: | ||
294 | return "ATA NCQ no data"; | ||
293 | case ATAPI_PROT_NODATA: | 295 | case ATAPI_PROT_NODATA: |
294 | return "ATAPI no data"; | 296 | return "ATAPI no data"; |
295 | case ATAPI_PROT_PIO: | 297 | case ATAPI_PROT_PIO: |
diff --git a/include/linux/ata.h b/include/linux/ata.h index d20b1ee127b0..35857d1f15c8 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
@@ -530,6 +530,7 @@ enum ata_tf_protocols { | |||
530 | ATA_PROT_PIO, /* PIO data xfer */ | 530 | ATA_PROT_PIO, /* PIO data xfer */ |
531 | ATA_PROT_DMA, /* DMA */ | 531 | ATA_PROT_DMA, /* DMA */ |
532 | ATA_PROT_NCQ, /* NCQ */ | 532 | ATA_PROT_NCQ, /* NCQ */ |
533 | ATA_PROT_NCQ_NODATA, /* NCQ no data */ | ||
533 | ATAPI_PROT_NODATA, /* packet command, no data */ | 534 | ATAPI_PROT_NODATA, /* packet command, no data */ |
534 | ATAPI_PROT_PIO, /* packet command, PIO data xfer*/ | 535 | ATAPI_PROT_PIO, /* packet command, PIO data xfer*/ |
535 | ATAPI_PROT_DMA, /* packet command with special DMA sauce */ | 536 | ATAPI_PROT_DMA, /* packet command with special DMA sauce */ |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 4e5a09c6dc10..1abd6690c776 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -1053,6 +1053,8 @@ static inline unsigned int ata_prot_flags(u8 prot) | |||
1053 | return ATA_PROT_FLAG_DMA; | 1053 | return ATA_PROT_FLAG_DMA; |
1054 | case ATA_PROT_NCQ: | 1054 | case ATA_PROT_NCQ: |
1055 | return ATA_PROT_FLAG_DMA | ATA_PROT_FLAG_NCQ; | 1055 | return ATA_PROT_FLAG_DMA | ATA_PROT_FLAG_NCQ; |
1056 | case ATA_PROT_NCQ_NODATA: | ||
1057 | return ATA_PROT_FLAG_NCQ; | ||
1056 | case ATAPI_PROT_NODATA: | 1058 | case ATAPI_PROT_NODATA: |
1057 | return ATA_PROT_FLAG_ATAPI; | 1059 | return ATA_PROT_FLAG_ATAPI; |
1058 | case ATAPI_PROT_PIO: | 1060 | case ATAPI_PROT_PIO: |
diff --git a/include/trace/events/libata.h b/include/trace/events/libata.h index 75fff8696bae..2fbbf990e4b3 100644 --- a/include/trace/events/libata.h +++ b/include/trace/events/libata.h | |||
@@ -126,6 +126,7 @@ | |||
126 | ata_protocol_name(ATA_PROT_PIO), \ | 126 | ata_protocol_name(ATA_PROT_PIO), \ |
127 | ata_protocol_name(ATA_PROT_DMA), \ | 127 | ata_protocol_name(ATA_PROT_DMA), \ |
128 | ata_protocol_name(ATA_PROT_NCQ), \ | 128 | ata_protocol_name(ATA_PROT_NCQ), \ |
129 | ata_protocol_name(ATA_PROT_NCQ_NODATA), \ | ||
129 | ata_protocol_name(ATAPI_PROT_NODATA), \ | 130 | ata_protocol_name(ATAPI_PROT_NODATA), \ |
130 | ata_protocol_name(ATAPI_PROT_PIO), \ | 131 | ata_protocol_name(ATAPI_PROT_PIO), \ |
131 | ata_protocol_name(ATAPI_PROT_DMA)) | 132 | ata_protocol_name(ATAPI_PROT_DMA)) |