]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/dev/hyperv/storvsc/hv_vstorage.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / dev / hyperv / storvsc / hv_vstorage.h
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  */
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
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
86 struct 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
121 struct 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
145 struct 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
163 struct 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__ */