1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef _SCSI_SCSI_EH_H
31da177e4SLinus Torvalds #define _SCSI_SCSI_EH_H
41da177e4SLinus Torvalds
5645a0c6cSJames Bottomley #include <linux/scatterlist.h>
6645a0c6cSJames Bottomley
7e1c23468SBoaz Harrosh #include <scsi/scsi_cmnd.h>
87708c165SSagi Grimberg #include <scsi/scsi_common.h>
91da177e4SLinus Torvalds struct scsi_device;
101da177e4SLinus Torvalds struct Scsi_Host;
111da177e4SLinus Torvalds
12041c5fc3STejun Heo extern void scsi_eh_finish_cmd(struct scsi_cmnd *scmd,
13041c5fc3STejun Heo struct list_head *done_q);
14041c5fc3STejun Heo extern void scsi_eh_flush_done_q(struct list_head *done_q);
151da177e4SLinus Torvalds extern void scsi_report_bus_reset(struct Scsi_Host *, int);
161da177e4SLinus Torvalds extern void scsi_report_device_reset(struct Scsi_Host *, int, int);
171da177e4SLinus Torvalds extern int scsi_block_when_processing_errors(struct scsi_device *);
184753cbc0SHannes Reinecke extern bool scsi_command_normalize_sense(const struct scsi_cmnd *cmd,
191da177e4SLinus Torvalds struct scsi_sense_hdr *sshdr);
20b8e162f9SBart Van Assche extern enum scsi_disposition scsi_check_sense(struct scsi_cmnd *);
211da177e4SLinus Torvalds
scsi_sense_is_deferred(const struct scsi_sense_hdr * sshdr)224753cbc0SHannes Reinecke static inline bool scsi_sense_is_deferred(const struct scsi_sense_hdr *sshdr)
231da177e4SLinus Torvalds {
241da177e4SLinus Torvalds return ((sshdr->response_code >= 0x70) && (sshdr->response_code & 1));
251da177e4SLinus Torvalds }
261da177e4SLinus Torvalds
272908769cSDamien Le Moal extern bool scsi_get_sense_info_fld(const u8 *sense_buffer, int sb_len,
281da177e4SLinus Torvalds u64 *info_out);
291da177e4SLinus Torvalds
30176aa9d6SChristoph Hellwig extern int scsi_ioctl_reset(struct scsi_device *, int __user *);
311da177e4SLinus Torvalds
32e1c23468SBoaz Harrosh struct scsi_eh_save {
3330b0c37bSBoaz Harrosh /* saved state */
34e1c23468SBoaz Harrosh int result;
358f8fed0cSDamien Le Moal unsigned int resid_len;
368e8c9d01SHannes Reinecke int eh_eflags;
37e1c23468SBoaz Harrosh enum dma_data_direction data_direction;
3812265709SAlan Stern unsigned underflow;
39e1c23468SBoaz Harrosh unsigned char cmd_len;
40db007fc5SMartin K. Petersen unsigned char prot_op;
41ce70fd9aSChristoph Hellwig unsigned char cmnd[32];
4230b0c37bSBoaz Harrosh struct scsi_data_buffer sdb;
43e1c23468SBoaz Harrosh struct scatterlist sense_sgl;
44e1c23468SBoaz Harrosh };
45e1c23468SBoaz Harrosh
46e1c23468SBoaz Harrosh extern void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd,
47e1c23468SBoaz Harrosh struct scsi_eh_save *ses, unsigned char *cmnd,
48e1c23468SBoaz Harrosh int cmnd_size, unsigned sense_bytes);
49e1c23468SBoaz Harrosh
50e1c23468SBoaz Harrosh extern void scsi_eh_restore_cmnd(struct scsi_cmnd* scmd,
51e1c23468SBoaz Harrosh struct scsi_eh_save *ses);
52e1c23468SBoaz Harrosh
531da177e4SLinus Torvalds #endif /* _SCSI_SCSI_EH_H */
54