1/*-
2 * Copyright (c) 2009-2012 Microsoft Corp.
3 * Copyright (c) 2012 NetApp Inc.
4 * Copyright (c) 2012 Citrix Inc.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice unmodified, this list of conditions, and the following
12 *    disclaimer.
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.
16 *
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.
27 *
28 * $FreeBSD$
29 */
30
31#ifndef __HV_VSTORAGE_H__
32#define __HV_VSTORAGE_H__
33
34/*
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).
37 */
38
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) | \
42                                                 (((MINOR_) & 0xff)     ))
43
44/*
45 * Invalid version.
46 */
47#define VMSTOR_INVALID_PROTOCOL_VERSION  -1
48
49/*
50 * Version history:
51 * V1 Beta                    0.1
52 * V1 RC < 2008/1/31          1.0
53 * V1 RC > 2008/1/31          2.0
54 */
55
56#define VMSTOR_PROTOCOL_VERSION_CURRENT	VMSTOR_PROTOCOL_VERSION(2, 0)
57
58/**
59 *  Packet structure ops describing virtual storage requests.
60 */
61enum 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
73};
74
75
76/*
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
80 */
81
82#define CDB16GENERIC_LENGTH			0x10
83#define SENSE_BUFFER_SIZE			0x12
84#define MAX_DATA_BUFFER_LENGTH_WITH_PADDING	0x14
85
86struct vmscsi_req {
87	uint16_t length;
88	uint8_t  srb_status;
89	uint8_t  scsi_status;
90
91	/* HBA number, set to the order number detected by initiator. */
92	uint8_t  port;
93	/* SCSI bus number or bus_id, different from CAM's path_id. */
94	uint8_t  path_id;
95
96	uint8_t  target_id;
97	uint8_t  lun;
98
99	uint8_t  cdb_len;
100	uint8_t  sense_info_len;
101	uint8_t  data_in;
102	uint8_t  reserved;
103
104	uint32_t transfer_len;
105
106	union {
107	    uint8_t cdb[CDB16GENERIC_LENGTH];
108
109	    uint8_t sense_data[SENSE_BUFFER_SIZE];
110
111	    uint8_t reserved_array[MAX_DATA_BUFFER_LENGTH_WITH_PADDING];
112	} u;
113
114} __packed;
115
116/**
117 *  This structure is sent during the initialization phase to get the different
118 *  properties of the channel.
119 */
120
121struct vmstor_chan_props {
122	uint16_t proto_ver;
123	uint8_t  path_id;
124	uint8_t  target_id;
125
126	/**
127	 * Note: port number is only really known on the client side
128	 */
129	uint32_t port;
130	uint32_t flags;
131	uint32_t max_transfer_bytes;
132
133	/**
134	 *  This id is unique for each channel and will correspond with
135	 *  vendor specific data in the inquiry_ata
136	 */
137	uint64_t unique_id;
138
139} __packed;
140
141/**
142 *  This structure is sent during the storage protocol negotiations.
143 */
144
145struct vmstor_proto_ver
146{
147	/**
148	 * Major (MSW) and minor (LSW) version numbers.
149	 */
150	uint16_t major_minor;
151
152	uint16_t revision;			/* always zero */
153} __packed;
154
155/**
156 * Channel Property Flags
157 */
158
159#define STORAGE_CHANNEL_REMOVABLE_FLAG                  0x1
160#define STORAGE_CHANNEL_EMULATED_IDE_FLAG               0x2
161
162
163struct vstor_packet {
164	/**
165	 * Requested operation type
166	 */
167	enum vstor_packet_ops operation;
168
169	/*
170	 * Flags - see below for values
171	 */
172	uint32_t flags;
173
174	/**
175	 * Status of the request returned from the server side.
176	 */
177	uint32_t status;
178
179	union
180	{
181	    /**
182	     * Structure used to forward SCSI commands from the client to
183	     * the server.
184	     */
185	    struct vmscsi_req vm_srb;
186
187	    /**
188	     * Structure used to query channel properties.
189	     */
190	    struct vmstor_chan_props chan_props;
191
192	    /**
193	     * Used during version negotiations.
194	     */
195	    struct vmstor_proto_ver version;
196	} u;
197
198} __packed;
199
200
201/**
202 * SRB (SCSI Request Block) Status Codes
203 */
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
210
211/**
212 * SRB Status Masks (can be combined with above status codes)
213 */
214#define SRB_STATUS_QUEUE_FROZEN		0x40
215#define SRB_STATUS_AUTOSENSE_VALID	0x80
216
217
218/**
219 *  Packet flags
220 */
221
222/**
223 *  This flag indicates that the server should send back a completion for this
224 *  packet.
225 */
226#define REQUEST_COMPLETION_FLAG	0x1
227
228/**
229 *  This is the set of flags that the vsc can set in any packets it sends
230 */
231#define VSC_LEGAL_FLAGS (REQUEST_COMPLETION_FLAG)
232
233#endif /* __HV_VSTORAGE_H__ */
234