#ifndef _SYS_IB_IBNEX_IBNEX_H
#define _SYS_IB_IBNEX_IBNEX_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/sunndi.h>
typedef enum {
IBNEX_SUCCESS = 0,
IBNEX_FAILURE = -1,
IBNEX_OFFLINE_FAILED = -2,
IBNEX_BUSY = -3,
IBNEX_INVALID_NODE = -4
} ibnex_rval_t;
#define IBNEX_IOC_GUID_LEN 33
#define IBNEX_PHCI_GUID_LEN 66
typedef struct ibnex_ioc_node_s {
ib_guid_t iou_guid;
ib_guid_t ioc_guid;
char ioc_id_string[IB_DM_IOC_ID_STRING_LEN];
uint32_t ioc_ngids;
ib_dm_ioc_ctrl_profile_t *ioc_profile;
char ioc_guid_str[IBNEX_IOC_GUID_LEN];
char ioc_phci_guid[IBNEX_PHCI_GUID_LEN];
} ibnex_ioc_node_t;
typedef struct ibnex_port_node_s {
uint8_t port_num;
int port_commsvc_idx;
ib_guid_t port_guid;
ib_guid_t port_hcaguid;
ib_pkey_t port_pkey;
dev_info_t *port_pdip;
} ibnex_port_node_t;
typedef struct ibnex_pseudo_node_s {
char *pseudo_node_addr;
char *pseudo_unit_addr;
int pseudo_unit_addr_len;
char *pseudo_devi_name;
int pseudo_merge_node;
} ibnex_pseudo_node_t;
typedef enum {
IBNEX_PORT_COMMSVC_NODE = 0,
IBNEX_VPPA_COMMSVC_NODE = 1,
IBNEX_HCASVC_COMMSVC_NODE = 2,
IBNEX_IOC_NODE = 4,
IBNEX_PSEUDO_NODE = 8
} ibnex_node_type_t;
#define IBNEX_HCA_CHILD_NODE (IBNEX_PORT_COMMSVC_NODE | \
IBNEX_VPPA_COMMSVC_NODE | IBNEX_HCASVC_COMMSVC_NODE)
typedef enum ibnex_node_state_e {
IBNEX_CFGADM_CONFIGURED,
IBNEX_CFGADM_UNCONFIGURED,
IBNEX_CFGADM_CONFIGURING,
IBNEX_CFGADM_UNCONFIGURING
} ibnex_node_state_t;
#define IBNEX_NODE_AP_CONFIGURED 0x0
#define IBNEX_NODE_AP_UNCONFIGURED 0x1
#define IBNEX_NODE_AP_CONFIGURING 0x2
#define IBNEX_NODE_REPROBE_NOTIFY_ON_UPDATE 0x01
#define IBNEX_NODE_REPROBE_NOTIFY_ALWAYS 0x02
#define IBNEX_NODE_REPROBE_IOC_WAIT 0x04
typedef struct ibnex_node_data_s {
dev_info_t *node_dip;
union {
ibnex_ioc_node_t ioc_node;
ibnex_port_node_t port_node;
ibnex_pseudo_node_t pseudo_node;
} node_data;
struct ibnex_node_data_s *node_next;
struct ibnex_node_data_s *node_prev;
ibnex_node_type_t node_type;
ibnex_node_state_t node_state;
int node_reprobe_state;
unsigned int node_ap_state;
} ibnex_node_data_t;
_NOTE(SCHEME_PROTECTS_DATA("stable data", ibnex_ioc_node_s))
_NOTE(SCHEME_PROTECTS_DATA("stable data", ibnex_port_node_s))
_NOTE(SCHEME_PROTECTS_DATA("stable data", ibnex_pseudo_node_s))
_NOTE(SCHEME_PROTECTS_DATA("stable data", ibnex_node_data_s))
#define IBNEX_VALID_NODE_TYPE(n) \
(((n)->node_type == IBNEX_PORT_COMMSVC_NODE) || \
((n)->node_type == IBNEX_VPPA_COMMSVC_NODE) || \
((n)->node_type == IBNEX_HCASVC_COMMSVC_NODE) || \
((n)->node_type == IBNEX_IOC_NODE) || \
((n)->node_type == IBNEX_PSEUDO_NODE))
#define IBNEX_COMMSVC_NODE_TYPE(n) \
(((n)->node_type == IBNEX_PORT_COMMSVC_NODE) || \
((n)->node_type == IBNEX_VPPA_COMMSVC_NODE) || \
((n)->node_type == IBNEX_HCASVC_COMMSVC_NODE))
typedef struct ibnex_s {
dev_info_t *ibnex_dip;
kmutex_t ibnex_mutex;
int ibnex_num_comm_svcs;
char **ibnex_comm_svc_names;
int ibnex_nvppa_comm_svcs;
char **ibnex_vppa_comm_svc_names;
int ibnex_nhcasvc_comm_svcs;
char **ibnex_hcasvc_comm_svc_names;
ibnex_node_data_t *ibnex_port_node_head;
ibnex_node_data_t *ibnex_ioc_node_head;
ibnex_node_data_t *ibnex_pseudo_node_head;
ndi_event_hdl_t ibnex_ndi_event_hdl;
ddi_eventcookie_t ibnex_prop_update_evt_cookie;
int ibnex_reprobe_state;
kcondvar_t ibnex_reprobe_cv;
int ibnex_num_disconnect_iocs;
int ibnex_pseudo_inited;
kcondvar_t ibnex_ioc_list_cv;
uint32_t ibnex_ioc_list_state;
ibdm_ioc_info_t *ibnex_ioc_list;
ddi_taskq_t *ibnex_taskq_id;
} ibnex_t;
#define IBNEX_IOC_LIST_READY 0x0
#define IBNEX_IOC_LIST_RENEW 0x1
#define IBNEX_IOC_LIST_ACCESS 0x2
#define IBNEX_REPROBE_ALL_PROGRESS 0x01
#define IBNEX_REPROBE_ALL_WAIT 0x02
#define IBNEX_REPROBE_IOC_WAIT 0x04
#define IBNEX_MAX_COMPAT_NAMES 6
#define IBNEX_MAX_IBPORT_COMPAT_NAMES 3
#define IBNEX_MAX_COMPAT_LEN 48
#define IBNEX_MAX_COMPAT_PROP_SZ \
IBNEX_MAX_COMPAT_NAMES * IBNEX_MAX_COMPAT_LEN
#define IBNEX_MAX_IBPORT_COMPAT_PROP_SZ \
IBNEX_MAX_IBPORT_COMPAT_NAMES * IBNEX_MAX_COMPAT_LEN
#define IBNEX_DEVFS_ENUMERATE 0x1
#define IBNEX_CFGADM_ENUMERATE 0x2
#define IBNEX_MAX_NODEADDR_SZ 35
#define IBNEX_FORM_GUID(buf, size, guid) \
(void) snprintf((buf), (size), "%llX", (longlong_t)guid);
#define IBNEX_INVALID_PKEY(pkey) \
(((pkey) == IB_PKEY_INVALID_FULL) || \
((pkey) == IB_PKEY_INVALID_LIMITED))
typedef enum {
IB_EVENT_TAG_PROP_UPDATE = 0
} ib_ddi_event_tag_t;
#define IBNEX_DEVTREE_NOT_CHECKED -1
#define IBNEX_HW_NOT_IN_DEVTREE 0
#define IBNEX_HW_IN_DEVTREE 1
#ifdef __cplusplus
}
#endif
#endif