1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _SCSI_SCSI_EH_H |
3 | #define _SCSI_SCSI_EH_H |
4 | |
5 | #include <linux/scatterlist.h> |
6 | |
7 | #include <scsi/scsi_cmnd.h> |
8 | #include <scsi/scsi_common.h> |
9 | struct scsi_device; |
10 | struct Scsi_Host; |
11 | |
12 | extern void scsi_eh_finish_cmd(struct scsi_cmnd *scmd, |
13 | struct list_head *done_q); |
14 | extern void scsi_eh_flush_done_q(struct list_head *done_q); |
15 | extern void scsi_report_bus_reset(struct Scsi_Host *, int); |
16 | extern void scsi_report_device_reset(struct Scsi_Host *, int, int); |
17 | extern int scsi_block_when_processing_errors(struct scsi_device *); |
18 | extern bool scsi_command_normalize_sense(const struct scsi_cmnd *cmd, |
19 | struct scsi_sense_hdr *sshdr); |
20 | extern enum scsi_disposition scsi_check_sense(struct scsi_cmnd *); |
21 | |
22 | static inline bool scsi_sense_is_deferred(const struct scsi_sense_hdr *sshdr) |
23 | { |
24 | return ((sshdr->response_code >= 0x70) && (sshdr->response_code & 1)); |
25 | } |
26 | |
27 | extern bool scsi_get_sense_info_fld(const u8 *sense_buffer, int sb_len, |
28 | u64 *info_out); |
29 | |
30 | extern int scsi_ioctl_reset(struct scsi_device *, int __user *); |
31 | |
32 | struct scsi_eh_save { |
33 | /* saved state */ |
34 | int result; |
35 | unsigned int resid_len; |
36 | int eh_eflags; |
37 | enum dma_data_direction data_direction; |
38 | unsigned underflow; |
39 | unsigned char cmd_len; |
40 | unsigned char prot_op; |
41 | unsigned char cmnd[32]; |
42 | struct scsi_data_buffer sdb; |
43 | struct scatterlist sense_sgl; |
44 | }; |
45 | |
46 | extern void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, |
47 | struct scsi_eh_save *ses, unsigned char *cmnd, |
48 | int cmnd_size, unsigned sense_bytes); |
49 | |
50 | extern void scsi_eh_restore_cmnd(struct scsi_cmnd* scmd, |
51 | struct scsi_eh_save *ses); |
52 | |
53 | #endif /* _SCSI_SCSI_EH_H */ |
54 | |