• C
    tty/serial: at91: fix rx ring buffer management · 66f37aaf
    Cyrille Pitchen 提交于
    This patch swaps the use "tail" and "head" to fit the semantic of the linux
    circular buffer documentation:
    - head: the point at which the producer (the DMA controller) inserts items.
    - tail: the point at which the consumer (the serial framework) finds the next
            item.
    
    Besides the former code of the rx ring buffer didn't manage the case where
    head < tail, which might lead to loss of data. To fix this bug the data are now
    sent from the DMA buffer to the serial framework in two steps:
    1 - First, we test if head < tail. If so, we copy the data from tail to the end
        of the DMA buffer then reset tail to zero.
    2 - Finally, we copy data from tail to head then set tail to head.
    
    In addition, since tty_insert_flip_string() may now be called twice,
    atmel_flip_buffer_rx_dma() becomes less efficient than moving the calls
    dma_sync_sg_for_cpu(), dma_sync_sg_for_device(), tty_insert_flip_string() and
    tty_flip_buffer_push() directly into atmel_rx_from_dma().
    Signed-off-by: NCyrille Pitchen <cyrille.pitchen@atmel.com>
    Acked-by: NNicolas Ferre <nicolas.ferre@atmel.com>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    66f37aaf
atmel_serial.c 67.5 KB