On Sat, 9 Feb 2008 11:34:35 -0500 (EST) Alan Stern <[EMAIL PROTECTED]> wrote:
> On Sat, 9 Feb 2008, David Brownell wrote: > > > On Friday 08 February 2008, Alan Stern wrote: > > > > > > > There's currently an issue with isoc transfers made by em28xx driver[1] > > > > and > > > > ehcd_hci. If I try to start isoc transfers on more than one hardware, > > > > the > > > > second hardware fails at usb_submit_urb() with -ENOSPC. > > > > > > ENOSPC means that you are attempting to use more bandwidth than the bus > > > allows. A high-speed isochronous transfer of length 3072 requires 41% > > > of the total bandwidth (according to Table 5-5 in the USB 2.0 spec), > > > and periodic transfers (isochronous and interrupt) on a high-speed bus > > > are limited to no more than 80% of the total bandwidth. > > > > > > Performing transfers to two devices would require 82% of the bandwidth; > > > hence it isn't allowed. > > > > Well, the USB 2.0 spec is internally inconsistent on that point. > > > > And when I've asked the USB-IF for resolution on that, or maybe > > issuance of an erratum, they've been silent. (Greg, maybe you > > can do something about that now? The issue's been reported for > > quite a few years now.) > > > > See table 5.5, at the bottom (section 5.6). Somehow it thinks > > that twice 41% is below the 80% limit (listed in section 5.6.4, > > paragraph 2). Similarly, table 5.8, at the bottom (section 5.7) > > which again repeats the 80% limit (para 1 of section 5.7.4). > > The 80% limit is referenced section 5.10 too. > > Wow, I never noticed that. Although thinking back, I probably did see > other mistakes in those tables... > > > Somebody at USB-IF was refusing to do some basic math, or has > > been ignoring this obvious spec bug. Either both those tables > > are wrong, or the three references to an 80% limit are wrong. > > There are no other resolutions to this bug. > > I'm inclined to believe that the USB-IF meant the 80% limit to apply as > stated and the tables are wrong. As a simple example, let's consider a > high-speed Isochronous transfer of 3072 bytes. This actually goes on > the wire as three transactions, each of length 1024. According to the > bus-transaction-time formulas in section 5.11.3, each transaction > uses (in nanoseconds): > > (38 * 8 * 2.083) + (2.083 * Floor(3.167 + BitStuffTime(Data_bc))) + > Host_Delay > > Here Data_bc is 1024 and Host_Delay is unknown, assumed to be 0. The > BitStuffTime formula is: (1.1667*8*Data_bc). Doing the calculation > yields a total of 3 * 20546.7 ns = 61640.1 ns = 49.3% of a uframe -- > not 41%. Even the single-transaction 1024-byte case comes out to 16.4%, > not 14% as the table says. > > If you subtract out the overhead due to the SOF packet, it's even > worse. So clearly the tables are wrong. My tests here were receiving a video stream whose resolution is 720x480x30fps, 16 bits/pixel. That means a 20.736 MB/s (about 166 Mbps) stream rate (without USB oveheads). A cat /proc/bus/usb shows this: B: Alloc=480/800 us (60%), #Int= 0, #Iso= 2 > > > I'd be tempted to accept a patch teaching EHCI that the limit > > is really 82%, or whatever ... but I also think it's overdue > > for the USB-IF to correct their spec. > > Indeed. > > Alan Stern > Cheers, Mauro - To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html