summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmit Virdi <amit.virdi@st.com>2015-01-13 14:27:20 +0530
committerFelipe Balbi <balbi@ti.com>2015-01-14 11:28:23 -0600
commitec512fb8e5611fed1df2895f90317ce6797d6b32 (patch)
tree9c157dbcf904459896018942212d8ed559534a3e
parent90bdf403db4ca75ee60ca5a760dc342cef96b5e1 (diff)
downloadlinux-stable-ec512fb8e5611fed1df2895f90317ce6797d6b32.tar.gz
linux-stable-ec512fb8e5611fed1df2895f90317ce6797d6b32.tar.bz2
linux-stable-ec512fb8e5611fed1df2895f90317ce6797d6b32.zip
usb: dwc3: gadget: Fix TRB preparation during SG
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: e5ba5ec833aa (usb: dwc3: gadget: fix scatter gather implementation) Signed-off-by: Amit Virdi <amit.virdi@st.com> Cc: <stable@vger.kernel.org> # v3.9+ Signed-off-by: Felipe Balbi <balbi@ti.com>
-rw-r--r--drivers/usb/dwc3/gadget.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index f03b136ecfce..0eec2e917994 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -882,8 +882,7 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting)
if (i == (request->num_mapped_sgs - 1) ||
sg_is_last(s)) {
- if (list_is_last(&req->list,
- &dep->request_list))
+ if (list_empty(&dep->request_list))
last_one = true;
chain = false;
}