Re: [RFT/PATCH 18/38] usb: dwc3: gadget: check for Missed Isoc from event status

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On 5/30/2018 11:49 PM, Felipe Balbi wrote:
> Paul Zimmerman <pauldzim@xxxxxxxxx> writes:
>
>> Hi Felipe,
>>
>> Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx> 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?
> perhaps, but I haven't seen that happen yet. Guess I'll get to this when
> I see such a problem.
>
I did some quick tests against DWC_usb3 controller v3.10a in high-speed
and super-speed. We'll start to run into issue when if DWC3 needs to
prepare 64+ TRBs after XferNotReady for isoc transfers with service
interval of 1 uframe (start_transfer command will fail with bus-expiry).
It may be better to calculate for the starting future uframe in a proper
way.

BR,

Thinh

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




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux