Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Hannes Reinecke and committed by
Tejun Heo
5b844b63 5b51ba61

+12 -2
+2 -1
drivers/ata/libata-eh.c
··· 2611 2611 [ATA_PROT_NODATA] = "nodata", 2612 2612 [ATA_PROT_PIO] = "pio", 2613 2613 [ATA_PROT_DMA] = "dma", 2614 - [ATA_PROT_NCQ] = "ncq", 2614 + [ATA_PROT_NCQ] = "ncq dma", 2615 + [ATA_PROT_NCQ_NODATA] = "ncq nodata", 2615 2616 [ATAPI_PROT_NODATA] = "nodata", 2616 2617 [ATAPI_PROT_PIO] = "pio", 2617 2618 [ATAPI_PROT_DMA] = "dma",
+4 -1
drivers/ata/libata-scsi.c
··· 3082 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 3088 /* enable LBA */ 3086 3089 tf->flags |= ATA_TFLAG_LBA; 3087 3090 ··· 3551 3548 3552 3549 if (ata_ncq_enabled(qc->dev) && 3553 3550 ata_fpdma_zac_mgmt_out_supported(qc->dev)) { 3554 - tf->protocol = ATA_PROT_NCQ; 3551 + tf->protocol = ATA_PROT_NCQ_NODATA; 3555 3552 tf->command = ATA_CMD_NCQ_NON_DATA; 3556 3553 tf->hob_nsect = ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT; 3557 3554 tf->nsect = qc->tag << 3;
+2
drivers/ata/sata_dwc_460ex.c
··· 290 290 return "ATA DMA"; 291 291 case ATA_PROT_NCQ: 292 292 return "ATA NCQ"; 293 + case ATA_PROT_NCQ_NODATA: 294 + return "ATA NCQ no data"; 293 295 case ATAPI_PROT_NODATA: 294 296 return "ATAPI no data"; 295 297 case ATAPI_PROT_PIO:
+1
include/linux/ata.h
··· 530 530 ATA_PROT_PIO, /* PIO data xfer */ 531 531 ATA_PROT_DMA, /* DMA */ 532 532 ATA_PROT_NCQ, /* NCQ */ 533 + ATA_PROT_NCQ_NODATA, /* NCQ no data */ 533 534 ATAPI_PROT_NODATA, /* packet command, no data */ 534 535 ATAPI_PROT_PIO, /* packet command, PIO data xfer*/ 535 536 ATAPI_PROT_DMA, /* packet command with special DMA sauce */
+2
include/linux/libata.h
··· 1053 1053 return ATA_PROT_FLAG_DMA; 1054 1054 case ATA_PROT_NCQ: 1055 1055 return ATA_PROT_FLAG_DMA | ATA_PROT_FLAG_NCQ; 1056 + case ATA_PROT_NCQ_NODATA: 1057 + return ATA_PROT_FLAG_NCQ; 1056 1058 case ATAPI_PROT_NODATA: 1057 1059 return ATA_PROT_FLAG_ATAPI; 1058 1060 case ATAPI_PROT_PIO:
+1
include/trace/events/libata.h
··· 126 126 ata_protocol_name(ATA_PROT_PIO), \ 127 127 ata_protocol_name(ATA_PROT_DMA), \ 128 128 ata_protocol_name(ATA_PROT_NCQ), \ 129 + ata_protocol_name(ATA_PROT_NCQ_NODATA), \ 129 130 ata_protocol_name(ATAPI_PROT_NODATA), \ 130 131 ata_protocol_name(ATAPI_PROT_PIO), \ 131 132 ata_protocol_name(ATAPI_PROT_DMA))