aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/sata_promise.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata/sata_promise.c')
-rw-r--r--drivers/ata/sata_promise.c162
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
451static void pdc_atapi_dma_pkt(struct ata_taskfile *tf, 451static 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
475static void pdc_qc_prep(struct ata_queued_cmd *qc) 527static 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
719static 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
746static 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
754static 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
811static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc) 771static 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);