• Thinh Nguyen's avatar
    usb: dwc3: gadget: Rewrite endpoint allocation flow · b311048c
    Thinh Nguyen authored
    The driver dwc3 deviates from the programming guide in regard to
    endpoint configuration. It does this command sequence:
    
    DEPSTARTCFG -> DEPXFERCFG -> DEPCFG
    
    Instead of the suggested flow:
    
    DEPSTARTCFG -> DEPCFG -> DEPXFERCFG
    
    The reasons for this deviation were as follow, quoted:
    
    	1) The databook says to do %DWC3_DEPCMD_DEPSTARTCFG for every
    	   %USB_REQ_SET_CONFIGURATION and %USB_REQ_SET_INTERFACE
    	   (8.1.5). This is incorrect in the scenario of multiple
    	   interfaces.
    
    	2) The databook does not mention doing more
    	   %DWC3_DEPCMD_DEPXFERCFG for new endpoint on alt setting
    	   (8.1.6).
    
    Regarding 1), DEPSTARTCFG resets the endpoints' resource and can be a
    problem if used with SET_INTERFACE request of a multiple interface
    configuration. But we can still satisfy the programming guide
    requirement by assigning the endpoint resource as part of
    usb_ep_enable(). We will only reset endpoint resources on controller
    initialization and SET_CONFIGURATION request.
    
    Regarding 2), the later versions of the programming guide were updated
    to clarify this flow (see "Alternate Initialization on SetInterface
    Request" of the programming guide). As long as the platform has enough
    physical endpoints, we can assign resource to a new endpoint.
    
    The order of the command sequence will not be a problem to most
    platforms for the current implementation of the dwc3 driver. However,
    this order is required in different scenarios (such as initialization
    during controller's hibernation restore). Let's keep the flow consistent
    and follow the programming guide.
    Signed-off-by: default avatarThinh Nguyen <Thinh.Nguyen@synopsys.com>
    Link: https://lore.kernel.org/r/c143583a5afb087deb8c3aa5eb227ee23515f272.1706754219.git.Thinh.Nguyen@synopsys.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    b311048c
gadget.c 124 KB