aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/qlnx
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2021-06-16 13:02:00 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2021-07-28 11:28:29 +0000
commitb633e08c705fe43180567eae26923d6f6f98c8d9 (patch)
tree93ab9ef5927af0b117fa672984d57e8bc4f6ce00 /sys/dev/qlnx
parent273728b1257fa4f6c945bca592227e29763fc4a7 (diff)
Diffstat (limited to 'sys/dev/qlnx')
-rw-r--r--sys/dev/qlnx/qlnxr/qlnxr_def.h1
-rw-r--r--sys/dev/qlnx/qlnxr/qlnxr_os.c7
-rw-r--r--sys/dev/qlnx/qlnxr/qlnxr_verbs.c243
-rw-r--r--sys/dev/qlnx/qlnxr/qlnxr_verbs.h62
4 files changed, 107 insertions, 206 deletions
diff --git a/sys/dev/qlnx/qlnxr/qlnxr_def.h b/sys/dev/qlnx/qlnxr/qlnxr_def.h
index 9bc663e2a8d0..2b9b378a1468 100644
--- a/sys/dev/qlnx/qlnxr/qlnxr_def.h
+++ b/sys/dev/qlnx/qlnxr/qlnxr_def.h
@@ -65,6 +65,7 @@
#include <rdma/ib_umem.h>
#include <rdma/ib_mad.h>
#include <rdma/ib_sa.h>
+#include <rdma/uverbs_ioctl.h>
#if __FreeBSD_version < 1100000
#undef MODULE_VERSION
diff --git a/sys/dev/qlnx/qlnxr/qlnxr_os.c b/sys/dev/qlnx/qlnxr/qlnxr_os.c
index 62c0f2091d2f..6190a69e413f 100644
--- a/sys/dev/qlnx/qlnxr/qlnxr_os.c
+++ b/sys/dev/qlnx/qlnxr/qlnxr_os.c
@@ -156,6 +156,13 @@ qlnxr_register_device(qlnxr_dev_t *dev)
ibdev = &dev->ibdev;
+#define qlnxr_ib_ah qlnxr_ah
+#define qlnxr_ib_cq qlnxr_cq
+#define qlnxr_ib_pd qlnxr_pd
+#define qlnxr_ib_qp qlnxr_qp
+#define qlnxr_ib_srq qlnxr_srq
+#define qlnxr_ib_ucontext qlnxr_ucontext
+ INIT_IB_DEVICE_OPS(&ibdev->ops, qlnxr, QLNXR);
strlcpy(ibdev->name, "qlnxr%d", IB_DEVICE_NAME_MAX);
memset(&ibdev->node_guid, 0, sizeof(ibdev->node_guid));
diff --git a/sys/dev/qlnx/qlnxr/qlnxr_verbs.c b/sys/dev/qlnx/qlnxr/qlnxr_verbs.c
index c078df0365f9..d39f1946c641 100644
--- a/sys/dev/qlnx/qlnxr/qlnxr_verbs.c
+++ b/sys/dev/qlnx/qlnxr/qlnxr_verbs.c
@@ -71,8 +71,7 @@ __FBSDID("$FreeBSD$");
((unsigned char *)&addr)[3]
static int
-qlnxr_check_srq_params(struct ib_pd *ibpd,
- struct qlnxr_dev *dev,
+qlnxr_check_srq_params(struct qlnxr_dev *dev,
struct ib_srq_init_attr *attrs);
static int
@@ -159,9 +158,10 @@ qlnxr_query_gid(struct ib_device *ibdev, u8 port, int index,
return 0;
}
-struct ib_srq *
-qlnxr_create_srq(struct ib_pd *ibpd, struct ib_srq_init_attr *init_attr,
- struct ib_udata *udata)
+int
+qlnxr_create_srq(struct ib_srq *ibsrq,
+ struct ib_srq_init_attr *init_attr,
+ struct ib_udata *udata)
{
struct qlnxr_dev *dev;
qlnx_host_t *ha;
@@ -169,36 +169,28 @@ qlnxr_create_srq(struct ib_pd *ibpd, struct ib_srq_init_attr *init_attr,
struct ecore_rdma_create_srq_out_params out_params;
struct ecore_rdma_create_srq_in_params in_params;
u64 pbl_base_addr, phy_prod_pair_addr;
- struct qlnxr_pd *pd = get_qlnxr_pd(ibpd);
- struct ib_ucontext *ib_ctx = NULL;
struct qlnxr_srq_hwq_info *hw_srq;
- struct qlnxr_ucontext *ctx = NULL;
+ struct qlnxr_ucontext *ctx;
struct qlnxr_create_srq_ureq ureq;
u32 page_cnt, page_size;
- struct qlnxr_srq *srq;
+ struct qlnxr_srq *srq = get_qlnxr_srq(ibsrq);
int ret = 0;
- dev = get_qlnxr_dev((ibpd->device));
+ dev = get_qlnxr_dev(ibsrq->device);
ha = dev->ha;
QL_DPRINT12(ha, "enter\n");
- ret = qlnxr_check_srq_params(ibpd, dev, init_attr);
-
- srq = kzalloc(sizeof(*srq), GFP_KERNEL);
- if (!srq) {
- QL_DPRINT11(ha, "cannot allocate memory for srq\n");
- return NULL; //@@@ : TODO what to return here?
- }
+ ret = qlnxr_check_srq_params(dev, init_attr);
srq->dev = dev;
hw_srq = &srq->hw_srq;
spin_lock_init(&srq->lock);
memset(&in_params, 0, sizeof(in_params));
- if (udata && ibpd->uobject && ibpd->uobject->context) {
- ib_ctx = ibpd->uobject->context;
- ctx = get_qlnxr_ucontext(ib_ctx);
+ if (udata) {
+ ctx = rdma_udata_to_drv_context(
+ udata, struct qlnxr_ucontext, ibucontext);
memset(&ureq, 0, sizeof(ureq));
if (ib_copy_from_udata(&ureq, udata, min(sizeof(ureq),
@@ -208,7 +200,7 @@ qlnxr_create_srq(struct ib_pd *ibpd, struct ib_srq_init_attr *init_attr,
goto err0;
}
- ret = qlnxr_init_srq_user_params(ib_ctx, srq, &ureq, 0, 0);
+ ret = qlnxr_init_srq_user_params(&ctx->ibucontext, srq, &ureq, 0, 0);
if (ret)
goto err0;
@@ -232,7 +224,7 @@ qlnxr_create_srq(struct ib_pd *ibpd, struct ib_srq_init_attr *init_attr,
page_size = pbl->elem_per_page << 4;
}
- in_params.pd_id = pd->pd_id;
+ in_params.pd_id = get_qlnxr_pd(ibsrq->pd)->pd_id;
in_params.pbl_base_addr = pbl_base_addr;
in_params.prod_pair_addr = phy_prod_pair_addr;
in_params.num_pages = page_cnt;
@@ -251,7 +243,7 @@ qlnxr_create_srq(struct ib_pd *ibpd, struct ib_srq_init_attr *init_attr,
}
QL_DPRINT12(ha, "created srq with srq_id = 0x%0x\n", srq->srq_id);
- return &srq->ibsrq;
+ return (0);
err2:
memset(&in_params, 0, sizeof(in_params));
destroy_in_params.srq_id = srq->srq_id;
@@ -264,12 +256,11 @@ err1:
qlnxr_free_srq_kernel_params(srq);
err0:
- kfree(srq);
- return ERR_PTR(-EFAULT);
+ return (-EFAULT);
}
-int
-qlnxr_destroy_srq(struct ib_srq *ibsrq)
+void
+qlnxr_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
{
struct qlnxr_dev *dev;
struct qlnxr_srq *srq;
@@ -291,8 +282,6 @@ qlnxr_destroy_srq(struct ib_srq *ibsrq)
qlnxr_free_srq_kernel_params(srq);
QL_DPRINT12(ha, "destroyed srq_id=0x%0x\n", srq->srq_id);
- kfree(srq);
- return 0;
}
int
@@ -718,11 +707,11 @@ qlnxr_link_layer(struct ib_device *ibdev, uint8_t port_num)
return IB_LINK_LAYER_ETHERNET;
}
-struct ib_pd *
-qlnxr_alloc_pd(struct ib_device *ibdev, struct ib_ucontext *context,
- struct ib_udata *udata)
+int
+qlnxr_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
{
- struct qlnxr_pd *pd = NULL;
+ struct ib_device *ibdev = ibpd->device;
+ struct qlnxr_pd *pd = get_qlnxr_pd(ibpd);
u16 pd_id;
int rc;
struct qlnxr_dev *dev;
@@ -731,8 +720,7 @@ qlnxr_alloc_pd(struct ib_device *ibdev, struct ib_ucontext *context,
dev = get_qlnxr_dev(ibdev);
ha = dev->ha;
- QL_DPRINT12(ha, "ibdev = %p context = %p"
- " udata = %p enter\n", ibdev, context, udata);
+ QL_DPRINT12(ha, "ibdev = %p udata = %p enter\n", ibdev, udata);
if (dev->rdma_ctx == NULL) {
QL_DPRINT11(ha, "dev->rdma_ctx = NULL\n");
@@ -740,13 +728,6 @@ qlnxr_alloc_pd(struct ib_device *ibdev, struct ib_ucontext *context,
goto err;
}
- pd = kzalloc(sizeof(*pd), GFP_KERNEL);
- if (!pd) {
- rc = -ENOMEM;
- QL_DPRINT11(ha, "kzalloc(pd) = NULL\n");
- goto err;
- }
-
rc = ecore_rdma_alloc_pd(dev->rdma_ctx, &pd_id);
if (rc) {
QL_DPRINT11(ha, "ecore_rdma_alloc_pd failed\n");
@@ -755,7 +736,7 @@ qlnxr_alloc_pd(struct ib_device *ibdev, struct ib_ucontext *context,
pd->pd_id = pd_id;
- if (udata && context) {
+ if (udata) {
rc = ib_copy_to_udata(udata, &pd->pd_id, sizeof(pd->pd_id));
if (rc) {
QL_DPRINT11(ha, "ib_copy_to_udata failed\n");
@@ -763,7 +744,8 @@ qlnxr_alloc_pd(struct ib_device *ibdev, struct ib_ucontext *context,
goto err;
}
- pd->uctx = get_qlnxr_ucontext(context);
+ pd->uctx = rdma_udata_to_drv_context(
+ udata, struct qlnxr_ucontext, ibucontext);
pd->uctx->pd = pd;
}
@@ -771,16 +753,15 @@ qlnxr_alloc_pd(struct ib_device *ibdev, struct ib_ucontext *context,
QL_DPRINT12(ha, "exit [pd, pd_id, pd_count] = [%p, 0x%x, %d]\n",
pd, pd_id, dev->pd_count);
- return &pd->ibpd;
+ return (0);
err:
- kfree(pd);
QL_DPRINT12(ha, "exit -1\n");
- return ERR_PTR(rc);
+ return (rc);
}
-int
-qlnxr_dealloc_pd(struct ib_pd *ibpd)
+void
+qlnxr_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
{
struct qlnxr_pd *pd;
struct qlnxr_dev *dev;
@@ -796,14 +777,12 @@ qlnxr_dealloc_pd(struct ib_pd *ibpd)
QL_DPRINT11(ha, "pd = NULL\n");
} else {
ecore_rdma_free_pd(dev->rdma_ctx, pd->pd_id);
- kfree(pd);
atomic_subtract_rel_32(&dev->pd_count, 1);
QL_DPRINT12(ha, "exit [pd, pd_id, pd_count] = [%p, 0x%x, %d]\n",
pd, pd->pd_id, dev->pd_count);
}
QL_DPRINT12(ha, "exit\n");
- return 0;
}
#define ROCE_WQE_ELEM_SIZE sizeof(struct rdma_sq_sge)
@@ -977,24 +956,18 @@ qlnxr_search_mmap(struct qlnxr_ucontext *uctx, u64 phy_addr, unsigned long len)
return found;
}
-struct
-ib_ucontext *qlnxr_alloc_ucontext(struct ib_device *ibdev,
- struct ib_udata *udata)
+int
+qlnxr_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata)
{
int rc;
- struct qlnxr_ucontext *ctx;
+ struct qlnxr_ucontext *ctx = get_qlnxr_ucontext(uctx);
struct qlnxr_alloc_ucontext_resp uresp;
- struct qlnxr_dev *dev = get_qlnxr_dev(ibdev);
+ struct qlnxr_dev *dev = get_qlnxr_dev(uctx->device);
qlnx_host_t *ha = dev->ha;
struct ecore_rdma_add_user_out_params oparams;
- if (!udata) {
- return ERR_PTR(-EFAULT);
- }
-
- ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
- if (!ctx)
- return ERR_PTR(-ENOMEM);
+ if (!udata)
+ return -EFAULT;
rc = ecore_rdma_add_user(dev->rdma_ctx, &oparams);
if (rc) {
@@ -1044,20 +1017,18 @@ ib_ucontext *qlnxr_alloc_ucontext(struct ib_device *ibdev,
QL_DPRINT12(ha, "Allocated user context %p\n",
&ctx->ibucontext);
- return &ctx->ibucontext;
+ return (0);
err:
- kfree(ctx);
- return ERR_PTR(rc);
+ return (rc);
}
-int
+void
qlnxr_dealloc_ucontext(struct ib_ucontext *ibctx)
{
struct qlnxr_ucontext *uctx = get_qlnxr_ucontext(ibctx);
struct qlnxr_dev *dev = uctx->dev;
qlnx_host_t *ha = dev->ha;
struct qlnxr_mm *mm, *tmp;
- int status = 0;
QL_DPRINT12(ha, "Deallocating user context %p\n",
uctx);
@@ -1073,8 +1044,6 @@ qlnxr_dealloc_ucontext(struct ib_ucontext *ibctx)
list_del(&mm->entry);
kfree(mm);
}
- kfree(uctx);
- return status;
}
int
@@ -1662,7 +1631,7 @@ err0:
}
int
-qlnxr_dereg_mr(struct ib_mr *ib_mr)
+qlnxr_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
{
struct qlnxr_mr *mr = get_qlnxr_mr(ib_mr);
struct qlnxr_dev *dev = get_qlnxr_dev((ib_mr->device));
@@ -1822,35 +1791,10 @@ err:
return rc;
}
-#if __FreeBSD_version >= 1102000
-
-struct ib_cq *
-qlnxr_create_cq(struct ib_device *ibdev,
- const struct ib_cq_init_attr *attr,
- struct ib_ucontext *ib_ctx,
- struct ib_udata *udata)
-
-#else
-
-#if __FreeBSD_version >= 1100000
-
-struct ib_cq *
-qlnxr_create_cq(struct ib_device *ibdev,
- struct ib_cq_init_attr *attr,
- struct ib_ucontext *ib_ctx,
- struct ib_udata *udata)
-
-#else
-
-struct ib_cq *
-qlnxr_create_cq(struct ib_device *ibdev,
- int entries,
- int vector,
- struct ib_ucontext *ib_ctx,
- struct ib_udata *udata)
-#endif /* #if __FreeBSD_version >= 1100000 */
-
-#endif /* #if __FreeBSD_version >= 1102000 */
+int
+qlnxr_create_cq(struct ib_cq *ibcq,
+ const struct ib_cq_init_attr *attr,
+ struct ib_udata *udata)
{
struct qlnxr_ucontext *ctx;
struct ecore_rdma_destroy_cq_out_params destroy_oparams;
@@ -1863,13 +1807,13 @@ qlnxr_create_cq(struct ib_device *ibdev,
int vector = attr->comp_vector;
int entries = attr->cqe;
#endif
- struct qlnxr_cq *cq;
+ struct qlnxr_cq *cq = get_qlnxr_cq(ibcq);
int chain_entries, rc, page_cnt;
u64 pbl_ptr;
u16 icid;
qlnx_host_t *ha;
- dev = get_qlnxr_dev(ibdev);
+ dev = get_qlnxr_dev(ibcq->device);
ha = dev->ha;
QL_DPRINT12(ha, "called from %s. entries = %d, "
@@ -1885,17 +1829,15 @@ qlnxr_create_cq(struct ib_device *ibdev,
"the number of entries %d is too high. "
"Must be equal or below %d.\n",
entries, QLNXR_MAX_CQES);
- return ERR_PTR(-EINVAL);
+ return -EINVAL;
}
chain_entries = qlnxr_align_cq_entries(entries);
chain_entries = min_t(int, chain_entries, QLNXR_MAX_CQES);
- cq = qlnx_zalloc((sizeof(struct qlnxr_cq)));
-
- if (!cq)
- return ERR_PTR(-ENOMEM);
-
if (udata) {
+ ctx = rdma_udata_to_drv_context(
+ udata, struct qlnxr_ucontext, ibucontext);
+
memset(&ureq, 0, sizeof(ureq));
if (ib_copy_from_udata(&ureq, udata,
@@ -1911,13 +1853,15 @@ qlnxr_create_cq(struct ib_device *ibdev,
cq->cq_type = QLNXR_CQ_TYPE_USER;
- qlnxr_init_user_queue(ib_ctx, dev, &cq->q, ureq.addr, ureq.len,
+ qlnxr_init_user_queue(&ctx->ibucontext, dev, &cq->q, ureq.addr, ureq.len,
IB_ACCESS_LOCAL_WRITE, 1, 1);
pbl_ptr = cq->q.pbl_tbl->pa;
page_cnt = cq->q.pbl_info.num_pbes;
cq->ibcq.cqe = chain_entries;
} else {
+ ctx = NULL;
+
cq->cq_type = QLNXR_CQ_TYPE_KERNEL;
rc = ecore_chain_alloc(&dev->ha->cdev,
@@ -1944,8 +1888,7 @@ qlnxr_create_cq(struct ib_device *ibdev,
params.pbl_ptr = pbl_ptr;
params.pbl_two_level = 0;
- if (ib_ctx != NULL) {
- ctx = get_qlnxr_ucontext(ib_ctx);
+ if (udata) {
params.dpi = ctx->dpi;
} else {
params.dpi = dev->dpi;
@@ -1959,7 +1902,7 @@ qlnxr_create_cq(struct ib_device *ibdev,
cq->sig = QLNXR_CQ_MAGIC_NUMBER;
spin_lock_init(&cq->cq_lock);
- if (ib_ctx) {
+ if (udata) {
rc = qlnxr_copy_cq_uresp(dev, cq, udata);
if (rc)
goto err3;
@@ -1990,7 +1933,7 @@ qlnxr_create_cq(struct ib_device *ibdev,
" number of entries = 0x%x\n",
cq->icid, cq, params.cq_size);
QL_DPRINT12(ha,"cq_addr = %p\n", cq);
- return &cq->ibcq;
+ return (0);
err3:
destroy_iparams.icid = cq->icid;
@@ -2004,11 +1947,9 @@ err1:
if (udata)
ib_umem_release(cq->q.umem);
err0:
- kfree(cq);
-
QL_DPRINT12(ha, "exit error\n");
- return ERR_PTR(-EINVAL);
+ return (-EINVAL);
}
int qlnxr_resize_cq(struct ib_cq *ibcq, int new_cnt, struct ib_udata *udata)
@@ -2024,8 +1965,8 @@ int qlnxr_resize_cq(struct ib_cq *ibcq, int new_cnt, struct ib_udata *udata)
return status;
}
-int
-qlnxr_destroy_cq(struct ib_cq *ibcq)
+void
+qlnxr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
{
struct qlnxr_dev *dev = get_qlnxr_dev((ibcq->device));
struct ecore_rdma_destroy_cq_out_params oparams;
@@ -2055,25 +1996,21 @@ qlnxr_destroy_cq(struct ib_cq *ibcq)
if (rc) {
QL_DPRINT12(ha, "ecore_rdma_destroy_cq failed cq_id = %d\n",
cq->icid);
- return rc;
+ return;
}
QL_DPRINT12(ha, "free cq->pbl cq_id = %d\n", cq->icid);
ecore_chain_free(&dev->ha->cdev, &cq->pbl);
}
- if (ibcq->uobject && ibcq->uobject->context) {
+ if (udata) {
qlnxr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
ib_umem_release(cq->q.umem);
}
cq->sig = ~cq->sig;
- kfree(cq);
-
QL_DPRINT12(ha, "exit cq_id = %d\n", cq->icid);
-
- return rc;
}
static int
@@ -2393,8 +2330,7 @@ qlnxr_set_common_qp_params(struct qlnxr_dev *dev,
}
static int
-qlnxr_check_srq_params(struct ib_pd *ibpd,
- struct qlnxr_dev *dev,
+qlnxr_check_srq_params(struct qlnxr_dev *dev,
struct ib_srq_init_attr *attrs)
{
struct ecore_rdma_device *qattr;
@@ -3281,8 +3217,6 @@ qlnxr_create_qp(struct ib_pd *ibpd,
return &qp->ibqp;
err:
- kfree(qp);
-
QL_DPRINT12(ha, "failed exit\n");
return ERR_PTR(-EFAULT);
}
@@ -3987,9 +3921,9 @@ qlnxr_cleanup_kernel(struct qlnxr_dev *dev, struct qlnxr_qp *qp)
return;
}
-int
+static int
qlnxr_free_qp_resources(struct qlnxr_dev *dev,
- struct qlnxr_qp *qp)
+ struct qlnxr_qp *qp, struct ib_udata *udata)
{
int rc = 0;
qlnx_host_t *ha;
@@ -4007,13 +3941,13 @@ qlnxr_free_qp_resources(struct qlnxr_dev *dev,
return rc;
}
- if (qp->ibqp.uobject && qp->ibqp.uobject->context)
+ if (udata)
qlnxr_cleanup_user(dev, qp);
else
qlnxr_cleanup_kernel(dev, qp);
#endif
- if (qp->ibqp.uobject && qp->ibqp.uobject->context)
+ if (udata)
qlnxr_cleanup_user(dev, qp);
else
qlnxr_cleanup_kernel(dev, qp);
@@ -4030,7 +3964,7 @@ qlnxr_free_qp_resources(struct qlnxr_dev *dev,
}
int
-qlnxr_destroy_qp(struct ib_qp *ibqp)
+qlnxr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
{
struct qlnxr_qp *qp = get_qlnxr_qp(ibqp);
struct qlnxr_dev *dev = qp->dev;
@@ -4060,12 +3994,11 @@ qlnxr_destroy_qp(struct ib_qp *ibqp)
qp->sig = ~qp->sig;
- qlnxr_free_qp_resources(dev, qp);
+ qlnxr_free_qp_resources(dev, qp, udata);
if (atomic_dec_and_test(&qp->refcnt)) {
/* TODO: only for iWARP? */
qlnxr_idr_remove(dev, qp->qp_id);
- kfree(qp);
}
QL_DPRINT12(ha, "exit\n");
@@ -5837,7 +5770,8 @@ err0:
#if __FreeBSD_version >= 1102000
struct ib_mr *
-qlnxr_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type, u32 max_num_sg)
+qlnxr_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
+ u32 max_num_sg, struct ib_udata *udata)
{
struct qlnxr_dev *dev;
struct qlnxr_mr *mr;
@@ -6266,48 +6200,28 @@ err0:
#endif /* #if __FreeBSD_version >= 1102000 */
-struct ib_ah *
-#if __FreeBSD_version >= 1102000
-qlnxr_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr,
+int
+qlnxr_create_ah(struct ib_ah *ibah,
+ struct ib_ah_attr *attr, u32 flags,
struct ib_udata *udata)
-#else
-qlnxr_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr)
-#endif /* #if __FreeBSD_version >= 1102000 */
{
struct qlnxr_dev *dev;
qlnx_host_t *ha;
- struct qlnxr_ah *ah;
+ struct qlnxr_ah *ah = get_qlnxr_ah(ibah);
- dev = get_qlnxr_dev((ibpd->device));
+ dev = get_qlnxr_dev(ibah->device);
ha = dev->ha;
QL_DPRINT12(ha, "in create_ah\n");
- ah = kzalloc(sizeof(*ah), GFP_ATOMIC);
- if (!ah) {
- QL_DPRINT12(ha, "no address handle can be allocated\n");
- return ERR_PTR(-ENOMEM);
- }
-
ah->attr = *attr;
- return &ah->ibah;
+ return (0);
}
-int
-qlnxr_destroy_ah(struct ib_ah *ibah)
+void
+qlnxr_destroy_ah(struct ib_ah *ibah, u32 flags)
{
- struct qlnxr_dev *dev;
- qlnx_host_t *ha;
- struct qlnxr_ah *ah = get_qlnxr_ah(ibah);
-
- dev = get_qlnxr_dev((ibah->device));
- ha = dev->ha;
-
- QL_DPRINT12(ha, "in destroy_ah\n");
-
- kfree(ah);
- return 0;
}
int
@@ -7187,7 +7101,6 @@ qlnxr_iw_qp_rem_ref(struct ib_qp *ibqp)
if (atomic_dec_and_test(&qp->refcnt)) {
qlnxr_idr_remove(qp->dev, qp->qp_id);
- kfree(qp);
}
QL_DPRINT12(ha, "exit \n");
diff --git a/sys/dev/qlnx/qlnxr/qlnxr_verbs.h b/sys/dev/qlnx/qlnxr/qlnxr_verbs.h
index 985587dbd9ed..8e5b313ea47e 100644
--- a/sys/dev/qlnx/qlnxr/qlnxr_verbs.h
+++ b/sys/dev/qlnx/qlnxr/qlnxr_verbs.h
@@ -40,11 +40,12 @@ extern int qlnxr_query_gid(struct ib_device *,
int index,
union ib_gid *gid);
-extern struct ib_srq *qlnxr_create_srq(struct ib_pd *,
+extern int qlnxr_create_srq(struct ib_srq *ibsrq,
struct ib_srq_init_attr *,
struct ib_udata *);
-extern int qlnxr_destroy_srq(struct ib_srq *);
+extern void qlnxr_destroy_srq(struct ib_srq *,
+ struct ib_udata *);
extern int qlnxr_modify_srq(struct ib_srq *,
struct ib_srq_attr *,
@@ -79,33 +80,15 @@ extern int qlnxr_modify_port(struct ib_device *,
extern enum rdma_link_layer qlnxr_link_layer(struct ib_device *device,
uint8_t port_num);
-struct ib_pd *qlnxr_alloc_pd(struct ib_device *,
- struct ib_ucontext *,
- struct ib_udata *);
+extern int qlnxr_alloc_pd(struct ib_pd *ibpd, struct ib_udata *);
-extern int qlnxr_dealloc_pd(struct ib_pd *pd);
+extern void qlnxr_dealloc_pd(struct ib_pd *pd, struct ib_udata *udata);
-#if __FreeBSD_version >= 1102000
-extern struct ib_cq *qlnxr_create_cq(struct ib_device *ibdev,
- const struct ib_cq_init_attr *attr,
- struct ib_ucontext *ib_ctx,
- struct ib_udata *udata);
-#else
-#if __FreeBSD_version >= 1100000
-extern struct ib_cq *qlnxr_create_cq(struct ib_device *ibdev,
- struct ib_cq_init_attr *attr,
- struct ib_ucontext *ib_ctx,
- struct ib_udata *udata);
-#else
-extern struct ib_cq *qlnxr_create_cq(struct ib_device *ibdev,
- int cqe,
- int comp_vector,
- struct ib_ucontext *ib_ctx,
- struct ib_udata *udata);
-#endif
-#endif /* #if __FreeBSD_version >= 1102000 */
+extern int qlnxr_create_cq(struct ib_cq *ibcq,
+ const struct ib_cq_init_attr *attr,
+ struct ib_udata *udata);
-extern int qlnxr_destroy_cq(struct ib_cq *);
+extern void qlnxr_destroy_cq(struct ib_cq *, struct ib_udata *);
extern int qlnxr_resize_cq(struct ib_cq *,
int cqe,
@@ -129,22 +112,17 @@ extern int qlnxr_query_qp(struct ib_qp *,
int qp_attr_mask,
struct ib_qp_init_attr *);
-extern int qlnxr_destroy_qp(struct ib_qp *);
+extern int qlnxr_destroy_qp(struct ib_qp *, struct ib_udata *);
extern int qlnxr_query_pkey(struct ib_device *,
u8 port,
u16 index,
u16 *pkey);
-#if __FreeBSD_version >= 1102000
-extern struct ib_ah *qlnxr_create_ah(struct ib_pd *ibpd,
- struct ib_ah_attr *attr, struct ib_udata *udata);
-#else
-extern struct ib_ah *qlnxr_create_ah(struct ib_pd *ibpd,
- struct ib_ah_attr *attr);
-#endif /* #if __FreeBSD_version >= 1102000 */
-
-extern int qlnxr_destroy_ah(struct ib_ah *ibah);
+extern int qlnxr_create_ah(struct ib_ah *ibah,
+ struct ib_ah_attr *attr, u32 flags,
+ struct ib_udata *udata);
+extern void qlnxr_destroy_ah(struct ib_ah *ibah, u32 flags);
extern int qlnxr_query_ah(struct ib_ah *ibah,
struct ib_ah_attr *attr);
@@ -195,7 +173,7 @@ extern struct ib_mr *qlnxr_reg_kernel_mr(struct ib_pd *,
u64 *iova_start);
#endif /* #if __FreeBSD_version < 1102000 */
-extern int qlnxr_dereg_mr(struct ib_mr *);
+extern int qlnxr_dereg_mr(struct ib_mr *, struct ib_udata *);
#if __FreeBSD_version >= 1102000
extern struct ib_mr *qlnxr_reg_user_mr(struct ib_pd *,
@@ -217,7 +195,9 @@ extern struct ib_mr *qlnxr_reg_user_mr(struct ib_pd *,
#if __FreeBSD_version >= 1102000
extern struct ib_mr *qlnxr_alloc_mr(struct ib_pd *pd,
- enum ib_mr_type mr_type, u32 max_num_sg);
+ enum ib_mr_type mr_type, u32 max_num_sg,
+ struct ib_udata *udata);
+
extern int qlnxr_map_mr_sg(struct ib_mr *mr, struct scatterlist *sg,
int sg_nents, unsigned int *sg_offset);
#else
@@ -233,10 +213,10 @@ extern void qlnxr_free_frmr_page_list(struct ib_fast_reg_page_list *page_list);
#endif /* #if __FreeBSD_version >= 1102000 */
-extern struct ib_ucontext *qlnxr_alloc_ucontext(struct ib_device *ibdev,
- struct ib_udata *udata);
+extern int qlnxr_alloc_ucontext(struct ib_ucontext *uctx,
+ struct ib_udata *udata);
-extern int qlnxr_dealloc_ucontext(struct ib_ucontext *ibctx);
+extern void qlnxr_dealloc_ucontext(struct ib_ucontext *ibctx);
extern int qlnxr_mmap(struct ib_ucontext *, struct vm_area_struct *vma);