Hi, On 11/6/2017 12:46 PM, William Wu wrote: > The actual_length in dwc2_hcd_urb structure is used > to indicate the total data length transferred so far, > but in dwc2_update_isoc_urb_state(), it just updates > the actual_length of isoc frame, and don't update the > urb actual_length at the same time, this will cause > device drivers working error which depend on the urb > actual_length. > > we can easily find this issue if use an USB camera? > the userspace use libusb to get USB data from kernel > via devio driver.In usb devio driver, processcompl() > function will process urb complete and copy data to > userspace depending on urb actual_length. > > Let's update the urb actual_length if the isoc frame > is valid. > > Signed-off-by: William Wu <william.wu at rock-chips.com> > --- > drivers/usb/dwc2/hcd_intr.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/drivers/usb/dwc2/hcd_intr.c b/drivers/usb/dwc2/hcd_intr.c > index 28a8210..01b1e13 100644 > --- a/drivers/usb/dwc2/hcd_intr.c > +++ b/drivers/usb/dwc2/hcd_intr.c > @@ -580,6 +580,7 @@ static enum dwc2_halt_status dwc2_update_isoc_urb_state( > frame_desc->status = 0; > frame_desc->actual_length = dwc2_get_actual_xfer_length(hsotg, > chan, chnum, qtd, halt_status, NULL); > + urb->actual_length += frame_desc->actual_length; > break; > case DWC2_HC_XFER_FRAME_OVERRUN: > urb->error_count++; > @@ -599,6 +600,7 @@ static enum dwc2_halt_status dwc2_update_isoc_urb_state( > frame_desc->status = -EPROTO; > frame_desc->actual_length = dwc2_get_actual_xfer_length(hsotg, > chan, chnum, qtd, halt_status, NULL); > + urb->actual_length += frame_desc->actual_length; > > /* Skip whole frame */ > if (chan->qh->do_split && > According urb description in usb.h urb->actual_length used for non-iso transfers: "@actual_length: This is read in non-iso completion functions, and ... * ISO transfer status is reported in the status and actual_length fields * of the iso_frame_desc array, ...." Thanks, Minas