Skip to content

Commit a12ddd6

Browse files
Nobuteru Hayashibroonie
authored andcommitted
spi/fsl-espi: Don't spin forever on SPIE_RXCNT
Infinite loop on SPIE_RXCNT occurred. while (SPIE_RXCNT(events) < min(4, mspi->len)) { cpu_relax(); events = mpc8xxx_spi_read_reg(&reg_base->event); } We met a soft lockup at fsl_espi_cpu_irq() because of this. Fix it by using spin_event_timeout() so that fsl_espi_cpu_irq() can break loop with timeouts dmesg. Signed-off-by: Nobuteru Hayashi <hayashi.nbb@ncos.nec.co.jp> Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent f55532a commit a12ddd6

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

drivers/spi/spi-fsl-espi.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -539,11 +539,18 @@ void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
539539
if (events & SPIE_NE) {
540540
u32 rx_data, tmp;
541541
u8 rx_data_8;
542+
int ret;
542543

543544
/* Spin until RX is done */
544-
while (SPIE_RXCNT(events) < min(4, mspi->len)) {
545-
cpu_relax();
546-
events = mpc8xxx_spi_read_reg(&reg_base->event);
545+
if (SPIE_RXCNT(events) < min(4, mspi->len)) {
546+
ret = spin_event_timeout(
547+
!(SPIE_RXCNT(events =
548+
mpc8xxx_spi_read_reg(&reg_base->event)) <
549+
min(4, mspi->len)),
550+
10000, 0); /* 10 msec */
551+
if (!ret)
552+
dev_err(mspi->dev,
553+
"tired waiting for SPIE_RXCNT\n");
547554
}
548555

549556
if (mspi->len >= 4) {

0 commit comments

Comments
 (0)