1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2009-2012,2017 Microsoft Corp.
5 * Copyright (c) 2012 NetApp Inc.
6 * Copyright (c) 2012 Citrix Inc.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice unmodified, this list of conditions, and the following
14 * disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * $FreeBSD$
31 */
32
33 #ifndef __HV_VSTORAGE_H__
34 #define __HV_VSTORAGE_H__
35
36 /*
37 * Major/minor macros. Minor version is in LSB, meaning that earlier flat
38 * version numbers will be interpreted as "0.x" (i.e., 1 becomes 0.1).
39 */
40
41 #define VMSTOR_PROTOCOL_MAJOR(VERSION_) (((VERSION_) >> 8) & 0xff)
42 #define VMSTOR_PROTOCOL_MINOR(VERSION_) (((VERSION_) ) & 0xff)
43 #define VMSTOR_PROTOCOL_VERSION(MAJOR_, MINOR_) ((((MAJOR_) & 0xff) << 8) | \
44 (((MINOR_) & 0xff) ))
45
46 #define VMSTOR_PROTOCOL_VERSION_WIN6 VMSTOR_PROTOCOL_VERSION(2, 0)
47 #define VMSTOR_PROTOCOL_VERSION_WIN7 VMSTOR_PROTOCOL_VERSION(4, 2)
48 #define VMSTOR_PROTOCOL_VERSION_WIN8 VMSTOR_PROTOCOL_VERSION(5, 1)
49 #define VMSTOR_PROTOCOL_VERSION_WIN8_1 VMSTOR_PROTOCOL_VERSION(6, 0)
50 #define VMSTOR_PROTOCOL_VERSION_WIN10 VMSTOR_PROTOCOL_VERSION(6, 2)
51 /*
52 * Invalid version.
53 */
54 #define VMSTOR_INVALID_PROTOCOL_VERSION -1
55
56 /*
57 * Version history:
58 * V1 Beta 0.1
59 * V1 RC < 2008/1/31 1.0
60 * V1 RC > 2008/1/31 2.0
61 * Win7: 4.2
62 * Win8: 5.1
63 */
64
65 #define VMSTOR_PROTOCOL_VERSION_CURRENT VMSTOR_PROTOCOL_VERSION(5, 1)
66
67 /**
68 * Packet structure ops describing virtual storage requests.
69 */
70 enum vstor_packet_ops {
71 VSTOR_OPERATION_COMPLETEIO = 1,
72 VSTOR_OPERATION_REMOVEDEVICE = 2,
73 VSTOR_OPERATION_EXECUTESRB = 3,
74 VSTOR_OPERATION_RESETLUN = 4,
75 VSTOR_OPERATION_RESETADAPTER = 5,
76 VSTOR_OPERATION_RESETBUS = 6,
77 VSTOR_OPERATION_BEGININITIALIZATION = 7,
78 VSTOR_OPERATION_ENDINITIALIZATION = 8,
79 VSTOR_OPERATION_QUERYPROTOCOLVERSION = 9,
80 VSTOR_OPERATION_QUERYPROPERTIES = 10,
81 VSTOR_OPERATION_ENUMERATE_BUS = 11,
82 VSTOR_OPERATION_FCHBA_DATA = 12,
83 VSTOR_OPERATION_CREATE_MULTI_CHANNELS = 13,
84 VSTOR_OPERATION_MAXIMUM = 13
85 };
86
87
88 /*
89 * Platform neutral description of a scsi request -
90 * this remains the same across the write regardless of 32/64 bit
91 * note: it's patterned off the Windows DDK SCSI_PASS_THROUGH structure
92 */
93
94 #define CDB16GENERIC_LENGTH 0x10
95 #define SENSE_BUFFER_SIZE 0x14
96 #define MAX_DATA_BUFFER_LENGTH_WITH_PADDING 0x14
97
98 #define POST_WIN7_STORVSC_SENSE_BUFFER_SIZE 0x14
99 #define PRE_WIN8_STORVSC_SENSE_BUFFER_SIZE 0x12
100
101
102 struct vmscsi_win8_extension {
103 /*
104 * The following were added in Windows 8
105 */
106 uint16_t reserve;
107 uint8_t queue_tag;
108 uint8_t queue_action;
109 uint32_t srb_flags;
110 uint32_t time_out_value;
111 uint32_t queue_sort_ey;
112 } __packed;
113
114 struct vmscsi_req {
115 uint16_t length;
116 uint8_t srb_status;
117 uint8_t scsi_status;
118
119 /* HBA number, set to the order number detected by initiator. */
120 uint8_t port;
121 /* SCSI bus number or bus_id, different from CAM's path_id. */
122 uint8_t path_id;
123
124 uint8_t target_id;
125 uint8_t lun;
126
127 uint8_t cdb_len;
128 uint8_t sense_info_len;
129 uint8_t data_in;
130 uint8_t reserved;
131
132 uint32_t transfer_len;
133
134 union {
135 uint8_t cdb[CDB16GENERIC_LENGTH];
136
137 uint8_t sense_data[SENSE_BUFFER_SIZE];
138
139 uint8_t reserved_array[MAX_DATA_BUFFER_LENGTH_WITH_PADDING];
140 } u;
141
142 /*
143 * The following was added in win8.
144 */
145 struct vmscsi_win8_extension win8_extension;
146
147 } __packed;
148
149 /**
150 * This structure is sent during the initialization phase to get the different
151 * properties of the channel.
152 */
153
154 struct vmstor_chan_props {
155 uint16_t proto_ver;
156 uint8_t path_id;
157 uint8_t target_id;
158
159 uint16_t max_channel_cnt;
160
161 /**
162 * Note: port number is only really known on the client side
163 */
164 uint16_t port;
165 uint32_t flags;
166 uint32_t max_transfer_bytes;
167
168 /**
169 * This id is unique for each channel and will correspond with
170 * vendor specific data in the inquiry_ata
171 */
172 uint64_t unique_id;
173
174 } __packed;
175
176 /**
177 * This structure is sent during the storage protocol negotiations.
178 */
179
180 struct vmstor_proto_ver
181 {
182 /**
183 * Major (MSW) and minor (LSW) version numbers.
184 */
185 uint16_t major_minor;
186
187 uint16_t revision; /* always zero */
188 } __packed;
189
190 /**
191 * Channel Property Flags
192 */
193
194 #define STORAGE_CHANNEL_REMOVABLE_FLAG 0x1
195 #define STORAGE_CHANNEL_EMULATED_IDE_FLAG 0x2
196
197
198 struct vstor_packet {
199 /**
200 * Requested operation type
201 */
202 enum vstor_packet_ops operation;
203
204 /*
205 * Flags - see below for values
206 */
207 uint32_t flags;
208
209 /**
210 * Status of the request returned from the server side.
211 */
212 uint32_t status;
213
214 union
215 {
216 /**
217 * Structure used to forward SCSI commands from the client to
218 * the server.
219 */
220 struct vmscsi_req vm_srb;
221
222 /**
223 * Structure used to query channel properties.
224 */
225 struct vmstor_chan_props chan_props;
226
227 /**
228 * Used during version negotiations.
229 */
230 struct vmstor_proto_ver version;
231
232 /**
233 * Number of multichannels to create
234 */
235 uint16_t multi_channels_cnt;
236 } u;
237
238 } __packed;
239
240
241 /**
242 * SRB (SCSI Request Block) Status Codes
243 */
244 #define SRB_STATUS_PENDING 0x00
245 #define SRB_STATUS_SUCCESS 0x01
246 #define SRB_STATUS_ABORTED 0x02
247 #define SRB_STATUS_ABORT_FAILED 0x03
248 #define SRB_STATUS_ERROR 0x04
249 #define SRB_STATUS_BUSY 0x05
250 #define SRB_STATUS_INVALID_REQUEST 0x06
251 #define SRB_STATUS_INVALID_PATH_ID 0x07
252 #define SRB_STATUS_NO_DEVICE 0x08
253 #define SRB_STATUS_TIMEOUT 0x09
254 #define SRB_STATUS_SELECTION_TIMEOUT 0x0A
255 #define SRB_STATUS_COMMAND_TIMEOUT 0x0B
256 #define SRB_STATUS_MESSAGE_REJECTED 0x0D
257 #define SRB_STATUS_BUS_RESET 0x0E
258 #define SRB_STATUS_PARITY_ERROR 0x0F
259 #define SRB_STATUS_REQUEST_SENSE_FAILED 0x10
260 #define SRB_STATUS_NO_HBA 0x11
261 #define SRB_STATUS_DATA_OVERRUN 0x12
262 #define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13
263 #define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14
264 #define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15
265 #define SRB_STATUS_REQUEST_FLUSHED 0x16
266 #define SRB_STATUS_INVALID_LUN 0x20
267 #define SRB_STATUS_INVALID_TARGET_ID 0x21
268 #define SRB_STATUS_BAD_FUNCTION 0x22
269 #define SRB_STATUS_ERROR_RECOVERY 0x23
270 #define SRB_STATUS_NOT_POWERED 0x24
271 #define SRB_STATUS_LINK_DOWN 0x25
272 /**
273 * SRB Status Masks (can be combined with above status codes)
274 */
275 #define SRB_STATUS_QUEUE_FROZEN 0x40
276 #define SRB_STATUS_AUTOSENSE_VALID 0x80
277
278 #define SRB_STATUS(status) \
279 ((status) & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
280 /*
281 * SRB Flag Bits
282 */
283
284 #define SRB_FLAGS_QUEUE_ACTION_ENABLE 0x00000002
285 #define SRB_FLAGS_DISABLE_DISCONNECT 0x00000004
286 #define SRB_FLAGS_DISABLE_SYNCH_TRANSFER 0x00000008
287 #define SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x00000010
288 #define SRB_FLAGS_DISABLE_AUTOSENSE 0x00000020
289 #define SRB_FLAGS_DATA_IN 0x00000040
290 #define SRB_FLAGS_DATA_OUT 0x00000080
291 #define SRB_FLAGS_NO_DATA_TRANSFER 0x00000000
292 #define SRB_FLAGS_UNSPECIFIED_DIRECTION (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT)
293 #define SRB_FLAGS_NO_QUEUE_FREEZE 0x00000100
294 #define SRB_FLAGS_ADAPTER_CACHE_ENABLE 0x00000200
295 #define SRB_FLAGS_FREE_SENSE_BUFFER 0x00000400
296 /**
297 * Packet flags
298 */
299
300 /**
301 * This flag indicates that the server should send back a completion for this
302 * packet.
303 */
304 #define REQUEST_COMPLETION_FLAG 0x1
305
306 /**
307 * This is the set of flags that the vsc can set in any packets it sends
308 */
309 #define VSC_LEGAL_FLAGS (REQUEST_COMPLETION_FLAG)
310
311 #endif /* __HV_VSTORAGE_H__ */
Cache object: 9a94a03527fd74f9267572d6a40a935f
|