lkml.org 
[lkml]   [2016]   [Feb]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRE: [PATCH 3.12 105/123] usb: musb: cppi41: improve rx channel abort routine
    Date
    Hi Jiri,

    > -----Original Message-----
    > From: Jiri Slaby [mailto:jslaby@suse.cz]
    > Sent: Wednesday, October 28, 2015 8:54 AM
    > To: stable@vger.kernel.org
    > Cc: linux-kernel@vger.kernel.org; Liu, Bin; Balbi, Felipe; Oliver Neukum; Jiri
    > Slaby
    > Subject: [PATCH 3.12 105/123] usb: musb: cppi41: improve rx channel abort
    > routine
    >
    > From: Bin Liu <b-liu@ti.com>
    >
    > 3.12-stable review patch. If anyone has any objections, please let me know.

    It seems this backport missing the dependency 0149b07 upstream (usb: musb:
    cppi41: correct the macro name EP_MODE_AUTOREG_*), which causes the micro
    name mismatch.

    Sorry for the late response, I just received the regression report.

    Thanks,
    -Bin.

    >
    > ===============
    >
    > commit cb83df77f3ec151d68a1b6be957207e6fc7b7f50 upstream.
    >
    > 1. set AUTOREQ to NONE at the beginning of teardown;
    >
    > 2. add delay for dma pipeline to drain;
    >
    > 3. Do not set USB_TDOWN bit for RX teardown.
    >
    > The CPPI hw has an issue that when tearing down a RX channel, if
    > another RX channel is receiving data, the CPPI will lockup.
    >
    > To workaround the issue, do not set the CPPI TD bit. The steps before
    > this point ensures the CPPI channel will be torn down properly.
    >
    > Signed-off-by: Bin Liu <b-liu@ti.com>
    > Signed-off-by: Felipe Balbi <balbi@ti.com>
    > Cc: Oliver Neukum <ONeukum@suse.com>
    > Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    > ---
    > drivers/usb/musb/musb_cppi41.c | 12 +++++++++---
    > 1 file changed, 9 insertions(+), 3 deletions(-)
    >
    > diff --git a/drivers/usb/musb/musb_cppi41.c
    > b/drivers/usb/musb/musb_cppi41.c index 77b475a43dad..1c9c626248fd 100644
    > --- a/drivers/usb/musb/musb_cppi41.c
    > +++ b/drivers/usb/musb/musb_cppi41.c
    > @@ -507,10 +507,15 @@ static int cppi41_dma_channel_abort(struct
    > dma_channel *channel)
    > csr &= ~MUSB_TXCSR_DMAENAB;
    > musb_writew(epio, MUSB_TXCSR, csr);
    > } else {
    > + cppi41_set_autoreq_mode(cppi41_channel,
    > EP_MODE_AUTOREQ_NONE);
    > +
    > csr = musb_readw(epio, MUSB_RXCSR);
    > csr &= ~(MUSB_RXCSR_H_REQPKT | MUSB_RXCSR_DMAENAB);
    > musb_writew(epio, MUSB_RXCSR, csr);
    >
    > + /* wait to drain cppi dma pipe line */
    > + udelay(50);
    > +
    > csr = musb_readw(epio, MUSB_RXCSR);
    > if (csr & MUSB_RXCSR_RXPKTRDY) {
    > csr |= MUSB_RXCSR_FLUSHFIFO;
    > @@ -524,13 +529,14 @@ static int cppi41_dma_channel_abort(struct
    > dma_channel *channel)
    > tdbit <<= 16;
    >
    > do {
    > - musb_writel(musb->ctrl_base, USB_TDOWN, tdbit);
    > + if (is_tx)
    > + musb_writel(musb->ctrl_base, USB_TDOWN, tdbit);
    > ret = dmaengine_terminate_all(cppi41_channel->dc);
    > } while (ret == -EAGAIN);
    >
    > - musb_writel(musb->ctrl_base, USB_TDOWN, tdbit);
    > -
    > if (is_tx) {
    > + musb_writel(musb->ctrl_base, USB_TDOWN, tdbit);
    > +
    > csr = musb_readw(epio, MUSB_TXCSR);
    > if (csr & MUSB_TXCSR_TXPKTRDY) {
    > csr |= MUSB_TXCSR_FLUSHFIFO;
    > --
    > 2.6.2

    \
     
     \ /
      Last update: 2016-02-29 16:41    [W:4.148 / U:0.348 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site