Hi Jiri, > -----Original Message----- > From: Jiri Slaby [mailto:jslaby@xxxxxxx] > Sent: Wednesday, October 28, 2015 8:54 AM > To: stable@xxxxxxxxxxxxxxx > Cc: linux-kernel@xxxxxxxxxxxxxxx; 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@xxxxxx> > > 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@xxxxxx> > Signed-off-by: Felipe Balbi <balbi@xxxxxx> > Cc: Oliver Neukum <ONeukum@xxxxxxxx> > Signed-off-by: Jiri Slaby <jslaby@xxxxxxx> > --- > 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 -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html