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(+)
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;
--
2.39.2
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
© 2016 - 2025 Red Hat, Inc.