scsi: hisi_sas: Drop SMP resp frame DMA mapping
authorJohn Garry <john.garry@huawei.com>
Mon, 5 Aug 2019 13:48:07 +0000 (21:48 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 8 Aug 2019 02:13:15 +0000 (22:13 -0400)
The SMP frame response is written to the command table and not the SMP
response pointer from libsas, so don't bother DMA mapping (and unmapping)
the SMP response from libsas.

Suggested-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/hisi_sas/hisi_sas_main.c
drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c

index 39ae69e42d2658e74981b713651fe31b7bfb08e0..a2255701b50bb85228cd46ca654211a842405838 100644 (file)
@@ -300,7 +300,7 @@ static void hisi_sas_task_prep_abort(struct hisi_hba *hisi_hba,
 
 static void hisi_sas_dma_unmap(struct hisi_hba *hisi_hba,
                               struct sas_task *task, int n_elem,
-                              int n_elem_req, int n_elem_resp)
+                              int n_elem_req)
 {
        struct device *dev = hisi_hba->dev;
 
@@ -314,16 +314,13 @@ static void hisi_sas_dma_unmap(struct hisi_hba *hisi_hba,
                        if (n_elem_req)
                                dma_unmap_sg(dev, &task->smp_task.smp_req,
                                             1, DMA_TO_DEVICE);
-                       if (n_elem_resp)
-                               dma_unmap_sg(dev, &task->smp_task.smp_resp,
-                                            1, DMA_FROM_DEVICE);
                }
        }
 }
 
 static int hisi_sas_dma_map(struct hisi_hba *hisi_hba,
                            struct sas_task *task, int *n_elem,
-                           int *n_elem_req, int *n_elem_resp)
+                           int *n_elem_req)
 {
        struct device *dev = hisi_hba->dev;
        int rc;
@@ -331,7 +328,7 @@ static int hisi_sas_dma_map(struct hisi_hba *hisi_hba,
        if (sas_protocol_ata(task->task_proto)) {
                *n_elem = task->num_scatter;
        } else {
-               unsigned int req_len, resp_len;
+               unsigned int req_len;
 
                if (task->num_scatter) {
                        *n_elem = dma_map_sg(dev, task->scatter,
@@ -352,17 +349,6 @@ static int hisi_sas_dma_map(struct hisi_hba *hisi_hba,
                                rc = -EINVAL;
                                goto err_out_dma_unmap;
                        }
-                       *n_elem_resp = dma_map_sg(dev, &task->smp_task.smp_resp,
-                                                 1, DMA_FROM_DEVICE);
-                       if (!*n_elem_resp) {
-                               rc = -ENOMEM;
-                               goto err_out_dma_unmap;
-                       }
-                       resp_len = sg_dma_len(&task->smp_task.smp_resp);
-                       if (resp_len & 0x3) {
-                               rc = -EINVAL;
-                               goto err_out_dma_unmap;
-                       }
                }
        }
 
@@ -377,7 +363,7 @@ static int hisi_sas_dma_map(struct hisi_hba *hisi_hba,
 err_out_dma_unmap:
        /* It would be better to call dma_unmap_sg() here, but it's messy */
        hisi_sas_dma_unmap(hisi_hba, task, *n_elem,
-                          *n_elem_req, *n_elem_resp);
+                          *n_elem_req);
 prep_out:
        return rc;
 }
@@ -449,7 +435,7 @@ static int hisi_sas_task_prep(struct sas_task *task,
        struct asd_sas_port *sas_port = device->port;
        struct device *dev = hisi_hba->dev;
        int dlvry_queue_slot, dlvry_queue, rc, slot_idx;
-       int n_elem = 0, n_elem_dif = 0, n_elem_req = 0, n_elem_resp = 0;
+       int n_elem = 0, n_elem_dif = 0, n_elem_req = 0;
        struct hisi_sas_dq *dq;
        unsigned long flags;
        int wr_q_index;
@@ -485,7 +471,7 @@ static int hisi_sas_task_prep(struct sas_task *task,
        }
 
        rc = hisi_sas_dma_map(hisi_hba, task, &n_elem,
-                             &n_elem_req, &n_elem_resp);
+                             &n_elem_req);
        if (rc < 0)
                goto prep_out;
 
@@ -580,7 +566,7 @@ err_out_dif_dma_unmap:
                hisi_sas_dif_dma_unmap(hisi_hba, task, n_elem_dif);
 err_out_dma_unmap:
        hisi_sas_dma_unmap(hisi_hba, task, n_elem,
-                          n_elem_req, n_elem_resp);
+                          n_elem_req);
 prep_out:
        dev_err(dev, "task prep: failed[%d]!\n", rc);
        return rc;
index 015bf00a20e6a6e65fda09bc53960cf4398b1819..16974421cb31684a8406e8104a12e8693294603b 100644 (file)
@@ -1280,14 +1280,12 @@ static int slot_complete_v1_hw(struct hisi_hba *hisi_hba,
 
                ts->stat = SAM_STAT_GOOD;
 
-               dma_unmap_sg(dev, &task->smp_task.smp_resp, 1,
-                            DMA_FROM_DEVICE);
                dma_unmap_sg(dev, &task->smp_task.smp_req, 1,
                             DMA_TO_DEVICE);
                memcpy(to + sg_resp->offset,
                       hisi_sas_status_buf_addr_mem(slot) +
                       sizeof(struct hisi_sas_err_record),
-                      sg_dma_len(sg_resp));
+                      sg_resp->length);
                break;
        }
        case SAS_PROTOCOL_SATA:
index c3cf3b77c65564366542d1ae0eb0f9a6658b269d..9955b4fbdd0db082bc8e710057ea0683004027de 100644 (file)
@@ -2423,14 +2423,12 @@ slot_complete_v2_hw(struct hisi_hba *hisi_hba, struct hisi_sas_slot *slot)
 
                ts->stat = SAM_STAT_GOOD;
 
-               dma_unmap_sg(dev, &task->smp_task.smp_resp, 1,
-                            DMA_FROM_DEVICE);
                dma_unmap_sg(dev, &task->smp_task.smp_req, 1,
                             DMA_TO_DEVICE);
                memcpy(to + sg_resp->offset,
                       hisi_sas_status_buf_addr_mem(slot) +
                       sizeof(struct hisi_sas_err_record),
-                      sg_dma_len(sg_resp));
+                      sg_resp->length);
                break;
        }
        case SAS_PROTOCOL_SATA:
index fcb2ef5f24b9a3e9177353233276fc698f6ee4bb..95a298d4e211099affb673e1f15a5f68b5b54ae8 100644 (file)
@@ -2215,14 +2215,12 @@ slot_complete_v3_hw(struct hisi_hba *hisi_hba, struct hisi_sas_slot *slot)
 
                ts->stat = SAM_STAT_GOOD;
 
-               dma_unmap_sg(dev, &task->smp_task.smp_resp, 1,
-                            DMA_FROM_DEVICE);
                dma_unmap_sg(dev, &task->smp_task.smp_req, 1,
                             DMA_TO_DEVICE);
                memcpy(to + sg_resp->offset,
                        hisi_sas_status_buf_addr_mem(slot) +
                       sizeof(struct hisi_sas_err_record),
-                      sg_dma_len(sg_resp));
+                      sg_resp->length);
                break;
        }
        case SAS_PROTOCOL_SATA: