struct device *dev = xhci_to_hcd(xhci)->self.controller;
        struct xhci_segment *seg = td->bounce_seg;
        struct urb *urb = td->urb;
+       size_t len;
 
        if (!ring || !seg || !urb)
                return;
                return;
        }
 
-       /* for in tranfers we need to copy the data from bounce to sg */
-       sg_pcopy_from_buffer(urb->sg, urb->num_mapped_sgs, seg->bounce_buf,
-                            seg->bounce_len, seg->bounce_offs);
        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: %ld != %d\n",
+                               len, seg->bounce_len);
        seg->bounce_len = 0;
        seg->bounce_offs = 0;
 }
        unsigned int unalign;
        unsigned int max_pkt;
        u32 new_buff_len;
+       size_t len;
 
        max_pkt = usb_endpoint_maxp(&urb->ep->desc);
        unalign = (enqd_len + *trb_buff_len) % max_pkt;
 
        /* create a max max_pkt sized bounce buffer pointed to by last trb */
        if (usb_urb_dir_out(urb)) {
-               sg_pcopy_to_buffer(urb->sg, urb->num_mapped_sgs,
+               len = sg_pcopy_to_buffer(urb->sg, urb->num_sgs,
                                   seg->bounce_buf, new_buff_len, enqd_len);
+               if (len != seg->bounce_len)
+                       xhci_warn(xhci,
+                               "WARN Wrong bounce buffer write length: %ld != %d\n",
+                               len, seg->bounce_len);
                seg->bounce_dma = dma_map_single(dev, seg->bounce_buf,
                                                 max_pkt, DMA_TO_DEVICE);
        } else {