1 /*- 2 * Copyright (c) 2009-2012,2017 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 #define VMSTOR_PROTOCOL_VERSION_WIN6 VMSTOR_PROTOCOL_VERSION(2, 0) 45 #define VMSTOR_PROTOCOL_VERSION_WIN7 VMSTOR_PROTOCOL_VERSION(4, 2) 46 #define VMSTOR_PROTOCOL_VERSION_WIN8 VMSTOR_PROTOCOL_VERSION(5, 1) 47 #define VMSTOR_PROTOCOL_VERSION_WIN8_1 VMSTOR_PROTOCOL_VERSION(6, 0) 48 #define VMSTOR_PROTOCOL_VERSION_WIN10 VMSTOR_PROTOCOL_VERSION(6, 2) 49 /* 50 * Invalid version. 51 */ 52 #define VMSTOR_INVALID_PROTOCOL_VERSION -1 53 54 /* 55 * Version history: 56 * V1 Beta 0.1 57 * V1 RC < 2008/1/31 1.0 58 * V1 RC > 2008/1/31 2.0 59 * Win7: 4.2 60 * Win8: 5.1 61 */ 62 63 #define VMSTOR_PROTOCOL_VERSION_CURRENT VMSTOR_PROTOCOL_VERSION(5, 1) 64 65 /** 66 * Packet structure ops describing virtual storage requests. 67 */ 68 enum vstor_packet_ops { 69 VSTOR_OPERATION_COMPLETEIO = 1, 70 VSTOR_OPERATION_REMOVEDEVICE = 2, 71 VSTOR_OPERATION_EXECUTESRB = 3, 72 VSTOR_OPERATION_RESETLUN = 4, 73 VSTOR_OPERATION_RESETADAPTER = 5, 74 VSTOR_OPERATION_RESETBUS = 6, 75 VSTOR_OPERATION_BEGININITIALIZATION = 7, 76 VSTOR_OPERATION_ENDINITIALIZATION = 8, 77 VSTOR_OPERATION_QUERYPROTOCOLVERSION = 9, 78 VSTOR_OPERATION_QUERYPROPERTIES = 10, 79 VSTOR_OPERATION_ENUMERATE_BUS = 11, 80 VSTOR_OPERATION_FCHBA_DATA = 12, 81 VSTOR_OPERATION_CREATE_MULTI_CHANNELS = 13, 82 VSTOR_OPERATION_MAXIMUM = 13 83 }; 84 85 86 /* 87 * Platform neutral description of a scsi request - 88 * this remains the same across the write regardless of 32/64 bit 89 * note: it's patterned off the Windows DDK SCSI_PASS_THROUGH structure 90 */ 91 92 #define CDB16GENERIC_LENGTH 0x10 93 #define SENSE_BUFFER_SIZE 0x14 94 #define MAX_DATA_BUFFER_LENGTH_WITH_PADDING 0x14 95 96 #define POST_WIN7_STORVSC_SENSE_BUFFER_SIZE 0x14 97 #define PRE_WIN8_STORVSC_SENSE_BUFFER_SIZE 0x12 98 99 100 struct vmscsi_win8_extension { 101 /* 102 * The following were added in Windows 8 103 */ 104 uint16_t reserve; 105 uint8_t queue_tag; 106 uint8_t queue_action; 107 uint32_t srb_flags; 108 uint32_t time_out_value; 109 uint32_t queue_sort_ey; 110 } __packed; 111 112 struct vmscsi_req { 113 uint16_t length; 114 uint8_t srb_status; 115 uint8_t scsi_status; 116 117 /* HBA number, set to the order number detected by initiator. */ 118 uint8_t port; 119 /* SCSI bus number or bus_id, different from CAM's path_id. */ 120 uint8_t path_id; 121 122 uint8_t target_id; 123 uint8_t lun; 124 125 uint8_t cdb_len; 126 uint8_t sense_info_len; 127 uint8_t data_in; 128 uint8_t reserved; 129 130 uint32_t transfer_len; 131 132 union { 133 uint8_t cdb[CDB16GENERIC_LENGTH]; 134 135 uint8_t sense_data[SENSE_BUFFER_SIZE]; 136 137 uint8_t reserved_array[MAX_DATA_BUFFER_LENGTH_WITH_PADDING]; 138 } u; 139 140 /* 141 * The following was added in win8. 142 */ 143 struct vmscsi_win8_extension win8_extension; 144 145 } __packed; 146 147 /** 148 * This structure is sent during the initialization phase to get the different 149 * properties of the channel. 150 */ 151 152 struct vmstor_chan_props { 153 uint16_t proto_ver; 154 uint8_t path_id; 155 uint8_t target_id; 156 157 uint16_t max_channel_cnt; 158 159 /** 160 * Note: port number is only really known on the client side 161 */ 162 uint16_t port; 163 uint32_t flags; 164 uint32_t max_transfer_bytes; 165 166 /** 167 * This id is unique for each channel and will correspond with 168 * vendor specific data in the inquiry_ata 169 */ 170 uint64_t unique_id; 171 172 } __packed; 173 174 /** 175 * This structure is sent during the storage protocol negotiations. 176 */ 177 178 struct vmstor_proto_ver 179 { 180 /** 181 * Major (MSW) and minor (LSW) version numbers. 182 */ 183 uint16_t major_minor; 184 185 uint16_t revision; /* always zero */ 186 } __packed; 187 188 /** 189 * Channel Property Flags 190 */ 191 192 #define STORAGE_CHANNEL_REMOVABLE_FLAG 0x1 193 #define STORAGE_CHANNEL_EMULATED_IDE_FLAG 0x2 194 195 196 struct vstor_packet { 197 /** 198 * Requested operation type 199 */ 200 enum vstor_packet_ops operation; 201 202 /* 203 * Flags - see below for values 204 */ 205 uint32_t flags; 206 207 /** 208 * Status of the request returned from the server side. 209 */ 210 uint32_t status; 211 212 union 213 { 214 /** 215 * Structure used to forward SCSI commands from the client to 216 * the server. 217 */ 218 struct vmscsi_req vm_srb; 219 220 /** 221 * Structure used to query channel properties. 222 */ 223 struct vmstor_chan_props chan_props; 224 225 /** 226 * Used during version negotiations. 227 */ 228 struct vmstor_proto_ver version; 229 230 /** 231 * Number of multichannels to create 232 */ 233 uint16_t multi_channels_cnt; 234 } u; 235 236 } __packed; 237 238 239 /** 240 * SRB (SCSI Request Block) Status Codes 241 */ 242 #define SRB_STATUS_PENDING 0x00 243 #define SRB_STATUS_SUCCESS 0x01 244 #define SRB_STATUS_ABORTED 0x02 245 #define SRB_STATUS_ERROR 0x04 246 #define SRB_STATUS_INVALID_LUN 0x20 247 /** 248 * SRB Status Masks (can be combined with above status codes) 249 */ 250 #define SRB_STATUS_QUEUE_FROZEN 0x40 251 #define SRB_STATUS_AUTOSENSE_VALID 0x80 252 253 #define SRB_STATUS(status) \ 254 ((status) & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN)) 255 /* 256 * SRB Flag Bits 257 */ 258 259 #define SRB_FLAGS_QUEUE_ACTION_ENABLE 0x00000002 260 #define SRB_FLAGS_DISABLE_DISCONNECT 0x00000004 261 #define SRB_FLAGS_DISABLE_SYNCH_TRANSFER 0x00000008 262 #define SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x00000010 263 #define SRB_FLAGS_DISABLE_AUTOSENSE 0x00000020 264 #define SRB_FLAGS_DATA_IN 0x00000040 265 #define SRB_FLAGS_DATA_OUT 0x00000080 266 #define SRB_FLAGS_NO_DATA_TRANSFER 0x00000000 267 #define SRB_FLAGS_UNSPECIFIED_DIRECTION (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT) 268 #define SRB_FLAGS_NO_QUEUE_FREEZE 0x00000100 269 #define SRB_FLAGS_ADAPTER_CACHE_ENABLE 0x00000200 270 #define SRB_FLAGS_FREE_SENSE_BUFFER 0x00000400 271 /** 272 * Packet flags 273 */ 274 275 /** 276 * This flag indicates that the server should send back a completion for this 277 * packet. 278 */ 279 #define REQUEST_COMPLETION_FLAG 0x1 280 281 /** 282 * This is the set of flags that the vsc can set in any packets it sends 283 */ 284 #define VSC_LEGAL_FLAGS (REQUEST_COMPLETION_FLAG) 285 286 #endif /* __HV_VSTORAGE_H__ */ 287