How should the interval field in an urb for USB 2.0
interpretted?  Is it microframes (125 micro-seconds)
as the ehci code seems to assume?   Or should it be
interpretted like the bInterval field in an endpoint
descriptor?

The USB 2.0 spec, section 9.6.6, Table 9-13, says

  For high-speed interrupt endpoints, the bInterval value
  is used as the exponent for a 2^(bInterval-1) value; eg
  a bInterval of 4 means a period of 8 (2^(4-1)).

Above that it explains that for high speed this represents
microframes at 125 micro-seconds each.

It seems to me the URB interval field should be interpretted
as an exponent like this for USB 2.0--so that you can just pass
the bInterval you get from the endpoint descriptor on to the urb
without having to do any calculations.

If that is true, then I think something like the following patch
is needed in ehci-q.c:

--- ehci-q.c.orig       2003-08-28 19:07:23.000000000 -0500
+++ ehci-q.c    2003-08-28 19:10:41.000000000 -0500
@@ -652,12 +652,12 @@
                        qh->gap_uf = 0;

                        /* FIXME handle HS periods of less than 1 frame. */
-                       qh->period = urb->interval >> 3;
-                       if (qh->period < 1) {
+                       if (urb->interval < 4) {
                                dbg ("intr period %d uframes, NYET!",
-                                               urb->interval);
+                                               1<<(urb->interval-1));
                                goto done;
                        }
+                       qh->period = 1 << (urb->interval-4);
                } else {
                        /* gap is f(FS/LS transfer times) */
                        qh->gap_uf = 1 + usb_calc_bus_time (urb->dev->speed,

NOTE: This is _not_ an attempt to allow more than one high speed
interrupt per frame that the FIXME is talking about.  This merely
computes the number of micro-frames based on the USB spec.

NOTE: I am still trying to get USB 2.0 interrupt transfers working for me
in 2.4.20 and .22.  I have not had time to track down the problems beyond
this issue with how the interval is interpretted.  For now I put my device
behind a 1.1 hub to fall back to 1.1 where interrupt transfers are working
fine for me.

-- Al


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to