1 /*
2  * This header is BSD licensed so anyone can use the definitions to implement
3  * compatible drivers/servers.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 
27 #ifndef _LINUX_VIRTIO_SCSI_H
28 #define _LINUX_VIRTIO_SCSI_H
29 
30 #include "standard-headers/linux/virtio_types.h"
31 
32 #define VIRTIO_SCSI_CDB_SIZE   32
33 #define VIRTIO_SCSI_SENSE_SIZE 96
34 
35 /* SCSI command request, followed by data-out */
36 struct virtio_scsi_cmd_req {
37 	uint8_t lun[8];		/* Logical Unit Number */
38 	__virtio64 tag;		/* Command identifier */
39 	uint8_t task_attr;		/* Task attribute */
40 	uint8_t prio;		/* SAM command priority field */
41 	uint8_t crn;
42 	uint8_t cdb[VIRTIO_SCSI_CDB_SIZE];
43 } QEMU_PACKED;
44 
45 /* SCSI command request, followed by protection information */
46 struct virtio_scsi_cmd_req_pi {
47 	uint8_t lun[8];		/* Logical Unit Number */
48 	__virtio64 tag;		/* Command identifier */
49 	uint8_t task_attr;		/* Task attribute */
50 	uint8_t prio;		/* SAM command priority field */
51 	uint8_t crn;
52 	__virtio32 pi_bytesout;	/* DataOUT PI Number of bytes */
53 	__virtio32 pi_bytesin;		/* DataIN PI Number of bytes */
54 	uint8_t cdb[VIRTIO_SCSI_CDB_SIZE];
55 } QEMU_PACKED;
56 
57 /* Response, followed by sense data and data-in */
58 struct virtio_scsi_cmd_resp {
59 	__virtio32 sense_len;		/* Sense data length */
60 	__virtio32 resid;		/* Residual bytes in data buffer */
61 	__virtio16 status_qualifier;	/* Status qualifier */
62 	uint8_t status;		/* Command completion status */
63 	uint8_t response;		/* Response values */
64 	uint8_t sense[VIRTIO_SCSI_SENSE_SIZE];
65 } QEMU_PACKED;
66 
67 /* Task Management Request */
68 struct virtio_scsi_ctrl_tmf_req {
69 	__virtio32 type;
70 	__virtio32 subtype;
71 	uint8_t lun[8];
72 	__virtio64 tag;
73 } QEMU_PACKED;
74 
75 struct virtio_scsi_ctrl_tmf_resp {
76 	uint8_t response;
77 } QEMU_PACKED;
78 
79 /* Asynchronous notification query/subscription */
80 struct virtio_scsi_ctrl_an_req {
81 	__virtio32 type;
82 	uint8_t lun[8];
83 	__virtio32 event_requested;
84 } QEMU_PACKED;
85 
86 struct virtio_scsi_ctrl_an_resp {
87 	__virtio32 event_actual;
88 	uint8_t response;
89 } QEMU_PACKED;
90 
91 struct virtio_scsi_event {
92 	__virtio32 event;
93 	uint8_t lun[8];
94 	__virtio32 reason;
95 } QEMU_PACKED;
96 
97 struct virtio_scsi_config {
98 	uint32_t num_queues;
99 	uint32_t seg_max;
100 	uint32_t max_sectors;
101 	uint32_t cmd_per_lun;
102 	uint32_t event_info_size;
103 	uint32_t sense_size;
104 	uint32_t cdb_size;
105 	uint16_t max_channel;
106 	uint16_t max_target;
107 	uint32_t max_lun;
108 } QEMU_PACKED;
109 
110 /* Feature Bits */
111 #define VIRTIO_SCSI_F_INOUT                    0
112 #define VIRTIO_SCSI_F_HOTPLUG                  1
113 #define VIRTIO_SCSI_F_CHANGE                   2
114 #define VIRTIO_SCSI_F_T10_PI                   3
115 
116 /* Response codes */
117 #define VIRTIO_SCSI_S_OK                       0
118 #define VIRTIO_SCSI_S_OVERRUN                  1
119 #define VIRTIO_SCSI_S_ABORTED                  2
120 #define VIRTIO_SCSI_S_BAD_TARGET               3
121 #define VIRTIO_SCSI_S_RESET                    4
122 #define VIRTIO_SCSI_S_BUSY                     5
123 #define VIRTIO_SCSI_S_TRANSPORT_FAILURE        6
124 #define VIRTIO_SCSI_S_TARGET_FAILURE           7
125 #define VIRTIO_SCSI_S_NEXUS_FAILURE            8
126 #define VIRTIO_SCSI_S_FAILURE                  9
127 #define VIRTIO_SCSI_S_FUNCTION_SUCCEEDED       10
128 #define VIRTIO_SCSI_S_FUNCTION_REJECTED        11
129 #define VIRTIO_SCSI_S_INCORRECT_LUN            12
130 
131 /* Controlq type codes.  */
132 #define VIRTIO_SCSI_T_TMF                      0
133 #define VIRTIO_SCSI_T_AN_QUERY                 1
134 #define VIRTIO_SCSI_T_AN_SUBSCRIBE             2
135 
136 /* Valid TMF subtypes.  */
137 #define VIRTIO_SCSI_T_TMF_ABORT_TASK           0
138 #define VIRTIO_SCSI_T_TMF_ABORT_TASK_SET       1
139 #define VIRTIO_SCSI_T_TMF_CLEAR_ACA            2
140 #define VIRTIO_SCSI_T_TMF_CLEAR_TASK_SET       3
141 #define VIRTIO_SCSI_T_TMF_I_T_NEXUS_RESET      4
142 #define VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET   5
143 #define VIRTIO_SCSI_T_TMF_QUERY_TASK           6
144 #define VIRTIO_SCSI_T_TMF_QUERY_TASK_SET       7
145 
146 /* Events.  */
147 #define VIRTIO_SCSI_T_EVENTS_MISSED            0x80000000
148 #define VIRTIO_SCSI_T_NO_EVENT                 0
149 #define VIRTIO_SCSI_T_TRANSPORT_RESET          1
150 #define VIRTIO_SCSI_T_ASYNC_NOTIFY             2
151 #define VIRTIO_SCSI_T_PARAM_CHANGE             3
152 
153 /* Reasons of transport reset event */
154 #define VIRTIO_SCSI_EVT_RESET_HARD             0
155 #define VIRTIO_SCSI_EVT_RESET_RESCAN           1
156 #define VIRTIO_SCSI_EVT_RESET_REMOVED          2
157 
158 #define VIRTIO_SCSI_S_SIMPLE                   0
159 #define VIRTIO_SCSI_S_ORDERED                  1
160 #define VIRTIO_SCSI_S_HEAD                     2
161 #define VIRTIO_SCSI_S_ACA                      3
162 
163 
164 #endif /* _LINUX_VIRTIO_SCSI_H */
165