#ifndef _SYS_IB_MGT_IBDM_IBDM_IMPL_H
#define _SYS_IB_MGT_IBDM_IBDM_IMPL_H
#include <sys/ib/mgt/ibdm/ibdm_ibnex.h>
#include <sys/ib/ibtl/impl/ibtl_util.h>
#ifdef __cplusplus
extern "C" {
#endif
#define IBDM_REQ_TYPE_INVALID 0x0
#define IBDM_REQ_TYPE_CLASSPORTINFO 0x1
#define IBDM_REQ_TYPE_IOUINFO 0x2
#define IBDM_REQ_TYPE_IOCINFO 0x4
#define IBDM_REQ_TYPE_SRVENTS 0x8
#define IBDM_REQ_TYPE_IOU_DIAGCODE 0x10
#define IBDM_REQ_TYPE_IOC_DIAGCODE 0x20
typedef struct ibdm_taskq_args_s {
ibmf_handle_t tq_ibmf_handle;
ibmf_msg_t *tq_ibmf_msg;
void *tq_args;
} ibdm_taskq_args_t;
_NOTE(SCHEME_PROTECTS_DATA("unique per call", ibdm_taskq_args_t))
_NOTE(SCHEME_PROTECTS_DATA("unique per call", ib_mad_hdr_t))
_NOTE(SCHEME_PROTECTS_DATA("unique per call", ibmf_msg_t))
#define IBDM_GID_PRESENT 0x1
#define IBDM_GID_NOT_PRESENT 0x0
#define IBDM_IBMF_PKT_DUP_RESP 0x1
#define IBDM_IBMF_PKT_REUSED 0x2
#define IBDM_IBMF_PKT_UNEXP_RESP 0x4
#define IBDM_MAX_SERV_ENTRIES_PER_REQ 4
typedef struct ibdm_gid_s {
uint64_t gid_dgid_hi;
uint64_t gid_dgid_lo;
struct ibdm_gid_s *gid_next;
} ibdm_gid_t;
#define IBDM_GID_PROBE_NOT_DONE 0x00
#define IBDM_GET_CLASSPORTINFO 0x01
#define IBDM_GET_IOUNITINFO 0x02
#define IBDM_GET_IOC_DETAILS 0x04
#define IBDM_GID_PROBING_COMPLETE 0x08
#define IBDM_GID_PROBING_SKIPPED 0x10
#define IBDM_GID_PROBING_FAILED 0x20
#define IBDM_SET_CLASSPORTINFO 0x40
#define IBDM_CISCO_COMPANY_ID (0x5ad)
#define IBDM_CISCO_DEVICE_ID (0xa87c)
#define IBDM_OUI_GUID_SHIFT (40)
typedef struct ibdm_dp_gidinfo_s {
kmutex_t gl_mutex;
uint_t gl_state;
int gl_reprobe_flag;
struct ibdm_dp_gidinfo_s *gl_next;
struct ibdm_dp_gidinfo_s *gl_prev;
ibdm_iou_info_t *gl_iou;
int gl_pending_cmds;
ibmf_qp_handle_t gl_qp_hdl;
uint64_t gl_transactionID;
ibdm_timeout_cb_args_t gl_iou_cb_args;
ib_lid_t gl_dlid;
ib_lid_t gl_slid;
uint64_t gl_dgid_hi;
uint64_t gl_dgid_lo;
uint64_t gl_sgid_hi;
uint64_t gl_sgid_lo;
ib_guid_t gl_nodeguid;
ib_guid_t gl_portguid;
ib_pkey_t gl_p_key;
boolean_t gl_is_dm_capable;
boolean_t gl_redirected;
uint32_t gl_redirect_dlid;
uint32_t gl_redirect_QP;
ib_pkey_t gl_redirect_pkey;
ib_qkey_t gl_redirect_qkey;
uint64_t gl_redirectGID_hi;
uint64_t gl_redirectGID_lo;
ibmf_handle_t gl_ibmf_hdl;
ibmf_saa_handle_t gl_sa_hdl;
timeout_id_t gl_timeout_id;
ibdm_timeout_cb_args_t gl_cpi_cb_args;
uint32_t gl_ngids;
ibdm_gid_t *gl_gid;
uint32_t gl_resp_timeout;
int gl_num_iocs;
ibdm_hca_list_t *gl_hca_list;
int gl_disconnected;
uint64_t gl_min_transactionID;
uint64_t gl_max_transactionID;
ibdm_iou_info_t *gl_prev_iou;
uint16_t gl_devid;
kcondvar_t gl_probe_cv;
uint32_t gl_flag;
uint8_t gl_SL:4;
uint8_t gl_redirectSL:4;
} ibdm_dp_gidinfo_t;
_NOTE(MUTEX_PROTECTS_DATA(ibdm_dp_gidinfo_s::gl_mutex,
ibdm_dp_gidinfo_s::{gl_state gl_timeout_id gl_pending_cmds}))
_NOTE(SCHEME_PROTECTS_DATA("Serialized access by cv", ibdm_dp_gidinfo_s))
_NOTE(DATA_READABLE_WITHOUT_LOCK(ibdm_dp_gidinfo_s::{gl_ibmf_hdl gl_sa_hdl}))
_NOTE(MUTEX_PROTECTS_DATA(ibdm_dp_gidinfo_s::gl_mutex,
ibdm_ioc_info_s::{ioc_timeout_id ioc_dc_timeout_id}))
_NOTE(MUTEX_PROTECTS_DATA(ibdm_dp_gidinfo_s::gl_mutex,
ibdm_srvents_info_s::se_timeout_id))
#define IBDM_GID_TRANSACTIONID_SHIFT ((ulong_t)32)
#define IBDM_GID_TRANSACTIONID_MASK 0xFFFFFFFF00000000ULL
typedef struct ibdm_s {
kmutex_t ibdm_mutex;
uint32_t ibdm_hca_count;
kmutex_t ibdm_hl_mutex;
kmutex_t ibdm_ibnex_mutex;
ibdm_hca_list_t *ibdm_hca_list_head;
ibdm_hca_list_t *ibdm_hca_list_tail;
ibdm_dp_gidinfo_t *ibdm_dp_gidlist_head;
ibdm_dp_gidinfo_t *ibdm_dp_gidlist_tail;
kcondvar_t ibdm_probe_cv;
kcondvar_t ibdm_busy_cv;
kcondvar_t ibdm_port_settle_cv;
uint32_t ibdm_ngid_probes_in_progress;
uint64_t ibdm_transactionID;
uint32_t ibdm_ngids;
uint32_t ibdm_busy;
int ibdm_state;
ibt_clnt_hdl_t ibdm_ibt_clnt_hdl;
ibdm_callback_t ibdm_ibnex_callback;
int ibdm_prev_iou;
} ibdm_t;
_NOTE(MUTEX_PROTECTS_DATA(ibdm_s::ibdm_mutex, ibdm_s::{ibdm_ibt_clnt_hdl
ibdm_busy ibdm_state}))
_NOTE(DATA_READABLE_WITHOUT_LOCK(ibdm_s::ibdm_ibt_clnt_hdl))
_NOTE(MUTEX_PROTECTS_DATA(ibdm_s::ibdm_hl_mutex,
ibdm_s::{ibdm_hca_list_head ibdm_hca_list_tail}))
_NOTE(MUTEX_PROTECTS_DATA(ibdm_s::ibdm_ibnex_mutex,
ibdm_s::ibdm_ibnex_callback))
_NOTE(SCHEME_PROTECTS_DATA("Serialized access by cv", ibdm_s))
_NOTE(LOCK_ORDER(ibdm_s::ibdm_mutex ibdm_dp_gidinfo_s::gl_mutex))
#define IBDM_LOCKS_ALLOCED 0x01
#define IBDM_CVS_ALLOCED 0x02
#define IBDM_IBT_ATTACHED 0x04
#define IBDM_HCA_ATTACHED 0x08
#define IBDM_8_BIT_MASK 0x00FF
#define IBDM_16_BIT_MASK 0xFFFF
#define IBDM_RETRY_COUNT 0x2
#define IBDM_BUSY 0x1
#define IBDM_PROBE_IN_PROGRESS 0x2
#define IBDM_CISCO_PROBE 0x4
#define IBDM_CISCO_PROBE_DONE 0x8
#define IBDM_MAD_SIZE 256
#define IBDM_DM_MAD_HDR_SZ 40
#define IBDM_DFT_TIMEOUT 4
#define IBDM_DFT_NRETRIES 3
#define IBDM_ENABLE_TASKQ_HANDLING 1
#define IBDM_DISABLE_TASKQ_HANLDING 0
typedef struct ibdm_saa_event_arg_s {
ibmf_saa_handle_t ibmf_saa_handle;
ibmf_saa_subnet_event_t ibmf_saa_event;
ibmf_saa_event_details_t event_details;
void *callback_arg;
} ibdm_saa_event_arg_t;
#define IBDM_TIMEOUT_VALUE(t) (drv_usectohz(t * 1000000))
#define IBDM_OUT_IBMFMSG_MADHDR(msg)\
(msg->im_msgbufs_send.im_bufs_mad_hdr)
#define IBDM_IN_IBMFMSG_MADHDR(msg)\
(msg->im_msgbufs_recv.im_bufs_mad_hdr)
#define IBDM_IN_IBMFMSG_STATUS(msg)\
b2h16(msg->im_msgbufs_recv.im_bufs_mad_hdr->Status)
#define IBDM_IN_IBMFMSG_ATTR(msg)\
b2h16(msg->im_msgbufs_recv.im_bufs_mad_hdr->AttributeID)
#define IBDM_IN_IBMFMSG_ATTRMOD(msg)\
b2h32(msg->im_msgbufs_recv.im_bufs_mad_hdr->AttributeModifier)
#define IBDM_IN_IBMFMSG2IOU(msg) (ib_dm_io_unitinfo_t *)\
(msg->im_msgbufs_recv.im_bufs_cl_data)
#define IBDM_IN_IBMFMSG2IOC(msg) (ib_dm_ioc_ctrl_profile_t *)\
(msg->im_msgbufs_recv.im_bufs_cl_data)
#define IBDM_IN_IBMFMSG2SRVENT(msg) (ib_dm_srv_t *)\
(msg->im_msgbufs_recv.im_bufs_cl_data)
#define IBDM_IN_IBMFMSG2DIAGCODE(msg) (uint32_t *)\
(msg->im_msgbufs_recv.im_bufs_cl_data)
#define IBDM_GIDINFO2IOCINFO(gid_info, idx) \
(ibdm_ioc_info_t *)&gid_info->gl_iou->iou_ioc_info[idx];
#define IBDM_IS_IOC_NUM_INVALID(ioc_no, gid_info)\
((ioc_no < 1) || (ioc_no >\
gid_info->gl_iou->iou_info.iou_num_ctrl_slots))
#define IBDM_INVALID_PKEY(pkey) \
(((pkey) == IB_PKEY_INVALID_FULL) || \
((pkey) == IB_PKEY_INVALID_LIMITED))
#ifdef DEBUG
void ibdm_dump_mad_hdr(ib_mad_hdr_t *);
void ibdm_dump_ibmf_msg(ibmf_msg_t *, int);
void ibdm_dump_path_info(sa_path_record_t *);
void ibdm_dump_classportinfo(ib_mad_classportinfo_t *);
void ibdm_dump_iounitinfo(ib_dm_io_unitinfo_t *);
void ibdm_dump_ioc_profile(ib_dm_ioc_ctrl_profile_t *);
void ibdm_dump_service_entries(ib_dm_srv_t *);
void ibdm_dump_sweep_fabric_timestamp(int);
#define ibdm_dump_mad_hdr(a) ibdm_dump_mad_hdr(a)
#define ibdm_dump_ibmf_msg(a, b) ibdm_dump_ibmf_msg(a, b)
#define ibdm_dump_path_info(a) ibdm_dump_path_info(a)
#define ibdm_dump_classportinfo(a) ibdm_dump_classportinfo(a)
#define ibdm_dump_iounitinfo(a) ibdm_dump_iounitinfo(a)
#define ibdm_dump_ioc_profile(a) ibdm_dump_ioc_profile(a)
#define ibdm_dump_service_entries(a) ibdm_dump_service_entries(a)
#else
#define ibdm_dump_mad_hdr(a)
#define ibdm_dump_ibmf_msg(a, b)
#define ibdm_dump_path_info(a)
#define ibdm_dump_classportinfo(a)
#define ibdm_dump_iounitinfo(a)
#define ibdm_dump_ioc_profile(a)
#define ibdm_dump_service_entries(a)
#define ibdm_dump_sweep_fabric_timestamp(a)
#endif
#ifdef __cplusplus
}
#endif
#endif