summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/gadget/arcotg_udc.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/drivers/usb/gadget/arcotg_udc.c b/drivers/usb/gadget/arcotg_udc.c
index 23d736b1f646..fe08b0df6a0a 100644
--- a/drivers/usb/gadget/arcotg_udc.c
+++ b/drivers/usb/gadget/arcotg_udc.c
@@ -1575,17 +1575,6 @@ static void setup_received_irq(struct fsl_udc *udc,
unsigned mA = 500;
udc_reset_ep_queue(udc, 0);
- if (wLength) {
- int dir;
- dir = EP_DIR_IN;
- if (setup->bRequestType & USB_DIR_IN) {
- dir = EP_DIR_OUT;
- }
- spin_unlock(&udc->lock);
- if (ep0_prime_status(udc, dir))
- ep0stall(udc);
- spin_lock(&udc->lock);
- }
/* We process some stardard setup requests here */
switch (setup->bRequest) {
case USB_REQ_GET_STATUS:
@@ -1687,9 +1676,16 @@ static void setup_received_irq(struct fsl_udc *udc,
spin_unlock(&udc->lock);
if (udc->driver->setup(&udc->gadget,
&udc->local_setup_buff) < 0) {
- /* cancel status phase */
+ /* cancel all requests on ep0 */
udc_reset_ep_queue(udc, 0);
ep0stall(udc);
+ } else {
+ /* prime the status phase */
+ int dir = EP_DIR_IN;
+ if (setup->bRequestType & USB_DIR_IN)
+ dir = EP_DIR_OUT;
+ if (ep0_prime_status(udc, dir))
+ ep0stall(udc);
}
} else {
/* No data phase, IN status from gadget */