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, };