scsi_all.h
来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 921 行 · 第 1/2 页
H
921 行
* does not mean that the device is * ready for access by the initiator. */#define SID_QUAL_LU_OFFLINE 0x01 /* The target is capable of supporting * the specified peripheral device type * on this logical unit; however, the * physical device is not currently * connected to this logical unit. */#define SID_QUAL_RSVD 0x02#define SID_QUAL_BAD_LU 0x03 /* The target is not capable of * supporting a physical device on * this logical unit. For this * peripheral qualifier the peripheral * device type shall be set to 1Fh to * provide compatibility with previous * versions of SCSI. All other * peripheral device type values are * reserved for this peripheral * qualifier. */#define SID_QUAL_IS_VENDOR_UNIQUE(inq_data) ((SID_QUAL(inq_data) & 0x08) != 0) u_int8_t dev_qual2;#define SID_QUAL2 0x7F#define SID_IS_REMOVABLE(inq_data) (((inq_data)->dev_qual2 & 0x80) != 0) u_int8_t version;#define SID_ANSI_REV(inq_data) ((inq_data)->version & 0x07)#define SCSI_REV_0 0#define SCSI_REV_CCS 1#define SCSI_REV_2 2#define SCSI_REV_3 3#define SID_ECMA 0x38#define SID_ISO 0xC0 u_int8_t response_format;#define SID_AENC 0x80#define SID_TrmIOP 0x40 u_int8_t additional_length; u_int8_t reserved[2]; u_int8_t flags;#define SID_SftRe 0x01#define SID_CmdQue 0x02#define SID_Linked 0x08#define SID_Sync 0x10#define SID_WBus16 0x20#define SID_WBus32 0x40#define SID_RelAdr 0x80#define SID_VENDOR_SIZE 8 char vendor[SID_VENDOR_SIZE];#define SID_PRODUCT_SIZE 16 char product[SID_PRODUCT_SIZE];#define SID_REVISION_SIZE 4 char revision[SID_REVISION_SIZE];};struct scsi_vpd_unit_serial_number{ u_int8_t device; u_int8_t page_code;#define SVPD_UNIT_SERIAL_NUMBER 0x80 u_int8_t reserved; u_int8_t length; /* serial number length */#define SVPD_SERIAL_NUM_SIZE 251 char serial_num[SVPD_SERIAL_NUM_SIZE];};struct scsi_read_capacity{ u_int8_t opcode; u_int8_t byte2; u_int8_t addr[4]; u_int8_t unused[3]; u_int8_t control;};struct scsi_read_capacity_data{ u_int8_t addr[4]; u_int8_t length[4];};struct scsi_sense_data{ u_int8_t error_code;#define SSD_ERRCODE 0x7F#define SSD_CURRENT_ERROR 0x70#define SSD_DEFERRED_ERROR 0x71#define SSD_ERRCODE_VALID 0x80 u_int8_t segment; u_int8_t flags;#define SSD_KEY 0x0F#define SSD_KEY_NO_SENSE 0x00#define SSD_KEY_RECOVERED_ERROR 0x01#define SSD_KEY_NOT_READY 0x02#define SSD_KEY_MEDIUM_ERROR 0x03#define SSD_KEY_HARDWARE_ERROR 0x04#define SSD_KEY_ILLEGAL_REQUEST 0x05#define SSD_KEY_UNIT_ATTENTION 0x06#define SSD_KEY_DATA_PROTECT 0x07#define SSD_KEY_BLANK_CHECK 0x08#define SSD_KEY_Vendor_Specific 0x09#define SSD_KEY_COPY_ABORTED 0x0a#define SSD_KEY_ABORTED_COMMAND 0x0b #define SSD_KEY_EQUAL 0x0c#define SSD_KEY_VOLUME_OVERFLOW 0x0d#define SSD_KEY_MISCOMPARE 0x0e#define SSD_KEY_RESERVED 0x0f #define SSD_ILI 0x20#define SSD_EOM 0x40#define SSD_FILEMARK 0x80 u_int8_t info[4]; u_int8_t extra_len; u_int8_t cmd_spec_info[4]; u_int8_t add_sense_code; u_int8_t add_sense_code_qual; u_int8_t fru; u_int8_t sense_key_spec[3];#define SSD_SCS_VALID 0x80#define SSD_FIELDPTR_CMD 0x40#define SSD_BITPTR_VALID 0x08#define SSD_BITPTR_VALUE 0x07#define SSD_MIN_SIZE 18 u_int8_t extra_bytes[14];#define SSD_FULL_SIZE sizeof(struct scsi_sense_data)};struct scsi_mode_header_6{ u_int8_t data_length; /* Sense data length */ u_int8_t medium_type; u_int8_t dev_spec; u_int8_t blk_desc_len;};struct scsi_mode_header_10{ u_int8_t data_length[2];/* Sense data length */ u_int8_t medium_type; u_int8_t dev_spec; u_int8_t unused[2]; u_int8_t blk_desc_len[2];};struct scsi_mode_blk_desc{ u_int8_t density; u_int8_t nblocks[3]; u_int8_t reserved; u_int8_t blklen[3];};#define SCSI_DEFAULT_DENSITY 0x00 /* use 'default' density */#define SCSI_SAME_DENSITY 0x7f /* use 'same' density- >= SCSI-2 only *//* * Status Byte */#define SCSI_STATUS_OK 0x00#define SCSI_STATUS_CHECK_COND 0x02#define SCSI_STATUS_COND_MET 0x04#define SCSI_STATUS_BUSY 0x08#define SCSI_STATUS_INTERMED 0x10#define SCSI_STATUS_INTERMED_COND_MET 0x14#define SCSI_STATUS_RESERV_CONFLICT 0x18#define SCSI_STATUS_CMD_TERMINATED 0x22#define SCSI_STATUS_QUEUE_FULL 0x28struct scsi_inquiry_pattern { u_int8_t type; u_int8_t media_type;#define SIP_MEDIA_REMOVABLE 0x01#define SIP_MEDIA_FIXED 0x02 const char *vendor; const char *product; const char *revision;}; struct scsi_static_inquiry_pattern { u_int8_t type; u_int8_t media_type; char vendor[SID_VENDOR_SIZE+1]; char product[SID_PRODUCT_SIZE+1]; char revision[SID_REVISION_SIZE+1];};struct scsi_sense_quirk_entry { struct scsi_inquiry_pattern inq_pat; int num_ascs; struct asc_table_entry *asc_info;};struct asc_table_entry { u_int8_t asc; u_int8_t ascq; u_int32_t action;#if !defined(SCSI_NO_SENSE_STRINGS) const char *desc;#endif};struct op_table_entry { u_int8_t opcode; u_int16_t opmask; const char *desc;};struct scsi_op_quirk_entry { struct scsi_inquiry_pattern inq_pat; int num_ops; struct op_table_entry *op_table;};struct ccb_scsiio;struct cam_periph;union ccb;#ifndef KERNELstruct cam_device;#endifextern const char *scsi_sense_key_text[];__BEGIN_DECLSconst char * scsi_sense_desc(int asc, int ascq, struct scsi_inquiry_data *inq_data);scsi_sense_action scsi_error_action(int asc, int ascq, struct scsi_inquiry_data *inq_data);#ifdef KERNELvoid scsi_sense_print(struct ccb_scsiio *csio);int scsi_interpret_sense(union ccb *ccb, u_int32_t sense_flags, u_int32_t *relsim_flags, u_int32_t *reduction, u_int32_t *timeout, scsi_sense_action error_action);#elsechar * scsi_sense_string(struct cam_device *device, struct ccb_scsiio *csio, char *str, int str_len);void scsi_sense_print(struct cam_device *device, struct ccb_scsiio *csio, FILE *ofile);int scsi_interpret_sense(struct cam_device *device, union ccb *ccb, u_int32_t sense_flags, u_int32_t *relsim_flags, u_int32_t *reduction, u_int32_t *timeout, scsi_sense_action error_action);#endif /* KERNEL */#define SF_RETRY_UA 0x01#define SF_NO_PRINT 0x02#define SF_QUIET_IR 0x04 /* Be quiet about Illegal Request reponses */#define SF_PRINT_ALWAYS 0x08#define SF_RETRY_SELTO 0x10 /* Retry selection timeouts */const char * scsi_op_desc(u_int16_t opcode, struct scsi_inquiry_data *inq_data);char * scsi_cdb_string(u_int8_t *cdb_ptr, char *cdb_string, size_t len);void scsi_print_inquiry(struct scsi_inquiry_data *inq_data);u_int scsi_calc_syncsrate(u_int period_factor);u_int scsi_calc_syncparam(u_int period); void scsi_test_unit_ready(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), u_int8_t tag_action, u_int8_t sense_len, u_int32_t timeout);void scsi_request_sense(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), void *data_ptr, u_int8_t dxfer_len, u_int8_t tag_action, u_int8_t sense_len, u_int32_t timeout);void scsi_inquiry(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), u_int8_t tag_action, u_int8_t *inq_buf, u_int32_t inq_len, int evpd, u_int8_t page_code, u_int8_t sense_len, u_int32_t timeout);void scsi_mode_sense(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), u_int8_t tag_action, int dbd, u_int8_t page_code, u_int8_t page, u_int8_t *param_buf, u_int32_t param_len, u_int8_t sense_len, u_int32_t timeout);void scsi_mode_select(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), u_int8_t tag_action, int scsi_page_fmt, int save_pages, u_int8_t *param_buf, u_int32_t param_len, u_int8_t sense_len, u_int32_t timeout);void scsi_read_capacity(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), u_int8_t tag_action, struct scsi_read_capacity_data *rcap_buf, u_int8_t sense_len, u_int32_t timeout);void scsi_prevent(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), u_int8_t tag_action, u_int8_t action, u_int8_t sense_len, u_int32_t timeout);void scsi_synchronize_cache(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), u_int8_t tag_action, u_int32_t begin_lba, u_int16_t lb_count, u_int8_t sense_len, u_int32_t timeout);void scsi_read_write(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), u_int8_t tag_action, int readop, u_int8_t byte2, int minimum_cmd_size, u_int32_t lba, u_int32_t block_count, u_int8_t *data_ptr, u_int32_t dxfer_len, u_int8_t sense_len, u_int32_t timeout);void scsi_start_stop(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), u_int8_t tag_action, int start, int load_eject, int immediate, u_int8_t sense_len, u_int32_t timeout);int scsi_inquiry_match(caddr_t inqbuffer, caddr_t table_entry);int scsi_static_inquiry_match(caddr_t inqbuffer, caddr_t table_entry);static __inline void scsi_extract_sense(struct scsi_sense_data *sense, int *error_code, int *sense_key, int *asc, int *ascq);static __inline void scsi_ulto2b(u_int32_t val, u_int8_t *bytes);static __inline void scsi_ulto3b(u_int32_t val, u_int8_t *bytes);static __inline void scsi_ulto4b(u_int32_t val, u_int8_t *bytes);static __inline u_int32_t scsi_2btoul(u_int8_t *bytes);static __inline u_int32_t scsi_3btoul(u_int8_t *bytes);static __inline int32_t scsi_3btol(u_int8_t *bytes);static __inline u_int32_t scsi_4btoul(u_int8_t *bytes);static __inline void *find_mode_page_6(struct scsi_mode_header_6 *mode_header);static __inline void *find_mode_page_10(struct scsi_mode_header_10 *mode_header);static __inline void scsi_extract_sense(struct scsi_sense_data *sense, int *error_code, int *sense_key, int *asc, int *ascq){ *error_code = sense->error_code & SSD_ERRCODE; *sense_key = sense->flags & SSD_KEY; *asc = (sense->extra_len >= 5) ? sense->add_sense_code : 0; *ascq = (sense->extra_len >= 6) ? sense->add_sense_code_qual : 0;}static __inline voidscsi_ulto2b(u_int32_t val, u_int8_t *bytes){ bytes[0] = (val >> 8) & 0xff; bytes[1] = val & 0xff;}static __inline voidscsi_ulto3b(u_int32_t val, u_int8_t *bytes){ bytes[0] = (val >> 16) & 0xff; bytes[1] = (val >> 8) & 0xff; bytes[2] = val & 0xff;}static __inline voidscsi_ulto4b(u_int32_t val, u_int8_t *bytes){ bytes[0] = (val >> 24) & 0xff; bytes[1] = (val >> 16) & 0xff; bytes[2] = (val >> 8) & 0xff; bytes[3] = val & 0xff;}static __inline u_int32_tscsi_2btoul(u_int8_t *bytes){ u_int32_t rv; rv = (bytes[0] << 8) | bytes[1]; return (rv);}static __inline u_int32_tscsi_3btoul(u_int8_t *bytes){ u_int32_t rv; rv = (bytes[0] << 16) | (bytes[1] << 8) | bytes[2]; return (rv);}static __inline int32_t scsi_3btol(u_int8_t *bytes){ u_int32_t rc = scsi_3btoul(bytes); if (rc & 0x00800000) rc |= 0xff000000; return (int32_t) rc;}static __inline u_int32_tscsi_4btoul(u_int8_t *bytes){ u_int32_t rv; rv = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]; return (rv);}/* * Given the pointer to a returned mode sense buffer, return a pointer to * the start of the first mode page. */static __inline void *find_mode_page_6(struct scsi_mode_header_6 *mode_header){ void *page_start; page_start = (void *)((u_int8_t *)&mode_header[1] + mode_header->blk_desc_len); return(page_start);}static __inline void *find_mode_page_10(struct scsi_mode_header_10 *mode_header){ void *page_start; page_start = (void *)((u_int8_t *)&mode_header[1] + scsi_2btoul(mode_header->blk_desc_len)); return(page_start);}__END_DECLS#endif /*_SCSI_SCSI_ALL_H*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?