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