diff options
-rw-r--r-- | drivers/ata/ahci.c | 18 | ||||
-rw-r--r-- | drivers/ata/libata-core.c | 201 | ||||
-rw-r--r-- | drivers/ata/libata-scsi.c | 2 | ||||
-rw-r--r-- | drivers/ata/pata_bf54x.c | 13 | ||||
-rw-r--r-- | drivers/ata/pata_icside.c | 3 | ||||
-rw-r--r-- | drivers/ata/pdc_adma.c | 3 | ||||
-rw-r--r-- | drivers/ata/sata_fsl.c | 4 | ||||
-rw-r--r-- | drivers/ata/sata_mv.c | 3 | ||||
-rw-r--r-- | drivers/ata/sata_nv.c | 25 | ||||
-rw-r--r-- | drivers/ata/sata_promise.c | 40 | ||||
-rw-r--r-- | drivers/ata/sata_qstor.c | 13 | ||||
-rw-r--r-- | drivers/ata/sata_sil24.c | 6 | ||||
-rw-r--r-- | drivers/ata/sata_sx4.c | 4 | ||||
-rw-r--r-- | drivers/scsi/ipr.c | 3 | ||||
-rw-r--r-- | drivers/scsi/libsas/sas_ata.c | 10 | ||||
-rw-r--r-- | include/linux/libata.h | 42 |
16 files changed, 193 insertions, 197 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 5eee91c73c90..cffad07c65bf 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -1483,28 +1483,24 @@ static void ahci_tf_read(struct ata_port *ap, struct ata_taskfile *tf) | |||
1483 | static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl) | 1483 | static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl) |
1484 | { | 1484 | { |
1485 | struct scatterlist *sg; | 1485 | struct scatterlist *sg; |
1486 | struct ahci_sg *ahci_sg; | 1486 | struct ahci_sg *ahci_sg = cmd_tbl + AHCI_CMD_TBL_HDR_SZ; |
1487 | unsigned int n_sg = 0; | 1487 | unsigned int si; |
1488 | 1488 | ||
1489 | VPRINTK("ENTER\n"); | 1489 | VPRINTK("ENTER\n"); |
1490 | 1490 | ||
1491 | /* | 1491 | /* |
1492 | * Next, the S/G list. | 1492 | * Next, the S/G list. |
1493 | */ | 1493 | */ |
1494 | ahci_sg = cmd_tbl + AHCI_CMD_TBL_HDR_SZ; | 1494 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
1495 | ata_for_each_sg(sg, qc) { | ||
1496 | dma_addr_t addr = sg_dma_address(sg); | 1495 | dma_addr_t addr = sg_dma_address(sg); |
1497 | u32 sg_len = sg_dma_len(sg); | 1496 | u32 sg_len = sg_dma_len(sg); |
1498 | 1497 | ||
1499 | ahci_sg->addr = cpu_to_le32(addr & 0xffffffff); | 1498 | ahci_sg[si].addr = cpu_to_le32(addr & 0xffffffff); |
1500 | ahci_sg->addr_hi = cpu_to_le32((addr >> 16) >> 16); | 1499 | ahci_sg[si].addr_hi = cpu_to_le32((addr >> 16) >> 16); |
1501 | ahci_sg->flags_size = cpu_to_le32(sg_len - 1); | 1500 | ahci_sg[si].flags_size = cpu_to_le32(sg_len - 1); |
1502 | |||
1503 | ahci_sg++; | ||
1504 | n_sg++; | ||
1505 | } | 1501 | } |
1506 | 1502 | ||
1507 | return n_sg; | 1503 | return si; |
1508 | } | 1504 | } |
1509 | 1505 | ||
1510 | static void ahci_qc_prep(struct ata_queued_cmd *qc) | 1506 | static void ahci_qc_prep(struct ata_queued_cmd *qc) |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 865428a64de3..e998028302da 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -4471,13 +4471,13 @@ static unsigned int ata_dev_init_params(struct ata_device *dev, | |||
4471 | void ata_sg_clean(struct ata_queued_cmd *qc) | 4471 | void ata_sg_clean(struct ata_queued_cmd *qc) |
4472 | { | 4472 | { |
4473 | struct ata_port *ap = qc->ap; | 4473 | struct ata_port *ap = qc->ap; |
4474 | struct scatterlist *sg = qc->__sg; | 4474 | struct scatterlist *sg = qc->sg; |
4475 | int dir = qc->dma_dir; | 4475 | int dir = qc->dma_dir; |
4476 | void *pad_buf = NULL; | 4476 | void *pad_buf = NULL; |
4477 | 4477 | ||
4478 | WARN_ON(sg == NULL); | 4478 | WARN_ON(sg == NULL); |
4479 | 4479 | ||
4480 | VPRINTK("unmapping %u sg elements\n", qc->n_elem); | 4480 | VPRINTK("unmapping %u sg elements\n", qc->mapped_n_elem); |
4481 | 4481 | ||
4482 | /* if we padded the buffer out to 32-bit bound, and data | 4482 | /* if we padded the buffer out to 32-bit bound, and data |
4483 | * xfer direction is from-device, we must copy from the | 4483 | * xfer direction is from-device, we must copy from the |
@@ -4486,19 +4486,20 @@ void ata_sg_clean(struct ata_queued_cmd *qc) | |||
4486 | if (qc->pad_len && !(qc->tf.flags & ATA_TFLAG_WRITE)) | 4486 | if (qc->pad_len && !(qc->tf.flags & ATA_TFLAG_WRITE)) |
4487 | pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ); | 4487 | pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ); |
4488 | 4488 | ||
4489 | if (qc->n_elem) | 4489 | if (qc->mapped_n_elem) |
4490 | dma_unmap_sg(ap->dev, sg, qc->n_elem, dir); | 4490 | dma_unmap_sg(ap->dev, sg, qc->mapped_n_elem, dir); |
4491 | /* restore last sg */ | 4491 | /* restore last sg */ |
4492 | sg_last(sg, qc->orig_n_elem)->length += qc->pad_len; | 4492 | if (qc->last_sg) |
4493 | *qc->last_sg = qc->saved_last_sg; | ||
4493 | if (pad_buf) { | 4494 | if (pad_buf) { |
4494 | struct scatterlist *psg = &qc->pad_sgent; | 4495 | struct scatterlist *psg = &qc->extra_sg[1]; |
4495 | void *addr = kmap_atomic(sg_page(psg), KM_IRQ0); | 4496 | void *addr = kmap_atomic(sg_page(psg), KM_IRQ0); |
4496 | memcpy(addr + psg->offset, pad_buf, qc->pad_len); | 4497 | memcpy(addr + psg->offset, pad_buf, qc->pad_len); |
4497 | kunmap_atomic(addr, KM_IRQ0); | 4498 | kunmap_atomic(addr, KM_IRQ0); |
4498 | } | 4499 | } |
4499 | 4500 | ||
4500 | qc->flags &= ~ATA_QCFLAG_DMAMAP; | 4501 | qc->flags &= ~ATA_QCFLAG_DMAMAP; |
4501 | qc->__sg = NULL; | 4502 | qc->sg = NULL; |
4502 | } | 4503 | } |
4503 | 4504 | ||
4504 | /** | 4505 | /** |
@@ -4516,13 +4517,10 @@ static void ata_fill_sg(struct ata_queued_cmd *qc) | |||
4516 | { | 4517 | { |
4517 | struct ata_port *ap = qc->ap; | 4518 | struct ata_port *ap = qc->ap; |
4518 | struct scatterlist *sg; | 4519 | struct scatterlist *sg; |
4519 | unsigned int idx; | 4520 | unsigned int si, pi; |
4520 | 4521 | ||
4521 | WARN_ON(qc->__sg == NULL); | 4522 | pi = 0; |
4522 | WARN_ON(qc->n_elem == 0 && qc->pad_len == 0); | 4523 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
4523 | |||
4524 | idx = 0; | ||
4525 | ata_for_each_sg(sg, qc) { | ||
4526 | u32 addr, offset; | 4524 | u32 addr, offset; |
4527 | u32 sg_len, len; | 4525 | u32 sg_len, len; |
4528 | 4526 | ||
@@ -4539,18 +4537,17 @@ static void ata_fill_sg(struct ata_queued_cmd *qc) | |||
4539 | if ((offset + sg_len) > 0x10000) | 4537 | if ((offset + sg_len) > 0x10000) |
4540 | len = 0x10000 - offset; | 4538 | len = 0x10000 - offset; |
4541 | 4539 | ||
4542 | ap->prd[idx].addr = cpu_to_le32(addr); | 4540 | ap->prd[pi].addr = cpu_to_le32(addr); |
4543 | ap->prd[idx].flags_len = cpu_to_le32(len & 0xffff); | 4541 | ap->prd[pi].flags_len = cpu_to_le32(len & 0xffff); |
4544 | VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len); | 4542 | VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", pi, addr, len); |
4545 | 4543 | ||
4546 | idx++; | 4544 | pi++; |
4547 | sg_len -= len; | 4545 | sg_len -= len; |
4548 | addr += len; | 4546 | addr += len; |
4549 | } | 4547 | } |
4550 | } | 4548 | } |
4551 | 4549 | ||
4552 | if (idx) | 4550 | ap->prd[pi - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT); |
4553 | ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT); | ||
4554 | } | 4551 | } |
4555 | 4552 | ||
4556 | /** | 4553 | /** |
@@ -4570,13 +4567,10 @@ static void ata_fill_sg_dumb(struct ata_queued_cmd *qc) | |||
4570 | { | 4567 | { |
4571 | struct ata_port *ap = qc->ap; | 4568 | struct ata_port *ap = qc->ap; |
4572 | struct scatterlist *sg; | 4569 | struct scatterlist *sg; |
4573 | unsigned int idx; | 4570 | unsigned int si, pi; |
4574 | |||
4575 | WARN_ON(qc->__sg == NULL); | ||
4576 | WARN_ON(qc->n_elem == 0 && qc->pad_len == 0); | ||
4577 | 4571 | ||
4578 | idx = 0; | 4572 | pi = 0; |
4579 | ata_for_each_sg(sg, qc) { | 4573 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
4580 | u32 addr, offset; | 4574 | u32 addr, offset; |
4581 | u32 sg_len, len, blen; | 4575 | u32 sg_len, len, blen; |
4582 | 4576 | ||
@@ -4594,25 +4588,24 @@ static void ata_fill_sg_dumb(struct ata_queued_cmd *qc) | |||
4594 | len = 0x10000 - offset; | 4588 | len = 0x10000 - offset; |
4595 | 4589 | ||
4596 | blen = len & 0xffff; | 4590 | blen = len & 0xffff; |
4597 | ap->prd[idx].addr = cpu_to_le32(addr); | 4591 | ap->prd[pi].addr = cpu_to_le32(addr); |
4598 | if (blen == 0) { | 4592 | if (blen == 0) { |
4599 | /* Some PATA chipsets like the CS5530 can't | 4593 | /* Some PATA chipsets like the CS5530 can't |
4600 | cope with 0x0000 meaning 64K as the spec says */ | 4594 | cope with 0x0000 meaning 64K as the spec says */ |
4601 | ap->prd[idx].flags_len = cpu_to_le32(0x8000); | 4595 | ap->prd[pi].flags_len = cpu_to_le32(0x8000); |
4602 | blen = 0x8000; | 4596 | blen = 0x8000; |
4603 | ap->prd[++idx].addr = cpu_to_le32(addr + 0x8000); | 4597 | ap->prd[++pi].addr = cpu_to_le32(addr + 0x8000); |
4604 | } | 4598 | } |
4605 | ap->prd[idx].flags_len = cpu_to_le32(blen); | 4599 | ap->prd[pi].flags_len = cpu_to_le32(blen); |
4606 | VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len); | 4600 | VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", pi, addr, len); |
4607 | 4601 | ||
4608 | idx++; | 4602 | pi++; |
4609 | sg_len -= len; | 4603 | sg_len -= len; |
4610 | addr += len; | 4604 | addr += len; |
4611 | } | 4605 | } |
4612 | } | 4606 | } |
4613 | 4607 | ||
4614 | if (idx) | 4608 | ap->prd[pi - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT); |
4615 | ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT); | ||
4616 | } | 4609 | } |
4617 | 4610 | ||
4618 | /** | 4611 | /** |
@@ -4764,54 +4757,48 @@ void ata_noop_qc_prep(struct ata_queued_cmd *qc) { } | |||
4764 | void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg, | 4757 | void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg, |
4765 | unsigned int n_elem) | 4758 | unsigned int n_elem) |
4766 | { | 4759 | { |
4767 | qc->__sg = sg; | 4760 | qc->sg = sg; |
4768 | qc->n_elem = n_elem; | 4761 | qc->n_elem = n_elem; |
4769 | qc->orig_n_elem = n_elem; | 4762 | qc->cursg = qc->sg; |
4770 | qc->cursg = qc->__sg; | ||
4771 | } | 4763 | } |
4772 | 4764 | ||
4773 | /** | 4765 | static unsigned int ata_sg_setup_extra(struct ata_queued_cmd *qc, |
4774 | * ata_sg_setup - DMA-map the scatter-gather table associated with a command. | 4766 | unsigned int *n_elem_extra) |
4775 | * @qc: Command with scatter-gather table to be mapped. | ||
4776 | * | ||
4777 | * DMA-map the scatter-gather table associated with queued_cmd @qc. | ||
4778 | * | ||
4779 | * LOCKING: | ||
4780 | * spin_lock_irqsave(host lock) | ||
4781 | * | ||
4782 | * RETURNS: | ||
4783 | * Zero on success, negative on error. | ||
4784 | * | ||
4785 | */ | ||
4786 | |||
4787 | static int ata_sg_setup(struct ata_queued_cmd *qc) | ||
4788 | { | 4767 | { |
4789 | struct ata_port *ap = qc->ap; | 4768 | struct ata_port *ap = qc->ap; |
4790 | struct scatterlist *sg = qc->__sg; | 4769 | unsigned int n_elem = qc->n_elem; |
4791 | struct scatterlist *lsg = sg_last(qc->__sg, qc->n_elem); | 4770 | struct scatterlist *lsg, *copy_lsg = NULL, *tsg = NULL, *esg = NULL; |
4792 | int n_elem, pre_n_elem, dir, trim_sg = 0; | ||
4793 | 4771 | ||
4794 | VPRINTK("ENTER, ata%u\n", ap->print_id); | 4772 | *n_elem_extra = 0; |
4773 | |||
4774 | /* needs padding? */ | ||
4775 | qc->pad_len = qc->nbytes & 3; | ||
4776 | |||
4777 | if (likely(!qc->pad_len)) | ||
4778 | return n_elem; | ||
4779 | |||
4780 | /* locate last sg and save it */ | ||
4781 | lsg = sg_last(qc->sg, n_elem); | ||
4782 | qc->last_sg = lsg; | ||
4783 | qc->saved_last_sg = *lsg; | ||
4784 | |||
4785 | sg_init_table(qc->extra_sg, ARRAY_SIZE(qc->extra_sg)); | ||
4795 | 4786 | ||
4796 | /* we must lengthen transfers to end on a 32-bit boundary */ | ||
4797 | qc->pad_len = lsg->length & 3; | ||
4798 | if (qc->pad_len) { | 4787 | if (qc->pad_len) { |
4788 | struct scatterlist *psg = &qc->extra_sg[1]; | ||
4799 | void *pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ); | 4789 | void *pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ); |
4800 | struct scatterlist *psg = &qc->pad_sgent; | ||
4801 | unsigned int offset; | 4790 | unsigned int offset; |
4802 | 4791 | ||
4803 | WARN_ON(qc->dev->class != ATA_DEV_ATAPI); | 4792 | WARN_ON(qc->dev->class != ATA_DEV_ATAPI); |
4804 | 4793 | ||
4805 | memset(pad_buf, 0, ATA_DMA_PAD_SZ); | 4794 | memset(pad_buf, 0, ATA_DMA_PAD_SZ); |
4806 | 4795 | ||
4807 | /* | 4796 | /* psg->page/offset are used to copy to-be-written |
4808 | * psg->page/offset are used to copy to-be-written | ||
4809 | * data in this function or read data in ata_sg_clean. | 4797 | * data in this function or read data in ata_sg_clean. |
4810 | */ | 4798 | */ |
4811 | offset = lsg->offset + lsg->length - qc->pad_len; | 4799 | offset = lsg->offset + lsg->length - qc->pad_len; |
4812 | sg_init_table(psg, 1); | ||
4813 | sg_set_page(psg, nth_page(sg_page(lsg), offset >> PAGE_SHIFT), | 4800 | sg_set_page(psg, nth_page(sg_page(lsg), offset >> PAGE_SHIFT), |
4814 | qc->pad_len, offset_in_page(offset)); | 4801 | qc->pad_len, offset_in_page(offset)); |
4815 | 4802 | ||
4816 | if (qc->tf.flags & ATA_TFLAG_WRITE) { | 4803 | if (qc->tf.flags & ATA_TFLAG_WRITE) { |
4817 | void *addr = kmap_atomic(sg_page(psg), KM_IRQ0); | 4804 | void *addr = kmap_atomic(sg_page(psg), KM_IRQ0); |
@@ -4821,36 +4808,84 @@ static int ata_sg_setup(struct ata_queued_cmd *qc) | |||
4821 | 4808 | ||
4822 | sg_dma_address(psg) = ap->pad_dma + (qc->tag * ATA_DMA_PAD_SZ); | 4809 | sg_dma_address(psg) = ap->pad_dma + (qc->tag * ATA_DMA_PAD_SZ); |
4823 | sg_dma_len(psg) = ATA_DMA_PAD_SZ; | 4810 | sg_dma_len(psg) = ATA_DMA_PAD_SZ; |
4824 | /* trim last sg */ | 4811 | |
4812 | /* Trim the last sg entry and chain the original and | ||
4813 | * padding sg lists. | ||
4814 | * | ||
4815 | * Because chaining consumes one sg entry, one extra | ||
4816 | * sg entry is allocated and the last sg entry is | ||
4817 | * copied to it if the length isn't zero after padded | ||
4818 | * amount is removed. | ||
4819 | * | ||
4820 | * If the last sg entry is completely replaced by | ||
4821 | * padding sg entry, the first sg entry is skipped | ||
4822 | * while chaining. | ||
4823 | */ | ||
4825 | lsg->length -= qc->pad_len; | 4824 | lsg->length -= qc->pad_len; |
4826 | if (lsg->length == 0) | 4825 | if (lsg->length) { |
4827 | trim_sg = 1; | 4826 | copy_lsg = &qc->extra_sg[0]; |
4827 | tsg = &qc->extra_sg[0]; | ||
4828 | } else { | ||
4829 | n_elem--; | ||
4830 | tsg = &qc->extra_sg[1]; | ||
4831 | } | ||
4832 | |||
4833 | esg = &qc->extra_sg[1]; | ||
4828 | 4834 | ||
4829 | DPRINTK("padding done, sg[%d].length=%u pad_len=%u\n", | 4835 | (*n_elem_extra)++; |
4830 | qc->n_elem - 1, lsg->length, qc->pad_len); | ||
4831 | } | 4836 | } |
4832 | 4837 | ||
4833 | pre_n_elem = qc->n_elem; | 4838 | if (copy_lsg) |
4834 | if (trim_sg && pre_n_elem) | 4839 | sg_set_page(copy_lsg, sg_page(lsg), lsg->length, lsg->offset); |
4835 | pre_n_elem--; | ||
4836 | 4840 | ||
4837 | if (!pre_n_elem) { | 4841 | sg_chain(lsg, 1, tsg); |
4838 | n_elem = 0; | 4842 | sg_mark_end(esg); |
4839 | goto skip_map; | 4843 | |
4844 | /* sglist can't start with chaining sg entry, fast forward */ | ||
4845 | if (qc->sg == lsg) { | ||
4846 | qc->sg = tsg; | ||
4847 | qc->cursg = tsg; | ||
4840 | } | 4848 | } |
4841 | 4849 | ||
4842 | dir = qc->dma_dir; | 4850 | return n_elem; |
4843 | n_elem = dma_map_sg(ap->dev, sg, pre_n_elem, dir); | 4851 | } |
4844 | if (n_elem < 1) { | 4852 | |
4845 | /* restore last sg */ | 4853 | /** |
4846 | lsg->length += qc->pad_len; | 4854 | * ata_sg_setup - DMA-map the scatter-gather table associated with a command. |
4847 | return -1; | 4855 | * @qc: Command with scatter-gather table to be mapped. |
4856 | * | ||
4857 | * DMA-map the scatter-gather table associated with queued_cmd @qc. | ||
4858 | * | ||
4859 | * LOCKING: | ||
4860 | * spin_lock_irqsave(host lock) | ||
4861 | * | ||
4862 | * RETURNS: | ||
4863 | * Zero on success, negative on error. | ||
4864 | * | ||
4865 | */ | ||
4866 | static int ata_sg_setup(struct ata_queued_cmd *qc) | ||
4867 | { | ||
4868 | struct ata_port *ap = qc->ap; | ||
4869 | unsigned int n_elem, n_elem_extra; | ||
4870 | |||
4871 | VPRINTK("ENTER, ata%u\n", ap->print_id); | ||
4872 | |||
4873 | n_elem = ata_sg_setup_extra(qc, &n_elem_extra); | ||
4874 | |||
4875 | if (n_elem) { | ||
4876 | n_elem = dma_map_sg(ap->dev, qc->sg, n_elem, qc->dma_dir); | ||
4877 | if (n_elem < 1) { | ||
4878 | /* restore last sg */ | ||
4879 | if (qc->last_sg) | ||
4880 | *qc->last_sg = qc->saved_last_sg; | ||
4881 | return -1; | ||
4882 | } | ||
4883 | DPRINTK("%d sg elements mapped\n", n_elem); | ||
4848 | } | 4884 | } |
4849 | 4885 | ||
4850 | DPRINTK("%d sg elements mapped\n", n_elem); | 4886 | qc->n_elem = qc->mapped_n_elem = n_elem; |
4887 | qc->n_elem += n_elem_extra; | ||
4851 | 4888 | ||
4852 | skip_map: | ||
4853 | qc->n_elem = n_elem; | ||
4854 | qc->flags |= ATA_QCFLAG_DMAMAP; | 4889 | qc->flags |= ATA_QCFLAG_DMAMAP; |
4855 | 4890 | ||
4856 | return 0; | 4891 | return 0; |
@@ -5912,7 +5947,7 @@ void ata_qc_issue(struct ata_queued_cmd *qc) | |||
5912 | /* We guarantee to LLDs that they will have at least one | 5947 | /* We guarantee to LLDs that they will have at least one |
5913 | * non-zero sg if the command is a data command. | 5948 | * non-zero sg if the command is a data command. |
5914 | */ | 5949 | */ |
5915 | BUG_ON(ata_is_data(prot) && (!qc->__sg || !qc->n_elem || !qc->nbytes)); | 5950 | BUG_ON(ata_is_data(prot) && (!qc->sg || !qc->n_elem || !qc->nbytes)); |
5916 | 5951 | ||
5917 | if (ata_is_dma(prot) || (ata_is_pio(prot) && | 5952 | if (ata_is_dma(prot) || (ata_is_pio(prot) && |
5918 | (ap->flags & ATA_FLAG_PIO_DMA))) | 5953 | (ap->flags & ATA_FLAG_PIO_DMA))) |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 5fd780e509d4..42bf61599730 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -517,7 +517,7 @@ static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev, | |||
517 | qc->scsicmd = cmd; | 517 | qc->scsicmd = cmd; |
518 | qc->scsidone = done; | 518 | qc->scsidone = done; |
519 | 519 | ||
520 | qc->__sg = scsi_sglist(cmd); | 520 | qc->sg = scsi_sglist(cmd); |
521 | qc->n_elem = scsi_sg_count(cmd); | 521 | qc->n_elem = scsi_sg_count(cmd); |
522 | } else { | 522 | } else { |
523 | cmd->result = (DID_OK << 16) | (QUEUE_FULL << 1); | 523 | cmd->result = (DID_OK << 16) | (QUEUE_FULL << 1); |
diff --git a/drivers/ata/pata_bf54x.c b/drivers/ata/pata_bf54x.c index 41cd921082ba..a32e3c44a606 100644 --- a/drivers/ata/pata_bf54x.c +++ b/drivers/ata/pata_bf54x.c | |||
@@ -832,6 +832,7 @@ static void bfin_bmdma_setup(struct ata_queued_cmd *qc) | |||
832 | { | 832 | { |
833 | unsigned short config = WDSIZE_16; | 833 | unsigned short config = WDSIZE_16; |
834 | struct scatterlist *sg; | 834 | struct scatterlist *sg; |
835 | unsigned int si; | ||
835 | 836 | ||
836 | pr_debug("in atapi dma setup\n"); | 837 | pr_debug("in atapi dma setup\n"); |
837 | /* Program the ATA_CTRL register with dir */ | 838 | /* Program the ATA_CTRL register with dir */ |
@@ -839,7 +840,7 @@ static void bfin_bmdma_setup(struct ata_queued_cmd *qc) | |||
839 | /* fill the ATAPI DMA controller */ | 840 | /* fill the ATAPI DMA controller */ |
840 | set_dma_config(CH_ATAPI_TX, config); | 841 | set_dma_config(CH_ATAPI_TX, config); |
841 | set_dma_x_modify(CH_ATAPI_TX, 2); | 842 | set_dma_x_modify(CH_ATAPI_TX, 2); |
842 | ata_for_each_sg(sg, qc) { | 843 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
843 | set_dma_start_addr(CH_ATAPI_TX, sg_dma_address(sg)); | 844 | set_dma_start_addr(CH_ATAPI_TX, sg_dma_address(sg)); |
844 | set_dma_x_count(CH_ATAPI_TX, sg_dma_len(sg) >> 1); | 845 | set_dma_x_count(CH_ATAPI_TX, sg_dma_len(sg) >> 1); |
845 | } | 846 | } |
@@ -848,7 +849,7 @@ static void bfin_bmdma_setup(struct ata_queued_cmd *qc) | |||
848 | /* fill the ATAPI DMA controller */ | 849 | /* fill the ATAPI DMA controller */ |
849 | set_dma_config(CH_ATAPI_RX, config); | 850 | set_dma_config(CH_ATAPI_RX, config); |
850 | set_dma_x_modify(CH_ATAPI_RX, 2); | 851 | set_dma_x_modify(CH_ATAPI_RX, 2); |
851 | ata_for_each_sg(sg, qc) { | 852 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
852 | set_dma_start_addr(CH_ATAPI_RX, sg_dma_address(sg)); | 853 | set_dma_start_addr(CH_ATAPI_RX, sg_dma_address(sg)); |
853 | set_dma_x_count(CH_ATAPI_RX, sg_dma_len(sg) >> 1); | 854 | set_dma_x_count(CH_ATAPI_RX, sg_dma_len(sg) >> 1); |
854 | } | 855 | } |
@@ -867,6 +868,7 @@ static void bfin_bmdma_start(struct ata_queued_cmd *qc) | |||
867 | struct ata_port *ap = qc->ap; | 868 | struct ata_port *ap = qc->ap; |
868 | void __iomem *base = (void __iomem *)ap->ioaddr.ctl_addr; | 869 | void __iomem *base = (void __iomem *)ap->ioaddr.ctl_addr; |
869 | struct scatterlist *sg; | 870 | struct scatterlist *sg; |
871 | unsigned int si; | ||
870 | 872 | ||
871 | pr_debug("in atapi dma start\n"); | 873 | pr_debug("in atapi dma start\n"); |
872 | if (!(ap->udma_mask || ap->mwdma_mask)) | 874 | if (!(ap->udma_mask || ap->mwdma_mask)) |
@@ -881,7 +883,7 @@ static void bfin_bmdma_start(struct ata_queued_cmd *qc) | |||
881 | * data cache is enabled. Otherwise, this loop | 883 | * data cache is enabled. Otherwise, this loop |
882 | * is an empty loop and optimized out. | 884 | * is an empty loop and optimized out. |
883 | */ | 885 | */ |
884 | ata_for_each_sg(sg, qc) { | 886 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
885 | flush_dcache_range(sg_dma_address(sg), | 887 | flush_dcache_range(sg_dma_address(sg), |
886 | sg_dma_address(sg) + sg_dma_len(sg)); | 888 | sg_dma_address(sg) + sg_dma_len(sg)); |
887 | } | 889 | } |
@@ -910,7 +912,7 @@ static void bfin_bmdma_start(struct ata_queued_cmd *qc) | |||
910 | ATAPI_SET_CONTROL(base, ATAPI_GET_CONTROL(base) | TFRCNT_RST); | 912 | ATAPI_SET_CONTROL(base, ATAPI_GET_CONTROL(base) | TFRCNT_RST); |
911 | 913 | ||
912 | /* Set transfer length to buffer len */ | 914 | /* Set transfer length to buffer len */ |
913 | ata_for_each_sg(sg, qc) { | 915 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
914 | ATAPI_SET_XFER_LEN(base, (sg_dma_len(sg) >> 1)); | 916 | ATAPI_SET_XFER_LEN(base, (sg_dma_len(sg) >> 1)); |
915 | } | 917 | } |
916 | 918 | ||
@@ -932,6 +934,7 @@ static void bfin_bmdma_stop(struct ata_queued_cmd *qc) | |||
932 | { | 934 | { |
933 | struct ata_port *ap = qc->ap; | 935 | struct ata_port *ap = qc->ap; |
934 | struct scatterlist *sg; | 936 | struct scatterlist *sg; |
937 | unsigned int si; | ||
935 | 938 | ||
936 | pr_debug("in atapi dma stop\n"); | 939 | pr_debug("in atapi dma stop\n"); |
937 | if (!(ap->udma_mask || ap->mwdma_mask)) | 940 | if (!(ap->udma_mask || ap->mwdma_mask)) |
@@ -950,7 +953,7 @@ static void bfin_bmdma_stop(struct ata_queued_cmd *qc) | |||
950 | * data cache is enabled. Otherwise, this loop | 953 | * data cache is enabled. Otherwise, this loop |
951 | * is an empty loop and optimized out. | 954 | * is an empty loop and optimized out. |
952 | */ | 955 | */ |
953 | ata_for_each_sg(sg, qc) { | 956 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
954 | invalidate_dcache_range( | 957 | invalidate_dcache_range( |
955 | sg_dma_address(sg), | 958 | sg_dma_address(sg), |
956 | sg_dma_address(sg) | 959 | sg_dma_address(sg) |
diff --git a/drivers/ata/pata_icside.c b/drivers/ata/pata_icside.c index 842fe08a3c13..5b8586dac63b 100644 --- a/drivers/ata/pata_icside.c +++ b/drivers/ata/pata_icside.c | |||
@@ -224,6 +224,7 @@ static void pata_icside_bmdma_setup(struct ata_queued_cmd *qc) | |||
224 | struct pata_icside_state *state = ap->host->private_data; | 224 | struct pata_icside_state *state = ap->host->private_data; |
225 | struct scatterlist *sg, *rsg = state->sg; | 225 | struct scatterlist *sg, *rsg = state->sg; |
226 | unsigned int write = qc->tf.flags & ATA_TFLAG_WRITE; | 226 | unsigned int write = qc->tf.flags & ATA_TFLAG_WRITE; |
227 | unsigned int si; | ||
227 | 228 | ||
228 | /* | 229 | /* |
229 | * We are simplex; BUG if we try to fiddle with DMA | 230 | * We are simplex; BUG if we try to fiddle with DMA |
@@ -234,7 +235,7 @@ static void pata_icside_bmdma_setup(struct ata_queued_cmd *qc) | |||
234 | /* | 235 | /* |
235 | * Copy ATAs scattered sg list into a contiguous array of sg | 236 | * Copy ATAs scattered sg list into a contiguous array of sg |
236 | */ | 237 | */ |
237 | ata_for_each_sg(sg, qc) { | 238 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
238 | memcpy(rsg, sg, sizeof(*sg)); | 239 | memcpy(rsg, sg, sizeof(*sg)); |
239 | rsg++; | 240 | rsg++; |
240 | } | 241 | } |
diff --git a/drivers/ata/pdc_adma.c b/drivers/ata/pdc_adma.c index 459cb7bb7d7f..8e1b7e9c0ae4 100644 --- a/drivers/ata/pdc_adma.c +++ b/drivers/ata/pdc_adma.c | |||
@@ -321,8 +321,9 @@ static int adma_fill_sg(struct ata_queued_cmd *qc) | |||
321 | u8 *buf = pp->pkt, *last_buf = NULL; | 321 | u8 *buf = pp->pkt, *last_buf = NULL; |
322 | int i = (2 + buf[3]) * 8; | 322 | int i = (2 + buf[3]) * 8; |
323 | u8 pFLAGS = pORD | ((qc->tf.flags & ATA_TFLAG_WRITE) ? pDIRO : 0); | 323 | u8 pFLAGS = pORD | ((qc->tf.flags & ATA_TFLAG_WRITE) ? pDIRO : 0); |
324 | unsigned int si; | ||
324 | 325 | ||
325 | ata_for_each_sg(sg, qc) { | 326 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
326 | u32 addr; | 327 | u32 addr; |
327 | u32 len; | 328 | u32 len; |
328 | 329 | ||
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c index a3c33f165427..d041709dee1a 100644 --- a/drivers/ata/sata_fsl.c +++ b/drivers/ata/sata_fsl.c | |||
@@ -323,6 +323,7 @@ static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc, | |||
323 | struct scatterlist *sg; | 323 | struct scatterlist *sg; |
324 | unsigned int num_prde = 0; | 324 | unsigned int num_prde = 0; |
325 | u32 ttl_dwords = 0; | 325 | u32 ttl_dwords = 0; |
326 | unsigned int si; | ||
326 | 327 | ||
327 | /* | 328 | /* |
328 | * NOTE : direct & indirect prdt's are contigiously allocated | 329 | * NOTE : direct & indirect prdt's are contigiously allocated |
@@ -333,13 +334,14 @@ static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc, | |||
333 | struct prde *prd_ptr_to_indirect_ext = NULL; | 334 | struct prde *prd_ptr_to_indirect_ext = NULL; |
334 | unsigned indirect_ext_segment_sz = 0; | 335 | unsigned indirect_ext_segment_sz = 0; |
335 | dma_addr_t indirect_ext_segment_paddr; | 336 | dma_addr_t indirect_ext_segment_paddr; |
337 | unsigned int si; | ||
336 | 338 | ||
337 | VPRINTK("SATA FSL : cd = 0x%x, prd = 0x%x\n", cmd_desc, prd); | 339 | VPRINTK("SATA FSL : cd = 0x%x, prd = 0x%x\n", cmd_desc, prd); |
338 | 340 | ||
339 | indirect_ext_segment_paddr = cmd_desc_paddr + | 341 | indirect_ext_segment_paddr = cmd_desc_paddr + |
340 | SATA_FSL_CMD_DESC_OFFSET_TO_PRDT + SATA_FSL_MAX_PRD_DIRECT * 16; | 342 | SATA_FSL_CMD_DESC_OFFSET_TO_PRDT + SATA_FSL_MAX_PRD_DIRECT * 16; |
341 | 343 | ||
342 | ata_for_each_sg(sg, qc) { | 344 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
343 | dma_addr_t sg_addr = sg_dma_address(sg); | 345 | dma_addr_t sg_addr = sg_dma_address(sg); |
344 | u32 sg_len = sg_dma_len(sg); | 346 | u32 sg_len = sg_dma_len(sg); |
345 | 347 | ||
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 37b850ae0845..7e72463a90eb 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
@@ -1136,9 +1136,10 @@ static void mv_fill_sg(struct ata_queued_cmd *qc) | |||
1136 | struct mv_port_priv *pp = qc->ap->private_data; | 1136 | struct mv_port_priv *pp = qc->ap->private_data; |
1137 | struct scatterlist *sg; | 1137 | struct scatterlist *sg; |
1138 | struct mv_sg *mv_sg, *last_sg = NULL; | 1138 | struct mv_sg *mv_sg, *last_sg = NULL; |
1139 | unsigned int si; | ||
1139 | 1140 | ||
1140 | mv_sg = pp->sg_tbl; | 1141 | mv_sg = pp->sg_tbl; |
1141 | ata_for_each_sg(sg, qc) { | 1142 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
1142 | dma_addr_t addr = sg_dma_address(sg); | 1143 | dma_addr_t addr = sg_dma_address(sg); |
1143 | u32 sg_len = sg_dma_len(sg); | 1144 | u32 sg_len = sg_dma_len(sg); |
1144 | 1145 | ||
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index ed5dc7cb50cd..a0f98fdab7a0 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c | |||
@@ -1336,21 +1336,18 @@ static void nv_adma_fill_aprd(struct ata_queued_cmd *qc, | |||
1336 | static void nv_adma_fill_sg(struct ata_queued_cmd *qc, struct nv_adma_cpb *cpb) | 1336 | static void nv_adma_fill_sg(struct ata_queued_cmd *qc, struct nv_adma_cpb *cpb) |
1337 | { | 1337 | { |
1338 | struct nv_adma_port_priv *pp = qc->ap->private_data; | 1338 | struct nv_adma_port_priv *pp = qc->ap->private_data; |
1339 | unsigned int idx; | ||
1340 | struct nv_adma_prd *aprd; | 1339 | struct nv_adma_prd *aprd; |
1341 | struct scatterlist *sg; | 1340 | struct scatterlist *sg; |
1341 | unsigned int si; | ||
1342 | 1342 | ||
1343 | VPRINTK("ENTER\n"); | 1343 | VPRINTK("ENTER\n"); |
1344 | 1344 | ||
1345 | idx = 0; | 1345 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
1346 | 1346 | aprd = (si < 5) ? &cpb->aprd[si] : | |
1347 | ata_for_each_sg(sg, qc) { | 1347 | &pp->aprd[NV_ADMA_SGTBL_LEN * qc->tag + (si-5)]; |
1348 | aprd = (idx < 5) ? &cpb->aprd[idx] : | 1348 | nv_adma_fill_aprd(qc, sg, si, aprd); |
1349 | &pp->aprd[NV_ADMA_SGTBL_LEN * qc->tag + (idx-5)]; | ||
1350 | nv_adma_fill_aprd(qc, sg, idx, aprd); | ||
1351 | idx++; | ||
1352 | } | 1349 | } |
1353 | if (idx > 5) | 1350 | if (si > 5) |
1354 | cpb->next_aprd = cpu_to_le64(((u64)(pp->aprd_dma + NV_ADMA_SGTBL_SZ * qc->tag))); | 1351 | cpb->next_aprd = cpu_to_le64(((u64)(pp->aprd_dma + NV_ADMA_SGTBL_SZ * qc->tag))); |
1355 | else | 1352 | else |
1356 | cpb->next_aprd = cpu_to_le64(0); | 1353 | cpb->next_aprd = cpu_to_le64(0); |
@@ -1995,17 +1992,14 @@ static void nv_swncq_fill_sg(struct ata_queued_cmd *qc) | |||
1995 | { | 1992 | { |
1996 | struct ata_port *ap = qc->ap; | 1993 | struct ata_port *ap = qc->ap; |
1997 | struct scatterlist *sg; | 1994 | struct scatterlist *sg; |
1998 | unsigned int idx; | ||
1999 | struct nv_swncq_port_priv *pp = ap->private_data; | 1995 | struct nv_swncq_port_priv *pp = ap->private_data; |
2000 | struct ata_prd *prd; | 1996 | struct ata_prd *prd; |
2001 | 1997 | unsigned int si, idx; | |
2002 | WARN_ON(qc->__sg == NULL); | ||
2003 | WARN_ON(qc->n_elem == 0 && qc->pad_len == 0); | ||
2004 | 1998 | ||
2005 | prd = pp->prd + ATA_MAX_PRD * qc->tag; | 1999 | prd = pp->prd + ATA_MAX_PRD * qc->tag; |
2006 | 2000 | ||
2007 | idx = 0; | 2001 | idx = 0; |
2008 | ata_for_each_sg(sg, qc) { | 2002 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
2009 | u32 addr, offset; | 2003 | u32 addr, offset; |
2010 | u32 sg_len, len; | 2004 | u32 sg_len, len; |
2011 | 2005 | ||
@@ -2027,8 +2021,7 @@ static void nv_swncq_fill_sg(struct ata_queued_cmd *qc) | |||
2027 | } | 2021 | } |
2028 | } | 2022 | } |
2029 | 2023 | ||
2030 | if (idx) | 2024 | prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT); |
2031 | prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT); | ||
2032 | } | 2025 | } |
2033 | 2026 | ||
2034 | static unsigned int nv_swncq_issue_atacmd(struct ata_port *ap, | 2027 | static unsigned int nv_swncq_issue_atacmd(struct ata_port *ap, |
diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c index 01738d736d44..a07d319f6e8c 100644 --- a/drivers/ata/sata_promise.c +++ b/drivers/ata/sata_promise.c | |||
@@ -533,17 +533,15 @@ static void pdc_fill_sg(struct ata_queued_cmd *qc) | |||
533 | { | 533 | { |
534 | struct ata_port *ap = qc->ap; | 534 | struct ata_port *ap = qc->ap; |
535 | struct scatterlist *sg; | 535 | struct scatterlist *sg; |
536 | unsigned int idx; | ||
537 | const u32 SG_COUNT_ASIC_BUG = 41*4; | 536 | const u32 SG_COUNT_ASIC_BUG = 41*4; |
537 | unsigned int si, idx; | ||
538 | u32 len; | ||
538 | 539 | ||
539 | if (!(qc->flags & ATA_QCFLAG_DMAMAP)) | 540 | if (!(qc->flags & ATA_QCFLAG_DMAMAP)) |
540 | return; | 541 | return; |
541 | 542 | ||
542 | WARN_ON(qc->__sg == NULL); | ||
543 | WARN_ON(qc->n_elem == 0 && qc->pad_len == 0); | ||
544 | |||
545 | idx = 0; | 543 | idx = 0; |
546 | ata_for_each_sg(sg, qc) { | 544 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
547 | u32 addr, offset; | 545 | u32 addr, offset; |
548 | u32 sg_len, len; | 546 | u32 sg_len, len; |
549 | 547 | ||
@@ -570,29 +568,27 @@ static void pdc_fill_sg(struct ata_queued_cmd *qc) | |||
570 | } | 568 | } |
571 | } | 569 | } |
572 | 570 | ||
573 | if (idx) { | 571 | len = le32_to_cpu(ap->prd[idx - 1].flags_len); |
574 | u32 len = le32_to_cpu(ap->prd[idx - 1].flags_len); | ||
575 | 572 | ||
576 | if (len > SG_COUNT_ASIC_BUG) { | 573 | if (len > SG_COUNT_ASIC_BUG) { |
577 | u32 addr; | 574 | u32 addr; |
578 | 575 | ||
579 | VPRINTK("Splitting last PRD.\n"); | 576 | VPRINTK("Splitting last PRD.\n"); |
580 | 577 | ||
581 | addr = le32_to_cpu(ap->prd[idx - 1].addr); | 578 | addr = le32_to_cpu(ap->prd[idx - 1].addr); |
582 | ap->prd[idx - 1].flags_len = cpu_to_le32(len - SG_COUNT_ASIC_BUG); | 579 | ap->prd[idx - 1].flags_len = cpu_to_le32(len - SG_COUNT_ASIC_BUG); |
583 | VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx - 1, addr, SG_COUNT_ASIC_BUG); | 580 | VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx - 1, addr, SG_COUNT_ASIC_BUG); |
584 | 581 | ||
585 | addr = addr + len - SG_COUNT_ASIC_BUG; | 582 | addr = addr + len - SG_COUNT_ASIC_BUG; |
586 | len = SG_COUNT_ASIC_BUG; | 583 | len = SG_COUNT_ASIC_BUG; |
587 | ap->prd[idx].addr = cpu_to_le32(addr); | 584 | ap->prd[idx].addr = cpu_to_le32(addr); |
588 | ap->prd[idx].flags_len = cpu_to_le32(len); | 585 | ap->prd[idx].flags_len = cpu_to_le32(len); |
589 | VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len); | 586 | VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len); |
590 | 587 | ||
591 | idx++; | 588 | idx++; |
592 | } | ||
593 | |||
594 | ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT); | ||
595 | } | 589 | } |
590 | |||
591 | ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT); | ||
596 | } | 592 | } |
597 | 593 | ||
598 | static void pdc_qc_prep(struct ata_queued_cmd *qc) | 594 | static void pdc_qc_prep(struct ata_queued_cmd *qc) |
diff --git a/drivers/ata/sata_qstor.c b/drivers/ata/sata_qstor.c index 4e5f07bdd069..91cc12c82040 100644 --- a/drivers/ata/sata_qstor.c +++ b/drivers/ata/sata_qstor.c | |||
@@ -287,14 +287,10 @@ static unsigned int qs_fill_sg(struct ata_queued_cmd *qc) | |||
287 | struct scatterlist *sg; | 287 | struct scatterlist *sg; |
288 | struct ata_port *ap = qc->ap; | 288 | struct ata_port *ap = qc->ap; |
289 | struct qs_port_priv *pp = ap->private_data; | 289 | struct qs_port_priv *pp = ap->private_data; |
290 | unsigned int nelem; | ||
291 | u8 *prd = pp->pkt + QS_CPB_BYTES; | 290 | u8 *prd = pp->pkt + QS_CPB_BYTES; |
291 | unsigned int si; | ||
292 | 292 | ||
293 | WARN_ON(qc->__sg == NULL); | 293 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
294 | WARN_ON(qc->n_elem == 0 && qc->pad_len == 0); | ||
295 | |||
296 | nelem = 0; | ||
297 | ata_for_each_sg(sg, qc) { | ||
298 | u64 addr; | 294 | u64 addr; |
299 | u32 len; | 295 | u32 len; |
300 | 296 | ||
@@ -306,12 +302,11 @@ static unsigned int qs_fill_sg(struct ata_queued_cmd *qc) | |||
306 | *(__le32 *)prd = cpu_to_le32(len); | 302 | *(__le32 *)prd = cpu_to_le32(len); |
307 | prd += sizeof(u64); | 303 | prd += sizeof(u64); |
308 | 304 | ||
309 | VPRINTK("PRD[%u] = (0x%llX, 0x%X)\n", nelem, | 305 | VPRINTK("PRD[%u] = (0x%llX, 0x%X)\n", si, |
310 | (unsigned long long)addr, len); | 306 | (unsigned long long)addr, len); |
311 | nelem++; | ||
312 | } | 307 | } |
313 | 308 | ||
314 | return nelem; | 309 | return si; |
315 | } | 310 | } |
316 | 311 | ||
317 | static void qs_qc_prep(struct ata_queued_cmd *qc) | 312 | static void qs_qc_prep(struct ata_queued_cmd *qc) |
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index fdd3ceac329b..b4b1f91ea693 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
@@ -813,8 +813,9 @@ static inline void sil24_fill_sg(struct ata_queued_cmd *qc, | |||
813 | { | 813 | { |
814 | struct scatterlist *sg; | 814 | struct scatterlist *sg; |
815 | struct sil24_sge *last_sge = NULL; | 815 | struct sil24_sge *last_sge = NULL; |
816 | unsigned int si; | ||
816 | 817 | ||
817 | ata_for_each_sg(sg, qc) { | 818 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
818 | sge->addr = cpu_to_le64(sg_dma_address(sg)); | 819 | sge->addr = cpu_to_le64(sg_dma_address(sg)); |
819 | sge->cnt = cpu_to_le32(sg_dma_len(sg)); | 820 | sge->cnt = cpu_to_le32(sg_dma_len(sg)); |
820 | sge->flags = 0; | 821 | sge->flags = 0; |
@@ -823,8 +824,7 @@ static inline void sil24_fill_sg(struct ata_queued_cmd *qc, | |||
823 | sge++; | 824 | sge++; |
824 | } | 825 | } |
825 | 826 | ||
826 | if (likely(last_sge)) | 827 | last_sge->flags = cpu_to_le32(SGE_TRM); |
827 | last_sge->flags = cpu_to_le32(SGE_TRM); | ||
828 | } | 828 | } |
829 | 829 | ||
830 | static int sil24_qc_defer(struct ata_queued_cmd *qc) | 830 | static int sil24_qc_defer(struct ata_queued_cmd *qc) |
diff --git a/drivers/ata/sata_sx4.c b/drivers/ata/sata_sx4.c index 3de0c27caf53..211ba8da64f4 100644 --- a/drivers/ata/sata_sx4.c +++ b/drivers/ata/sata_sx4.c | |||
@@ -473,7 +473,7 @@ static void pdc20621_dma_prep(struct ata_queued_cmd *qc) | |||
473 | void __iomem *mmio = ap->host->iomap[PDC_MMIO_BAR]; | 473 | void __iomem *mmio = ap->host->iomap[PDC_MMIO_BAR]; |
474 | void __iomem *dimm_mmio = ap->host->iomap[PDC_DIMM_BAR]; | 474 | void __iomem *dimm_mmio = ap->host->iomap[PDC_DIMM_BAR]; |
475 | unsigned int portno = ap->port_no; | 475 | unsigned int portno = ap->port_no; |
476 | unsigned int i, idx, total_len = 0, sgt_len; | 476 | unsigned int i, si, idx, total_len = 0, sgt_len; |
477 | u32 *buf = (u32 *) &pp->dimm_buf[PDC_DIMM_HEADER_SZ]; | 477 | u32 *buf = (u32 *) &pp->dimm_buf[PDC_DIMM_HEADER_SZ]; |
478 | 478 | ||
479 | WARN_ON(!(qc->flags & ATA_QCFLAG_DMAMAP)); | 479 | WARN_ON(!(qc->flags & ATA_QCFLAG_DMAMAP)); |
@@ -487,7 +487,7 @@ static void pdc20621_dma_prep(struct ata_queued_cmd *qc) | |||
487 | * Build S/G table | 487 | * Build S/G table |
488 | */ | 488 | */ |
489 | idx = 0; | 489 | idx = 0; |
490 | ata_for_each_sg(sg, qc) { | 490 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
491 | buf[idx++] = cpu_to_le32(sg_dma_address(sg)); | 491 | buf[idx++] = cpu_to_le32(sg_dma_address(sg)); |
492 | buf[idx++] = cpu_to_le32(sg_dma_len(sg)); | 492 | buf[idx++] = cpu_to_le32(sg_dma_len(sg)); |
493 | total_len += sg_dma_len(sg); | 493 | total_len += sg_dma_len(sg); |
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 3e78bc2d9170..aa0df0a4b22a 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
@@ -5142,6 +5142,7 @@ static void ipr_build_ata_ioadl(struct ipr_cmnd *ipr_cmd, | |||
5142 | struct ipr_ioadl_desc *last_ioadl = NULL; | 5142 | struct ipr_ioadl_desc *last_ioadl = NULL; |
5143 | int len = qc->nbytes + qc->pad_len; | 5143 | int len = qc->nbytes + qc->pad_len; |
5144 | struct scatterlist *sg; | 5144 | struct scatterlist *sg; |
5145 | unsigned int si; | ||
5145 | 5146 | ||
5146 | if (len == 0) | 5147 | if (len == 0) |
5147 | return; | 5148 | return; |
@@ -5159,7 +5160,7 @@ static void ipr_build_ata_ioadl(struct ipr_cmnd *ipr_cmd, | |||
5159 | cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg); | 5160 | cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg); |
5160 | } | 5161 | } |
5161 | 5162 | ||
5162 | ata_for_each_sg(sg, qc) { | 5163 | for_each_sg(qc->sg, sg, qc->n_elem, si) { |
5163 | ioadl->flags_and_data_len = cpu_to_be32(ioadl_flags | sg_dma_len(sg)); | 5164 | ioadl->flags_and_data_len = cpu_to_be32(ioadl_flags | sg_dma_len(sg)); |
5164 | ioadl->address = cpu_to_be32(sg_dma_address(sg)); | 5165 | ioadl->address = cpu_to_be32(sg_dma_address(sg)); |
5165 | 5166 | ||
diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c index f78d0605747d..827cfb132f21 100644 --- a/drivers/scsi/libsas/sas_ata.c +++ b/drivers/scsi/libsas/sas_ata.c | |||
@@ -158,8 +158,8 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc) | |||
158 | struct Scsi_Host *host = sas_ha->core.shost; | 158 | struct Scsi_Host *host = sas_ha->core.shost; |
159 | struct sas_internal *i = to_sas_internal(host->transportt); | 159 | struct sas_internal *i = to_sas_internal(host->transportt); |
160 | struct scatterlist *sg; | 160 | struct scatterlist *sg; |
161 | unsigned int num = 0; | ||
162 | unsigned int xfer = 0; | 161 | unsigned int xfer = 0; |
162 | unsigned int si; | ||
163 | 163 | ||
164 | task = sas_alloc_task(GFP_ATOMIC); | 164 | task = sas_alloc_task(GFP_ATOMIC); |
165 | if (!task) | 165 | if (!task) |
@@ -181,17 +181,15 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc) | |||
181 | task->total_xfer_len = qc->nbytes + qc->pad_len; | 181 | task->total_xfer_len = qc->nbytes + qc->pad_len; |
182 | task->num_scatter = qc->pad_len ? qc->n_elem + 1 : qc->n_elem; | 182 | task->num_scatter = qc->pad_len ? qc->n_elem + 1 : qc->n_elem; |
183 | } else { | 183 | } else { |
184 | ata_for_each_sg(sg, qc) { | 184 | for_each_sg(qc->sg, sg, qc->n_elem, si) |
185 | num++; | ||
186 | xfer += sg->length; | 185 | xfer += sg->length; |
187 | } | ||
188 | 186 | ||
189 | task->total_xfer_len = xfer; | 187 | task->total_xfer_len = xfer; |
190 | task->num_scatter = num; | 188 | task->num_scatter = si; |
191 | } | 189 | } |
192 | 190 | ||
193 | task->data_dir = qc->dma_dir; | 191 | task->data_dir = qc->dma_dir; |
194 | task->scatter = qc->__sg; | 192 | task->scatter = qc->sg; |
195 | task->ata_task.retry_count = 1; | 193 | task->ata_task.retry_count = 1; |
196 | task->task_state_flags = SAS_TASK_STATE_PENDING; | 194 | task->task_state_flags = SAS_TASK_STATE_PENDING; |
197 | qc->lldd_task = task; | 195 | qc->lldd_task = task; |
diff --git a/include/linux/libata.h b/include/linux/libata.h index acd90ad78417..162f8b5509ac 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -458,7 +458,7 @@ struct ata_queued_cmd { | |||
458 | unsigned int tag; | 458 | unsigned int tag; |
459 | unsigned int n_elem; | 459 | unsigned int n_elem; |
460 | unsigned int n_iter; | 460 | unsigned int n_iter; |
461 | unsigned int orig_n_elem; | 461 | unsigned int mapped_n_elem; |
462 | 462 | ||
463 | int dma_dir; | 463 | int dma_dir; |
464 | 464 | ||
@@ -471,11 +471,12 @@ struct ata_queued_cmd { | |||
471 | struct scatterlist *cursg; | 471 | struct scatterlist *cursg; |
472 | unsigned int cursg_ofs; | 472 | unsigned int cursg_ofs; |
473 | 473 | ||
474 | struct scatterlist *last_sg; | ||
475 | struct scatterlist saved_last_sg; | ||
474 | struct scatterlist sgent; | 476 | struct scatterlist sgent; |
475 | struct scatterlist pad_sgent; | 477 | struct scatterlist extra_sg[2]; |
476 | 478 | ||
477 | /* DO NOT iterate over __sg manually, use ata_for_each_sg() */ | 479 | struct scatterlist *sg; |
478 | struct scatterlist *__sg; | ||
479 | 480 | ||
480 | unsigned int err_mask; | 481 | unsigned int err_mask; |
481 | struct ata_taskfile result_tf; | 482 | struct ata_taskfile result_tf; |
@@ -1123,35 +1124,6 @@ extern void ata_port_pbar_desc(struct ata_port *ap, int bar, ssize_t offset, | |||
1123 | const char *name); | 1124 | const char *name); |
1124 | #endif | 1125 | #endif |
1125 | 1126 | ||
1126 | /* | ||
1127 | * qc helpers | ||
1128 | */ | ||
1129 | static inline struct scatterlist * | ||
1130 | ata_qc_first_sg(struct ata_queued_cmd *qc) | ||
1131 | { | ||
1132 | qc->n_iter = 0; | ||
1133 | if (qc->n_elem) | ||
1134 | return qc->__sg; | ||
1135 | if (qc->pad_len) | ||
1136 | return &qc->pad_sgent; | ||
1137 | return NULL; | ||
1138 | } | ||
1139 | |||
1140 | static inline struct scatterlist * | ||
1141 | ata_qc_next_sg(struct scatterlist *sg, struct ata_queued_cmd *qc) | ||
1142 | { | ||
1143 | if (sg == &qc->pad_sgent) | ||
1144 | return NULL; | ||
1145 | if (++qc->n_iter < qc->n_elem) | ||
1146 | return sg_next(sg); | ||
1147 | if (qc->pad_len) | ||
1148 | return &qc->pad_sgent; | ||
1149 | return NULL; | ||
1150 | } | ||
1151 | |||
1152 | #define ata_for_each_sg(sg, qc) \ | ||
1153 | for (sg = ata_qc_first_sg(qc); sg; sg = ata_qc_next_sg(sg, qc)) | ||
1154 | |||
1155 | static inline unsigned int ata_tag_valid(unsigned int tag) | 1127 | static inline unsigned int ata_tag_valid(unsigned int tag) |
1156 | { | 1128 | { |
1157 | return (tag < ATA_MAX_QUEUE) ? 1 : 0; | 1129 | return (tag < ATA_MAX_QUEUE) ? 1 : 0; |
@@ -1386,15 +1358,17 @@ static inline void ata_tf_init(struct ata_device *dev, struct ata_taskfile *tf) | |||
1386 | static inline void ata_qc_reinit(struct ata_queued_cmd *qc) | 1358 | static inline void ata_qc_reinit(struct ata_queued_cmd *qc) |
1387 | { | 1359 | { |
1388 | qc->dma_dir = DMA_NONE; | 1360 | qc->dma_dir = DMA_NONE; |
1389 | qc->__sg = NULL; | 1361 | qc->sg = NULL; |
1390 | qc->flags = 0; | 1362 | qc->flags = 0; |
1391 | qc->cursg = NULL; | 1363 | qc->cursg = NULL; |
1392 | qc->cursg_ofs = 0; | 1364 | qc->cursg_ofs = 0; |
1393 | qc->nbytes = qc->curbytes = 0; | 1365 | qc->nbytes = qc->curbytes = 0; |
1394 | qc->n_elem = 0; | 1366 | qc->n_elem = 0; |
1367 | qc->mapped_n_elem = 0; | ||
1395 | qc->n_iter = 0; | 1368 | qc->n_iter = 0; |
1396 | qc->err_mask = 0; | 1369 | qc->err_mask = 0; |
1397 | qc->pad_len = 0; | 1370 | qc->pad_len = 0; |
1371 | qc->last_sg = NULL; | ||
1398 | qc->sect_size = ATA_SECT_SIZE; | 1372 | qc->sect_size = ATA_SECT_SIZE; |
1399 | 1373 | ||
1400 | ata_tf_init(qc->dev, &qc->tf); | 1374 | ata_tf_init(qc->dev, &qc->tf); |