| /* SPDX-License-Identifier: GPL-2.0 */ | 
 | #ifndef __USB_UAS_H__ | 
 | #define __USB_UAS_H__ | 
 |  | 
 | #include <scsi/scsi.h> | 
 | #include <scsi/scsi_cmnd.h> | 
 |  | 
 | /* Common header for all IUs */ | 
 | struct iu { | 
 | 	__u8 iu_id; | 
 | 	__u8 rsvd1; | 
 | 	__be16 tag; | 
 | } __attribute__((__packed__)); | 
 |  | 
 | enum { | 
 | 	IU_ID_COMMAND		= 0x01, | 
 | 	IU_ID_STATUS		= 0x03, | 
 | 	IU_ID_RESPONSE		= 0x04, | 
 | 	IU_ID_TASK_MGMT		= 0x05, | 
 | 	IU_ID_READ_READY	= 0x06, | 
 | 	IU_ID_WRITE_READY	= 0x07, | 
 | }; | 
 |  | 
 | enum { | 
 | 	TMF_ABORT_TASK          = 0x01, | 
 | 	TMF_ABORT_TASK_SET      = 0x02, | 
 | 	TMF_CLEAR_TASK_SET      = 0x04, | 
 | 	TMF_LOGICAL_UNIT_RESET  = 0x08, | 
 | 	TMF_I_T_NEXUS_RESET     = 0x10, | 
 | 	TMF_CLEAR_ACA           = 0x40, | 
 | 	TMF_QUERY_TASK          = 0x80, | 
 | 	TMF_QUERY_TASK_SET      = 0x81, | 
 | 	TMF_QUERY_ASYNC_EVENT   = 0x82, | 
 | }; | 
 |  | 
 | enum { | 
 | 	RC_TMF_COMPLETE         = 0x00, | 
 | 	RC_INVALID_INFO_UNIT    = 0x02, | 
 | 	RC_TMF_NOT_SUPPORTED    = 0x04, | 
 | 	RC_TMF_FAILED           = 0x05, | 
 | 	RC_TMF_SUCCEEDED        = 0x08, | 
 | 	RC_INCORRECT_LUN        = 0x09, | 
 | 	RC_OVERLAPPED_TAG       = 0x0a, | 
 | }; | 
 |  | 
 | struct command_iu { | 
 | 	__u8 iu_id; | 
 | 	__u8 rsvd1; | 
 | 	__be16 tag; | 
 | 	__u8 prio_attr; | 
 | 	__u8 rsvd5; | 
 | 	__u8 len; | 
 | 	__u8 rsvd7; | 
 | 	struct scsi_lun lun; | 
 | 	__u8 cdb[16];	/* XXX: Overflow-checking tools may misunderstand */ | 
 | } __attribute__((__packed__)); | 
 |  | 
 | struct task_mgmt_iu { | 
 | 	__u8 iu_id; | 
 | 	__u8 rsvd1; | 
 | 	__be16 tag; | 
 | 	__u8 function; | 
 | 	__u8 rsvd2; | 
 | 	__be16 task_tag; | 
 | 	struct scsi_lun lun; | 
 | } __attribute__((__packed__)); | 
 |  | 
 | /* | 
 |  * Also used for the Read Ready and Write Ready IUs since they have the | 
 |  * same first four bytes | 
 |  */ | 
 | struct sense_iu { | 
 | 	__u8 iu_id; | 
 | 	__u8 rsvd1; | 
 | 	__be16 tag; | 
 | 	__be16 status_qual; | 
 | 	__u8 status; | 
 | 	__u8 rsvd7[7]; | 
 | 	__be16 len; | 
 | 	__u8 sense[SCSI_SENSE_BUFFERSIZE]; | 
 | } __attribute__((__packed__)); | 
 |  | 
 | struct response_iu { | 
 | 	__u8 iu_id; | 
 | 	__u8 rsvd1; | 
 | 	__be16 tag; | 
 | 	__u8 add_response_info[3]; | 
 | 	__u8 response_code; | 
 | } __attribute__((__packed__)); | 
 |  | 
 | struct usb_pipe_usage_descriptor { | 
 | 	__u8  bLength; | 
 | 	__u8  bDescriptorType; | 
 |  | 
 | 	__u8  bPipeID; | 
 | 	__u8  Reserved; | 
 | } __attribute__((__packed__)); | 
 |  | 
 | enum { | 
 | 	CMD_PIPE_ID		= 1, | 
 | 	STATUS_PIPE_ID		= 2, | 
 | 	DATA_IN_PIPE_ID		= 3, | 
 | 	DATA_OUT_PIPE_ID	= 4, | 
 |  | 
 | 	UAS_SIMPLE_TAG		= 0, | 
 | 	UAS_HEAD_TAG		= 1, | 
 | 	UAS_ORDERED_TAG		= 2, | 
 | 	UAS_ACA			= 4, | 
 | }; | 
 | #endif |