105 nulldev, /* probe */
106 sol_ucma_attach, /* attach */
107 sol_ucma_detach, /* detach */
108 nodev, /* reset */
109 &sol_ucma_cb_ops, /* cb_ops */
110 NULL, /* bus_ops */
111 nodev, /* power */
112 ddi_quiesce_not_needed /* quiesce */
113 };
114
115 /* Module Driver Info */
116 static struct modldrv sol_ucma_modldrv = {
117 &mod_driverops,
118 "Solaris User RDMACM driver",
119 &sol_ucma_dev_ops
120 };
121
122 /* Module Linkage */
123 static struct modlinkage sol_ucma_modlinkage = {
124 MODREV_1,
125 &sol_ucma_modldrv,
126 NULL,
127 };
128
129 static char *sol_ucma_dbg_str = "sol_ucma";
130 sol_ofs_uobj_table_t ucma_file_uo_tbl;
131 sol_ofs_uobj_table_t ucma_ctx_uo_tbl;
132 sol_ofs_uobj_table_t ucma_mcast_uo_tbl;
133
134 /* Function pointers for uverbs functions */
135 static uverbs_get_clnt_hdl_t uverbs_get_hdl_fp = NULL;
136 static uverbs_qpnum2qphdl_t uverbs_qpnum2qphdl_fp = NULL;
137 static uverbs_disable_uqpn_mod_t uverbs_disable_uqpn_modify_fp = NULL;
138 static uverbs_uqpn_cq_ctrl_t uverbs_uqpn_cq_ctrl_fp = NULL;
139 static uverbs_set_qp_free_state_t uverbs_set_qp_free_state_fp = NULL;
140 static uverbs_flush_qp_t uverbs_flush_qp_fp = NULL;
141
142 /* Global Variables */
143 sol_ucma_t sol_ucma;
144
145 /* RDMACM Functions */
146 static int sol_ucma_create_id(dev_t, void *, struct uio *);
621
622 kmem_free(filep->file_pollhead, sizeof (struct pollhead));
623 sol_ofs_uobj_put(&filep->file_uobj);
624 mutex_destroy(&filep->file_mutex);
625 cv_destroy(&filep->file_evt_cv);
626 cv_destroy(&filep->file_evt_close_cv);
627 rw_enter(&(filep->file_uobj.uo_lock), RW_WRITER);
628 (void) sol_ofs_uobj_remove(&ucma_file_uo_tbl, &(filep->file_uobj));
629 rw_exit(&(filep->file_uobj.uo_lock));
630 sol_ofs_uobj_free(&(filep->file_uobj));
631 return (0);
632 }
633
634 typedef struct sol_ucma_cmd_table_s {
635 int (*sol_ucma_cmd_fnc) (dev_t, void *, struct uio *);
636 uint16_t sol_ucma_in_len;
637 uint16_t sol_ucma_out_len;
638 } sol_ucma_cmd_table_t;
639
640 static sol_ucma_cmd_table_t sol_ucma_cmd_table[] = {
641 [RDMA_USER_CM_CMD_CREATE_ID] = sol_ucma_create_id,
642 sizeof (sol_ucma_create_id_t),
643 sizeof (sol_ucma_create_id_resp_t),
644 [RDMA_USER_CM_CMD_DESTROY_ID] = sol_ucma_destroy_id,
645 sizeof (sol_ucma_destroy_id_t),
646 sizeof (sol_ucma_destroy_id_resp_t),
647 [RDMA_USER_CM_CMD_BIND_ADDR] = sol_ucma_bind_addr,
648 sizeof (sol_ucma_bind_addr_t),
649 0,
650 [RDMA_USER_CM_CMD_RESOLVE_ADDR] = sol_ucma_resolve_addr,
651 sizeof (sol_ucma_resolve_addr_t),
652 0,
653 [RDMA_USER_CM_CMD_RESOLVE_ROUTE] = sol_ucma_resolve_route,
654 sizeof (sol_ucma_resolve_route_t),
655 0,
656 [RDMA_USER_CM_CMD_QUERY_ROUTE] = sol_ucma_query_route,
657 sizeof (sol_ucma_query_route_t),
658 sizeof (sol_ucma_query_route_resp_t),
659 [RDMA_USER_CM_CMD_CONNECT] = sol_ucma_connect,
660 sizeof (sol_ucma_connect_t),
661 0,
662 [RDMA_USER_CM_CMD_LISTEN] = sol_ucma_listen,
663 sizeof (sol_ucma_listen_t),
664 0,
665 [RDMA_USER_CM_CMD_ACCEPT] = sol_ucma_accept,
666 sizeof (sol_ucma_accept_t),
667 0,
668 [RDMA_USER_CM_CMD_REJECT] = sol_ucma_reject,
669 sizeof (sol_ucma_reject_t),
670 0,
671 [RDMA_USER_CM_CMD_DISCONNECT] = sol_ucma_disconnect,
672 sizeof (sol_ucma_disconnect_t),
673 0,
674 [RDMA_USER_CM_CMD_INIT_QP_ATTR] = sol_ucma_init_qp_attr,
675 sizeof (sol_ucma_init_qp_attr_t),
676 sizeof (struct ib_uverbs_qp_attr),
677 [RDMA_USER_CM_CMD_GET_EVENT] = sol_ucma_get_event,
678 sizeof (sol_ucma_get_event_t),
679 sizeof (sol_ucma_event_resp_t),
680 [RDMA_USER_CM_CMD_GET_OPTION] = NULL,
681 0,
682 0,
683 [RDMA_USER_CM_CMD_SET_OPTION] = sol_ucma_set_option,
684 sizeof (sol_ucma_set_option_t),
685 0,
686 [RDMA_USER_CM_CMD_NOTIFY] = sol_ucma_notify,
687 sizeof (sol_ucma_notify_t),
688 0,
689 [RDMA_USER_CM_CMD_JOIN_MCAST] = sol_ucma_join_mcast,
690 sizeof (sol_ucma_join_mcast_t),
691 sizeof (sol_ucma_create_id_resp_t),
692 [RDMA_USER_CM_CMD_LEAVE_MCAST] = sol_ucma_leave_mcast,
693 sizeof (sol_ucma_destroy_id_t),
694 sizeof (sol_ucma_destroy_id_resp_t)
695 };
696
697 #define SOL_UCMA_MAX_CMD_DATA 512
698 static int
699 sol_ucma_write(dev_t dev, struct uio *uio, cred_t *credp)
700 {
701 sol_ucma_cmd_hdr_t *user_hdrp;
702 int ret;
703 void *data_buf = NULL;
704 char uio_data[SOL_UCMA_MAX_CMD_DATA];
705 size_t uio_data_len = uio->uio_resid;
706
707 SOL_OFS_DPRINTF_L5(sol_ucma_dbg_str, "write(%x, %p, %p)",
708 dev, uio, credp);
709
710 ret = uiomove((caddr_t)&uio_data, uio_data_len, UIO_WRITE, uio);
711 user_hdrp = (sol_ucma_cmd_hdr_t *)uio_data;
712
713 if (ret != 0) {
714 SOL_OFS_DPRINTF_L2(sol_ucma_dbg_str, "write: uiomove failed");
|
105 nulldev, /* probe */
106 sol_ucma_attach, /* attach */
107 sol_ucma_detach, /* detach */
108 nodev, /* reset */
109 &sol_ucma_cb_ops, /* cb_ops */
110 NULL, /* bus_ops */
111 nodev, /* power */
112 ddi_quiesce_not_needed /* quiesce */
113 };
114
115 /* Module Driver Info */
116 static struct modldrv sol_ucma_modldrv = {
117 &mod_driverops,
118 "Solaris User RDMACM driver",
119 &sol_ucma_dev_ops
120 };
121
122 /* Module Linkage */
123 static struct modlinkage sol_ucma_modlinkage = {
124 MODREV_1,
125 { &sol_ucma_modldrv, NULL }
126 };
127
128 static char *sol_ucma_dbg_str = "sol_ucma";
129 sol_ofs_uobj_table_t ucma_file_uo_tbl;
130 sol_ofs_uobj_table_t ucma_ctx_uo_tbl;
131 sol_ofs_uobj_table_t ucma_mcast_uo_tbl;
132
133 /* Function pointers for uverbs functions */
134 static uverbs_get_clnt_hdl_t uverbs_get_hdl_fp = NULL;
135 static uverbs_qpnum2qphdl_t uverbs_qpnum2qphdl_fp = NULL;
136 static uverbs_disable_uqpn_mod_t uverbs_disable_uqpn_modify_fp = NULL;
137 static uverbs_uqpn_cq_ctrl_t uverbs_uqpn_cq_ctrl_fp = NULL;
138 static uverbs_set_qp_free_state_t uverbs_set_qp_free_state_fp = NULL;
139 static uverbs_flush_qp_t uverbs_flush_qp_fp = NULL;
140
141 /* Global Variables */
142 sol_ucma_t sol_ucma;
143
144 /* RDMACM Functions */
145 static int sol_ucma_create_id(dev_t, void *, struct uio *);
620
621 kmem_free(filep->file_pollhead, sizeof (struct pollhead));
622 sol_ofs_uobj_put(&filep->file_uobj);
623 mutex_destroy(&filep->file_mutex);
624 cv_destroy(&filep->file_evt_cv);
625 cv_destroy(&filep->file_evt_close_cv);
626 rw_enter(&(filep->file_uobj.uo_lock), RW_WRITER);
627 (void) sol_ofs_uobj_remove(&ucma_file_uo_tbl, &(filep->file_uobj));
628 rw_exit(&(filep->file_uobj.uo_lock));
629 sol_ofs_uobj_free(&(filep->file_uobj));
630 return (0);
631 }
632
633 typedef struct sol_ucma_cmd_table_s {
634 int (*sol_ucma_cmd_fnc) (dev_t, void *, struct uio *);
635 uint16_t sol_ucma_in_len;
636 uint16_t sol_ucma_out_len;
637 } sol_ucma_cmd_table_t;
638
639 static sol_ucma_cmd_table_t sol_ucma_cmd_table[] = {
640 [RDMA_USER_CM_CMD_CREATE_ID] = { sol_ucma_create_id,
641 sizeof (sol_ucma_create_id_t),
642 sizeof (sol_ucma_create_id_resp_t) },
643 [RDMA_USER_CM_CMD_DESTROY_ID] = { sol_ucma_destroy_id,
644 sizeof (sol_ucma_destroy_id_t),
645 sizeof (sol_ucma_destroy_id_resp_t) },
646 [RDMA_USER_CM_CMD_BIND_ADDR] = { sol_ucma_bind_addr,
647 sizeof (sol_ucma_bind_addr_t),
648 0 },
649 [RDMA_USER_CM_CMD_RESOLVE_ADDR] = { sol_ucma_resolve_addr,
650 sizeof (sol_ucma_resolve_addr_t),
651 0 },
652 [RDMA_USER_CM_CMD_RESOLVE_ROUTE] = { sol_ucma_resolve_route,
653 sizeof (sol_ucma_resolve_route_t),
654 0 },
655 [RDMA_USER_CM_CMD_QUERY_ROUTE] = { sol_ucma_query_route,
656 sizeof (sol_ucma_query_route_t),
657 sizeof (sol_ucma_query_route_resp_t) },
658 [RDMA_USER_CM_CMD_CONNECT] = { sol_ucma_connect,
659 sizeof (sol_ucma_connect_t),
660 0 },
661 [RDMA_USER_CM_CMD_LISTEN] = { sol_ucma_listen,
662 sizeof (sol_ucma_listen_t),
663 0 },
664 [RDMA_USER_CM_CMD_ACCEPT] = { sol_ucma_accept,
665 sizeof (sol_ucma_accept_t),
666 0 },
667 [RDMA_USER_CM_CMD_REJECT] = { sol_ucma_reject,
668 sizeof (sol_ucma_reject_t),
669 0 },
670 [RDMA_USER_CM_CMD_DISCONNECT] = { sol_ucma_disconnect,
671 sizeof (sol_ucma_disconnect_t),
672 0 },
673 [RDMA_USER_CM_CMD_INIT_QP_ATTR] = { sol_ucma_init_qp_attr,
674 sizeof (sol_ucma_init_qp_attr_t),
675 sizeof (struct ib_uverbs_qp_attr) },
676 [RDMA_USER_CM_CMD_GET_EVENT] = { sol_ucma_get_event,
677 sizeof (sol_ucma_get_event_t),
678 sizeof (sol_ucma_event_resp_t) },
679 [RDMA_USER_CM_CMD_GET_OPTION] = { NULL,
680 0,
681 0 },
682 [RDMA_USER_CM_CMD_SET_OPTION] = { sol_ucma_set_option,
683 sizeof (sol_ucma_set_option_t),
684 0 },
685 [RDMA_USER_CM_CMD_NOTIFY] = { sol_ucma_notify,
686 sizeof (sol_ucma_notify_t),
687 0 },
688 [RDMA_USER_CM_CMD_JOIN_MCAST] = { sol_ucma_join_mcast,
689 sizeof (sol_ucma_join_mcast_t),
690 sizeof (sol_ucma_create_id_resp_t) },
691 [RDMA_USER_CM_CMD_LEAVE_MCAST] = { sol_ucma_leave_mcast,
692 sizeof (sol_ucma_destroy_id_t),
693 sizeof (sol_ucma_destroy_id_resp_t) }
694 };
695
696 #define SOL_UCMA_MAX_CMD_DATA 512
697 static int
698 sol_ucma_write(dev_t dev, struct uio *uio, cred_t *credp)
699 {
700 sol_ucma_cmd_hdr_t *user_hdrp;
701 int ret;
702 void *data_buf = NULL;
703 char uio_data[SOL_UCMA_MAX_CMD_DATA];
704 size_t uio_data_len = uio->uio_resid;
705
706 SOL_OFS_DPRINTF_L5(sol_ucma_dbg_str, "write(%x, %p, %p)",
707 dev, uio, credp);
708
709 ret = uiomove((caddr_t)&uio_data, uio_data_len, UIO_WRITE, uio);
710 user_hdrp = (sol_ucma_cmd_hdr_t *)uio_data;
711
712 if (ret != 0) {
713 SOL_OFS_DPRINTF_L2(sol_ucma_dbg_str, "write: uiomove failed");
|