xref: /linux/include/uapi/linux/virtio_scsi.h (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
1106d81f5SMichael S. Tsirkin /*
2106d81f5SMichael S. Tsirkin  * This header is BSD licensed so anyone can use the definitions to implement
3106d81f5SMichael S. Tsirkin  * compatible drivers/servers.
4106d81f5SMichael S. Tsirkin  *
5106d81f5SMichael S. Tsirkin  * Redistribution and use in source and binary forms, with or without
6106d81f5SMichael S. Tsirkin  * modification, are permitted provided that the following conditions
7106d81f5SMichael S. Tsirkin  * are met:
8106d81f5SMichael S. Tsirkin  * 1. Redistributions of source code must retain the above copyright
9106d81f5SMichael S. Tsirkin  *    notice, this list of conditions and the following disclaimer.
10106d81f5SMichael S. Tsirkin  * 2. Redistributions in binary form must reproduce the above copyright
11106d81f5SMichael S. Tsirkin  *    notice, this list of conditions and the following disclaimer in the
12106d81f5SMichael S. Tsirkin  *    documentation and/or other materials provided with the distribution.
13106d81f5SMichael S. Tsirkin  *
14106d81f5SMichael S. Tsirkin  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15106d81f5SMichael S. Tsirkin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16106d81f5SMichael S. Tsirkin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17106d81f5SMichael S. Tsirkin  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
18106d81f5SMichael S. Tsirkin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19106d81f5SMichael S. Tsirkin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20106d81f5SMichael S. Tsirkin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21106d81f5SMichael S. Tsirkin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22106d81f5SMichael S. Tsirkin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23106d81f5SMichael S. Tsirkin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24106d81f5SMichael S. Tsirkin  * SUCH DAMAGE.
25106d81f5SMichael S. Tsirkin  */
26106d81f5SMichael S. Tsirkin 
27106d81f5SMichael S. Tsirkin #ifndef _LINUX_VIRTIO_SCSI_H
28106d81f5SMichael S. Tsirkin #define _LINUX_VIRTIO_SCSI_H
29106d81f5SMichael S. Tsirkin 
30106d81f5SMichael S. Tsirkin #include <linux/virtio_types.h>
31106d81f5SMichael S. Tsirkin 
32a4994b81SMichael S. Tsirkin /* Default values of the CDB and sense data size configuration fields */
33a4994b81SMichael S. Tsirkin #define VIRTIO_SCSI_CDB_DEFAULT_SIZE   32
34a4994b81SMichael S. Tsirkin #define VIRTIO_SCSI_SENSE_DEFAULT_SIZE 96
35a4994b81SMichael S. Tsirkin 
36a4994b81SMichael S. Tsirkin #ifndef VIRTIO_SCSI_CDB_SIZE
37a4994b81SMichael S. Tsirkin #define VIRTIO_SCSI_CDB_SIZE VIRTIO_SCSI_CDB_DEFAULT_SIZE
38a4994b81SMichael S. Tsirkin #endif
39a4994b81SMichael S. Tsirkin #ifndef VIRTIO_SCSI_SENSE_SIZE
40a4994b81SMichael S. Tsirkin #define VIRTIO_SCSI_SENSE_SIZE VIRTIO_SCSI_SENSE_DEFAULT_SIZE
41a4994b81SMichael S. Tsirkin #endif
42106d81f5SMichael S. Tsirkin 
43106d81f5SMichael S. Tsirkin /* SCSI command request, followed by data-out */
44106d81f5SMichael S. Tsirkin struct virtio_scsi_cmd_req {
45fba7f020SMichael S. Tsirkin 	__u8 lun[8];		/* Logical Unit Number */
46106d81f5SMichael S. Tsirkin 	__virtio64 tag;		/* Command identifier */
47fba7f020SMichael S. Tsirkin 	__u8 task_attr;		/* Task attribute */
48fba7f020SMichael S. Tsirkin 	__u8 prio;		/* SAM command priority field */
49fba7f020SMichael S. Tsirkin 	__u8 crn;
50fba7f020SMichael S. Tsirkin 	__u8 cdb[VIRTIO_SCSI_CDB_SIZE];
51fba7f020SMichael S. Tsirkin } __attribute__((packed));
52106d81f5SMichael S. Tsirkin 
53106d81f5SMichael S. Tsirkin /* SCSI command request, followed by protection information */
54106d81f5SMichael S. Tsirkin struct virtio_scsi_cmd_req_pi {
55fba7f020SMichael S. Tsirkin 	__u8 lun[8];		/* Logical Unit Number */
56106d81f5SMichael S. Tsirkin 	__virtio64 tag;		/* Command identifier */
57fba7f020SMichael S. Tsirkin 	__u8 task_attr;		/* Task attribute */
58fba7f020SMichael S. Tsirkin 	__u8 prio;		/* SAM command priority field */
59fba7f020SMichael S. Tsirkin 	__u8 crn;
60106d81f5SMichael S. Tsirkin 	__virtio32 pi_bytesout;	/* DataOUT PI Number of bytes */
61106d81f5SMichael S. Tsirkin 	__virtio32 pi_bytesin;		/* DataIN PI Number of bytes */
62fba7f020SMichael S. Tsirkin 	__u8 cdb[VIRTIO_SCSI_CDB_SIZE];
63fba7f020SMichael S. Tsirkin } __attribute__((packed));
64106d81f5SMichael S. Tsirkin 
65106d81f5SMichael S. Tsirkin /* Response, followed by sense data and data-in */
66106d81f5SMichael S. Tsirkin struct virtio_scsi_cmd_resp {
67106d81f5SMichael S. Tsirkin 	__virtio32 sense_len;		/* Sense data length */
68106d81f5SMichael S. Tsirkin 	__virtio32 resid;		/* Residual bytes in data buffer */
69106d81f5SMichael S. Tsirkin 	__virtio16 status_qualifier;	/* Status qualifier */
70fba7f020SMichael S. Tsirkin 	__u8 status;		/* Command completion status */
71fba7f020SMichael S. Tsirkin 	__u8 response;		/* Response values */
72fba7f020SMichael S. Tsirkin 	__u8 sense[VIRTIO_SCSI_SENSE_SIZE];
73fba7f020SMichael S. Tsirkin } __attribute__((packed));
74106d81f5SMichael S. Tsirkin 
75106d81f5SMichael S. Tsirkin /* Task Management Request */
76106d81f5SMichael S. Tsirkin struct virtio_scsi_ctrl_tmf_req {
77106d81f5SMichael S. Tsirkin 	__virtio32 type;
78106d81f5SMichael S. Tsirkin 	__virtio32 subtype;
79fba7f020SMichael S. Tsirkin 	__u8 lun[8];
80106d81f5SMichael S. Tsirkin 	__virtio64 tag;
81fba7f020SMichael S. Tsirkin } __attribute__((packed));
82106d81f5SMichael S. Tsirkin 
83106d81f5SMichael S. Tsirkin struct virtio_scsi_ctrl_tmf_resp {
84fba7f020SMichael S. Tsirkin 	__u8 response;
85fba7f020SMichael S. Tsirkin } __attribute__((packed));
86106d81f5SMichael S. Tsirkin 
87106d81f5SMichael S. Tsirkin /* Asynchronous notification query/subscription */
88106d81f5SMichael S. Tsirkin struct virtio_scsi_ctrl_an_req {
89106d81f5SMichael S. Tsirkin 	__virtio32 type;
90fba7f020SMichael S. Tsirkin 	__u8 lun[8];
91106d81f5SMichael S. Tsirkin 	__virtio32 event_requested;
92fba7f020SMichael S. Tsirkin } __attribute__((packed));
93106d81f5SMichael S. Tsirkin 
94106d81f5SMichael S. Tsirkin struct virtio_scsi_ctrl_an_resp {
95106d81f5SMichael S. Tsirkin 	__virtio32 event_actual;
96fba7f020SMichael S. Tsirkin 	__u8 response;
97fba7f020SMichael S. Tsirkin } __attribute__((packed));
98106d81f5SMichael S. Tsirkin 
99106d81f5SMichael S. Tsirkin struct virtio_scsi_event {
100106d81f5SMichael S. Tsirkin 	__virtio32 event;
101fba7f020SMichael S. Tsirkin 	__u8 lun[8];
102106d81f5SMichael S. Tsirkin 	__virtio32 reason;
103fba7f020SMichael S. Tsirkin } __attribute__((packed));
104106d81f5SMichael S. Tsirkin 
105106d81f5SMichael S. Tsirkin struct virtio_scsi_config {
106*965b5350SMichael S. Tsirkin 	__virtio32 num_queues;
107*965b5350SMichael S. Tsirkin 	__virtio32 seg_max;
108*965b5350SMichael S. Tsirkin 	__virtio32 max_sectors;
109*965b5350SMichael S. Tsirkin 	__virtio32 cmd_per_lun;
110*965b5350SMichael S. Tsirkin 	__virtio32 event_info_size;
111*965b5350SMichael S. Tsirkin 	__virtio32 sense_size;
112*965b5350SMichael S. Tsirkin 	__virtio32 cdb_size;
113*965b5350SMichael S. Tsirkin 	__virtio16 max_channel;
114*965b5350SMichael S. Tsirkin 	__virtio16 max_target;
115*965b5350SMichael S. Tsirkin 	__virtio32 max_lun;
116fba7f020SMichael S. Tsirkin } __attribute__((packed));
117106d81f5SMichael S. Tsirkin 
118106d81f5SMichael S. Tsirkin /* Feature Bits */
119106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_F_INOUT                    0
120106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_F_HOTPLUG                  1
121106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_F_CHANGE                   2
122106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_F_T10_PI                   3
123106d81f5SMichael S. Tsirkin 
124106d81f5SMichael S. Tsirkin /* Response codes */
125106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_OK                       0
126106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_OVERRUN                  1
127106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_ABORTED                  2
128106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_BAD_TARGET               3
129106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_RESET                    4
130106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_BUSY                     5
131106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_TRANSPORT_FAILURE        6
132106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_TARGET_FAILURE           7
133106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_NEXUS_FAILURE            8
134106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_FAILURE                  9
135106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_FUNCTION_SUCCEEDED       10
136106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_FUNCTION_REJECTED        11
137106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_INCORRECT_LUN            12
138106d81f5SMichael S. Tsirkin 
139106d81f5SMichael S. Tsirkin /* Controlq type codes.  */
140106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF                      0
141106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_AN_QUERY                 1
142106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_AN_SUBSCRIBE             2
143106d81f5SMichael S. Tsirkin 
144106d81f5SMichael S. Tsirkin /* Valid TMF subtypes.  */
145106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_ABORT_TASK           0
146106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_ABORT_TASK_SET       1
147106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_CLEAR_ACA            2
148106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_CLEAR_TASK_SET       3
149106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_I_T_NEXUS_RESET      4
150106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET   5
151106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_QUERY_TASK           6
152106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_QUERY_TASK_SET       7
153106d81f5SMichael S. Tsirkin 
154106d81f5SMichael S. Tsirkin /* Events.  */
155106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_EVENTS_MISSED            0x80000000
156106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_NO_EVENT                 0
157106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TRANSPORT_RESET          1
158106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_ASYNC_NOTIFY             2
159106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_PARAM_CHANGE             3
160106d81f5SMichael S. Tsirkin 
161106d81f5SMichael S. Tsirkin /* Reasons of transport reset event */
162106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_EVT_RESET_HARD             0
163106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_EVT_RESET_RESCAN           1
164106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_EVT_RESET_REMOVED          2
165106d81f5SMichael S. Tsirkin 
166106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_SIMPLE                   0
167106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_ORDERED                  1
168106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_HEAD                     2
169106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_ACA                      3
170106d81f5SMichael S. Tsirkin 
171106d81f5SMichael S. Tsirkin 
172106d81f5SMichael S. Tsirkin #endif /* _LINUX_VIRTIO_SCSI_H */
173