libata: add support for NCQ commands for SG interface
authorVinayak Kale <vinayak.kale@seagate.com>
Tue, 27 Oct 2015 05:49:15 +0000 (11:19 +0530)
committerTejun Heo <tj@kernel.org>
Tue, 27 Oct 2015 06:09:01 +0000 (15:09 +0900)
This patch is needed to make NCQ commands with FPDMA protocol value
(eg READ/WRITE FPDMA) work over SCSI Generic (SG) interface.

Signed-off-by: Vinayak Kale <vinayak.kale@seagate.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
drivers/ata/libata-scsi.c

index 560cedea2b40c19f4665c36549b5e8ec8437fd97..8dffa99909850459eb88b825cc618b5e4049ca25 100644 (file)
@@ -2912,12 +2912,14 @@ ata_scsi_map_proto(u8 byte1)
        case 5:         /* PIO Data-out */
                return ATA_PROT_PIO;
 
+       case 12:        /* FPDMA */
+               return ATA_PROT_NCQ;
+
        case 0:         /* Hard Reset */
        case 1:         /* SRST */
        case 8:         /* Device Diagnostic */
        case 9:         /* Device Reset */
        case 7:         /* DMA Queued */
-       case 12:        /* FPDMA */
        case 15:        /* Return Response Info */
        default:        /* Reserved */
                break;
@@ -2990,6 +2992,10 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
                tf->command = cdb[9];
        }
 
+       /* For NCQ commands with FPDMA protocol, copy the tag value */
+       if (tf->protocol == ATA_PROT_NCQ)
+               tf->nsect = qc->tag << 3;
+
        /* enforce correct master/slave bit */
        tf->device = dev->devno ?
                tf->device | ATA_DEV1 : tf->device & ~ATA_DEV1;