#ifndef _FCTL_H
#define _FCTL_H
#include <sys/note.h>
#include <sys/time.h>
#ifdef __cplusplus
extern "C" {
#endif
#define FC_STATE_OFFLINE 0x0000
#define FC_STATE_ONLINE 0x0001
#define FC_STATE_LOOP 0x0002
#define FC_STATE_NAMESERVICE 0x0003
#define FC_STATE_RESET 0x0004
#define FC_STATE_RESET_REQUESTED 0x0005
#define FC_STATE_LIP 0x0006
#define FC_STATE_LIP_LBIT_SET 0x0007
#define FC_STATE_DEVICE_CHANGE 0x0008
#define FC_STATE_TARGET_PORT_RESET 0x0009
#define FC_STATE_1GBIT_SPEED 0x0100
#define FC_STATE_2GBIT_SPEED 0x0400
#define FC_STATE_4GBIT_SPEED 0x0500
#define FC_STATE_10GBIT_SPEED 0x0600
#define FC_STATE_8GBIT_SPEED 0x0700
#define FC_STATE_16GBIT_SPEED 0x0800
#define FC_STATE_32GBIT_SPEED 0x0900
#define FC_STATE_FULL_SPEED FC_STATE_1GBIT_SPEED
#define FC_STATE_DOUBLE_SPEED FC_STATE_2GBIT_SPEED
#define FC_STATE_FCA_IS_NODMA 0x80000000
#define FC_PORT_SPEED_MASK(state) ((state) & 0xFF00)
#define FC_PORT_STATE_MASK(state) ((state) & 0xFF)
#define FC_NOTIFY_RECOVERY_DONE 0x01
#define FC_NOTIFY_TARGET_MODE 0x02
#define FC_NOTIFY_NO_TARGET_MODE 0x03
#define FC_NOTIFY_RECOVERY_CLEANUP 0x04
#define FC_NOTIFY_THROTTLE 0x80
#define FC_NOTIFY_FLAG_MASK(cmd) ((cmd) & 0xFF)
#define FC_NOTIFY_VALUE_MASK(cmd) ((cmd) & 0xFFFFFF00)
#define FC_NOTIFY_GET_FLAG(cmd) FC_NOTIFY_FLAG_MASK(cmd)
#define FC_NOTIFY_GET_VALUE(cmd) (FC_NOTIFY_VALUE_MASK(cmd) >> 8)
#define FC_TRAN_CLASS(flag) ((flag) & 0xF0)
#define FC_TRAN_INTR 0x01
#define FC_TRAN_NO_INTR 0x02
#define FC_TRAN_HI_PRIORITY 0x04
#define FC_TRAN_DUMPING 0x08
#define FC_TRAN_CLASS1 0x10
#define FC_TRAN_CLASS2 0x20
#define FC_TRAN_CLASS3 0x30
#define FC_TRAN_CLASS_INVALID 0xF0
#define FC_TRAN_IMMEDIATE_CB 0x100
#define FC_PKT_NOP 0
#define FC_PKT_INBOUND 1
#define FC_PKT_OUTBOUND 2
#define FC_PKT_EXCHANGE 3
#define FC_PKT_FCP_READ 4
#define FC_PKT_FCP_WRITE 5
#define FC_PKT_IP_WRITE 6
#define FC_PKT_BROADCAST 7
#define FC_TRACE_LOG_MASK 0xF00000
#define FC_TRACE_LOG_MSG 0x100000
#define FC_TRACE_LOG_CONSOLE 0x200000
#define FC_TRACE_LOG_CONSOLE_MSG 0x400000
#define FC_TRACE_LOG_BUF 0x080000
typedef struct fc_packet {
uint16_t pkt_tran_flags;
uint16_t pkt_tran_type;
uint32_t pkt_timeout;
uint32_t pkt_cmdlen;
uint32_t pkt_rsplen;
uint32_t pkt_datalen;
caddr_t pkt_cmd;
caddr_t pkt_resp;
caddr_t pkt_data;
struct buf *pkt_data_buf;
void (*pkt_ulp_comp)(struct fc_packet *);
opaque_t pkt_ulp_private;
void (*pkt_comp)(struct fc_packet *);
struct fc_remote_port *pkt_pd;
ddi_dma_handle_t pkt_cmd_dma;
ddi_acc_handle_t pkt_cmd_acc;
ddi_dma_cookie_t *pkt_cmd_cookie;
ddi_dma_handle_t pkt_resp_dma;
ddi_acc_handle_t pkt_resp_acc;
ddi_dma_cookie_t *pkt_resp_cookie;
ddi_dma_handle_t pkt_data_dma;
ddi_acc_handle_t pkt_data_acc;
ddi_dma_cookie_t *pkt_data_cookie;
uint_t pkt_cmd_cookie_cnt;
uint_t pkt_resp_cookie_cnt;
uint_t pkt_data_cookie_cnt;
fc_frame_hdr_t pkt_cmd_fhdr;
opaque_t pkt_fca_private;
uchar_t pkt_state;
uchar_t pkt_action;
uchar_t pkt_expln;
uint32_t pkt_reason;
uint64_t pkt_ena;
fc_frame_hdr_t pkt_resp_fhdr;
uint32_t pkt_data_resid;
uint32_t pkt_resp_resid;
opaque_t pkt_fca_device;
opaque_t pkt_ub_resp_token;
opaque_t pkt_session;
opaque_t pkt_security1;
opaque_t pkt_security2;
opaque_t pkt_qos1;
opaque_t pkt_qos2;
opaque_t pkt_ulp_rsvd1;
#define pkt_ulp_rscn_infop pkt_ulp_rsvd1
opaque_t pkt_ulp_rsvd2;
opaque_t pkt_fctl_rsvd1;
opaque_t pkt_fctl_rsvd2;
opaque_t pkt_fca_rsvd1;
opaque_t pkt_fca_rsvd2;
uint64_t pkt_rsvd;
} fc_packet_t;
#if !defined(__lint)
_NOTE(SCHEME_PROTECTS_DATA("not messed with after transport", fc_packet))
#endif
typedef struct fca_hba_fru_details {
uint32_t port_index;
uint64_t high;
uint64_t low;
} fca_hba_fru_details_t;
#define FC_HBA_PORTSPEED_UNKNOWN 0
#define FC_HBA_PORTSPEED_1GBIT 1
#define FC_HBA_PORTSPEED_2GBIT 2
#define FC_HBA_PORTSPEED_10GBIT 4
#define FC_HBA_PORTSPEED_4GBIT 8
#define FC_HBA_PORTSPEED_8GBIT 16
#define FC_HBA_PORTSPEED_16GBIT 32
#define FC_HBA_PORTSPEED_32GBIT 64
#define FC_HBA_PORTSPEED_NOT_NEGOTIATED (1<<15)
#define FCHBA_MANUFACTURER_LEN 64
#define FCHBA_SERIAL_NUMBER_LEN 64
#define FCHBA_MODEL_LEN 256
#define FCHBA_MODEL_DESCRIPTION_LEN 256
#define FCHBA_HARDWARE_VERSION_LEN 256
#define FCHBA_DRIVER_VERSION_LEN 256
#define FCHBA_OPTION_ROM_VERSION_LEN 256
#define FCHBA_FIRMWARE_VERSION_LEN 256
#define FCHBA_DRIVER_NAME_LEN 256
#define FCHBA_SYMB_NAME_LEN 255
typedef struct fca_port_attrs {
char manufacturer[FCHBA_MANUFACTURER_LEN];
char serial_number[FCHBA_SERIAL_NUMBER_LEN];
char model[FCHBA_MODEL_LEN];
char model_description[FCHBA_MODEL_DESCRIPTION_LEN];
char hardware_version[FCHBA_HARDWARE_VERSION_LEN];
char driver_version[FCHBA_DRIVER_VERSION_LEN];
char option_rom_version[FCHBA_OPTION_ROM_VERSION_LEN];
char firmware_version[FCHBA_FIRMWARE_VERSION_LEN];
char driver_name[FCHBA_DRIVER_NAME_LEN];
uint32_t vendor_specific_id;
uint32_t supported_cos;
uint32_t supported_speed;
uint32_t max_frame_size;
fca_hba_fru_details_t hba_fru_details;
uchar_t sym_node_name[FCHBA_SYMB_NAME_LEN];
uchar_t sym_port_name[FCHBA_SYMB_NAME_LEN];
} fca_port_attrs_t;
typedef struct unsolicited_buffer {
uchar_t ub_class;
uchar_t ub_resvd1;
ushort_t ub_resp_flags;
ushort_t ub_resp_key;
ushort_t ub_resvd2;
uint32_t ub_bufsize;
caddr_t ub_buffer;
void *ub_port_private;
void *ub_fca_private;
opaque_t ub_port_handle;
opaque_t ub_resp_token;
uint64_t ub_token;
fc_frame_hdr_t ub_frame;
} fc_unsol_buf_t;
#define FC_UB_RESP_LOGIN_REQUIRED 0x4000
typedef struct fc_trace_dmsg {
int id_size;
int id_flag;
timespec_t id_time;
caddr_t id_buf;
struct fc_trace_dmsg *id_next;
} fc_trace_dmsg_t;
#define FC_TRACE_LOGQ_V2 0x1
typedef struct fc_trace_logq {
kmutex_t il_lock;
int il_hiwat;
int il_flags;
int il_size;
int il_afail;
int il_lfail;
int il_id;
fc_trace_dmsg_t *il_msgh;
fc_trace_dmsg_t *il_msgt;
} fc_trace_logq_t;
#define PORT_DEVICE_NOCHANGE 0x0
#define PORT_DEVICE_NEW 0x1
#define PORT_DEVICE_OLD 0x2
#define PORT_DEVICE_CHANGED 0x3
#define PORT_DEVICE_DELETE 0x4
#define PORT_DEVICE_USER_LOGIN 0x5
#define PORT_DEVICE_USER_LOGOUT 0x6
#define PORT_DEVICE_USER_CREATE 0x7
#define PORT_DEVICE_USER_DELETE 0x8
#define PORT_DEVICE_REPORTLUN_CHANGED 0x9
#define PORT_DEVICE_DUPLICATE_MAP_ENTRY 0x00000001
#define PORT_DEVICE_NO_SKIP_DEVICE_DISCOVERY 0x00000002
void fc_trace_debug(fc_trace_logq_t *logq, caddr_t name, int dflag, int dlevel,
int errno, const char *fmt, ...);
fc_trace_logq_t *fc_trace_alloc_logq(int maxsize);
void fc_trace_free_logq(fc_trace_logq_t *logq);
void fc_trace_logmsg(fc_trace_logq_t *logq, caddr_t buf, int level);
caddr_t fc_trace_msg(int fc_trace_error);
void fc_wwn_to_str(la_wwn_t *wwn, caddr_t string);
void fc_str_to_wwn(caddr_t string, la_wwn_t *wwn);
#if !defined(__lint)
_NOTE(SCHEME_PROTECTS_DATA("unique per request", unsolicited_buffer))
#endif
#ifdef __cplusplus
}
#endif
#endif