The requested patch is as follows: diff -Nru a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c --- a/drivers/usb/host/ehci-sched.c 2004-12-21 18:02:48.921708256 -0500 +++ b/drivers/usb/host/ehci-sched.c 2004-12-21 18:25:41.130100872 -0500 @@ -1796,6 +1796,7 @@ { unsigned frame, clock, now_uframe, mod; unsigned modified; + u8 uncompleted_td = 0; mod = ehci->periodic_size << 3; @@ -1874,8 +1875,10 @@ q = *q_p; break; } - if (uf != 8) + if (uf != 8) { + uncompleted_td = 1; break; + } /* this one's ready ... HC won't cache the * pointer for much longer, if at all. @@ -1894,6 +1897,7 @@ hw_p = &q.sitd- >hw_next; type = Q_NEXT_TYPE (q.sitd->hw_next); q = *q_p; + uncompleted_td = 1; break; } *q_p = q.sitd->sitd_next; @@ -1925,12 +1929,17 @@ // FIXME: likewise assumes HC doesn't halt mid-scan + /* We must start the next scan cycle at the first + * uncompleted TD so that TDs are not lost. + */ + if ((!uncompleted_td) && (HCD_IS_RUNNING (ehci->hcd.state))) + ehci->next_uframe = now_uframe; + if (now_uframe == clock) { unsigned now; if (!HCD_IS_RUNNING (ehci- >hcd.state)) break; - ehci->next_uframe = now_uframe; now = readl (&ehci->regs- >frame_index) % mod; if (now_uframe == now) break;
>-----Original Message----- >From: David Brownell [mailto:[EMAIL PROTECTED] >Sent: Friday, January 07, 2005 12:48 PM >To: linux-usb-devel@lists.sourceforge.net >Cc: Torsten Landschoff; Oliver Brandt; Craig Nadler >Subject: Re: [linux-usb-devel] Re: USB 1.1 Soundcard on USB 2.0 HUB > >On Friday 07 January 2005 4:23 am, Torsten Landschoff wrote: >> Hi Oliver, >> >> On Fri, Jan 07, 2005 at 12:37:26PM +0100, Oliver Brandt wrote: >> >> [USB Audio problems over USB 2.0 hub] >> >> > I've read that iso transfer and transaction translation have >> > something to do with it and that transaction translation is not >> > fully implemented yet (I'm using kernel 2.6.10). Are there any >> > patches available I should use? >> >> Actually the problem AFAIU is that the audio device is managed by a >> transaction translator in the hub. Therefore isochronous data transfer > >> at full speed gets more complicated. > >That bug's been there for a while, but not many folk have reported it. > >However, a couple weeks back Craig Nadler <[EMAIL PROTECTED]> >turned up what could be the root cause: > >>>> the scanning loop for the periodic list misses completed SITDs >due >>>> to a race condition. The missed SITDs have not been marked as >>>> completed at the time they were scanned then the frame counter >>>> advanced before the scanning loop was finished. In this case the >>>> scanning loop will not rescan TDs in that frame and the EHCI driver >>>> will hang waiting for the TD to be removed by the scanning loop. >>>> There are two fixes that I've looked at. The first one stops the >>>> next_frame field in the ehci structure from being incremented passed >a frame with an uncompleted TD. >>>> The second fix would stop the next_frame field from being >>>> incremented passed the frame that's current at the beginning of the >scanning loop. > >Which could be what's causing this; when I saw similar problems they >were (a) intermittent == race-like, (b) never on the very regular stress >loads I used to test that those split ISO transfers, and (c) only on ISO >transfers which were split up over several microframes. (When going >through a transaction translator, an ISO-OUT transfer gets split up into >188 byte fragments, one per microframe. So transfers of 189 bytes or >more would be affected.) > >That second approach to a fix sounds straightforward. Anyone feel like >trying to provide a patch? > >- Dave >________________ >periodic_scan.patch 2k bytes
periodic_scan.patch
Description: Binary data