usb: wusbcore: read actual_length bytes isoc in segments
authorThomas Pugliese <thomas.pugliese@gmail.com>
Fri, 28 Feb 2014 21:10:26 +0000 (15:10 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 1 Mar 2014 00:14:48 +0000 (16:14 -0800)
Use the iso_frame_desc.actual_length field instead of length when
reading isoc in data segments from the HWA.  This fixes a case where the
isoc in read URB would never complete because it expected the HWA to
send more data than it actually did.  When this happened the URB would
be stuck in the driver preventing module unload and clean shutdown.

Signed-off-by: Thomas Pugliese <thomas.pugliese@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/wusbcore/wa-xfer.c

index 3d6b30d8520e6e2b7dd4b553dfc7f37832be1b57..ff1de5e396a4948b3209366e6383b4325bbbc9ad 100644 (file)
@@ -2159,7 +2159,7 @@ static void __wa_populate_buf_in_urb_isoc(struct wahc *wa, struct wa_xfer *xfer,
        wa->buf_in_urb->transfer_dma = xfer->urb->transfer_dma +
                xfer->urb->iso_frame_desc[curr_iso_frame].offset;
        wa->buf_in_urb->transfer_buffer_length =
-               xfer->urb->iso_frame_desc[curr_iso_frame].length;
+               xfer->urb->iso_frame_desc[curr_iso_frame].actual_length;
        wa->buf_in_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
        wa->buf_in_urb->transfer_buffer = NULL;
        wa->buf_in_urb->sg = NULL;