aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/sata_mv.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/sata_mv.c')
-rw-r--r--drivers/scsi/sata_mv.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c
index d457f5673476..be7c378dcd36 100644
--- a/drivers/scsi/sata_mv.c
+++ b/drivers/scsi/sata_mv.c
@@ -785,22 +785,24 @@ static void mv_port_stop(struct ata_port *ap)
785static void mv_fill_sg(struct ata_queued_cmd *qc) 785static void mv_fill_sg(struct ata_queued_cmd *qc)
786{ 786{
787 struct mv_port_priv *pp = qc->ap->private_data; 787 struct mv_port_priv *pp = qc->ap->private_data;
788 unsigned int i; 788 unsigned int i = 0;
789 struct scatterlist *sg;
789 790
790 for (i = 0; i < qc->n_elem; i++) { 791 ata_for_each_sg(sg, qc) {
791 u32 sg_len; 792 u32 sg_len;
792 dma_addr_t addr; 793 dma_addr_t addr;
793 794
794 addr = sg_dma_address(&qc->sg[i]); 795 addr = sg_dma_address(sg);
795 sg_len = sg_dma_len(&qc->sg[i]); 796 sg_len = sg_dma_len(sg);
796 797
797 pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff); 798 pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff);
798 pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16); 799 pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16);
799 assert(0 == (sg_len & ~MV_DMA_BOUNDARY)); 800 assert(0 == (sg_len & ~MV_DMA_BOUNDARY));
800 pp->sg_tbl[i].flags_size = cpu_to_le32(sg_len); 801 pp->sg_tbl[i].flags_size = cpu_to_le32(sg_len);
801 } 802 if (ata_sg_is_last(sg, qc))
802 if (0 < qc->n_elem) { 803 pp->sg_tbl[i].flags_size |= cpu_to_le32(EPRD_FLAG_END_OF_TBL);
803 pp->sg_tbl[qc->n_elem - 1].flags_size |= EPRD_FLAG_END_OF_TBL; 804
805 i++;
804 } 806 }
805} 807}
806 808