diff options
author | Mikael Pettersson <mikpe@it.uu.se> | 2007-01-10 09:32:34 +0100 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-02-09 17:39:33 -0500 |
commit | 73fd456b2dd770ab4fcf14b9d45b7482237a2cf7 (patch) | |
tree | 6a32e6f9c95fbcb5fbf74c086527374dcdad3b89 | |
parent | 1fd7a697a37bcd484b130a71326e43cd68ced90c (diff) | |
download | linux-73fd456b2dd770ab4fcf14b9d45b7482237a2cf7.tar.bz2 |
sata_promise: ATAPI cleanup
Here's a cleanup for yesterday's sata_promise ATAPI patch:
- add and use a symbolic constant for the altstatus register
- check return status from ata_busy_wait()
- add missing newline in a warning printk()
- update comment in pdc_issue_atapi_pkt_cmd() to clarify
that the maybe-wait-for-INT issue cannot occur in the
current driver, but may occur if the driver starts issuing
ATAPI non-DMA commands as PDC packets
Signed-off-by: Mikael Pettersson <mikpe@it.uu.se>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r-- | drivers/ata/sata_promise.c | 27 |
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 { PDC_CYLINDER_HIGH = 0x14, /* Cylinder high reg (per port) */ PDC_DEVICE = 0x18, /* Device/Head reg (per port) */ PDC_COMMAND = 0x1C, /* Command/status reg (per port) */ + PDC_ALTSTATUS = 0x38, /* Alternate-status/device-control reg (per port) */ PDC_PKT_SUBMIT = 0x40, /* Command packet pointer addr */ PDC_INT_SEQMASK = 0x40, /* Mask of asserted SEQ INTs */ PDC_FLASH_CTL = 0x44, /* Flash control register */ @@ -728,7 +729,7 @@ static unsigned int pdc_wait_for_drq(struct ata_port *ap) * know when to time out the outer loop. */ for(i = 0; i < 1000; ++i) { - status = readb(port_mmio + 0x38); /* altstatus */ + status = readb(port_mmio + PDC_ALTSTATUS); if (status == 0xFF) break; if (status & ATA_BUSY) @@ -738,7 +739,15 @@ static unsigned int pdc_wait_for_drq(struct ata_port *ap) mdelay(1); } if (i >= 1000) - ata_port_printk(ap, KERN_WARNING, "%s timed out", __FUNCTION__); + ata_port_printk(ap, KERN_WARNING, "%s timed out\n", __FUNCTION__); + return status; +} + +static unsigned int pdc_wait_on_busy(struct ata_port *ap) +{ + unsigned int status = ata_busy_wait(ap, ATA_BUSY, 1000); + if (status != 0xff && (status & ATA_BUSY)) + ata_port_printk(ap, KERN_WARNING, "%s timed out\n", __FUNCTION__); return status; } @@ -762,7 +771,7 @@ static void pdc_issue_atapi_pkt_cmd(struct ata_queued_cmd *qc) tmp |= ATA_DEV1; } writeb(tmp, port_mmio + PDC_DEVICE); - ata_busy_wait(ap, ATA_BUSY, 1000); + pdc_wait_on_busy(ap); writeb(0x00, port_mmio + PDC_SECTOR_COUNT); writeb(0x00, port_mmio + PDC_SECTOR_NUMBER); @@ -788,14 +797,10 @@ static void pdc_issue_atapi_pkt_cmd(struct ata_queued_cmd *qc) /* send ATAPI packet command 0xA0 */ writeb(ATA_CMD_PACKET, port_mmio + PDC_COMMAND); - /* - * At this point in the issuing of a packet command, the Promise - * driver busy-waits for INT (CTLSTAT bit 27) if it detected - * (at port init time) that the device interrupts with assertion - * of DRQ after receiving a packet command. - * - * XXX: Do we need to handle this case as well? Does libata detect - * this case for us, or do we have to do our own per-port init? + /* pdc_qc_issue_prot() currently sends ATAPI PIO packets back + * to libata. If we start handling those packets ourselves, + * then we must busy-wait for INT (CTLSTAT bit 27) at this point + * if the device has ATA_DFLAG_CDB_INTR set. */ pdc_wait_for_drq(ap); |