summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/host/xhci-ring.c9
-rw-r--r--drivers/usb/host/xhci.h3
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,
3432 3432
3433 if (urb->transfer_buffer_length > 0) { 3433 if (urb->transfer_buffer_length > 0) {
3434 u32 length_field, remainder; 3434 u32 length_field, remainder;
3435 u64 addr;
3435 3436
3436 if (xhci_urb_suitable_for_idt(urb)) { 3437 if (xhci_urb_suitable_for_idt(urb)) {
3437 memcpy(&urb->transfer_dma, urb->transfer_buffer, 3438 memcpy(&addr, urb->transfer_buffer,
3438 urb->transfer_buffer_length); 3439 urb->transfer_buffer_length);
3439 field |= TRB_IDT; 3440 field |= TRB_IDT;
3441 } else {
3442 addr = (u64) urb->transfer_dma;
3440 } 3443 }
3441 3444
3442 remainder = xhci_td_remainder(xhci, 0, 3445 remainder = xhci_td_remainder(xhci, 0,
@@ -3449,8 +3452,8 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
3449 if (setup->bRequestType & USB_DIR_IN) 3452 if (setup->bRequestType & USB_DIR_IN)
3450 field |= TRB_DIR_IN; 3453 field |= TRB_DIR_IN;
3451 queue_trb(xhci, ep_ring, true, 3454 queue_trb(xhci, ep_ring, true,
3452 lower_32_bits(urb->transfer_dma), 3455 lower_32_bits(addr),
3453 upper_32_bits(urb->transfer_dma), 3456 upper_32_bits(addr),
3454 length_field, 3457 length_field,
3455 field | ep_ring->cycle_state); 3458 field | ep_ring->cycle_state);
3456 } 3459 }
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)
2160{ 2160{
2161 if (!usb_endpoint_xfer_isoc(&urb->ep->desc) && usb_urb_dir_out(urb) && 2161 if (!usb_endpoint_xfer_isoc(&urb->ep->desc) && usb_urb_dir_out(urb) &&
2162 usb_endpoint_maxp(&urb->ep->desc) >= TRB_IDT_MAX_SIZE && 2162 usb_endpoint_maxp(&urb->ep->desc) >= TRB_IDT_MAX_SIZE &&
2163 urb->transfer_buffer_length <= TRB_IDT_MAX_SIZE) 2163 urb->transfer_buffer_length <= TRB_IDT_MAX_SIZE &&
2164 !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP))
2164 return true; 2165 return true;
2165 2166
2166 return false; 2167 return false;