- QLA: minor cleanups
[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                DEV_USER_VERSION_NAME "$Revision$" SCST_CONST_VERSION
31
32 /*
33  * Chosen so sizeof(scst_user_sess) <= sizeof(scst_user_scsi_cmd_exec)
34  * (the largest one)
35  */
36 #define SCST_MAX_NAME                   45
37
38 #define SCST_USER_PARSE_STANDARD        0
39 #define SCST_USER_PARSE_CALL            1
40 #define SCST_USER_PARSE_EXCEPTION       2
41 #define SCST_USER_MAX_PARSE_OPT         SCST_USER_PARSE_EXCEPTION
42
43 #define SCST_USER_ON_FREE_CMD_CALL      0
44 #define SCST_USER_ON_FREE_CMD_IGNORE    1
45 #define SCST_USER_MAX_ON_FREE_CMD_OPT   SCST_USER_ON_FREE_CMD_IGNORE
46
47 #define SCST_USER_MEM_NO_REUSE          0
48 #define SCST_USER_MEM_REUSE_READ        1
49 #define SCST_USER_MEM_REUSE_WRITE       2
50 #define SCST_USER_MEM_REUSE_ALL         3
51 #define SCST_USER_MAX_MEM_REUSE_OPT     SCST_USER_MEM_REUSE_ALL
52
53 #define SCST_USER_PARTIAL_TRANSFERS_NOT_SUPPORTED       0
54 #define SCST_USER_PARTIAL_TRANSFERS_SUPPORTED_ORDERED   1
55 #define SCST_USER_PARTIAL_TRANSFERS_SUPPORTED           2
56 #define SCST_USER_MAX_PARTIAL_TRANSFERS_OPT             SCST_USER_PARTIAL_TRANSFERS_SUPPORTED
57
58 #ifndef aligned_u64
59 #define aligned_u64 uint64_t __attribute__((aligned(8)))
60 #endif
61
62 /*************************************************************
63  ** Private ucmd states
64  *************************************************************/
65 #define UCMD_STATE_NEW                  0
66 #define UCMD_STATE_PARSING              1
67 #define UCMD_STATE_BUF_ALLOCING         2
68 #define UCMD_STATE_EXECING              3
69 #define UCMD_STATE_ON_FREEING           4
70 #define UCMD_STATE_ON_FREE_SKIPPED      5
71 #define UCMD_STATE_ON_CACHE_FREEING     6
72 #define UCMD_STATE_TM_EXECING           7
73
74 #define UCMD_STATE_ATTACH_SESS          0x20
75 #define UCMD_STATE_DETACH_SESS          0x21
76
77 struct scst_user_opt {
78         uint8_t parse_type;
79         uint8_t on_free_cmd_type;
80         uint8_t memory_reuse_type;
81         uint8_t partial_transfers_type;
82         int32_t partial_len;
83
84         /* SCSI control mode page parameters, see SPC */
85         uint8_t tst;
86         uint8_t queue_alg;
87         uint8_t tas;
88         uint8_t swp;
89
90         uint8_t has_own_order_mgmt;
91 };
92
93 struct scst_user_dev_desc {
94         aligned_u64 version_str;
95         uint8_t type;
96         struct scst_user_opt opt;
97         uint32_t block_size;
98         char name[SCST_MAX_NAME];
99 };
100
101 struct scst_user_sess {
102         aligned_u64 sess_h;
103         aligned_u64 lun;
104         uint16_t threads_num;
105         uint8_t rd_only;
106         char initiator_name[SCST_MAX_NAME];
107 };
108
109 struct scst_user_scsi_cmd_parse {
110         aligned_u64 sess_h;
111
112         uint8_t cdb[SCST_MAX_CDB_SIZE];
113         int32_t cdb_len;
114
115         int32_t timeout;
116         int32_t bufflen;
117
118         uint8_t queue_type;
119         uint8_t data_direction;
120
121         uint8_t expected_values_set;
122         uint8_t expected_data_direction;
123         int32_t expected_transfer_len;
124
125         uint32_t sn;
126 };
127
128 struct scst_user_scsi_cmd_alloc_mem {
129         aligned_u64 sess_h;
130
131         uint8_t cdb[SCST_MAX_CDB_SIZE];
132         int32_t cdb_len;
133
134         int32_t alloc_len;
135
136         uint8_t queue_type;
137         uint8_t data_direction;
138
139         uint32_t sn;
140 };
141
142 struct scst_user_scsi_cmd_exec {
143         aligned_u64 sess_h;
144
145         uint8_t cdb[SCST_MAX_CDB_SIZE];
146         int32_t cdb_len;
147
148         int32_t data_len;
149         int32_t bufflen;
150         int32_t alloc_len;
151         aligned_u64 pbuf;
152         uint8_t queue_type;
153         uint8_t data_direction;
154         uint8_t partial;
155         int32_t timeout;
156
157         uint32_t sn;
158
159         uint32_t parent_cmd_h;
160         int32_t parent_cmd_data_len;
161         uint32_t partial_offset;
162 };
163
164 struct scst_user_scsi_on_free_cmd {
165         aligned_u64 pbuf;
166         int32_t resp_data_len;
167         uint8_t buffer_cached;
168         uint8_t aborted;
169         uint8_t status;
170         uint8_t delivery_status;
171 };
172
173 struct scst_user_on_cached_mem_free {
174         aligned_u64 pbuf;
175 };
176
177 struct scst_user_tm {
178         aligned_u64 sess_h;
179         uint32_t fn;
180         uint32_t cmd_h_to_abort;
181         uint32_t cmd_sn;
182         uint8_t cmd_sn_set;
183 };
184
185 struct scst_user_get_cmd {
186         aligned_u64 preply;
187         uint32_t cmd_h;
188         uint32_t subcode;
189         union {
190                 struct scst_user_sess sess;
191                 struct scst_user_scsi_cmd_parse parse_cmd;
192                 struct scst_user_scsi_cmd_alloc_mem alloc_cmd;
193                 struct scst_user_scsi_cmd_exec exec_cmd;
194                 struct scst_user_scsi_on_free_cmd on_free_cmd;
195                 struct scst_user_on_cached_mem_free on_cached_mem_free;
196                 struct scst_user_tm tm_cmd;
197         };
198 };
199
200 /* Be careful adding new members here, this structure is allocated on stack! */
201 struct scst_user_scsi_cmd_reply_parse {
202         uint8_t queue_type;
203         uint8_t data_direction;
204         int32_t data_len;
205         int32_t bufflen;
206 };
207
208 /* Be careful adding new members here, this structure is allocated on stack! */
209 struct scst_user_scsi_cmd_reply_alloc_mem {
210         aligned_u64 pbuf;
211 };
212
213 /* Be careful adding new members here, this structure is allocated on stack! */
214 struct scst_user_scsi_cmd_reply_exec {
215         int32_t resp_data_len;
216         aligned_u64 pbuf;
217
218 #define SCST_EXEC_REPLY_BACKGROUND      0
219 #define SCST_EXEC_REPLY_COMPLETED       1
220         uint8_t reply_type;
221
222         uint8_t status;
223         uint8_t sense_len;
224         aligned_u64 psense_buffer;
225 };
226
227 /* Be careful adding new members here, this structure is allocated on stack! */
228 struct scst_user_reply_cmd {
229         uint32_t cmd_h;
230         uint32_t subcode;
231         union {
232                 int32_t result;
233                 struct scst_user_scsi_cmd_reply_parse parse_reply;
234                 struct scst_user_scsi_cmd_reply_alloc_mem alloc_reply;
235                 struct scst_user_scsi_cmd_reply_exec exec_reply;
236         };
237 };
238
239 #define SCST_USER_REGISTER_DEVICE       _IOW('u', 1, struct scst_user_dev_desc)
240 #define SCST_USER_SET_OPTIONS           _IOW('u', 3, struct scst_user_opt)
241 #define SCST_USER_GET_OPTIONS           _IOR('u', 4, struct scst_user_opt)
242 #define SCST_USER_REPLY_AND_GET_CMD     _IOWR('u', 5, struct scst_user_get_cmd)
243 #define SCST_USER_REPLY_CMD             _IOW('u', 6, struct scst_user_reply_cmd)
244
245 /* Values for scst_user_get_cmd.subcode */
246 #define SCST_USER_ATTACH_SESS           _IOR('s', UCMD_STATE_ATTACH_SESS, struct scst_user_sess)
247 #define SCST_USER_DETACH_SESS           _IOR('s', UCMD_STATE_DETACH_SESS, struct scst_user_sess)
248 #define SCST_USER_PARSE                 _IOWR('s', UCMD_STATE_PARSING, struct scst_user_scsi_cmd_parse)
249 #define SCST_USER_ALLOC_MEM             _IOWR('s', UCMD_STATE_BUF_ALLOCING, struct scst_user_scsi_cmd_alloc_mem)
250 #define SCST_USER_EXEC                  _IOWR('s', UCMD_STATE_EXECING, struct scst_user_scsi_cmd_exec)
251 #define SCST_USER_ON_FREE_CMD           _IOR('s', UCMD_STATE_ON_FREEING, struct scst_user_scsi_on_free_cmd)
252 #define SCST_USER_ON_CACHED_MEM_FREE    _IOR('s', UCMD_STATE_ON_CACHE_FREEING, struct scst_user_on_cached_mem_free)
253 #define SCST_USER_TASK_MGMT             _IOWR('s', UCMD_STATE_TM_EXECING, struct scst_user_tm)
254
255 #endif /* __SCST_USER_H */