lkml.org 
[lkml]   [2016]   [Sep]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.7 121/143] dmaengine: usb-dmac: check CHCR.DE bit in usb_dmac_isr_channel()
    Date
    4.7-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>

    commit 626d2f07de89bf6be3d7301524d0ab3375b81b9c upstream.

    The USB-DMAC's interruption happens even if the CHCR.DE is not set to 1
    because CHCR.NULLE is set to 1. So, this driver should call
    usb_dmac_isr_transfer_end() if the DE bit is set to 1 only. Otherwise,
    the desc is possible to be NULL in the usb_dmac_isr_transfer_end().

    Fixes: 0c1c8ff32fa2 ("dmaengine: usb-dmac: Add Renesas USB DMA Controller (USB-DMAC) driver)
    Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    Signed-off-by: Vinod Koul <vinod.koul@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/dma/sh/usb-dmac.c | 19 +++++++++++--------
    1 file changed, 11 insertions(+), 8 deletions(-)

    --- a/drivers/dma/sh/usb-dmac.c
    +++ b/drivers/dma/sh/usb-dmac.c
    @@ -600,27 +600,30 @@ static irqreturn_t usb_dmac_isr_channel(
    {
    struct usb_dmac_chan *chan = dev;
    irqreturn_t ret = IRQ_NONE;
    - u32 mask = USB_DMACHCR_TE;
    - u32 check_bits = USB_DMACHCR_TE | USB_DMACHCR_SP;
    + u32 mask = 0;
    u32 chcr;
    + bool xfer_end = false;

    spin_lock(&chan->vc.lock);

    chcr = usb_dmac_chan_read(chan, USB_DMACHCR);
    - if (chcr & check_bits)
    - mask |= USB_DMACHCR_DE | check_bits;
    + if (chcr & (USB_DMACHCR_TE | USB_DMACHCR_SP)) {
    + mask |= USB_DMACHCR_DE | USB_DMACHCR_TE | USB_DMACHCR_SP;
    + if (chcr & USB_DMACHCR_DE)
    + xfer_end = true;
    + ret |= IRQ_HANDLED;
    + }
    if (chcr & USB_DMACHCR_NULL) {
    /* An interruption of TE will happen after we set FTE */
    mask |= USB_DMACHCR_NULL;
    chcr |= USB_DMACHCR_FTE;
    ret |= IRQ_HANDLED;
    }
    - usb_dmac_chan_write(chan, USB_DMACHCR, chcr & ~mask);
    + if (mask)
    + usb_dmac_chan_write(chan, USB_DMACHCR, chcr & ~mask);

    - if (chcr & check_bits) {
    + if (xfer_end)
    usb_dmac_isr_transfer_end(chan);
    - ret |= IRQ_HANDLED;
    - }

    spin_unlock(&chan->vc.lock);


    \
     
     \ /
      Last update: 2016-09-17 09:58    [W:4.148 / U:0.332 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site