diff options
Diffstat (limited to 'drivers/scsi/sata_mv.c')
-rw-r--r-- | drivers/scsi/sata_mv.c | 17 |
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) | |||
783 | static void mv_fill_sg(struct ata_queued_cmd *qc) | 783 | static 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 | ||