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))
