usb: dwc3: gadget: properly increment dequeue pointer on ep_dequeue
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Fri, 17 Feb 2017 09:12:44 +0000 (11:12 +0200)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Mon, 6 Mar 2017 08:09:37 +0000 (10:09 +0200)
commitcf3113d893d4427b166ec8695460efa7aa660923
tree17aec6d6e8f05d453cd4a7547052e0bbeab3e87c
parent2bfa0719ac2a9b2f3c91345873d3cdebd0296ba9
usb: dwc3: gadget: properly increment dequeue pointer on ep_dequeue

If request was already started, this means we had to
stop the transfer. With that we also need to ignore
all TRBs used by the request, however TRBs can only
be modified after completion of END_TRANSFER
command. So what we have to do here is wait for
END_TRANSFER completion and only after that jump
over TRBs by clearing HWO and incrementing dequeue
pointer.

Note that we have 2 possible types of transfers
here:

i) Linear buffer request
ii) SG-list based request

SG-list based requests will have r->num_pending_sgs
set to a valid number (> 0). Linear requests,
normally use a single TRB.

For each of these two cases, if r->unaligned flag is
set, one extra TRB has been used to align transfer
size to wMaxPacketSize.

All of these cases need to be taken into
consideration so we don't mess up our TRB ring
pointers.

Tested-by: Janusz Dziedzic <januszx.dziedzic@intel.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/dwc3/gadget.c