driver/spi: avoid calling QPOLL to change rx_length and cause data loss

When the application calls poll and returns the POLLIN event,
QPOLL will be called again during the read operation,
causing rx_length to change and data to be lost.
Therefore, read only need to actively call qpoll to collect driver
data when rx length is 0.

Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
This commit is contained in:
dongjiuzhu1 2023-09-05 19:20:46 +08:00 committed by Xiang Xiao
parent ade23b92d1
commit dcb8188f07

View File

@ -326,7 +326,7 @@ static ssize_t spi_slave_read(FAR struct file *filep, FAR char *buffer,
return ret;
}
do
while (priv->rx_length == 0)
{
remaining_words = SPIS_CTRLR_QPOLL(priv->ctrlr);
if (remaining_words == 0)
@ -360,11 +360,11 @@ static ssize_t spi_slave_read(FAR struct file *filep, FAR char *buffer,
}
}
}
while (priv->rx_length == 0);
read_bytes = MIN(buflen, priv->rx_length);
memcpy(buffer, priv->rx_buffer, read_bytes);
priv->rx_length -= read_bytes;
nxmutex_unlock(&priv->lock);
return (ssize_t)read_bytes;