mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-24 09:50:04 +00:00
usb: dwc3: gadget: always try to prepare on started_list first
In cases where we're given an SG-list which is longer than the amount of currently available TRBs, we will be left with the same request on started_list and we should prioritize that request over possible new requests on pending_list. That's a way to guarantee requests complete in order. Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
This commit is contained in:
parent
e62c5bc573
commit
d86c5a676e
1 changed files with 18 additions and 0 deletions
|
@ -1020,6 +1020,24 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep)
|
|||
if (!dwc3_calc_trbs_left(dep))
|
||||
return;
|
||||
|
||||
/*
|
||||
* We can get in a situation where there's a request in the started list
|
||||
* but there weren't enough TRBs to fully kick it in the first time
|
||||
* around, so it has been waiting for more TRBs to be freed up.
|
||||
*
|
||||
* In that case, we should check if we have a request with pending_sgs
|
||||
* in the started list and prepare TRBs for that request first,
|
||||
* otherwise we will prepare TRBs completely out of order and that will
|
||||
* break things.
|
||||
*/
|
||||
list_for_each_entry(req, &dep->started_list, list) {
|
||||
if (req->num_pending_sgs > 0)
|
||||
dwc3_prepare_one_trb_sg(dep, req);
|
||||
|
||||
if (!dwc3_calc_trbs_left(dep))
|
||||
return;
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(req, n, &dep->pending_list, list) {
|
||||
if (req->num_pending_sgs > 0)
|
||||
dwc3_prepare_one_trb_sg(dep, req);
|
||||
|
|
Loading…
Reference in a new issue