usb_interrupt_read speed different on USB 2 vs 3 port.

Hans Petter Selasky hps at bitfrost.no
Fri Jan 3 13:47:53 UTC 2014


Hi,

For USB 3.0, sys/dev/usb/controller/xhci.c, the interval is set by:

         switch (type) {
         case UE_INTERRUPT:
                 if (fps_shift > 3)
                         fps_shift--;
                 temp |= XHCI_EPCTX_0_IVAL_SET(fps_shift);
                 break;
         case UE_ISOCHRONOUS:

Add some prints to the kernel and print "fps_shift" in the UE_INTERRUPT 
case. The value has unit 125 * (2**fps_shift) us.

The call is:
usb_interrupt_read(devh, 0x00000083, buf, 0x000002a, 1000);

BTW:

      Endpoint 0
         bLength = 0x0007
         bDescriptorType = 0x0005
         bEndpointAddress = 0x0083  <IN>
         bmAttributes = 0x0003  <INTERRUPT>
         wMaxPacketSize = 0x002a
         bInterval = 0x000a
^^^^ 10ms I think for FULL speed (XHCI will use 16ms interval)
         bRefresh = 0x0000
         bSynchAddress = 0x0000

      Endpoint 1
         bLength = 0x0007
         bDescriptorType = 0x0005
         bEndpointAddress = 0x0004  <OUT>
         bmAttributes = 0x0003  <INTERRUPT>
         wMaxPacketSize = 0x0040
         bInterval = 0x000a
^^^^ 10ms I think for FULL speed
         bRefresh = 0x0000
         bSynchAddress = 0x0000

So a round trip of 20ms is like expected. Maybe the EHCI driver will 
schedule a bit differently.

If in the kernel, it is possible to override this value.

--HPS


More information about the freebsd-usb mailing list