From b200f4969786aec81011a75e8be2de9c857a67bb Mon Sep 17 00:00:00 2001 From: Bowen Wang Date: Fri, 27 Jun 2025 00:09:47 +0800 Subject: [PATCH] drivers/rpmsg_port: notify the lower transport when no free buffers When no free buffers, notify the lower transport, so the lower transports can know this thing and do some work, such as continue to process the rx data to avoid the rx thread is blocked that even can't process the commands. Signed-off-by: Bowen Wang Signed-off-by: liaoao --- drivers/rpmsg/rpmsg_port.c | 13 +++++++++++-- drivers/rpmsg/rpmsg_port.h | 13 +++++++++++-- drivers/rpmsg/rpmsg_port_spi.c | 1 + drivers/rpmsg/rpmsg_port_spi_slave.c | 1 + 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/drivers/rpmsg/rpmsg_port.c b/drivers/rpmsg/rpmsg_port.c index 79538d8d3c2..b8b2caf34f1 100644 --- a/drivers/rpmsg/rpmsg_port.c +++ b/drivers/rpmsg/rpmsg_port.c @@ -215,6 +215,8 @@ rpmsg_port_create_queues(FAR struct rpmsg_port_s *port, return ret; } + port->txq.port = port; + port->rxq.port = port; return 0; } @@ -608,8 +610,10 @@ FAR struct rpmsg_port_header_s * rpmsg_port_queue_get_available_buffer(FAR struct rpmsg_port_queue_s *queue, bool wait) { - FAR struct list_node *node; + FAR struct rpmsg_port_s *port = queue->port; FAR struct rpmsg_port_header_s *hdr; + FAR struct list_node *node; + int ret; for (; ; ) { @@ -625,7 +629,12 @@ rpmsg_port_queue_get_available_buffer(FAR struct rpmsg_port_queue_s *queue, return NULL; } - nxsem_wait_uninterruptible(&queue->free.sem); + ret = port->ops->notify_queue_noavail ? + port->ops->notify_queue_noavail(port, queue) : -ENOTSUP; + if (ret == -ENOTSUP) + { + nxsem_wait_uninterruptible(&queue->free.sem); + } } } diff --git a/drivers/rpmsg/rpmsg_port.h b/drivers/rpmsg/rpmsg_port.h index 0245c2c1c1c..b25b3908974 100644 --- a/drivers/rpmsg/rpmsg_port.h +++ b/drivers/rpmsg/rpmsg_port.h @@ -67,8 +67,14 @@ struct rpmsg_port_list_s struct list_node head; /* List head */ }; +struct rpmsg_port_s; + struct rpmsg_port_queue_s { + /* Pointer to the rpmsg port handler */ + + FAR struct rpmsg_port_s *port; + /* Indicate buffers current queue managed is dynamic alloced */ bool alloced; @@ -94,8 +100,6 @@ struct rpmsg_port_queue_s struct rpmsg_port_list_s ready; }; -struct rpmsg_port_s; - typedef void (*rpmsg_port_rx_cb_t)(FAR struct rpmsg_port_s *port, FAR struct rpmsg_port_header_s *hdr); @@ -109,6 +113,11 @@ struct rpmsg_port_ops_s CODE void (*notify_rx_free)(FAR struct rpmsg_port_s *port); + /* Notify driver there is no available buffer */ + + CODE int (*notify_queue_noavail)(FAR struct rpmsg_port_s *port, + FAR struct rpmsg_port_queue_s *queue); + /* Register callback function which should be invoked when there is * date received to the rx queue by driver */ diff --git a/drivers/rpmsg/rpmsg_port_spi.c b/drivers/rpmsg/rpmsg_port_spi.c index 8ec6bf9ea77..da0c584c857 100644 --- a/drivers/rpmsg/rpmsg_port_spi.c +++ b/drivers/rpmsg/rpmsg_port_spi.c @@ -140,6 +140,7 @@ static const struct rpmsg_port_ops_s g_rpmsg_port_spi_ops = { rpmsg_port_spi_notify_tx_ready, rpmsg_port_spi_notify_rx_free, + NULL, rpmsg_port_spi_register_cb, }; diff --git a/drivers/rpmsg/rpmsg_port_spi_slave.c b/drivers/rpmsg/rpmsg_port_spi_slave.c index db4ef36c4f9..eca0019dd75 100644 --- a/drivers/rpmsg/rpmsg_port_spi_slave.c +++ b/drivers/rpmsg/rpmsg_port_spi_slave.c @@ -158,6 +158,7 @@ static const struct rpmsg_port_ops_s g_rpmsg_port_spi_ops = { rpmsg_port_spi_notify_tx_ready, rpmsg_port_spi_notify_rx_free, + NULL, rpmsg_port_spi_register_cb, };