• Geert Uytterhoeven's avatar
    serial: sh-sci: Get rid of the workqueue to handle receive DMA requests · 67f462b0
    Geert Uytterhoeven authored
    The receive DMA workqueue function work_fn_rx() handles two things:
      1. Reception of a full buffer on completion of a receive DMA request,
      2. Reception of a partial buffer on receive DMA time-out.
    The workqueue is kicked by both the receive DMA completion handler, and
    by a timer to handle DMA time-out.
    
    As there are always two receive DMA requests active, it's possible that
    the receive DMA completion handler is called a second time before the
    workqueue function runs.
    
    As the time-out handler re-enables the receive interrupt, an interrupt
    may come in before time-out has been fully handled.
    
    Move part 1 into the receive DMA completion handler, and move part 2
    into the receive DMA time-out handler, to fix these race conditions.
    Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    67f462b0
sh-sci.c 64.5 KB