Skip to content

Commit

Permalink
[PATCH] libata-dev: Minor fix for ata_hsm_move() to work with ata_hos…
Browse files Browse the repository at this point in the history
…t_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>
  • Loading branch information
Albert Lee authored and Jeff Garzik committed Mar 29, 2006
1 parent e2cec77 commit 6912ccd
Showing 1 changed file with 13 additions and 11 deletions.
24 changes: 13 additions & 11 deletions drivers/scsi/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 */
Expand Down Expand Up @@ -3873,9 +3871,8 @@ static void ata_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
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;
}
Expand All @@ -3884,17 +3881,18 @@ static void ata_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
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
Expand All @@ -3905,7 +3903,7 @@ static void ata_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
ata_qc_complete(qc);
break;
default:
goto idle_irq;
BUG();
}

}
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit 6912ccd

Please sign in to comment.