iio: buffer-dmaengine: adjust `bytes_used` with residue info
authorAlexandru Ardelean <alexandru.ardelean@analog.com>
Wed, 26 Aug 2020 05:20:11 +0000 (07:20 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Thu, 3 Sep 2020 18:40:58 +0000 (19:40 +0100)
A transfer may fall shorter than the bytes in the block.
This information is available in the residue from the DMA engine, so we can
compute actual `bytes_used` with that by subtracting the residue.

Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Link: https://lore.kernel.org/r/20200826052011.13348-1-lars@metafoo.de
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/buffer/industrialio-buffer-dmaengine.c

index 6dedf12..5789bda 100644 (file)
@@ -45,7 +45,8 @@ static struct dmaengine_buffer *iio_buffer_to_dmaengine_buffer(
        return container_of(buffer, struct dmaengine_buffer, queue.buffer);
 }
 
-static void iio_dmaengine_buffer_block_done(void *data)
+static void iio_dmaengine_buffer_block_done(void *data,
+               const struct dmaengine_result *result)
 {
        struct iio_dma_buffer_block *block = data;
        unsigned long flags;
@@ -53,6 +54,7 @@ static void iio_dmaengine_buffer_block_done(void *data)
        spin_lock_irqsave(&block->queue->list_lock, flags);
        list_del(&block->head);
        spin_unlock_irqrestore(&block->queue->list_lock, flags);
+       block->bytes_used -= result->residue;
        iio_dma_buffer_block_done(block);
 }
 
@@ -74,7 +76,7 @@ static int iio_dmaengine_buffer_submit_block(struct iio_dma_buffer_queue *queue,
        if (!desc)
                return -ENOMEM;
 
-       desc->callback = iio_dmaengine_buffer_block_done;
+       desc->callback_result = iio_dmaengine_buffer_block_done;
        desc->callback_param = block;
 
        cookie = dmaengine_submit(desc);