Commit:     5a9a62bb035b1f74e7d017e3bd48d1c687d7de3c
Parent:     e88b34bade55a51dd23a50de0ac5076cbbb8f4fd
Author:     Haavard Skinnemoen <[EMAIL PROTECTED]>
AuthorDate: Fri Jun 1 00:47:00 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Fri Jun 1 08:18:29 2007 -0700

    atmel_spi dma address bugfix
    When either rx_buf or tx_buf is not being used, i.e.  for plain read- or
    write operations, the atmel_spi uses a fixed-size DMA buffer instead.  If
    the transfer is longer than the size of this buffer, it is split into
    multiple DMA transfers.
    When the transfer is split like this, the atmel_spi driver ends up using
    the same DMA address again and again even for the buffer that came from the
    user, which is of course wrong.  Fix this by adding the number of bytes
    already transferred to the DMA address so that the data ends up in the
    right place.
    Thanks to Wu Xuan for discovering this bug.
    Signed-off-by: Haavard Skinnemoen <[EMAIL PROTECTED]>
    Signed-off-by: David Brownell <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
 drivers/spi/atmel_spi.c |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c
index 1d8a2f6..8b2601d 100644
--- a/drivers/spi/atmel_spi.c
+++ b/drivers/spi/atmel_spi.c
@@ -113,16 +113,16 @@ static void atmel_spi_next_xfer(struct spi_master *master,
        len = as->remaining_bytes;
-       tx_dma = xfer->tx_dma;
-       rx_dma = xfer->rx_dma;
+       tx_dma = xfer->tx_dma + xfer->len - len;
+       rx_dma = xfer->rx_dma + xfer->len - len;
        /* use scratch buffer only when rx or tx data is unspecified */
-       if (rx_dma == INVALID_DMA_ADDRESS) {
+       if (!xfer->rx_buf) {
                rx_dma = as->buffer_dma;
                if (len > BUFFER_SIZE)
                        len = BUFFER_SIZE;
-       if (tx_dma == INVALID_DMA_ADDRESS) {
+       if (!xfer->tx_buf) {
                tx_dma = as->buffer_dma;
                if (len > BUFFER_SIZE)
                        len = BUFFER_SIZE;
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to