• Erwan Le Ray's avatar
    serial: stm32: rework RX over DMA · 33bb2f6a
    Erwan Le Ray authored
    This patch reworks RX support over DMA to improve reliability:
    - change dma buffer cyclic configuration by using 2 periods. DMA buffer
    data are handled by a flip-flop between the 2 periods in order to avoid
    risk of data loss/corruption
    - change the size of dma buffer to 4096 to limit overruns
    - add rx errors management (breaks, parity, framing and overrun).
      When an error occurs on the uart line, the dma request line is masked at
      HW level. The SW must 1st clear DMAR (dma request line enable), to
      handle the error, then re-enable DMAR to recover. So, any correct data
      is taken from the DMA buffer, before handling the error itself. Then
      errors are handled from RDR/ISR/FIFO (e.g. in PIO mode). Last, DMA
      reception is resumed.
    - add a condition on DMA request line in DMA RX routines in order to
    switch to PIO mode when no DMA request line is disabled, even if the DMA
    channel is still enabled.
      When the UART is wakeup source and is configured to use DMA for RX, any
      incoming data that wakes up the system isn't correctly received.
      At data reception, the irq_handler handles the WUF irq, and then the
      data reception over DMA.
      As the DMA transfer has been terminated at suspend, and will be restored
      by resume callback (which has no yet been called by system), the data
      can't be received.
      The wake-up data has to be handled in PIO mode while suspend callback
      has not been called.
    Signed-off-by: default avatarValentin Caron <valentin.caron@foss.st.com>
    Signed-off-by: default avatarErwan Le Ray <erwan.leray@foss.st.com>
    Link: https://lore.kernel.org/r/20211020150332.10214-3-erwan.leray@foss.st.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    33bb2f6a
stm32-usart.c 47.6 KB