diff options
| -rw-r--r-- | drivers/usb/host/xhci-ring.c | 9 | ||||
| -rw-r--r-- | drivers/usb/host/xhci.h | 3 | 
2 files changed, 8 insertions, 4 deletions
| diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index ef7c8698772e..88392aa65722 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -3432,11 +3432,14 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  	if (urb->transfer_buffer_length > 0) {  		u32 length_field, remainder; +		u64 addr;  		if (xhci_urb_suitable_for_idt(urb)) { -			memcpy(&urb->transfer_dma, urb->transfer_buffer, +			memcpy(&addr, urb->transfer_buffer,  			       urb->transfer_buffer_length);  			field |= TRB_IDT; +		} else { +			addr = (u64) urb->transfer_dma;  		}  		remainder = xhci_td_remainder(xhci, 0, @@ -3449,8 +3452,8 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags,  		if (setup->bRequestType & USB_DIR_IN)  			field |= TRB_DIR_IN;  		queue_trb(xhci, ep_ring, true, -				lower_32_bits(urb->transfer_dma), -				upper_32_bits(urb->transfer_dma), +				lower_32_bits(addr), +				upper_32_bits(addr),  				length_field,  				field | ep_ring->cycle_state);  	} diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index a450a99e90eb..7f8b950d1a73 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -2160,7 +2160,8 @@ static inline bool xhci_urb_suitable_for_idt(struct urb *urb)  {  	if (!usb_endpoint_xfer_isoc(&urb->ep->desc) && usb_urb_dir_out(urb) &&  	    usb_endpoint_maxp(&urb->ep->desc) >= TRB_IDT_MAX_SIZE && -	    urb->transfer_buffer_length <= TRB_IDT_MAX_SIZE) +	    urb->transfer_buffer_length <= TRB_IDT_MAX_SIZE && +	    !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP))  		return true;  	return false; | 
