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