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 _PORTIF_H 25 #define _PORTIF_H 26 27 /* 28 * Definitions for stmf local ports and port providers. 29 */ 30 31 #include <sys/stmf_defines.h> 32 33 #ifdef __cplusplus 34 extern "C" { 35 #endif 36 37 typedef struct stmf_dbuf_store { 38 void *ds_stmf_private; 39 void *ds_port_private; 40 41 stmf_data_buf_t *(*ds_alloc_data_buf)(struct scsi_task *task, 42 uint32_t size, uint32_t *pminsize, uint32_t flags); 43 44 void (*ds_free_data_buf)( 45 struct stmf_dbuf_store *ds, stmf_data_buf_t *dbuf); 46 47 stmf_status_t (*ds_setup_dbuf)(struct scsi_task *task, 48 stmf_data_buf_t *dbuf, uint32_t flags); 49 50 void (*ds_teardown_dbuf)( 51 struct stmf_dbuf_store *ds, stmf_data_buf_t *dbuf); 52 } stmf_dbuf_store_t; 53 54 #define PORTIF_REV_1 0x00010000 55 56 typedef struct stmf_local_port { 57 void *lport_stmf_private; 58 void *lport_port_private; 59 60 uint32_t lport_abort_timeout; 61 62 struct scsi_devid_desc *lport_id; 63 char *lport_alias; 64 struct stmf_port_provider *lport_pp; 65 struct stmf_dbuf_store *lport_ds; 66 /* lport ops */ 67 stmf_status_t (*lport_xfer_data)(struct scsi_task *task, 68 struct stmf_data_buf *dbuf, uint32_t ioflags); 69 stmf_status_t (*lport_send_status)(struct scsi_task *task, 70 uint32_t ioflags); 71 void (*lport_task_free)(struct scsi_task *task); 72 stmf_status_t (*lport_abort)(struct stmf_local_port *lport, 73 int abort_cmd, void *arg, uint32_t flags); 74 void (*lport_task_poll)(struct scsi_task *task); 75 void (*lport_ctl)(struct stmf_local_port *lport, 76 int cmd, void *arg); 77 stmf_status_t (*lport_info)(uint32_t cmd, 78 struct stmf_local_port *lport, void *arg, uint8_t *buf, 79 uint32_t *bufsizep); 80 void (*lport_event_handler)( 81 struct stmf_local_port *lport, int eventid, void *arg, 82 uint32_t flags); 83 } stmf_local_port_t; 84 85 typedef struct stmf_remote_port { 86 struct scsi_transport_id *rport_tptid; 87 uint16_t rport_tptid_sz; 88 } stmf_remote_port_t; 89 90 typedef struct stmf_dflt_scsi_tptid { 91 #if defined(_BIT_FIELDS_LTOH) 92 uint8_t protocol_id : 4, 93 resbits : 2, 94 format_code : 2; 95 #elif defined(_BIT_FIELDS_HTOL) 96 uint8_t format_code : 2, 97 resbits : 2, 98 protocol_id : 4; 99 #else 100 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 101 #endif /* _BIT_FIELDS_LTOH */ 102 uint8_t rsvbyte1; 103 uint8_t ident_len[2]; 104 char ident[1]; 105 } stmf_dflt_scsi_tptid_t; 106 /* 107 * abort cmd 108 */ 109 #define STMF_LPORT_ABORT_TASK 0x40 110 111 typedef struct stmf_port_provider { 112 void *pp_stmf_private; 113 void *pp_provider_private; 114 115 uint32_t pp_portif_rev; /* Currently PORTIF_REV_1 */ 116 int pp_instance; 117 char *pp_name; 118 void (*pp_cb)(struct stmf_port_provider *pp, 119 int cmd, void *arg, uint32_t flags); 120 } stmf_port_provider_t; 121 122 #define STMF_SESSION_ID_NONE ((uint64_t)0) 123 124 typedef struct stmf_scsi_session { 125 void *ss_stmf_private; 126 void *ss_port_private; 127 128 struct scsi_devid_desc *ss_rport_id; 129 char *ss_rport_alias; 130 struct stmf_local_port *ss_lport; 131 uint64_t ss_session_id; 132 struct stmf_remote_port *ss_rport; 133 } stmf_scsi_session_t; 134 135 stmf_status_t stmf_register_port_provider(stmf_port_provider_t *pp); 136 stmf_status_t stmf_deregister_port_provider(stmf_port_provider_t *pp); 137 stmf_status_t stmf_register_local_port(stmf_local_port_t *lportp); 138 stmf_status_t stmf_deregister_local_port(stmf_local_port_t *lport); 139 stmf_status_t stmf_register_scsi_session(stmf_local_port_t *lport, 140 stmf_scsi_session_t *ss); 141 stmf_status_t stmf_add_rport_info(stmf_scsi_session_t *ss, 142 const char *prop_name, const char *prop_value); 143 void stmf_remove_rport_info(stmf_scsi_session_t *ss, 144 const char *prop_name); 145 void stmf_deregister_scsi_session(stmf_local_port_t *lport, 146 stmf_scsi_session_t *ss); 147 void stmf_set_port_standby(stmf_local_port_t *lport, uint16_t rtpid); 148 void stmf_set_port_alua(stmf_local_port_t *lport); 149 150 #ifdef __cplusplus 151 } 152 #endif 153 154 #endif /* _PORTIF_H */ 155