diff options
Diffstat (limited to 'drivers/usb/class/cdc-acm.c')
| -rw-r--r-- | drivers/usb/class/cdc-acm.c | 33 | 
1 files changed, 24 insertions, 9 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 3f104599347..2bfc41ece0e 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -462,11 +462,18 @@ urbs:  		rcv->buffer = buf; -		usb_fill_bulk_urb(rcv->urb, acm->dev, -				  acm->rx_endpoint, -				  buf->base, -				  acm->readsize, -				  acm_read_bulk, rcv); +		if (acm->is_int_ep) +			usb_fill_int_urb(rcv->urb, acm->dev, +					 acm->rx_endpoint, +					 buf->base, +					 acm->readsize, +					 acm_read_bulk, rcv, acm->bInterval); +		else +			usb_fill_bulk_urb(rcv->urb, acm->dev, +					  acm->rx_endpoint, +					  buf->base, +					  acm->readsize, +					  acm_read_bulk, rcv);  		rcv->urb->transfer_dma = buf->dma;  		rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; @@ -740,7 +747,7 @@ static int acm_tty_chars_in_buffer(struct tty_struct *tty)  {  	struct acm *acm = tty->driver_data;  	if (!ACM_READY(acm)) -		return -EINVAL; +		return 0;  	/*  	 * This is inaccurate (overcounts), but it works.  	 */ @@ -1173,6 +1180,9 @@ made_compressed_probe:  	spin_lock_init(&acm->read_lock);  	mutex_init(&acm->mutex);  	acm->rx_endpoint = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress); +	acm->is_int_ep = usb_endpoint_xfer_int(epread); +	if (acm->is_int_ep) +		acm->bInterval = epread->bInterval;  	tty_port_init(&acm->port);  	acm->port.ops = &acm_port_ops; @@ -1227,9 +1237,14 @@ made_compressed_probe:  			goto alloc_fail7;  		} -		usb_fill_bulk_urb(snd->urb, usb_dev, -			usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress), -			NULL, acm->writesize, acm_write_bulk, snd); +		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);  		snd->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;  		snd->instance = acm;  	}  |