From: Amelie Delaunay <amelie.delaunay@xxxxxx> Make spurious interrupts visible. We do not expect to receive them, so rise at least a warning if it happens. Don't bother repeating the suspended RX messages; to avoid RX overrun we have set SPI_CR1_MASRX that enables the automatic suspended RX so, mainly in irq mode, it's normal that we will receive SUSP interrupts every time the CPU is too much loaded or the spi speed too high and we fail to remove on-time the data from the RX queue. Moreover, when the CPU is overloaded there is a delay while serving the interrupt. This forces inactivity on the SPI bus between bytes. So the warning message "System too slow, spi speed not guaranteed" is inaccurate; the term "spi speed" is currently used in kernel for the toggling frequency of the spi CLK pin, which is driven by HW and is not impacted by CPU overload. The correct term should be "data throughput". RX overrun is an error condition that signals a corrupted RX stream both in dma and in irq modes. Report the error and abort the transfer in either cases. Signed-off-by: Amelie Delaunay <amelie.delaunay@xxxxxx> Signed-off-by: Antonio Borneo <antonio.borneo@xxxxxx> Signed-off-by: Alain Volmat <alain.volmat@xxxxxx> --- drivers/spi/spi-stm32.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c index 06478643855a..6731e3ff0e50 100644 --- a/drivers/spi/spi-stm32.c +++ b/drivers/spi/spi-stm32.c @@ -904,14 +904,16 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id) mask &= sr; if (!mask) { - dev_dbg(spi->dev, "spurious IT (sr=0x%08x, ier=0x%08x)\n", - sr, ier); + dev_warn(spi->dev, "spurious IT (sr=0x%08x, ier=0x%08x)\n", + sr, ier); spin_unlock_irqrestore(&spi->lock, flags); return IRQ_NONE; } if (mask & STM32H7_SPI_SR_SUSP) { - dev_warn(spi->dev, "Communication suspended\n"); + dev_warn_once(spi->dev, + "System too slow is limiting data throughput\n"); + if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0))) stm32h7_spi_read_rxfifo(spi); /* @@ -924,15 +926,8 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id) } if (mask & STM32H7_SPI_SR_OVR) { - dev_warn(spi->dev, "Overrun: received value discarded\n"); - if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0))) - stm32h7_spi_read_rxfifo(spi); - /* - * If overrun is detected while using DMA, it means that - * something went wrong, so stop the current transfer - */ - if (spi->cur_usedma) - end = true; + dev_err(spi->dev, "Overrun: RX data lost\n"); + end = true; ifcr |= STM32H7_SPI_SR_OVR; } -- 2.7.4