diff options
Diffstat (limited to 'drivers/usb/core/hcd.c')
| -rw-r--r-- | drivers/usb/core/hcd.c | 11 | 
1 files changed, 9 insertions, 2 deletions
| diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 4d326ee12c36..3e01dd6e509b 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -753,6 +753,7 @@ void usb_hcd_poll_rh_status(struct usb_hcd *hcd)  {  	struct urb	*urb;  	int		length; +	int		status;  	unsigned long	flags;  	char		buffer[6];	/* Any root hubs with > 31 ports? */ @@ -770,11 +771,17 @@ void usb_hcd_poll_rh_status(struct usb_hcd *hcd)  		if (urb) {  			clear_bit(HCD_FLAG_POLL_PENDING, &hcd->flags);  			hcd->status_urb = NULL; +			if (urb->transfer_buffer_length >= length) { +				status = 0; +			} else { +				status = -EOVERFLOW; +				length = urb->transfer_buffer_length; +			}  			urb->actual_length = length;  			memcpy(urb->transfer_buffer, buffer, length);  			usb_hcd_unlink_urb_from_ep(hcd, urb); -			usb_hcd_giveback_urb(hcd, urb, 0); +			usb_hcd_giveback_urb(hcd, urb, status);  		} else {  			length = 0;  			set_bit(HCD_FLAG_POLL_PENDING, &hcd->flags); @@ -1281,7 +1288,7 @@ static int hcd_alloc_coherent(struct usb_bus *bus,  		return -EFAULT;  	} -	vaddr = hcd_buffer_alloc(bus, size + sizeof(vaddr), +	vaddr = hcd_buffer_alloc(bus, size + sizeof(unsigned long),  				 mem_flags, dma_handle);  	if (!vaddr)  		return -ENOMEM; |