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 * Copyright 2012 Nexenta Systems, Inc. All rights reserved. 24 */ 25 #ifndef _FCT_H 26 #define _FCT_H 27 28 /* 29 * Definitions for common FC Target. 30 */ 31 #include <sys/note.h> 32 #include <sys/stmf_defines.h> 33 #include <sys/fct_defines.h> 34 #include <sys/portif.h> 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 typedef enum fct_struct_id { 41 FCT_STRUCT_LOCAL_PORT = 1, 42 FCT_STRUCT_REMOTE_PORT, 43 FCT_STRUCT_CMD_RCVD_ELS, 44 FCT_STRUCT_CMD_SOL_ELS, 45 FCT_STRUCT_CMD_SOL_CT, 46 FCT_STRUCT_CMD_RCVD_ABTS, 47 FCT_STRUCT_CMD_FCP_XCHG, 48 FCT_STRUCT_DBUF_STORE, 49 50 FCT_MAX_STRUCT_IDS 51 } fct_struct_id_t; 52 53 typedef struct fct_remote_port { 54 void *rp_fct_private; 55 void *rp_fca_private; 56 57 struct fct_local_port *rp_port; 58 char rp_nwwn_str[FC_WWN_BUFLEN]; 59 char rp_pwwn_str[FC_WWN_BUFLEN]; 60 uint8_t rp_nwwn[FC_WWN_LEN]; 61 uint8_t rp_pwwn[FC_WWN_LEN]; 62 uint32_t rp_id; /* 8 or 24 bit */ 63 uint32_t rp_hard_address; 64 uint16_t rp_handle; 65 } fct_remote_port_t; 66 67 #define FCT_HANDLE_NONE 0xffff 68 69 typedef struct fct_cmd { 70 void *cmd_fct_private; 71 void *cmd_fca_private; 72 void *cmd_specific; 73 74 struct fct_local_port *cmd_port; 75 76 /* During cmd porting this can be set to NULL */ 77 struct fct_remote_port *cmd_rp; 78 79 /* To link cmds together for handling things like ABTS. */ 80 struct fct_cmd *cmd_link; 81 uint8_t cmd_type; 82 uint8_t cmd_rsvd1; 83 84 /* During cmd posting this can be set to FCT_HANDLE_NONE */ 85 uint16_t cmd_rp_handle; 86 uint32_t cmd_handle; 87 uint32_t cmd_rportid; 88 uint32_t cmd_lportid; 89 uint32_t cmd_rsvd2; 90 uint16_t cmd_oxid; 91 uint16_t cmd_rxid; 92 fct_status_t cmd_comp_status; 93 } fct_cmd_t; 94 95 /* 96 * fcmd_cmd_handle: Bit definitions. 97 * 31 23 15 7 0 98 * +--------------+------------+------------+------------+ 99 * | V |uniq_cntr |fca specific| cmd slot index | 100 * +--------------+------------+------------+------------+ 101 * V = handle valid. 102 */ 103 #define CMD_HANDLE_SLOT_INDEX(x) ((x) & 0xffff) 104 #define CMD_HANDLE_VALID(x) ((x) & 0x80000000) 105 106 enum fct_cmd_types { 107 FCT_CMD_FCP_XCHG = 0x0001, 108 FCT_CMD_RCVD_ELS = 0x0002, 109 FCT_CMD_SOL_ELS = 0x0004, 110 FCT_CMD_RCVD_ABTS = 0x0008, 111 FCT_CMD_SOL_CT = 0x0010, 112 113 FCT_CMD_TYPE_ALL = 0xffff 114 }; 115 116 typedef struct fct_els { 117 uint16_t els_req_size; 118 uint16_t els_resp_size; 119 uint16_t els_req_alloc_size; 120 uint16_t els_resp_alloc_size; 121 uint8_t *els_req_payload; 122 uint8_t *els_resp_payload; 123 } fct_els_t; 124 125 typedef struct fct_sol_ct { 126 uint16_t ct_req_size; 127 uint16_t ct_resp_size; 128 uint16_t ct_req_alloc_size; 129 uint16_t ct_resp_alloc_size; 130 uint8_t *ct_req_payload; 131 uint8_t *ct_resp_payload; 132 } fct_sol_ct_t; 133 134 typedef struct fct_rcvd_abts { 135 uint8_t abts_resp_rctl; /* Can be BA_ACC or BA_RJT */ 136 uint8_t abts_state; 137 uint16_t rsvd; 138 uint8_t abts_resp_payload[12]; 139 } fct_rcvd_abts_t; 140 141 /* 142 * abts state 143 */ 144 #define ABTS_STATE_RECEIVED 0 145 #define ABTS_STATE_RESPONDED 1 146 #define ABTS_STATE_COMPLETED 2 147 #define ABTS_STATE_ABORT_REQUESTED 3 148 #define ABTS_STATE_ABORT_COMPLETED 4 149 150 #define FCHBA_MANUFACTURER_LEN 64 151 #define FCHBA_SERIAL_NUMBER_LEN 64 152 #define FCHBA_MODEL_LEN 256 153 #define FCHBA_MODEL_DESCRIPTION_LEN 256 154 #define FCHBA_HARDWARE_VERSION_LEN 256 155 #define FCHBA_DRIVER_VERSION_LEN 256 156 #define FCHBA_OPTION_ROM_VERSION_LEN 256 157 #define FCHBA_FIRMWARE_VERSION_LEN 256 158 #define FCHBA_DRIVER_NAME_LEN 256 159 #define FCHBA_SYMB_NAME_LEN 255 160 161 #define FCT_INFO_LEN 160 162 #define FCT_TASKQ_NAME_LEN 24 163 164 #define FC_TGT_PORT_INFO_CMD (((uint32_t)'I') << 24) 165 #define FC_TGT_PORT_RLS FC_TGT_PORT_INFO_CMD + 0x1 166 167 typedef struct fct_port_attrs { 168 char manufacturer[FCHBA_MANUFACTURER_LEN]; 169 char serial_number[FCHBA_SERIAL_NUMBER_LEN]; 170 char model[FCHBA_MODEL_LEN]; 171 char model_description[FCHBA_MODEL_DESCRIPTION_LEN]; 172 char hardware_version[FCHBA_HARDWARE_VERSION_LEN]; 173 char driver_version[FCHBA_DRIVER_VERSION_LEN]; 174 char option_rom_version[FCHBA_OPTION_ROM_VERSION_LEN]; 175 char firmware_version[FCHBA_FIRMWARE_VERSION_LEN]; 176 char driver_name[FCHBA_DRIVER_NAME_LEN]; 177 uint32_t vendor_specific_id; 178 uint32_t supported_cos; 179 uint32_t supported_speed; 180 uint32_t max_frame_size; 181 } fct_port_attrs_t; 182 183 typedef struct fct_port_link_status { 184 uint32_t LinkFailureCount; 185 uint32_t LossOfSyncCount; 186 uint32_t LossOfSignalsCount; 187 uint32_t PrimitiveSeqProtocolErrorCount; 188 uint32_t InvalidTransmissionWordCount; 189 uint32_t InvalidCRCCount; 190 } fct_port_link_status_t; 191 192 typedef struct fct_dbuf_store { 193 void *fds_fct_private; 194 void *fds_fca_private; 195 struct stmf_dbuf_store *fds_ds; 196 197 stmf_data_buf_t *(*fds_alloc_data_buf)(struct fct_local_port *port, 198 uint32_t size, uint32_t *pminsize, uint32_t flags); 199 void (*fds_free_data_buf)(struct fct_dbuf_store *fds, 200 stmf_data_buf_t *dbuf); 201 stmf_status_t (*fds_setup_dbuf)(struct fct_local_port *port, 202 stmf_data_buf_t *dbuf, uint32_t flags); 203 void (*fds_teardown_dbuf)(struct fct_dbuf_store *fds, 204 stmf_data_buf_t *dbuf); 205 206 uint32_t fds_max_sgl_xfer_len; 207 uint32_t fds_copy_threshold; 208 } fct_dbuf_store_t; 209 210 #define FCT_FCA_MODREV_1 1 211 212 typedef struct fct_local_port { 213 void *port_fct_private; 214 void *port_fca_private; 215 stmf_local_port_t *port_lport; 216 217 char port_nwwn_str[FC_WWN_BUFLEN]; 218 char port_pwwn_str[FC_WWN_BUFLEN]; 219 uint8_t port_nwwn[FC_WWN_LEN]; 220 uint8_t port_pwwn[FC_WWN_LEN]; 221 char *port_default_alias; 222 char *port_sym_node_name; 223 char *port_sym_port_name; 224 225 stmf_port_provider_t *port_pp; 226 227 uint32_t port_hard_address; 228 uint16_t port_max_logins; 229 uint16_t port_max_xchges; 230 uint32_t port_fca_fcp_cmd_size; 231 uint32_t port_fca_rp_private_size; 232 uint32_t port_fca_sol_els_private_size; 233 uint32_t port_fca_sol_ct_private_size; 234 235 /* in milliseconds */ 236 uint32_t port_fca_abort_timeout; 237 238 fct_dbuf_store_t *port_fds; 239 fct_status_t (*port_get_link_info)( 240 struct fct_local_port *port, struct fct_link_info *li); 241 fct_status_t (*port_register_remote_port)( 242 struct fct_local_port *port, struct fct_remote_port *rp, 243 struct fct_cmd *login_els); 244 fct_status_t (*port_deregister_remote_port)( 245 struct fct_local_port *port, struct fct_remote_port *rp); 246 fct_status_t (*port_send_cmd)(fct_cmd_t *cmd); 247 fct_status_t (*port_xfer_scsi_data)(fct_cmd_t *cmd, 248 stmf_data_buf_t *dbuf, uint32_t flags); 249 fct_status_t (*port_send_cmd_response)(fct_cmd_t *cmd, 250 uint32_t ioflags); 251 fct_status_t (*port_abort_cmd)(struct fct_local_port *port, 252 fct_cmd_t *cmd, uint32_t flags); 253 void (*port_ctl)(struct fct_local_port *port, 254 int cmd, void *arg); 255 fct_status_t (*port_flogi_xchg)(struct fct_local_port *port, 256 struct fct_flogi_xchg *fx); 257 void (*port_populate_hba_details)( 258 struct fct_local_port *port, struct fct_port_attrs *port_attrs); 259 fct_status_t (*port_info)(uint32_t cmd, 260 struct fct_local_port *port, void *arg, uint8_t *buf, 261 uint32_t *bufsizep); 262 int port_fca_version; 263 } fct_local_port_t; 264 265 /* 266 * Common struct used during FLOGI exchange. 267 */ 268 typedef struct fct_flogi_xchg { 269 uint8_t fx_op; /* ELS_OP_FLOGI or ELS_OP_ACC/RJT */ 270 uint8_t fx_rjt_reason; 271 uint8_t fx_rjt_expl; 272 uint8_t fx_sec_timeout; /* Timeout in seconds */ 273 uint32_t fx_fport:1, /* 0=N_port, 1=F_port */ 274 rsvd2:31; 275 uint32_t fx_sid; /* 24 bit SID to use */ 276 uint32_t fx_did; /* 24 bit DID to use */ 277 uint8_t fx_pwwn[8]; 278 uint8_t fx_nwwn[8]; 279 } fct_flogi_xchg_t; 280 281 typedef struct fct_link_info { 282 uint32_t portid; 283 uint8_t port_topology; 284 uint8_t port_speed; 285 286 uint8_t rsvd:5, 287 288 /* 289 * FCA sets this bit to indicate that fct does not need to do FLOGI 290 * because either FCA did the FLOGI or it determined that its a private 291 * loop. Setting this bit by FCA is optional. 292 */ 293 port_no_fct_flogi:1, 294 295 /* FCA sets this bit to indicate that it did FLOGI */ 296 port_fca_flogi_done:1, 297 298 /* FCT sets this bit to indicate that it did FLOGI */ 299 port_fct_flogi_done:1; 300 301 uint8_t rsvd1; 302 303 /* The fields below are only valid if someone did a successful flogi */ 304 uint8_t port_rnwwn[8]; 305 uint8_t port_rpwwn[8]; 306 } fct_link_info_t; 307 308 typedef struct fct_port_stat { 309 kstat_named_t link_failure_cnt; 310 kstat_named_t loss_of_sync_cnt; 311 kstat_named_t loss_of_signals_cnt; 312 kstat_named_t prim_seq_protocol_err_cnt; 313 kstat_named_t invalid_tx_word_cnt; 314 kstat_named_t invalid_crc_cnt; 315 } fct_port_stat_t; 316 317 /* 318 * port topology 319 */ 320 #define PORT_TOPOLOGY_UNKNOWN 0 321 #define PORT_TOPOLOGY_PT_TO_PT 1 322 #define PORT_TOPOLOGY_PRIVATE_LOOP 2 323 #define PORT_TOPOLOGY_PUBLIC_LOOP 6 324 #define PORT_TOPOLOGY_FABRIC_PT_TO_PT 5 325 #define PORT_TOPOLOGY_FABRIC_BIT 4 326 327 #define PORT_FLOGI_DONE(li) (((li)->port_fca_flogi_done) || \ 328 ((li)->port_fct_flogi_done)) 329 330 /* 331 * port speed 332 */ 333 #define PORT_SPEED_UNKNOWN 0 334 #define PORT_SPEED_1G 1 335 #define PORT_SPEED_2G 2 336 #define PORT_SPEED_4G 4 337 #define PORT_SPEED_8G 8 338 #define PORT_SPEED_10G 16 339 340 /* 341 * Abort commands 342 */ 343 #define FCT_TERMINATE_CMD 1 344 345 /* 346 * FCT port states. 347 */ 348 #define FCT_STATE_OFFLINE 0 349 #define FCT_STATE_ONLINING 1 350 #define FCT_STATE_ONLINE 2 351 #define FCT_STATE_OFFLINING 3 352 353 /* 354 * fct ctl commands. These should not conflict with stmf ctl commands 355 */ 356 #define FCT_CMD_PORT_ONLINE (STMF_LPORT_CTL_CMDS | 0x01) 357 #define FCT_CMD_PORT_ONLINE_COMPLETE (STMF_LPORT_CTL_CMDS | 0x02) 358 #define FCT_CMD_PORT_OFFLINE (STMF_LPORT_CTL_CMDS | 0x03) 359 #define FCT_CMD_PORT_OFFLINE_COMPLETE (STMF_LPORT_CTL_CMDS | 0x04) 360 #define FCT_ACK_PORT_ONLINE_COMPLETE (STMF_LPORT_CTL_CMDS | 0x05) 361 #define FCT_ACK_PORT_OFFLINE_COMPLETE (STMF_LPORT_CTL_CMDS | 0x06) 362 #define FCT_CMD_FORCE_LIP (STMF_LPORT_CTL_CMDS | 0x07) 363 364 /* 365 * IO flags for cmd flow. 366 */ 367 #define FCT_IOF_FCA_DONE 0x10000 368 #define FCT_IOF_FORCE_FCA_DONE 0x20000 369 370 /* 371 * Fill CTIU preamble 372 */ 373 #ifdef lint 374 #define FCT_FILL_CTIU_PREAMBLE(x_payload, x_ctop) _NOTE(EMPTY) 375 #else 376 #define FCT_FILL_CTIU_PREAMBLE(x_payload, x_ctop) \ 377 do { \ 378 x_payload[0] = 0x01; \ 379 x_payload[4] = 0xFC; \ 380 x_payload[5] = 0x02; \ 381 x_payload[8] = 0xFF & (x_ctop >> 8); \ 382 x_payload[9] = 0xFF & (x_ctop); \ 383 } while (0) 384 #endif 385 386 uint64_t fct_netbuf_to_value(uint8_t *buf, uint8_t nbytes); 387 void fct_value_to_netbuf(uint64_t value, uint8_t *buf, uint8_t nbytes); 388 void *fct_alloc(fct_struct_id_t struct_id, int additional_size, int flags); 389 void fct_free(void *ptr); 390 fct_cmd_t *fct_scsi_task_alloc(struct fct_local_port *port, 391 uint16_t rp_handle, uint32_t rportid, uint8_t *lun, 392 uint16_t cdb_length, uint16_t task_ext); 393 fct_status_t fct_register_local_port(fct_local_port_t *port); 394 fct_status_t fct_deregister_local_port(fct_local_port_t *port); 395 void fct_handle_event(fct_local_port_t *port, int event_id, 396 uint32_t event_flags, caddr_t arg); 397 void fct_post_rcvd_cmd(fct_cmd_t *cmd, stmf_data_buf_t *dbuf); 398 void fct_queue_cmd_for_termination(fct_cmd_t *cmd, fct_status_t s); 399 void fct_queue_scsi_task_for_termination(fct_cmd_t *cmd, fct_status_t s); 400 fct_cmd_t *fct_handle_to_cmd(fct_local_port_t *port, uint32_t fct_handle); 401 void fct_ctl(struct stmf_local_port *lport, int cmd, void *arg); 402 void fct_cmd_fca_aborted(fct_cmd_t *cmd, fct_status_t s, uint32_t ioflags); 403 uint16_t fct_get_rp_handle(fct_local_port_t *port, uint32_t rportid); 404 void fct_send_response_done(fct_cmd_t *cmd, fct_status_t s, uint32_t ioflags); 405 void fct_send_cmd_done(fct_cmd_t *cmd, fct_status_t s, uint32_t ioflags); 406 void fct_scsi_data_xfer_done(fct_cmd_t *cmd, stmf_data_buf_t *dbuf, 407 uint32_t ioflags); 408 fct_status_t fct_port_initialize(fct_local_port_t *port, uint32_t rflags, 409 char *additional_info); 410 fct_status_t fct_port_shutdown(fct_local_port_t *port, uint32_t rflags, 411 char *additional_info); 412 fct_status_t fct_handle_rcvd_flogi(fct_local_port_t *port, 413 fct_flogi_xchg_t *fx); 414 void fct_log_local_port_event(fct_local_port_t *port, char *subclass); 415 void fct_log_remote_port_event(fct_local_port_t *port, char *subclass, 416 uint8_t *rp_pwwn, uint32_t rp_id); 417 void fct_wwn_to_str(char *to_ptr, const uint8_t *from_ptr); 418 419 #ifdef __cplusplus 420 } 421 #endif 422 423 #endif /* _FCT_H */ 424