fc_appif.h revision fcf3ce441efd61da9bb2884968af01cb7c1452cc
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _FC_APPIF_H
#define _FC_APPIF_H
#include <sys/note.h>
#ifdef __cplusplus
extern "C" {
#endif
#if !defined(_BIT_FIELDS_LTOH) && !defined(_BIT_FIELDS_HTOL)
#error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
#endif /* _BIT_FIELDS_LTOH */
/*
* Local port topology definitions
*
* fp/fctl use these a lot with the fp_topology field in the fc_port_t struct,
* but use is not limited to fp_topology. These are also understood by ULPs.
*/
#define FC_TOP_UNKNOWN 0
#define FC_TOP_PRIVATE_LOOP 1
#define FC_TOP_PUBLIC_LOOP 2
#define FC_TOP_FABRIC 3
#define FC_TOP_PT_PT 4
#define FC_TOP_NO_NS 5
/*
* Macros used with the preceeding topology #defines.
* fp/fctl use these a lot with the fp_topology field in the fc_port_t struct,
* but use is not limited to fp_topology. These are also understood by ULPs.
*/
#define FC_TOP_EXTERNAL(t) FC_IS_TOP_SWITCH(t)
#define FC_IS_TOP_SWITCH(t) (((t) == FC_TOP_FABRIC) ||\
((t) == FC_TOP_PUBLIC_LOOP))
/*
* fc_remote_port state (map_state) definitions.
*
* Used with the pd_state field in the fc_remote_port_t struct.
*/
#define PORT_DEVICE_INVALID 0 /* State when created or login failed */
#define PORT_DEVICE_VALID 1 /* Logged out */
#define PORT_DEVICE_LOGGED_IN 2 /* Logged in */
/*
* Firmware, FCode revision field lengths
*/
#define FC_FCODE_REV_SIZE 25
#define FC_FW_REV_SIZE 25
typedef struct ct_header {
#if defined(_BIT_FIELDS_LTOH)
uint32_t ct_inid : 24, /* Initial Node ID */
ct_rev : 8; /* Revision */
uint32_t ct_reserved1 : 8,
ct_options : 8,
ct_fcssubtype : 8,
ct_fcstype : 8;
uint32_t ct_aiusize : 16,
ct_cmdrsp : 16;
uint32_t ct_vendor : 8,
ct_expln : 8,
ct_reason : 8,
ct_reserved2 : 8;
#else
uint32_t ct_rev : 8, /* revision */
ct_inid : 24; /* initial node ID */
uint32_t ct_fcstype : 8, /* type of service */
ct_fcssubtype : 8, /* subtype of service */
ct_options : 8, /* options */
ct_reserved1 : 8; /* reserved */
uint32_t ct_cmdrsp : 16, /* command/response code */
ct_aiusize : 16; /* AIU/residual size */
uint32_t ct_reserved2 : 8, /* reserved */
ct_reason : 8, /* reason code */
ct_expln : 8, /* reason explanation */
ct_vendor : 8; /* vendor unique */
#endif /* _BIT_FIELDS_LTOH */
} fc_ct_header_t;
/* World Wide Name format */
typedef union la_wwn {
uchar_t raw_wwn[8];
uint32_t i_wwn[2];
#if defined(_BIT_FIELDS_LTOH)
struct {
uint32_t wwn_hi : 16,
nport_id : 12,
naa_id : 4;
uint32_t wwn_lo;
}w;
#else
struct {
uint32_t naa_id : 4,
nport_id : 12,
wwn_hi : 16;
uint32_t wwn_lo;
}w;
#endif /* _BIT_FIELDS_LTOH */
} la_wwn_t;
/*
* Values for naa_id
*/
#define NAA_ID_IEEE 1
#define NAA_ID_IEEE_EXTENDED 2
#ifndef FC_WWN_SIZE
#define FC_WWN_SIZE (sizeof (la_wwn_t))
#endif /* FC_WWN_SIZE */
typedef struct service_param {
uint16_t class_opt;
uint16_t initiator_ctl;
uint16_t recipient_ctl;
uint16_t rcv_size;
uint16_t conc_sequences;
uint16_t n_port_e_to_e_credit;
uint16_t open_seq_per_xchng;
uint16_t rsvd;
} svc_param_t;
typedef struct common_service {
uint16_t fcph_version;
uint16_t btob_credit;
uint16_t cmn_features;
uint16_t rx_bufsize;
uint16_t conc_sequences;
uint16_t relative_offset;
uint32_t e_d_tov;
} com_svc_t;
typedef struct ls_code {
#if defined(_BIT_FIELDS_LTOH)
uint32_t mbz : 24,
ls_code : 8;
#else
uint32_t ls_code : 8,
mbz : 24;
#endif /* _BIT_FIELDS_LTOH */
} ls_code_t;
/* Login Payload. */
typedef struct la_els_logi {
ls_code_t ls_code;
com_svc_t common_service;
la_wwn_t nport_ww_name;
la_wwn_t node_ww_name;
svc_param_t class_1;
svc_param_t class_2;
svc_param_t class_3;
uchar_t reserved[16];
uchar_t vendor_version[16];
} la_els_logi_t;
typedef struct fc_ns_cmd {
uint32_t ns_flags; /* for future use */
uint16_t ns_cmd; /* NS command type */
uint16_t ns_req_len;
caddr_t ns_req_payload; /* No CT header */
uint16_t ns_resp_len;
caddr_t ns_resp_payload; /* no CT header */
void *ns_fctl_private; /* Transport private */
fc_ct_header_t ns_resp_hdr; /* for the curious */
} fc_ns_cmd_t;
#if defined(_SYSCALL32)
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack(4)
#endif
typedef struct la_els_logi32 {
ls_code_t ls_code;
com_svc_t common_service;
la_wwn_t nport_ww_name;
la_wwn_t node_ww_name;
svc_param_t class_1;
svc_param_t class_2;
svc_param_t class_3;
uchar_t reserved[16];
uchar_t vendor_version[16];
} la_els_logi32_t;
typedef struct fc_ns_cmd32 {
uint32_t ns_flags; /* for future use */
uint16_t ns_cmd; /* NS command type */
uint16_t ns_req_len;
caddr_t ns_req_payload; /* No CT header */
uint16_t ns_resp_len;
caddr_t ns_resp_payload; /* no CT header */
void *ns_fctl_private; /* Transport private */
fc_ct_header_t ns_resp_hdr; /* for the curious */
} fc_ns_cmd32_t;
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif
#endif /* _SYSCALL32 */
/* Link Error Parameters in the RLS Accept payload */
typedef struct fc_rls_acc_params {
uint32_t rls_link_fail; /* link failure count */
uint32_t rls_sync_loss; /* loss of sync count */
uint32_t rls_sig_loss; /* loss of signal count */
uint32_t rls_prim_seq_err; /* primitive seq error */
uint32_t rls_invalid_word; /* invalid tx word */
uint32_t rls_invalid_crc; /* invalid CRC count */
} fc_rls_acc_t;
/* RLS Payload. */
typedef struct la_els_rls {
ls_code_t ls_code;
fc_portid_t rls_portid; /* port identifier */
} la_els_rls_t;
/* RLS accept payload */
typedef struct la_els_rls_acc {
ls_code_t ls_code;
fc_rls_acc_t rls_link_params; /* link error status block */
} la_els_rls_acc_t;
/* Node Id Parameters in the RNID Get/Set Accept/Request payload */
typedef struct fc_rnid_params {
uchar_t global_id[16]; /* global name */
uint32_t unit_type; /* unit type */
uint32_t port_id; /* port id */
uint32_t num_attached; /* number of attached nodes */
uint16_t ip_version; /* ip version */
uint16_t udp_port; /* udp port number */
uchar_t ip_addr[16]; /* ip address */
uint16_t specific_id_resv; /* reserved */
uint16_t topo_flags; /* topology discovery flags */
} fc_rnid_t;
/* RNID get data format flag */
#define FCIO_CFLAGS_RNID_GET_GENERAL_TOPOLOGY 0xDF
#define FCIO_CFLAGS_RNID_GET_VENDOR_SPECIFIC 0xE0
/* RNID maximum data length - common data(16) + specific data(252) */
#define FCIO_RNID_MAX_DATA_LEN 268
/* RNID Payload. */
typedef struct la_els_rnid {
ls_code_t ls_code;
uchar_t data_format; /* data format returned */
uchar_t resv[3];
} la_els_rnid_t;
/*
* ELS RNID header
* - cmn_len can be 0 or 16 - if it is 0 then specific data starts at
* offset 8 else specific data starts at offset 24 in the RNID els response
*/
typedef struct fc_rnid_hdr {
uchar_t data_format;
uchar_t cmn_len;
uchar_t resv;
uchar_t specific_len;
}fc_rnid_hdr_t;
typedef struct la_els_rnid_acc {
ls_code_t ls_code;
fc_rnid_hdr_t hdr;
uchar_t data[FCIO_RNID_MAX_DATA_LEN];
} la_els_rnid_acc_t;
typedef struct la_npiv_create_entry {
la_wwn_t VNodeWWN;
la_wwn_t VPortWWN;
uint32_t vindex;
} la_npiv_create_entry_t;
#if !defined(__lint)
_NOTE(SCHEME_PROTECTS_DATA("unique per request", fc_ns_cmd))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", ct_header))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", la_els_logi))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", la_wwn))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", fc_rls_acc_params))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", la_els_rls))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", la_els_rls_acc))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", fc_rnid_params))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", la_els_rnid))
_NOTE(SCHEME_PROTECTS_DATA("unique per request", la_els_rnid_acc))
#endif /* __lint */
#ifdef __cplusplus
}
#endif
#endif /* _FC_APPIF_H */