PCI: mediatek: Clear interrupt status before dispatching handler
[platform/kernel/linux-starfive.git] / drivers / misc / fastrpc.c
index a66b7c1..1c6c62a 100644 (file)
@@ -958,6 +958,7 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
        if (err)
                return err;
 
+       memset(ctx->buf->virt, 0, pkt_size);
        rpra = ctx->buf->virt;
        list = fastrpc_invoke_buf_start(rpra, ctx->nscalars);
        pages = fastrpc_phy_page_start(list, ctx->nscalars);
@@ -1090,6 +1091,7 @@ static int fastrpc_put_args(struct fastrpc_invoke_ctx *ctx,
                }
        }
 
+       /* Clean up fdlist which is updated by DSP */
        for (i = 0; i < FASTRPC_MAX_FDLIST; i++) {
                if (!fdlist[i])
                        break;
@@ -1156,11 +1158,9 @@ static int fastrpc_internal_invoke(struct fastrpc_user *fl,  u32 kernel,
        if (IS_ERR(ctx))
                return PTR_ERR(ctx);
 
-       if (ctx->nscalars) {
-               err = fastrpc_get_args(kernel, ctx);
-               if (err)
-                       goto bail;
-       }
+       err = fastrpc_get_args(kernel, ctx);
+       if (err)
+               goto bail;
 
        /* make sure that all CPU memory writes are seen by DSP */
        dma_wmb();
@@ -1179,20 +1179,18 @@ static int fastrpc_internal_invoke(struct fastrpc_user *fl,  u32 kernel,
        if (err)
                goto bail;
 
+       /* make sure that all memory writes by DSP are seen by CPU */
+       dma_rmb();
+       /* populate all the output buffers with results */
+       err = fastrpc_put_args(ctx, kernel);
+       if (err)
+               goto bail;
+
        /* Check the response from remote dsp */
        err = ctx->retval;
        if (err)
                goto bail;
 
-       if (ctx->nscalars) {
-               /* make sure that all memory writes by DSP are seen by CPU */
-               dma_rmb();
-               /* populate all the output buffers with results */
-               err = fastrpc_put_args(ctx, kernel);
-               if (err)
-                       goto bail;
-       }
-
 bail:
        if (err != -ERESTARTSYS && err != -ETIMEDOUT) {
                /* We are done with this compute context */
@@ -1983,11 +1981,13 @@ static int fastrpc_req_mem_unmap_impl(struct fastrpc_user *fl, struct fastrpc_me
        sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_MEM_UNMAP, 1, 0);
        err = fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE, sc,
                                      &args[0]);
-       fastrpc_map_put(map);
-       if (err)
+       if (err) {
                dev_err(dev, "unmmap\tpt fd = %d, 0x%09llx error\n",  map->fd, map->raddr);
+               return err;
+       }
+       fastrpc_map_put(map);
 
-       return err;
+       return 0;
 }
 
 static int fastrpc_req_mem_unmap(struct fastrpc_user *fl, char __user *argp)