Message ID | 20141124020323.GA5651@kroah.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sun, Nov 23, 2014 at 06:03:23PM -0800, Greg Kroah-Hartman wrote: > The xpad wireless endpoint is not a bulk endpoint on my devices, but > rather an interrupt one, so the USB core complains when it is submitted. > I'm guessing that the author really did mean that this should be an > interrupt urb, but as there are a zillion different xpad devices out > there, let's cover out bases and handle both bulk and interrupt > endpoints just as easily. > > Signed-off-by: "Pierre-Loup A. Griffais" <pgriffais@valvesoftware.com> > Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > Cc: stable <stable@vger.kernel.org> Applied, thank you. > --- > > This has been in my local tree since January, don't know why it never > got pushed out, sorry for the delay. Valve has been using a version of > this patch for a year now. > > drivers/input/joystick/xpad.c | 16 +++++++++++++--- > 1 file changed, 13 insertions(+), 3 deletions(-) > > --- a/drivers/input/joystick/xpad.c > +++ b/drivers/input/joystick/xpad.c > @@ -1179,9 +1179,19 @@ static int xpad_probe(struct usb_interfa > } > > ep_irq_in = &intf->cur_altsetting->endpoint[1].desc; > - usb_fill_bulk_urb(xpad->bulk_out, udev, > - usb_sndbulkpipe(udev, ep_irq_in->bEndpointAddress), > - xpad->bdata, XPAD_PKT_LEN, xpad_bulk_out, xpad); > + if (usb_endpoint_is_bulk_out(ep_irq_in)) { > + usb_fill_bulk_urb(xpad->bulk_out, udev, > + usb_sndbulkpipe(udev, > + ep_irq_in->bEndpointAddress), > + xpad->bdata, XPAD_PKT_LEN, > + xpad_bulk_out, xpad); > + } else { > + usb_fill_int_urb(xpad->bulk_out, udev, > + usb_sndintpipe(udev, > + ep_irq_in->bEndpointAddress), > + xpad->bdata, XPAD_PKT_LEN, > + xpad_bulk_out, xpad, 0); > + } > > /* > * Submit the int URB immediately rather than waiting for open
--- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c @@ -1179,9 +1179,19 @@ static int xpad_probe(struct usb_interfa } ep_irq_in = &intf->cur_altsetting->endpoint[1].desc; - usb_fill_bulk_urb(xpad->bulk_out, udev, - usb_sndbulkpipe(udev, ep_irq_in->bEndpointAddress), - xpad->bdata, XPAD_PKT_LEN, xpad_bulk_out, xpad); + if (usb_endpoint_is_bulk_out(ep_irq_in)) { + usb_fill_bulk_urb(xpad->bulk_out, udev, + usb_sndbulkpipe(udev, + ep_irq_in->bEndpointAddress), + xpad->bdata, XPAD_PKT_LEN, + xpad_bulk_out, xpad); + } else { + usb_fill_int_urb(xpad->bulk_out, udev, + usb_sndintpipe(udev, + ep_irq_in->bEndpointAddress), + xpad->bdata, XPAD_PKT_LEN, + xpad_bulk_out, xpad, 0); + } /* * Submit the int URB immediately rather than waiting for open