Merge ssh://master.kernel.org/pub/scm/linux/kernel/git/sam/kbuild
[deliverable/linux.git] / drivers / scsi / aic94xx / aic94xx_task.c
index e2ad5bed94035c0dd594c237e0c59a8dba3dd1c1..ee0a98bffcd4c0fec572afd6e67e707c4ddb1cca 100644 (file)
@@ -74,8 +74,13 @@ static inline int asd_map_scatterlist(struct sas_task *task,
                return 0;
        }
 
-       num_sg = pci_map_sg(asd_ha->pcidev, task->scatter, task->num_scatter,
-                           task->data_dir);
+       /* STP tasks come from libata which has already mapped
+        * the SG list */
+       if (sas_protocol_ata(task->task_proto))
+               num_sg = task->num_scatter;
+       else
+               num_sg = pci_map_sg(asd_ha->pcidev, task->scatter,
+                                   task->num_scatter, task->data_dir);
        if (num_sg == 0)
                return -ENOMEM;
 
@@ -89,7 +94,7 @@ static inline int asd_map_scatterlist(struct sas_task *task,
                        res = -ENOMEM;
                        goto err_unmap;
                }
-               for (sc = task->scatter, i = 0; i < num_sg; i++, sc++) {
+               for_each_sg(task->scatter, sc, num_sg, i) {
                        struct sg_el *sg =
                                &((struct sg_el *)ascb->sg_arr->vaddr)[i];
                        sg->bus_addr = cpu_to_le64((u64)sg_dma_address(sc));
@@ -98,7 +103,7 @@ static inline int asd_map_scatterlist(struct sas_task *task,
                                sg->flags |= ASD_SG_EL_LIST_EOL;
                }
 
-               for (sc = task->scatter, i = 0; i < 2; i++, sc++) {
+               for_each_sg(task->scatter, sc, 2, i) {
                        sg_arr[i].bus_addr =
                                cpu_to_le64((u64)sg_dma_address(sc));
                        sg_arr[i].size = cpu_to_le32((u32)sg_dma_len(sc));
@@ -110,7 +115,7 @@ static inline int asd_map_scatterlist(struct sas_task *task,
                sg_arr[2].bus_addr=cpu_to_le64((u64)ascb->sg_arr->dma_handle);
        } else {
                int i;
-               for (sc = task->scatter, i = 0; i < num_sg; i++, sc++) {
+               for_each_sg(task->scatter, sc, num_sg, i) {
                        sg_arr[i].bus_addr =
                                cpu_to_le64((u64)sg_dma_address(sc));
                        sg_arr[i].size = cpu_to_le32((u32)sg_dma_len(sc));
@@ -120,8 +125,9 @@ static inline int asd_map_scatterlist(struct sas_task *task,
 
        return 0;
 err_unmap:
-       pci_unmap_sg(asd_ha->pcidev, task->scatter, task->num_scatter,
-                    task->data_dir);
+       if (sas_protocol_ata(task->task_proto))
+               pci_unmap_sg(asd_ha->pcidev, task->scatter, task->num_scatter,
+                            task->data_dir);
        return res;
 }
 
@@ -142,8 +148,9 @@ static inline void asd_unmap_scatterlist(struct asd_ascb *ascb)
        }
 
        asd_free_coherent(asd_ha, ascb->sg_arr);
-       pci_unmap_sg(asd_ha->pcidev, task->scatter, task->num_scatter,
-                    task->data_dir);
+       if (task->task_proto != SAS_PROTOCOL_STP)
+               pci_unmap_sg(asd_ha->pcidev, task->scatter, task->num_scatter,
+                            task->data_dir);
 }
 
 /* ---------- Task complete tasklet ---------- */
@@ -200,7 +207,7 @@ static void asd_get_response_tasklet(struct asd_ascb *ascb,
                                            "stat(0x%x) is not CHECK_CONDITION"
                                            "\n",
                                            SAS_ADDR(task->dev->sas_addr),
-                                           ts->stat);
+                                           iu->status);
                        }
                }
        }  else {
@@ -391,7 +398,6 @@ static int asd_build_ata_ascb(struct asd_ascb *ascb, struct sas_task *task,
 
        scb->ata_task.total_xfer_len = cpu_to_le32(task->total_xfer_len);
        scb->ata_task.fis = task->ata_task.fis;
-       scb->ata_task.fis.fis_type = 0x27;
        if (likely(!task->ata_task.device_control_reg_update))
                scb->ata_task.fis.flags |= 0x80; /* C=1: update ATA cmd reg */
        scb->ata_task.fis.flags &= 0xF0; /* PM_PORT field shall be 0 */
@@ -445,7 +451,7 @@ static int asd_build_smp_ascb(struct asd_ascb *ascb, struct sas_task *task,
        struct scb *scb;
 
        pci_map_sg(asd_ha->pcidev, &task->smp_task.smp_req, 1,
-                  PCI_DMA_FROMDEVICE);
+                  PCI_DMA_TODEVICE);
        pci_map_sg(asd_ha->pcidev, &task->smp_task.smp_resp, 1,
                   PCI_DMA_FROMDEVICE);
 
@@ -480,7 +486,7 @@ static void asd_unbuild_smp_ascb(struct asd_ascb *a)
 
        BUG_ON(!task);
        pci_unmap_sg(a->ha->pcidev, &task->smp_task.smp_req, 1,
-                    PCI_DMA_FROMDEVICE);
+                    PCI_DMA_TODEVICE);
        pci_unmap_sg(a->ha->pcidev, &task->smp_task.smp_resp, 1,
                     PCI_DMA_FROMDEVICE);
 }
This page took 0.025196 seconds and 5 git commands to generate.