This is an automated email from the ASF dual-hosted git repository.

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 16763e4c67cf70e7a003d604e53d8c573bf4062c
Author: Bowen Wang <[email protected]>
AuthorDate: Fri Jan 24 00:41:28 2025 +0800

    drivers/rpmsg_port: support release the rx buffer in ept->cb
    
    Now we can release the rx buffer in ept->cb, ept->cb should copy
    the rx buffer it's private buffer and then return
    RPMSG_SUCCESS_BUFFER_RETURNED.
    
    Signed-off-by: Bowen Wang <[email protected]>
---
 drivers/rpmsg/rpmsg_port.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/rpmsg/rpmsg_port.c b/drivers/rpmsg/rpmsg_port.c
index b99a1e8e66a..2147808f477 100644
--- a/drivers/rpmsg/rpmsg_port.c
+++ b/drivers/rpmsg/rpmsg_port.c
@@ -406,7 +406,7 @@ static void rpmsg_port_rx_callback(FAR struct rpmsg_port_s 
*port,
   FAR struct rpmsg_hdr *rphdr = (FAR struct rpmsg_hdr *)hdr->buf;
   FAR void *data = RPMSG_LOCATE_DATA(rphdr);
   FAR struct rpmsg_endpoint *ept;
-  int status;
+  int status = 0;
 
   metal_mutex_acquire(&rdev->lock);
   ept = rpmsg_get_ept_from_addr(rdev, rphdr->dst);
@@ -422,13 +422,17 @@ static void rpmsg_port_rx_callback(FAR struct 
rpmsg_port_s *port,
         }
 
       status = ept->cb(ept, data, rphdr->len, rphdr->src, ept->priv);
-      if (status < 0)
+      if (status < 0 && status != RPMSG_SUCCESS_BUFFER_RELEASED)
         {
           RPMSG_ASSERT(0, "unexpected callback status\n");
         }
     }
 
-  rpmsg_port_release_rx_buffer(rdev, data);
+  if (status != RPMSG_SUCCESS_BUFFER_RELEASED)
+    {
+      rpmsg_port_release_rx_buffer(rdev, data);
+    }
+
   metal_mutex_acquire(&rdev->lock);
   rpmsg_ept_decref(ept);
   metal_mutex_release(&rdev->lock);

Reply via email to