USB: EHCI: fix HUB TT scheduling issue with iso transfer (Closes: #651015)
svn path=/dists/sid/linux-2.6/; revision=18353
This commit is contained in:
parent
759fef5768
commit
8971affbe1
|
@ -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 <waldi@debian.org> Thu, 01 Dec 2011 13:17:34 +0100
|
||||
|
||||
linux-2.6 (3.1.4-1) unstable; urgency=low
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
From: Matthieu CASTET <castet.matthieu@free.fr>
|
||||
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 <linux@eikelenboom.it>
|
||||
Signed-off-by: Matthieu CASTET <castet.matthieu@free.fr>
|
||||
Acked-by: Alan Stern <stern@rowland.harvard.edu>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
---
|
||||
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
|
||||
|
106
debian/patches/bugfix/all/USB-EHCI-fix-HUB-TT-scheduling-issue-with-iso-transf.patch
vendored
Normal file
106
debian/patches/bugfix/all/USB-EHCI-fix-HUB-TT-scheduling-issue-with-iso-transf.patch
vendored
Normal file
|
@ -0,0 +1,106 @@
|
|||
From: Thomas Poussevin <thomas.poussevin@parrot.com>
|
||||
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 <matthieu.castet@parrot.com>
|
||||
Signed-off-by: Thomas Poussevin <thomas.poussevin@parrot.com>
|
||||
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
|
||||
Cc: stable <stable@vger.kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
---
|
||||
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
|
||||
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue