#ifndef _ISER_IB_H
#define _ISER_IB_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/ib/ibtl/ibti.h>
#include <sys/iscsi_protocol.h>
struct iser_state_s;
extern struct iser_state_s *iser_state;
extern ddi_taskq_t *iser_taskq;
typedef struct iser_hca_s {
list_node_t hca_node;
boolean_t hca_failed;
ibt_clnt_hdl_t hca_clnt_hdl;
ibt_hca_hdl_t hca_hdl;
ibt_hca_attr_t hca_attr;
ibt_pd_hdl_t hca_pdhdl;
ib_guid_t hca_guid;
uint_t hca_num_ports;
ibt_hca_portinfo_t *hca_port_info;
uint_t hca_port_info_sz;
struct iser_vmem_mr_pool_s *hca_msg_pool;
kmem_cache_t *iser_msg_cache;
struct iser_vmem_mr_pool_s *hca_buf_pool;
kmem_cache_t *iser_buf_cache;
} iser_hca_t;
#define ISER_IB_RQ_LWM_PCT 80
#define ISER_IB_RQ_POST_MAX 64
#define ISER_IB_SCQ_POLL_MAX 8
#ifdef _LP64
#define ISER_IB_RECVQ_SIZE 400
#else
#define ISER_IB_RECVQ_SIZE 100
#endif
#define ISER_IB_SENDQ_SIZE 2000
#define ISER_IB_SGLIST_SIZE 1
#define ISER_IB_DEFAULT_IRD 2
#define ISER_IB_DEFAULT_ORD 4
typedef struct iser_qp_s {
kmutex_t qp_lock;
uint_t sq_size;
uint_t rq_size;
uint32_t rq_depth;
uint32_t rq_level;
uint32_t rq_min_post_level;
uint32_t rq_lwm;
boolean_t rq_taskqpending;
} iser_qp_t;
typedef struct iser_chan_s {
kmutex_t ic_chan_lock;
ibt_channel_hdl_t ic_chanhdl;
ibt_ip_addr_t ic_localip;
ibt_ip_addr_t ic_remoteip;
in_port_t ic_lport;
in_port_t ic_rport;
ibt_path_info_t ic_ibt_path;
iser_hca_t *ic_hca;
ibt_cq_hdl_t ic_sendcq;
ibt_cq_hdl_t ic_recvcq;
uint_t ic_sendcq_sz;
uint_t ic_recvcq_sz;
iser_qp_t ic_qp;
kmutex_t ic_sq_post_lock;
uint_t ic_sq_post_count;
uint_t ic_sq_max_post_count;
struct iser_conn_s *ic_conn;
} iser_chan_t;
int iser_ib_init(void);
int iser_ib_fini(void);
int iser_ib_register_service(idm_svc_t *idm_svc);
int iser_ib_bind_service(idm_svc_t *idm_svc);
void iser_ib_unbind_service(idm_svc_t *idm_svc);
void iser_ib_deregister_service(idm_svc_t *idm_svc);
void iser_ib_conv_sockaddr2ibtaddr(idm_sockaddr_t *saddr,
ibt_ip_addr_t *ibt_addr);
void iser_ib_conv_ibtaddr2sockaddr(struct sockaddr_storage *ss,
ibt_ip_addr_t *ibt_addr, in_port_t port);
int iser_ib_get_paths(
ibt_ip_addr_t *local_ip, ibt_ip_addr_t *remote_ip, ibt_path_info_t *path,
ibt_path_ip_src_t *path_src_ip);
iser_chan_t *iser_ib_alloc_channel_pathlookup(
ibt_ip_addr_t *local_ip, ibt_ip_addr_t *remote_ip);
iser_chan_t *iser_ib_alloc_channel_nopathlookup(
ib_guid_t hca_guid, uint8_t hca_port);
iser_chan_t *iser_ib_alloc_rc_channel(iser_hca_t *hca, uint8_t hca_port);
int iser_ib_open_rc_channel(iser_chan_t *chan);
void iser_ib_close_rc_channel(iser_chan_t *chan);
void iser_ib_free_rc_channel(iser_chan_t *chan);
int iser_ib_post_recv_async(ibt_channel_hdl_t chanhdl);
void iser_ib_post_recv(ibt_channel_hdl_t chanhdl);
void iser_ib_recvcq_handler(ibt_cq_hdl_t cq_hdl, void *arg);
void iser_ib_sendcq_handler(ibt_cq_hdl_t cq_hdl, void *arg);
void iser_ib_async_handler(void *clntp, ibt_hca_hdl_t hdl,
ibt_async_code_t code, ibt_async_event_t *event);
#ifdef __cplusplus
}
#endif
#endif