Merge tag 'acpi-5.2-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-microblaze.git] / drivers / infiniband / hw / vmw_pvrdma / pvrdma_cq.c
index 104c7db..d7deb19 100644 (file)
@@ -49,6 +49,7 @@
 #include <rdma/ib_addr.h>
 #include <rdma/ib_smi.h>
 #include <rdma/ib_user_verbs.h>
+#include <rdma/uverbs_ioctl.h>
 
 #include "pvrdma.h"
 
@@ -93,7 +94,6 @@ int pvrdma_req_notify_cq(struct ib_cq *ibcq,
  * pvrdma_create_cq - create completion queue
  * @ibdev: the device
  * @attr: completion queue attributes
- * @context: user context
  * @udata: user data
  *
  * @return: ib_cq completion queue pointer on success,
@@ -101,7 +101,6 @@ int pvrdma_req_notify_cq(struct ib_cq *ibcq,
  */
 struct ib_cq *pvrdma_create_cq(struct ib_device *ibdev,
                               const struct ib_cq_init_attr *attr,
-                              struct ib_ucontext *context,
                               struct ib_udata *udata)
 {
        int entries = attr->cqe;
@@ -116,6 +115,8 @@ struct ib_cq *pvrdma_create_cq(struct ib_device *ibdev,
        struct pvrdma_cmd_create_cq_resp *resp = &rsp.create_cq_resp;
        struct pvrdma_create_cq_resp cq_resp = {0};
        struct pvrdma_create_cq ucmd;
+       struct pvrdma_ucontext *context = rdma_udata_to_drv_context(
+               udata, struct pvrdma_ucontext, ibucontext);
 
        BUILD_BUG_ON(sizeof(struct pvrdma_cqe) != 64);
 
@@ -133,7 +134,7 @@ struct ib_cq *pvrdma_create_cq(struct ib_device *ibdev,
        }
 
        cq->ibcq.cqe = entries;
-       cq->is_kernel = !context;
+       cq->is_kernel = !udata;
 
        if (!cq->is_kernel) {
                if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) {
@@ -185,8 +186,7 @@ struct ib_cq *pvrdma_create_cq(struct ib_device *ibdev,
        memset(cmd, 0, sizeof(*cmd));
        cmd->hdr.cmd = PVRDMA_CMD_CREATE_CQ;
        cmd->nchunks = npages;
-       cmd->ctx_handle = (context) ?
-               (u64)to_vucontext(context)->ctx_handle : 0;
+       cmd->ctx_handle = context ? context->ctx_handle : 0;
        cmd->cqe = entries;
        cmd->pdir_dma = cq->pdir.dir_dma;
        ret = pvrdma_cmd_post(dev, &req, &rsp, PVRDMA_CMD_CREATE_CQ_RESP);
@@ -204,13 +204,13 @@ struct ib_cq *pvrdma_create_cq(struct ib_device *ibdev,
        spin_unlock_irqrestore(&dev->cq_tbl_lock, flags);
 
        if (!cq->is_kernel) {
-               cq->uar = &(to_vucontext(context)->uar);
+               cq->uar = &context->uar;
 
                /* Copy udata back. */
                if (ib_copy_to_udata(udata, &cq_resp, sizeof(cq_resp))) {
                        dev_warn(&dev->pdev->dev,
                                 "failed to copy back udata\n");
-                       pvrdma_destroy_cq(&cq->ibcq);
+                       pvrdma_destroy_cq(&cq->ibcq, udata);
                        return ERR_PTR(-EINVAL);
                }
        }
@@ -245,10 +245,11 @@ static void pvrdma_free_cq(struct pvrdma_dev *dev, struct pvrdma_cq *cq)
 /**
  * pvrdma_destroy_cq - destroy completion queue
  * @cq: the completion queue to destroy.
+ * @udata: user data or null for kernel object
  *
  * @return: 0 for success.
  */
-int pvrdma_destroy_cq(struct ib_cq *cq)
+int pvrdma_destroy_cq(struct ib_cq *cq, struct ib_udata *udata)
 {
        struct pvrdma_cq *vcq = to_vcq(cq);
        union pvrdma_cmd_req req;