From 8971affbe1a40f5e37c4e530667b9a1f2f54fa06 Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Mon, 5 Dec 2011 01:46:49 +0000 Subject: [PATCH] USB: EHCI: fix HUB TT scheduling issue with iso transfer (Closes: #651015) svn path=/dists/sid/linux-2.6/; revision=18353 --- debian/changelog | 3 + ...ix-a-regression-in-the-ISO-scheduler.patch | 59 ++++++++++ ...-TT-scheduling-issue-with-iso-transf.patch | 106 ++++++++++++++++++ debian/patches/series/base | 2 + 4 files changed, 170 insertions(+) create mode 100644 debian/patches/bugfix/all/EHCI-Fix-a-regression-in-the-ISO-scheduler.patch create mode 100644 debian/patches/bugfix/all/USB-EHCI-fix-HUB-TT-scheduling-issue-with-iso-transf.patch diff --git a/debian/changelog b/debian/changelog index 61f339dcc..dbd7d9f8e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -6,6 +6,9 @@ linux-2.6 (3.1.4-2) UNRELEASED; urgency=low [ Hector Oron ] * regulator: backport fix for nullpointer dereference in core. + [ Ben Hutchings ] + * USB: EHCI: fix HUB TT scheduling issue with iso transfer (Closes: #651015) + -- Bastian Blank Thu, 01 Dec 2011 13:17:34 +0100 linux-2.6 (3.1.4-1) unstable; urgency=low diff --git a/debian/patches/bugfix/all/EHCI-Fix-a-regression-in-the-ISO-scheduler.patch b/debian/patches/bugfix/all/EHCI-Fix-a-regression-in-the-ISO-scheduler.patch new file mode 100644 index 000000000..12475c2c7 --- /dev/null +++ b/debian/patches/bugfix/all/EHCI-Fix-a-regression-in-the-ISO-scheduler.patch @@ -0,0 +1,59 @@ +From: Matthieu CASTET +Date: Mon, 28 Nov 2011 11:30:22 +0100 +Subject: [PATCH 2/2] EHCI : Fix a regression in the ISO scheduler + +commit e3420901eba65b1c46bed86d360e3a8685d20734 upstream. + +Fix a regression that was introduced by commit +811c926c538f7e8d3c08b630dd5844efd7e000f6 (USB: EHCI: fix HUB TT scheduling +issue with iso transfer). + +We detect an error if next == start, but this means uframe 0 can't be allocated +anymore for iso transfer... + +Reported-by: Sander Eikelenboom +Signed-off-by: Matthieu CASTET +Acked-by: Alan Stern +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/host/ehci-sched.c | 9 +++++---- + 1 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c +index 56a3203..a60679c 100644 +--- a/drivers/usb/host/ehci-sched.c ++++ b/drivers/usb/host/ehci-sched.c +@@ -1475,6 +1475,7 @@ iso_stream_schedule ( + * jump until after the queue is primed. + */ + else { ++ int done = 0; + start = SCHEDULE_SLOP + (now & ~0x07); + + /* NOTE: assumes URB_ISO_ASAP, to limit complexity/bugs */ +@@ -1492,18 +1493,18 @@ iso_stream_schedule ( + if (stream->highspeed) { + if (itd_slot_ok(ehci, mod, start, + stream->usecs, period)) +- break; ++ done = 1; + } else { + if ((start % 8) >= 6) + continue; + if (sitd_slot_ok(ehci, mod, stream, + start, sched, period)) +- break; ++ done = 1; + } +- } while (start > next); ++ } while (start > next && !done); + + /* no room in the schedule */ +- if (start == next) { ++ if (!done) { + ehci_dbg(ehci, "iso resched full %p (now %d max %d)\n", + urb, now, now + mod); + status = -ENOSPC; +-- +1.7.7.3 + diff --git a/debian/patches/bugfix/all/USB-EHCI-fix-HUB-TT-scheduling-issue-with-iso-transf.patch b/debian/patches/bugfix/all/USB-EHCI-fix-HUB-TT-scheduling-issue-with-iso-transf.patch new file mode 100644 index 000000000..2796b624d --- /dev/null +++ b/debian/patches/bugfix/all/USB-EHCI-fix-HUB-TT-scheduling-issue-with-iso-transf.patch @@ -0,0 +1,106 @@ +From: Thomas Poussevin +Date: Thu, 27 Oct 2011 18:46:48 +0200 +Subject: [PATCH 1/2] USB: EHCI: fix HUB TT scheduling issue with iso transfer + +commit 811c926c538f7e8d3c08b630dd5844efd7e000f6 upstream. + +The current TT scheduling doesn't allow to play and then record on a +full-speed device connected to a high speed hub. + +The IN iso stream can only start on the first uframe (0-2 for a 165 us) +because of CSPLIT transactions. +For the OUT iso stream there no such restriction. uframe 0-5 are possible. + +The idea of this patch is that the first uframe are precious (for IN TT iso +stream) and we should allocate the last uframes first if possible. + +For that we reverse the order of uframe allocation (last uframe first). + +Here an example : + +hid interrupt stream +---------------------------------------------------------------------- +uframe | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +---------------------------------------------------------------------- +max_tt_usecs | 125 | 125 | 125 | 125 | 125 | 125 | 30 | 0 | +---------------------------------------------------------------------- +used usecs on a frame | 13 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------- + +iso OUT stream +---------------------------------------------------------------------- +uframe | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +---------------------------------------------------------------------- +max_tt_usecs | 125 | 125 | 125 | 125 | 125 | 125 | 30 | 0 | +---------------------------------------------------------------------- +used usecs on a frame | 13 | 125 | 39 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------- + +There no place for iso IN stream (uframe 0-2 are used) and we got "cannot +submit datapipe for urb 0, error -28: not enough bandwidth" error. + +With the patch this become. + +iso OUT stream +---------------------------------------------------------------------- +uframe | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +---------------------------------------------------------------------- +max_tt_usecs | 125 | 125 | 125 | 125 | 125 | 125 | 30 | 0 | +---------------------------------------------------------------------- +used usecs on a frame | 13 | 0 | 0 | 0 | 125 | 39 | 0 | 0 | +---------------------------------------------------------------------- + +iso IN stream +---------------------------------------------------------------------- +uframe | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +---------------------------------------------------------------------- +max_tt_usecs | 125 | 125 | 125 | 125 | 125 | 125 | 30 | 0 | +---------------------------------------------------------------------- +used usecs on a frame | 13 | 0 | 125 | 40 | 125 | 39 | 0 | 0 | +---------------------------------------------------------------------- + +Signed-off-by: Matthieu Castet +Signed-off-by: Thomas Poussevin +Signed-off-by: Alan Stern +Cc: stable +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/host/ehci-sched.c | 15 ++++++++++----- + 1 files changed, 10 insertions(+), 5 deletions(-) + +diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c +index 2e829fa..56a3203 100644 +--- a/drivers/usb/host/ehci-sched.c ++++ b/drivers/usb/host/ehci-sched.c +@@ -1479,10 +1479,15 @@ iso_stream_schedule ( + + /* NOTE: assumes URB_ISO_ASAP, to limit complexity/bugs */ + +- /* find a uframe slot with enough bandwidth */ +- next = start + period; +- for (; start < next; start++) { +- ++ /* find a uframe slot with enough bandwidth. ++ * Early uframes are more precious because full-speed ++ * iso IN transfers can't use late uframes, ++ * and therefore they should be allocated last. ++ */ ++ next = start; ++ start += period; ++ do { ++ start--; + /* check schedule: enough space? */ + if (stream->highspeed) { + if (itd_slot_ok(ehci, mod, start, +@@ -1495,7 +1500,7 @@ iso_stream_schedule ( + start, sched, period)) + break; + } +- } ++ } while (start > next); + + /* no room in the schedule */ + if (start == next) { +-- +1.7.7.3 + diff --git a/debian/patches/series/base b/debian/patches/series/base index fe9d88efc..9c3ed61fc 100644 --- a/debian/patches/series/base +++ b/debian/patches/series/base @@ -80,3 +80,5 @@ + bugfix/all/0005-media-staging-lirc_serial-Do-not-assume-error-codes-.patch + features/all/topology-Provide-CPU-topology-in-sysfs-in-SMP-configura.patch ++ bugfix/all/USB-EHCI-fix-HUB-TT-scheduling-issue-with-iso-transf.patch ++ bugfix/all/EHCI-Fix-a-regression-in-the-ISO-scheduler.patch