xhci fix for usb-linus 5.11-final
Subsystems (3)
cover xhci fix for usb-linus 5.11-final
Hi Greg
One last xhci fix for 5.11-final if it still can make it.
Thanks
-Mathias
Mathias Nyman (1):
xhci: fix bounce buffer usage for non-sg list case
drivers/usb/host/xhci-ring.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-)
Signature · 1 line
2.25.1
PATCH 1/1 xhci: fix bounce buffer usage for non-sg list case
xhci driver may in some special cases need to copy small amounts of payload data to a bounce buffer in order to meet the boundary and alignment restrictions set by the xHCI specification.
In the majority of these cases the data is in a sg list, and driver incorrectly assumed data is always in urb->sg when using the bounce buffer.
If data instead is contiguous, and in urb->transfer_buffer, we may still need to bounce buffer a small part if data starts very close (less than packet size) to a 64k boundary.
Check if sg list is used before copying data to/from it.
--- drivers/usb/host/xhci-ring.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-)
drivers/usb/host/xhci-ring.c +20 -11
@@ -699,11 +699,16 @@ static void xhci_unmap_td_bounce_buffer(struct xhci_hcd *xhci,dma_unmap_single (dev, seg->bounce_dma, ring->bounce_buf_len,DMA_FROM_DEVICE );/* for in tranfers we need to copy the data from bounce to sg */ - len =sg_pcopy_from_buffer (urb->sg, urb->num_sgs, seg->bounce_buf, - seg->bounce_len, seg->bounce_offs); -if (len != seg->bounce_len) -xhci_warn (xhci,"WARN Wrong bounce buffer read length: %zu != %d\n" , - len, seg->bounce_len); +if (urb->num_sgs) { + len =sg_pcopy_from_buffer (urb->sg, urb->num_sgs, seg->bounce_buf, + seg->bounce_len, seg->bounce_offs); +if (len != seg->bounce_len) +xhci_warn (xhci,"WARN Wrong bounce buffer read length: %zu != %d\n" , + len, seg->bounce_len); + }else { +memcpy (urb->transfer_buffer + seg->bounce_offs, seg->bounce_buf, + seg->bounce_len); + } seg->bounce_len =0 ; seg->bounce_offs =0 ; }
@@ -3277,12 +3282,16 @@ static int xhci_align_td(struct xhci_hcd *xhci, struct urb *urb, u32 enqd_len,/* create a max max_pkt sized bounce buffer pointed to by last trb */ if (usb_urb_dir_out (urb)) { - len =sg_pcopy_to_buffer (urb->sg, urb->num_sgs, - seg->bounce_buf, new_buff_len, enqd_len); -if (len != new_buff_len) -xhci_warn (xhci, -"WARN Wrong bounce buffer write length: %zu != %d\n" , - len, new_buff_len); +if (urb->num_sgs) { + len =sg_pcopy_to_buffer (urb->sg, urb->num_sgs, + seg->bounce_buf, new_buff_len, enqd_len); +if (len != new_buff_len) +xhci_warn (xhci,"WARN Wrong bounce buffer write length: %zu != %d\n" , + len, new_buff_len); + }else { +memcpy (seg->bounce_buf, urb->transfer_buffer + enqd_len, new_buff_len); + } + seg->bounce_dma =dma_map_single (dev, seg->bounce_buf, max_pkt,DMA_TO_DEVICE ); }else {
Signature · 1 line
2.25.1
Greg KH
maintainerQuoted 3 lines · Mathias Nyman
Hi Greg
One last xhci fix for 5.11-final if it still can make it.
Now snuck in!
thanks,
greg k-h