diff options
Diffstat (limited to 'drivers/usb/core/devio.c')
| -rw-r--r-- | drivers/usb/core/devio.c | 23 | 
1 files changed, 16 insertions, 7 deletions
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index e9f5043a2167..09c8d9ca61ae 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -241,7 +241,8 @@ static int usbdev_mmap(struct file *file, struct vm_area_struct *vma)  		goto error_decrease_mem;  	} -	mem = usb_alloc_coherent(ps->dev, size, GFP_USER, &dma_handle); +	mem = usb_alloc_coherent(ps->dev, size, GFP_USER | __GFP_NOWARN, +			&dma_handle);  	if (!mem) {  		ret = -ENOMEM;  		goto error_free_usbm; @@ -1708,11 +1709,17 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb  	as->urb->start_frame = uurb->start_frame;  	as->urb->number_of_packets = number_of_packets;  	as->urb->stream_id = stream_id; -	if (uurb->type == USBDEVFS_URB_TYPE_ISO || -			ps->dev->speed == USB_SPEED_HIGH) -		as->urb->interval = 1 << min(15, ep->desc.bInterval - 1); -	else -		as->urb->interval = ep->desc.bInterval; + +	if (ep->desc.bInterval) { +		if (uurb->type == USBDEVFS_URB_TYPE_ISO || +				ps->dev->speed == USB_SPEED_HIGH || +				ps->dev->speed >= USB_SPEED_SUPER) +			as->urb->interval = 1 << +					min(15, ep->desc.bInterval - 1); +		else +			as->urb->interval = ep->desc.bInterval; +	} +  	as->urb->context = as;  	as->urb->complete = async_completed;  	for (totlen = u = 0; u < number_of_packets; u++) { @@ -2582,7 +2589,9 @@ static unsigned int usbdev_poll(struct file *file,  	if (file->f_mode & FMODE_WRITE && !list_empty(&ps->async_completed))  		mask |= POLLOUT | POLLWRNORM;  	if (!connected(ps)) -		mask |= POLLERR | POLLHUP; +		mask |= POLLHUP; +	if (list_empty(&ps->list)) +		mask |= POLLERR;  	return mask;  }  |