|
@@ -559,101 +559,6 @@ void ata_port_wait_eh(struct ata_port *ap)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * ata_qc_timeout - Handle timeout of queued command
|
|
|
- * @qc: Command that timed out
|
|
|
- *
|
|
|
- * Some part of the kernel (currently, only the SCSI layer)
|
|
|
- * has noticed that the active command on port @ap has not
|
|
|
- * completed after a specified length of time. Handle this
|
|
|
- * condition by disabling DMA (if necessary) and completing
|
|
|
- * transactions, with error if necessary.
|
|
|
- *
|
|
|
- * This also handles the case of the "lost interrupt", where
|
|
|
- * for some reason (possibly hardware bug, possibly driver bug)
|
|
|
- * an interrupt was not delivered to the driver, even though the
|
|
|
- * transaction completed successfully.
|
|
|
- *
|
|
|
- * TODO: kill this function once old EH is gone.
|
|
|
- *
|
|
|
- * LOCKING:
|
|
|
- * Inherited from SCSI layer (none, can sleep)
|
|
|
- */
|
|
|
-static void ata_qc_timeout(struct ata_queued_cmd *qc)
|
|
|
-{
|
|
|
- struct ata_port *ap = qc->ap;
|
|
|
- u8 host_stat = 0, drv_stat;
|
|
|
- unsigned long flags;
|
|
|
-
|
|
|
- DPRINTK("ENTER\n");
|
|
|
-
|
|
|
- ap->hsm_task_state = HSM_ST_IDLE;
|
|
|
-
|
|
|
- spin_lock_irqsave(ap->lock, flags);
|
|
|
-
|
|
|
- switch (qc->tf.protocol) {
|
|
|
-
|
|
|
- case ATA_PROT_DMA:
|
|
|
- case ATA_PROT_ATAPI_DMA:
|
|
|
- host_stat = ap->ops->bmdma_status(ap);
|
|
|
-
|
|
|
- /* before we do anything else, clear DMA-Start bit */
|
|
|
- ap->ops->bmdma_stop(qc);
|
|
|
-
|
|
|
- /* fall through */
|
|
|
-
|
|
|
- default:
|
|
|
- ata_altstatus(ap);
|
|
|
- drv_stat = ata_chk_status(ap);
|
|
|
-
|
|
|
- /* ack bmdma irq events */
|
|
|
- ap->ops->irq_clear(ap);
|
|
|
-
|
|
|
- ata_dev_printk(qc->dev, KERN_ERR, "command 0x%x timeout, "
|
|
|
- "stat 0x%x host_stat 0x%x\n",
|
|
|
- qc->tf.command, drv_stat, host_stat);
|
|
|
-
|
|
|
- /* complete taskfile transaction */
|
|
|
- qc->err_mask |= AC_ERR_TIMEOUT;
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- spin_unlock_irqrestore(ap->lock, flags);
|
|
|
-
|
|
|
- ata_eh_qc_complete(qc);
|
|
|
-
|
|
|
- DPRINTK("EXIT\n");
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * ata_eng_timeout - Handle timeout of queued command
|
|
|
- * @ap: Port on which timed-out command is active
|
|
|
- *
|
|
|
- * Some part of the kernel (currently, only the SCSI layer)
|
|
|
- * has noticed that the active command on port @ap has not
|
|
|
- * completed after a specified length of time. Handle this
|
|
|
- * condition by disabling DMA (if necessary) and completing
|
|
|
- * transactions, with error if necessary.
|
|
|
- *
|
|
|
- * This also handles the case of the "lost interrupt", where
|
|
|
- * for some reason (possibly hardware bug, possibly driver bug)
|
|
|
- * an interrupt was not delivered to the driver, even though the
|
|
|
- * transaction completed successfully.
|
|
|
- *
|
|
|
- * TODO: kill this function once old EH is gone.
|
|
|
- *
|
|
|
- * LOCKING:
|
|
|
- * Inherited from SCSI layer (none, can sleep)
|
|
|
- */
|
|
|
-void ata_eng_timeout(struct ata_port *ap)
|
|
|
-{
|
|
|
- DPRINTK("ENTER\n");
|
|
|
-
|
|
|
- ata_qc_timeout(ata_qc_from_tag(ap, ap->link.active_tag));
|
|
|
-
|
|
|
- DPRINTK("EXIT\n");
|
|
|
-}
|
|
|
-
|
|
|
static int ata_eh_nr_in_flight(struct ata_port *ap)
|
|
|
{
|
|
|
unsigned int tag;
|