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 + -
显示快捷键?