Commit | Line | Data |
---|---|---|
565e7dc8 HJ |
1 | /* |
2 | * | |
3 | * Copyright (c) 2009, Microsoft Corporation. | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify it | |
6 | * under the terms and conditions of the GNU General Public License, | |
7 | * version 2, as published by the Free Software Foundation. | |
8 | * | |
9 | * This program is distributed in the hope it will be useful, but WITHOUT | |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
12 | * more details. | |
13 | * | |
14 | * You should have received a copy of the GNU General Public License along with | |
15 | * this program; if not, write to the Free Software Foundation, Inc., 59 Temple | |
16 | * Place - Suite 330, Boston, MA 02111-1307 USA. | |
17 | * | |
18 | * Authors: | |
19 | * Haiyang Zhang <haiyangz@microsoft.com> | |
20 | * Hank Janssen <hjanssen@microsoft.com> | |
21 | * | |
22 | */ | |
23 | ||
454f18a9 BP |
24 | /* vstorage.w revision number. This is used in the case of a version match, */ |
25 | /* to alert the user that structure sizes may be mismatched even though the */ | |
26 | /* protocol versions match. */ | |
27 | ||
565e7dc8 | 28 | #define REVISION_STRING(REVISION_) #REVISION_ |
d7363a19 GKH |
29 | #define FILL_VMSTOR_REVISION(RESULT_LVALUE_) \ |
30 | { \ | |
a5729c00 | 31 | char *revisionString = REVISION_STRING($Revision : 6 $) + 11; \ |
d7363a19 GKH |
32 | RESULT_LVALUE_ = 0; \ |
33 | while (*revisionString >= '0' && *revisionString <= '9') { \ | |
34 | RESULT_LVALUE_ *= 10; \ | |
35 | RESULT_LVALUE_ += *revisionString - '0'; \ | |
36 | revisionString++; \ | |
37 | } \ | |
565e7dc8 HJ |
38 | } |
39 | ||
454f18a9 BP |
40 | /* Major/minor macros. Minor version is in LSB, meaning that earlier flat */ |
41 | /* version numbers will be interpreted as "0.x" (i.e., 1 becomes 0.1). */ | |
d7363a19 GKH |
42 | #define VMSTOR_PROTOCOL_MAJOR(VERSION_) (((VERSION_) >> 8) & 0xff) |
43 | #define VMSTOR_PROTOCOL_MINOR(VERSION_) (((VERSION_)) & 0xff) | |
44 | #define VMSTOR_PROTOCOL_VERSION(MAJOR_, MINOR_) ((((MAJOR_) & 0xff) << 8) | \ | |
45 | (((MINOR_) & 0xff))) | |
46 | #define VMSTOR_INVALID_PROTOCOL_VERSION (-1) | |
454f18a9 BP |
47 | |
48 | /* Version history: */ | |
49 | /* V1 Beta 0.1 */ | |
50 | /* V1 RC < 2008/1/31 1.0 */ | |
51 | /* V1 RC > 2008/1/31 2.0 */ | |
565e7dc8 HJ |
52 | #define VMSTOR_PROTOCOL_VERSION_CURRENT VMSTOR_PROTOCOL_VERSION(2, 0) |
53 | ||
54 | ||
454f18a9 | 55 | |
d7363a19 | 56 | |
454f18a9 BP |
57 | /* This will get replaced with the max transfer length that is possible on */ |
58 | /* the host adapter. */ | |
59 | /* The max transfer length will be published when we offer a vmbus channel. */ | |
d7363a19 | 60 | #define MAX_TRANSFER_LENGTH 0x40000 |
8dc0a06a | 61 | #define DEFAULT_PACKET_SIZE (sizeof(struct vmdata_gpa_direct) + \ |
b3715ee4 GKH |
62 | sizeof(struct vstor_packet) + \ |
63 | sizesizeof(u64) * (MAX_TRANSFER_LENGTH / PAGE_SIZE))) | |
454f18a9 BP |
64 | |
65 | ||
454f18a9 | 66 | /* Packet structure describing virtual storage requests. */ |
b3715ee4 | 67 | enum vstor_packet_operation { |
d7363a19 GKH |
68 | VStorOperationCompleteIo = 1, |
69 | VStorOperationRemoveDevice = 2, | |
70 | VStorOperationExecuteSRB = 3, | |
71 | VStorOperationResetLun = 4, | |
72 | VStorOperationResetAdapter = 5, | |
73 | VStorOperationResetBus = 6, | |
74 | VStorOperationBeginInitialization = 7, | |
75 | VStorOperationEndInitialization = 8, | |
76 | VStorOperationQueryProtocolVersion = 9, | |
77 | VStorOperationQueryProperties = 10, | |
78 | VStorOperationMaximum = 10 | |
b3715ee4 | 79 | }; |
454f18a9 | 80 | |
d7363a19 GKH |
81 | /* |
82 | * Platform neutral description of a scsi request - | |
83 | * this remains the same across the write regardless of 32/64 bit | |
84 | * note: it's patterned off the SCSI_PASS_THROUGH structure | |
85 | */ | |
d7363a19 | 86 | #define CDB16GENERIC_LENGTH 0x10 |
565e7dc8 HJ |
87 | |
88 | #ifndef SENSE_BUFFER_SIZE | |
d7363a19 | 89 | #define SENSE_BUFFER_SIZE 0x12 |
565e7dc8 | 90 | #endif |
565e7dc8 | 91 | |
d7363a19 | 92 | #define MAX_DATA_BUFFER_LENGTH_WITH_PADDING 0x14 |
565e7dc8 | 93 | |
b3715ee4 | 94 | struct vmscsi_request { |
d7363a19 GKH |
95 | unsigned short Length; |
96 | unsigned char SrbStatus; | |
97 | unsigned char ScsiStatus; | |
565e7dc8 | 98 | |
d7363a19 GKH |
99 | unsigned char PortNumber; |
100 | unsigned char PathId; | |
101 | unsigned char TargetId; | |
102 | unsigned char Lun; | |
565e7dc8 | 103 | |
d7363a19 GKH |
104 | unsigned char CdbLength; |
105 | unsigned char SenseInfoLength; | |
106 | unsigned char DataIn; | |
107 | unsigned char Reserved; | |
565e7dc8 | 108 | |
d7363a19 | 109 | unsigned int DataTransferLength; |
565e7dc8 | 110 | |
d7363a19 | 111 | union { |
454f18a9 | 112 | unsigned char Cdb[CDB16GENERIC_LENGTH]; |
565e7dc8 | 113 | |
454f18a9 | 114 | unsigned char SenseData[SENSE_BUFFER_SIZE]; |
565e7dc8 | 115 | |
454f18a9 | 116 | unsigned char ReservedArray[MAX_DATA_BUFFER_LENGTH_WITH_PADDING]; |
d7363a19 | 117 | }; |
b3715ee4 | 118 | } __attribute((packed)); |
454f18a9 | 119 | |
565e7dc8 | 120 | |
d7363a19 GKH |
121 | /* |
122 | * This structure is sent during the intialization phase to get the different | |
123 | * properties of the channel. | |
124 | */ | |
b3715ee4 | 125 | struct vmstorage_channel_properties { |
d7363a19 GKH |
126 | unsigned short ProtocolVersion; |
127 | unsigned char PathId; | |
128 | unsigned char TargetId; | |
565e7dc8 | 129 | |
d7363a19 GKH |
130 | /* Note: port number is only really known on the client side */ |
131 | unsigned int PortNumber; | |
132 | unsigned int Flags; | |
133 | unsigned int MaxTransferBytes; | |
565e7dc8 | 134 | |
d7363a19 GKH |
135 | /* This id is unique for each channel and will correspond with */ |
136 | /* vendor specific data in the inquirydata */ | |
137 | unsigned long long UniqueId; | |
b3715ee4 | 138 | } __attribute__((packed)); |
454f18a9 BP |
139 | |
140 | /* This structure is sent during the storage protocol negotiations. */ | |
b3715ee4 | 141 | struct vmstorage_protocol_version { |
d7363a19 GKH |
142 | /* Major (MSW) and minor (LSW) version numbers. */ |
143 | unsigned short MajorMinor; | |
454f18a9 | 144 | |
d7363a19 GKH |
145 | /* |
146 | * Revision number is auto-incremented whenever this file is changed | |
147 | * (See FILL_VMSTOR_REVISION macro above). Mismatch does not | |
148 | * definitely indicate incompatibility--but it does indicate mismatched | |
149 | * builds. | |
150 | */ | |
151 | unsigned short Revision; | |
b3715ee4 | 152 | } __attribute__((packed)); |
454f18a9 BP |
153 | |
154 | /* Channel Property Flags */ | |
d7363a19 GKH |
155 | #define STORAGE_CHANNEL_REMOVABLE_FLAG 0x1 |
156 | #define STORAGE_CHANNEL_EMULATED_IDE_FLAG 0x2 | |
454f18a9 | 157 | |
b3715ee4 | 158 | struct vstor_packet { |
d7363a19 | 159 | /* Requested operation type */ |
b3715ee4 | 160 | enum vstor_packet_operation Operation; |
565e7dc8 | 161 | |
d7363a19 GKH |
162 | /* Flags - see below for values */ |
163 | unsigned int Flags; | |
565e7dc8 | 164 | |
d7363a19 GKH |
165 | /* Status of the request returned from the server side. */ |
166 | unsigned int Status; | |
454f18a9 | 167 | |
d7363a19 GKH |
168 | /* Data payload area */ |
169 | union { | |
170 | /* | |
171 | * Structure used to forward SCSI commands from the | |
172 | * client to the server. | |
173 | */ | |
b3715ee4 | 174 | struct vmscsi_request VmSrb; |
454f18a9 | 175 | |
d7363a19 | 176 | /* Structure used to query channel properties. */ |
b3715ee4 | 177 | struct vmstorage_channel_properties StorageChannelProperties; |
565e7dc8 | 178 | |
d7363a19 | 179 | /* Used during version negotiations. */ |
b3715ee4 | 180 | struct vmstorage_protocol_version Version; |
d7363a19 | 181 | }; |
b3715ee4 | 182 | } __attribute__((packed)); |
565e7dc8 | 183 | |
d7363a19 | 184 | /* Packet flags */ |
d7363a19 GKH |
185 | /* |
186 | * This flag indicates that the server should send back a completion for this | |
187 | * packet. | |
188 | */ | |
189 | #define REQUEST_COMPLETION_FLAG 0x1 | |
565e7dc8 | 190 | |
454f18a9 | 191 | /* This is the set of flags that the vsc can set in any packets it sends */ |
d7363a19 | 192 | #define VSC_LEGAL_FLAGS (REQUEST_COMPLETION_FLAG) |