diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/usb/musb/musb_host.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 327f39c8c174..d227a71d85e1 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
| @@ -992,9 +992,15 @@ static void musb_bulk_nak_timeout(struct musb *musb, struct musb_hw_ep *ep, | |||
| 992 | if (is_in) { | 992 | if (is_in) { |
| 993 | dma = is_dma_capable() ? ep->rx_channel : NULL; | 993 | dma = is_dma_capable() ? ep->rx_channel : NULL; |
| 994 | 994 | ||
| 995 | /* clear nak timeout bit */ | 995 | /* |
| 996 | * Need to stop the transaction by clearing REQPKT first | ||
| 997 | * then the NAK Timeout bit ref MUSBMHDRC USB 2.0 HIGH-SPEED | ||
| 998 | * DUAL-ROLE CONTROLLER Programmer's Guide, section 9.2.2 | ||
| 999 | */ | ||
| 996 | rx_csr = musb_readw(epio, MUSB_RXCSR); | 1000 | rx_csr = musb_readw(epio, MUSB_RXCSR); |
| 997 | rx_csr |= MUSB_RXCSR_H_WZC_BITS; | 1001 | rx_csr |= MUSB_RXCSR_H_WZC_BITS; |
| 1002 | rx_csr &= ~MUSB_RXCSR_H_REQPKT; | ||
| 1003 | musb_writew(epio, MUSB_RXCSR, rx_csr); | ||
| 998 | rx_csr &= ~MUSB_RXCSR_DATAERROR; | 1004 | rx_csr &= ~MUSB_RXCSR_DATAERROR; |
| 999 | musb_writew(epio, MUSB_RXCSR, rx_csr); | 1005 | musb_writew(epio, MUSB_RXCSR, rx_csr); |
| 1000 | 1006 | ||
