aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libata-core.c
diff options
context:
space:
mode:
authorAlbert Lee <albertcc@tw.ibm.com>2006-03-25 17:45:49 +0800
committerJeff Garzik <jeff@garzik.org>2006-03-29 17:21:53 -0500
commit6912ccd5a4a095d71fd7215ef2abea877c8fed6f (patch)
treee8381968de60c1e92e98b8c35b828ab1c44ca573 /drivers/scsi/libata-core.c
parente2cec77117a6e4fcbac2601e2f7b0b3f4f5a4c84 (diff)
downloadlinux-6912ccd5a4a095d71fd7215ef2abea877c8fed6f.tar.gz
[PATCH] libata-dev: Minor fix for ata_hsm_move() to work with ata_host_intr()
Minor fix for ata_hsm_move() to work with ata_host_intr(). Changes: - WARN_ON() and comment fix - Make the HSM_ST_LAST device status checking more rigid. - Treat unknown HSM state as BUG(). Signed-off-by: Albert Lee <albertcc@tw.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/scsi/libata-core.c')
-rw-r--r--drivers/scsi/libata-core.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
index 7214530ac161f..094c7907534af 100644
--- a/drivers/scsi/libata-core.c
+++ b/drivers/scsi/libata-core.c
@@ -3808,6 +3808,8 @@ static void ata_pio_error(struct ata_port *ap)
static void ata_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
u8 status)
{
+ WARN_ON((qc->flags & ATA_QCFLAG_ACTIVE) == 0);
+
/* check error */
if (unlikely(status & (ATA_ERR | ATA_DF))) {
qc->err_mask |= AC_ERR_DEV;
@@ -3817,10 +3819,6 @@ static void ata_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
fsm_start:
switch (ap->hsm_task_state) {
case HSM_ST_FIRST:
- /* Some pre-ATAPI-4 devices assert INTRQ
- * at this state when ready to receive CDB.
- */
-
/* check device status */
if (unlikely((status & (ATA_BUSY | ATA_DRQ)) != ATA_DRQ)) {
/* Wrong status. Let EH handle this */
@@ -3873,9 +3871,8 @@ fsm_start:
break;
case HSM_ST_LAST:
- if (unlikely(status & ATA_DRQ)) {
- /* handle DRQ=1 as error */
- qc->err_mask |= AC_ERR_HSM;
+ if (unlikely(!ata_ok(status))) {
+ qc->err_mask |= __ac_err_mask(status);
ap->hsm_task_state = HSM_ST_ERR;
goto fsm_start;
}
@@ -3884,17 +3881,18 @@ fsm_start:
DPRINTK("ata%u: command complete, drv_stat 0x%x\n",
ap->id, status);
+ WARN_ON(qc->err_mask);
+
ap->hsm_task_state = HSM_ST_IDLE;
/* complete taskfile transaction */
- qc->err_mask |= ac_err_mask(status);
ata_qc_complete(qc);
break;
case HSM_ST_ERR:
if (qc->tf.command != ATA_CMD_PACKET)
- printk(KERN_ERR "ata%u: command error, drv_stat 0x%x host_stat 0x%x\n",
- ap->id, status, host_stat);
+ printk(KERN_ERR "ata%u: command error, drv_stat 0x%x\n",
+ ap->id, status);
/* make sure qc->err_mask is available to
* know what's wrong and recover
@@ -3905,7 +3903,7 @@ fsm_start:
ata_qc_complete(qc);
break;
default:
- goto idle_irq;
+ BUG();
}
}
@@ -4371,6 +4369,10 @@ inline unsigned int ata_host_intr (struct ata_port *ap,
/* Check whether we are expecting interrupt in this state */
switch (ap->hsm_task_state) {
case HSM_ST_FIRST:
+ /* Some pre-ATAPI-4 devices assert INTRQ
+ * at this state when ready to receive CDB.
+ */
+
/* Check the ATA_DFLAG_CDB_INTR flag is enough here.
* The flag was turned on only for atapi devices.
* No need to check is_atapi_taskfile(&qc->tf) again.