xref: /OK3568_Linux_fs/kernel/include/linux/usb/uas.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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