Commit 3cc46e22 authored by Jeff Garzik's avatar Jeff Garzik

[libata] move some code around

Split ata_eng_timeout into the main part (ata_qc_timeout)
and the part called by the SCSI layer (ata_eng_timeout).

Zero behavior changes.
parent 1becc720
...@@ -2123,8 +2123,8 @@ static void ata_pio_task(void *_data) ...@@ -2123,8 +2123,8 @@ static void ata_pio_task(void *_data)
} }
/** /**
* ata_eng_timeout - Handle timeout of queued command * ata_qc_timeout - Handle timeout of queued command
* @ap: Port on which timed-out command is active * @qc: Command that timed out
* *
* Some part of the kernel (currently, only the SCSI layer) * Some part of the kernel (currently, only the SCSI layer)
* has noticed that the active command on port @ap has not * has noticed that the active command on port @ap has not
...@@ -2138,23 +2138,14 @@ static void ata_pio_task(void *_data) ...@@ -2138,23 +2138,14 @@ static void ata_pio_task(void *_data)
* transaction completed successfully. * transaction completed successfully.
* *
* LOCKING: * LOCKING:
* Inherited from SCSI layer (none, can sleep)
*/ */
void ata_eng_timeout(struct ata_port *ap) static void ata_qc_timeout(struct ata_queued_cmd *qc)
{ {
u8 host_stat = 0, drv_stat; u8 host_stat = 0, drv_stat;
struct ata_queued_cmd *qc;
DPRINTK("ENTER\n"); DPRINTK("ENTER\n");
qc = ata_qc_from_tag(ap, ap->active_tag);
if (!qc) {
printk(KERN_ERR "ata%u: BUG: timeout without command\n",
ap->id);
goto out;
}
/* hack alert! We cannot use the supplied completion /* hack alert! We cannot use the supplied completion
* function from inside the ->eh_strategy_handler() thread. * function from inside the ->eh_strategy_handler() thread.
* libata is the only user of ->eh_strategy_handler() in * libata is the only user of ->eh_strategy_handler() in
...@@ -2194,6 +2185,45 @@ void ata_eng_timeout(struct ata_port *ap) ...@@ -2194,6 +2185,45 @@ void ata_eng_timeout(struct ata_port *ap)
DPRINTK("EXIT\n"); 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.
*
* LOCKING:
* Inherited from SCSI layer (none, can sleep)
*/
void ata_eng_timeout(struct ata_port *ap)
{
u8 host_stat = 0, drv_stat;
struct ata_queued_cmd *qc;
DPRINTK("ENTER\n");
qc = ata_qc_from_tag(ap, ap->active_tag);
if (!qc) {
printk(KERN_ERR "ata%u: BUG: timeout without command\n",
ap->id);
goto out;
}
ata_qc_timeout(qc);
out:
DPRINTK("EXIT\n");
}
/** /**
* ata_qc_new - Request an available ATA command, for queueing * ata_qc_new - Request an available ATA command, for queueing
* @ap: Port associated with device @dev * @ap: Port associated with device @dev
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment