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 */