LCOV - code coverage report
Current view: top level - include/scsi - scsi_eh.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 4 4 100.0 %
Date: 2017-01-25 Functions: 2 2 100.0 %

          Line data    Source code
       1             : #ifndef _SCSI_SCSI_EH_H
       2             : #define _SCSI_SCSI_EH_H
       3             : 
       4             : #include <linux/scatterlist.h>
       5             : 
       6             : #include <scsi/scsi_cmnd.h>
       7             : struct scsi_device;
       8             : struct Scsi_Host;
       9             : 
      10             : /*
      11             :  * This is a slightly modified SCSI sense "descriptor" format header.
      12             :  * The addition is to allow the 0x70 and 0x71 response codes. The idea
      13             :  * is to place the salient data from either "fixed" or "descriptor" sense
      14             :  * format into one structure to ease application processing.
      15             :  *
      16             :  * The original sense buffer should be kept around for those cases
      17             :  * in which more information is required (e.g. the LBA of a MEDIUM ERROR).
      18             :  */
      19             : struct scsi_sense_hdr {         /* See SPC-3 section 4.5 */
      20             :         u8 response_code;       /* permit: 0x0, 0x70, 0x71, 0x72, 0x73 */
      21             :         u8 sense_key;
      22             :         u8 asc;
      23             :         u8 ascq;
      24             :         u8 byte4;
      25             :         u8 byte5;
      26             :         u8 byte6;
      27             :         u8 additional_length;   /* always 0 for fixed sense format */
      28             : };
      29             : 
      30             : static inline int scsi_sense_valid(struct scsi_sense_hdr *sshdr)
      31             : {
      32         282 :         if (!sshdr)
      33         141 :                 return 0;
      34             : 
      35         282 :         return (sshdr->response_code & 0x70) == 0x70;
      36             : }
      37             : 
      38             : 
      39             : extern void scsi_eh_finish_cmd(struct scsi_cmnd *scmd,
      40             :                                struct list_head *done_q);
      41             : extern void scsi_eh_flush_done_q(struct list_head *done_q);
      42             : extern void scsi_report_bus_reset(struct Scsi_Host *, int);
      43             : extern void scsi_report_device_reset(struct Scsi_Host *, int, int);
      44             : extern int scsi_block_when_processing_errors(struct scsi_device *);
      45             : extern int scsi_normalize_sense(const u8 *sense_buffer, int sb_len,
      46             :                 struct scsi_sense_hdr *sshdr);
      47             : extern int scsi_command_normalize_sense(struct scsi_cmnd *cmd,
      48             :                 struct scsi_sense_hdr *sshdr);
      49             : 
      50             : static inline int scsi_sense_is_deferred(struct scsi_sense_hdr *sshdr)
      51             : {
      52          56 :         return ((sshdr->response_code >= 0x70) && (sshdr->response_code & 1));
      53             : }
      54             : 
      55             : extern const u8 * scsi_sense_desc_find(const u8 * sense_buffer, int sb_len,
      56             :                                        int desc_type);
      57             : 
      58             : extern int scsi_get_sense_info_fld(const u8 * sense_buffer, int sb_len,
      59             :                                    u64 * info_out);
      60             : 
      61             : extern void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq);
      62             : 
      63             : /*
      64             :  * Reset request from external source
      65             :  */
      66             : #define SCSI_TRY_RESET_DEVICE   1
      67             : #define SCSI_TRY_RESET_BUS      2
      68             : #define SCSI_TRY_RESET_HOST     3
      69             : #define SCSI_TRY_RESET_TARGET   4
      70             : 
      71             : extern int scsi_reset_provider(struct scsi_device *, int);
      72             : 
      73             : struct scsi_eh_save {
      74             :         /* saved state */
      75             :         int result;
      76             :         enum dma_data_direction data_direction;
      77             :         unsigned underflow;
      78             :         unsigned char cmd_len;
      79             :         unsigned char prot_op;
      80             :         unsigned char *cmnd;
      81             :         struct scsi_data_buffer sdb;
      82             :         struct request *next_rq;
      83             :         /* new command support */
      84             :         unsigned char eh_cmnd[BLK_MAX_CDB];
      85             :         struct scatterlist sense_sgl;
      86             : };
      87             : 
      88             : extern void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd,
      89             :                 struct scsi_eh_save *ses, unsigned char *cmnd,
      90             :                 int cmnd_size, unsigned sense_bytes);
      91             : 
      92             : extern void scsi_eh_restore_cmnd(struct scsi_cmnd* scmd,
      93             :                 struct scsi_eh_save *ses);
      94             : 
      95             : #endif /* _SCSI_SCSI_EH_H */

Generated by: LCOV version 1.10