[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] usbback: fix invalid urb->interval for highspeed interrupt endpoint
Hi, Current usbback fails to submit the interrupt urb for high-speed endpoints. This patch fixes this issue. usb_fill_int_urb() is a helper function to initialize a interrupt urb, and sets the usb->interval value as follows, void usb_fill_int_urb(struct urb *urb, ..., int interval) { ... if (dev->speed == USB_SPEED_HIGH) urb->interval = 1 << (interval - 1); else urb->interval = interval; ... } The interval value that usbback got from the RING_REQ is already modified to an exponent of two. So, usbback must not initialize a interrupt urb with double-modified interval value. Signed-off-by: Noboru Iwamatsu <n_iwamatsu@xxxxxxxxxxxxxx> diff --git a/drivers/xen/usbback/usbback.c b/drivers/xen/usbback/usbback.c --- a/drivers/xen/usbback/usbback.c +++ b/drivers/xen/usbback/usbback.c @@ -470,6 +470,18 @@ static void usbbk_init_urb(usbif_request pending_req->buffer, req->buffer_length, usbbk_urb_complete, pending_req, req->u.intr.interval); + /* + * high speed interrupt endpoints use a logarithmic encoding of + * the endpoint interval, and usb_fill_int_urb() initializes a + * interrupt urb with the encoded interval value. + * + * req->u.intr.interval is the interval value that already + * encoded in the frontend part, and the above usb_fill_int_urb() + * initializes the urb->interval with double encoded value. + * + * so, simply overwrite the urb->interval with original value. + */ + urb->interval = req->u.intr.interval; urb->transfer_flags = req->transfer_flags; break; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |