On 26.01.21 at 22:16 Andreas Hartmann wrote: > Hello Mathias! > > On 26.01.21 at 18:29 Mathias Nyman wrote: >> Got a first iteration ready, >> any change you could try it out? >> >> Thanks >> -Mathias >> >> 8<--- >> >> diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c >> index 5677b81c0915..8df30618aaf1 100644 >> --- a/drivers/usb/host/xhci-ring.c >> +++ b/drivers/usb/host/xhci-ring.c >> @@ -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; >> } >> @@ -3275,12 +3280,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); >> + } >> + > > If I'm understanding it correctly, you're always creating a bounce > buffer though it is not necessary (at least in my case - my test patch > proofed, that no changes at all are necessary). Why aren't you checking > for URB_NO_TRANSFER_DMA_MAP at the very beginning? Or is it your purpose > to first basically test your new code path? That would be ok. > > I tested with the notebook (in both directions) - it seems to work - I > didn't get any problems though I used 24 kB bulk packets. Throughput was > unaltered high. > > I'm doing the same test tomorrow with the other USB 3.1 controller! Successfully tested on the other USB 3.1 host. > >> seg->bounce_dma = dma_map_single(dev, seg->bounce_buf, >> max_pkt, DMA_TO_DEVICE); >> } else { >> > > Thanks > Andreas >