• Felipe Balbi's avatar
    usb: dwc3: gadget: properly increment dequeue pointer on ep_dequeue · cf3113d8
    Felipe Balbi authored
    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: default avatarJanusz Dziedzic <januszx.dziedzic@intel.com>
    Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
    cf3113d8
gadget.c 81.5 KB