aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2016-07-13 20:05:48 -0400
committerTejun Heo <tj@kernel.org>2016-07-15 08:08:13 -0400
commit5b844b63ddfb65aef923eaabe0420196fd71dd13 (patch)
tree6bc13465e720117bdeb105fd0e8df481c2fe2711
parent5b51ba6178f5502e6ab1bba75e91a365bc4c718b (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.c3
-rw-r--r--drivers/ata/libata-scsi.c5
-rw-r--r--drivers/ata/sata_dwc_460ex.c2
-rw-r--r--include/linux/ata.h1
-rw-r--r--include/linux/libata.h2
-rw-r--r--include/trace/events/libata.h1
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))