]> err.no Git - linux-2.6/blobdiff - drivers/scsi/aic94xx/aic94xx_task.c
[SCSI] aic94xx: Don't call pci_map_sg for already-mapped scatterlists
[linux-2.6] / drivers / scsi / aic94xx / aic94xx_task.c
index e2ad5bed94035c0dd594c237e0c59a8dba3dd1c1..6c12c0f19f394ae0c87e0fac907dcb5785482aa4 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 (task->task_proto == SAS_PROTOCOL_STP)
+               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;
 
@@ -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 (task->task_proto != SAS_PROTOCOL_STP)
+               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 ---------- */
@@ -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 */