diff options
Diffstat (limited to 'drivers/usb/core/hcd.c')
| -rw-r--r-- | drivers/usb/core/hcd.c | 50 | 
1 files changed, 22 insertions, 28 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index f225eaa98ff8..aa45840d8273 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -1409,11 +1409,18 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,  	if (usb_endpoint_xfer_control(&urb->ep->desc)) {  		if (hcd->self.uses_pio_for_control)  			return ret; -		if (hcd_uses_dma(hcd)) { -			if (is_vmalloc_addr(urb->setup_packet)) { -				WARN_ONCE(1, "setup packet is not dma capable\n"); -				return -EAGAIN; -			} else if (object_is_on_stack(urb->setup_packet)) { +		if (hcd->localmem_pool) { +			ret = hcd_alloc_coherent( +					urb->dev->bus, mem_flags, +					&urb->setup_dma, +					(void **)&urb->setup_packet, +					sizeof(struct usb_ctrlrequest), +					DMA_TO_DEVICE); +			if (ret) +				return ret; +			urb->transfer_flags |= URB_SETUP_MAP_LOCAL; +		} else if (hcd_uses_dma(hcd)) { +			if (object_is_on_stack(urb->setup_packet)) {  				WARN_ONCE(1, "setup packet is on stack\n");  				return -EAGAIN;  			} @@ -1427,23 +1434,22 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,  						urb->setup_dma))  				return -EAGAIN;  			urb->transfer_flags |= URB_SETUP_MAP_SINGLE; -		} else if (hcd->localmem_pool) { -			ret = hcd_alloc_coherent( -					urb->dev->bus, mem_flags, -					&urb->setup_dma, -					(void **)&urb->setup_packet, -					sizeof(struct usb_ctrlrequest), -					DMA_TO_DEVICE); -			if (ret) -				return ret; -			urb->transfer_flags |= URB_SETUP_MAP_LOCAL;  		}  	}  	dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;  	if (urb->transfer_buffer_length != 0  	    && !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)) { -		if (hcd_uses_dma(hcd)) { +		if (hcd->localmem_pool) { +			ret = hcd_alloc_coherent( +					urb->dev->bus, mem_flags, +					&urb->transfer_dma, +					&urb->transfer_buffer, +					urb->transfer_buffer_length, +					dir); +			if (ret == 0) +				urb->transfer_flags |= URB_MAP_LOCAL; +		} else if (hcd_uses_dma(hcd)) {  			if (urb->num_sgs) {  				int n; @@ -1479,9 +1485,6 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,  					ret = -EAGAIN;  				else  					urb->transfer_flags |= URB_DMA_MAP_PAGE; -			} else if (is_vmalloc_addr(urb->transfer_buffer)) { -				WARN_ONCE(1, "transfer buffer not dma capable\n"); -				ret = -EAGAIN;  			} else if (object_is_on_stack(urb->transfer_buffer)) {  				WARN_ONCE(1, "transfer buffer is on stack\n");  				ret = -EAGAIN; @@ -1497,15 +1500,6 @@ int usb_hcd_map_urb_for_dma(struct usb_hcd *hcd, struct urb *urb,  				else  					urb->transfer_flags |= URB_DMA_MAP_SINGLE;  			} -		} else if (hcd->localmem_pool) { -			ret = hcd_alloc_coherent( -					urb->dev->bus, mem_flags, -					&urb->transfer_dma, -					&urb->transfer_buffer, -					urb->transfer_buffer_length, -					dir); -			if (ret == 0) -				urb->transfer_flags |= URB_MAP_LOCAL;  		}  		if (ret && (urb->transfer_flags & (URB_SETUP_MAP_SINGLE |  				URB_SETUP_MAP_LOCAL)))  |