diff options
Diffstat (limited to 'drivers/ata/libata-sff.c')
-rw-r--r-- | drivers/ata/libata-sff.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 051b6158d1b7..4441b5c5e4fb 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -542,7 +542,7 @@ static inline void ata_tf_to_host(struct ata_port *ap, | |||
542 | 542 | ||
543 | /** | 543 | /** |
544 | * ata_sff_data_xfer - Transfer data by PIO | 544 | * ata_sff_data_xfer - Transfer data by PIO |
545 | * @dev: device to target | 545 | * @qc: queued command |
546 | * @buf: data buffer | 546 | * @buf: data buffer |
547 | * @buflen: buffer length | 547 | * @buflen: buffer length |
548 | * @rw: read/write | 548 | * @rw: read/write |
@@ -555,10 +555,10 @@ static inline void ata_tf_to_host(struct ata_port *ap, | |||
555 | * RETURNS: | 555 | * RETURNS: |
556 | * Bytes consumed. | 556 | * Bytes consumed. |
557 | */ | 557 | */ |
558 | unsigned int ata_sff_data_xfer(struct ata_device *dev, unsigned char *buf, | 558 | unsigned int ata_sff_data_xfer(struct ata_queued_cmd *qc, unsigned char *buf, |
559 | unsigned int buflen, int rw) | 559 | unsigned int buflen, int rw) |
560 | { | 560 | { |
561 | struct ata_port *ap = dev->link->ap; | 561 | struct ata_port *ap = qc->dev->link->ap; |
562 | void __iomem *data_addr = ap->ioaddr.data_addr; | 562 | void __iomem *data_addr = ap->ioaddr.data_addr; |
563 | unsigned int words = buflen >> 1; | 563 | unsigned int words = buflen >> 1; |
564 | 564 | ||
@@ -595,7 +595,7 @@ EXPORT_SYMBOL_GPL(ata_sff_data_xfer); | |||
595 | 595 | ||
596 | /** | 596 | /** |
597 | * ata_sff_data_xfer32 - Transfer data by PIO | 597 | * ata_sff_data_xfer32 - Transfer data by PIO |
598 | * @dev: device to target | 598 | * @qc: queued command |
599 | * @buf: data buffer | 599 | * @buf: data buffer |
600 | * @buflen: buffer length | 600 | * @buflen: buffer length |
601 | * @rw: read/write | 601 | * @rw: read/write |
@@ -610,16 +610,17 @@ EXPORT_SYMBOL_GPL(ata_sff_data_xfer); | |||
610 | * Bytes consumed. | 610 | * Bytes consumed. |
611 | */ | 611 | */ |
612 | 612 | ||
613 | unsigned int ata_sff_data_xfer32(struct ata_device *dev, unsigned char *buf, | 613 | unsigned int ata_sff_data_xfer32(struct ata_queued_cmd *qc, unsigned char *buf, |
614 | unsigned int buflen, int rw) | 614 | unsigned int buflen, int rw) |
615 | { | 615 | { |
616 | struct ata_device *dev = qc->dev; | ||
616 | struct ata_port *ap = dev->link->ap; | 617 | struct ata_port *ap = dev->link->ap; |
617 | void __iomem *data_addr = ap->ioaddr.data_addr; | 618 | void __iomem *data_addr = ap->ioaddr.data_addr; |
618 | unsigned int words = buflen >> 2; | 619 | unsigned int words = buflen >> 2; |
619 | int slop = buflen & 3; | 620 | int slop = buflen & 3; |
620 | 621 | ||
621 | if (!(ap->pflags & ATA_PFLAG_PIO32)) | 622 | if (!(ap->pflags & ATA_PFLAG_PIO32)) |
622 | return ata_sff_data_xfer(dev, buf, buflen, rw); | 623 | return ata_sff_data_xfer(qc, buf, buflen, rw); |
623 | 624 | ||
624 | /* Transfer multiple of 4 bytes */ | 625 | /* Transfer multiple of 4 bytes */ |
625 | if (rw == READ) | 626 | if (rw == READ) |
@@ -658,7 +659,7 @@ EXPORT_SYMBOL_GPL(ata_sff_data_xfer32); | |||
658 | 659 | ||
659 | /** | 660 | /** |
660 | * ata_sff_data_xfer_noirq - Transfer data by PIO | 661 | * ata_sff_data_xfer_noirq - Transfer data by PIO |
661 | * @dev: device to target | 662 | * @qc: queued command |
662 | * @buf: data buffer | 663 | * @buf: data buffer |
663 | * @buflen: buffer length | 664 | * @buflen: buffer length |
664 | * @rw: read/write | 665 | * @rw: read/write |
@@ -672,14 +673,14 @@ EXPORT_SYMBOL_GPL(ata_sff_data_xfer32); | |||
672 | * RETURNS: | 673 | * RETURNS: |
673 | * Bytes consumed. | 674 | * Bytes consumed. |
674 | */ | 675 | */ |
675 | unsigned int ata_sff_data_xfer_noirq(struct ata_device *dev, unsigned char *buf, | 676 | unsigned int ata_sff_data_xfer_noirq(struct ata_queued_cmd *qc, unsigned char *buf, |
676 | unsigned int buflen, int rw) | 677 | unsigned int buflen, int rw) |
677 | { | 678 | { |
678 | unsigned long flags; | 679 | unsigned long flags; |
679 | unsigned int consumed; | 680 | unsigned int consumed; |
680 | 681 | ||
681 | local_irq_save(flags); | 682 | local_irq_save(flags); |
682 | consumed = ata_sff_data_xfer32(dev, buf, buflen, rw); | 683 | consumed = ata_sff_data_xfer32(qc, buf, buflen, rw); |
683 | local_irq_restore(flags); | 684 | local_irq_restore(flags); |
684 | 685 | ||
685 | return consumed; | 686 | return consumed; |
@@ -723,14 +724,14 @@ static void ata_pio_sector(struct ata_queued_cmd *qc) | |||
723 | buf = kmap_atomic(page); | 724 | buf = kmap_atomic(page); |
724 | 725 | ||
725 | /* do the actual data transfer */ | 726 | /* do the actual data transfer */ |
726 | ap->ops->sff_data_xfer(qc->dev, buf + offset, qc->sect_size, | 727 | ap->ops->sff_data_xfer(qc, buf + offset, qc->sect_size, |
727 | do_write); | 728 | do_write); |
728 | 729 | ||
729 | kunmap_atomic(buf); | 730 | kunmap_atomic(buf); |
730 | local_irq_restore(flags); | 731 | local_irq_restore(flags); |
731 | } else { | 732 | } else { |
732 | buf = page_address(page); | 733 | buf = page_address(page); |
733 | ap->ops->sff_data_xfer(qc->dev, buf + offset, qc->sect_size, | 734 | ap->ops->sff_data_xfer(qc, buf + offset, qc->sect_size, |
734 | do_write); | 735 | do_write); |
735 | } | 736 | } |
736 | 737 | ||
@@ -791,7 +792,7 @@ static void atapi_send_cdb(struct ata_port *ap, struct ata_queued_cmd *qc) | |||
791 | DPRINTK("send cdb\n"); | 792 | DPRINTK("send cdb\n"); |
792 | WARN_ON_ONCE(qc->dev->cdb_len < 12); | 793 | WARN_ON_ONCE(qc->dev->cdb_len < 12); |
793 | 794 | ||
794 | ap->ops->sff_data_xfer(qc->dev, qc->cdb, qc->dev->cdb_len, 1); | 795 | ap->ops->sff_data_xfer(qc, qc->cdb, qc->dev->cdb_len, 1); |
795 | ata_sff_sync(ap); | 796 | ata_sff_sync(ap); |
796 | /* FIXME: If the CDB is for DMA do we need to do the transition delay | 797 | /* FIXME: If the CDB is for DMA do we need to do the transition delay |
797 | or is bmdma_start guaranteed to do it ? */ | 798 | or is bmdma_start guaranteed to do it ? */ |
@@ -868,14 +869,14 @@ next_sg: | |||
868 | buf = kmap_atomic(page); | 869 | buf = kmap_atomic(page); |
869 | 870 | ||
870 | /* do the actual data transfer */ | 871 | /* do the actual data transfer */ |
871 | consumed = ap->ops->sff_data_xfer(dev, buf + offset, | 872 | consumed = ap->ops->sff_data_xfer(qc, buf + offset, |
872 | count, rw); | 873 | count, rw); |
873 | 874 | ||
874 | kunmap_atomic(buf); | 875 | kunmap_atomic(buf); |
875 | local_irq_restore(flags); | 876 | local_irq_restore(flags); |
876 | } else { | 877 | } else { |
877 | buf = page_address(page); | 878 | buf = page_address(page); |
878 | consumed = ap->ops->sff_data_xfer(dev, buf + offset, | 879 | consumed = ap->ops->sff_data_xfer(qc, buf + offset, |
879 | count, rw); | 880 | count, rw); |
880 | } | 881 | } |
881 | 882 | ||