aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ata/sata_promise.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c
index 9bd195fbd884..4c09d6504f0c 100644
--- a/drivers/ata/sata_promise.c
+++ b/drivers/ata/sata_promise.c
@@ -59,6 +59,7 @@ enum {
59 PDC_CYLINDER_HIGH = 0x14, /* Cylinder high reg (per port) */ 59 PDC_CYLINDER_HIGH = 0x14, /* Cylinder high reg (per port) */
60 PDC_DEVICE = 0x18, /* Device/Head reg (per port) */ 60 PDC_DEVICE = 0x18, /* Device/Head reg (per port) */
61 PDC_COMMAND = 0x1C, /* Command/status reg (per port) */ 61 PDC_COMMAND = 0x1C, /* Command/status reg (per port) */
62 PDC_ALTSTATUS = 0x38, /* Alternate-status/device-control reg (per port) */
62 PDC_PKT_SUBMIT = 0x40, /* Command packet pointer addr */ 63 PDC_PKT_SUBMIT = 0x40, /* Command packet pointer addr */
63 PDC_INT_SEQMASK = 0x40, /* Mask of asserted SEQ INTs */ 64 PDC_INT_SEQMASK = 0x40, /* Mask of asserted SEQ INTs */
64 PDC_FLASH_CTL = 0x44, /* Flash control register */ 65 PDC_FLASH_CTL = 0x44, /* Flash control register */
@@ -728,7 +729,7 @@ static unsigned int pdc_wait_for_drq(struct ata_port *ap)
728 * know when to time out the outer loop. 729 * know when to time out the outer loop.
729 */ 730 */
730 for(i = 0; i < 1000; ++i) { 731 for(i = 0; i < 1000; ++i) {
731 status = readb(port_mmio + 0x38); /* altstatus */ 732 status = readb(port_mmio + PDC_ALTSTATUS);
732 if (status == 0xFF) 733 if (status == 0xFF)
733 break; 734 break;
734 if (status & ATA_BUSY) 735 if (status & ATA_BUSY)
@@ -738,7 +739,15 @@ static unsigned int pdc_wait_for_drq(struct ata_port *ap)
738 mdelay(1); 739 mdelay(1);
739 } 740 }
740 if (i >= 1000) 741 if (i >= 1000)
741 ata_port_printk(ap, KERN_WARNING, "%s timed out", __FUNCTION__); 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__);
742 return status; 751 return status;
743} 752}
744 753
@@ -762,7 +771,7 @@ static void pdc_issue_atapi_pkt_cmd(struct ata_queued_cmd *qc)
762 tmp |= ATA_DEV1; 771 tmp |= ATA_DEV1;
763 } 772 }
764 writeb(tmp, port_mmio + PDC_DEVICE); 773 writeb(tmp, port_mmio + PDC_DEVICE);
765 ata_busy_wait(ap, ATA_BUSY, 1000); 774 pdc_wait_on_busy(ap);
766 775
767 writeb(0x00, port_mmio + PDC_SECTOR_COUNT); 776 writeb(0x00, port_mmio + PDC_SECTOR_COUNT);
768 writeb(0x00, port_mmio + PDC_SECTOR_NUMBER); 777 writeb(0x00, port_mmio + PDC_SECTOR_NUMBER);
@@ -788,14 +797,10 @@ static void pdc_issue_atapi_pkt_cmd(struct ata_queued_cmd *qc)
788 /* send ATAPI packet command 0xA0 */ 797 /* send ATAPI packet command 0xA0 */
789 writeb(ATA_CMD_PACKET, port_mmio + PDC_COMMAND); 798 writeb(ATA_CMD_PACKET, port_mmio + PDC_COMMAND);
790 799
791 /* 800 /* pdc_qc_issue_prot() currently sends ATAPI PIO packets back
792 * At this point in the issuing of a packet command, the Promise 801 * to libata. If we start handling those packets ourselves,
793 * driver busy-waits for INT (CTLSTAT bit 27) if it detected 802 * then we must busy-wait for INT (CTLSTAT bit 27) at this point
794 * (at port init time) that the device interrupts with assertion 803 * if the device has ATA_DFLAG_CDB_INTR set.
795 * of DRQ after receiving a packet command.
796 *
797 * XXX: Do we need to handle this case as well? Does libata detect
798 * this case for us, or do we have to do our own per-port init?
799 */ 804 */
800 805
801 pdc_wait_for_drq(ap); 806 pdc_wait_for_drq(ap);