Commit 0cacb46a authored by Matt DeVillier's avatar Matt DeVillier Committed by Mauro Carvalho Chehab

[media] fix mceusb endpoint type identification/handling

Change the I/O endpoint handling of the mceusb driver to respect the endpoint
type reported by device (bulk/interrupt), rather than treating all endpoints
as type interrupt, which breaks devices using bulk endpoints when connected
to a xhci controller.  Accordingly, change the function calls to initialize
an endpoint's transfer pipe and urb handlers to use the correct function based
on the endpoint type.

[m.chehab@samsung.com: Fix merge conflicts and compilation breakage]
Signed-off-by: default avatarMatt DeVillier <matt.devillier@gmail.com>
Tested-by: default avatarSean Young <sean@mess.org>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent 44f83144
...@@ -747,11 +747,19 @@ static void mce_request_packet(struct mceusb_dev *ir, unsigned char *data, ...@@ -747,11 +747,19 @@ static void mce_request_packet(struct mceusb_dev *ir, unsigned char *data,
} }
/* outbound data */ /* outbound data */
pipe = usb_sndintpipe(ir->usbdev, if (usb_endpoint_xfer_int(ir->usb_ep_out)) {
ir->usb_ep_out->bEndpointAddress); pipe = usb_sndintpipe(ir->usbdev,
usb_fill_int_urb(async_urb, ir->usbdev, pipe, ir->usb_ep_out->bEndpointAddress);
async_buf, size, mce_async_callback, usb_fill_int_urb(async_urb, ir->usbdev, pipe, async_buf,
ir, ir->usb_ep_out->bInterval); size, mce_async_callback, ir,
ir->usb_ep_out->bInterval);
} else {
pipe = usb_sndbulkpipe(ir->usbdev,
ir->usb_ep_out->bEndpointAddress);
usb_fill_bulk_urb(async_urb, ir->usbdev, pipe,
async_buf, size, mce_async_callback,
ir);
}
memcpy(async_buf, data, size); memcpy(async_buf, data, size);
} else if (urb_type == MCEUSB_RX) { } else if (urb_type == MCEUSB_RX) {
...@@ -1269,32 +1277,26 @@ static int mceusb_dev_probe(struct usb_interface *intf, ...@@ -1269,32 +1277,26 @@ static int mceusb_dev_probe(struct usb_interface *intf,
for (i = 0; i < idesc->desc.bNumEndpoints; ++i) { for (i = 0; i < idesc->desc.bNumEndpoints; ++i) {
ep = &idesc->endpoint[i].desc; ep = &idesc->endpoint[i].desc;
if ((ep_in == NULL) if (ep_in == NULL) {
&& ((ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK) if (usb_endpoint_is_bulk_in(ep)) {
== USB_DIR_IN) ep_in = ep;
&& (((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) dev_dbg(&intf->dev, "acceptable bulk inbound endpoint found\n");
== USB_ENDPOINT_XFER_BULK) } else if (usb_endpoint_is_int_in(ep)) {
|| ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ep_in = ep;
== USB_ENDPOINT_XFER_INT))) { ep_in->bInterval = 1;
dev_dbg(&intf->dev, "acceptable interrupt inbound endpoint found\n");
ep_in = ep; }
ep_in->bmAttributes = USB_ENDPOINT_XFER_INT;
ep_in->bInterval = 1;
dev_dbg(&intf->dev, "acceptable inbound endpoint found");
} }
if ((ep_out == NULL) if (ep_out == NULL) {
&& ((ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK) if (usb_endpoint_is_bulk_out(ep)) {
== USB_DIR_OUT) ep_out = ep;
&& (((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) dev_dbg(&intf->dev, "acceptable bulk outbound endpoint found\n");
== USB_ENDPOINT_XFER_BULK) } else if (usb_endpoint_is_int_out(ep)) {
|| ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ep_out = ep;
== USB_ENDPOINT_XFER_INT))) { ep_out->bInterval = 1;
dev_dbg(&intf->dev, "acceptable interrupt outbound endpoint found\n");
ep_out = ep; }
ep_out->bmAttributes = USB_ENDPOINT_XFER_INT;
ep_out->bInterval = 1;
dev_dbg(&intf->dev, "acceptable outbound endpoint found");
} }
} }
if (ep_in == NULL) { if (ep_in == NULL) {
...@@ -1302,7 +1304,10 @@ static int mceusb_dev_probe(struct usb_interface *intf, ...@@ -1302,7 +1304,10 @@ static int mceusb_dev_probe(struct usb_interface *intf,
return -ENODEV; return -ENODEV;
} }
pipe = usb_rcvintpipe(dev, ep_in->bEndpointAddress); if (usb_endpoint_xfer_int(ep_in))
pipe = usb_rcvintpipe(dev, ep_in->bEndpointAddress);
else
pipe = usb_rcvbulkpipe(dev, ep_in->bEndpointAddress);
maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
ir = kzalloc(sizeof(struct mceusb_dev), GFP_KERNEL); ir = kzalloc(sizeof(struct mceusb_dev), GFP_KERNEL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment