On Mon, 17 Dec 2007 13:17:01 +0100 Haavard Skinnemoen <hskinnemoen@xxxxxxxxx> wrote: > > 3) NEW: optional: add-atmel-serial-dma.patch, this merged the DMA > > code (from Chip Coldwell) in your 2.6.23 patch back on top of this > > series. Because the AT32 bug is not been fixed for a very long time, I > > do not expect it to be fixed soon, so I think a reordering is better > > to make preempt-RT work on AT91. > > I'll give it a shot, but first I have some comments on your other > patches. I found a bug. The RX DMA buffer isn't invalidated before it's handed over to the hardware. With the below patch, it seems to behave a lot better on AVR32, but it still does funny things now and then (it seems to dump a good chunk of stale TX data before rebooting), and magic sysrq doesn't work. I think I've spotted other potential races in the DMA code as well, but they look a bit more difficult to hunt down. I'll give it another try tomorrow. Haavard From: Haavard Skinnemoen <hskinnemoen@xxxxxxxxx> Subject: [PATCH] atmel_serial: Sync DMA RX buffer after copying from it Calling dma_sync_single_for_cpu() before reading the buffer isn't enough. We need to call dma_sync_single_for_device() after we're done reading as well. Signed-off-by: Haavard Skinnemoen <hskinnemoen@xxxxxxxxx> --- drivers/serial/atmel_serial.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/drivers/serial/atmel_serial.c b/drivers/serial/atmel_serial.c index 0610ad9..e23a3ba 100644 --- a/drivers/serial/atmel_serial.c +++ b/drivers/serial/atmel_serial.c @@ -391,6 +391,8 @@ static void atmel_pdc_endrx(struct uart_port *port) tty_insert_flip_string(tty, pdc->buf + pdc->ofs, count); tty_flip_buffer_push(tty); + dma_sync_single_for_device(port->dev, pdc->dma_addr, + pdc->dma_size, DMA_FROM_DEVICE); port->icount.rx += count; } @@ -425,6 +427,8 @@ static void atmel_pdc_timeout(struct uart_port *port) tty_insert_flip_string(tty, pdc->buf + pdc->ofs, count); tty_flip_buffer_push(tty); + dma_sync_single_for_device(port->dev, pdc->dma_addr, + pdc->dma_size, DMA_FROM_DEVICE); pdc->ofs = ofs; port->icount.rx += count; } -- 1.5.3.4 - To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html