• John Youn's avatar
    usb: dwc3: Fix assignment of EP transfer resources · c4509601
    John Youn authored
    The assignement of EP transfer resources was not handled properly in the
    dwc3 driver. Commit aebda618 ("usb: dwc3: Reset the transfer
    resource index on SET_INTERFACE") previously fixed one aspect of this
    where resources may be exhausted with multiple calls to SET_INTERFACE.
    However, it introduced an issue where composite devices with multiple
    interfaces can be assigned the same transfer resources for different
    endpoints. This patch solves both issues.
    
    The assignment of transfer resources cannot perfectly follow the data
    book due to the fact that the controller driver does not have all
    knowledge of the configuration in advance. It is given this information
    piecemeal by the composite gadget framework after every
    SET_CONFIGURATION and SET_INTERFACE. Trying to follow the databook
    programming model in this scenario can cause errors. For two reasons:
    
    1) The databook says to do DEPSTARTCFG for every SET_CONFIGURATION and
    SET_INTERFACE (8.1.5). This is incorrect in the scenario of multiple
    interfaces.
    
    2) The databook does not mention doing more DEPXFERCFG for new endpoint
    on alt setting (8.1.6).
    
    The following simplified method is used instead:
    
    All hardware endpoints can be assigned a transfer resource and this
    setting will stay persistent until either a core reset or hibernation.
    So whenever we do a DEPSTARTCFG(0) we can go ahead and do DEPXFERCFG for
    every hardware endpoint as well. We are guaranteed that there are as
    many transfer resources as endpoints.
    
    This patch triggers off of the calling dwc3_gadget_start_config() for
    EP0-out, which always happens first, and which should only happen in one
    of the above conditions.
    
    Fixes: aebda618 ("usb: dwc3: Reset the transfer resource index on SET_INTERFACE")
    Cc: <stable@vger.kernel.org> # v3.2+
    Reported-by: default avatarRavi Babu <ravibabu@ti.com>
    Signed-off-by: default avatarJohn Youn <johnyoun@synopsys.com>
    Signed-off-by: default avatarFelipe Balbi <balbi@kernel.org>
    c4509601
core.h 32.9 KB