• Tomoya MORINAGA's avatar
    pch_uart: Fix DMA resource leak issue · 90f04c29
    Tomoya MORINAGA authored
    Changing UART mode PIO->DMA->PIO->DMA like below, pch_uart driver can't get
    DMA channel resource.
    
    setserial /dev/ttyPCH0 ^low_latency
    setserial /dev/ttyPCH0 low_latency
    
    CAUSE:
    Changing mode using setserial command, ".startup" function which gets DMA
    channel is called before ".verify_port" function which sets
    dma-flag(use_dma/use_dma_flag) as 1.
    
    PIO->DMA
      .startup: Since dma-flag is 0, DMA channel is not requested.
      .verify_port: dma-flag is set as 1.
      .shutdown: N/A
    
    DMA->PIO
      .startup: Since dma-flag is 1, DMA channel is requested.
      .verify_port: dma-flag is set as 0.
      .shutdown: Since dma-flag is 0, DMA channel is not released.
    
    This means DMA channel resource leak occurs.
    Next time, this driver can't get DMA channel resource forever.
    
    MODIFICATION:
      Currently, when release DMA channel resource, this driver checks dma-flag.
      However, this specification occurs the above issue.
      This driver must check whether dma_request_channel is executed or not.
      The values are saved in private data variable "chan_tx/chan_tx".
      These variables mean if the value is NULL, DMA channel is not requested,
      if not NULL, DMA channel is requested.
    
    This patch fixes the issue.
    Signed-off-by: default avatarTomoya MORINAGA <tomoya.rohm@gmail.com>
    Acked-by: default avatarAlan Cox <alan@linux.intel.com>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    90f04c29
pch_uart.c 40.5 KB