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.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c
index dcef5fe8600b..ad4808ef71d4 100644
--- a/drivers/scsi/sata_mv.c
+++ b/drivers/scsi/sata_mv.c
@@ -783,23 +783,24 @@ static void mv_port_stop(struct ata_port *ap)
783static void mv_fill_sg(struct ata_queued_cmd *qc) 783static void mv_fill_sg(struct ata_queued_cmd *qc)
784{ 784{
785 struct mv_port_priv *pp = qc->ap->private_data; 785 struct mv_port_priv *pp = qc->ap->private_data;
786 unsigned int i; 786 unsigned int i = 0;
787 struct scatterlist *sg;
787 788
788 for (i = 0; i < qc->n_elem; i++) { 789 ata_for_each_sg(sg, qc) {
789 u32 sg_len; 790 u32 sg_len;
790 dma_addr_t addr; 791 dma_addr_t addr;
791 792
792 addr = sg_dma_address(&qc->sg[i]); 793 addr = sg_dma_address(sg);
793 sg_len = sg_dma_len(&qc->sg[i]); 794 sg_len = sg_dma_len(sg);
794 795
795 pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff); 796 pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff);
796 pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16); 797 pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16);
797 assert(0 == (sg_len & ~MV_DMA_BOUNDARY)); 798 assert(0 == (sg_len & ~MV_DMA_BOUNDARY));
798 pp->sg_tbl[i].flags_size = cpu_to_le32(sg_len); 799 pp->sg_tbl[i].flags_size = cpu_to_le32(sg_len);
799 } 800 if (ata_sg_is_last(sg, qc))
800 if (0 < qc->n_elem) { 801 pp->sg_tbl[i].flags_size |= cpu_to_le32(EPRD_FLAG_END_OF_TBL);
801 pp->sg_tbl[qc->n_elem - 1].flags_size |= 802
802 cpu_to_le32(EPRD_FLAG_END_OF_TBL); 803 i++;
803 } 804 }
804} 805}
805 806