diff options
-rw-r--r-- | drivers/mmc/mmc_block.c | 1 | ||||
-rw-r--r-- | drivers/mmc/wbsd.c | 15 | ||||
-rw-r--r-- | drivers/scsi/ahci.c | 31 | ||||
-rw-r--r-- | drivers/scsi/libata-core.c | 129 | ||||
-rw-r--r-- | drivers/scsi/libata-scsi.c | 14 | ||||
-rw-r--r-- | drivers/scsi/pdc_adma.c | 8 | ||||
-rw-r--r-- | drivers/scsi/sata_mv.c | 48 | ||||
-rw-r--r-- | drivers/scsi/sata_qstor.c | 8 | ||||
-rw-r--r-- | drivers/scsi/sata_sil24.c | 48 | ||||
-rw-r--r-- | drivers/scsi/sata_sx4.c | 13 | ||||
-rw-r--r-- | include/linux/libata.h | 52 |
11 files changed, 284 insertions, 83 deletions
diff --git a/drivers/mmc/mmc_block.c b/drivers/mmc/mmc_block.c index 9b629856c735..d91fcf7c3178 100644 --- a/drivers/mmc/mmc_block.c +++ b/drivers/mmc/mmc_block.c | |||
@@ -203,7 +203,6 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) | |||
203 | brq.data.flags |= MMC_DATA_READ; | 203 | brq.data.flags |= MMC_DATA_READ; |
204 | } else { | 204 | } else { |
205 | brq.cmd.opcode = MMC_WRITE_BLOCK; | 205 | brq.cmd.opcode = MMC_WRITE_BLOCK; |
206 | brq.cmd.flags = MMC_RSP_R1B; | ||
207 | brq.data.flags |= MMC_DATA_WRITE; | 206 | brq.data.flags |= MMC_DATA_WRITE; |
208 | brq.data.blocks = 1; | 207 | brq.data.blocks = 1; |
209 | } | 208 | } |
diff --git a/drivers/mmc/wbsd.c b/drivers/mmc/wbsd.c index 942668e93a74..4ff67e7363d9 100644 --- a/drivers/mmc/wbsd.c +++ b/drivers/mmc/wbsd.c | |||
@@ -201,7 +201,7 @@ static void wbsd_reset(struct wbsd_host* host) | |||
201 | { | 201 | { |
202 | u8 setup; | 202 | u8 setup; |
203 | 203 | ||
204 | printk(KERN_ERR DRIVER_NAME ": Resetting chip\n"); | 204 | printk(KERN_ERR "%s: Resetting chip\n", mmc_hostname(host->mmc)); |
205 | 205 | ||
206 | /* | 206 | /* |
207 | * Soft reset of chip (SD/MMC part). | 207 | * Soft reset of chip (SD/MMC part). |
@@ -880,8 +880,9 @@ static void wbsd_finish_data(struct wbsd_host* host, struct mmc_data* data) | |||
880 | */ | 880 | */ |
881 | if (count) | 881 | if (count) |
882 | { | 882 | { |
883 | printk(KERN_ERR DRIVER_NAME ": Incomplete DMA " | 883 | printk(KERN_ERR "%s: Incomplete DMA transfer. " |
884 | "transfer. %d bytes left.\n", count); | 884 | "%d bytes left.\n", |
885 | mmc_hostname(host->mmc), count); | ||
885 | 886 | ||
886 | data->error = MMC_ERR_FAILED; | 887 | data->error = MMC_ERR_FAILED; |
887 | } | 888 | } |
@@ -1169,8 +1170,8 @@ static void wbsd_tasklet_card(unsigned long param) | |||
1169 | 1170 | ||
1170 | if (host->mrq) | 1171 | if (host->mrq) |
1171 | { | 1172 | { |
1172 | printk(KERN_ERR DRIVER_NAME | 1173 | printk(KERN_ERR "%s: Card removed during transfer!\n", |
1173 | ": Card removed during transfer!\n"); | 1174 | mmc_hostname(host->mmc)); |
1174 | wbsd_reset(host); | 1175 | wbsd_reset(host); |
1175 | 1176 | ||
1176 | host->mrq->cmd->error = MMC_ERR_FAILED; | 1177 | host->mrq->cmd->error = MMC_ERR_FAILED; |
@@ -1852,9 +1853,9 @@ static int __devinit wbsd_init(struct device* dev, int base, int irq, int dma, | |||
1852 | /* | 1853 | /* |
1853 | * See if chip needs to be configured. | 1854 | * See if chip needs to be configured. |
1854 | */ | 1855 | */ |
1855 | if (pnp && (host->config != 0)) | 1856 | if (pnp) |
1856 | { | 1857 | { |
1857 | if (!wbsd_chip_validate(host)) | 1858 | if ((host->config != 0) && !wbsd_chip_validate(host)) |
1858 | { | 1859 | { |
1859 | printk(KERN_WARNING DRIVER_NAME | 1860 | printk(KERN_WARNING DRIVER_NAME |
1860 | ": PnP active but chip not configured! " | 1861 | ": PnP active but chip not configured! " |
diff --git a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c index e2a5657d5fdb..4612312c0c2d 100644 --- a/drivers/scsi/ahci.c +++ b/drivers/scsi/ahci.c | |||
@@ -307,14 +307,22 @@ static int ahci_port_start(struct ata_port *ap) | |||
307 | void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); | 307 | void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no); |
308 | void *mem; | 308 | void *mem; |
309 | dma_addr_t mem_dma; | 309 | dma_addr_t mem_dma; |
310 | int rc; | ||
310 | 311 | ||
311 | pp = kmalloc(sizeof(*pp), GFP_KERNEL); | 312 | pp = kmalloc(sizeof(*pp), GFP_KERNEL); |
312 | if (!pp) | 313 | if (!pp) |
313 | return -ENOMEM; | 314 | return -ENOMEM; |
314 | memset(pp, 0, sizeof(*pp)); | 315 | memset(pp, 0, sizeof(*pp)); |
315 | 316 | ||
317 | rc = ata_pad_alloc(ap, dev); | ||
318 | if (rc) { | ||
319 | kfree(pp); | ||
320 | return rc; | ||
321 | } | ||
322 | |||
316 | mem = dma_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma, GFP_KERNEL); | 323 | mem = dma_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma, GFP_KERNEL); |
317 | if (!mem) { | 324 | if (!mem) { |
325 | ata_pad_free(ap, dev); | ||
318 | kfree(pp); | 326 | kfree(pp); |
319 | return -ENOMEM; | 327 | return -ENOMEM; |
320 | } | 328 | } |
@@ -390,6 +398,7 @@ static void ahci_port_stop(struct ata_port *ap) | |||
390 | ap->private_data = NULL; | 398 | ap->private_data = NULL; |
391 | dma_free_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, | 399 | dma_free_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, |
392 | pp->cmd_slot, pp->cmd_slot_dma); | 400 | pp->cmd_slot, pp->cmd_slot_dma); |
401 | ata_pad_free(ap, dev); | ||
393 | kfree(pp); | 402 | kfree(pp); |
394 | } | 403 | } |
395 | 404 | ||
@@ -468,23 +477,23 @@ static void ahci_tf_read(struct ata_port *ap, struct ata_taskfile *tf) | |||
468 | static void ahci_fill_sg(struct ata_queued_cmd *qc) | 477 | static void ahci_fill_sg(struct ata_queued_cmd *qc) |
469 | { | 478 | { |
470 | struct ahci_port_priv *pp = qc->ap->private_data; | 479 | struct ahci_port_priv *pp = qc->ap->private_data; |
471 | unsigned int i; | 480 | struct scatterlist *sg; |
481 | struct ahci_sg *ahci_sg; | ||
472 | 482 | ||
473 | VPRINTK("ENTER\n"); | 483 | VPRINTK("ENTER\n"); |
474 | 484 | ||
475 | /* | 485 | /* |
476 | * Next, the S/G list. | 486 | * Next, the S/G list. |
477 | */ | 487 | */ |
478 | for (i = 0; i < qc->n_elem; i++) { | 488 | ahci_sg = pp->cmd_tbl_sg; |
479 | u32 sg_len; | 489 | ata_for_each_sg(sg, qc) { |
480 | dma_addr_t addr; | 490 | dma_addr_t addr = sg_dma_address(sg); |
481 | 491 | u32 sg_len = sg_dma_len(sg); | |
482 | addr = sg_dma_address(&qc->sg[i]); | 492 | |
483 | sg_len = sg_dma_len(&qc->sg[i]); | 493 | ahci_sg->addr = cpu_to_le32(addr & 0xffffffff); |
484 | 494 | ahci_sg->addr_hi = cpu_to_le32((addr >> 16) >> 16); | |
485 | pp->cmd_tbl_sg[i].addr = cpu_to_le32(addr & 0xffffffff); | 495 | ahci_sg->flags_size = cpu_to_le32(sg_len - 1); |
486 | pp->cmd_tbl_sg[i].addr_hi = cpu_to_le32((addr >> 16) >> 16); | 496 | ahci_sg++; |
487 | pp->cmd_tbl_sg[i].flags_size = cpu_to_le32(sg_len - 1); | ||
488 | } | 497 | } |
489 | } | 498 | } |
490 | 499 | ||
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index ff18fa7044c5..e1346cddd37f 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
@@ -2390,8 +2390,9 @@ static void ata_dev_init_params(struct ata_port *ap, struct ata_device *dev) | |||
2390 | static void ata_sg_clean(struct ata_queued_cmd *qc) | 2390 | static void ata_sg_clean(struct ata_queued_cmd *qc) |
2391 | { | 2391 | { |
2392 | struct ata_port *ap = qc->ap; | 2392 | struct ata_port *ap = qc->ap; |
2393 | struct scatterlist *sg = qc->sg; | 2393 | struct scatterlist *sg = qc->__sg; |
2394 | int dir = qc->dma_dir; | 2394 | int dir = qc->dma_dir; |
2395 | void *pad_buf = NULL; | ||
2395 | 2396 | ||
2396 | assert(qc->flags & ATA_QCFLAG_DMAMAP); | 2397 | assert(qc->flags & ATA_QCFLAG_DMAMAP); |
2397 | assert(sg != NULL); | 2398 | assert(sg != NULL); |
@@ -2401,14 +2402,35 @@ static void ata_sg_clean(struct ata_queued_cmd *qc) | |||
2401 | 2402 | ||
2402 | DPRINTK("unmapping %u sg elements\n", qc->n_elem); | 2403 | DPRINTK("unmapping %u sg elements\n", qc->n_elem); |
2403 | 2404 | ||
2404 | if (qc->flags & ATA_QCFLAG_SG) | 2405 | /* if we padded the buffer out to 32-bit bound, and data |
2406 | * xfer direction is from-device, we must copy from the | ||
2407 | * pad buffer back into the supplied buffer | ||
2408 | */ | ||
2409 | if (qc->pad_len && !(qc->tf.flags & ATA_TFLAG_WRITE)) | ||
2410 | pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ); | ||
2411 | |||
2412 | if (qc->flags & ATA_QCFLAG_SG) { | ||
2405 | dma_unmap_sg(ap->host_set->dev, sg, qc->n_elem, dir); | 2413 | dma_unmap_sg(ap->host_set->dev, sg, qc->n_elem, dir); |
2406 | else | 2414 | /* restore last sg */ |
2415 | sg[qc->orig_n_elem - 1].length += qc->pad_len; | ||
2416 | if (pad_buf) { | ||
2417 | struct scatterlist *psg = &qc->pad_sgent; | ||
2418 | void *addr = kmap_atomic(psg->page, KM_IRQ0); | ||
2419 | memcpy(addr + psg->offset, pad_buf, qc->pad_len); | ||
2420 | kunmap_atomic(psg->page, KM_IRQ0); | ||
2421 | } | ||
2422 | } else { | ||
2407 | dma_unmap_single(ap->host_set->dev, sg_dma_address(&sg[0]), | 2423 | dma_unmap_single(ap->host_set->dev, sg_dma_address(&sg[0]), |
2408 | sg_dma_len(&sg[0]), dir); | 2424 | sg_dma_len(&sg[0]), dir); |
2425 | /* restore sg */ | ||
2426 | sg->length += qc->pad_len; | ||
2427 | if (pad_buf) | ||
2428 | memcpy(qc->buf_virt + sg->length - qc->pad_len, | ||
2429 | pad_buf, qc->pad_len); | ||
2430 | } | ||
2409 | 2431 | ||
2410 | qc->flags &= ~ATA_QCFLAG_DMAMAP; | 2432 | qc->flags &= ~ATA_QCFLAG_DMAMAP; |
2411 | qc->sg = NULL; | 2433 | qc->__sg = NULL; |
2412 | } | 2434 | } |
2413 | 2435 | ||
2414 | /** | 2436 | /** |
@@ -2424,15 +2446,15 @@ static void ata_sg_clean(struct ata_queued_cmd *qc) | |||
2424 | */ | 2446 | */ |
2425 | static void ata_fill_sg(struct ata_queued_cmd *qc) | 2447 | static void ata_fill_sg(struct ata_queued_cmd *qc) |
2426 | { | 2448 | { |
2427 | struct scatterlist *sg = qc->sg; | ||
2428 | struct ata_port *ap = qc->ap; | 2449 | struct ata_port *ap = qc->ap; |
2429 | unsigned int idx, nelem; | 2450 | struct scatterlist *sg; |
2451 | unsigned int idx; | ||
2430 | 2452 | ||
2431 | assert(sg != NULL); | 2453 | assert(qc->__sg != NULL); |
2432 | assert(qc->n_elem > 0); | 2454 | assert(qc->n_elem > 0); |
2433 | 2455 | ||
2434 | idx = 0; | 2456 | idx = 0; |
2435 | for (nelem = qc->n_elem; nelem; nelem--,sg++) { | 2457 | ata_for_each_sg(sg, qc) { |
2436 | u32 addr, offset; | 2458 | u32 addr, offset; |
2437 | u32 sg_len, len; | 2459 | u32 sg_len, len; |
2438 | 2460 | ||
@@ -2518,12 +2540,18 @@ void ata_qc_prep(struct ata_queued_cmd *qc) | |||
2518 | 2540 | ||
2519 | void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen) | 2541 | void ata_sg_init_one(struct ata_queued_cmd *qc, void *buf, unsigned int buflen) |
2520 | { | 2542 | { |
2543 | struct scatterlist *sg; | ||
2544 | |||
2521 | qc->flags |= ATA_QCFLAG_SINGLE; | 2545 | qc->flags |= ATA_QCFLAG_SINGLE; |
2522 | 2546 | ||
2523 | qc->sg = &qc->sgent; | 2547 | memset(&qc->sgent, 0, sizeof(qc->sgent)); |
2548 | qc->__sg = &qc->sgent; | ||
2524 | qc->n_elem = 1; | 2549 | qc->n_elem = 1; |
2550 | qc->orig_n_elem = 1; | ||
2525 | qc->buf_virt = buf; | 2551 | qc->buf_virt = buf; |
2526 | sg_init_one(qc->sg, buf, buflen); | 2552 | |
2553 | sg = qc->__sg; | ||
2554 | sg_init_one(sg, buf, buflen); | ||
2527 | } | 2555 | } |
2528 | 2556 | ||
2529 | /** | 2557 | /** |
@@ -2544,8 +2572,9 @@ void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg, | |||
2544 | unsigned int n_elem) | 2572 | unsigned int n_elem) |
2545 | { | 2573 | { |
2546 | qc->flags |= ATA_QCFLAG_SG; | 2574 | qc->flags |= ATA_QCFLAG_SG; |
2547 | qc->sg = sg; | 2575 | qc->__sg = sg; |
2548 | qc->n_elem = n_elem; | 2576 | qc->n_elem = n_elem; |
2577 | qc->orig_n_elem = n_elem; | ||
2549 | } | 2578 | } |
2550 | 2579 | ||
2551 | /** | 2580 | /** |
@@ -2565,9 +2594,32 @@ static int ata_sg_setup_one(struct ata_queued_cmd *qc) | |||
2565 | { | 2594 | { |
2566 | struct ata_port *ap = qc->ap; | 2595 | struct ata_port *ap = qc->ap; |
2567 | int dir = qc->dma_dir; | 2596 | int dir = qc->dma_dir; |
2568 | struct scatterlist *sg = qc->sg; | 2597 | struct scatterlist *sg = qc->__sg; |
2569 | dma_addr_t dma_address; | 2598 | dma_addr_t dma_address; |
2570 | 2599 | ||
2600 | /* we must lengthen transfers to end on a 32-bit boundary */ | ||
2601 | qc->pad_len = sg->length & 3; | ||
2602 | if (qc->pad_len) { | ||
2603 | void *pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ); | ||
2604 | struct scatterlist *psg = &qc->pad_sgent; | ||
2605 | |||
2606 | assert(qc->dev->class == ATA_DEV_ATAPI); | ||
2607 | |||
2608 | memset(pad_buf, 0, ATA_DMA_PAD_SZ); | ||
2609 | |||
2610 | if (qc->tf.flags & ATA_TFLAG_WRITE) | ||
2611 | memcpy(pad_buf, qc->buf_virt + sg->length - qc->pad_len, | ||
2612 | qc->pad_len); | ||
2613 | |||
2614 | sg_dma_address(psg) = ap->pad_dma + (qc->tag * ATA_DMA_PAD_SZ); | ||
2615 | sg_dma_len(psg) = ATA_DMA_PAD_SZ; | ||
2616 | /* trim sg */ | ||
2617 | sg->length -= qc->pad_len; | ||
2618 | |||
2619 | DPRINTK("padding done, sg->length=%u pad_len=%u\n", | ||
2620 | sg->length, qc->pad_len); | ||
2621 | } | ||
2622 | |||
2571 | dma_address = dma_map_single(ap->host_set->dev, qc->buf_virt, | 2623 | dma_address = dma_map_single(ap->host_set->dev, qc->buf_virt, |
2572 | sg->length, dir); | 2624 | sg->length, dir); |
2573 | if (dma_mapping_error(dma_address)) | 2625 | if (dma_mapping_error(dma_address)) |
@@ -2599,12 +2651,47 @@ static int ata_sg_setup_one(struct ata_queued_cmd *qc) | |||
2599 | static int ata_sg_setup(struct ata_queued_cmd *qc) | 2651 | static int ata_sg_setup(struct ata_queued_cmd *qc) |
2600 | { | 2652 | { |
2601 | struct ata_port *ap = qc->ap; | 2653 | struct ata_port *ap = qc->ap; |
2602 | struct scatterlist *sg = qc->sg; | 2654 | struct scatterlist *sg = qc->__sg; |
2655 | struct scatterlist *lsg = &sg[qc->n_elem - 1]; | ||
2603 | int n_elem, dir; | 2656 | int n_elem, dir; |
2604 | 2657 | ||
2605 | VPRINTK("ENTER, ata%u\n", ap->id); | 2658 | VPRINTK("ENTER, ata%u\n", ap->id); |
2606 | assert(qc->flags & ATA_QCFLAG_SG); | 2659 | assert(qc->flags & ATA_QCFLAG_SG); |
2607 | 2660 | ||
2661 | /* we must lengthen transfers to end on a 32-bit boundary */ | ||
2662 | qc->pad_len = lsg->length & 3; | ||
2663 | if (qc->pad_len) { | ||
2664 | void *pad_buf = ap->pad + (qc->tag * ATA_DMA_PAD_SZ); | ||
2665 | struct scatterlist *psg = &qc->pad_sgent; | ||
2666 | unsigned int offset; | ||
2667 | |||
2668 | assert(qc->dev->class == ATA_DEV_ATAPI); | ||
2669 | |||
2670 | memset(pad_buf, 0, ATA_DMA_PAD_SZ); | ||
2671 | |||
2672 | /* | ||
2673 | * psg->page/offset are used to copy to-be-written | ||
2674 | * data in this function or read data in ata_sg_clean. | ||
2675 | */ | ||
2676 | offset = lsg->offset + lsg->length - qc->pad_len; | ||
2677 | psg->page = nth_page(lsg->page, offset >> PAGE_SHIFT); | ||
2678 | psg->offset = offset_in_page(offset); | ||
2679 | |||
2680 | if (qc->tf.flags & ATA_TFLAG_WRITE) { | ||
2681 | void *addr = kmap_atomic(psg->page, KM_IRQ0); | ||
2682 | memcpy(pad_buf, addr + psg->offset, qc->pad_len); | ||
2683 | kunmap_atomic(psg->page, KM_IRQ0); | ||
2684 | } | ||
2685 | |||
2686 | sg_dma_address(psg) = ap->pad_dma + (qc->tag * ATA_DMA_PAD_SZ); | ||
2687 | sg_dma_len(psg) = ATA_DMA_PAD_SZ; | ||
2688 | /* trim last sg */ | ||
2689 | lsg->length -= qc->pad_len; | ||
2690 | |||
2691 | DPRINTK("padding done, sg[%d].length=%u pad_len=%u\n", | ||
2692 | qc->n_elem - 1, lsg->length, qc->pad_len); | ||
2693 | } | ||
2694 | |||
2608 | dir = qc->dma_dir; | 2695 | dir = qc->dma_dir; |
2609 | n_elem = dma_map_sg(ap->host_set->dev, sg, qc->n_elem, dir); | 2696 | n_elem = dma_map_sg(ap->host_set->dev, sg, qc->n_elem, dir); |
2610 | if (n_elem < 1) | 2697 | if (n_elem < 1) |
@@ -2880,7 +2967,7 @@ static void ata_data_xfer(struct ata_port *ap, unsigned char *buf, | |||
2880 | static void ata_pio_sector(struct ata_queued_cmd *qc) | 2967 | static void ata_pio_sector(struct ata_queued_cmd *qc) |
2881 | { | 2968 | { |
2882 | int do_write = (qc->tf.flags & ATA_TFLAG_WRITE); | 2969 | int do_write = (qc->tf.flags & ATA_TFLAG_WRITE); |
2883 | struct scatterlist *sg = qc->sg; | 2970 | struct scatterlist *sg = qc->__sg; |
2884 | struct ata_port *ap = qc->ap; | 2971 | struct ata_port *ap = qc->ap; |
2885 | struct page *page; | 2972 | struct page *page; |
2886 | unsigned int offset; | 2973 | unsigned int offset; |
@@ -2930,7 +3017,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc) | |||
2930 | static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes) | 3017 | static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes) |
2931 | { | 3018 | { |
2932 | int do_write = (qc->tf.flags & ATA_TFLAG_WRITE); | 3019 | int do_write = (qc->tf.flags & ATA_TFLAG_WRITE); |
2933 | struct scatterlist *sg = qc->sg; | 3020 | struct scatterlist *sg = qc->__sg; |
2934 | struct ata_port *ap = qc->ap; | 3021 | struct ata_port *ap = qc->ap; |
2935 | struct page *page; | 3022 | struct page *page; |
2936 | unsigned char *buf; | 3023 | unsigned char *buf; |
@@ -2963,7 +3050,7 @@ next_sg: | |||
2963 | return; | 3050 | return; |
2964 | } | 3051 | } |
2965 | 3052 | ||
2966 | sg = &qc->sg[qc->cursg]; | 3053 | sg = &qc->__sg[qc->cursg]; |
2967 | 3054 | ||
2968 | page = sg->page; | 3055 | page = sg->page; |
2969 | offset = sg->offset + qc->cursg_ofs; | 3056 | offset = sg->offset + qc->cursg_ofs; |
@@ -3320,7 +3407,7 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap, | |||
3320 | 3407 | ||
3321 | qc = ata_qc_new(ap); | 3408 | qc = ata_qc_new(ap); |
3322 | if (qc) { | 3409 | if (qc) { |
3323 | qc->sg = NULL; | 3410 | qc->__sg = NULL; |
3324 | qc->flags = 0; | 3411 | qc->flags = 0; |
3325 | qc->scsicmd = NULL; | 3412 | qc->scsicmd = NULL; |
3326 | qc->ap = ap; | 3413 | qc->ap = ap; |
@@ -4004,11 +4091,18 @@ err_out: | |||
4004 | int ata_port_start (struct ata_port *ap) | 4091 | int ata_port_start (struct ata_port *ap) |
4005 | { | 4092 | { |
4006 | struct device *dev = ap->host_set->dev; | 4093 | struct device *dev = ap->host_set->dev; |
4094 | int rc; | ||
4007 | 4095 | ||
4008 | ap->prd = dma_alloc_coherent(dev, ATA_PRD_TBL_SZ, &ap->prd_dma, GFP_KERNEL); | 4096 | ap->prd = dma_alloc_coherent(dev, ATA_PRD_TBL_SZ, &ap->prd_dma, GFP_KERNEL); |
4009 | if (!ap->prd) | 4097 | if (!ap->prd) |
4010 | return -ENOMEM; | 4098 | return -ENOMEM; |
4011 | 4099 | ||
4100 | rc = ata_pad_alloc(ap, dev); | ||
4101 | if (rc) { | ||
4102 | dma_free_coherent(dev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma); | ||
4103 | return rc; | ||
4104 | } | ||
4105 | |||
4012 | DPRINTK("prd alloc, virt %p, dma %llx\n", ap->prd, (unsigned long long) ap->prd_dma); | 4106 | DPRINTK("prd alloc, virt %p, dma %llx\n", ap->prd, (unsigned long long) ap->prd_dma); |
4013 | 4107 | ||
4014 | return 0; | 4108 | return 0; |
@@ -4032,6 +4126,7 @@ void ata_port_stop (struct ata_port *ap) | |||
4032 | struct device *dev = ap->host_set->dev; | 4126 | struct device *dev = ap->host_set->dev; |
4033 | 4127 | ||
4034 | dma_free_coherent(dev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma); | 4128 | dma_free_coherent(dev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma); |
4129 | ata_pad_free(ap, dev); | ||
4035 | } | 4130 | } |
4036 | 4131 | ||
4037 | void ata_host_stop (struct ata_host_set *host_set) | 4132 | void ata_host_stop (struct ata_host_set *host_set) |
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index 248baae96486..eb604b0a8990 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c | |||
@@ -355,10 +355,10 @@ struct ata_queued_cmd *ata_scsi_qc_new(struct ata_port *ap, | |||
355 | qc->scsidone = done; | 355 | qc->scsidone = done; |
356 | 356 | ||
357 | if (cmd->use_sg) { | 357 | if (cmd->use_sg) { |
358 | qc->sg = (struct scatterlist *) cmd->request_buffer; | 358 | qc->__sg = (struct scatterlist *) cmd->request_buffer; |
359 | qc->n_elem = cmd->use_sg; | 359 | qc->n_elem = cmd->use_sg; |
360 | } else { | 360 | } else { |
361 | qc->sg = &qc->sgent; | 361 | qc->__sg = &qc->sgent; |
362 | qc->n_elem = 1; | 362 | qc->n_elem = 1; |
363 | } | 363 | } |
364 | } else { | 364 | } else { |
@@ -702,6 +702,16 @@ int ata_scsi_slave_config(struct scsi_device *sdev) | |||
702 | */ | 702 | */ |
703 | blk_queue_max_sectors(sdev->request_queue, 2048); | 703 | blk_queue_max_sectors(sdev->request_queue, 2048); |
704 | } | 704 | } |
705 | |||
706 | /* | ||
707 | * SATA DMA transfers must be multiples of 4 byte, so | ||
708 | * we need to pad ATAPI transfers using an extra sg. | ||
709 | * Decrement max hw segments accordingly. | ||
710 | */ | ||
711 | if (dev->class == ATA_DEV_ATAPI) { | ||
712 | request_queue_t *q = sdev->request_queue; | ||
713 | blk_queue_max_hw_segments(q, q->max_hw_segments - 1); | ||
714 | } | ||
705 | } | 715 | } |
706 | 716 | ||
707 | return 0; /* scsi layer doesn't check return value, sigh */ | 717 | return 0; /* scsi layer doesn't check return value, sigh */ |
diff --git a/drivers/scsi/pdc_adma.c b/drivers/scsi/pdc_adma.c index 665017eda8a6..a50588c60fab 100644 --- a/drivers/scsi/pdc_adma.c +++ b/drivers/scsi/pdc_adma.c | |||
@@ -293,14 +293,14 @@ static void adma_eng_timeout(struct ata_port *ap) | |||
293 | 293 | ||
294 | static int adma_fill_sg(struct ata_queued_cmd *qc) | 294 | static int adma_fill_sg(struct ata_queued_cmd *qc) |
295 | { | 295 | { |
296 | struct scatterlist *sg = qc->sg; | 296 | struct scatterlist *sg; |
297 | struct ata_port *ap = qc->ap; | 297 | struct ata_port *ap = qc->ap; |
298 | struct adma_port_priv *pp = ap->private_data; | 298 | struct adma_port_priv *pp = ap->private_data; |
299 | u8 *buf = pp->pkt; | 299 | u8 *buf = pp->pkt; |
300 | int nelem, i = (2 + buf[3]) * 8; | 300 | int i = (2 + buf[3]) * 8; |
301 | u8 pFLAGS = pORD | ((qc->tf.flags & ATA_TFLAG_WRITE) ? pDIRO : 0); | 301 | u8 pFLAGS = pORD | ((qc->tf.flags & ATA_TFLAG_WRITE) ? pDIRO : 0); |
302 | 302 | ||
303 | for (nelem = 0; nelem < qc->n_elem; nelem++,sg++) { | 303 | ata_for_each_sg(sg, qc) { |
304 | u32 addr; | 304 | u32 addr; |
305 | u32 len; | 305 | u32 len; |
306 | 306 | ||
@@ -312,7 +312,7 @@ static int adma_fill_sg(struct ata_queued_cmd *qc) | |||
312 | *(__le32 *)(buf + i) = cpu_to_le32(len); | 312 | *(__le32 *)(buf + i) = cpu_to_le32(len); |
313 | i += 4; | 313 | i += 4; |
314 | 314 | ||
315 | if ((nelem + 1) == qc->n_elem) | 315 | if (ata_sg_is_last(sg, qc)) |
316 | pFLAGS |= pEND; | 316 | pFLAGS |= pEND; |
317 | buf[i++] = pFLAGS; | 317 | buf[i++] = pFLAGS; |
318 | buf[i++] = qc->dev->dma_mode & 0xf; | 318 | buf[i++] = qc->dev->dma_mode & 0xf; |
diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c index 46dbdee79f77..0f469e3dabe2 100644 --- a/drivers/scsi/sata_mv.c +++ b/drivers/scsi/sata_mv.c | |||
@@ -670,6 +670,11 @@ static void mv_host_stop(struct ata_host_set *host_set) | |||
670 | ata_host_stop(host_set); | 670 | ata_host_stop(host_set); |
671 | } | 671 | } |
672 | 672 | ||
673 | static inline void mv_priv_free(struct mv_port_priv *pp, struct device *dev) | ||
674 | { | ||
675 | dma_free_coherent(dev, MV_PORT_PRIV_DMA_SZ, pp->crpb, pp->crpb_dma); | ||
676 | } | ||
677 | |||
673 | /** | 678 | /** |
674 | * mv_port_start - Port specific init/start routine. | 679 | * mv_port_start - Port specific init/start routine. |
675 | * @ap: ATA channel to manipulate | 680 | * @ap: ATA channel to manipulate |
@@ -687,21 +692,23 @@ static int mv_port_start(struct ata_port *ap) | |||
687 | void __iomem *port_mmio = mv_ap_base(ap); | 692 | void __iomem *port_mmio = mv_ap_base(ap); |
688 | void *mem; | 693 | void *mem; |
689 | dma_addr_t mem_dma; | 694 | dma_addr_t mem_dma; |
695 | int rc = -ENOMEM; | ||
690 | 696 | ||
691 | pp = kmalloc(sizeof(*pp), GFP_KERNEL); | 697 | pp = kmalloc(sizeof(*pp), GFP_KERNEL); |
692 | if (!pp) { | 698 | if (!pp) |
693 | return -ENOMEM; | 699 | goto err_out; |
694 | } | ||
695 | memset(pp, 0, sizeof(*pp)); | 700 | memset(pp, 0, sizeof(*pp)); |
696 | 701 | ||
697 | mem = dma_alloc_coherent(dev, MV_PORT_PRIV_DMA_SZ, &mem_dma, | 702 | mem = dma_alloc_coherent(dev, MV_PORT_PRIV_DMA_SZ, &mem_dma, |
698 | GFP_KERNEL); | 703 | GFP_KERNEL); |
699 | if (!mem) { | 704 | if (!mem) |
700 | kfree(pp); | 705 | goto err_out_pp; |
701 | return -ENOMEM; | ||
702 | } | ||
703 | memset(mem, 0, MV_PORT_PRIV_DMA_SZ); | 706 | memset(mem, 0, MV_PORT_PRIV_DMA_SZ); |
704 | 707 | ||
708 | rc = ata_pad_alloc(ap, dev); | ||
709 | if (rc) | ||
710 | goto err_out_priv; | ||
711 | |||
705 | /* First item in chunk of DMA memory: | 712 | /* First item in chunk of DMA memory: |
706 | * 32-slot command request table (CRQB), 32 bytes each in size | 713 | * 32-slot command request table (CRQB), 32 bytes each in size |
707 | */ | 714 | */ |
@@ -746,6 +753,13 @@ static int mv_port_start(struct ata_port *ap) | |||
746 | */ | 753 | */ |
747 | ap->private_data = pp; | 754 | ap->private_data = pp; |
748 | return 0; | 755 | return 0; |
756 | |||
757 | err_out_priv: | ||
758 | mv_priv_free(pp, dev); | ||
759 | err_out_pp: | ||
760 | kfree(pp); | ||
761 | err_out: | ||
762 | return rc; | ||
749 | } | 763 | } |
750 | 764 | ||
751 | /** | 765 | /** |
@@ -768,7 +782,8 @@ static void mv_port_stop(struct ata_port *ap) | |||
768 | spin_unlock_irqrestore(&ap->host_set->lock, flags); | 782 | spin_unlock_irqrestore(&ap->host_set->lock, flags); |
769 | 783 | ||
770 | ap->private_data = NULL; | 784 | ap->private_data = NULL; |
771 | dma_free_coherent(dev, MV_PORT_PRIV_DMA_SZ, pp->crpb, pp->crpb_dma); | 785 | ata_pad_free(ap, dev); |
786 | mv_priv_free(pp, dev); | ||
772 | kfree(pp); | 787 | kfree(pp); |
773 | } | 788 | } |
774 | 789 | ||
@@ -784,23 +799,24 @@ static void mv_port_stop(struct ata_port *ap) | |||
784 | static void mv_fill_sg(struct ata_queued_cmd *qc) | 799 | static void mv_fill_sg(struct ata_queued_cmd *qc) |
785 | { | 800 | { |
786 | struct mv_port_priv *pp = qc->ap->private_data; | 801 | struct mv_port_priv *pp = qc->ap->private_data; |
787 | unsigned int i; | 802 | unsigned int i = 0; |
803 | struct scatterlist *sg; | ||
788 | 804 | ||
789 | for (i = 0; i < qc->n_elem; i++) { | 805 | ata_for_each_sg(sg, qc) { |
790 | u32 sg_len; | 806 | u32 sg_len; |
791 | dma_addr_t addr; | 807 | dma_addr_t addr; |
792 | 808 | ||
793 | addr = sg_dma_address(&qc->sg[i]); | 809 | addr = sg_dma_address(sg); |
794 | sg_len = sg_dma_len(&qc->sg[i]); | 810 | sg_len = sg_dma_len(sg); |
795 | 811 | ||
796 | pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff); | 812 | pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff); |
797 | pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16); | 813 | pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16); |
798 | assert(0 == (sg_len & ~MV_DMA_BOUNDARY)); | 814 | assert(0 == (sg_len & ~MV_DMA_BOUNDARY)); |
799 | pp->sg_tbl[i].flags_size = cpu_to_le32(sg_len); | 815 | pp->sg_tbl[i].flags_size = cpu_to_le32(sg_len); |
800 | } | 816 | if (ata_sg_is_last(sg, qc)) |
801 | if (0 < qc->n_elem) { | 817 | pp->sg_tbl[i].flags_size |= cpu_to_le32(EPRD_FLAG_END_OF_TBL); |
802 | pp->sg_tbl[qc->n_elem - 1].flags_size |= | 818 | |
803 | cpu_to_le32(EPRD_FLAG_END_OF_TBL); | 819 | i++; |
804 | } | 820 | } |
805 | } | 821 | } |
806 | 822 | ||
diff --git a/drivers/scsi/sata_qstor.c b/drivers/scsi/sata_qstor.c index 9938dae782b6..65502c157a54 100644 --- a/drivers/scsi/sata_qstor.c +++ b/drivers/scsi/sata_qstor.c | |||
@@ -271,16 +271,17 @@ static void qs_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) | |||
271 | 271 | ||
272 | static void qs_fill_sg(struct ata_queued_cmd *qc) | 272 | static void qs_fill_sg(struct ata_queued_cmd *qc) |
273 | { | 273 | { |
274 | struct scatterlist *sg = qc->sg; | 274 | struct scatterlist *sg; |
275 | struct ata_port *ap = qc->ap; | 275 | struct ata_port *ap = qc->ap; |
276 | struct qs_port_priv *pp = ap->private_data; | 276 | struct qs_port_priv *pp = ap->private_data; |
277 | unsigned int nelem; | 277 | unsigned int nelem; |
278 | u8 *prd = pp->pkt + QS_CPB_BYTES; | 278 | u8 *prd = pp->pkt + QS_CPB_BYTES; |
279 | 279 | ||
280 | assert(sg != NULL); | 280 | assert(qc->__sg != NULL); |
281 | assert(qc->n_elem > 0); | 281 | assert(qc->n_elem > 0); |
282 | 282 | ||
283 | for (nelem = 0; nelem < qc->n_elem; nelem++,sg++) { | 283 | nelem = 0; |
284 | ata_for_each_sg(sg, qc) { | ||
284 | u64 addr; | 285 | u64 addr; |
285 | u32 len; | 286 | u32 len; |
286 | 287 | ||
@@ -294,6 +295,7 @@ static void qs_fill_sg(struct ata_queued_cmd *qc) | |||
294 | 295 | ||
295 | VPRINTK("PRD[%u] = (0x%llX, 0x%X)\n", nelem, | 296 | VPRINTK("PRD[%u] = (0x%llX, 0x%X)\n", nelem, |
296 | (unsigned long long)addr, len); | 297 | (unsigned long long)addr, len); |
298 | nelem++; | ||
297 | } | 299 | } |
298 | } | 300 | } |
299 | 301 | ||
diff --git a/drivers/scsi/sata_sil24.c b/drivers/scsi/sata_sil24.c index c66548025657..e6c8e89c226f 100644 --- a/drivers/scsi/sata_sil24.c +++ b/drivers/scsi/sata_sil24.c | |||
@@ -411,15 +411,20 @@ static void sil24_phy_reset(struct ata_port *ap) | |||
411 | static inline void sil24_fill_sg(struct ata_queued_cmd *qc, | 411 | static inline void sil24_fill_sg(struct ata_queued_cmd *qc, |
412 | struct sil24_cmd_block *cb) | 412 | struct sil24_cmd_block *cb) |
413 | { | 413 | { |
414 | struct scatterlist *sg = qc->sg; | ||
415 | struct sil24_sge *sge = cb->sge; | 414 | struct sil24_sge *sge = cb->sge; |
416 | unsigned i; | 415 | struct scatterlist *sg; |
416 | unsigned int idx = 0; | ||
417 | 417 | ||
418 | for (i = 0; i < qc->n_elem; i++, sg++, sge++) { | 418 | ata_for_each_sg(sg, qc) { |
419 | sge->addr = cpu_to_le64(sg_dma_address(sg)); | 419 | sge->addr = cpu_to_le64(sg_dma_address(sg)); |
420 | sge->cnt = cpu_to_le32(sg_dma_len(sg)); | 420 | sge->cnt = cpu_to_le32(sg_dma_len(sg)); |
421 | sge->flags = 0; | 421 | if (ata_sg_is_last(sg, qc)) |
422 | sge->flags = i < qc->n_elem - 1 ? 0 : cpu_to_le32(SGE_TRM); | 422 | sge->flags = cpu_to_le32(SGE_TRM); |
423 | else | ||
424 | sge->flags = 0; | ||
425 | |||
426 | sge++; | ||
427 | idx++; | ||
423 | } | 428 | } |
424 | } | 429 | } |
425 | 430 | ||
@@ -630,6 +635,13 @@ static irqreturn_t sil24_interrupt(int irq, void *dev_instance, struct pt_regs * | |||
630 | return IRQ_RETVAL(handled); | 635 | return IRQ_RETVAL(handled); |
631 | } | 636 | } |
632 | 637 | ||
638 | static inline void sil24_cblk_free(struct sil24_port_priv *pp, struct device *dev) | ||
639 | { | ||
640 | const size_t cb_size = sizeof(*pp->cmd_block); | ||
641 | |||
642 | dma_free_coherent(dev, cb_size, pp->cmd_block, pp->cmd_block_dma); | ||
643 | } | ||
644 | |||
633 | static int sil24_port_start(struct ata_port *ap) | 645 | static int sil24_port_start(struct ata_port *ap) |
634 | { | 646 | { |
635 | struct device *dev = ap->host_set->dev; | 647 | struct device *dev = ap->host_set->dev; |
@@ -637,36 +649,44 @@ static int sil24_port_start(struct ata_port *ap) | |||
637 | struct sil24_cmd_block *cb; | 649 | struct sil24_cmd_block *cb; |
638 | size_t cb_size = sizeof(*cb); | 650 | size_t cb_size = sizeof(*cb); |
639 | dma_addr_t cb_dma; | 651 | dma_addr_t cb_dma; |
652 | int rc = -ENOMEM; | ||
640 | 653 | ||
641 | pp = kmalloc(sizeof(*pp), GFP_KERNEL); | 654 | pp = kzalloc(sizeof(*pp), GFP_KERNEL); |
642 | if (!pp) | 655 | if (!pp) |
643 | return -ENOMEM; | 656 | goto err_out; |
644 | memset(pp, 0, sizeof(*pp)); | ||
645 | 657 | ||
646 | pp->tf.command = ATA_DRDY; | 658 | pp->tf.command = ATA_DRDY; |
647 | 659 | ||
648 | cb = dma_alloc_coherent(dev, cb_size, &cb_dma, GFP_KERNEL); | 660 | cb = dma_alloc_coherent(dev, cb_size, &cb_dma, GFP_KERNEL); |
649 | if (!cb) { | 661 | if (!cb) |
650 | kfree(pp); | 662 | goto err_out_pp; |
651 | return -ENOMEM; | ||
652 | } | ||
653 | memset(cb, 0, cb_size); | 663 | memset(cb, 0, cb_size); |
654 | 664 | ||
665 | rc = ata_pad_alloc(ap, dev); | ||
666 | if (rc) | ||
667 | goto err_out_pad; | ||
668 | |||
655 | pp->cmd_block = cb; | 669 | pp->cmd_block = cb; |
656 | pp->cmd_block_dma = cb_dma; | 670 | pp->cmd_block_dma = cb_dma; |
657 | 671 | ||
658 | ap->private_data = pp; | 672 | ap->private_data = pp; |
659 | 673 | ||
660 | return 0; | 674 | return 0; |
675 | |||
676 | err_out_pad: | ||
677 | sil24_cblk_free(pp, dev); | ||
678 | err_out_pp: | ||
679 | kfree(pp); | ||
680 | err_out: | ||
681 | return rc; | ||
661 | } | 682 | } |
662 | 683 | ||
663 | static void sil24_port_stop(struct ata_port *ap) | 684 | static void sil24_port_stop(struct ata_port *ap) |
664 | { | 685 | { |
665 | struct device *dev = ap->host_set->dev; | 686 | struct device *dev = ap->host_set->dev; |
666 | struct sil24_port_priv *pp = ap->private_data; | 687 | struct sil24_port_priv *pp = ap->private_data; |
667 | size_t cb_size = sizeof(*pp->cmd_block); | ||
668 | 688 | ||
669 | dma_free_coherent(dev, cb_size, pp->cmd_block, pp->cmd_block_dma); | 689 | sil24_cblk_free(pp, dev); |
670 | kfree(pp); | 690 | kfree(pp); |
671 | } | 691 | } |
672 | 692 | ||
diff --git a/drivers/scsi/sata_sx4.c b/drivers/scsi/sata_sx4.c index 0ec21e09f5d8..f859bbd681ed 100644 --- a/drivers/scsi/sata_sx4.c +++ b/drivers/scsi/sata_sx4.c | |||
@@ -450,14 +450,14 @@ static inline void pdc20621_host_pkt(struct ata_taskfile *tf, u8 *buf, | |||
450 | 450 | ||
451 | static void pdc20621_dma_prep(struct ata_queued_cmd *qc) | 451 | static void pdc20621_dma_prep(struct ata_queued_cmd *qc) |
452 | { | 452 | { |
453 | struct scatterlist *sg = qc->sg; | 453 | struct scatterlist *sg; |
454 | struct ata_port *ap = qc->ap; | 454 | struct ata_port *ap = qc->ap; |
455 | struct pdc_port_priv *pp = ap->private_data; | 455 | struct pdc_port_priv *pp = ap->private_data; |
456 | void __iomem *mmio = ap->host_set->mmio_base; | 456 | void __iomem *mmio = ap->host_set->mmio_base; |
457 | struct pdc_host_priv *hpriv = ap->host_set->private_data; | 457 | struct pdc_host_priv *hpriv = ap->host_set->private_data; |
458 | void __iomem *dimm_mmio = hpriv->dimm_mmio; | 458 | void __iomem *dimm_mmio = hpriv->dimm_mmio; |
459 | unsigned int portno = ap->port_no; | 459 | unsigned int portno = ap->port_no; |
460 | unsigned int i, last, idx, total_len = 0, sgt_len; | 460 | unsigned int i, idx, total_len = 0, sgt_len; |
461 | u32 *buf = (u32 *) &pp->dimm_buf[PDC_DIMM_HEADER_SZ]; | 461 | u32 *buf = (u32 *) &pp->dimm_buf[PDC_DIMM_HEADER_SZ]; |
462 | 462 | ||
463 | assert(qc->flags & ATA_QCFLAG_DMAMAP); | 463 | assert(qc->flags & ATA_QCFLAG_DMAMAP); |
@@ -470,12 +470,11 @@ static void pdc20621_dma_prep(struct ata_queued_cmd *qc) | |||
470 | /* | 470 | /* |
471 | * Build S/G table | 471 | * Build S/G table |
472 | */ | 472 | */ |
473 | last = qc->n_elem; | ||
474 | idx = 0; | 473 | idx = 0; |
475 | for (i = 0; i < last; i++) { | 474 | ata_for_each_sg(sg, qc) { |
476 | buf[idx++] = cpu_to_le32(sg_dma_address(&sg[i])); | 475 | buf[idx++] = cpu_to_le32(sg_dma_address(sg)); |
477 | buf[idx++] = cpu_to_le32(sg_dma_len(&sg[i])); | 476 | buf[idx++] = cpu_to_le32(sg_dma_len(sg)); |
478 | total_len += sg_dma_len(&sg[i]); | 477 | total_len += sg_dma_len(sg); |
479 | } | 478 | } |
480 | buf[idx - 1] |= cpu_to_le32(ATA_PRD_EOT); | 479 | buf[idx - 1] |= cpu_to_le32(ATA_PRD_EOT); |
481 | sgt_len = idx * 4; | 480 | sgt_len = idx * 4; |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 0ba3af7a1236..dcd17e7458ab 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -155,6 +155,10 @@ enum { | |||
155 | ATA_SHIFT_UDMA = 0, | 155 | ATA_SHIFT_UDMA = 0, |
156 | ATA_SHIFT_MWDMA = 8, | 156 | ATA_SHIFT_MWDMA = 8, |
157 | ATA_SHIFT_PIO = 11, | 157 | ATA_SHIFT_PIO = 11, |
158 | |||
159 | /* size of buffer to pad xfers ending on unaligned boundaries */ | ||
160 | ATA_DMA_PAD_SZ = 4, | ||
161 | ATA_DMA_PAD_BUF_SZ = ATA_DMA_PAD_SZ * ATA_MAX_QUEUE, | ||
158 | 162 | ||
159 | /* Masks for port functions */ | 163 | /* Masks for port functions */ |
160 | ATA_PORT_PRIMARY = (1 << 0), | 164 | ATA_PORT_PRIMARY = (1 << 0), |
@@ -249,9 +253,12 @@ struct ata_queued_cmd { | |||
249 | unsigned long flags; /* ATA_QCFLAG_xxx */ | 253 | unsigned long flags; /* ATA_QCFLAG_xxx */ |
250 | unsigned int tag; | 254 | unsigned int tag; |
251 | unsigned int n_elem; | 255 | unsigned int n_elem; |
256 | unsigned int orig_n_elem; | ||
252 | 257 | ||
253 | int dma_dir; | 258 | int dma_dir; |
254 | 259 | ||
260 | unsigned int pad_len; | ||
261 | |||
255 | unsigned int nsect; | 262 | unsigned int nsect; |
256 | unsigned int cursect; | 263 | unsigned int cursect; |
257 | 264 | ||
@@ -262,9 +269,11 @@ struct ata_queued_cmd { | |||
262 | unsigned int cursg_ofs; | 269 | unsigned int cursg_ofs; |
263 | 270 | ||
264 | struct scatterlist sgent; | 271 | struct scatterlist sgent; |
272 | struct scatterlist pad_sgent; | ||
265 | void *buf_virt; | 273 | void *buf_virt; |
266 | 274 | ||
267 | struct scatterlist *sg; | 275 | /* DO NOT iterate over __sg manually, use ata_for_each_sg() */ |
276 | struct scatterlist *__sg; | ||
268 | 277 | ||
269 | ata_qc_cb_t complete_fn; | 278 | ata_qc_cb_t complete_fn; |
270 | 279 | ||
@@ -310,6 +319,9 @@ struct ata_port { | |||
310 | struct ata_prd *prd; /* our SG list */ | 319 | struct ata_prd *prd; /* our SG list */ |
311 | dma_addr_t prd_dma; /* and its DMA mapping */ | 320 | dma_addr_t prd_dma; /* and its DMA mapping */ |
312 | 321 | ||
322 | void *pad; /* array of DMA pad buffers */ | ||
323 | dma_addr_t pad_dma; | ||
324 | |||
313 | struct ata_ioports ioaddr; /* ATA cmd/ctl/dma register blocks */ | 325 | struct ata_ioports ioaddr; /* ATA cmd/ctl/dma register blocks */ |
314 | 326 | ||
315 | u8 ctl; /* cache of ATA control register */ | 327 | u8 ctl; /* cache of ATA control register */ |
@@ -512,6 +524,31 @@ extern int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bit | |||
512 | #endif /* CONFIG_PCI */ | 524 | #endif /* CONFIG_PCI */ |
513 | 525 | ||
514 | 526 | ||
527 | static inline int | ||
528 | ata_sg_is_last(struct scatterlist *sg, struct ata_queued_cmd *qc) | ||
529 | { | ||
530 | if (sg == &qc->pad_sgent) | ||
531 | return 1; | ||
532 | if (qc->pad_len) | ||
533 | return 0; | ||
534 | if (((sg - qc->__sg) + 1) == qc->n_elem) | ||
535 | return 1; | ||
536 | return 0; | ||
537 | } | ||
538 | |||
539 | static inline struct scatterlist * | ||
540 | ata_qc_next_sg(struct scatterlist *sg, struct ata_queued_cmd *qc) | ||
541 | { | ||
542 | if (sg == &qc->pad_sgent) | ||
543 | return NULL; | ||
544 | if (++sg - qc->__sg < qc->n_elem) | ||
545 | return sg; | ||
546 | return qc->pad_len ? &qc->pad_sgent : NULL; | ||
547 | } | ||
548 | |||
549 | #define ata_for_each_sg(sg, qc) \ | ||
550 | for (sg = qc->__sg; sg; sg = ata_qc_next_sg(sg, qc)) | ||
551 | |||
515 | static inline unsigned int ata_tag_valid(unsigned int tag) | 552 | static inline unsigned int ata_tag_valid(unsigned int tag) |
516 | { | 553 | { |
517 | return (tag < ATA_MAX_QUEUE) ? 1 : 0; | 554 | return (tag < ATA_MAX_QUEUE) ? 1 : 0; |
@@ -740,4 +777,17 @@ static inline unsigned int __ac_err_mask(u8 status) | |||
740 | return mask; | 777 | return mask; |
741 | } | 778 | } |
742 | 779 | ||
780 | static inline int ata_pad_alloc(struct ata_port *ap, struct device *dev) | ||
781 | { | ||
782 | ap->pad_dma = 0; | ||
783 | ap->pad = dma_alloc_coherent(dev, ATA_DMA_PAD_BUF_SZ, | ||
784 | &ap->pad_dma, GFP_KERNEL); | ||
785 | return (ap->pad == NULL) ? -ENOMEM : 0; | ||
786 | } | ||
787 | |||
788 | static inline void ata_pad_free(struct ata_port *ap, struct device *dev) | ||
789 | { | ||
790 | dma_free_coherent(dev, ATA_DMA_PAD_BUF_SZ, ap->pad, ap->pad_dma); | ||
791 | } | ||
792 | |||
743 | #endif /* __LINUX_LIBATA_H__ */ | 793 | #endif /* __LINUX_LIBATA_H__ */ |