Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5186ffee authored by Arseniy Lartsev's avatar Arseniy Lartsev Committed by Greg Kroah-Hartman
Browse files

USB: cdc-acm: work around some broken devices



This patch introduces a work around for cdc-acm devices which are
low speed contrary to the specification, which requires bulk endpoints
which are banned in low speed and converted by usbcore to virtual
interrupt endpoints if they are used nevertheless.

Signed-off-by: default avatarArseniy Lartsev <ars3n@yandex.ru>
Cc: Oliver Neukum <oliver@neukum.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 89368d3d
Loading
Loading
Loading
Loading
+23 −8
Original line number Diff line number Diff line
@@ -387,6 +387,7 @@ static void acm_rx_tasklet(unsigned long _acm)
	struct acm_ru *rcv;
	unsigned long flags;
	unsigned char throttled;
	struct usb_host_endpoint *ep;

	dbg("Entering acm_rx_tasklet");

@@ -462,6 +463,15 @@ static void acm_rx_tasklet(unsigned long _acm)

		rcv->buffer = buf;

		ep = (usb_pipein(acm->rx_endpoint) ? acm->dev->ep_in : acm->dev->ep_out)
				[usb_pipeendpoint(acm->rx_endpoint)];
		if (usb_endpoint_xfer_int(&ep->desc))
			usb_fill_int_urb(rcv->urb, acm->dev,
					 acm->rx_endpoint,
					 buf->base,
					 acm->readsize,
					 acm_read_bulk, rcv, ep->desc.bInterval);
		else
			usb_fill_bulk_urb(rcv->urb, acm->dev,
					  acm->rx_endpoint,
					  buf->base,
@@ -1227,6 +1237,11 @@ static int acm_probe(struct usb_interface *intf,
			goto alloc_fail7;
		}

		if (usb_endpoint_xfer_int(epwrite))
			usb_fill_int_urb(snd->urb, usb_dev,
				usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
				NULL, acm->writesize, acm_write_bulk, snd, epwrite->bInterval);
		else
			usb_fill_bulk_urb(snd->urb, usb_dev,
				usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
				NULL, acm->writesize, acm_write_bulk, snd);