From nobody Fri Nov 7 03:53:15 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1545473154940563.7951102772641; Sat, 22 Dec 2018 02:05:54 -0800 (PST) Received: from localhost ([::1]:55473 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gaeAL-0000iC-2x for importer@patchew.org; Sat, 22 Dec 2018 05:05:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41734) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gadw4-0006NF-V4 for qemu-devel@nongnu.org; Sat, 22 Dec 2018 04:51:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gadw3-0006Vt-CK for qemu-devel@nongnu.org; Sat, 22 Dec 2018 04:51:08 -0500 Received: from mail-wm1-x341.google.com ([2a00:1450:4864:20::341]:52780) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gadw3-0006VU-3u for qemu-devel@nongnu.org; Sat, 22 Dec 2018 04:51:07 -0500 Received: by mail-wm1-x341.google.com with SMTP id m1so7392547wml.2 for ; Sat, 22 Dec 2018 01:51:07 -0800 (PST) Received: from localhost.localdomain ([176.228.155.165]) by smtp.gmail.com with ESMTPSA id s3sm9557371wmj.23.2018.12.22.01.51.04 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 22 Dec 2018 01:51:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=/7Zo4QgyA6P2oUwmed3myJIZ5TcWK9NLoQ+m6B8umUY=; b=Y/AVwlOJT1eE1CFeLDre/MURX9IVGX7Bv7mfbGAH85RxsD+MzgNBSQ/0K4eYI+HVgG qo2mO/+xc0H6mgnRyKQorEVc5aN9JOITIgK2bx3n18wF8k2lVAFTdiM7RFNvS8vnjIyE +I1nLiTyuNL4lq8Vmk+mwF+ny0KYtUN/no6OKskay5EPb+Wk6DEILBvLpktwYXctYA8r 0ARtGN8YhFNSeADZKcfZB+lBmPCoykcbXyCp2uIv7lFazXapDMnVG8hxeQB8GdJCAFAh 0y/zY9D8Rv84miAyl0hJYZwq5wSIn8YXRvnGqgT95GlL2tP0Ahz71aMgXqzBOKu9CdZt bICw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=/7Zo4QgyA6P2oUwmed3myJIZ5TcWK9NLoQ+m6B8umUY=; b=SrNCBoSlwa1H7QJXpdwdSIJ4+ELNJvG3W3FdMSDL4SOmiBgm4yFMMGgxNzmyx7dOpe gBtj04G7mTCELnhnIYfYaAtSPytdSIjONl4qd8T2wDj7z5xqz4fGJdjrzhROBVtw5w01 6AMglNeW6m2MUuK6TaLCuJBClvadep4IVA4d0UcuPfN1xW5VE8Xkziocc6SxAJeqy/Be ka+c+UkyvlHAdONDIHVl21QPV+es9B55cnMCvCGzmpxf8ZyPHA0EiDjcumBkCVoakI/Q KSyy36HfZ2HszJ5Q0/MrlAwJc8Co/U9ggEQORD+zEOwfk+uuvV1YkBLE+xAp7cRR2you 2npw== X-Gm-Message-State: AJcUukeEbRHRsKqPhmP1UwT8BMrgytcb9LFh1sG7iZkfLr8X3NUcxICc UDWMMuI+V+rlQha7m/DiPEJ/moRU X-Google-Smtp-Source: ALg8bN5YDMZsDsAamYX6G/qt0RnIke7QB63138HinBXDvjXN/nC7pwwup2BwMOyuMoX5pooo4gLSVQ== X-Received: by 2002:a1c:9dc4:: with SMTP id g187mr6146796wme.152.1545472265892; Sat, 22 Dec 2018 01:51:05 -0800 (PST) From: Marcel Apfelbaum To: qemu-devel@nongnu.org, peter.maydell@linaro.org Date: Sat, 22 Dec 2018 11:50:23 +0200 Message-Id: <20181222095036.29743-19-marcel.apfelbaum@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181222095036.29743-1-marcel.apfelbaum@gmail.com> References: <20181222095036.29743-1-marcel.apfelbaum@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::341 Subject: [Qemu-devel] [PATCH PULL 18/31] hw/pvrdma: Fill error code in command's response X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: yuval.shaia@oracle.com, pjp@fedoraproject.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Yuval Shaia Driver checks error code let's set it. In addition, for code simplification purposes, set response's fields ack, response and err outside of the scope of command handlers. Signed-off-by: Yuval Shaia Reviewed-by: Marcel Apfelbaum Signed-off-by: Marcel Apfelbaum --- hw/rdma/vmw/pvrdma_cmd.c | 197 ++++++++++++++++++--------------------- 1 file changed, 90 insertions(+), 107 deletions(-) diff --git a/hw/rdma/vmw/pvrdma_cmd.c b/hw/rdma/vmw/pvrdma_cmd.c index 0d3c818c20..3b94545761 100644 --- a/hw/rdma/vmw/pvrdma_cmd.c +++ b/hw/rdma/vmw/pvrdma_cmd.c @@ -128,6 +128,9 @@ static int query_port(PVRDMADev *dev, union pvrdma_cmd_= req *req, struct pvrdma_port_attr attrs =3D {0}; =20 pr_dbg("port=3D%d\n", cmd->port_num); + if (cmd->port_num > MAX_PORTS) { + return -EINVAL; + } =20 if (rdma_backend_query_port(&dev->backend_dev, (struct ibv_port_attr *)&attrs)) { @@ -135,9 +138,6 @@ static int query_port(PVRDMADev *dev, union pvrdma_cmd_= req *req, } =20 memset(resp, 0, sizeof(*resp)); - resp->hdr.response =3D cmd->hdr.response; - resp->hdr.ack =3D PVRDMA_CMD_QUERY_PORT_RESP; - resp->hdr.err =3D 0; =20 resp->attrs.state =3D dev->func0->device_active ? attrs.state : PVRDMA_PORT_DOWN; @@ -160,12 +160,16 @@ static int query_pkey(PVRDMADev *dev, union pvrdma_cm= d_req *req, struct pvrdma_cmd_query_pkey_resp *resp =3D &rsp->query_pkey_resp; =20 pr_dbg("port=3D%d\n", cmd->port_num); + if (cmd->port_num > MAX_PORTS) { + return -EINVAL; + } + pr_dbg("index=3D%d\n", cmd->index); + if (cmd->index > MAX_PKEYS) { + return -EINVAL; + } =20 memset(resp, 0, sizeof(*resp)); - resp->hdr.response =3D cmd->hdr.response; - resp->hdr.ack =3D PVRDMA_CMD_QUERY_PKEY_RESP; - resp->hdr.err =3D 0; =20 resp->pkey =3D PVRDMA_PKEY; pr_dbg("pkey=3D0x%x\n", resp->pkey); @@ -178,17 +182,15 @@ static int create_pd(PVRDMADev *dev, union pvrdma_cmd= _req *req, { struct pvrdma_cmd_create_pd *cmd =3D &req->create_pd; struct pvrdma_cmd_create_pd_resp *resp =3D &rsp->create_pd_resp; + int rc; =20 pr_dbg("context=3D0x%x\n", cmd->ctx_handle ? cmd->ctx_handle : 0); =20 memset(resp, 0, sizeof(*resp)); - resp->hdr.response =3D cmd->hdr.response; - resp->hdr.ack =3D PVRDMA_CMD_CREATE_PD_RESP; - resp->hdr.err =3D rdma_rm_alloc_pd(&dev->rdma_dev_res, &dev->backend_d= ev, - &resp->pd_handle, cmd->ctx_handle); + rc =3D rdma_rm_alloc_pd(&dev->rdma_dev_res, &dev->backend_dev, + &resp->pd_handle, cmd->ctx_handle); =20 - pr_dbg("ret=3D%d\n", resp->hdr.err); - return resp->hdr.err; + return rc; } =20 static int destroy_pd(PVRDMADev *dev, union pvrdma_cmd_req *req, @@ -210,10 +212,9 @@ static int create_mr(PVRDMADev *dev, union pvrdma_cmd_= req *req, struct pvrdma_cmd_create_mr_resp *resp =3D &rsp->create_mr_resp; PCIDevice *pci_dev =3D PCI_DEVICE(dev); void *host_virt =3D NULL; + int rc =3D 0; =20 memset(resp, 0, sizeof(*resp)); - resp->hdr.response =3D cmd->hdr.response; - resp->hdr.ack =3D PVRDMA_CMD_CREATE_MR_RESP; =20 pr_dbg("pd_handle=3D%d\n", cmd->pd_handle); pr_dbg("access_flags=3D0x%x\n", cmd->access_flags); @@ -224,22 +225,18 @@ static int create_mr(PVRDMADev *dev, union pvrdma_cmd= _req *req, cmd->length); if (!host_virt) { pr_dbg("Failed to map to pdir\n"); - resp->hdr.err =3D -EINVAL; - goto out; + return -EINVAL; } } =20 - resp->hdr.err =3D rdma_rm_alloc_mr(&dev->rdma_dev_res, cmd->pd_handle, - cmd->start, cmd->length, host_virt, - cmd->access_flags, &resp->mr_handle, - &resp->lkey, &resp->rkey); - if (resp->hdr.err && host_virt) { + rc =3D rdma_rm_alloc_mr(&dev->rdma_dev_res, cmd->pd_handle, cmd->start, + cmd->length, host_virt, cmd->access_flags, + &resp->mr_handle, &resp->lkey, &resp->rkey); + if (rc && host_virt) { munmap(host_virt, cmd->length); } =20 -out: - pr_dbg("ret=3D%d\n", resp->hdr.err); - return resp->hdr.err; + return rc; } =20 static int destroy_mr(PVRDMADev *dev, union pvrdma_cmd_req *req, @@ -317,28 +314,25 @@ static int create_cq(PVRDMADev *dev, union pvrdma_cmd= _req *req, struct pvrdma_cmd_create_cq *cmd =3D &req->create_cq; struct pvrdma_cmd_create_cq_resp *resp =3D &rsp->create_cq_resp; PvrdmaRing *ring =3D NULL; + int rc; =20 memset(resp, 0, sizeof(*resp)); - resp->hdr.response =3D cmd->hdr.response; - resp->hdr.ack =3D PVRDMA_CMD_CREATE_CQ_RESP; =20 resp->cqe =3D cmd->cqe; =20 - resp->hdr.err =3D create_cq_ring(PCI_DEVICE(dev), &ring, cmd->pdir_dma, - cmd->nchunks, cmd->cqe); - if (resp->hdr.err) { - goto out; + rc =3D create_cq_ring(PCI_DEVICE(dev), &ring, cmd->pdir_dma, cmd->nchu= nks, + cmd->cqe); + if (rc) { + return rc; } =20 pr_dbg("ring=3D%p\n", ring); =20 - resp->hdr.err =3D rdma_rm_alloc_cq(&dev->rdma_dev_res, &dev->backend_d= ev, - cmd->cqe, &resp->cq_handle, ring); + rc =3D rdma_rm_alloc_cq(&dev->rdma_dev_res, &dev->backend_dev, cmd->cq= e, + &resp->cq_handle, ring); resp->cqe =3D cmd->cqe; =20 -out: - pr_dbg("ret=3D%d\n", resp->hdr.err); - return resp->hdr.err; + return rc; } =20 static int destroy_cq(PVRDMADev *dev, union pvrdma_cmd_req *req, @@ -458,30 +452,31 @@ static int create_qp(PVRDMADev *dev, union pvrdma_cmd= _req *req, struct pvrdma_cmd_create_qp *cmd =3D &req->create_qp; struct pvrdma_cmd_create_qp_resp *resp =3D &rsp->create_qp_resp; PvrdmaRing *rings =3D NULL; + int rc; =20 memset(resp, 0, sizeof(*resp)); - resp->hdr.response =3D cmd->hdr.response; - resp->hdr.ack =3D PVRDMA_CMD_CREATE_QP_RESP; =20 pr_dbg("total_chunks=3D%d\n", cmd->total_chunks); pr_dbg("send_chunks=3D%d\n", cmd->send_chunks); =20 - resp->hdr.err =3D create_qp_rings(PCI_DEVICE(dev), cmd->pdir_dma, &rin= gs, - cmd->max_send_wr, cmd->max_send_sge, - cmd->send_chunks, cmd->max_recv_wr, - cmd->max_recv_sge, cmd->total_chunks - - cmd->send_chunks - 1); - if (resp->hdr.err) { - goto out; + rc =3D create_qp_rings(PCI_DEVICE(dev), cmd->pdir_dma, &rings, + cmd->max_send_wr, cmd->max_send_sge, cmd->send_ch= unks, + cmd->max_recv_wr, cmd->max_recv_sge, + cmd->total_chunks - cmd->send_chunks - 1); + if (rc) { + return rc; } =20 pr_dbg("rings=3D%p\n", rings); =20 - resp->hdr.err =3D rdma_rm_alloc_qp(&dev->rdma_dev_res, cmd->pd_handle, - cmd->qp_type, cmd->max_send_wr, - cmd->max_send_sge, cmd->send_cq_handl= e, - cmd->max_recv_wr, cmd->max_recv_sge, - cmd->recv_cq_handle, rings, &resp->qp= n); + rc =3D rdma_rm_alloc_qp(&dev->rdma_dev_res, cmd->pd_handle, cmd->qp_ty= pe, + cmd->max_send_wr, cmd->max_send_sge, + cmd->send_cq_handle, cmd->max_recv_wr, + cmd->max_recv_sge, cmd->recv_cq_handle, rings, + &resp->qpn); + if (rc) { + return rc; + } =20 resp->max_send_wr =3D cmd->max_send_wr; resp->max_recv_wr =3D cmd->max_recv_wr; @@ -489,35 +484,31 @@ static int create_qp(PVRDMADev *dev, union pvrdma_cmd= _req *req, resp->max_recv_sge =3D cmd->max_recv_sge; resp->max_inline_data =3D cmd->max_inline_data; =20 -out: - pr_dbg("ret=3D%d\n", resp->hdr.err); - return resp->hdr.err; + return 0; } =20 static int modify_qp(PVRDMADev *dev, union pvrdma_cmd_req *req, union pvrdma_cmd_resp *rsp) { struct pvrdma_cmd_modify_qp *cmd =3D &req->modify_qp; + int rc; =20 pr_dbg("qp_handle=3D%d\n", cmd->qp_handle); =20 memset(rsp, 0, sizeof(*rsp)); - rsp->hdr.response =3D cmd->hdr.response; - rsp->hdr.ack =3D PVRDMA_CMD_MODIFY_QP_RESP; =20 /* No need to verify sgid_index since it is u8 */ =20 - rsp->hdr.err =3D - rdma_rm_modify_qp(&dev->rdma_dev_res, &dev->backend_dev, cmd->qp_h= andle, - cmd->attr_mask, cmd->attrs.ah_attr.grh.sgid_inde= x, - (union ibv_gid *)&cmd->attrs.ah_attr.grh.dgid, - cmd->attrs.dest_qp_num, - (enum ibv_qp_state)cmd->attrs.qp_state, - cmd->attrs.qkey, cmd->attrs.rq_psn, - cmd->attrs.sq_psn); + rc =3D rdma_rm_modify_qp(&dev->rdma_dev_res, &dev->backend_dev, + cmd->qp_handle, cmd->attr_mask, + cmd->attrs.ah_attr.grh.sgid_index, + (union ibv_gid *)&cmd->attrs.ah_attr.grh.dgid, + cmd->attrs.dest_qp_num, + (enum ibv_qp_state)cmd->attrs.qp_state, + cmd->attrs.qkey, cmd->attrs.rq_psn, + cmd->attrs.sq_psn); =20 - pr_dbg("ret=3D%d\n", rsp->hdr.err); - return rsp->hdr.err; + return rc; } =20 static int query_qp(PVRDMADev *dev, union pvrdma_cmd_req *req, @@ -526,21 +517,18 @@ static int query_qp(PVRDMADev *dev, union pvrdma_cmd_= req *req, struct pvrdma_cmd_query_qp *cmd =3D &req->query_qp; struct pvrdma_cmd_query_qp_resp *resp =3D &rsp->query_qp_resp; struct ibv_qp_init_attr init_attr; + int rc; =20 pr_dbg("qp_handle=3D%d\n", cmd->qp_handle); pr_dbg("attr_mask=3D0x%x\n", cmd->attr_mask); =20 memset(rsp, 0, sizeof(*rsp)); - rsp->hdr.response =3D cmd->hdr.response; - rsp->hdr.ack =3D PVRDMA_CMD_QUERY_QP_RESP; =20 - rsp->hdr.err =3D rdma_rm_query_qp(&dev->rdma_dev_res, &dev->backend_de= v, - cmd->qp_handle, - (struct ibv_qp_attr *)&resp->attrs, - cmd->attr_mask, &init_attr); + rc =3D rdma_rm_query_qp(&dev->rdma_dev_res, &dev->backend_dev, cmd->qp= _handle, + (struct ibv_qp_attr *)&resp->attrs, cmd->attr_ma= sk, + &init_attr); =20 - pr_dbg("ret=3D%d\n", rsp->hdr.err); - return rsp->hdr.err; + return rc; } =20 static int destroy_qp(PVRDMADev *dev, union pvrdma_cmd_req *req, @@ -589,11 +577,8 @@ static int create_bind(PVRDMADev *dev, union pvrdma_cm= d_req *req, =20 rc =3D rdma_rm_add_gid(&dev->rdma_dev_res, &dev->backend_dev, dev->backend_eth_device_name, gid, cmd->index); - if (rc < 0) { - return -EINVAL; - } =20 - return 0; + return rc; } =20 static int destroy_bind(PVRDMADev *dev, union pvrdma_cmd_req *req, @@ -612,12 +597,7 @@ static int destroy_bind(PVRDMADev *dev, union pvrdma_c= md_req *req, rc =3D rdma_rm_del_gid(&dev->rdma_dev_res, &dev->backend_dev, dev->backend_eth_device_name, cmd->index); =20 - if (rc < 0) { - rsp->hdr.err =3D rc; - goto out; - } - - return 0; + return rc; } =20 static int create_uc(PVRDMADev *dev, union pvrdma_cmd_req *req, @@ -625,18 +605,14 @@ static int create_uc(PVRDMADev *dev, union pvrdma_cmd= _req *req, { struct pvrdma_cmd_create_uc *cmd =3D &req->create_uc; struct pvrdma_cmd_create_uc_resp *resp =3D &rsp->create_uc_resp; + int rc; =20 pr_dbg("pfn=3D%d\n", cmd->pfn); =20 memset(resp, 0, sizeof(*resp)); - resp->hdr.response =3D cmd->hdr.response; - resp->hdr.ack =3D PVRDMA_CMD_CREATE_UC_RESP; - resp->hdr.err =3D rdma_rm_alloc_uc(&dev->rdma_dev_res, cmd->pfn, - &resp->ctx_handle); + rc =3D rdma_rm_alloc_uc(&dev->rdma_dev_res, cmd->pfn, &resp->ctx_handl= e); =20 - pr_dbg("ret=3D%d\n", resp->hdr.err); - - return 0; + return rc; } =20 static int destroy_uc(PVRDMADev *dev, union pvrdma_cmd_req *req, @@ -650,30 +626,32 @@ static int destroy_uc(PVRDMADev *dev, union pvrdma_cm= d_req *req, =20 return 0; } + struct cmd_handler { uint32_t cmd; + uint32_t ack; int (*exec)(PVRDMADev *dev, union pvrdma_cmd_req *req, union pvrdma_cmd_resp *rsp); }; =20 static struct cmd_handler cmd_handlers[] =3D { - {PVRDMA_CMD_QUERY_PORT, query_port}, - {PVRDMA_CMD_QUERY_PKEY, query_pkey}, - {PVRDMA_CMD_CREATE_PD, create_pd}, - {PVRDMA_CMD_DESTROY_PD, destroy_pd}, - {PVRDMA_CMD_CREATE_MR, create_mr}, - {PVRDMA_CMD_DESTROY_MR, destroy_mr}, - {PVRDMA_CMD_CREATE_CQ, create_cq}, - {PVRDMA_CMD_RESIZE_CQ, NULL}, - {PVRDMA_CMD_DESTROY_CQ, destroy_cq}, - {PVRDMA_CMD_CREATE_QP, create_qp}, - {PVRDMA_CMD_MODIFY_QP, modify_qp}, - {PVRDMA_CMD_QUERY_QP, query_qp}, - {PVRDMA_CMD_DESTROY_QP, destroy_qp}, - {PVRDMA_CMD_CREATE_UC, create_uc}, - {PVRDMA_CMD_DESTROY_UC, destroy_uc}, - {PVRDMA_CMD_CREATE_BIND, create_bind}, - {PVRDMA_CMD_DESTROY_BIND, destroy_bind}, + {PVRDMA_CMD_QUERY_PORT, PVRDMA_CMD_QUERY_PORT_RESP, query_por= t}, + {PVRDMA_CMD_QUERY_PKEY, PVRDMA_CMD_QUERY_PKEY_RESP, query_pke= y}, + {PVRDMA_CMD_CREATE_PD, PVRDMA_CMD_CREATE_PD_RESP, create_pd= }, + {PVRDMA_CMD_DESTROY_PD, PVRDMA_CMD_DESTROY_PD_RESP_NOOP, destroy_p= d}, + {PVRDMA_CMD_CREATE_MR, PVRDMA_CMD_CREATE_MR_RESP, create_mr= }, + {PVRDMA_CMD_DESTROY_MR, PVRDMA_CMD_DESTROY_MR_RESP_NOOP, destroy_m= r}, + {PVRDMA_CMD_CREATE_CQ, PVRDMA_CMD_CREATE_CQ_RESP, create_cq= }, + {PVRDMA_CMD_RESIZE_CQ, PVRDMA_CMD_RESIZE_CQ_RESP, NULL}, + {PVRDMA_CMD_DESTROY_CQ, PVRDMA_CMD_DESTROY_CQ_RESP_NOOP, destroy_c= q}, + {PVRDMA_CMD_CREATE_QP, PVRDMA_CMD_CREATE_QP_RESP, create_qp= }, + {PVRDMA_CMD_MODIFY_QP, PVRDMA_CMD_MODIFY_QP_RESP, modify_qp= }, + {PVRDMA_CMD_QUERY_QP, PVRDMA_CMD_QUERY_QP_RESP, query_qp}, + {PVRDMA_CMD_DESTROY_QP, PVRDMA_CMD_DESTROY_QP_RESP, destroy_q= p}, + {PVRDMA_CMD_CREATE_UC, PVRDMA_CMD_CREATE_UC_RESP, create_uc= }, + {PVRDMA_CMD_DESTROY_UC, PVRDMA_CMD_DESTROY_UC_RESP_NOOP, destroy_u= c}, + {PVRDMA_CMD_CREATE_BIND, PVRDMA_CMD_CREATE_BIND_RESP_NOOP, create_bi= nd}, + {PVRDMA_CMD_DESTROY_BIND, PVRDMA_CMD_DESTROY_BIND_RESP_NOOP, destroy_b= ind}, }; =20 int execute_command(PVRDMADev *dev) @@ -696,7 +674,12 @@ int execute_command(PVRDMADev *dev) } =20 err =3D cmd_handlers[dsr_info->req->hdr.cmd].exec(dev, dsr_info->req, - dsr_info->rsp); + dsr_info->rsp); + dsr_info->rsp->hdr.response =3D dsr_info->req->hdr.response; + dsr_info->rsp->hdr.ack =3D cmd_handlers[dsr_info->req->hdr.cmd].ack; + dsr_info->rsp->hdr.err =3D err < 0 ? -err : 0; + pr_dbg("rsp->hdr.err=3D%d\n", dsr_info->rsp->hdr.err); + out: set_reg_val(dev, PVRDMA_REG_ERR, err); post_interrupt(dev, INTR_VEC_CMD_RING); --=20 2.17.1