Message ID | 361901574eec1271c0969edba6492d3f2132fade.1701264413.git.namcao@linutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | spi: spl022: fix sleeping in interrupt context | expand |
On Wed, Nov 29, 2023 at 2:32 PM Nam Cao <namcao@linutronix.de> wrote: > The default message transfer implementation - spi_transfer_one_message - > invokes the specific device driver's transfer_one(), then waits for > completion. However, there is no mechanism for the device driver to > report failure in the middle of the transfer. > > Introduce SPI_TRANS_FAIL_IO for drivers to report transfer failure. > > Signed-off-by: Nam Cao <namcao@linutronix.de> This looks useful to me Acked-by: Linus Walleij <linus.walleij@linaro.org> > #define SPI_TRANS_FAIL_NO_START BIT(0) > +#define SPI_TRANS_FAIL_IO BIT(1) Is it obvious from context when these flags get set? from transfer_one() and in which flag field? Otherwise maybe we should add a comment. Yours, Linus Walleij
On Wed, Nov 29, 2023 at 02:55:18PM +0100, Linus Walleij wrote: > On Wed, Nov 29, 2023 at 2:32 PM Nam Cao <namcao@linutronix.de> wrote: > > #define SPI_TRANS_FAIL_NO_START BIT(0) > > +#define SPI_TRANS_FAIL_IO BIT(1) > > Is it obvious from context when these flags get set? > from transfer_one() and in which flag field? > > Otherwise maybe we should add a comment. Agree that the purpose of this flag is not clear. I will add some description in v2. Best regards, Nam
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 8ead7acb99f3..a4b8c07c5951 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -1361,6 +1361,9 @@ static int spi_transfer_wait(struct spi_controller *ctlr, "SPI transfer timed out\n"); return -ETIMEDOUT; } + + if (xfer->error & SPI_TRANS_FAIL_IO) + return -EIO; } return 0; diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 7b4baff63c5c..ddadae2e1ead 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -1040,6 +1040,7 @@ struct spi_transfer { unsigned len; #define SPI_TRANS_FAIL_NO_START BIT(0) +#define SPI_TRANS_FAIL_IO BIT(1) u16 error; dma_addr_t tx_dma;
The default message transfer implementation - spi_transfer_one_message - invokes the specific device driver's transfer_one(), then waits for completion. However, there is no mechanism for the device driver to report failure in the middle of the transfer. Introduce SPI_TRANS_FAIL_IO for drivers to report transfer failure. Signed-off-by: Nam Cao <namcao@linutronix.de> --- drivers/spi/spi.c | 3 +++ include/linux/spi/spi.h | 1 + 2 files changed, 4 insertions(+)