summaryrefslogtreecommitdiffstats
path: root/sys/cam/ctl/ctl_ioctl.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cam/ctl/ctl_ioctl.h')
-rw-r--r--sys/cam/ctl/ctl_ioctl.h604
1 files changed, 604 insertions, 0 deletions
diff --git a/sys/cam/ctl/ctl_ioctl.h b/sys/cam/ctl/ctl_ioctl.h
new file mode 100644
index 0000000..7ca78eb
--- /dev/null
+++ b/sys/cam/ctl/ctl_ioctl.h
@@ -0,0 +1,604 @@
+/*-
+ * Copyright (c) 2003 Silicon Graphics International Corp.
+ * Copyright (c) 2011 Spectra Logic Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ * substantially similar to the "NO WARRANTY" disclaimer below
+ * ("Disclaimer") and any redistribution must be conditioned upon
+ * including a substantially similar Disclaimer requirement for further
+ * binary redistribution.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * $Id: //depot/users/kenm/FreeBSD-test2/sys/cam/ctl/ctl_ioctl.h#4 $
+ * $FreeBSD$
+ */
+/*
+ * CAM Target Layer ioctl interface.
+ *
+ * Author: Ken Merry <ken@FreeBSD.org>
+ */
+
+#ifndef _CTL_IOCTL_H_
+#define _CTL_IOCTL_H_
+
+#define CTL_DEFAULT_DEV "/dev/cam/ctl"
+/*
+ * Maximum number of targets we support.
+ */
+#define CTL_MAX_TARGETS 1
+
+/*
+ * Maximum target ID we support.
+ */
+#define CTL_MAX_TARGID 15
+
+/*
+ * Maximum number of LUNs we support at the moment. MUST be a power of 2.
+ */
+#define CTL_MAX_LUNS 256
+
+/*
+ * Maximum number of initiators per port.
+ */
+#define CTL_MAX_INIT_PER_PORT 2048 // Was 16
+
+/*
+ * Maximum number of ports registered at one time.
+ */
+#define CTL_MAX_PORTS 32
+
+/*
+ * Maximum number of initiators we support.
+ */
+#define CTL_MAX_INITIATORS (CTL_MAX_INIT_PER_PORT * CTL_MAX_PORTS)
+
+/* Hopefully this won't conflict with new misc devices that pop up */
+#define CTL_MINOR 225
+
+typedef enum {
+ CTL_OOA_INVALID_LUN,
+ CTL_OOA_SUCCESS
+} ctl_ooa_status;
+
+struct ctl_ooa_info {
+ uint32_t target_id; /* Passed in to CTL */
+ uint32_t lun_id; /* Passed in to CTL */
+ uint32_t num_entries; /* Returned from CTL */
+ ctl_ooa_status status; /* Returned from CTL */
+};
+
+struct ctl_hard_startstop_info {
+ cfi_mt_status status;
+ int total_luns;
+ int luns_complete;
+ int luns_failed;
+};
+
+struct ctl_bbrread_info {
+ int lun_num; /* Passed in to CTL */
+ uint64_t lba; /* Passed in to CTL */
+ int len; /* Passed in to CTL */
+ cfi_mt_status status; /* Returned from CTL */
+ cfi_bbrread_status bbr_status; /* Returned from CTL */
+ uint8_t scsi_status; /* Returned from CTL */
+ struct scsi_sense_data sense_data; /* Returned from CTL */
+};
+
+typedef enum {
+ CTL_DELAY_TYPE_NONE,
+ CTL_DELAY_TYPE_CONT,
+ CTL_DELAY_TYPE_ONESHOT
+} ctl_delay_type;
+
+typedef enum {
+ CTL_DELAY_LOC_NONE,
+ CTL_DELAY_LOC_DATAMOVE,
+ CTL_DELAY_LOC_DONE,
+} ctl_delay_location;
+
+typedef enum {
+ CTL_DELAY_STATUS_NONE,
+ CTL_DELAY_STATUS_OK,
+ CTL_DELAY_STATUS_INVALID_LUN,
+ CTL_DELAY_STATUS_INVALID_TYPE,
+ CTL_DELAY_STATUS_INVALID_LOC,
+ CTL_DELAY_STATUS_NOT_IMPLEMENTED
+} ctl_delay_status;
+
+struct ctl_io_delay_info {
+ uint32_t target_id;
+ uint32_t lun_id;
+ ctl_delay_type delay_type;
+ ctl_delay_location delay_loc;
+ uint32_t delay_secs;
+ ctl_delay_status status;
+};
+
+typedef enum {
+ CTL_GS_SYNC_NONE,
+ CTL_GS_SYNC_OK,
+ CTL_GS_SYNC_NO_LUN
+} ctl_gs_sync_status;
+
+/*
+ * The target and LUN id specify which device to modify. The sync interval
+ * means that we will let through every N SYNCHRONIZE CACHE commands.
+ */
+struct ctl_sync_info {
+ uint32_t target_id; /* passed to kernel */
+ uint32_t lun_id; /* passed to kernel */
+ int sync_interval; /* depends on whether get/set */
+ ctl_gs_sync_status status; /* passed from kernel */
+};
+
+typedef enum {
+ CTL_STATS_NO_IO,
+ CTL_STATS_READ,
+ CTL_STATS_WRITE
+} ctl_stat_types;
+#define CTL_STATS_NUM_TYPES 3
+
+typedef enum {
+ CTL_LUN_STATS_NO_BLOCKSIZE = 0x01
+} ctl_lun_stats_flags;
+
+struct ctl_lun_io_port_stats {
+ uint32_t targ_port;
+ uint64_t bytes[CTL_STATS_NUM_TYPES];
+ uint64_t operations[CTL_STATS_NUM_TYPES];
+ struct bintime time[CTL_STATS_NUM_TYPES];
+ uint64_t num_dmas[CTL_STATS_NUM_TYPES];
+ struct bintime dma_time[CTL_STATS_NUM_TYPES];
+};
+
+struct ctl_lun_io_stats {
+ uint8_t device_type;
+ uint64_t lun_number;
+ uint32_t blocksize;
+ ctl_lun_stats_flags flags;
+ struct ctl_lun_io_port_stats ports[CTL_MAX_PORTS];
+};
+
+typedef enum {
+ CTL_SS_OK,
+ CTL_SS_NEED_MORE_SPACE,
+ CTL_SS_ERROR
+} ctl_stats_status;
+
+typedef enum {
+ CTL_STATS_FLAG_NONE = 0x00,
+ CTL_STATS_FLAG_TIME_VALID = 0x01
+} ctl_stats_flags;
+
+struct ctl_stats {
+ int alloc_len; /* passed to kernel */
+ struct ctl_lun_io_stats *lun_stats; /* passed to/from kernel */
+ int fill_len; /* passed to userland */
+ int num_luns; /* passed to userland */
+ ctl_stats_status status; /* passed to userland */
+ ctl_stats_flags flags; /* passed to userland */
+ struct timespec timestamp; /* passed to userland */
+};
+
+/*
+ * The types of errors that can be injected:
+ *
+ * NONE: No error specified.
+ * ABORTED: SSD_KEY_ABORTED_COMMAND, 0x45, 0x00
+ * MEDIUM_ERR: Medium error, different asc/ascq depending on read/write.
+ * UA: Unit attention.
+ * CUSTOM: User specifies the sense data.
+ * TYPE: Mask to use with error types.
+ *
+ * Flags that affect injection behavior:
+ * CONTINUOUS: This error will stay around until explicitly cleared.
+ * DESCRIPTOR: Use descriptor sense instead of fixed sense.
+ */
+typedef enum {
+ CTL_LUN_INJ_NONE = 0x000,
+ CTL_LUN_INJ_ABORTED = 0x001,
+ CTL_LUN_INJ_MEDIUM_ERR = 0x002,
+ CTL_LUN_INJ_UA = 0x003,
+ CTL_LUN_INJ_CUSTOM = 0x004,
+ CTL_LUN_INJ_TYPE = 0x0ff,
+ CTL_LUN_INJ_CONTINUOUS = 0x100,
+ CTL_LUN_INJ_DESCRIPTOR = 0x200
+} ctl_lun_error;
+
+/*
+ * Flags to specify what type of command the given error pattern will
+ * execute on. The first group of types can be ORed together.
+ *
+ * READ: Any read command.
+ * WRITE: Any write command.
+ * READWRITE: Any read or write command.
+ * READCAP: Any read capacity command.
+ * TUR: Test Unit Ready.
+ * ANY: Any command.
+ * MASK: Mask for basic command patterns.
+ *
+ * Special types:
+ *
+ * CMD: The CDB to act on is specified in struct ctl_error_desc_cmd.
+ * RANGE: For read/write commands, act when the LBA is in the
+ * specified range.
+ */
+typedef enum {
+ CTL_LUN_PAT_NONE = 0x000,
+ CTL_LUN_PAT_READ = 0x001,
+ CTL_LUN_PAT_WRITE = 0x002,
+ CTL_LUN_PAT_READWRITE = CTL_LUN_PAT_READ | CTL_LUN_PAT_WRITE,
+ CTL_LUN_PAT_READCAP = 0x004,
+ CTL_LUN_PAT_TUR = 0x008,
+ CTL_LUN_PAT_ANY = 0x0ff,
+ CTL_LUN_PAT_MASK = 0x0ff,
+ CTL_LUN_PAT_CMD = 0x100,
+ CTL_LUN_PAT_RANGE = 0x200
+} ctl_lun_error_pattern;
+
+/*
+ * This structure allows the user to specify a particular CDB pattern to
+ * look for.
+ *
+ * cdb_pattern: Fill in the relevant bytes to look for in the CDB.
+ * cdb_valid_bytes: Bitmask specifying valid bytes in the cdb_pattern.
+ * flags: Specify any command flags (see ctl_io_flags) that
+ * should be set.
+ */
+struct ctl_error_desc_cmd {
+ uint8_t cdb_pattern[CTL_MAX_CDBLEN];
+ uint32_t cdb_valid_bytes;
+ uint32_t flags;
+};
+
+/*
+ * Error injection descriptor.
+ *
+ * target_id: Target ID to act on.
+ * lun_id LUN to act on.
+ * lun_error: The type of error to inject. See above for descriptions.
+ * error_pattern: What kind of command to act on. See above.
+ * cmd_desc: For CTL_LUN_PAT_CMD only.
+ * lba_range: For CTL_LUN_PAT_RANGE only.
+ * custom_sense: Specify sense. For CTL_LUN_INJ_CUSTOM only.
+ * serial: Serial number returned by the kernel. Use for deletion.
+ * links: Kernel use only.
+ */
+struct ctl_error_desc {
+ uint32_t target_id; /* To kernel */
+ uint32_t lun_id; /* To kernel */
+ ctl_lun_error lun_error; /* To kernel */
+ ctl_lun_error_pattern error_pattern; /* To kernel */
+ struct ctl_error_desc_cmd cmd_desc; /* To kernel */
+ struct ctl_lba_len lba_range; /* To kernel */
+ struct scsi_sense_data custom_sense; /* To kernel */
+ uint64_t serial; /* From kernel */
+ STAILQ_ENTRY(ctl_error_desc) links; /* Kernel use only */
+};
+
+typedef enum {
+ CTL_OOA_FLAG_NONE = 0x00,
+ CTL_OOA_FLAG_ALL_LUNS = 0x01
+} ctl_ooa_flags;
+
+typedef enum {
+ CTL_OOA_OK,
+ CTL_OOA_NEED_MORE_SPACE,
+ CTL_OOA_ERROR
+} ctl_get_ooa_status;
+
+typedef enum {
+ CTL_OOACMD_FLAG_NONE = 0x00,
+ CTL_OOACMD_FLAG_DMA = 0x01,
+ CTL_OOACMD_FLAG_BLOCKED = 0x02,
+ CTL_OOACMD_FLAG_ABORT = 0x04,
+ CTL_OOACMD_FLAG_RTR = 0x08,
+ CTL_OOACMD_FLAG_DMA_QUEUED = 0x10
+} ctl_ooa_cmd_flags;
+
+struct ctl_ooa_entry {
+ ctl_ooa_cmd_flags cmd_flags;
+ uint8_t cdb[CTL_MAX_CDBLEN];
+ uint8_t cdb_len;
+ uint32_t tag_num;
+ uint32_t lun_num;
+ struct bintime start_bt;
+};
+
+struct ctl_ooa {
+ ctl_ooa_flags flags; /* passed to kernel */
+ uint64_t lun_num; /* passed to kernel */
+ uint32_t alloc_len; /* passed to kernel */
+ uint32_t alloc_num; /* passed to kernel */
+ struct ctl_ooa_entry *entries; /* filled in kernel */
+ uint32_t fill_len; /* passed to userland */
+ uint32_t fill_num; /* passed to userland */
+ uint32_t dropped_num; /* passed to userland */
+ struct bintime cur_bt; /* passed to userland */
+ ctl_get_ooa_status status; /* passed to userland */
+};
+
+typedef enum {
+ CTL_PORT_LIST_NONE,
+ CTL_PORT_LIST_OK,
+ CTL_PORT_LIST_NEED_MORE_SPACE,
+ CTL_PORT_LIST_ERROR
+} ctl_port_list_status;
+
+struct ctl_port_list {
+ uint32_t alloc_len; /* passed to kernel */
+ uint32_t alloc_num; /* passed to kernel */
+ struct ctl_port_entry *entries; /* filled in kernel */
+ uint32_t fill_len; /* passed to userland */
+ uint32_t fill_num; /* passed to userland */
+ uint32_t dropped_num; /* passed to userland */
+ ctl_port_list_status status; /* passed to userland */
+};
+
+typedef enum {
+ CTL_LUN_NOSTATUS,
+ CTL_LUN_OK,
+ CTL_LUN_ERROR
+} ctl_lun_status;
+
+#define CTL_ERROR_STR_LEN 160
+
+#define CTL_BEARG_RD 0x01
+#define CTL_BEARG_WR 0x02
+#define CTL_BEARG_RW (CTL_BEARG_RD|CTL_BEARG_WR)
+#define CTL_BEARG_ASCII 0x04
+
+/*
+ * Backend Argument:
+ *
+ * namelen: Length of the name field, including the terminating NUL.
+ *
+ * name: Name of the paramter. This must be NUL-terminated.
+ *
+ * flags: Flags for the parameter, see above for values.
+ *
+ * vallen: Length of the value in bytes.
+ *
+ * value: Value to be set/fetched.
+ *
+ * kname: For kernel use only.
+ *
+ * kvalue: For kernel use only.
+ */
+struct ctl_be_arg {
+ int namelen;
+ char *name;
+ int flags;
+ int vallen;
+ void *value;
+
+ char *kname;
+ void *kvalue;
+};
+
+typedef enum {
+ CTL_LUNREQ_CREATE,
+ CTL_LUNREQ_RM
+} ctl_lunreq_type;
+
+
+/*
+ * LUN creation parameters:
+ *
+ * flags: Various LUN flags, see ctl_backend.h for a
+ * description of the flag values and meanings.
+ *
+ * device_type: The SCSI device type. e.g. 0 for Direct Access,
+ * 3 for Processor, etc. Only certain backends may
+ * support setting this field. The CTL_LUN_FLAG_DEV_TYPE
+ * flag should be set in the flags field if the device
+ * type is set.
+ *
+ * lun_size_bytes: The size of the LUN in bytes. For some backends
+ * this is relevant (e.g. ramdisk), for others, it may
+ * be ignored in favor of using the properties of the
+ * backing store. If specified, this should be a
+ * multiple of the blocksize.
+ *
+ * The actual size of the LUN is returned in this
+ * field.
+ *
+ * blocksize_bytes: The LUN blocksize in bytes. For some backends this
+ * is relevant, for others it may be ignored in
+ * favor of using the properties of the backing store.
+ *
+ * The actual blocksize of the LUN is returned in this
+ * field.
+ *
+ * req_lun_id: The requested LUN ID. The CTL_LUN_FLAG_ID_REQ flag
+ * should be set if this is set. The request will be
+ * granted if the LUN number is available, otherwise
+ * the LUN addition request will fail.
+ *
+ * The allocated LUN number is returned in this field.
+ *
+ * serial_num: This is the value returned in SCSI INQUIRY VPD page
+ * 0x80. If it is specified, the CTL_LUN_FLAG_SERIAL_NUM
+ * flag should be set.
+ *
+ * The serial number value used is returned in this
+ * field.
+ *
+ * device_id: This is the value returned in the T10 vendor ID
+ * based DESIGNATOR field in the SCSI INQUIRY VPD page
+ * 0x83 data. If it is specified, the CTL_LUN_FLAG_DEVID
+ * flag should be set.
+ *
+ * The device id value used is returned in this field.
+ */
+struct ctl_lun_create_params {
+ ctl_backend_lun_flags flags;
+ uint8_t device_type;
+ uint64_t lun_size_bytes;
+ uint32_t blocksize_bytes;
+ uint32_t req_lun_id;
+ uint8_t serial_num[CTL_SN_LEN];
+ uint8_t device_id[CTL_DEVID_LEN];
+};
+
+/*
+ * LUN removal parameters:
+ *
+ * lun_id: The number of the LUN to delete. This must be set.
+ * The LUN must be backed by the given backend.
+ */
+struct ctl_lun_rm_params {
+ uint32_t lun_id;
+};
+
+/*
+ * Union of request type data. Fill in the appropriate union member for
+ * the request type.
+ */
+union ctl_lunreq_data {
+ struct ctl_lun_create_params create;
+ struct ctl_lun_rm_params rm;
+};
+
+/*
+ * LUN request interface:
+ *
+ * backend: This is required, and is NUL-terminated a string
+ * that is the name of the backend, like "ramdisk" or
+ * "block".
+ *
+ * reqtype: The type of request, CTL_LUNREQ_CREATE to create a
+ * LUN, CTL_LUNREQ_RM to delete a LUN.
+ *
+ * reqdata: Request type-specific information. See the
+ * description of individual the union members above
+ * for more information.
+ *
+ * num_be_args: This is the number of backend-specific arguments
+ * in the be_args array.
+ *
+ * be_args: This is an array of backend-specific arguments.
+ * See above for a description of the fields in this
+ * structure.
+ *
+ * status: Status of the LUN request.
+ *
+ * error_str: If the status is CTL_LUN_ERROR, this will
+ * contain a string describing the error.
+ *
+ * kern_be_args: For kernel use only.
+ */
+struct ctl_lun_req {
+ char backend[CTL_BE_NAME_LEN];
+ ctl_lunreq_type reqtype;
+ union ctl_lunreq_data reqdata;
+ int num_be_args;
+ struct ctl_be_arg *be_args;
+ ctl_lun_status status;
+ char error_str[CTL_ERROR_STR_LEN];
+ struct ctl_be_arg *kern_be_args;
+};
+
+/*
+ * LUN list status:
+ *
+ * NONE: No status.
+ *
+ * OK: Request completed successfully.
+ *
+ * NEED_MORE_SPACE: The allocated length of the entries field is too
+ * small for the available data.
+ *
+ * ERROR: An error occured, look at the error string for a
+ * description of the error.
+ */
+typedef enum {
+ CTL_LUN_LIST_NONE,
+ CTL_LUN_LIST_OK,
+ CTL_LUN_LIST_NEED_MORE_SPACE,
+ CTL_LUN_LIST_ERROR
+} ctl_lun_list_status;
+
+/*
+ * LUN list interface
+ *
+ * backend_name: This is a NUL-terminated string. If the string
+ * length is 0, then all LUNs on all backends will
+ * be enumerated. Otherwise this is the name of the
+ * backend to be enumerated, like "ramdisk" or "block".
+ *
+ * alloc_len: The length of the data buffer allocated for entries.
+ * In order to properly size the buffer, make one call
+ * with alloc_len set to 0, and then use the returned
+ * dropped_len as the buffer length to allocate and
+ * pass in on a subsequent call.
+ *
+ * lun_xml: XML-formatted information on the requested LUNs.
+ *
+ * fill_len: The amount of data filled in the storage for entries.
+ *
+ * status: The status of the request. See above for the
+ * description of the values of this field.
+ *
+ * error_str: If the status indicates an error, this string will
+ * be filled in to describe the error.
+ */
+struct ctl_lun_list {
+ char backend[CTL_BE_NAME_LEN]; /* passed to kernel*/
+ uint32_t alloc_len; /* passed to kernel */
+ char *lun_xml; /* filled in kernel */
+ uint32_t fill_len; /* passed to userland */
+ ctl_lun_list_status status; /* passed to userland */
+ char error_str[CTL_ERROR_STR_LEN];
+ /* passed to userland */
+};
+
+#define CTL_IO _IOWR(CTL_MINOR, 0x00, union ctl_io)
+#define CTL_ENABLE_PORT _IOW(CTL_MINOR, 0x04, struct ctl_port_entry)
+#define CTL_DISABLE_PORT _IOW(CTL_MINOR, 0x05, struct ctl_port_entry)
+#define CTL_DUMP_OOA _IO(CTL_MINOR, 0x06)
+#define CTL_CHECK_OOA _IOWR(CTL_MINOR, 0x07, struct ctl_ooa_info)
+#define CTL_HARD_STOP _IOR(CTL_MINOR, 0x08, \
+ struct ctl_hard_startstop_info)
+#define CTL_HARD_START _IOR(CTL_MINOR, 0x09, \
+ struct ctl_hard_startstop_info)
+#define CTL_DELAY_IO _IOWR(CTL_MINOR, 0x10, struct ctl_io_delay_info)
+#define CTL_REALSYNC_GET _IOR(CTL_MINOR, 0x11, int)
+#define CTL_REALSYNC_SET _IOW(CTL_MINOR, 0x12, int)
+#define CTL_SETSYNC _IOWR(CTL_MINOR, 0x13, struct ctl_sync_info)
+#define CTL_GETSYNC _IOWR(CTL_MINOR, 0x14, struct ctl_sync_info)
+#define CTL_GETSTATS _IOWR(CTL_MINOR, 0x15, struct ctl_stats)
+#define CTL_ERROR_INJECT _IOWR(CTL_MINOR, 0x16, struct ctl_error_desc)
+#define CTL_BBRREAD _IOWR(CTL_MINOR, 0x17, struct ctl_bbrread_info)
+#define CTL_GET_OOA _IOWR(CTL_MINOR, 0x18, struct ctl_ooa)
+#define CTL_DUMP_STRUCTS _IO(CTL_MINOR, 0x19)
+#define CTL_GET_PORT_LIST _IOWR(CTL_MINOR, 0x20, struct ctl_port_list)
+#define CTL_LUN_REQ _IOWR(CTL_MINOR, 0x21, struct ctl_lun_req)
+#define CTL_LUN_LIST _IOWR(CTL_MINOR, 0x22, struct ctl_lun_list)
+#define CTL_ERROR_INJECT_DELETE _IOW(CTL_MINOR, 0x23, struct ctl_error_desc)
+#define CTL_SET_PORT_WWNS _IOW(CTL_MINOR, 0x24, struct ctl_port_entry)
+
+#endif /* _CTL_IOCTL_H_ */
+
+/*
+ * vim: ts=8
+ */
OpenPOWER on IntegriCloud