Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d0852299 authored by David Brownell's avatar David Brownell Committed by Greg Kroah-Hartman
Browse files

[PATCH] USB: EHCI unlink tweaks



This patch modifies the behavior of the EHCI driver in an unlink path
that seems to be causing various issues on some systems.  Those problems
have included issues with disconnection, driver unbinding, and similar
cases where urb unlinking would just not work right.

This patch should help avoid those problems by not turning off the async
(control/bulk) schedule until it's not expecting an "async advance" IRQ,
which comes from the processing passing the schedule head.  Whether the
driver attempts to do such things is dependent on system timings, so
many folk would never have seen these problems.

Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent d5fb7f1b
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -1022,12 +1022,14 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
	/* stop async schedule right now? */
	/* stop async schedule right now? */
	if (unlikely (qh == ehci->async)) {
	if (unlikely (qh == ehci->async)) {
		/* can't get here without STS_ASS set */
		/* can't get here without STS_ASS set */
		if (ehci_to_hcd(ehci)->state != HC_STATE_HALT) {
		if (ehci_to_hcd(ehci)->state != HC_STATE_HALT
				&& !ehci->reclaim) {
			/* ... and CMD_IAAD clear */
			writel (cmd & ~CMD_ASE, &ehci->regs->command);
			writel (cmd & ~CMD_ASE, &ehci->regs->command);
			wmb ();
			wmb ();
			// handshake later, if we need to
			// handshake later, if we need to
		}
			timer_action_done (ehci, TIMER_ASYNC_OFF);
			timer_action_done (ehci, TIMER_ASYNC_OFF);
		}
		return;
		return;
	} 
	}