Hi Felipe,

Felipe Balbi <felipe.ba...@linux.intel.com> writes:

< snip >

> thinking about this a little more. This extra list_empty() check is
> not wrong at all :-) I've amended this series with the 3 patches
> below. I'll resend the series once I've given more time for people to
> test. Patches have been updated to the branch on kernel.org as well,
> btw.

< snip >

> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
> index 9d4dc8bed644..9cf89f3cf203 100644
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -1233,6 +1233,8 @@ static int __dwc3_gadget_get_frame(struct dwc3 *dwc)
>       return DWC3_DSTS_SOFFN(reg);
>  }
> 
> +#define DWC3_ALIGN_FRAME(d)  (((d)->frame_number + (d)->interval) & 
> ~((d)->interval - 1))
> +
>  static void __dwc3_gadget_start_isoc(struct dwc3_ep *dep)
>  {
>       if (list_empty(&dep->pending_list)) {
> @@ -1242,11 +1244,7 @@ static void __dwc3_gadget_start_isoc(struct dwc3_ep 
> *dep)
>               return;
>       }
> 
> -     /*
> -      * Schedule the first trb for one interval in the future or at
> -      * least 4 microframes.
> -      */
> -     dep->frame_number += max_t(u32, 4, dep->interval);
> +     dep->frame_number = DWC3_ALIGN_FRAME(dep);
>       __dwc3_gadget_kick_transfer(dep);
>  }

Pretty sure this could cause problems. Instead of starting at least 4 uframes
in the future, this will now try to start at the next aligned uframe. If
dep->interval is very small (say 1) and we are almost at the end of the
current uframe, there might not be enough time?

-- 
Paul
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to