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

Commit 98cae42d authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman
Browse files

EHCI: use the isochronous scheduling threshold



This patch (as1609) changes the way ehci-hcd uses the "Isochronous
Scheduling Threshold" in its calculations.  Until now the code has
ignored the threshold except for certain Intel PCI-based controllers.
This violates the EHCI spec.

The new code takes the threshold into account always, removing the
need for the fs_i_thresh quirk flag.  In addition it implements the
"full frame cache" setting more efficiently, moving forward only as
far as the next frame boundary instead of always moving forward 8
microframes.

Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c3ee9b76
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -503,7 +503,7 @@ static int ehci_init(struct usb_hcd *hcd)

	/* controllers may cache some of the periodic schedule ... */
	if (HCC_ISOC_CACHE(hcc_params))		// full frame cache
		ehci->i_thresh = 2 + 8;
		ehci->i_thresh = 0;
	else					// N microframes cached
		ehci->i_thresh = 2 + HCC_ISOC_THRES(hcc_params);

+0 −1
Original line number Diff line number Diff line
@@ -103,7 +103,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
		}
		break;
	case PCI_VENDOR_ID_INTEL:
		ehci->fs_i_thresh = 1;
		if (pdev->device == PCI_DEVICE_ID_INTEL_CE4100_USB)
			hcd->has_tt = 1;
		break;
+4 −8
Original line number Diff line number Diff line
@@ -1391,15 +1391,11 @@ iso_stream_schedule (
	 */
	if (likely (!list_empty (&stream->td_list))) {

		/* For high speed devices, allow scheduling within the
		 * isochronous scheduling threshold.  For full speed devices
		 * and Intel PCI-based controllers, don't (work around for
		 * Intel ICH9 bug).
		 */
		if (!stream->highspeed && ehci->fs_i_thresh)
			next = now + ehci->i_thresh;
		/* Take the isochronous scheduling threshold into account */
		if (ehci->i_thresh)
			next = now + ehci->i_thresh;	/* uframe cache */
		else
			next = now;
			next = (now + 2 + 7) & ~0x07;	/* full frame cache */

		/*
		 * Use ehci->last_iso_frame as the base.  There can't be any
+0 −1
Original line number Diff line number Diff line
@@ -193,7 +193,6 @@ struct ehci_hcd { /* one per controller */
	unsigned		has_amcc_usb23:1;
	unsigned		need_io_watchdog:1;
	unsigned		amd_pll_fix:1;
	unsigned		fs_i_thresh:1;	/* Intel iso scheduling */
	unsigned		use_dummy_qh:1;	/* AMD Frame List table quirk*/
	unsigned		has_synopsys_hc_bug:1; /* Synopsys HC */
	unsigned		frame_index_bug:1; /* MosChip (AKA NetMos) */