Commit 1b967691 authored by Bin Liu's avatar Bin Liu Committed by Greg Kroah-Hartman

usb: musb: return -ESHUTDOWN in urb when three-strikes error happened

When a USB device attached to a hub got disconnected, MUSB controller
generates RXCSR_RX_ERROR interrupt for the 3-strikes-out error.

Currently the MUSB host driver returns -EPROTO in current URB, then the
USB device driver could immediately resubmit the URB which causes MUSB
generate RXCSR_RX_ERROR interrupt again. This circle causes interrupt
storm then the hub never got a chance to report the USB device detach.

To fix the interrupt storm, change the URB return code to -ESHUTDOWN for
MUSB_RXCSR_H_ERROR interrupt, so that the USB device driver will not
immediately resubmit the URB.
Signed-off-by: default avatarBin Liu <b-liu@ti.com>
Link: https://lore.kernel.org/r/20200525025049.3400-2-b-liu@ti.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ca681aa4
...@@ -1774,9 +1774,15 @@ void musb_host_rx(struct musb *musb, u8 epnum) ...@@ -1774,9 +1774,15 @@ void musb_host_rx(struct musb *musb, u8 epnum)
status = -EPIPE; status = -EPIPE;
} else if (rx_csr & MUSB_RXCSR_H_ERROR) { } else if (rx_csr & MUSB_RXCSR_H_ERROR) {
musb_dbg(musb, "end %d RX proto error", epnum); dev_err(musb->controller, "ep%d RX three-strikes error", epnum);
status = -EPROTO; /*
* The three-strikes error could only happen when the USB
* device is not accessible, for example detached or powered
* off. So return the fatal error -ESHUTDOWN so hopefully the
* USB device drivers won't immediately resubmit the same URB.
*/
status = -ESHUTDOWN;
musb_writeb(epio, MUSB_RXINTERVAL, 0); musb_writeb(epio, MUSB_RXINTERVAL, 0);
rx_csr &= ~MUSB_RXCSR_H_ERROR; rx_csr &= ~MUSB_RXCSR_H_ERROR;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment