1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __USB_UAS_H__ 3 #define __USB_UAS_H__ 4 5 #include <scsi/scsi.h> 6 #include <scsi/scsi_cmnd.h> 7 8 /* Common header for all IUs */ 9 struct iu { 10 __u8 iu_id; 11 __u8 rsvd1; 12 __be16 tag; 13 } __attribute__((__packed__)); 14 15 enum { 16 IU_ID_COMMAND = 0x01, 17 IU_ID_STATUS = 0x03, 18 IU_ID_RESPONSE = 0x04, 19 IU_ID_TASK_MGMT = 0x05, 20 IU_ID_READ_READY = 0x06, 21 IU_ID_WRITE_READY = 0x07, 22 }; 23 24 enum { 25 TMF_ABORT_TASK = 0x01, 26 TMF_ABORT_TASK_SET = 0x02, 27 TMF_CLEAR_TASK_SET = 0x04, 28 TMF_LOGICAL_UNIT_RESET = 0x08, 29 TMF_I_T_NEXUS_RESET = 0x10, 30 TMF_CLEAR_ACA = 0x40, 31 TMF_QUERY_TASK = 0x80, 32 TMF_QUERY_TASK_SET = 0x81, 33 TMF_QUERY_ASYNC_EVENT = 0x82, 34 }; 35 36 enum { 37 RC_TMF_COMPLETE = 0x00, 38 RC_INVALID_INFO_UNIT = 0x02, 39 RC_TMF_NOT_SUPPORTED = 0x04, 40 RC_TMF_FAILED = 0x05, 41 RC_TMF_SUCCEEDED = 0x08, 42 RC_INCORRECT_LUN = 0x09, 43 RC_OVERLAPPED_TAG = 0x0a, 44 }; 45 46 struct command_iu { 47 __u8 iu_id; 48 __u8 rsvd1; 49 __be16 tag; 50 __u8 prio_attr; 51 __u8 rsvd5; 52 __u8 len; 53 __u8 rsvd7; 54 struct scsi_lun lun; 55 __u8 cdb[16]; /* XXX: Overflow-checking tools may misunderstand */ 56 } __attribute__((__packed__)); 57 58 struct task_mgmt_iu { 59 __u8 iu_id; 60 __u8 rsvd1; 61 __be16 tag; 62 __u8 function; 63 __u8 rsvd2; 64 __be16 task_tag; 65 struct scsi_lun lun; 66 } __attribute__((__packed__)); 67 68 /* 69 * Also used for the Read Ready and Write Ready IUs since they have the 70 * same first four bytes 71 */ 72 struct sense_iu { 73 __u8 iu_id; 74 __u8 rsvd1; 75 __be16 tag; 76 __be16 status_qual; 77 __u8 status; 78 __u8 rsvd7[7]; 79 __be16 len; 80 __u8 sense[SCSI_SENSE_BUFFERSIZE]; 81 } __attribute__((__packed__)); 82 83 struct response_iu { 84 __u8 iu_id; 85 __u8 rsvd1; 86 __be16 tag; 87 __u8 add_response_info[3]; 88 __u8 response_code; 89 } __attribute__((__packed__)); 90 91 struct usb_pipe_usage_descriptor { 92 __u8 bLength; 93 __u8 bDescriptorType; 94 95 __u8 bPipeID; 96 __u8 Reserved; 97 } __attribute__((__packed__)); 98 99 enum { 100 CMD_PIPE_ID = 1, 101 STATUS_PIPE_ID = 2, 102 DATA_IN_PIPE_ID = 3, 103 DATA_OUT_PIPE_ID = 4, 104 105 UAS_SIMPLE_TAG = 0, 106 UAS_HEAD_TAG = 1, 107 UAS_ORDERED_TAG = 2, 108 UAS_ACA = 4, 109 }; 110 #endif 111