libsas: enable FPDMA SEND/RECEIVE
authorHannes Reinecke <hare@suse.de>
Mon, 25 Apr 2016 10:45:44 +0000 (12:45 +0200)
committerTejun Heo <tj@kernel.org>
Mon, 9 May 2016 16:36:44 +0000 (12:36 -0400)
Update libsas and dependent drivers to handle FPDMA
SEND/RECEIVE correctly.

Signed-off-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
drivers/scsi/isci/request.c
drivers/scsi/libsas/sas_ata.c
drivers/scsi/mvsas/mv_sas.c
drivers/scsi/pm8001/pm8001_sas.c

index bbe98ec..860c9f8 100644 (file)
@@ -1630,6 +1630,8 @@ static u8 get_ata_protocol(u8 cmd, int direction)
        switch (cmd) {
        case ATA_CMD_FPDMA_WRITE:
        case ATA_CMD_FPDMA_READ:
+       case ATA_CMD_FPDMA_RECV:
+       case ATA_CMD_FPDMA_SEND:
        return SATA_PROTOCOL_FPDMA;
 
        case ATA_CMD_ID_ATA:
index cfd0084..29456e0 100644 (file)
@@ -3169,7 +3169,9 @@ static enum sci_status isci_request_stp_request_construct(struct isci_request *i
        status = sci_io_request_construct_basic_sata(ireq);
 
        if (qc && (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
-                  qc->tf.command == ATA_CMD_FPDMA_READ)) {
+                  qc->tf.command == ATA_CMD_FPDMA_READ ||
+                  qc->tf.command == ATA_CMD_FPDMA_RECV ||
+                  qc->tf.command == ATA_CMD_FPDMA_SEND)) {
                fis->sector_count = qc->tag << 3;
                ireq->tc->type.stp.ncq_tag = qc->tag;
        }
index 9c706d8..fe1cd26 100644 (file)
@@ -205,7 +205,9 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc)
        task->task_done = sas_ata_task_done;
 
        if (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
-           qc->tf.command == ATA_CMD_FPDMA_READ) {
+           qc->tf.command == ATA_CMD_FPDMA_READ ||
+           qc->tf.command == ATA_CMD_FPDMA_RECV ||
+           qc->tf.command == ATA_CMD_FPDMA_SEND) {
                /* Need to zero out the tag libata assigned us */
                qc->tf.nsect = 0;
        }
@@ -548,7 +550,7 @@ static struct ata_port_operations sas_sata_ops = {
 
 static struct ata_port_info sata_port_info = {
        .flags = ATA_FLAG_SATA | ATA_FLAG_PIO_DMA | ATA_FLAG_NCQ |
-                ATA_FLAG_SAS_HOST,
+                ATA_FLAG_SAS_HOST | ATA_FLAG_FPDMA_AUX,
        .pio_mask = ATA_PIO4,
        .mwdma_mask = ATA_MWDMA2,
        .udma_mask = ATA_UDMA6,
index 83cd3ea..db37149 100644 (file)
@@ -429,7 +429,9 @@ static u32 mvs_get_ncq_tag(struct sas_task *task, u32 *tag)
 
        if (qc) {
                if (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
-                       qc->tf.command == ATA_CMD_FPDMA_READ) {
+                   qc->tf.command == ATA_CMD_FPDMA_READ ||
+                   qc->tf.command == ATA_CMD_FPDMA_RECV ||
+                   qc->tf.command == ATA_CMD_FPDMA_SEND) {
                        *tag = qc->tag;
                        return 1;
                }
index 949198c..62abd98 100644 (file)
@@ -280,7 +280,9 @@ u32 pm8001_get_ncq_tag(struct sas_task *task, u32 *tag)
        struct ata_queued_cmd *qc = task->uldd_task;
        if (qc) {
                if (qc->tf.command == ATA_CMD_FPDMA_WRITE ||
-                       qc->tf.command == ATA_CMD_FPDMA_READ) {
+                   qc->tf.command == ATA_CMD_FPDMA_READ ||
+                   qc->tf.command == ATA_CMD_FPDMA_RECV ||
+                   qc->tf.command == ATA_CMD_FPDMA_SEND) {
                        *tag = qc->tag;
                        return 1;
                }