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

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

commit fd6ab203624ad1d1154b59ef5748c1c6ebf3dbd3
Author: liaoao <[email protected]>
AuthorDate: Mon May 19 15:41:39 2025 +0800

    drivers/rpmsg_port_spi: fix SPI exchange length calculation
    
    The cmdhdr->len was uninitialized before being used in SPI exchange
    operations. This caused incorrect transfer lengths.
    
    Changes:
    - Initialize cmdhdr->len to sizeof(struct rpmsg_port_header_s) during
      initialization for both SPI master and slave drivers
    - Use port.txq.len instead of cmdhdr->len for TX exchange length
    - Use port.rxq.len instead of cmdhdr->len for RX getdata length
    
    Signed-off-by: liaoao <[email protected]>
---
 drivers/rpmsg/rpmsg_port_spi.c       | 3 ++-
 drivers/rpmsg/rpmsg_port_spi_slave.c | 5 +++--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/rpmsg/rpmsg_port_spi.c b/drivers/rpmsg/rpmsg_port_spi.c
index 10756b98212..8ec6bf9ea77 100644
--- a/drivers/rpmsg/rpmsg_port_spi.c
+++ b/drivers/rpmsg/rpmsg_port_spi.c
@@ -312,7 +312,7 @@ static void rpmsg_port_spi_exchange(FAR struct 
rpmsg_port_spi_s *rpspi)
   rpmsg_port_spi_pm_action(rpspi, true);
   SPI_SELECT(rpspi->spi, rpspi->devid, true);
   SPI_EXCHANGE(rpspi->spi, txhdr, rpspi->rxhdr,
-               RPMSG_PORT_SPI_BYTES2WORDS(rpspi, rpspi->cmdhdr->len));
+               RPMSG_PORT_SPI_BYTES2WORDS(rpspi, rpspi->port.txq.len));
 
   rpspi->rxavail = txhdr->avail;
 }
@@ -772,6 +772,7 @@ rpmsg_port_spi_initialize(FAR const struct 
rpmsg_port_config_s *cfg,
   rpspi->rxhdr = rpmsg_port_queue_get_available_buffer(
     &rpspi->port.rxq, true);
   DEBUGASSERT(rpspi->cmdhdr != NULL && rpspi->rxhdr != NULL);
+  rpspi->cmdhdr->len = sizeof(struct rpmsg_port_header_s);
 
   rpspi->rxthres = rpmsg_port_queue_navail(&rpspi->port.rxq) *
                    CONFIG_RPMSG_PORT_SPI_RX_THRESHOLD / 100;
diff --git a/drivers/rpmsg/rpmsg_port_spi_slave.c 
b/drivers/rpmsg/rpmsg_port_spi_slave.c
index 18796ae90d0..934245856f4 100644
--- a/drivers/rpmsg/rpmsg_port_spi_slave.c
+++ b/drivers/rpmsg/rpmsg_port_spi_slave.c
@@ -276,7 +276,7 @@ static void rpmsg_port_spi_exchange(FAR struct 
rpmsg_port_spi_s *rpspi)
 
   rpmsg_port_spi_pm_action(rpspi, true);
   SPIS_CTRLR_ENQUEUE(rpspi->spictrlr, txhdr,
-                     RPMSG_PORT_SPI_BYTES2WORDS(rpspi, rpspi->cmdhdr->len));
+                     RPMSG_PORT_SPI_BYTES2WORDS(rpspi, rpspi->port.txq.len));
   IOEXP_WRITEPIN(rpspi->ioe, rpspi->sreq, 1);
 
   rpspi->rxavail = txhdr->avail;
@@ -364,7 +364,7 @@ static size_t rpmsg_port_spi_slave_getdata(FAR struct 
spi_slave_dev_s *dev,
     container_of(dev, struct rpmsg_port_spi_s, spislv);
 
   *data = rpspi->rxhdr;
-  return RPMSG_PORT_SPI_BYTES2WORDS(rpspi, rpspi->cmdhdr->len);
+  return RPMSG_PORT_SPI_BYTES2WORDS(rpspi, rpspi->port.rxq.len);
 }
 
 /****************************************************************************
@@ -813,6 +813,7 @@ rpmsg_port_spi_slave_initialize(FAR const struct 
rpmsg_port_config_s *cfg,
   rpspi->rxhdr = rpmsg_port_queue_get_available_buffer(
     &rpspi->port.rxq, true);
   DEBUGASSERT(rpspi->cmdhdr != NULL && rpspi->rxhdr != NULL);
+  rpspi->cmdhdr->len = sizeof(struct rpmsg_port_header_s);
 
   rpspi->rxthres = rpmsg_port_queue_navail(&rpspi->port.rxq) *
                    CONFIG_RPMSG_PORT_SPI_RX_THRESHOLD / 100;

Reply via email to