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, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_FC4_FCAL_TRANSPORT_H 28 #define _SYS_FC4_FCAL_TRANSPORT_H 29 30 #include <sys/fc4/fcal.h> 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 /* 37 * fc_devdata_t definitions 38 * 39 * See fc.h for TYPE field definitions 40 */ 41 typedef int fc_devdata_t; 42 43 /* 44 * fc_ioclass_t definitions. 45 */ 46 typedef enum { 47 FC_CLASS_OUTBOUND, 48 FC_CLASS_INBOUND, 49 FC_CLASS_SIMPLE, 50 FC_CLASS_IO_WRITE, 51 FC_CLASS_IO_READ, 52 FC_CLASS_OFFLINE, 53 FC_CLASS_UNSOLICITED 54 } fc_ioclass_t; 55 56 /* 57 * fc_transport() sleep parameter 58 */ 59 typedef enum { 60 FCAL_SLEEP, /* sleep on queue full */ 61 FCAL_NOSLEEP /* do not sleep on queue full */ 62 } fcal_sleep_t; 63 64 typedef struct fcal_packet { 65 void *fcal_pkt_cookie; /* identifies which FC device */ 66 struct fcal_packet *fcal_pkt_next; 67 void (*fcal_pkt_comp)(struct fcal_packet *); 68 void *fcal_pkt_private; 69 uint_t fcal_pkt_flags; /* flags */ 70 uint_t fcal_cmd_state; 71 uint_t fcal_pkt_status; /* SOC Status when complete */ 72 uint_t fcal_diag_status; /* used only for diagnostics */ 73 union { 74 soc_request_t req; 75 longlong_t l; 76 } w; 77 78 #define fcal_socal_request w.req 79 80 fc_frame_header_t fcal_resp_hdr; 81 uint_t fcal_magic; 82 ushort_t fcal_ncmds; 83 } fcal_packet_t; 84 85 /* 86 * Fibre channel packet flags 87 */ 88 #define FCFLAG_NOINTR 1 /* run this command without intr */ 89 #define FCFLAG_COMPLETE 2 /* command has completed */ 90 #define FCFLAG_RESP_HEADER 4 /* valid response frame header */ 91 #define FCFLAG_ABORTING 8 /* this packet is being aborted */ 92 #define FCFLAG_ABORTED 0x10 /* the abort completed */ 93 94 /* 95 * definitions for the cmd_state 96 */ 97 #define FCAL_CMD_IN_TRANSPORT 0x1 /* command in transport */ 98 #define FCAL_CMD_COMPLETE 0x4 /* command complete */ 99 #define FCAL_CMPLT_CALLED 0x10 /* Completion routine called */ 100 101 #define FCALP_MAGIC 0x4750703 102 103 typedef struct fcal_transport { 104 void *fcal_handle; /* identifies which FC dev */ 105 ddi_dma_lim_t *fcal_dmalimp; 106 ddi_iblock_cookie_t fcal_iblock; 107 ddi_dma_attr_t *fcal_dmaattr; 108 ddi_device_acc_attr_t *fcal_accattr; 109 caddr_t fcal_loginparms; /* from soc+ xram */ 110 la_wwn_t fcal_n_wwn; /* node Worldwide name */ 111 la_wwn_t fcal_p_wwn; /* port Worldwide name */ 112 uint_t fcal_portno; /* which port */ 113 uint_t fcal_cmdmax; /* max number of exchanges */ 114 kmutex_t fcal_mtx; 115 kcondvar_t fcal_cv; 116 struct fcal_transport_ops *fcal_ops; 117 } fcal_transport_t; 118 119 typedef struct fcal_transport_ops { 120 uint_t (*fcal_transport)(fcal_packet_t *fcalpkt, 121 fcal_sleep_t sleep, int 122 req_q_no); 123 uint_t (*fcal_transport_poll)(fcal_packet_t *fcalpkt, 124 uint_t timeout, 125 int req_q_no); 126 uint_t (*fcal_lilp_map)(void *fcal_handle, 127 uint_t port, 128 uint32_t bufid, 129 uint_t poll); 130 uint_t (*fcal_force_lip)(void *fcal_handle, 131 uint_t port, 132 uint_t poll, 133 uint_t lip_req); 134 uint_t (*fcal_abort_cmd)(void *fcal_handle, 135 uint_t port, 136 fcal_packet_t *fcalpkt, 137 uint_t poll); 138 uint_t (*fcal_els)(void *fcal_handle, 139 uint_t port, 140 uint_t els_code, 141 uint_t dest, 142 void (*callback)(), 143 void *arg, 144 caddr_t reqpayload, 145 caddr_t *rsppayload, 146 uint_t poll); 147 uint_t (*fcal_bypass_dev)(void *fcal_handle, 148 uint_t port, 149 uint_t dest); 150 void (*fcal_force_reset)(void *fcal_handle, 151 uint_t port, 152 uint_t reset); 153 void (*fcal_add_ulp)(void *fcal_handle, 154 uint_t port, 155 uchar_t type, 156 void (*ulp_statec_callback)(), 157 void (*ulp_els_callback)(), 158 void (*ulp_data_callback)(), 159 void *arg); 160 void (*fcal_remove_ulp)(void *fcal_handle, 161 uint_t port, 162 uchar_t type, 163 void *arg); 164 void (*fcal_take_core)(void *fcal_handle); 165 } fcal_transport_ops_t; 166 167 /* 168 * additional pseudo-status codes for login 169 */ 170 #define FCAL_STATUS_LOGIN_TIMEOUT 0x80000001 171 #define FCAL_STATUS_CQFULL 0x80000002 172 #define FCAL_STATUS_TRANSFAIL 0x80000003 173 #define FCAL_STATUS_RESETFAIL 0x80000004 174 175 /* 176 * interface and transport function return values 177 */ 178 #define FCAL_SUCCESS 0x000 179 #define FCAL_TIMEOUT 0x001 180 #define FCAL_ALLOC_FAILED 0x002 181 #define FCAL_OLD_PORT 0x003 182 #define FCAL_LINK_ERROR 0x004 183 #define FCAL_OFFLINE 0x005 184 #define FCAL_ABORTED 0x006 185 #define FCAL_ABORT_FAILED 0x007 186 #define FCAL_BAD_ABORT 0x008 187 #define FCAL_BAD_PARAMS 0x009 188 #define FCAL_OVERRUN 0x00a 189 #define FCAL_NO_TRANSPORT 0x00b 190 #define FCAL_TRANSPORT_SUCCESS 0x000 191 #define FCAL_TRANSPORT_FAILURE 0x101 192 #define FCAL_BAD_PACKET 0x102 193 #define FCAL_TRANSPORT_UNAVAIL 0x103 194 #define FCAL_TRANSPORT_QFULL 0x104 195 #define FCAL_TRANSPORT_TIMEOUT 0x105 196 197 #define FCAL_FAILURE 0xffffffff 198 /* 199 * fc_uc_register() return values 200 */ 201 typedef void * fc_uc_cookie_t; 202 203 /* 204 * fc_transport() iotype parameter 205 */ 206 typedef enum { 207 FC_TYPE_UNCATEGORIZED, 208 FC_TYPE_DATA, 209 FC_TYPE_UNSOL_CONTROL, 210 FC_TYPE_SOLICITED_CONTROL, 211 FC_TYPE_UNSOL_DATA, 212 FC_TYPE_XFER_RDY, 213 FC_TYPE_COMMAND, 214 FC_TYPE_RESPONSE 215 } fc_iotype_t; 216 217 /* 218 * State changes related to the N-port interface communicated from below 219 */ 220 #define FCAL_STATE_RESET ((int)0xffffffffu) 221 /* port reset, all cmds lost */ 222 223 #define FCAL_LILP_MAGIC 0x1107 224 #define FCAL_BADLILP_MAGIC 0x1105 225 #define FCAL_NO_LIP 0x0 226 #define FCAL_FORCE_LIP 0x1 227 228 typedef struct fcal_lilp_map { 229 ushort_t lilp_magic; 230 ushort_t lilp_myalpa; 231 uchar_t lilp_length; 232 uchar_t lilp_alpalist[127]; 233 } fcal_lilp_map_t; 234 #ifdef __cplusplus 235 } 236 #endif 237 238 #endif /* !_SYS_FC4_FCAL_TRANSPORT_H */ 239