aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorFelipe Balbi <balbi@ti.com>2011-12-28 23:32:29 -0500
committerFelipe Balbi <balbi@ti.com>2012-01-24 08:41:22 -0500
commit68d8a781575d7be490f97eb2c403fb13b083da6a (patch)
tree3f738a665891e751edeea80ed0af364b7a17fb16 /drivers/usb
parentdcd6c92267155e70a94b3927bce681ce74b80d1f (diff)
usb: dwc3: ep0: tidy up Pending Request handling
The way our code was written, we should never have a DWC3_EP_PENDING_REQUEST flag set out of a Data Phase and the code in __dwc3_gadget_ep0_queue() did not reflect that situation properly. Tidy up that case to avoid any possible mistakes when starting requests for IRQs which are long gone. Cc: stable@vger.kernel.org Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/dwc3/ep0.c14
1 files changed, 4 insertions, 10 deletions
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
index 2f51de57593a..74a3828cf950 100644
--- a/drivers/usb/dwc3/ep0.c
+++ b/drivers/usb/dwc3/ep0.c
@@ -149,20 +149,14 @@ static int __dwc3_gadget_ep0_queue(struct dwc3_ep *dep,
149 149
150 direction = !!(dep->flags & DWC3_EP0_DIR_IN); 150 direction = !!(dep->flags & DWC3_EP0_DIR_IN);
151 151
152 if (dwc->ep0state == EP0_STATUS_PHASE) { 152 if (dwc->ep0state != EP0_DATA_PHASE) {
153 type = dwc->three_stage_setup 153 dev_WARN(dwc->dev, "Unexpected pending request\n");
154 ? DWC3_TRBCTL_CONTROL_STATUS3
155 : DWC3_TRBCTL_CONTROL_STATUS2;
156 } else if (dwc->ep0state == EP0_DATA_PHASE) {
157 type = DWC3_TRBCTL_CONTROL_DATA;
158 } else {
159 /* should never happen */
160 WARN_ON(1);
161 return 0; 154 return 0;
162 } 155 }
163 156
164 ret = dwc3_ep0_start_trans(dwc, direction, 157 ret = dwc3_ep0_start_trans(dwc, direction,
165 req->request.dma, req->request.length, type); 158 req->request.dma, req->request.length,
159 DWC3_TRBCTL_CONTROL_DATA);
166 dep->flags &= ~(DWC3_EP_PENDING_REQUEST | 160 dep->flags &= ~(DWC3_EP_PENDING_REQUEST |
167 DWC3_EP0_DIR_IN); 161 DWC3_EP0_DIR_IN);
168 } else if (dwc->delayed_status) { 162 } else if (dwc->delayed_status) {