Report amount of pending data when a transfer stops due to errors.

Report if DMA was used to transfer data and print the status code.

Signed-off-by: Łukasz Stelmach <[email protected]>
---
 drivers/spi/spi-s3c64xx.c | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c
index 22bf8c75580a..3364d362ed21 100644
--- a/drivers/spi/spi-s3c64xx.c
+++ b/drivers/spi/spi-s3c64xx.c
@@ -122,6 +122,7 @@
 
 struct s3c64xx_spi_dma_data {
        struct dma_chan *ch;
+       dma_cookie_t cookie;
        enum dma_transfer_direction direction;
 };
 
@@ -304,7 +305,7 @@ static void prepare_dma(struct s3c64xx_spi_dma_data *dma,
        desc->callback = s3c64xx_spi_dmacb;
        desc->callback_param = dma;
 
-       dmaengine_submit(desc);
+       dma->cookie = dmaengine_submit(desc);
        dma_async_issue_pending(dma->ch);
 }
 
@@ -699,17 +700,28 @@ static int s3c64xx_spi_transfer_one(struct spi_master 
*master,
 
                if (status) {
                        dev_err(&spi->dev,
-                               "I/O Error: rx-%d tx-%d res:rx-%c tx-%c 
len-%d\n",
+                               "I/O Error: rx-%d tx-%d rx-%c tx-%c len-%d 
dma-%d res-(%d)\n",
                                xfer->rx_buf ? 1 : 0, xfer->tx_buf ? 1 : 0,
                                (sdd->state & RXBUSY) ? 'f' : 'p',
                                (sdd->state & TXBUSY) ? 'f' : 'p',
-                               xfer->len);
+                               xfer->len, use_dma ? 1 : 0, status);
 
                        if (use_dma) {
-                               if (xfer->tx_buf && (sdd->state & TXBUSY))
+                               struct dma_tx_state s;
+
+                               if (xfer->tx_buf && (sdd->state & TXBUSY)) {
+                                       dmaengine_pause(sdd->tx_dma.ch);
+                                       dmaengine_tx_status(sdd->tx_dma.ch, 
sdd->tx_dma.cookie, &s);
                                        dmaengine_terminate_all(sdd->tx_dma.ch);
-                               if (xfer->rx_buf && (sdd->state & RXBUSY))
+                                       dev_err(&spi->dev, "TX residue: %d\n", 
s.residue);
+
+                               }
+                               if (xfer->rx_buf && (sdd->state & RXBUSY)) {
+                                       dmaengine_pause(sdd->rx_dma.ch);
+                                       dmaengine_tx_status(sdd->rx_dma.ch, 
sdd->rx_dma.cookie, &s);
                                        dmaengine_terminate_all(sdd->rx_dma.ch);
+                                       dev_err(&spi->dev, "RX residue: %d\n", 
s.residue);
+                               }
                        }
                } else {
                        s3c64xx_flush_fifo(sdd);
-- 
2.26.2

Reply via email to