1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  23  */
  24 #ifndef _LPIF_H
  25 #define _LPIF_H
  26 
  27 /*
  28  * Definitions for stmf LUs and lu providers.
  29  */
  30 
  31 #include <sys/stmf_defines.h>
  32 #include <sys/stmf.h>
  33 
  34 #ifdef  __cplusplus
  35 extern "C" {
  36 #endif
  37 
  38 #define LPIF_REV_1      0x00010000
  39 #define LPIF_REV_2      0x00020000
  40 
  41 typedef struct stmf_lu {
  42         void                    *lu_stmf_private;
  43         void                    *lu_provider_private;
  44 
  45         struct scsi_devid_desc  *lu_id;
  46         char                    *lu_alias;      /* optional */
  47         struct stmf_lu_provider *lu_lp;
  48         uint32_t                lu_abort_timeout;       /* In seconds */
  49 
  50         /* SAM Device Server Class */
  51         stmf_status_t           (*lu_task_alloc)(struct scsi_task *task);
  52         void                    (*lu_new_task)(struct scsi_task *task,
  53                 struct stmf_data_buf *initial_dbuf);
  54         void                    (*lu_dbuf_xfer_done)(struct scsi_task *task,
  55                 struct stmf_data_buf *dbuf);
  56         /*
  57          * If completion confirmation is not requested, status xfer done
  58          * is called after the transport has confirmed that status has been
  59          * sent. If completion confirmation is requested then the HBA will
  60          * request a completion confirmation from the host and upon receiving
  61          * the same, this entry point will be called.
  62          */
  63         void                    (*lu_send_status_done)(struct scsi_task *task);
  64         void                    (*lu_task_free)(struct scsi_task *task);
  65         stmf_status_t           (*lu_abort)(struct stmf_lu *lu,
  66                 int abort_cmd, void *arg, uint32_t flags);
  67         void                    (*lu_task_poll)(struct scsi_task *task);
  68         void                    (*lu_ctl)(struct stmf_lu *lu, int cmd,
  69                                                                 void *arg);
  70         stmf_status_t           (*lu_info)(uint32_t cmd, struct stmf_lu *lu,
  71                 void *arg, uint8_t *buf, uint32_t *bufsizep);
  72         void                    (*lu_event_handler)(struct stmf_lu *lu,
  73                 int eventid, void *arg, uint32_t flags);
  74         void                    *lu_proxy_reg_arg;
  75         uint32_t                lu_proxy_reg_arg_len;
  76         void                    (*lu_dbuf_free)(struct scsi_task *task,
  77                 struct stmf_data_buf *dbuf);
  78 } stmf_lu_t;
  79 
  80 /*
  81  * Abort cmd
  82  */
  83 #define STMF_LU_ABORT_TASK              1
  84 #define STMF_LU_RESET_STATE             2
  85 #define STMF_LU_ITL_HANDLE_REMOVED      3
  86 
  87 /*
  88  * Asymmetric access state
  89  */
  90 #define STMF_LU_ACTIVE                  0
  91 #define STMF_LU_STANDBY                 1
  92 
  93 /*
  94  * proxy register msg types
  95  */
  96 #define STMF_MSG_LU_REGISTER            0
  97 #define STMF_MSG_LU_ACTIVE              1
  98 #define STMF_MSG_LU_DEREGISTER          2
  99 
 100 
 101 #define STMF_PROXY_READ                 1
 102 #define STMF_PROXY_WRITE                2
 103 
 104 /*
 105  * Reasons for itl handle removal. Passed in flags.
 106  */
 107 #define STMF_ITL_REASON_MASK            0x0f
 108 #define STMF_ITL_REASON_UNKNOWN         0x0
 109 #define STMF_ITL_REASON_DEREG_REQUEST   0x1
 110 #define STMF_ITL_REASON_USER_REQUEST    0x2
 111 #define STMF_ITL_REASON_IT_NEXUS_LOSS   0x3
 112 
 113 typedef struct stmf_lu_provider {
 114         void                    *lp_stmf_private;
 115         void                    *lp_private;
 116 
 117         uint32_t                lp_lpif_rev;    /* Currently LPIF_REV_2 */
 118         int                     lp_instance;
 119         char                    *lp_name;
 120         void                    (*lp_cb)(struct stmf_lu_provider *lp,
 121             int cmd, void *arg, uint32_t flags);
 122         uint8_t                 lp_alua_support;
 123         stmf_status_t           (*lp_proxy_msg)(uint8_t *luid,
 124             void *proxy_reg_arg, uint32_t proxy_reg_arg_len, uint32_t type);
 125 } stmf_lu_provider_t;
 126 
 127 stmf_status_t stmf_deregister_lu_provider(stmf_lu_provider_t *lp);
 128 stmf_status_t stmf_register_lu_provider(stmf_lu_provider_t *lp);
 129 stmf_status_t stmf_register_lu(stmf_lu_t *lup);
 130 stmf_status_t stmf_deregister_lu(stmf_lu_t *lup);
 131 stmf_status_t stmf_set_lu_access(stmf_lu_t *lup, uint8_t access_state);
 132 stmf_status_t stmf_proxy_scsi_cmd(scsi_task_t *, stmf_data_buf_t *dbuf);
 133 int stmf_is_standby_port(scsi_task_t *);
 134 void stmf_lu_xfer_start(struct scsi_task *task);
 135 void stmf_lu_xfer_done(struct scsi_task *task, boolean_t read,
 136     uint64_t xfer_bytes, hrtime_t elapsed_time);
 137 
 138 #ifdef  __cplusplus
 139 }
 140 #endif
 141 
 142 #endif /* _LPIF_H */