]>
Commit | Line | Data |
---|---|---|
e124c9a2 JG |
1 | /****************************************************************************** |
2 | * vscsiif.h | |
3 | * | |
4 | * Based on the blkif.h code. | |
5 | * | |
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy | |
7 | * of this software and associated documentation files (the "Software"), to | |
8 | * deal in the Software without restriction, including without limitation the | |
9 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | |
10 | * sell copies of the Software, and to permit persons to whom the Software is | |
11 | * furnished to do so, subject to the following conditions: | |
12 | * | |
13 | * The above copyright notice and this permission notice shall be included in | |
14 | * all copies or substantial portions of the Software. | |
15 | * | |
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
21 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
22 | * DEALINGS IN THE SOFTWARE. | |
23 | * | |
24 | * Copyright(c) FUJITSU Limited 2008. | |
25 | */ | |
26 | ||
27 | #ifndef __XEN__PUBLIC_IO_SCSI_H__ | |
28 | #define __XEN__PUBLIC_IO_SCSI_H__ | |
29 | ||
30 | #include "ring.h" | |
31 | #include "../grant_table.h" | |
32 | ||
33 | /* | |
34 | * Feature and Parameter Negotiation | |
35 | * ================================= | |
36 | * The two halves of a Xen pvSCSI driver utilize nodes within the XenStore to | |
37 | * communicate capabilities and to negotiate operating parameters. This | |
38 | * section enumerates these nodes which reside in the respective front and | |
39 | * backend portions of the XenStore, following the XenBus convention. | |
40 | * | |
41 | * Any specified default value is in effect if the corresponding XenBus node | |
42 | * is not present in the XenStore. | |
43 | * | |
44 | * XenStore nodes in sections marked "PRIVATE" are solely for use by the | |
45 | * driver side whose XenBus tree contains them. | |
46 | * | |
47 | ***************************************************************************** | |
48 | * Backend XenBus Nodes | |
49 | ***************************************************************************** | |
50 | * | |
51 | *------------------ Backend Device Identification (PRIVATE) ------------------ | |
52 | * | |
53 | * p-devname | |
54 | * Values: string | |
55 | * | |
56 | * A free string used to identify the physical device (e.g. a disk name). | |
57 | * | |
58 | * p-dev | |
59 | * Values: string | |
60 | * | |
61 | * A string specifying the backend device: either a 4-tuple "h:c:t:l" | |
62 | * (host, controller, target, lun, all integers), or a WWN (e.g. | |
63 | * "naa.60014054ac780582"). | |
64 | * | |
65 | * v-dev | |
66 | * Values: string | |
67 | * | |
68 | * A string specifying the frontend device in form of a 4-tuple "h:c:t:l" | |
69 | * (host, controller, target, lun, all integers). | |
70 | * | |
71 | *--------------------------------- Features --------------------------------- | |
72 | * | |
73 | * feature-sg-grant | |
74 | * Values: unsigned [VSCSIIF_SG_TABLESIZE...65535] | |
75 | * Default Value: 0 | |
76 | * | |
77 | * Specifies the maximum number of scatter/gather elements in grant pages | |
78 | * supported. If not set, the backend supports up to VSCSIIF_SG_TABLESIZE | |
79 | * SG elements specified directly in the request. | |
80 | * | |
81 | ***************************************************************************** | |
82 | * Frontend XenBus Nodes | |
83 | ***************************************************************************** | |
84 | * | |
85 | *----------------------- Request Transport Parameters ----------------------- | |
86 | * | |
87 | * event-channel | |
88 | * Values: unsigned | |
89 | * | |
90 | * The identifier of the Xen event channel used to signal activity | |
91 | * in the ring buffer. | |
92 | * | |
93 | * ring-ref | |
94 | * Values: unsigned | |
95 | * | |
96 | * The Xen grant reference granting permission for the backend to map | |
97 | * the sole page in a single page sized ring buffer. | |
98 | * | |
99 | * protocol | |
100 | * Values: string (XEN_IO_PROTO_ABI_*) | |
101 | * Default Value: XEN_IO_PROTO_ABI_NATIVE | |
102 | * | |
103 | * The machine ABI rules governing the format of all ring request and | |
104 | * response structures. | |
105 | */ | |
106 | ||
107 | /* Requests from the frontend to the backend */ | |
108 | ||
109 | /* | |
110 | * Request a SCSI operation specified via a CDB in vscsiif_request.cmnd. | |
111 | * The target is specified via channel, id and lun. | |
112 | * | |
113 | * The operation to be performed is specified via a CDB in cmnd[], the length | |
114 | * of the CDB is in cmd_len. sc_data_direction specifies the direction of data | |
115 | * (to the device, from the device, or none at all). | |
116 | * | |
117 | * If data is to be transferred to or from the device the buffer(s) in the | |
118 | * guest memory is/are specified via one or multiple scsiif_request_segment | |
119 | * descriptors each specifying a memory page via a grant_ref_t, a offset into | |
120 | * the page and the length of the area in that page. All scsiif_request_segment | |
121 | * areas concatenated form the resulting data buffer used by the operation. | |
122 | * If the number of scsiif_request_segment areas is not too large (less than | |
123 | * or equal VSCSIIF_SG_TABLESIZE) the areas can be specified directly in the | |
124 | * seg[] array and the number of valid scsiif_request_segment elements is to be | |
125 | * set in nr_segments. | |
126 | * | |
127 | * If "feature-sg-grant" in the Xenstore is set it is possible to specify more | |
128 | * than VSCSIIF_SG_TABLESIZE scsiif_request_segment elements via indirection. | |
129 | * The maximum number of allowed scsiif_request_segment elements is the value | |
130 | * of the "feature-sg-grant" entry from Xenstore. When using indirection the | |
131 | * seg[] array doesn't contain specifications of the data buffers, but | |
132 | * references to scsiif_request_segment arrays, which in turn reference the | |
133 | * data buffers. While nr_segments holds the number of populated seg[] entries | |
134 | * (plus the set VSCSIIF_SG_GRANT bit), the number of scsiif_request_segment | |
135 | * elements referencing the target data buffers is calculated from the lengths | |
136 | * of the seg[] elements (the sum of all valid seg[].length divided by the | |
137 | * size of one scsiif_request_segment structure). | |
138 | */ | |
139 | #define VSCSIIF_ACT_SCSI_CDB 1 | |
140 | ||
141 | /* | |
142 | * Request abort of a running operation for the specified target given by | |
143 | * channel, id, lun and the operation's rqid in ref_rqid. | |
144 | */ | |
145 | #define VSCSIIF_ACT_SCSI_ABORT 2 | |
146 | ||
147 | /* | |
148 | * Request a device reset of the specified target (channel and id). | |
149 | */ | |
150 | #define VSCSIIF_ACT_SCSI_RESET 3 | |
151 | ||
152 | /* | |
153 | * Preset scatter/gather elements for a following request. Deprecated. | |
154 | * Keeping the define only to avoid usage of the value "4" for other actions. | |
155 | */ | |
156 | #define VSCSIIF_ACT_SCSI_SG_PRESET 4 | |
157 | ||
158 | /* | |
159 | * Maximum scatter/gather segments per request. | |
160 | * | |
161 | * Considering balance between allocating at least 16 "vscsiif_request" | |
162 | * structures on one page (4096 bytes) and the number of scatter/gather | |
163 | * elements needed, we decided to use 26 as a magic number. | |
164 | * | |
165 | * If "feature-sg-grant" is set, more scatter/gather elements can be specified | |
166 | * by placing them in one or more (up to VSCSIIF_SG_TABLESIZE) granted pages. | |
167 | * In this case the vscsiif_request seg elements don't contain references to | |
168 | * the user data, but to the SG elements referencing the user data. | |
169 | */ | |
170 | #define VSCSIIF_SG_TABLESIZE 26 | |
171 | ||
172 | /* | |
173 | * based on Linux kernel 2.6.18, still valid | |
174 | * Changing these values requires support of multiple protocols via the rings | |
175 | * as "old clients" will blindly use these values and the resulting structure | |
176 | * sizes. | |
177 | */ | |
178 | #define VSCSIIF_MAX_COMMAND_SIZE 16 | |
179 | #define VSCSIIF_SENSE_BUFFERSIZE 96 | |
180 | ||
181 | struct scsiif_request_segment { | |
182 | grant_ref_t gref; | |
183 | uint16_t offset; | |
184 | uint16_t length; | |
185 | }; | |
186 | ||
187 | #define VSCSIIF_SG_PER_PAGE (PAGE_SIZE / sizeof(struct scsiif_request_segment)) | |
188 | ||
189 | /* Size of one request is 252 bytes */ | |
190 | struct vscsiif_request { | |
191 | uint16_t rqid; /* private guest value, echoed in resp */ | |
192 | uint8_t act; /* command between backend and frontend */ | |
193 | uint8_t cmd_len; /* valid CDB bytes */ | |
194 | ||
195 | uint8_t cmnd[VSCSIIF_MAX_COMMAND_SIZE]; /* the CDB */ | |
196 | uint16_t timeout_per_command; /* deprecated */ | |
197 | uint16_t channel, id, lun; /* (virtual) device specification */ | |
198 | uint16_t ref_rqid; /* command abort reference */ | |
199 | uint8_t sc_data_direction; /* for DMA_TO_DEVICE(1) | |
200 | DMA_FROM_DEVICE(2) | |
201 | DMA_NONE(3) requests */ | |
202 | uint8_t nr_segments; /* Number of pieces of scatter-gather */ | |
203 | /* | |
204 | * flag in nr_segments: SG elements via grant page | |
205 | * | |
206 | * If VSCSIIF_SG_GRANT is set, the low 7 bits of nr_segments specify the number | |
207 | * of grant pages containing SG elements. Usable if "feature-sg-grant" set. | |
208 | */ | |
209 | #define VSCSIIF_SG_GRANT 0x80 | |
210 | ||
211 | struct scsiif_request_segment seg[VSCSIIF_SG_TABLESIZE]; | |
212 | uint32_t reserved[3]; | |
213 | }; | |
214 | ||
215 | /* Size of one response is 252 bytes */ | |
216 | struct vscsiif_response { | |
217 | uint16_t rqid; /* identifies request */ | |
218 | uint8_t padding; | |
219 | uint8_t sense_len; | |
220 | uint8_t sense_buffer[VSCSIIF_SENSE_BUFFERSIZE]; | |
221 | int32_t rslt; | |
222 | uint32_t residual_len; /* request bufflen - | |
223 | return the value from physical device */ | |
224 | uint32_t reserved[36]; | |
225 | }; | |
226 | ||
227 | DEFINE_RING_TYPES(vscsiif, struct vscsiif_request, struct vscsiif_response); | |
228 | ||
229 | #endif /*__XEN__PUBLIC_IO_SCSI_H__*/ |