]> git.karo-electronics.de Git - mv-sheeva.git/blob - drivers/staging/hv/vstorage.h
4ea597d7a7d7f3cbbc2e677eae9853a4442e4281
[mv-sheeva.git] / drivers / staging / hv / vstorage.h
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
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
28 #define REVISION_STRING(REVISION_) #REVISION_
29 #define FILL_VMSTOR_REVISION(RESULT_LVALUE_)                            \
30 {                                                                       \
31         char *revisionString = REVISION_STRING($Revision : 6 $) + 11;   \
32         RESULT_LVALUE_ = 0;                                             \
33         while (*revisionString >= '0' && *revisionString <= '9') {      \
34                 RESULT_LVALUE_ *= 10;                                   \
35                 RESULT_LVALUE_ += *revisionString - '0';                \
36                 revisionString++;                                       \
37         }                                                               \
38 }
39
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). */
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)
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 */
52 #define VMSTOR_PROTOCOL_VERSION_CURRENT VMSTOR_PROTOCOL_VERSION(2, 0)
53
54
55
56
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. */
60 #define MAX_TRANSFER_LENGTH     0x40000
61 #define DEFAULT_PACKET_SIZE (sizeof(struct vmdata_gpa_direct) + \
62                         sizeof(struct vstor_packet) +           \
63                         sizesizeof(u64) * (MAX_TRANSFER_LENGTH / PAGE_SIZE)))
64
65
66 /*  Packet structure describing virtual storage requests. */
67 enum vstor_packet_operation {
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
79 };
80
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  */
86 #define CDB16GENERIC_LENGTH                     0x10
87
88 #ifndef SENSE_BUFFER_SIZE
89 #define SENSE_BUFFER_SIZE                       0x12
90 #endif
91
92 #define MAX_DATA_BUFFER_LENGTH_WITH_PADDING     0x14
93
94 struct vmscsi_request {
95         unsigned short Length;
96         unsigned char SrbStatus;
97         unsigned char ScsiStatus;
98
99         unsigned char PortNumber;
100         unsigned char PathId;
101         unsigned char TargetId;
102         unsigned char Lun;
103
104         unsigned char CdbLength;
105         unsigned char SenseInfoLength;
106         unsigned char DataIn;
107         unsigned char Reserved;
108
109         unsigned int DataTransferLength;
110
111         union {
112         unsigned char Cdb[CDB16GENERIC_LENGTH];
113
114         unsigned char SenseData[SENSE_BUFFER_SIZE];
115
116         unsigned char ReservedArray[MAX_DATA_BUFFER_LENGTH_WITH_PADDING];
117         };
118 } __attribute((packed));
119
120
121 /*
122  * This structure is sent during the intialization phase to get the different
123  * properties of the channel.
124  */
125 struct vmstorage_channel_properties {
126         unsigned short ProtocolVersion;
127         unsigned char  PathId;
128         unsigned char  TargetId;
129
130         /* Note: port number is only really known on the client side */
131         unsigned int  PortNumber;
132         unsigned int  Flags;
133         unsigned int  MaxTransferBytes;
134
135         /*  This id is unique for each channel and will correspond with */
136         /*  vendor specific data in the inquirydata */
137         unsigned long long UniqueId;
138 } __attribute__((packed));
139
140 /*  This structure is sent during the storage protocol negotiations. */
141 struct vmstorage_protocol_version {
142         /* Major (MSW) and minor (LSW) version numbers. */
143         unsigned short MajorMinor;
144
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;
152 } __attribute__((packed));
153
154 /* Channel Property Flags */
155 #define STORAGE_CHANNEL_REMOVABLE_FLAG          0x1
156 #define STORAGE_CHANNEL_EMULATED_IDE_FLAG       0x2
157
158 struct vstor_packet {
159         /* Requested operation type */
160         enum vstor_packet_operation Operation;
161
162         /*  Flags - see below for values */
163         unsigned int     Flags;
164
165         /* Status of the request returned from the server side. */
166         unsigned int     Status;
167
168         /* Data payload area */
169         union {
170                 /*
171                  * Structure used to forward SCSI commands from the
172                  * client to the server.
173                  */
174                 struct vmscsi_request VmSrb;
175
176                 /* Structure used to query channel properties. */
177                 struct vmstorage_channel_properties StorageChannelProperties;
178
179                 /* Used during version negotiations. */
180                 struct vmstorage_protocol_version Version;
181         };
182 } __attribute__((packed));
183
184 /* Packet flags */
185 /*
186  * This flag indicates that the server should send back a completion for this
187  * packet.
188  */
189 #define REQUEST_COMPLETION_FLAG 0x1
190
191 /*  This is the set of flags that the vsc can set in any packets it sends */
192 #define VSC_LEGAL_FLAGS         (REQUEST_COMPLETION_FLAG)