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