- Minor optimization
[mirror/scst/.git] / scst / include / scst_user.h
1 /*
2  *  include/scst_user.h
3  *
4  *  Copyright (C) 2007 - 2008 Vladislav Bolkhovitin <vst@vlnb.net>
5  *  Copyright (C) 2007 - 2008 CMS Distribution Limited
6  *
7  *  Contains constants and data structures for scst_user module.
8  *  See http://scst.sourceforge.net/doc/scst_user_spec.txt or
9  *  scst_user_spec.txt for description.
10  *
11  *  This program is free software; you can redistribute it and/or
12  *  modify it under the terms of the GNU General Public License
13  *  as published by the Free Software Foundation, version 2
14  *  of the License.
15  *
16  *  This program is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  *  GNU General Public License for more details.
20  */
21
22 #ifndef __SCST_USER_H
23 #define __SCST_USER_H
24
25 #include <scst_const.h>
26
27 #define DEV_USER_NAME                   "scst_user"
28 #define DEV_USER_PATH                   "/dev/"
29 #define DEV_USER_VERSION_NAME           "1.0.1"
30 #define DEV_USER_VERSION                \
31         DEV_USER_VERSION_NAME "$Revision$" SCST_CONST_VERSION
32
33 #define SCST_MAX_NAME                   50
34
35 #define SCST_USER_PARSE_STANDARD        0
36 #define SCST_USER_PARSE_CALL            1
37 #define SCST_USER_PARSE_EXCEPTION       2
38 #define SCST_USER_MAX_PARSE_OPT         SCST_USER_PARSE_EXCEPTION
39
40 #define SCST_USER_ON_FREE_CMD_CALL      0
41 #define SCST_USER_ON_FREE_CMD_IGNORE    1
42 #define SCST_USER_MAX_ON_FREE_CMD_OPT   SCST_USER_ON_FREE_CMD_IGNORE
43
44 #define SCST_USER_MEM_NO_REUSE          0
45 #define SCST_USER_MEM_REUSE_READ        1
46 #define SCST_USER_MEM_REUSE_WRITE       2
47 #define SCST_USER_MEM_REUSE_ALL         3
48 #define SCST_USER_MAX_MEM_REUSE_OPT     SCST_USER_MEM_REUSE_ALL
49
50 #define SCST_USER_PARTIAL_TRANSFERS_NOT_SUPPORTED       0
51 #define SCST_USER_PARTIAL_TRANSFERS_SUPPORTED_ORDERED   1
52 #define SCST_USER_PARTIAL_TRANSFERS_SUPPORTED           2
53 #define SCST_USER_MAX_PARTIAL_TRANSFERS_OPT             \
54                 SCST_USER_PARTIAL_TRANSFERS_SUPPORTED
55
56 #ifndef aligned_u64
57 #define aligned_u64 uint64_t __attribute__((aligned(8)))
58 #endif
59
60 /*************************************************************
61  ** Private ucmd states
62  *************************************************************/
63 #define UCMD_STATE_NEW                  0
64 #define UCMD_STATE_PARSING              1
65 #define UCMD_STATE_BUF_ALLOCING         2
66 #define UCMD_STATE_EXECING              3
67 #define UCMD_STATE_ON_FREEING           4
68 #define UCMD_STATE_ON_FREE_SKIPPED      5
69 #define UCMD_STATE_ON_CACHE_FREEING     6
70 #define UCMD_STATE_TM_EXECING           7
71
72 #define UCMD_STATE_ATTACH_SESS          0x20
73 #define UCMD_STATE_DETACH_SESS          0x21
74
75 struct scst_user_opt {
76         uint8_t parse_type;
77         uint8_t on_free_cmd_type;
78         uint8_t memory_reuse_type;
79         uint8_t partial_transfers_type;
80         int32_t partial_len;
81
82         /* SCSI control mode page parameters, see SPC */
83         uint8_t tst;
84         uint8_t queue_alg;
85         uint8_t tas;
86         uint8_t swp;
87
88         uint8_t has_own_order_mgmt;
89 };
90
91 struct scst_user_dev_desc {
92         aligned_u64 version_str;
93         uint8_t type;
94         struct scst_user_opt opt;
95         uint32_t block_size;
96         char name[SCST_MAX_NAME];
97 };
98
99 struct scst_user_sess {
100         aligned_u64 sess_h;
101         aligned_u64 lun;
102         uint16_t threads_num;
103         uint8_t rd_only;
104         char initiator_name[SCST_MAX_NAME];
105         char target_name[SCST_MAX_NAME];
106 };
107
108 struct scst_user_scsi_cmd_parse {
109         aligned_u64 sess_h;
110
111         uint8_t cdb[SCST_MAX_CDB_SIZE];
112         int32_t cdb_len;
113
114         int32_t timeout;
115         int32_t bufflen;
116
117         uint8_t queue_type;
118         uint8_t data_direction;
119
120         uint8_t expected_values_set;
121         uint8_t expected_data_direction;
122         int32_t expected_transfer_len;
123
124         uint32_t sn;
125 };
126
127 struct scst_user_scsi_cmd_alloc_mem {
128         aligned_u64 sess_h;
129
130         uint8_t cdb[SCST_MAX_CDB_SIZE];
131         int32_t cdb_len;
132
133         int32_t alloc_len;
134
135         uint8_t queue_type;
136         uint8_t data_direction;
137
138         uint32_t sn;
139 };
140
141 struct scst_user_scsi_cmd_exec {
142         aligned_u64 sess_h;
143
144         uint8_t cdb[SCST_MAX_CDB_SIZE];
145         int32_t cdb_len;
146
147         int32_t data_len;
148         int32_t bufflen;
149         int32_t alloc_len;
150         aligned_u64 pbuf;
151         uint8_t queue_type;
152         uint8_t data_direction;
153         uint8_t partial;
154         int32_t timeout;
155
156         uint32_t sn;
157
158         uint32_t parent_cmd_h;
159         int32_t parent_cmd_data_len;
160         uint32_t partial_offset;
161 };
162
163 struct scst_user_scsi_on_free_cmd {
164         aligned_u64 pbuf;
165         int32_t resp_data_len;
166         uint8_t buffer_cached;
167         uint8_t aborted;
168         uint8_t status;
169         uint8_t delivery_status;
170 };
171
172 struct scst_user_on_cached_mem_free {
173         aligned_u64 pbuf;
174 };
175
176 struct scst_user_tm {
177         aligned_u64 sess_h;
178         uint32_t fn;
179         uint32_t cmd_h_to_abort;
180         uint32_t cmd_sn;
181         uint8_t cmd_sn_set;
182 };
183
184 struct scst_user_get_cmd {
185         uint32_t cmd_h;
186         uint32_t subcode;
187         union {
188                 aligned_u64 preply;
189                 struct scst_user_sess sess;
190                 struct scst_user_scsi_cmd_parse parse_cmd;
191                 struct scst_user_scsi_cmd_alloc_mem alloc_cmd;
192                 struct scst_user_scsi_cmd_exec exec_cmd;
193                 struct scst_user_scsi_on_free_cmd on_free_cmd;
194                 struct scst_user_on_cached_mem_free on_cached_mem_free;
195                 struct scst_user_tm tm_cmd;
196         };
197 };
198
199 /* Be careful adding new members here, this structure is allocated on stack! */
200 struct scst_user_scsi_cmd_reply_parse {
201         uint8_t queue_type;
202         uint8_t data_direction;
203         int32_t data_len;
204         int32_t bufflen;
205 };
206
207 /* Be careful adding new members here, this structure is allocated on stack! */
208 struct scst_user_scsi_cmd_reply_alloc_mem {
209         aligned_u64 pbuf;
210 };
211
212 /* Be careful adding new members here, this structure is allocated on stack! */
213 struct scst_user_scsi_cmd_reply_exec {
214         int32_t resp_data_len;
215         aligned_u64 pbuf;
216
217 #define SCST_EXEC_REPLY_BACKGROUND      0
218 #define SCST_EXEC_REPLY_COMPLETED       1
219         uint8_t reply_type;
220
221         uint8_t status;
222         uint8_t sense_len;
223         aligned_u64 psense_buffer;
224 };
225
226 /* Be careful adding new members here, this structure is allocated on stack! */
227 struct scst_user_reply_cmd {
228         uint32_t cmd_h;
229         uint32_t subcode;
230         union {
231                 int32_t result;
232                 struct scst_user_scsi_cmd_reply_parse parse_reply;
233                 struct scst_user_scsi_cmd_reply_alloc_mem alloc_reply;
234                 struct scst_user_scsi_cmd_reply_exec exec_reply;
235         };
236 };
237
238 #define SCST_USER_REGISTER_DEVICE       _IOW('u', 1, struct scst_user_dev_desc)
239 #define SCST_USER_SET_OPTIONS           _IOW('u', 3, struct scst_user_opt)
240 #define SCST_USER_GET_OPTIONS           _IOR('u', 4, struct scst_user_opt)
241 #define SCST_USER_REPLY_AND_GET_CMD     _IOWR('u', 5, struct scst_user_get_cmd)
242 #define SCST_USER_REPLY_CMD             _IOW('u', 6, struct scst_user_reply_cmd)
243
244 /* Values for scst_user_get_cmd.subcode */
245 #define SCST_USER_ATTACH_SESS           \
246         _IOR('s', UCMD_STATE_ATTACH_SESS, struct scst_user_sess)
247 #define SCST_USER_DETACH_SESS           \
248         _IOR('s', UCMD_STATE_DETACH_SESS, struct scst_user_sess)
249 #define SCST_USER_PARSE                 \
250         _IOWR('s', UCMD_STATE_PARSING, struct scst_user_scsi_cmd_parse)
251 #define SCST_USER_ALLOC_MEM             \
252         _IOWR('s', UCMD_STATE_BUF_ALLOCING, struct scst_user_scsi_cmd_alloc_mem)
253 #define SCST_USER_EXEC                  \
254         _IOWR('s', UCMD_STATE_EXECING, struct scst_user_scsi_cmd_exec)
255 #define SCST_USER_ON_FREE_CMD           \
256         _IOR('s', UCMD_STATE_ON_FREEING, struct scst_user_scsi_on_free_cmd)
257 #define SCST_USER_ON_CACHED_MEM_FREE            \
258         _IOR('s', UCMD_STATE_ON_CACHE_FREEING,  \
259         struct scst_user_on_cached_mem_free)
260 #define SCST_USER_TASK_MGMT             \
261         _IOWR('s', UCMD_STATE_TM_EXECING, struct scst_user_tm)
262
263 #endif /* __SCST_USER_H */