diff options
author | Tejun Heo <htejun@gmail.com> | 2006-05-15 07:58:05 -0400 |
---|---|---|
committer | Tejun Heo <htejun@gmail.com> | 2006-05-15 07:58:05 -0400 |
commit | f686bcb8078ac7505ec88818886c2c72639f4fc5 (patch) | |
tree | 7c563e0032b2d85b631b617b8bb2a7a648607468 /drivers/scsi/libata.h | |
parent | f69499f42caf74194df678c9c293f2ee0fe90bc3 (diff) |
[PATCH] libata-eh-fw: implement new EH scheduling via error completion
There are several ways a qc can get schedule for EH in new EH. This
patch implements one of them - completing a qc with ATA_QCFLAG_FAILED
set or with non-zero qc->err_mask. ALL such qc's are examined by EH.
New EH schedules a qc for EH from completion iff ->error_handler is
implemented, qc is marked as failed or qc->err_mask is non-zero and
the command is not an internal command (internal cmd is handled via
->post_internal_cmd). The EH scheduling itself is performed by asking
SCSI midlayer to schedule EH for the specified scmd.
For drivers implementing old-EH, nothing changes. As this change
makes ata_qc_complete() rather large, it's not inlined anymore and
__ata_qc_complete() is exported to other parts of libata for later
use.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Diffstat (limited to 'drivers/scsi/libata.h')
-rw-r--r-- | drivers/scsi/libata.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/scsi/libata.h b/drivers/scsi/libata.h index c9ff83bbcfae..52622b7f8a9e 100644 --- a/drivers/scsi/libata.h +++ b/drivers/scsi/libata.h | |||
@@ -57,6 +57,7 @@ extern int ata_do_reset(struct ata_port *ap, ata_reset_fn_t reset, | |||
57 | unsigned int *classes); | 57 | unsigned int *classes); |
58 | extern void ata_qc_free(struct ata_queued_cmd *qc); | 58 | extern void ata_qc_free(struct ata_queued_cmd *qc); |
59 | extern void ata_qc_issue(struct ata_queued_cmd *qc); | 59 | extern void ata_qc_issue(struct ata_queued_cmd *qc); |
60 | extern void __ata_qc_complete(struct ata_queued_cmd *qc); | ||
60 | extern int ata_check_atapi_dma(struct ata_queued_cmd *qc); | 61 | extern int ata_check_atapi_dma(struct ata_queued_cmd *qc); |
61 | extern void ata_dev_select(struct ata_port *ap, unsigned int device, | 62 | extern void ata_dev_select(struct ata_port *ap, unsigned int device, |
62 | unsigned int wait, unsigned int can_sleep); | 63 | unsigned int wait, unsigned int can_sleep); |
@@ -101,5 +102,6 @@ extern void ata_scsi_rbuf_fill(struct ata_scsi_args *args, | |||
101 | /* libata-eh.c */ | 102 | /* libata-eh.c */ |
102 | extern enum scsi_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd); | 103 | extern enum scsi_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd); |
103 | extern void ata_scsi_error(struct Scsi_Host *host); | 104 | extern void ata_scsi_error(struct Scsi_Host *host); |
105 | extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc); | ||
104 | 106 | ||
105 | #endif /* __LIBATA_H__ */ | 107 | #endif /* __LIBATA_H__ */ |