0001
0002
0003
0004
0005
0006 #ifndef _SCSI_COMMON_H_
0007 #define _SCSI_COMMON_H_
0008
0009 #include <linux/types.h>
0010 #include <scsi/scsi_proto.h>
0011
0012 static inline unsigned
0013 scsi_varlen_cdb_length(const void *hdr)
0014 {
0015 return ((struct scsi_varlen_cdb_hdr *)hdr)->additional_cdb_length + 8;
0016 }
0017
0018 extern const unsigned char scsi_command_size_tbl[8];
0019 #define COMMAND_SIZE(opcode) scsi_command_size_tbl[((opcode) >> 5) & 7]
0020
0021 static inline unsigned
0022 scsi_command_size(const unsigned char *cmnd)
0023 {
0024 return (cmnd[0] == VARIABLE_LENGTH_CMD) ?
0025 scsi_varlen_cdb_length(cmnd) : COMMAND_SIZE(cmnd[0]);
0026 }
0027
0028 static inline unsigned char
0029 scsi_command_control(const unsigned char *cmnd)
0030 {
0031 return (cmnd[0] == VARIABLE_LENGTH_CMD) ?
0032 cmnd[1] : cmnd[COMMAND_SIZE(cmnd[0]) - 1];
0033 }
0034
0035
0036 extern const char *scsi_device_type(unsigned type);
0037
0038 extern void int_to_scsilun(u64, struct scsi_lun *);
0039 extern u64 scsilun_to_int(struct scsi_lun *);
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050 struct scsi_sense_hdr {
0051 u8 response_code;
0052 u8 sense_key;
0053 u8 asc;
0054 u8 ascq;
0055 u8 byte4;
0056 u8 byte5;
0057 u8 byte6;
0058 u8 additional_length;
0059 };
0060
0061 static inline bool scsi_sense_valid(const struct scsi_sense_hdr *sshdr)
0062 {
0063 if (!sshdr)
0064 return false;
0065
0066 return (sshdr->response_code & 0x70) == 0x70;
0067 }
0068
0069 extern bool scsi_normalize_sense(const u8 *sense_buffer, int sb_len,
0070 struct scsi_sense_hdr *sshdr);
0071
0072 extern void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq);
0073 int scsi_set_sense_information(u8 *buf, int buf_len, u64 info);
0074 int scsi_set_sense_field_pointer(u8 *buf, int buf_len, u16 fp, u8 bp, bool cd);
0075 extern const u8 * scsi_sense_desc_find(const u8 * sense_buffer, int sb_len,
0076 int desc_type);
0077
0078 #endif