Olaf Hering wrote:
On Wed, Mar 17, David Brownell wrote:

Actually what's needed is a _correct_ patch ... that's been
the holdup all along.  All endpoint transfer intervals use
a log2 encoding, except full/low speed interrupt transfers.

The attached patch should be correct.


zero size patch? I love these :)

Ah, right filename from wrong kernel tree. Whoops! Here it is.


--- 1.55/drivers/usb/core/devio.c       Fri Dec  5 14:42:24 2003
+++ edited/drivers/usb/core/devio.c     Wed Mar 17 13:46:17 2004
@@ -837,6 +837,9 @@
                /* arbitrary limit */
                if (uurb.number_of_packets < 1 || uurb.number_of_packets > 128)
                        return -EINVAL;
+               if (!(ep_desc = usb_epnum_to_ep_desc(ps->dev, uurb.endpoint)))
+                       return -ENOENT;
+               interval = (1 << (min ((u8)16,ep_desc->bInterval) - 1));
                isofrmlen = sizeof(struct usbdevfs_iso_packet_desc) * 
uurb.number_of_packets;
                if (!(isopkt = kmalloc(isofrmlen, GFP_KERNEL)))
                        return -ENOMEM;
@@ -862,7 +865,10 @@
                uurb.number_of_packets = 0;
                if (!(ep_desc = usb_epnum_to_ep_desc(ps->dev, uurb.endpoint)))
                        return -ENOENT;
-               interval = ep_desc->bInterval;
+               if (ps->dev->speed == USB_SPEED_HIGH)
+                       interval = (1 << (min ((u8)16,ep_desc->bInterval) - 1));
+               else
+                       interval = ep_desc->bInterval;
                if (uurb.buffer_length > 16384)
                        return -EINVAL;
                if (!access_ok((uurb.endpoint & USB_DIR_IN) ? VERIFY_WRITE : 
VERIFY_READ, uurb.buffer, uurb.buffer_length))

Reply via email to