xref: /freebsd/sys/dev/hyperv/storvsc/hv_vstorage.h (revision c697fb7f)
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_ERROR 		0x04
248 #define SRB_STATUS_DATA_OVERRUN		0x12
249 #define SRB_STATUS_INVALID_LUN		0x20
250 /**
251  * SRB Status Masks (can be combined with above status codes)
252  */
253 #define SRB_STATUS_QUEUE_FROZEN         0x40
254 #define SRB_STATUS_AUTOSENSE_VALID      0x80
255 
256 #define SRB_STATUS(status)	\
257 	((status) & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
258 /*
259  * SRB Flag Bits
260  */
261 
262 #define SRB_FLAGS_QUEUE_ACTION_ENABLE           0x00000002
263 #define SRB_FLAGS_DISABLE_DISCONNECT            0x00000004
264 #define SRB_FLAGS_DISABLE_SYNCH_TRANSFER        0x00000008
265 #define SRB_FLAGS_BYPASS_FROZEN_QUEUE           0x00000010
266 #define SRB_FLAGS_DISABLE_AUTOSENSE             0x00000020
267 #define SRB_FLAGS_DATA_IN                       0x00000040
268 #define SRB_FLAGS_DATA_OUT                      0x00000080
269 #define SRB_FLAGS_NO_DATA_TRANSFER              0x00000000
270 #define SRB_FLAGS_UNSPECIFIED_DIRECTION (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT)
271 #define SRB_FLAGS_NO_QUEUE_FREEZE               0x00000100
272 #define SRB_FLAGS_ADAPTER_CACHE_ENABLE          0x00000200
273 #define SRB_FLAGS_FREE_SENSE_BUFFER             0x00000400
274 /**
275  *  Packet flags
276  */
277 
278 /**
279  *  This flag indicates that the server should send back a completion for this
280  *  packet.
281  */
282 #define REQUEST_COMPLETION_FLAG	0x1
283 
284 /**
285  *  This is the set of flags that the vsc can set in any packets it sends
286  */
287 #define VSC_LEGAL_FLAGS (REQUEST_COMPLETION_FLAG)
288 
289 #endif /* __HV_VSTORAGE_H__ */
290