diff options
-rw-r--r-- | drivers/ata/ahci.c | 5 | ||||
-rw-r--r-- | drivers/ata/libata-core.c | 145 | ||||
-rw-r--r-- | drivers/ata/libata-scsi.c | 23 | ||||
-rw-r--r-- | drivers/ata/pata_icside.c | 8 | ||||
-rw-r--r-- | drivers/ata/sata_fsl.c | 13 | ||||
-rw-r--r-- | drivers/ata/sata_mv.c | 6 | ||||
-rw-r--r-- | drivers/ata/sata_sil24.c | 5 | ||||
-rw-r--r-- | drivers/scsi/ipr.c | 4 | ||||
-rw-r--r-- | drivers/scsi/libsas/sas_ata.c | 4 | ||||
-rw-r--r-- | include/linux/libata.h | 28 |
10 files changed, 21 insertions, 220 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 29e71bddd6ff..3c06e457b4dc 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -1975,16 +1975,11 @@ static int ahci_port_start(struct ata_port *ap) | |||
1975 | struct ahci_port_priv *pp; | 1975 | struct ahci_port_priv *pp; |
1976 | void *mem; | 1976 | void *mem; |
1977 | dma_addr_t mem_dma; | 1977 | dma_addr_t mem_dma; |
1978 | int rc; | ||
1979 | 1978 | ||
1980 | pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL); | 1979 | pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL); |
1981 | if (!pp) | 1980 | if (!pp) |
1982 | return -ENOMEM; | 1981 | return -ENOMEM; |
1983 | 1982 | ||
1984 | rc = ata_pad_alloc(ap, dev); | ||
1985 | if (rc) | ||
1986 | return rc; | ||
1987 | |||
1988 | mem = dmam_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma, | 1983 | mem = dmam_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma, |
1989 | GFP_KERNEL); | 1984 | GFP_KERNEL); |
1990 | if (!mem) | 1985 | if (!mem) |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index a109ccbda9ca..3587ac3fe3f3 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -4493,30 +4493,13 @@ void ata_sg_clean(struct ata_queued_cmd *qc) | |||
4493 | struct ata_port *ap = qc->ap; | 4493 | struct ata_port *ap = qc->ap; |
4494 | struct scatterlist *sg = qc->sg; | 4494 | struct scatterlist *sg = qc->sg; |
4495 | int dir = qc->dma_dir; | 4495 | int dir = qc->dma_dir; |
4496 | void *pad_buf = NULL; | ||
4497 | 4496 | ||
4498 | WARN_ON(sg == NULL); | 4497 | WARN_ON(sg == NULL); |
4499 | 4498 | ||
4500 | VPRINTK("unmapping %u sg elements\n", qc->mapped_n_elem); | 4499 | VPRINTK("unmapping %u sg elements\n", qc->n_elem); |
4501 | 4500 | ||
4502 | /* if we padded the buffer out to 32-bit bound, and data | 4501 | if (qc->n_elem) |
4503 | * xfer direction is from-device, we must copy from the | 4502 | dma_unmap_sg(ap->dev, sg, qc->n_elem, dir); |
4504 | * pad buffer back into the supplied buffer | ||
4505 | */ | ||
4506 | if (qc->pad_len && !(qc->tf.flags & ATA_TFLAG_WRITE)) | ||
4507 | pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ); | ||
4508 | |||
4509 | if (qc->mapped_n_elem) | ||
4510 | dma_unmap_sg(ap->dev, sg, qc->mapped_n_elem, dir); | ||
4511 | /* restore last sg */ | ||
4512 | if (qc->last_sg) | ||
4513 | *qc->last_sg = qc->saved_last_sg; | ||
4514 | if (pad_buf) { | ||
4515 | struct scatterlist *psg = &qc->extra_sg[1]; | ||
4516 | void *addr = kmap_atomic(sg_page(psg), KM_IRQ0); | ||
4517 | memcpy(addr + psg->offset, pad_buf, qc->pad_len); | ||
4518 | kunmap_atomic(addr, KM_IRQ0); | ||
4519 | } | ||
4520 | 4503 | ||
4521 | qc->flags &= ~ATA_QCFLAG_DMAMAP; | 4504 | qc->flags &= ~ATA_QCFLAG_DMAMAP; |
4522 | qc->sg = NULL; | 4505 | qc->sg = NULL; |
@@ -4767,97 +4750,6 @@ void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg, | |||
4767 | qc->cursg = qc->sg; | 4750 | qc->cursg = qc->sg; |
4768 | } | 4751 | } |
4769 | 4752 | ||
4770 | static unsigned int ata_sg_setup_extra(struct ata_queued_cmd *qc, | ||
4771 | unsigned int *n_elem_extra, | ||
4772 | unsigned int *nbytes_extra) | ||
4773 | { | ||
4774 | struct ata_port *ap = qc->ap; | ||
4775 | unsigned int n_elem = qc->n_elem; | ||
4776 | struct scatterlist *lsg, *copy_lsg = NULL, *tsg = NULL, *esg = NULL; | ||
4777 | |||
4778 | *n_elem_extra = 0; | ||
4779 | *nbytes_extra = 0; | ||
4780 | |||
4781 | /* needs padding? */ | ||
4782 | qc->pad_len = qc->nbytes & 3; | ||
4783 | |||
4784 | if (likely(!qc->pad_len)) | ||
4785 | return n_elem; | ||
4786 | |||
4787 | /* locate last sg and save it */ | ||
4788 | lsg = sg_last(qc->sg, n_elem); | ||
4789 | qc->last_sg = lsg; | ||
4790 | qc->saved_last_sg = *lsg; | ||
4791 | |||
4792 | sg_init_table(qc->extra_sg, ARRAY_SIZE(qc->extra_sg)); | ||
4793 | |||
4794 | if (qc->pad_len) { | ||
4795 | struct scatterlist *psg = &qc->extra_sg[1]; | ||
4796 | void *pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ); | ||
4797 | unsigned int offset; | ||
4798 | |||
4799 | WARN_ON(qc->dev->class != ATA_DEV_ATAPI); | ||
4800 | |||
4801 | memset(pad_buf, 0, ATA_DMA_PAD_SZ); | ||
4802 | |||
4803 | /* psg->page/offset are used to copy to-be-written | ||
4804 | * data in this function or read data in ata_sg_clean. | ||
4805 | */ | ||
4806 | offset = lsg->offset + lsg->length - qc->pad_len; | ||
4807 | sg_set_page(psg, nth_page(sg_page(lsg), offset >> PAGE_SHIFT), | ||
4808 | qc->pad_len, offset_in_page(offset)); | ||
4809 | |||
4810 | if (qc->tf.flags & ATA_TFLAG_WRITE) { | ||
4811 | void *addr = kmap_atomic(sg_page(psg), KM_IRQ0); | ||
4812 | memcpy(pad_buf, addr + psg->offset, qc->pad_len); | ||
4813 | kunmap_atomic(addr, KM_IRQ0); | ||
4814 | } | ||
4815 | |||
4816 | sg_dma_address(psg) = ap->pad_dma + (qc->tag * ATA_DMA_PAD_SZ); | ||
4817 | sg_dma_len(psg) = ATA_DMA_PAD_SZ; | ||
4818 | |||
4819 | /* Trim the last sg entry and chain the original and | ||
4820 | * padding sg lists. | ||
4821 | * | ||
4822 | * Because chaining consumes one sg entry, one extra | ||
4823 | * sg entry is allocated and the last sg entry is | ||
4824 | * copied to it if the length isn't zero after padded | ||
4825 | * amount is removed. | ||
4826 | * | ||
4827 | * If the last sg entry is completely replaced by | ||
4828 | * padding sg entry, the first sg entry is skipped | ||
4829 | * while chaining. | ||
4830 | */ | ||
4831 | lsg->length -= qc->pad_len; | ||
4832 | if (lsg->length) { | ||
4833 | copy_lsg = &qc->extra_sg[0]; | ||
4834 | tsg = &qc->extra_sg[0]; | ||
4835 | } else { | ||
4836 | n_elem--; | ||
4837 | tsg = &qc->extra_sg[1]; | ||
4838 | } | ||
4839 | |||
4840 | esg = &qc->extra_sg[1]; | ||
4841 | |||
4842 | (*n_elem_extra)++; | ||
4843 | (*nbytes_extra) += 4 - qc->pad_len; | ||
4844 | } | ||
4845 | |||
4846 | if (copy_lsg) | ||
4847 | sg_set_page(copy_lsg, sg_page(lsg), lsg->length, lsg->offset); | ||
4848 | |||
4849 | sg_chain(lsg, 1, tsg); | ||
4850 | sg_mark_end(esg); | ||
4851 | |||
4852 | /* sglist can't start with chaining sg entry, fast forward */ | ||
4853 | if (qc->sg == lsg) { | ||
4854 | qc->sg = tsg; | ||
4855 | qc->cursg = tsg; | ||
4856 | } | ||
4857 | |||
4858 | return n_elem; | ||
4859 | } | ||
4860 | |||
4861 | /** | 4753 | /** |
4862 | * ata_sg_setup - DMA-map the scatter-gather table associated with a command. | 4754 | * ata_sg_setup - DMA-map the scatter-gather table associated with a command. |
4863 | * @qc: Command with scatter-gather table to be mapped. | 4755 | * @qc: Command with scatter-gather table to be mapped. |
@@ -4874,26 +4766,17 @@ static unsigned int ata_sg_setup_extra(struct ata_queued_cmd *qc, | |||
4874 | static int ata_sg_setup(struct ata_queued_cmd *qc) | 4766 | static int ata_sg_setup(struct ata_queued_cmd *qc) |
4875 | { | 4767 | { |
4876 | struct ata_port *ap = qc->ap; | 4768 | struct ata_port *ap = qc->ap; |
4877 | unsigned int n_elem, n_elem_extra, nbytes_extra; | 4769 | unsigned int n_elem; |
4878 | 4770 | ||
4879 | VPRINTK("ENTER, ata%u\n", ap->print_id); | 4771 | VPRINTK("ENTER, ata%u\n", ap->print_id); |
4880 | 4772 | ||
4881 | n_elem = ata_sg_setup_extra(qc, &n_elem_extra, &nbytes_extra); | 4773 | n_elem = dma_map_sg(ap->dev, qc->sg, qc->n_elem, qc->dma_dir); |
4774 | if (n_elem < 1) | ||
4775 | return -1; | ||
4882 | 4776 | ||
4883 | if (n_elem) { | 4777 | DPRINTK("%d sg elements mapped\n", n_elem); |
4884 | n_elem = dma_map_sg(ap->dev, qc->sg, n_elem, qc->dma_dir); | ||
4885 | if (n_elem < 1) { | ||
4886 | /* restore last sg */ | ||
4887 | if (qc->last_sg) | ||
4888 | *qc->last_sg = qc->saved_last_sg; | ||
4889 | return -1; | ||
4890 | } | ||
4891 | DPRINTK("%d sg elements mapped\n", n_elem); | ||
4892 | } | ||
4893 | 4778 | ||
4894 | qc->n_elem = qc->mapped_n_elem = n_elem; | 4779 | qc->n_elem = n_elem; |
4895 | qc->n_elem += n_elem_extra; | ||
4896 | qc->nbytes += nbytes_extra; | ||
4897 | qc->flags |= ATA_QCFLAG_DMAMAP; | 4780 | qc->flags |= ATA_QCFLAG_DMAMAP; |
4898 | 4781 | ||
4899 | return 0; | 4782 | return 0; |
@@ -5962,9 +5845,6 @@ void ata_qc_issue(struct ata_queued_cmd *qc) | |||
5962 | */ | 5845 | */ |
5963 | BUG_ON(ata_is_data(prot) && (!qc->sg || !qc->n_elem || !qc->nbytes)); | 5846 | BUG_ON(ata_is_data(prot) && (!qc->sg || !qc->n_elem || !qc->nbytes)); |
5964 | 5847 | ||
5965 | /* ata_sg_setup() may update nbytes */ | ||
5966 | qc->raw_nbytes = qc->nbytes; | ||
5967 | |||
5968 | if (ata_is_dma(prot) || (ata_is_pio(prot) && | 5848 | if (ata_is_dma(prot) || (ata_is_pio(prot) && |
5969 | (ap->flags & ATA_FLAG_PIO_DMA))) | 5849 | (ap->flags & ATA_FLAG_PIO_DMA))) |
5970 | if (ata_sg_setup(qc)) | 5850 | if (ata_sg_setup(qc)) |
@@ -6573,19 +6453,12 @@ void ata_host_resume(struct ata_host *host) | |||
6573 | int ata_port_start(struct ata_port *ap) | 6453 | int ata_port_start(struct ata_port *ap) |
6574 | { | 6454 | { |
6575 | struct device *dev = ap->dev; | 6455 | struct device *dev = ap->dev; |
6576 | int rc; | ||
6577 | 6456 | ||
6578 | ap->prd = dmam_alloc_coherent(dev, ATA_PRD_TBL_SZ, &ap->prd_dma, | 6457 | ap->prd = dmam_alloc_coherent(dev, ATA_PRD_TBL_SZ, &ap->prd_dma, |
6579 | GFP_KERNEL); | 6458 | GFP_KERNEL); |
6580 | if (!ap->prd) | 6459 | if (!ap->prd) |
6581 | return -ENOMEM; | 6460 | return -ENOMEM; |
6582 | 6461 | ||
6583 | rc = ata_pad_alloc(ap, dev); | ||
6584 | if (rc) | ||
6585 | return rc; | ||
6586 | |||
6587 | DPRINTK("prd alloc, virt %p, dma %llx\n", ap->prd, | ||
6588 | (unsigned long long)ap->prd_dma); | ||
6589 | return 0; | 6462 | return 0; |
6590 | } | 6463 | } |
6591 | 6464 | ||
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 1cea18f62abc..6e15c5ddae6d 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -832,24 +832,16 @@ static void ata_scsi_dev_config(struct scsi_device *sdev, | |||
832 | /* configure max sectors */ | 832 | /* configure max sectors */ |
833 | blk_queue_max_sectors(sdev->request_queue, dev->max_sectors); | 833 | blk_queue_max_sectors(sdev->request_queue, dev->max_sectors); |
834 | 834 | ||
835 | /* SATA DMA transfers must be multiples of 4 byte, so | 835 | if (dev->class == ATA_DEV_ATAPI) |
836 | * we need to pad ATAPI transfers using an extra sg. | ||
837 | * Decrement max hw segments accordingly. | ||
838 | */ | ||
839 | if (dev->class == ATA_DEV_ATAPI) { | ||
840 | struct request_queue *q = sdev->request_queue; | ||
841 | blk_queue_max_hw_segments(q, q->max_hw_segments - 1); | ||
842 | |||
843 | /* set the min alignment */ | 836 | /* set the min alignment */ |
844 | blk_queue_update_dma_alignment(sdev->request_queue, | 837 | blk_queue_update_dma_alignment(sdev->request_queue, |
845 | ATA_DMA_PAD_SZ - 1); | 838 | ATA_DMA_PAD_SZ - 1); |
846 | } else | 839 | else { |
847 | /* ATA devices must be sector aligned */ | 840 | /* ATA devices must be sector aligned */ |
848 | blk_queue_update_dma_alignment(sdev->request_queue, | 841 | blk_queue_update_dma_alignment(sdev->request_queue, |
849 | ATA_SECT_SIZE - 1); | 842 | ATA_SECT_SIZE - 1); |
850 | |||
851 | if (dev->class == ATA_DEV_ATA) | ||
852 | sdev->manage_start_stop = 1; | 843 | sdev->manage_start_stop = 1; |
844 | } | ||
853 | 845 | ||
854 | if (dev->flags & ATA_DFLAG_AN) | 846 | if (dev->flags & ATA_DFLAG_AN) |
855 | set_bit(SDEV_EVT_MEDIA_CHANGE, sdev->supported_events); | 847 | set_bit(SDEV_EVT_MEDIA_CHANGE, sdev->supported_events); |
@@ -2500,7 +2492,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) | |||
2500 | * want to set it properly, and for DMA where it is | 2492 | * want to set it properly, and for DMA where it is |
2501 | * effectively meaningless. | 2493 | * effectively meaningless. |
2502 | */ | 2494 | */ |
2503 | nbytes = min(qc->nbytes, (unsigned int)63 * 1024); | 2495 | nbytes = min(scmd->request->raw_data_len, (unsigned int)63 * 1024); |
2504 | 2496 | ||
2505 | /* Most ATAPI devices which honor transfer chunk size don't | 2497 | /* Most ATAPI devices which honor transfer chunk size don't |
2506 | * behave according to the spec when odd chunk size which | 2498 | * behave according to the spec when odd chunk size which |
@@ -3555,7 +3547,7 @@ EXPORT_SYMBOL_GPL(ata_sas_port_alloc); | |||
3555 | * @ap: Port to initialize | 3547 | * @ap: Port to initialize |
3556 | * | 3548 | * |
3557 | * Called just after data structures for each port are | 3549 | * Called just after data structures for each port are |
3558 | * initialized. Allocates DMA pad. | 3550 | * initialized. |
3559 | * | 3551 | * |
3560 | * May be used as the port_start() entry in ata_port_operations. | 3552 | * May be used as the port_start() entry in ata_port_operations. |
3561 | * | 3553 | * |
@@ -3564,7 +3556,7 @@ EXPORT_SYMBOL_GPL(ata_sas_port_alloc); | |||
3564 | */ | 3556 | */ |
3565 | int ata_sas_port_start(struct ata_port *ap) | 3557 | int ata_sas_port_start(struct ata_port *ap) |
3566 | { | 3558 | { |
3567 | return ata_pad_alloc(ap, ap->dev); | 3559 | return 0; |
3568 | } | 3560 | } |
3569 | EXPORT_SYMBOL_GPL(ata_sas_port_start); | 3561 | EXPORT_SYMBOL_GPL(ata_sas_port_start); |
3570 | 3562 | ||
@@ -3572,8 +3564,6 @@ EXPORT_SYMBOL_GPL(ata_sas_port_start); | |||
3572 | * ata_port_stop - Undo ata_sas_port_start() | 3564 | * ata_port_stop - Undo ata_sas_port_start() |
3573 | * @ap: Port to shut down | 3565 | * @ap: Port to shut down |
3574 | * | 3566 | * |
3575 | * Frees the DMA pad. | ||
3576 | * | ||
3577 | * May be used as the port_stop() entry in ata_port_operations. | 3567 | * May be used as the port_stop() entry in ata_port_operations. |
3578 | * | 3568 | * |
3579 | * LOCKING: | 3569 | * LOCKING: |
@@ -3582,7 +3572,6 @@ EXPORT_SYMBOL_GPL(ata_sas_port_start); | |||
3582 | 3572 | ||
3583 | void ata_sas_port_stop(struct ata_port *ap) | 3573 | void ata_sas_port_stop(struct ata_port *ap) |
3584 | { | 3574 | { |
3585 | ata_pad_free(ap, ap->dev); | ||
3586 | } | 3575 | } |
3587 | EXPORT_SYMBOL_GPL(ata_sas_port_stop); | 3576 | EXPORT_SYMBOL_GPL(ata_sas_port_stop); |
3588 | 3577 | ||
diff --git a/drivers/ata/pata_icside.c b/drivers/ata/pata_icside.c index 5b8586dac63b..f97068be2d79 100644 --- a/drivers/ata/pata_icside.c +++ b/drivers/ata/pata_icside.c | |||
@@ -304,12 +304,6 @@ static int icside_dma_init(struct pata_icside_info *info) | |||
304 | } | 304 | } |
305 | 305 | ||
306 | 306 | ||
307 | static int pata_icside_port_start(struct ata_port *ap) | ||
308 | { | ||
309 | /* No PRD to alloc */ | ||
310 | return ata_pad_alloc(ap, ap->dev); | ||
311 | } | ||
312 | |||
313 | static struct scsi_host_template pata_icside_sht = { | 307 | static struct scsi_host_template pata_icside_sht = { |
314 | .module = THIS_MODULE, | 308 | .module = THIS_MODULE, |
315 | .name = DRV_NAME, | 309 | .name = DRV_NAME, |
@@ -389,8 +383,6 @@ static struct ata_port_operations pata_icside_port_ops = { | |||
389 | .irq_clear = ata_dummy_noret, | 383 | .irq_clear = ata_dummy_noret, |
390 | .irq_on = ata_irq_on, | 384 | .irq_on = ata_irq_on, |
391 | 385 | ||
392 | .port_start = pata_icside_port_start, | ||
393 | |||
394 | .bmdma_stop = pata_icside_bmdma_stop, | 386 | .bmdma_stop = pata_icside_bmdma_stop, |
395 | .bmdma_status = pata_icside_bmdma_status, | 387 | .bmdma_status = pata_icside_bmdma_status, |
396 | }; | 388 | }; |
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c index efcb66b6ccef..9323dd0c7d8d 100644 --- a/drivers/ata/sata_fsl.c +++ b/drivers/ata/sata_fsl.c | |||
@@ -601,21 +601,9 @@ static int sata_fsl_port_start(struct ata_port *ap) | |||
601 | if (!pp) | 601 | if (!pp) |
602 | return -ENOMEM; | 602 | return -ENOMEM; |
603 | 603 | ||
604 | /* | ||
605 | * allocate per command dma alignment pad buffer, which is used | ||
606 | * internally by libATA to ensure that all transfers ending on | ||
607 | * unaligned boundaries are padded, to align on Dword boundaries | ||
608 | */ | ||
609 | retval = ata_pad_alloc(ap, dev); | ||
610 | if (retval) { | ||
611 | kfree(pp); | ||
612 | return retval; | ||
613 | } | ||
614 | |||
615 | mem = dma_alloc_coherent(dev, SATA_FSL_PORT_PRIV_DMA_SZ, &mem_dma, | 604 | mem = dma_alloc_coherent(dev, SATA_FSL_PORT_PRIV_DMA_SZ, &mem_dma, |
616 | GFP_KERNEL); | 605 | GFP_KERNEL); |
617 | if (!mem) { | 606 | if (!mem) { |
618 | ata_pad_free(ap, dev); | ||
619 | kfree(pp); | 607 | kfree(pp); |
620 | return -ENOMEM; | 608 | return -ENOMEM; |
621 | } | 609 | } |
@@ -694,7 +682,6 @@ static void sata_fsl_port_stop(struct ata_port *ap) | |||
694 | dma_free_coherent(dev, SATA_FSL_PORT_PRIV_DMA_SZ, | 682 | dma_free_coherent(dev, SATA_FSL_PORT_PRIV_DMA_SZ, |
695 | pp->cmdslot, pp->cmdslot_paddr); | 683 | pp->cmdslot, pp->cmdslot_paddr); |
696 | 684 | ||
697 | ata_pad_free(ap, dev); | ||
698 | kfree(pp); | 685 | kfree(pp); |
699 | } | 686 | } |
700 | 687 | ||
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 2ecd44db4142..1c1fbf375d9a 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
@@ -1158,17 +1158,13 @@ static int mv_port_start(struct ata_port *ap) | |||
1158 | struct mv_port_priv *pp; | 1158 | struct mv_port_priv *pp; |
1159 | void __iomem *port_mmio = mv_ap_base(ap); | 1159 | void __iomem *port_mmio = mv_ap_base(ap); |
1160 | unsigned long flags; | 1160 | unsigned long flags; |
1161 | int tag, rc; | 1161 | int tag; |
1162 | 1162 | ||
1163 | pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL); | 1163 | pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL); |
1164 | if (!pp) | 1164 | if (!pp) |
1165 | return -ENOMEM; | 1165 | return -ENOMEM; |
1166 | ap->private_data = pp; | 1166 | ap->private_data = pp; |
1167 | 1167 | ||
1168 | rc = ata_pad_alloc(ap, dev); | ||
1169 | if (rc) | ||
1170 | return rc; | ||
1171 | |||
1172 | pp->crqb = dma_pool_alloc(hpriv->crqb_pool, GFP_KERNEL, &pp->crqb_dma); | 1168 | pp->crqb = dma_pool_alloc(hpriv->crqb_pool, GFP_KERNEL, &pp->crqb_dma); |
1173 | if (!pp->crqb) | 1169 | if (!pp->crqb) |
1174 | return -ENOMEM; | 1170 | return -ENOMEM; |
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index b4b1f91ea693..df7988df7908 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
@@ -1234,7 +1234,6 @@ static int sil24_port_start(struct ata_port *ap) | |||
1234 | union sil24_cmd_block *cb; | 1234 | union sil24_cmd_block *cb; |
1235 | size_t cb_size = sizeof(*cb) * SIL24_MAX_CMDS; | 1235 | size_t cb_size = sizeof(*cb) * SIL24_MAX_CMDS; |
1236 | dma_addr_t cb_dma; | 1236 | dma_addr_t cb_dma; |
1237 | int rc; | ||
1238 | 1237 | ||
1239 | pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL); | 1238 | pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL); |
1240 | if (!pp) | 1239 | if (!pp) |
@@ -1247,10 +1246,6 @@ static int sil24_port_start(struct ata_port *ap) | |||
1247 | return -ENOMEM; | 1246 | return -ENOMEM; |
1248 | memset(cb, 0, cb_size); | 1247 | memset(cb, 0, cb_size); |
1249 | 1248 | ||
1250 | rc = ata_pad_alloc(ap, dev); | ||
1251 | if (rc) | ||
1252 | return rc; | ||
1253 | |||
1254 | pp->cmd_block = cb; | 1249 | pp->cmd_block = cb; |
1255 | pp->cmd_block_dma = cb_dma; | 1250 | pp->cmd_block_dma = cb_dma; |
1256 | 1251 | ||
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 2074701f7e76..c72014a3e7d4 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
@@ -5140,7 +5140,7 @@ static void ipr_build_ata_ioadl(struct ipr_cmnd *ipr_cmd, | |||
5140 | struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; | 5140 | struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; |
5141 | struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl; | 5141 | struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl; |
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; |
5144 | struct scatterlist *sg; | 5144 | struct scatterlist *sg; |
5145 | unsigned int si; | 5145 | unsigned int si; |
5146 | 5146 | ||
@@ -5206,7 +5206,7 @@ static unsigned int ipr_qc_issue(struct ata_queued_cmd *qc) | |||
5206 | ioarcb->cmd_pkt.request_type = IPR_RQTYPE_ATA_PASSTHRU; | 5206 | ioarcb->cmd_pkt.request_type = IPR_RQTYPE_ATA_PASSTHRU; |
5207 | ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_NO_LINK_DESC; | 5207 | ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_NO_LINK_DESC; |
5208 | ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_NO_ULEN_CHK; | 5208 | ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_NO_ULEN_CHK; |
5209 | ipr_cmd->dma_use_sg = qc->pad_len ? qc->n_elem + 1 : qc->n_elem; | 5209 | ipr_cmd->dma_use_sg = qc->n_elem; |
5210 | 5210 | ||
5211 | ipr_build_ata_ioadl(ipr_cmd, qc); | 5211 | ipr_build_ata_ioadl(ipr_cmd, qc); |
5212 | regs->flags |= IPR_ATA_FLAG_STATUS_ON_GOOD_COMPLETION; | 5212 | regs->flags |= IPR_ATA_FLAG_STATUS_ON_GOOD_COMPLETION; |
diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c index 0996f866f14c..7cd05b599a12 100644 --- a/drivers/scsi/libsas/sas_ata.c +++ b/drivers/scsi/libsas/sas_ata.c | |||
@@ -178,8 +178,8 @@ static unsigned int sas_ata_qc_issue(struct ata_queued_cmd *qc) | |||
178 | task->uldd_task = qc; | 178 | task->uldd_task = qc; |
179 | if (ata_is_atapi(qc->tf.protocol)) { | 179 | if (ata_is_atapi(qc->tf.protocol)) { |
180 | memcpy(task->ata_task.atapi_packet, qc->cdb, qc->dev->cdb_len); | 180 | memcpy(task->ata_task.atapi_packet, qc->cdb, qc->dev->cdb_len); |
181 | task->total_xfer_len = qc->nbytes + qc->pad_len; | 181 | task->total_xfer_len = qc->nbytes; |
182 | task->num_scatter = qc->pad_len ? qc->n_elem + 1 : qc->n_elem; | 182 | task->num_scatter = qc->n_elem; |
183 | } else { | 183 | } else { |
184 | for_each_sg(qc->sg, sg, qc->n_elem, si) | 184 | for_each_sg(qc->sg, sg, qc->n_elem, si) |
185 | xfer += sg->length; | 185 | xfer += sg->length; |
diff --git a/include/linux/libata.h b/include/linux/libata.h index bc5a8d0c7090..2e098f940cec 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -278,7 +278,6 @@ enum { | |||
278 | 278 | ||
279 | /* size of buffer to pad xfers ending on unaligned boundaries */ | 279 | /* size of buffer to pad xfers ending on unaligned boundaries */ |
280 | ATA_DMA_PAD_SZ = 4, | 280 | ATA_DMA_PAD_SZ = 4, |
281 | ATA_DMA_PAD_BUF_SZ = ATA_DMA_PAD_SZ * ATA_MAX_QUEUE, | ||
282 | 281 | ||
283 | /* ering size */ | 282 | /* ering size */ |
284 | ATA_ERING_SIZE = 32, | 283 | ATA_ERING_SIZE = 32, |
@@ -457,24 +456,18 @@ struct ata_queued_cmd { | |||
457 | unsigned long flags; /* ATA_QCFLAG_xxx */ | 456 | unsigned long flags; /* ATA_QCFLAG_xxx */ |
458 | unsigned int tag; | 457 | unsigned int tag; |
459 | unsigned int n_elem; | 458 | unsigned int n_elem; |
460 | unsigned int mapped_n_elem; | ||
461 | 459 | ||
462 | int dma_dir; | 460 | int dma_dir; |
463 | 461 | ||
464 | unsigned int pad_len; | ||
465 | unsigned int sect_size; | 462 | unsigned int sect_size; |
466 | 463 | ||
467 | unsigned int nbytes; | 464 | unsigned int nbytes; |
468 | unsigned int raw_nbytes; | ||
469 | unsigned int curbytes; | 465 | unsigned int curbytes; |
470 | 466 | ||
471 | struct scatterlist *cursg; | 467 | struct scatterlist *cursg; |
472 | unsigned int cursg_ofs; | 468 | unsigned int cursg_ofs; |
473 | 469 | ||
474 | struct scatterlist *last_sg; | ||
475 | struct scatterlist saved_last_sg; | ||
476 | struct scatterlist sgent; | 470 | struct scatterlist sgent; |
477 | struct scatterlist extra_sg[2]; | ||
478 | 471 | ||
479 | struct scatterlist *sg; | 472 | struct scatterlist *sg; |
480 | 473 | ||
@@ -619,9 +612,6 @@ struct ata_port { | |||
619 | struct ata_prd *prd; /* our SG list */ | 612 | struct ata_prd *prd; /* our SG list */ |
620 | dma_addr_t prd_dma; /* and its DMA mapping */ | 613 | dma_addr_t prd_dma; /* and its DMA mapping */ |
621 | 614 | ||
622 | void *pad; /* array of DMA pad buffers */ | ||
623 | dma_addr_t pad_dma; | ||
624 | |||
625 | struct ata_ioports ioaddr; /* ATA cmd/ctl/dma register blocks */ | 615 | struct ata_ioports ioaddr; /* ATA cmd/ctl/dma register blocks */ |
626 | 616 | ||
627 | u8 ctl; /* cache of ATA control register */ | 617 | u8 ctl; /* cache of ATA control register */ |
@@ -1363,12 +1353,9 @@ static inline void ata_qc_reinit(struct ata_queued_cmd *qc) | |||
1363 | qc->flags = 0; | 1353 | qc->flags = 0; |
1364 | qc->cursg = NULL; | 1354 | qc->cursg = NULL; |
1365 | qc->cursg_ofs = 0; | 1355 | qc->cursg_ofs = 0; |
1366 | qc->nbytes = qc->raw_nbytes = qc->curbytes = 0; | 1356 | qc->nbytes = qc->curbytes = 0; |
1367 | qc->n_elem = 0; | 1357 | qc->n_elem = 0; |
1368 | qc->mapped_n_elem = 0; | ||
1369 | qc->err_mask = 0; | 1358 | qc->err_mask = 0; |
1370 | qc->pad_len = 0; | ||
1371 | qc->last_sg = NULL; | ||
1372 | qc->sect_size = ATA_SECT_SIZE; | 1359 | qc->sect_size = ATA_SECT_SIZE; |
1373 | 1360 | ||
1374 | ata_tf_init(qc->dev, &qc->tf); | 1361 | ata_tf_init(qc->dev, &qc->tf); |
@@ -1423,19 +1410,6 @@ static inline unsigned int __ac_err_mask(u8 status) | |||
1423 | return mask; | 1410 | return mask; |
1424 | } | 1411 | } |
1425 | 1412 | ||
1426 | static inline int ata_pad_alloc(struct ata_port *ap, struct device *dev) | ||
1427 | { | ||
1428 | ap->pad_dma = 0; | ||
1429 | ap->pad = dmam_alloc_coherent(dev, ATA_DMA_PAD_BUF_SZ, | ||
1430 | &ap->pad_dma, GFP_KERNEL); | ||
1431 | return (ap->pad == NULL) ? -ENOMEM : 0; | ||
1432 | } | ||
1433 | |||
1434 | static inline void ata_pad_free(struct ata_port *ap, struct device *dev) | ||
1435 | { | ||
1436 | dmam_free_coherent(dev, ATA_DMA_PAD_BUF_SZ, ap->pad, ap->pad_dma); | ||
1437 | } | ||
1438 | |||
1439 | static inline struct ata_port *ata_shost_to_port(struct Scsi_Host *host) | 1413 | static inline struct ata_port *ata_shost_to_port(struct Scsi_Host *host) |
1440 | { | 1414 | { |
1441 | return *(struct ata_port **)&host->hostdata[0]; | 1415 | return *(struct ata_port **)&host->hostdata[0]; |