aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelipe Balbi <felipe.balbi@linux.intel.com>2017-09-11 03:45:12 -0400
committerFelipe Balbi <felipe.balbi@linux.intel.com>2017-09-18 06:30:30 -0400
commit55168470835688e5da5828cdcf1b1498d7baadb1 (patch)
tree99db634867dcdabcfaed22789bdee863ec06d0b2
parent2bd6bf03f4c1c59381d62c61d03f6cc3fe71f66e (diff)
usb: dwc3: ep0: fix DMA starvation by assigning req->trb on ep0
If we don't assign a TRB to ep0 requests, we won't be able to unmap the request later on resulting in starvation of DMA resources. Fixes: 4a71fcb8ac5f ("usb: dwc3: gadget: only unmap requests from DMA if mapped") Reported-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com> Tested-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
-rw-r--r--drivers/usb/dwc3/ep0.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
index 827e376bfa97..75e6cb044eb2 100644
--- a/drivers/usb/dwc3/ep0.c
+++ b/drivers/usb/dwc3/ep0.c
@@ -990,6 +990,8 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
990 DWC3_TRBCTL_CONTROL_DATA, 990 DWC3_TRBCTL_CONTROL_DATA,
991 true); 991 true);
992 992
993 req->trb = &dwc->ep0_trb[dep->trb_enqueue - 1];
994
993 /* Now prepare one extra TRB to align transfer size */ 995 /* Now prepare one extra TRB to align transfer size */
994 dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr, 996 dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr,
995 maxpacket - rem, 997 maxpacket - rem,
@@ -1015,6 +1017,8 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
1015 DWC3_TRBCTL_CONTROL_DATA, 1017 DWC3_TRBCTL_CONTROL_DATA,
1016 true); 1018 true);
1017 1019
1020 req->trb = &dwc->ep0_trb[dep->trb_enqueue - 1];
1021
1018 /* Now prepare one extra TRB to align transfer size */ 1022 /* Now prepare one extra TRB to align transfer size */
1019 dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr, 1023 dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr,
1020 0, DWC3_TRBCTL_CONTROL_DATA, 1024 0, DWC3_TRBCTL_CONTROL_DATA,
@@ -1029,6 +1033,9 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
1029 dwc3_ep0_prepare_one_trb(dep, req->request.dma, 1033 dwc3_ep0_prepare_one_trb(dep, req->request.dma,
1030 req->request.length, DWC3_TRBCTL_CONTROL_DATA, 1034 req->request.length, DWC3_TRBCTL_CONTROL_DATA,
1031 false); 1035 false);
1036
1037 req->trb = &dwc->ep0_trb[dep->trb_enqueue];
1038
1032 ret = dwc3_ep0_start_trans(dep); 1039 ret = dwc3_ep0_start_trans(dep);
1033 } 1040 }
1034 1041