This is an automated email from the ASF dual-hosted git repository. xiaoxiang781216 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit cd99aa29f8cd4081eb3cffe6748d68e6b261d459 Author: mazhuang <[email protected]> AuthorDate: Mon Mar 2 11:52:23 2026 +0800 rpmsg/rpmsg_port: introduce rpmsg_port_node_s wrapper for queue nodes Replace the raw list_node pointers in rpmsg_port_queue_s with a dedicated struct rpmsg_port_node_s that embeds the list_node, so per-buffer metadata (e.g. a retransmission count) can be added next to the queue linkage later. Signed-off-by: mazhuang <[email protected]> --- drivers/rpmsg/rpmsg_port.c | 25 +++++++++++++------------ drivers/rpmsg/rpmsg_port.h | 19 ++++++++++++------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/drivers/rpmsg/rpmsg_port.c b/drivers/rpmsg/rpmsg_port.c index c37e3af5205..7ef8692aea7 100644 --- a/drivers/rpmsg/rpmsg_port.c +++ b/drivers/rpmsg/rpmsg_port.c @@ -93,12 +93,12 @@ static void rpmsg_port_post(FAR sem_t *sem) ****************************************************************************/ static void rpmsg_port_add_node(FAR struct rpmsg_port_list_s *list, - FAR struct list_node *node) + FAR struct rpmsg_port_node_s *node) { irqstate_t flags; flags = spin_lock_irqsave(&list->lock); - list_add_tail(&list->head, node); + list_add_tail(&list->head, &node->node); list->num++; spin_unlock_irqrestore(&list->lock, flags); } @@ -107,7 +107,7 @@ static void rpmsg_port_add_node(FAR struct rpmsg_port_list_s *list, * Name: rpmsg_port_remove_node ****************************************************************************/ -static FAR struct list_node * +static FAR struct rpmsg_port_node_s * rpmsg_port_remove_node(FAR struct rpmsg_port_list_s *list) { FAR struct list_node *node; @@ -121,7 +121,7 @@ rpmsg_port_remove_node(FAR struct rpmsg_port_list_s *list) } spin_unlock_irqrestore(&list->lock, flags); - return node; + return metal_container_of(node, struct rpmsg_port_node_s, node); } /**************************************************************************** @@ -152,9 +152,9 @@ static int rpmsg_port_create_queue(FAR struct rpmsg_port_queue_s *queue, uint16_t count, uint16_t len, FAR void *buf) { - FAR struct list_node *node; + FAR struct rpmsg_port_node_s *node; - node = kmm_malloc(count * sizeof(struct list_node)); + node = kmm_malloc(count * sizeof(struct rpmsg_port_node_s)); if (node == NULL) { return -ENOMEM; @@ -652,7 +652,7 @@ rpmsg_port_queue_get_available_buffer(FAR struct rpmsg_port_queue_s *queue, { FAR struct rpmsg_port_s *port = queue->port; FAR struct rpmsg_port_header_s *hdr; - FAR struct list_node *node; + FAR struct rpmsg_port_node_s *node; int ret; for (; ; ) @@ -692,7 +692,7 @@ rpmsg_port_queue_get_available_buffer(FAR struct rpmsg_port_queue_s *queue, FAR void rpmsg_port_queue_return_buffer(FAR struct rpmsg_port_queue_s *queue, FAR struct rpmsg_port_header_s *hdr) { - FAR struct list_node *node = RPMSG_PORT_BUF_TO_NODE(queue, hdr); + FAR struct rpmsg_port_node_s *node = RPMSG_PORT_BUF_TO_NODE(queue, hdr); rpmsg_port_add_node(&queue->free, node); rpmsg_port_post(&queue->free.sem); @@ -705,7 +705,7 @@ FAR void rpmsg_port_queue_return_buffer(FAR struct rpmsg_port_queue_s *queue, FAR struct rpmsg_port_header_s * rpmsg_port_queue_get_buffer(FAR struct rpmsg_port_queue_s *queue, bool wait) { - FAR struct list_node *node; + FAR struct rpmsg_port_node_s *node; for (; ; ) { @@ -730,7 +730,7 @@ rpmsg_port_queue_get_buffer(FAR struct rpmsg_port_queue_s *queue, bool wait) void rpmsg_port_queue_add_buffer(FAR struct rpmsg_port_queue_s *queue, FAR struct rpmsg_port_header_s *hdr) { - FAR struct list_node *node = RPMSG_PORT_BUF_TO_NODE(queue, hdr); + FAR struct rpmsg_port_node_s *node = RPMSG_PORT_BUF_TO_NODE(queue, hdr); rpmsg_port_add_node(&queue->ready, node); rpmsg_port_post(&queue->ready.sem); @@ -836,7 +836,7 @@ static void rpmsg_port_dump_buffer(FAR struct rpmsg_device *rdev, FAR struct rpmsg_port_queue_s *queue, bool rx) { - FAR struct list_node *node; + FAR struct rpmsg_port_node_s *node; irqstate_t flags = spin_lock_irqsave(&queue->ready.lock); metal_log(METAL_LOG_EMERGENCY, @@ -845,7 +845,8 @@ static void rpmsg_port_dump_buffer(FAR struct rpmsg_device *rdev, rpmsg_port_queue_nused(queue), rpmsg_port_queue_navail(queue)); metal_log(METAL_LOG_EMERGENCY, "rpmsg buffer list:\n"); - list_for_every(&queue->ready.head, node) + list_for_every_entry(&queue->ready.head, node, + struct rpmsg_port_node_s, node) { FAR struct rpmsg_port_header_s *hdr = RPMSG_PORT_NODE_TO_BUF(queue, node); diff --git a/drivers/rpmsg/rpmsg_port.h b/drivers/rpmsg/rpmsg_port.h index 462af29db39..43d793ff668 100644 --- a/drivers/rpmsg/rpmsg_port.h +++ b/drivers/rpmsg/rpmsg_port.h @@ -67,37 +67,42 @@ struct rpmsg_port_list_s struct list_node head; /* List head */ }; +struct rpmsg_port_node_s +{ + struct list_node node; /* List node for free/ready/retx queue */ +}; + struct rpmsg_port_s; struct rpmsg_port_queue_s { /* Pointer to the rpmsg port handler */ - FAR struct rpmsg_port_s *port; + FAR struct rpmsg_port_s *port; /* Indicate buffers current queue managed is dynamic alloced */ - bool alloced; + bool alloced; /* Buffer array's base address of current queue managed */ - FAR void *buf; + FAR void *buf; /* Node related to buffer for buffer management */ - FAR struct list_node *node; + FAR struct rpmsg_port_node_s *node; /* Length of buffers current queue managed */ - uint16_t len; + uint16_t len; /* Free list of buffers which have not been occupied data yet */ - struct rpmsg_port_list_s free; + struct rpmsg_port_list_s free; /* Ready list of buffers which have been occupied data already */ - struct rpmsg_port_list_s ready; + struct rpmsg_port_list_s ready; }; typedef void (*rpmsg_port_rx_cb_t)(FAR struct rpmsg_port_s *port,
