| /* |
| * include/scst_user.h |
| * |
| * Copyright (C) 2007 - 2018 Vladislav Bolkhovitin <vst@vlnb.net> |
| * Copyright (C) 2007 - 2018 Western Digital Corporation |
| * |
| * Contains constants and data structures for scst_user module. |
| * See http://scst.sourceforge.net/doc/scst_user_spec.txt or |
| * scst_user_spec.txt for description. |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation, version 2 |
| * of the License. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| */ |
| |
| #ifndef __SCST_USER_H |
| #define __SCST_USER_H |
| |
| #ifdef INSIDE_KERNEL_TREE |
| #include <scst/scst_const.h> |
| #else |
| #include <scst_const.h> |
| #endif |
| |
| #define DEV_USER_NAME "scst_user" |
| #define DEV_USER_PATH "/dev/" |
| #define DEV_USER_VERSION_NAME SCST_VERSION_NAME |
| #define DEV_USER_VERSION \ |
| DEV_USER_VERSION_NAME DEV_USER_INTF_VER SCST_CONST_VERSION |
| |
| #define SCST_USER_PARSE_STANDARD 0 |
| #define SCST_USER_PARSE_CALL 1 |
| #define SCST_USER_PARSE_EXCEPTION 2 |
| #define SCST_USER_MAX_PARSE_OPT SCST_USER_PARSE_EXCEPTION |
| |
| #define SCST_USER_ON_FREE_CMD_CALL 0 |
| #define SCST_USER_ON_FREE_CMD_IGNORE 1 |
| #define SCST_USER_MAX_ON_FREE_CMD_OPT SCST_USER_ON_FREE_CMD_IGNORE |
| |
| #define SCST_USER_MEM_NO_REUSE 0 |
| #define SCST_USER_MEM_REUSE_READ 1 |
| #define SCST_USER_MEM_REUSE_WRITE 2 |
| #define SCST_USER_MEM_REUSE_ALL 3 |
| #define SCST_USER_MAX_MEM_REUSE_OPT SCST_USER_MEM_REUSE_ALL |
| |
| #define SCST_USER_PARTIAL_TRANSFERS_NOT_SUPPORTED 0 |
| #define SCST_USER_PARTIAL_TRANSFERS_SUPPORTED_ORDERED 1 |
| #define SCST_USER_PARTIAL_TRANSFERS_SUPPORTED 2 |
| #define SCST_USER_MAX_PARTIAL_TRANSFERS_OPT \ |
| SCST_USER_PARTIAL_TRANSFERS_SUPPORTED |
| |
| #ifndef __KERNEL__ |
| #define aligned_u64 uint64_t __attribute__((aligned(8))) |
| #endif |
| |
| #ifndef aligned_i64 |
| #define aligned_i64 int64_t __attribute__((aligned(8))) |
| #endif |
| |
| /************************************************************* |
| ** Private ucmd states |
| *************************************************************/ |
| #define UCMD_STATE_NEW 0 |
| #define UCMD_STATE_PARSING 1 |
| #define UCMD_STATE_BUF_ALLOCING 2 |
| #define UCMD_STATE_EXECING 3 |
| #define UCMD_STATE_ON_FREEING 4 |
| #define UCMD_STATE_ON_CACHE_FREEING 5 |
| #define UCMD_STATE_EXT_COPY_REMAPPING 6 |
| #define UCMD_STATE_ON_FREE_SKIPPED 7 |
| #define UCMD_STATE_TM_RECEIVED_EXECING 8 |
| #define UCMD_STATE_TM_DONE_EXECING 9 |
| |
| #define UCMD_STATE_ATTACH_SESS 0x20 |
| #define UCMD_STATE_DETACH_SESS 0x21 |
| |
| struct scst_user_opt { |
| uint8_t parse_type; |
| uint8_t on_free_cmd_type; |
| uint8_t memory_reuse_type; |
| uint8_t partial_transfers_type; |
| int32_t partial_len; |
| |
| /* SCSI control mode page parameters, see SPC */ |
| uint8_t tst; |
| uint8_t tmf_only; |
| uint8_t queue_alg; |
| uint8_t qerr; |
| uint8_t tas; |
| uint8_t swp; |
| uint8_t d_sense; |
| |
| uint8_t has_own_order_mgmt; |
| |
| uint8_t ext_copy_remap_supported; |
| }; |
| |
| struct scst_user_dev_desc { |
| aligned_u64 version_str; |
| aligned_u64 license_str; |
| uint8_t type; |
| uint8_t sgv_shared; |
| uint8_t sgv_disable_clustered_pool; |
| int32_t sgv_single_alloc_pages; |
| int32_t sgv_purge_interval; |
| struct scst_user_opt opt; |
| uint32_t block_size; |
| uint8_t enable_pr_cmds_notifications; |
| char name[SCST_MAX_NAME]; |
| char sgv_name[SCST_MAX_NAME]; |
| }; |
| |
| struct scst_user_sess { |
| aligned_u64 sess_h; |
| aligned_u64 lun; |
| uint16_t threads_num; |
| uint8_t rd_only; |
| uint16_t scsi_transport_version; |
| uint16_t phys_transport_version; |
| char initiator_name[SCST_MAX_EXTERNAL_NAME]; |
| char target_name[SCST_MAX_EXTERNAL_NAME]; |
| }; |
| |
| struct scst_user_scsi_cmd_parse { |
| aligned_u64 sess_h; |
| |
| uint8_t cdb[SCST_MAX_CDB_SIZE]; |
| uint16_t cdb_len; |
| |
| aligned_i64 lba; |
| |
| aligned_i64 data_len; |
| int32_t bufflen; |
| int32_t out_bufflen; |
| int32_t timeout; |
| |
| uint32_t op_flags; |
| |
| uint8_t queue_type; |
| uint8_t data_direction; |
| |
| uint8_t expected_values_set; |
| uint8_t expected_data_direction; |
| int32_t expected_transfer_len; |
| int32_t expected_out_transfer_len; |
| |
| uint32_t sn; |
| }; |
| |
| struct scst_user_scsi_cmd_alloc_mem { |
| aligned_u64 sess_h; |
| |
| uint8_t cdb[SCST_MAX_CDB_SIZE]; |
| uint16_t cdb_len; |
| |
| int32_t alloc_len; |
| |
| uint8_t queue_type; |
| uint8_t data_direction; |
| |
| uint32_t sn; |
| }; |
| |
| struct scst_user_scsi_cmd_exec { |
| aligned_u64 sess_h; |
| |
| uint8_t cdb[SCST_MAX_CDB_SIZE]; |
| uint16_t cdb_len; |
| |
| aligned_i64 lba; |
| |
| aligned_i64 data_len; |
| int32_t bufflen; |
| int32_t alloc_len; |
| aligned_u64 pbuf; |
| uint8_t queue_type; |
| uint8_t data_direction; |
| uint8_t partial; |
| int32_t timeout; |
| |
| aligned_u64 p_out_buf; |
| int32_t out_bufflen; |
| |
| uint32_t sn; |
| |
| uint32_t parent_cmd_h; |
| int32_t parent_cmd_data_len; |
| uint32_t partial_offset; |
| }; |
| |
| struct scst_user_scsi_on_free_cmd { |
| aligned_u64 pbuf; |
| int32_t resp_data_len; |
| uint8_t buffer_cached; |
| uint8_t aborted; |
| uint8_t status; |
| uint8_t delivery_status; |
| }; |
| |
| struct scst_user_on_cached_mem_free { |
| aligned_u64 pbuf; |
| }; |
| |
| struct scst_user_tm { |
| aligned_u64 sess_h; |
| uint32_t fn; |
| uint32_t cmd_h_to_abort; |
| uint32_t cmd_sn; |
| uint8_t cmd_sn_set; |
| }; |
| |
| struct scst_user_ext_copy_data_descr { |
| aligned_u64 src_lba; |
| aligned_u64 dst_lba; |
| int32_t data_len; /* in bytes */ |
| }; |
| |
| struct scst_user_ext_copy_remap { |
| aligned_u64 sess_h; |
| aligned_u64 src_sess_h; |
| aligned_u64 dst_sess_h; |
| struct scst_user_ext_copy_data_descr data_descr; |
| }; |
| |
| struct scst_user_get_cmd { |
| uint32_t cmd_h; |
| uint32_t subcode; |
| union { |
| aligned_u64 preply; |
| struct scst_user_sess sess; |
| struct scst_user_scsi_cmd_parse parse_cmd; |
| struct scst_user_scsi_cmd_alloc_mem alloc_cmd; |
| struct scst_user_scsi_cmd_exec exec_cmd; |
| struct scst_user_scsi_on_free_cmd on_free_cmd; |
| struct scst_user_on_cached_mem_free on_cached_mem_free; |
| struct scst_user_tm tm_cmd; |
| struct scst_user_ext_copy_remap remap_cmd; |
| }; |
| }; |
| |
| /* Be careful adding new members here, this structure is allocated on stack! */ |
| struct scst_user_scsi_cmd_reply_parse { |
| uint8_t status; |
| union { |
| struct { |
| uint8_t queue_type; |
| uint8_t data_direction; |
| uint16_t cdb_len; |
| aligned_i64 lba; |
| aligned_i64 data_len; |
| int32_t bufflen; |
| uint32_t op_flags; |
| int32_t out_bufflen; |
| }; |
| struct { |
| uint8_t sense_len; |
| aligned_u64 psense_buffer; |
| }; |
| }; |
| }; |
| |
| /* Be careful adding new members here, this structure is allocated on stack! */ |
| struct scst_user_scsi_cmd_reply_alloc_mem { |
| aligned_u64 pbuf; |
| }; |
| |
| /* |
| * Same as struct scst_data_descriptor, but suitable to pass kernel/user |
| * space boundary |
| */ |
| struct scst_user_data_descriptor { |
| aligned_u64 usdd_lba; |
| aligned_u64 usdd_blocks; |
| }; |
| |
| /* Be careful adding new members here, this structure is allocated on stack! */ |
| struct scst_user_scsi_cmd_reply_exec { |
| int32_t resp_data_len; |
| aligned_u64 pbuf; |
| |
| #define SCST_EXEC_REPLY_BACKGROUND 0 |
| #define SCST_EXEC_REPLY_COMPLETED 1 |
| #define SCST_EXEC_REPLY_DO_WRITE_SAME 2 |
| uint8_t reply_type; |
| |
| uint8_t status; |
| union { |
| struct { |
| uint8_t sense_len; |
| aligned_u64 psense_buffer; |
| }; |
| struct { |
| uint16_t ws_descriptors_len; |
| aligned_u64 ws_descriptors; |
| }; |
| }; |
| }; |
| |
| /* Be careful adding new members here, this structure is allocated on stack! */ |
| struct scst_user_ext_copy_reply_remap { |
| aligned_u64 remap_descriptors; |
| uint16_t remap_descriptors_len; |
| uint8_t status; |
| uint8_t sense_len; |
| aligned_u64 psense_buffer; |
| }; |
| |
| /* Be careful adding new members here, this structure is allocated on stack! */ |
| struct scst_user_reply_cmd { |
| uint32_t cmd_h; |
| uint32_t subcode; |
| union { |
| int32_t result; |
| struct scst_user_scsi_cmd_reply_parse parse_reply; |
| struct scst_user_scsi_cmd_reply_alloc_mem alloc_reply; |
| struct scst_user_scsi_cmd_reply_exec exec_reply; |
| struct scst_user_ext_copy_reply_remap remap_reply; |
| }; |
| }; |
| |
| /* Be careful adding new members here, this structure is allocated on stack! */ |
| struct scst_user_get_ext_cdb { |
| uint32_t cmd_h; |
| aligned_u64 ext_cdb_buffer; |
| }; |
| |
| /* Be careful adding new members here, this structure is allocated on stack! */ |
| struct scst_user_prealloc_buffer_in { |
| aligned_u64 pbuf; |
| uint32_t bufflen; |
| uint8_t for_clust_pool; |
| }; |
| |
| /* Be careful adding new members here, this structure is allocated on stack! */ |
| struct scst_user_prealloc_buffer_out { |
| uint32_t cmd_h; |
| }; |
| |
| /* Be careful adding new members here, this structure is allocated on stack! */ |
| union scst_user_prealloc_buffer { |
| struct scst_user_prealloc_buffer_in in; |
| struct scst_user_prealloc_buffer_out out; |
| }; |
| |
| struct scst_user_get_multi { |
| aligned_u64 preplies; /* in */ |
| int16_t replies_cnt; /* in */ |
| int16_t replies_done; /* out */ |
| int16_t cmds_cnt; /* in/out */ |
| int16_t pad; |
| struct scst_user_get_cmd cmds[0]; /* out */ |
| }; |
| |
| #define SCST_USER_REGISTER_DEVICE _IOW('u', 1, struct scst_user_dev_desc) |
| #define SCST_USER_UNREGISTER_DEVICE _IO('u', 2) |
| #define SCST_USER_SET_OPTIONS _IOW('u', 3, struct scst_user_opt) |
| #define SCST_USER_GET_OPTIONS _IOR('u', 4, struct scst_user_opt) |
| #define SCST_USER_REPLY_AND_GET_CMD _IOWR('u', 5, struct scst_user_get_cmd) |
| #define SCST_USER_REPLY_CMD _IOW('u', 6, struct scst_user_reply_cmd) |
| #define SCST_USER_FLUSH_CACHE _IO('u', 7) |
| #define SCST_USER_DEVICE_CAPACITY_CHANGED _IO('u', 8) |
| #define SCST_USER_GET_EXTENDED_CDB _IOWR('u', 9, struct scst_user_get_ext_cdb) |
| #define SCST_USER_PREALLOC_BUFFER _IOWR('u', 10, union scst_user_prealloc_buffer) |
| #define SCST_USER_REPLY_AND_GET_MULTI _IOWR('u', 11, struct scst_user_get_multi) |
| |
| /* Values for scst_user_get_cmd.subcode */ |
| #define SCST_USER_ATTACH_SESS \ |
| _IOR('s', UCMD_STATE_ATTACH_SESS, struct scst_user_sess) |
| #define SCST_USER_DETACH_SESS \ |
| _IOR('s', UCMD_STATE_DETACH_SESS, struct scst_user_sess) |
| #define SCST_USER_PARSE \ |
| _IOWR('s', UCMD_STATE_PARSING, struct scst_user_scsi_cmd_parse) |
| #define SCST_USER_ALLOC_MEM \ |
| _IOWR('s', UCMD_STATE_BUF_ALLOCING, struct scst_user_scsi_cmd_alloc_mem) |
| #define SCST_USER_EXEC \ |
| _IOWR('s', UCMD_STATE_EXECING, struct scst_user_scsi_cmd_exec) |
| #define SCST_USER_ON_FREE_CMD \ |
| _IOR('s', UCMD_STATE_ON_FREEING, struct scst_user_scsi_on_free_cmd) |
| #define SCST_USER_ON_CACHED_MEM_FREE \ |
| _IOR('s', UCMD_STATE_ON_CACHE_FREEING, \ |
| struct scst_user_on_cached_mem_free) |
| #define SCST_USER_TASK_MGMT_RECEIVED \ |
| _IOWR('s', UCMD_STATE_TM_RECEIVED_EXECING, struct scst_user_tm) |
| #define SCST_USER_TASK_MGMT_DONE \ |
| _IOWR('s', UCMD_STATE_TM_DONE_EXECING, struct scst_user_tm) |
| #define SCST_USER_EXT_COPY_REMAP \ |
| _IOWR('s', UCMD_STATE_EXT_COPY_REMAPPING, struct scst_user_ext_copy_remap) |
| |
| #endif /* __SCST_USER_H */ |