2 * Copyright (c) 2009-2012 Microsoft Corp.
3 * Copyright (c) 2012 NetApp Inc.
4 * Copyright (c) 2012 Citrix Inc.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice unmodified, this list of conditions, and the following
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #ifndef __HV_VSTORAGE_H__
32 #define __HV_VSTORAGE_H__
35 * Major/minor macros. Minor version is in LSB, meaning that earlier flat
36 * version numbers will be interpreted as "0.x" (i.e., 1 becomes 0.1).
39 #define VMSTOR_PROTOCOL_MAJOR(VERSION_) (((VERSION_) >> 8) & 0xff)
40 #define VMSTOR_PROTOCOL_MINOR(VERSION_) (((VERSION_) ) & 0xff)
41 #define VMSTOR_PROTOCOL_VERSION(MAJOR_, MINOR_) ((((MAJOR_) & 0xff) << 8) | \
47 #define VMSTOR_INVALID_PROTOCOL_VERSION -1
52 * V1 RC < 2008/1/31 1.0
53 * V1 RC > 2008/1/31 2.0
56 #define VMSTOR_PROTOCOL_VERSION_CURRENT VMSTOR_PROTOCOL_VERSION(2, 0)
59 * Packet structure ops describing virtual storage requests.
61 enum vstor_packet_ops {
62 VSTOR_OPERATION_COMPLETEIO = 1,
63 VSTOR_OPERATION_REMOVEDEVICE = 2,
64 VSTOR_OPERATION_EXECUTESRB = 3,
65 VSTOR_OPERATION_RESETLUN = 4,
66 VSTOR_OPERATION_RESETADAPTER = 5,
67 VSTOR_OPERATION_RESETBUS = 6,
68 VSTOR_OPERATION_BEGININITIALIZATION = 7,
69 VSTOR_OPERATION_ENDINITIALIZATION = 8,
70 VSTOR_OPERATION_QUERYPROTOCOLVERSION = 9,
71 VSTOR_OPERATION_QUERYPROPERTIES = 10,
72 VSTOR_OPERATION_MAXIMUM = 10
77 * Platform neutral description of a scsi request -
78 * this remains the same across the write regardless of 32/64 bit
79 * note: it's patterned off the Windows DDK SCSI_PASS_THROUGH structure
82 #define CDB16GENERIC_LENGTH 0x10
83 #define SENSE_BUFFER_SIZE 0x12
84 #define MAX_DATA_BUFFER_LENGTH_WITH_PADDING 0x14
91 /* HBA number, set to the order number detected by initiator. */
93 /* SCSI bus number or bus_id, different from CAM's path_id. */
100 uint8_t sense_info_len;
104 uint32_t transfer_len;
107 uint8_t cdb[CDB16GENERIC_LENGTH];
109 uint8_t sense_data[SENSE_BUFFER_SIZE];
111 uint8_t reserved_array[MAX_DATA_BUFFER_LENGTH_WITH_PADDING];
117 * This structure is sent during the initialization phase to get the different
118 * properties of the channel.
121 struct vmstor_chan_props {
127 * Note: port number is only really known on the client side
131 uint32_t max_transfer_bytes;
134 * This id is unique for each channel and will correspond with
135 * vendor specific data in the inquiry_ata
142 * This structure is sent during the storage protocol negotiations.
145 struct vmstor_proto_ver
148 * Major (MSW) and minor (LSW) version numbers.
150 uint16_t major_minor;
152 uint16_t revision; /* always zero */
156 * Channel Property Flags
159 #define STORAGE_CHANNEL_REMOVABLE_FLAG 0x1
160 #define STORAGE_CHANNEL_EMULATED_IDE_FLAG 0x2
163 struct vstor_packet {
165 * Requested operation type
167 enum vstor_packet_ops operation;
170 * Flags - see below for values
175 * Status of the request returned from the server side.
182 * Structure used to forward SCSI commands from the client to
185 struct vmscsi_req vm_srb;
188 * Structure used to query channel properties.
190 struct vmstor_chan_props chan_props;
193 * Used during version negotiations.
195 struct vmstor_proto_ver version;
202 * SRB (SCSI Request Block) Status Codes
204 #define SRB_STATUS_PENDING 0x00
205 #define SRB_STATUS_SUCCESS 0x01
206 #define SRB_STATUS_ABORTED 0x02
207 #define SRB_STATUS_ABORT_FAILED 0x03
208 #define SRB_STATUS_ERROR 0x04
209 #define SRB_STATUS_BUSY 0x05
212 * SRB Status Masks (can be combined with above status codes)
214 #define SRB_STATUS_QUEUE_FROZEN 0x40
215 #define SRB_STATUS_AUTOSENSE_VALID 0x80
223 * This flag indicates that the server should send back a completion for this
226 #define REQUEST_COMPLETION_FLAG 0x1
229 * This is the set of flags that the vsc can set in any packets it sends
231 #define VSC_LEGAL_FLAGS (REQUEST_COMPLETION_FLAG)
233 #endif /* __HV_VSTORAGE_H__ */