Skip to content

Commit dbac5d0

Browse files
liubiingregkh
authored andcommitted
usb: musb: host: don't start next rx urb if current one failed
urb->status is set when endpoint csr RXSTALL, H_ERROR, DATAERROR or INCOMPRX bit is set. Those bits mean a broken pipe, so don't start next urb when any of these bits is set by checking urb->status. To minimize the risk of regression, only do so for RX, until we have a test case to understand the behavior of TX. The patch fixes system freeze issue caused by repeatedly invoking RX ISR while removing a usb uart device connected to a hub, in which case the hub has no chance to report the disconnect event due to the kernel is busy in processing the RX interrupt flooding. Fix checkpatch complaint (qh != NULL) as while. Reported-by: Max Uvarov <[email protected]> Tested-by: Yegor Yefremov <[email protected]> Signed-off-by: Bin Liu <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent b580121 commit dbac5d0

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

drivers/usb/musb/musb_host.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,13 @@ static void musb_advance_schedule(struct musb *musb, struct urb *urb,
434434
}
435435
}
436436

437-
if (qh != NULL && qh->is_ready) {
437+
/*
438+
* The pipe must be broken if current urb->status is set, so don't
439+
* start next urb.
440+
* TODO: to minimize the risk of regression, only check urb->status
441+
* for RX, until we have a test case to understand the behavior of TX.
442+
*/
443+
if ((!status || !is_in) && qh && qh->is_ready) {
438444
dev_dbg(musb->controller, "... next ep%d %cX urb %p\n",
439445
hw_ep->epnum, is_in ? 'R' : 'T', next_urb(qh));
440446
musb_start_urb(musb, is_in, qh);

0 commit comments

Comments
 (0)