Re: [PATCH v3 3/4] spi: spi-geni-qcom: Don't try to set CS if an xfer is pending

From: Stephen Boyd
Date: Thu Dec 17 2020 - 21:55:18 EST


Quoting Douglas Anderson (2020-12-17 14:29:13)
> If we get a timeout sending then this happens:
>
> spi_transfer_one_message()
> ->transfer_one() AKA spi_geni_transfer_one()
> setup_fifo_xfer()
> mas->cur_xfer = non-NULL
> spi_transfer_wait() => TIMES OUT
> if (msg->status != -EINPROGRESS)
> goto out
> if (ret != 0 ...)
> spi_set_cs()
> ->set_cs AKA spi_geni_set_cs()
> # mas->cur_xfer is non-NULL
>
> The above happens _before_ the SPI core calls ->handle_err() AKA
> handle_fifo_timeout().
>
> Unfortunately that won't work so well on geni. If we got a timeout
> transferring then it's likely that our interrupt handler is blocked,
> but we need that same interrupt handler to run and the command channel
> to be unblocked in order to adjust the chip select. Trying to set the
> chip select doesn't crash us but ends up confusing our state machine
> and leads to messages like: Premature done. rx_rem = 32 bpw8
>
> Let's just drop the chip select request in this case. We can detect
> the case because cur_xfer is non-NULL--it would have been set to NULL
> in the interrupt handler if the previous transfer had finished. Sure,
> we might leave the chip select in the wrong state but it's likely it
> was going to fail anyway and this avoids getting the driver even more
> confused about what it's doing.
>
> The SPI core in general assumes that setting chip select is a simple
> operation that doesn't fail. Yet another reason to just reconfigure
> the chip select line as GPIOs.
>
> Signed-off-by: Douglas Anderson <dianders@xxxxxxxxxxxx>
> ---

Reviewed-by: Stephen Boyd <swboyd@xxxxxxxxxxxx>