xref: /linux/include/scsi/scsi_eh.h (revision ce70fd9a)
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