diff options
-rw-r--r-- | drivers/usb/musb/musb_gadget_ep0.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c index 8fba3f11e473..53d06451f820 100644 --- a/drivers/usb/musb/musb_gadget_ep0.c +++ b/drivers/usb/musb/musb_gadget_ep0.c | |||
@@ -664,7 +664,7 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb) | |||
664 | musb->ep0_state = MUSB_EP0_STAGE_STATUSIN; | 664 | musb->ep0_state = MUSB_EP0_STAGE_STATUSIN; |
665 | break; | 665 | break; |
666 | default: | 666 | default: |
667 | ERR("SetupEnd came in a wrong ep0stage %s", | 667 | ERR("SetupEnd came in a wrong ep0stage %s\n", |
668 | decode_ep0stage(musb->ep0_state)); | 668 | decode_ep0stage(musb->ep0_state)); |
669 | } | 669 | } |
670 | csr = musb_readw(regs, MUSB_CSR0); | 670 | csr = musb_readw(regs, MUSB_CSR0); |
@@ -787,12 +787,18 @@ setup: | |||
787 | handled = service_zero_data_request( | 787 | handled = service_zero_data_request( |
788 | musb, &setup); | 788 | musb, &setup); |
789 | 789 | ||
790 | /* | ||
791 | * We're expecting no data in any case, so | ||
792 | * always set the DATAEND bit -- doing this | ||
793 | * here helps avoid SetupEnd interrupt coming | ||
794 | * in the idle stage when we're stalling... | ||
795 | */ | ||
796 | musb->ackpend |= MUSB_CSR0_P_DATAEND; | ||
797 | |||
790 | /* status stage might be immediate */ | 798 | /* status stage might be immediate */ |
791 | if (handled > 0) { | 799 | if (handled > 0) |
792 | musb->ackpend |= MUSB_CSR0_P_DATAEND; | ||
793 | musb->ep0_state = | 800 | musb->ep0_state = |
794 | MUSB_EP0_STAGE_STATUSIN; | 801 | MUSB_EP0_STAGE_STATUSIN; |
795 | } | ||
796 | break; | 802 | break; |
797 | 803 | ||
798 | /* sequence #1 (IN to host), includes GET_STATUS | 804 | /* sequence #1 (IN to host), includes GET_STATUS |