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: Bin Liu <b-liu@ti.com> Link: https://lore.kernel.org/r/20200525025049.3400-2-b-liu@ti.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
ca681aa492
Коммит
1b967691ec
|
@ -1774,9 +1774,15 @@ void musb_host_rx(struct musb *musb, u8 epnum)
|
|||
status = -EPIPE;
|
||||
|
||||
} 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);
|
||||
|
||||
rx_csr &= ~MUSB_RXCSR_H_ERROR;
|
||||
|
|
Загрузка…
Ссылка в новой задаче