diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
commit | fcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch) | |
tree | a57612d1888735a2ec7972891b68c1ac5ec8faea /include/target/target_core_transport.h | |
parent | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff) |
Diffstat (limited to 'include/target/target_core_transport.h')
-rw-r--r-- | include/target/target_core_transport.h | 355 |
1 files changed, 355 insertions, 0 deletions
diff --git a/include/target/target_core_transport.h b/include/target/target_core_transport.h new file mode 100644 index 00000000000..46aae4f94ed --- /dev/null +++ b/include/target/target_core_transport.h | |||
@@ -0,0 +1,355 @@ | |||
1 | #ifndef TARGET_CORE_TRANSPORT_H | ||
2 | #define TARGET_CORE_TRANSPORT_H | ||
3 | |||
4 | #define TARGET_CORE_VERSION TARGET_CORE_MOD_VERSION | ||
5 | |||
6 | /* Attempts before moving from SHORT to LONG */ | ||
7 | #define PYX_TRANSPORT_WINDOW_CLOSED_THRESHOLD 3 | ||
8 | #define PYX_TRANSPORT_WINDOW_CLOSED_WAIT_SHORT 3 /* In milliseconds */ | ||
9 | #define PYX_TRANSPORT_WINDOW_CLOSED_WAIT_LONG 10 /* In milliseconds */ | ||
10 | |||
11 | #define PYX_TRANSPORT_STATUS_INTERVAL 5 /* In seconds */ | ||
12 | |||
13 | #define PYX_TRANSPORT_SENT_TO_TRANSPORT 0 | ||
14 | #define PYX_TRANSPORT_WRITE_PENDING 1 | ||
15 | |||
16 | #define PYX_TRANSPORT_UNKNOWN_SAM_OPCODE -1 | ||
17 | #define PYX_TRANSPORT_HBA_QUEUE_FULL -2 | ||
18 | #define PYX_TRANSPORT_REQ_TOO_MANY_SECTORS -3 | ||
19 | #define PYX_TRANSPORT_OUT_OF_MEMORY_RESOURCES -4 | ||
20 | #define PYX_TRANSPORT_INVALID_CDB_FIELD -5 | ||
21 | #define PYX_TRANSPORT_INVALID_PARAMETER_LIST -6 | ||
22 | #define PYX_TRANSPORT_LU_COMM_FAILURE -7 | ||
23 | #define PYX_TRANSPORT_UNKNOWN_MODE_PAGE -8 | ||
24 | #define PYX_TRANSPORT_WRITE_PROTECTED -9 | ||
25 | #define PYX_TRANSPORT_TASK_TIMEOUT -10 | ||
26 | #define PYX_TRANSPORT_RESERVATION_CONFLICT -11 | ||
27 | #define PYX_TRANSPORT_ILLEGAL_REQUEST -12 | ||
28 | #define PYX_TRANSPORT_USE_SENSE_REASON -13 | ||
29 | |||
30 | #ifndef SAM_STAT_RESERVATION_CONFLICT | ||
31 | #define SAM_STAT_RESERVATION_CONFLICT 0x18 | ||
32 | #endif | ||
33 | |||
34 | #define TRANSPORT_PLUGIN_FREE 0 | ||
35 | #define TRANSPORT_PLUGIN_REGISTERED 1 | ||
36 | |||
37 | #define TRANSPORT_PLUGIN_PHBA_PDEV 1 | ||
38 | #define TRANSPORT_PLUGIN_VHBA_PDEV 2 | ||
39 | #define TRANSPORT_PLUGIN_VHBA_VDEV 3 | ||
40 | |||
41 | /* For SE OBJ Plugins, in seconds */ | ||
42 | #define TRANSPORT_TIMEOUT_TUR 10 | ||
43 | #define TRANSPORT_TIMEOUT_TYPE_DISK 60 | ||
44 | #define TRANSPORT_TIMEOUT_TYPE_ROM 120 | ||
45 | #define TRANSPORT_TIMEOUT_TYPE_TAPE 600 | ||
46 | #define TRANSPORT_TIMEOUT_TYPE_OTHER 300 | ||
47 | |||
48 | /* For se_task->task_state_flags */ | ||
49 | #define TSF_EXCEPTION_CLEARED 0x01 | ||
50 | |||
51 | /* | ||
52 | * struct se_subsystem_dev->su_dev_flags | ||
53 | */ | ||
54 | #define SDF_FIRMWARE_VPD_UNIT_SERIAL 0x00000001 | ||
55 | #define SDF_EMULATED_VPD_UNIT_SERIAL 0x00000002 | ||
56 | #define SDF_USING_UDEV_PATH 0x00000004 | ||
57 | #define SDF_USING_ALIAS 0x00000008 | ||
58 | |||
59 | /* | ||
60 | * struct se_device->dev_flags | ||
61 | */ | ||
62 | #define DF_READ_ONLY 0x00000001 | ||
63 | #define DF_SPC2_RESERVATIONS 0x00000002 | ||
64 | #define DF_SPC2_RESERVATIONS_WITH_ISID 0x00000004 | ||
65 | |||
66 | /* struct se_dev_attrib sanity values */ | ||
67 | /* 10 Minutes */ | ||
68 | #define DA_TASK_TIMEOUT_MAX 600 | ||
69 | /* Default max_unmap_lba_count */ | ||
70 | #define DA_MAX_UNMAP_LBA_COUNT 0 | ||
71 | /* Default max_unmap_block_desc_count */ | ||
72 | #define DA_MAX_UNMAP_BLOCK_DESC_COUNT 0 | ||
73 | /* Default unmap_granularity */ | ||
74 | #define DA_UNMAP_GRANULARITY_DEFAULT 0 | ||
75 | /* Default unmap_granularity_alignment */ | ||
76 | #define DA_UNMAP_GRANULARITY_ALIGNMENT_DEFAULT 0 | ||
77 | /* Emulation for Direct Page Out */ | ||
78 | #define DA_EMULATE_DPO 0 | ||
79 | /* Emulation for Forced Unit Access WRITEs */ | ||
80 | #define DA_EMULATE_FUA_WRITE 1 | ||
81 | /* Emulation for Forced Unit Access READs */ | ||
82 | #define DA_EMULATE_FUA_READ 0 | ||
83 | /* Emulation for WriteCache and SYNCHRONIZE_CACHE */ | ||
84 | #define DA_EMULATE_WRITE_CACHE 0 | ||
85 | /* Emulation for UNIT ATTENTION Interlock Control */ | ||
86 | #define DA_EMULATE_UA_INTLLCK_CTRL 0 | ||
87 | /* Emulation for TASK_ABORTED status (TAS) by default */ | ||
88 | #define DA_EMULATE_TAS 1 | ||
89 | /* Emulation for Thin Provisioning UNMAP using block/blk-lib.c:blkdev_issue_discard() */ | ||
90 | #define DA_EMULATE_TPU 0 | ||
91 | /* | ||
92 | * Emulation for Thin Provisioning WRITE_SAME w/ UNMAP=1 bit using | ||
93 | * block/blk-lib.c:blkdev_issue_discard() | ||
94 | */ | ||
95 | #define DA_EMULATE_TPWS 0 | ||
96 | /* No Emulation for PSCSI by default */ | ||
97 | #define DA_EMULATE_RESERVATIONS 0 | ||
98 | /* No Emulation for PSCSI by default */ | ||
99 | #define DA_EMULATE_ALUA 0 | ||
100 | /* Enforce SCSI Initiator Port TransportID with 'ISID' for PR */ | ||
101 | #define DA_ENFORCE_PR_ISIDS 1 | ||
102 | #define DA_STATUS_MAX_SECTORS_MIN 16 | ||
103 | #define DA_STATUS_MAX_SECTORS_MAX 8192 | ||
104 | /* By default don't report non-rotating (solid state) medium */ | ||
105 | #define DA_IS_NONROT 0 | ||
106 | /* Queue Algorithm Modifier default for restricted reordering in control mode page */ | ||
107 | #define DA_EMULATE_REST_REORD 0 | ||
108 | |||
109 | #define SE_MODE_PAGE_BUF 512 | ||
110 | |||
111 | #define MOD_MAX_SECTORS(ms, bs) (ms % (PAGE_SIZE / bs)) | ||
112 | |||
113 | struct se_mem; | ||
114 | struct se_subsystem_api; | ||
115 | |||
116 | extern struct kmem_cache *se_mem_cache; | ||
117 | |||
118 | extern int init_se_kmem_caches(void); | ||
119 | extern void release_se_kmem_caches(void); | ||
120 | extern u32 scsi_get_new_index(scsi_index_t); | ||
121 | extern void transport_init_queue_obj(struct se_queue_obj *); | ||
122 | extern int transport_subsystem_check_init(void); | ||
123 | extern int transport_subsystem_register(struct se_subsystem_api *); | ||
124 | extern void transport_subsystem_release(struct se_subsystem_api *); | ||
125 | extern void transport_load_plugins(void); | ||
126 | extern struct se_session *transport_init_session(void); | ||
127 | extern void __transport_register_session(struct se_portal_group *, | ||
128 | struct se_node_acl *, | ||
129 | struct se_session *, void *); | ||
130 | extern void transport_register_session(struct se_portal_group *, | ||
131 | struct se_node_acl *, | ||
132 | struct se_session *, void *); | ||
133 | extern void transport_free_session(struct se_session *); | ||
134 | extern void transport_deregister_session_configfs(struct se_session *); | ||
135 | extern void transport_deregister_session(struct se_session *); | ||
136 | extern void transport_cmd_finish_abort(struct se_cmd *, int); | ||
137 | extern void transport_cmd_finish_abort_tmr(struct se_cmd *); | ||
138 | extern void transport_complete_sync_cache(struct se_cmd *, int); | ||
139 | extern void transport_complete_task(struct se_task *, int); | ||
140 | extern void transport_add_task_to_execute_queue(struct se_task *, | ||
141 | struct se_task *, | ||
142 | struct se_device *); | ||
143 | extern void transport_remove_task_from_execute_queue(struct se_task *, | ||
144 | struct se_device *); | ||
145 | unsigned char *transport_dump_cmd_direction(struct se_cmd *); | ||
146 | extern void transport_dump_dev_state(struct se_device *, char *, int *); | ||
147 | extern void transport_dump_dev_info(struct se_device *, struct se_lun *, | ||
148 | unsigned long long, char *, int *); | ||
149 | extern void transport_dump_vpd_proto_id(struct t10_vpd *, | ||
150 | unsigned char *, int); | ||
151 | extern void transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *); | ||
152 | extern int transport_dump_vpd_assoc(struct t10_vpd *, | ||
153 | unsigned char *, int); | ||
154 | extern int transport_set_vpd_assoc(struct t10_vpd *, unsigned char *); | ||
155 | extern int transport_dump_vpd_ident_type(struct t10_vpd *, | ||
156 | unsigned char *, int); | ||
157 | extern int transport_set_vpd_ident_type(struct t10_vpd *, unsigned char *); | ||
158 | extern int transport_dump_vpd_ident(struct t10_vpd *, | ||
159 | unsigned char *, int); | ||
160 | extern int transport_set_vpd_ident(struct t10_vpd *, unsigned char *); | ||
161 | extern struct se_device *transport_add_device_to_core_hba(struct se_hba *, | ||
162 | struct se_subsystem_api *, | ||
163 | struct se_subsystem_dev *, u32, | ||
164 | void *, struct se_dev_limits *, | ||
165 | const char *, const char *); | ||
166 | extern void transport_init_se_cmd(struct se_cmd *, | ||
167 | struct target_core_fabric_ops *, | ||
168 | struct se_session *, u32, int, int, | ||
169 | unsigned char *); | ||
170 | void *transport_kmap_first_data_page(struct se_cmd *cmd); | ||
171 | void transport_kunmap_first_data_page(struct se_cmd *cmd); | ||
172 | extern void transport_free_se_cmd(struct se_cmd *); | ||
173 | extern int transport_generic_allocate_tasks(struct se_cmd *, unsigned char *); | ||
174 | extern int transport_generic_handle_cdb(struct se_cmd *); | ||
175 | extern int transport_handle_cdb_direct(struct se_cmd *); | ||
176 | extern int transport_generic_handle_cdb_map(struct se_cmd *); | ||
177 | extern int transport_generic_handle_data(struct se_cmd *); | ||
178 | extern void transport_new_cmd_failure(struct se_cmd *); | ||
179 | extern int transport_generic_handle_tmr(struct se_cmd *); | ||
180 | extern void transport_generic_free_cmd_intr(struct se_cmd *); | ||
181 | extern void __transport_stop_task_timer(struct se_task *, unsigned long *); | ||
182 | extern int transport_generic_map_mem_to_cmd(struct se_cmd *cmd, struct scatterlist *, u32, | ||
183 | struct scatterlist *, u32); | ||
184 | extern int transport_clear_lun_from_sessions(struct se_lun *); | ||
185 | extern int transport_check_aborted_status(struct se_cmd *, int); | ||
186 | extern int transport_send_check_condition_and_sense(struct se_cmd *, u8, int); | ||
187 | extern void transport_send_task_abort(struct se_cmd *); | ||
188 | extern void transport_release_cmd(struct se_cmd *); | ||
189 | extern void transport_generic_free_cmd(struct se_cmd *, int, int); | ||
190 | extern void transport_generic_wait_for_cmds(struct se_cmd *, int); | ||
191 | extern int transport_init_task_sg(struct se_task *, struct se_mem *, u32); | ||
192 | extern int transport_map_mem_to_sg(struct se_task *, struct list_head *, | ||
193 | struct scatterlist *, struct se_mem *, | ||
194 | struct se_mem **, u32 *, u32 *); | ||
195 | extern void transport_do_task_sg_chain(struct se_cmd *); | ||
196 | extern void transport_generic_process_write(struct se_cmd *); | ||
197 | extern int transport_generic_new_cmd(struct se_cmd *); | ||
198 | extern int transport_generic_do_tmr(struct se_cmd *); | ||
199 | /* From target_core_alua.c */ | ||
200 | extern int core_alua_check_nonop_delay(struct se_cmd *); | ||
201 | /* From target_core_cdb.c */ | ||
202 | extern int transport_emulate_control_cdb(struct se_task *); | ||
203 | |||
204 | /* | ||
205 | * Each se_transport_task_t can have N number of possible struct se_task's | ||
206 | * for the storage transport(s) to possibly execute. | ||
207 | * Used primarily for splitting up CDBs that exceed the physical storage | ||
208 | * HBA's maximum sector count per task. | ||
209 | */ | ||
210 | struct se_mem { | ||
211 | struct page *se_page; | ||
212 | u32 se_len; | ||
213 | u32 se_off; | ||
214 | struct list_head se_list; | ||
215 | } ____cacheline_aligned; | ||
216 | |||
217 | /* | ||
218 | * Each type of disk transport supported MUST have a template defined | ||
219 | * within its .h file. | ||
220 | */ | ||
221 | struct se_subsystem_api { | ||
222 | /* | ||
223 | * The Name. :-) | ||
224 | */ | ||
225 | char name[16]; | ||
226 | /* | ||
227 | * Transport Type. | ||
228 | */ | ||
229 | u8 transport_type; | ||
230 | /* | ||
231 | * struct module for struct se_hba references | ||
232 | */ | ||
233 | struct module *owner; | ||
234 | /* | ||
235 | * Used for global se_subsystem_api list_head | ||
236 | */ | ||
237 | struct list_head sub_api_list; | ||
238 | /* | ||
239 | * For SCF_SCSI_NON_DATA_CDB | ||
240 | */ | ||
241 | int (*cdb_none)(struct se_task *); | ||
242 | /* | ||
243 | * For SCF_SCSI_DATA_SG_IO_CDB | ||
244 | */ | ||
245 | int (*map_data_SG)(struct se_task *); | ||
246 | /* | ||
247 | * For SCF_SCSI_CONTROL_SG_IO_CDB | ||
248 | */ | ||
249 | int (*map_control_SG)(struct se_task *); | ||
250 | /* | ||
251 | * attach_hba(): | ||
252 | */ | ||
253 | int (*attach_hba)(struct se_hba *, u32); | ||
254 | /* | ||
255 | * detach_hba(): | ||
256 | */ | ||
257 | void (*detach_hba)(struct se_hba *); | ||
258 | /* | ||
259 | * pmode_hba(): Used for TCM/pSCSI subsystem plugin HBA -> | ||
260 | * Linux/SCSI struct Scsi_Host passthrough | ||
261 | */ | ||
262 | int (*pmode_enable_hba)(struct se_hba *, unsigned long); | ||
263 | /* | ||
264 | * allocate_virtdevice(): | ||
265 | */ | ||
266 | void *(*allocate_virtdevice)(struct se_hba *, const char *); | ||
267 | /* | ||
268 | * create_virtdevice(): Only for Virtual HBAs | ||
269 | */ | ||
270 | struct se_device *(*create_virtdevice)(struct se_hba *, | ||
271 | struct se_subsystem_dev *, void *); | ||
272 | /* | ||
273 | * free_device(): | ||
274 | */ | ||
275 | void (*free_device)(void *); | ||
276 | |||
277 | /* | ||
278 | * dpo_emulated(): | ||
279 | */ | ||
280 | int (*dpo_emulated)(struct se_device *); | ||
281 | /* | ||
282 | * fua_write_emulated(): | ||
283 | */ | ||
284 | int (*fua_write_emulated)(struct se_device *); | ||
285 | /* | ||
286 | * fua_read_emulated(): | ||
287 | */ | ||
288 | int (*fua_read_emulated)(struct se_device *); | ||
289 | /* | ||
290 | * write_cache_emulated(): | ||
291 | */ | ||
292 | int (*write_cache_emulated)(struct se_device *); | ||
293 | /* | ||
294 | * transport_complete(): | ||
295 | * | ||
296 | * Use transport_generic_complete() for majority of DAS transport | ||
297 | * drivers. Provided out of convenience. | ||
298 | */ | ||
299 | int (*transport_complete)(struct se_task *task); | ||
300 | struct se_task *(*alloc_task)(unsigned char *cdb); | ||
301 | /* | ||
302 | * do_task(): | ||
303 | */ | ||
304 | int (*do_task)(struct se_task *); | ||
305 | /* | ||
306 | * Used by virtual subsystem plugins IBLOCK and FILEIO to emulate | ||
307 | * UNMAP and WRITE_SAME_* w/ UNMAP=1 <-> Linux/Block Discard | ||
308 | */ | ||
309 | int (*do_discard)(struct se_device *, sector_t, u32); | ||
310 | /* | ||
311 | * Used by virtual subsystem plugins IBLOCK and FILEIO to emulate | ||
312 | * SYNCHRONIZE_CACHE_* <-> Linux/Block blkdev_issue_flush() | ||
313 | */ | ||
314 | void (*do_sync_cache)(struct se_task *); | ||
315 | /* | ||
316 | * free_task(): | ||
317 | */ | ||
318 | void (*free_task)(struct se_task *); | ||
319 | /* | ||
320 | * check_configfs_dev_params(): | ||
321 | */ | ||
322 | ssize_t (*check_configfs_dev_params)(struct se_hba *, struct se_subsystem_dev *); | ||
323 | /* | ||
324 | * set_configfs_dev_params(): | ||
325 | */ | ||
326 | ssize_t (*set_configfs_dev_params)(struct se_hba *, struct se_subsystem_dev *, | ||
327 | const char *, ssize_t); | ||
328 | /* | ||
329 | * show_configfs_dev_params(): | ||
330 | */ | ||
331 | ssize_t (*show_configfs_dev_params)(struct se_hba *, struct se_subsystem_dev *, | ||
332 | char *); | ||
333 | /* | ||
334 | * get_cdb(): | ||
335 | */ | ||
336 | unsigned char *(*get_cdb)(struct se_task *); | ||
337 | /* | ||
338 | * get_device_rev(): | ||
339 | */ | ||
340 | u32 (*get_device_rev)(struct se_device *); | ||
341 | /* | ||
342 | * get_device_type(): | ||
343 | */ | ||
344 | u32 (*get_device_type)(struct se_device *); | ||
345 | /* | ||
346 | * Get the sector_t from a subsystem backstore.. | ||
347 | */ | ||
348 | sector_t (*get_blocks)(struct se_device *); | ||
349 | /* | ||
350 | * get_sense_buffer(): | ||
351 | */ | ||
352 | unsigned char *(*get_sense_buffer)(struct se_task *); | ||
353 | } ____cacheline_aligned; | ||
354 | |||
355 | #endif /* TARGET_CORE_TRANSPORT_H */ | ||