• Amit Virdi's avatar
    usb: dwc3: gadget: Fix TRB preparation during SG · ec512fb8
    Amit Virdi authored
    When scatter gather (SG) is used, multiple TRBs are prepared from one DWC3
    request (dwc3_request). So while preparing TRBs, the 'last' flag should be set
    only when it is the last TRB being prepared from the last dwc3_request entry.
    
    The current implementation uses list_is_last to check if the dwc3_request is the
    last entry from the request_list. However, list_is_last returns false for the
    last entry too. This is because, while preparing the first TRB from a request,
    the function dwc3_prepare_one_trb modifies the request's next and prev pointers
    while moving the URB to req_queued. Hence, list_is_last always returns false no
    matter what.
    
    The correct way is not to access the modified pointers of dwc3_request but to
    use list_empty macro instead.
    
    Fixes: e5ba5ec8 (usb: dwc3: gadget: fix scatter gather implementation)
    Signed-off-by: default avatarAmit Virdi <amit.virdi@st.com>
    Cc: <stable@vger.kernel.org> # v3.9+
    Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
    ec512fb8
gadget.c 67.6 KB