[PATCH 106/108] staging: comedi: addi_apci_3120: switch DMA buffers after writing samples

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Currently the DMA buffers are switched before writing the current samples to
the async buffer. This works but when the EOA event happens we end up with an
outstanding DMA operation in progress that gets terminated by the (*cancel).

Avoid the outstanding DMA operation by switching the DMA buffers after writing
the samples. The driver will detect the EOA event and not retart the DMA.

Signed-off-by: H Hartley Sweeten <hsweeten@xxxxxxxxxxxxxxxxxxx>
Cc: Ian Abbott <abbotti@xxxxxxxxx>
Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
 drivers/staging/comedi/drivers/addi_apci_3120.c | 17 +++++------------
 1 file changed, 5 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/comedi/drivers/addi_apci_3120.c b/drivers/staging/comedi/drivers/addi_apci_3120.c
index ea53694..ba96fe5 100644
--- a/drivers/staging/comedi/drivers/addi_apci_3120.c
+++ b/drivers/staging/comedi/drivers/addi_apci_3120.c
@@ -456,17 +456,8 @@ static void apci3120_interrupt_dma(struct comedi_device *dev,
 		async->events |= COMEDI_CB_ERROR;
 		return;
 	}
-	nsamples = comedi_bytes_to_samples(s, nbytes);
-
-	if (devpriv->use_double_buffer) {
-		struct apci3120_dmabuf *next_dmabuf;
-
-		next_dmabuf = &devpriv->dmabuf[!devpriv->cur_dmabuf];
-
-		/* start DMA on next buffer */
-		apci3120_init_dma(dev, next_dmabuf);
-	}
 
+	nsamples = comedi_bytes_to_samples(s, nbytes);
 	if (nsamples) {
 		comedi_buf_write_samples(s, dmabuf->virt, nsamples);
 
@@ -479,10 +470,12 @@ static void apci3120_interrupt_dma(struct comedi_device *dev,
 		return;
 
 	if (devpriv->use_double_buffer) {
-		/* switch dma buffers for next interrupt */
+		/* switch DMA buffers for next interrupt */
 		devpriv->cur_dmabuf = !devpriv->cur_dmabuf;
+		dmabuf = &devpriv->dmabuf[devpriv->cur_dmabuf];
+		apci3120_init_dma(dev, dmabuf);
 	} else {
-		/* restart DMA if is not using double buffering */
+		/* restart DMA if not using double buffering */
 		apci3120_init_dma(dev, dmabuf);
 	}
 }
-- 
2.0.3

_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel




[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux