| From d80e39aff45a300aca4542e67f2c4cd587066fb2 Mon Sep 17 00:00:00 2001 |
| From: Chris Lesiak <chris.lesiak@licor.com> |
| Date: Thu, 7 Mar 2019 20:39:00 +0000 |
| Subject: spi: Fix zero length xfer bug |
| |
| [ Upstream commit 5442dcaa0d90fc376bdfc179a018931a8f43dea4 ] |
| |
| This fixes a bug for messages containing both zero length and |
| unidirectional xfers. |
| |
| The function spi_map_msg will allocate dummy tx and/or rx buffers |
| for use with unidirectional transfers when the hardware can only do |
| a bidirectional transfer. That dummy buffer will be used in place |
| of a NULL buffer even when the xfer length is 0. |
| |
| Then in the function __spi_map_msg, if he hardware can dma, |
| the zero length xfer will have spi_map_buf called on the dummy |
| buffer. |
| |
| Eventually, __sg_alloc_table is called and returns -EINVAL |
| because nents == 0. |
| |
| This fix prevents the error by not using the dummy buffer when |
| the xfer length is zero. |
| |
| Signed-off-by: Chris Lesiak <chris.lesiak@licor.com> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/spi/spi.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c |
| index 6cb72287eac82..a83fcddf1dadc 100644 |
| --- a/drivers/spi/spi.c |
| +++ b/drivers/spi/spi.c |
| @@ -1041,6 +1041,8 @@ static int spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg) |
| if (max_tx || max_rx) { |
| list_for_each_entry(xfer, &msg->transfers, |
| transfer_list) { |
| + if (!xfer->len) |
| + continue; |
| if (!xfer->tx_buf) |
| xfer->tx_buf = ctlr->dummy_tx; |
| if (!xfer->rx_buf) |
| -- |
| 2.20.1 |
| |