root/usr/src/uts/common/sys/stmf_ioctl.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
 */
#ifndef _STMF_IOCTL_H
#define _STMF_IOCTL_H

#ifdef  __cplusplus
extern "C" {
#endif

#define STMF_VERSION_1                  1

#define STMF_IOCTL                      (((uint32_t)'S') << 24)
#define STMF_IOCTL_LU_LIST                      (STMF_IOCTL | 1)
#define STMF_IOCTL_TARGET_PORT_LIST             (STMF_IOCTL | 2)
#define STMF_IOCTL_SESSION_LIST                 (STMF_IOCTL | 3)
#define STMF_IOCTL_GET_LU_PROPERTIES            (STMF_IOCTL | 4)
#define STMF_IOCTL_GET_TARGET_PORT_PROPERTIES   (STMF_IOCTL | 5)
#define STMF_IOCTL_SET_STMF_STATE               (STMF_IOCTL | 6)
#define STMF_IOCTL_GET_STMF_STATE               (STMF_IOCTL | 7)
#define STMF_IOCTL_SET_LU_STATE                 (STMF_IOCTL | 8)
#define STMF_IOCTL_SET_TARGET_PORT_STATE        (STMF_IOCTL | 9)
#define STMF_IOCTL_CREATE_HOST_GROUP            (STMF_IOCTL | 10)
#define STMF_IOCTL_REMOVE_HOST_GROUP            (STMF_IOCTL | 11)
#define STMF_IOCTL_ADD_HG_ENTRY                 (STMF_IOCTL | 12)
#define STMF_IOCTL_REMOVE_HG_ENTRY              (STMF_IOCTL | 13)
#define STMF_IOCTL_CREATE_TARGET_GROUP          (STMF_IOCTL | 14)
#define STMF_IOCTL_REMOVE_TARGET_GROUP          (STMF_IOCTL | 15)
#define STMF_IOCTL_ADD_TG_ENTRY                 (STMF_IOCTL | 16)
#define STMF_IOCTL_REMOVE_TG_ENTRY              (STMF_IOCTL | 17)
#define STMF_IOCTL_ADD_VIEW_ENTRY               (STMF_IOCTL | 18)
#define STMF_IOCTL_REMOVE_VIEW_ENTRY            (STMF_IOCTL | 19)
#define STMF_IOCTL_GET_HG_LIST                  (STMF_IOCTL | 20)
#define STMF_IOCTL_GET_TG_LIST                  (STMF_IOCTL | 21)
#define STMF_IOCTL_GET_HG_ENTRIES               (STMF_IOCTL | 22)
#define STMF_IOCTL_GET_TG_ENTRIES               (STMF_IOCTL | 23)
#define STMF_IOCTL_GET_VE_LIST                  (STMF_IOCTL | 24)
#define STMF_IOCTL_LOAD_PP_DATA                 (STMF_IOCTL | 25)
#define STMF_IOCTL_CLEAR_PP_DATA                (STMF_IOCTL | 26)
#define STMF_IOCTL_GET_PP_DATA                  (STMF_IOCTL | 27)
#define STMF_IOCTL_CLEAR_TRACE                  (STMF_IOCTL | 28)
#define STMF_IOCTL_ADD_TRACE                    (STMF_IOCTL | 29)
#define STMF_IOCTL_GET_TRACE_POSITION           (STMF_IOCTL | 30)
#define STMF_IOCTL_GET_TRACE                    (STMF_IOCTL | 31)
#define STMF_IOCTL_REG_LU_LIST                  (STMF_IOCTL | 32)
#define STMF_IOCTL_VE_LU_LIST                   (STMF_IOCTL | 33)
#define STMF_IOCTL_LU_VE_LIST                   (STMF_IOCTL | 34)
#define STMF_IOCTL_VALIDATE_VIEW                (STMF_IOCTL | 35)
#define STMF_IOCTL_SET_ALUA_STATE               (STMF_IOCTL | 36)
#define STMF_IOCTL_GET_ALUA_STATE               (STMF_IOCTL | 37)
#define STMF_IOCTL_SET_STMF_PROPS               (STMF_IOCTL | 38)

typedef struct stmf_iocdata {
        uint32_t        stmf_version;
        uint32_t        stmf_error;
        uint32_t        stmf_ibuf_size;
        uint32_t        stmf_obuf_size;
        uint32_t        stmf_obuf_nentries;     /* # entries xferred */
        uint32_t        stmf_obuf_max_nentries; /* #,could have been xferred */
        uint64_t        stmf_ibuf;
        uint64_t        stmf_obuf;
} stmf_iocdata_t;

typedef struct slist_lu {
        uint8_t         lu_guid[16];
} slist_lu_t;

typedef struct slist_target_port {
        uint8_t         target[260];
} slist_target_port_t;

typedef struct slist_scsi_session {
        uint8_t         initiator[260];
        /* creation_time is really time_t. But time_t is defined as long. */
        uint32_t        creation_time;
        char            alias[256];
} slist_scsi_session_t;

/*
 * States for LUs and LPORTs
 */
#define STMF_STATE_OFFLINE              0
#define STMF_STATE_ONLINING             1
#define STMF_STATE_ONLINE               2
#define STMF_STATE_OFFLINING            3

/*
 * States for the STMF config.
 */
#define STMF_CONFIG_NONE                0
#define STMF_CONFIG_INIT                1
#define STMF_CONFIG_INIT_DONE           2

typedef struct sioc_lu_props {
        uint8_t         lu_guid[16];
        uint8_t         lu_state:4,
                        lu_present:1,
                        lu_rsvd:3;
        char            lu_provider_name[255];
        char            lu_alias[256];
} sioc_lu_props_t;

typedef struct sioc_target_port_props {
        uint8_t         tgt_id[260];
        uint8_t         tgt_state:4,
                        tgt_present:1,
                        tgt_rsvd:3;
        char            tgt_provider_name[255];
        char            tgt_alias[256];
} sioc_target_port_props_t;

/*
 * This struct is used for getting and setting state of LU/LPORT or STMF.
 */
typedef struct stmf_state_desc {
        uint8_t         ident[260];     /* N/A for STMF itself */
        uint8_t         state;
        uint8_t         config_state;   /* N/A for LU/LPORTs */
} stmf_state_desc_t;

/*
 * This struct is used for setting the alua state
 */
typedef struct stmf_alua_state_desc {
        uint8_t         alua_state;
        uint16_t        alua_node;
} stmf_alua_state_desc_t;

/* Error definitions for group/view entry/provider dataioctls */
#define STMF_IOCERR_NONE                        0
#define STMF_IOCERR_HG_EXISTS                   1
#define STMF_IOCERR_INVALID_HG                  2
#define STMF_IOCERR_TG_EXISTS                   3
#define STMF_IOCERR_INVALID_TG                  4
#define STMF_IOCERR_HG_ENTRY_EXISTS             5
#define STMF_IOCERR_INVALID_HG_ENTRY            6
#define STMF_IOCERR_TG_ENTRY_EXISTS             7
#define STMF_IOCERR_INVALID_TG_ENTRY            8
#define STMF_IOCERR_TG_UPDATE_NEED_SVC_OFFLINE  9
#define STMF_IOCERR_LU_NUMBER_IN_USE            10
#define STMF_IOCERR_INVALID_LU_ID               11
#define STMF_IOCERR_VIEW_ENTRY_CONFLICT         12
#define STMF_IOCERR_HG_IN_USE                   13
#define STMF_IOCERR_TG_IN_USE                   14
#define STMF_IOCERR_INVALID_VIEW_ENTRY          15
#define STMF_IOCERR_INVALID_VE_ID               16
#define STMF_IOCERR_UPDATE_NEED_CFG_INIT        17
#define STMF_IOCERR_PPD_UPDATED                 18
#define STMF_IOCERR_INSUFFICIENT_BUF            19
#define STMF_IOCERR_TG_NEED_TG_OFFLINE          20


typedef struct stmf_group_name {
        uint16_t        name_size;      /* in bytes */
        uint16_t        rsvd_1;
        uint32_t        rsvd_2;
        uint8_t         name[512];      /* 256 * wchar_t */
} stmf_group_name_t;

/*
 * struct used to operate (add/remove entry) on a group.
 */

typedef struct stmf_ge_ident {
        uint16_t    ident_size;
        uint8_t     ident[256];
} stmf_ge_ident_t;

typedef struct stmf_group_op_data {
        stmf_group_name_t       group;
        uint8_t                 ident[260];
} stmf_group_op_data_t;

typedef struct stmf_view_op_entry {
        uint32_t                ve_ndx_valid:1,
                                ve_lu_number_valid:1,
                                ve_all_hosts:1,
                                ve_all_targets:1,
                                rsvd:28;
        uint32_t                ve_ndx;
        uint8_t                 ve_lu_nbr[8];
        uint8_t                 ve_guid[16];
        stmf_group_name_t       ve_host_group;
        stmf_group_name_t       ve_target_group;
} stmf_view_op_entry_t;

typedef struct stmf_ppioctl_data {
        char            ppi_name[255];  /* Provider name including \0 */
        uint8_t         ppi_port_provider:1,
                        ppi_lu_provider:1,
                        ppi_token_valid:1,
                        ppt_rsvd:5;
        uint64_t        ppi_token;
        uint64_t        ppi_data_size;
        uint8_t         ppi_data[8];
} stmf_ppioctl_data_t;

typedef struct stmf_set_props {
        uint32_t        default_lu_state_value;
        uint32_t        default_target_state_value;
} stmf_set_props_t;

/*
 * SCSI device ID descriptor as per SPC3 7.6.3
 */
typedef struct scsi_devid_desc {
#ifdef  _BIT_FIELDS_HTOL
        uint8_t         protocol_id:4,
                        code_set:4;
        uint8_t         piv:1,
                        rsvd1:1,
                        association:2,
                        ident_type:4;
#else
        uint8_t         code_set:4,
                        protocol_id:4;
        uint8_t         ident_type:4,
                        association:2,
                        rsvd1:1,
                        piv:1;
#endif
        uint8_t         rsvd2;
        uint8_t         ident_length;
        uint8_t         ident[1];
} scsi_devid_desc_t;

/*
 * Protocol Identifier
 */
#define PROTOCOL_FIBRE_CHANNEL          0
#define PROTOCOL_PARALLEL_SCSI          1
#define PROTOCOL_SSA                    2
#define PROTOCOL_IEEE_1394              3
#define PROTOCOL_SRP                    4
#define PROTOCOL_iSCSI                  5
#define PROTOCOL_SAS                    6
#define PROTOCOL_ADT                    7
#define PROTOCOL_ATAPI                  8
#define PROTOCOL_ANY                    15

/*
 * Code set definitions
 */
#define CODE_SET_BINARY                 1
#define CODE_SET_ASCII                  2
#define CODE_SET_UTF8                   3

/*
 * Association values
 */
#define ID_IS_LOGICAL_UNIT              0
#define ID_IS_TARGET_PORT               1
#define ID_IS_TARGET_CONTAINING_LU      2

/*
 * ident type
 */
#define ID_TYPE_VENDOR_SPECIFIC         0
#define ID_TYPE_T10_VID                 1
#define ID_TYPE_EUI64                   2
#define ID_TYPE_NAA                     3
#define ID_TYPE_RELATIVE_TARGET_PORT    4
#define ID_TYPE_TARGET_PORT_GROUP       5
#define ID_TYPE_LOGICAL_UNIT_GROUP      6
#define ID_TYPE_MD5_LOGICAL_UNIT        7
#define ID_TYPE_SCSI_NAME_STRING        8

int stmf_copyin_iocdata(intptr_t data, int mode, stmf_iocdata_t **iocd,
    void **ibuf, void **obuf);
int stmf_copyout_iocdata(intptr_t data, int mode, stmf_iocdata_t *iocd,
    void *obuf);

#ifdef  __cplusplus
}
#endif

#endif /* _STMF_IOCTL_H */