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

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

USB: ehci: minor ISO updates, always support split ISO



Small updates to the EHCI driver's ISO support:

 - Get rid of the Kconfig option for full speed ISO.  It may
   not be perfect yet, but it hasn't appeared to be dangerous
   and pretty much every configuration wants it.

 - Instead of two places to disable an empty periodic schedule
   after an ISO transfer completes, just have one.

 - After the periodic schedule is disabled, we can short-circuit
   the schedule scan ... it can't possibly have more work to do.

Assuming a typical config with split iso enabled, the only change
in behavior should be almost unobservable:  quicker termination
of periodic scans when the schedule gets emptied.

Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 3b6fcfd0
Loading
Loading
Loading
Loading
+0 −9
Original line number Diff line number Diff line
@@ -29,15 +29,6 @@ config USB_EHCI_HCD
	  To compile this driver as a module, choose M here: the
	  module will be called ehci-hcd.

config USB_EHCI_SPLIT_ISO
	bool "Full speed ISO transactions (EXPERIMENTAL)"
	depends on USB_EHCI_HCD && EXPERIMENTAL
	default n
	---help---
	  This code is new and hasn't been used with many different
	  EHCI or USB 2.0 transaction translator implementations.
	  It should work for ISO-OUT transfers, like audio.

config USB_EHCI_ROOT_HUB_TT
	bool "Root Hub Transaction Translators (EXPERIMENTAL)"
	depends on USB_EHCI_HCD && EXPERIMENTAL
+12 −35
Original line number Diff line number Diff line
@@ -1630,16 +1630,12 @@ itd_complete (
		BUG_ON (itd->urb == urb);
	 */

	/* give urb back to the driver ... can be out-of-order */
	/* give urb back to the driver; completion often (re)submits */
	dev = urb->dev;
	ehci_urb_done(ehci, urb, 0);
	retval = true;
	urb = NULL;

	/* defer stopping schedule; completion can submit */
	ehci->periodic_sched--;
	if (unlikely (!ehci->periodic_sched))
		(void) disable_periodic (ehci);
	ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;

	if (unlikely (list_empty (&stream->td_list))) {
@@ -1725,8 +1721,6 @@ static int itd_submit (struct ehci_hcd *ehci, struct urb *urb,
	return status;
}

#ifdef CONFIG_USB_EHCI_SPLIT_ISO

/*-------------------------------------------------------------------------*/

/*
@@ -2016,16 +2010,12 @@ sitd_complete (
		BUG_ON (sitd->urb == urb);
	 */

	/* give urb back to the driver */
	/* give urb back to the driver; completion often (re)submits */
	dev = urb->dev;
	ehci_urb_done(ehci, urb, 0);
	retval = true;
	urb = NULL;

	/* defer stopping schedule; completion can submit */
	ehci->periodic_sched--;
	if (!ehci->periodic_sched)
		(void) disable_periodic (ehci);
	ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;

	if (list_empty (&stream->td_list)) {
@@ -2108,26 +2098,6 @@ static int sitd_submit (struct ehci_hcd *ehci, struct urb *urb,
	return status;
}

#else

static inline int
sitd_submit (struct ehci_hcd *ehci, struct urb *urb, gfp_t mem_flags)
{
	ehci_dbg (ehci, "split iso support is disabled\n");
	return -ENOSYS;
}

static inline unsigned
sitd_complete (
	struct ehci_hcd		*ehci,
	struct ehci_sitd	*sitd
) {
	ehci_err (ehci, "sitd_complete %p?\n", sitd);
	return 0;
}

#endif /* USB_EHCI_SPLIT_ISO */

/*-------------------------------------------------------------------------*/

static void
@@ -2252,8 +2222,14 @@ scan_periodic (struct ehci_hcd *ehci)
			}

			/* assume completion callbacks modify the queue */
			if (unlikely (modified))
			if (unlikely (modified)) {
				if (likely(ehci->periodic_sched > 0))
					goto restart;
				/* maybe we can short-circuit this scan! */
				disable_periodic(ehci);
				now_uframe = clock;
				break;
			}
		}

		/* stop when we catch up to the HC */
@@ -2269,7 +2245,8 @@ scan_periodic (struct ehci_hcd *ehci)
		if (now_uframe == clock) {
			unsigned	now;

			if (!HC_IS_RUNNING (ehci_to_hcd(ehci)->state))
			if (!HC_IS_RUNNING (ehci_to_hcd(ehci)->state)
					|| ehci->periodic_sched == 0)
				break;
			ehci->next_uframe = now_uframe;
			now = ehci_readl(ehci, &ehci->regs->frame_index) % mod;