diff options
Diffstat (limited to 'drivers/ata/sata_promise.c')
-rw-r--r-- | drivers/ata/sata_promise.c | 162 |
1 files changed, 60 insertions, 102 deletions
diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c index 4c09d6504f0c..9d73cb9de42a 100644 --- a/drivers/ata/sata_promise.c +++ b/drivers/ata/sata_promise.c | |||
@@ -448,28 +448,80 @@ static void pdc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg, | |||
448 | writel(val, (void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4)); | 448 | writel(val, (void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4)); |
449 | } | 449 | } |
450 | 450 | ||
451 | static void pdc_atapi_dma_pkt(struct ata_taskfile *tf, | 451 | static void pdc_atapi_dma_pkt(struct ata_queued_cmd *qc) |
452 | dma_addr_t sg_table, | ||
453 | unsigned int cdb_len, u8 *cdb, | ||
454 | u8 *buf) | ||
455 | { | 452 | { |
453 | struct ata_port *ap = qc->ap; | ||
454 | dma_addr_t sg_table = ap->prd_dma; | ||
455 | unsigned int cdb_len = qc->dev->cdb_len; | ||
456 | u8 *cdb = qc->cdb; | ||
457 | struct pdc_port_priv *pp = ap->private_data; | ||
458 | u8 *buf = pp->pkt; | ||
456 | u32 *buf32 = (u32 *) buf; | 459 | u32 *buf32 = (u32 *) buf; |
460 | unsigned int dev_sel, feature, nbytes; | ||
457 | 461 | ||
458 | /* set control bits (byte 0), zero delay seq id (byte 3), | 462 | /* set control bits (byte 0), zero delay seq id (byte 3), |
459 | * and seq id (byte 2) | 463 | * and seq id (byte 2) |
460 | */ | 464 | */ |
461 | if (!(tf->flags & ATA_TFLAG_WRITE)) | 465 | if (!(qc->tf.flags & ATA_TFLAG_WRITE)) |
462 | buf32[0] = cpu_to_le32(PDC_PKT_READ); | 466 | buf32[0] = cpu_to_le32(PDC_PKT_READ); |
463 | else | 467 | else |
464 | buf32[0] = 0; | 468 | buf32[0] = 0; |
465 | buf32[1] = cpu_to_le32(sg_table); /* S/G table addr */ | 469 | buf32[1] = cpu_to_le32(sg_table); /* S/G table addr */ |
466 | buf32[2] = 0; /* no next-packet */ | 470 | buf32[2] = 0; /* no next-packet */ |
467 | 471 | ||
472 | /* select drive */ | ||
473 | if (sata_scr_valid(ap)) { | ||
474 | dev_sel = PDC_DEVICE_SATA; | ||
475 | } else { | ||
476 | dev_sel = ATA_DEVICE_OBS; | ||
477 | if (qc->dev->devno != 0) | ||
478 | dev_sel |= ATA_DEV1; | ||
479 | } | ||
480 | buf[12] = (1 << 5) | ATA_REG_DEVICE; | ||
481 | buf[13] = dev_sel; | ||
482 | buf[14] = (1 << 5) | ATA_REG_DEVICE | PDC_PKT_CLEAR_BSY; | ||
483 | buf[15] = dev_sel; /* once more, waiting for BSY to clear */ | ||
484 | |||
485 | buf[16] = (1 << 5) | ATA_REG_NSECT; | ||
486 | buf[17] = 0x00; | ||
487 | buf[18] = (1 << 5) | ATA_REG_LBAL; | ||
488 | buf[19] = 0x00; | ||
489 | |||
490 | /* set feature and byte counter registers */ | ||
491 | if (qc->tf.protocol != ATA_PROT_ATAPI_DMA) { | ||
492 | feature = PDC_FEATURE_ATAPI_PIO; | ||
493 | /* set byte counter register to real transfer byte count */ | ||
494 | nbytes = qc->nbytes; | ||
495 | if (!nbytes) | ||
496 | nbytes = qc->nsect << 9; | ||
497 | if (nbytes > 0xffff) | ||
498 | nbytes = 0xffff; | ||
499 | } else { | ||
500 | feature = PDC_FEATURE_ATAPI_DMA; | ||
501 | /* set byte counter register to 0 */ | ||
502 | nbytes = 0; | ||
503 | } | ||
504 | buf[20] = (1 << 5) | ATA_REG_FEATURE; | ||
505 | buf[21] = feature; | ||
506 | buf[22] = (1 << 5) | ATA_REG_BYTEL; | ||
507 | buf[23] = nbytes & 0xFF; | ||
508 | buf[24] = (1 << 5) | ATA_REG_BYTEH; | ||
509 | buf[25] = (nbytes >> 8) & 0xFF; | ||
510 | |||
511 | /* send ATAPI packet command 0xA0 */ | ||
512 | buf[26] = (1 << 5) | ATA_REG_CMD; | ||
513 | buf[27] = ATA_CMD_PACKET; | ||
514 | |||
515 | /* select drive and check DRQ */ | ||
516 | buf[28] = (1 << 5) | ATA_REG_DEVICE | PDC_PKT_WAIT_DRDY; | ||
517 | buf[29] = dev_sel; | ||
518 | |||
468 | /* we can represent cdb lengths 2/4/6/8/10/12/14/16 */ | 519 | /* we can represent cdb lengths 2/4/6/8/10/12/14/16 */ |
469 | BUG_ON(cdb_len & ~0x1E); | 520 | BUG_ON(cdb_len & ~0x1E); |
470 | 521 | ||
471 | buf[12] = (((cdb_len >> 1) & 7) << 5) | ATA_REG_DATA | PDC_LAST_REG; | 522 | /* append the CDB as the final part */ |
472 | memcpy(buf+13, cdb, cdb_len); | 523 | buf[30] = (((cdb_len >> 1) & 7) << 5) | ATA_REG_DATA | PDC_LAST_REG; |
524 | memcpy(buf+31, cdb, cdb_len); | ||
473 | } | 525 | } |
474 | 526 | ||
475 | static void pdc_qc_prep(struct ata_queued_cmd *qc) | 527 | static void pdc_qc_prep(struct ata_queued_cmd *qc) |
@@ -503,7 +555,7 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc) | |||
503 | 555 | ||
504 | case ATA_PROT_ATAPI_DMA: | 556 | case ATA_PROT_ATAPI_DMA: |
505 | ata_qc_prep(qc); | 557 | ata_qc_prep(qc); |
506 | pdc_atapi_dma_pkt(&qc->tf, qc->ap->prd_dma, qc->dev->cdb_len, qc->cdb, pp->pkt); | 558 | pdc_atapi_dma_pkt(qc); |
507 | break; | 559 | break; |
508 | 560 | ||
509 | default: | 561 | default: |
@@ -716,104 +768,10 @@ static inline void pdc_packet_start(struct ata_queued_cmd *qc) | |||
716 | readl((void __iomem *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); /* flush */ | 768 | readl((void __iomem *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); /* flush */ |
717 | } | 769 | } |
718 | 770 | ||
719 | static unsigned int pdc_wait_for_drq(struct ata_port *ap) | ||
720 | { | ||
721 | void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr; | ||
722 | unsigned int i; | ||
723 | unsigned int status; | ||
724 | |||
725 | /* Following pdc-ultra's WaitForDrq() we loop here until BSY | ||
726 | * is clear and DRQ is set in altstatus. We could possibly call | ||
727 | * ata_busy_wait() and loop until DRQ is set, but since we don't | ||
728 | * know how much time a call to ata_busy_wait() took, we don't | ||
729 | * know when to time out the outer loop. | ||
730 | */ | ||
731 | for(i = 0; i < 1000; ++i) { | ||
732 | status = readb(port_mmio + PDC_ALTSTATUS); | ||
733 | if (status == 0xFF) | ||
734 | break; | ||
735 | if (status & ATA_BUSY) | ||
736 | ; | ||
737 | else if (status & (ATA_DRQ | ATA_ERR)) | ||
738 | break; | ||
739 | mdelay(1); | ||
740 | } | ||
741 | if (i >= 1000) | ||
742 | ata_port_printk(ap, KERN_WARNING, "%s timed out\n", __FUNCTION__); | ||
743 | return status; | ||
744 | } | ||
745 | |||
746 | static unsigned int pdc_wait_on_busy(struct ata_port *ap) | ||
747 | { | ||
748 | unsigned int status = ata_busy_wait(ap, ATA_BUSY, 1000); | ||
749 | if (status != 0xff && (status & ATA_BUSY)) | ||
750 | ata_port_printk(ap, KERN_WARNING, "%s timed out\n", __FUNCTION__); | ||
751 | return status; | ||
752 | } | ||
753 | |||
754 | static void pdc_issue_atapi_pkt_cmd(struct ata_queued_cmd *qc) | ||
755 | { | ||
756 | struct ata_port *ap = qc->ap; | ||
757 | void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr; | ||
758 | void __iomem *host_mmio = ap->host->mmio_base; | ||
759 | unsigned int nbytes; | ||
760 | unsigned int tmp; | ||
761 | |||
762 | writeb(0x00, port_mmio + PDC_CTLSTAT); /* route drive INT to SEQ 0 */ | ||
763 | writeb(PDC_SEQCNTRL_INT_MASK, host_mmio + 0); /* but mask SEQ 0 INT */ | ||
764 | |||
765 | /* select drive */ | ||
766 | if (sata_scr_valid(ap)) { | ||
767 | tmp = PDC_DEVICE_SATA; | ||
768 | } else { | ||
769 | tmp = ATA_DEVICE_OBS; | ||
770 | if (qc->dev->devno != 0) | ||
771 | tmp |= ATA_DEV1; | ||
772 | } | ||
773 | writeb(tmp, port_mmio + PDC_DEVICE); | ||
774 | pdc_wait_on_busy(ap); | ||
775 | |||
776 | writeb(0x00, port_mmio + PDC_SECTOR_COUNT); | ||
777 | writeb(0x00, port_mmio + PDC_SECTOR_NUMBER); | ||
778 | |||
779 | /* set feature and byte counter registers */ | ||
780 | if (qc->tf.protocol != ATA_PROT_ATAPI_DMA) { | ||
781 | tmp = PDC_FEATURE_ATAPI_PIO; | ||
782 | /* set byte counter register to real transfer byte count */ | ||
783 | nbytes = qc->nbytes; | ||
784 | if (!nbytes) | ||
785 | nbytes = qc->nsect << 9; | ||
786 | if (nbytes > 0xffff) | ||
787 | nbytes = 0xffff; | ||
788 | } else { | ||
789 | tmp = PDC_FEATURE_ATAPI_DMA; | ||
790 | /* set byte counter register to 0 */ | ||
791 | nbytes = 0; | ||
792 | } | ||
793 | writeb(tmp, port_mmio + PDC_FEATURE); | ||
794 | writeb(nbytes & 0xFF, port_mmio + PDC_CYLINDER_LOW); | ||
795 | writeb((nbytes >> 8) & 0xFF, port_mmio + PDC_CYLINDER_HIGH); | ||
796 | |||
797 | /* send ATAPI packet command 0xA0 */ | ||
798 | writeb(ATA_CMD_PACKET, port_mmio + PDC_COMMAND); | ||
799 | |||
800 | /* pdc_qc_issue_prot() currently sends ATAPI PIO packets back | ||
801 | * to libata. If we start handling those packets ourselves, | ||
802 | * then we must busy-wait for INT (CTLSTAT bit 27) at this point | ||
803 | * if the device has ATA_DFLAG_CDB_INTR set. | ||
804 | */ | ||
805 | |||
806 | pdc_wait_for_drq(ap); | ||
807 | |||
808 | /* now the device only waits for the CDB */ | ||
809 | } | ||
810 | |||
811 | static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc) | 771 | static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc) |
812 | { | 772 | { |
813 | switch (qc->tf.protocol) { | 773 | switch (qc->tf.protocol) { |
814 | case ATA_PROT_ATAPI_DMA: | 774 | case ATA_PROT_ATAPI_DMA: |
815 | pdc_issue_atapi_pkt_cmd(qc); | ||
816 | /*FALLTHROUGH*/ | ||
817 | case ATA_PROT_DMA: | 775 | case ATA_PROT_DMA: |
818 | case ATA_PROT_NODATA: | 776 | case ATA_PROT_NODATA: |
819 | pdc_packet_start(qc); | 777 | pdc_packet_start(qc); |