|
@@ -664,7 +664,7 @@ irqreturn_t musb_g_ep0_irq(struct musb *musb)
|
|
musb->ep0_state = MUSB_EP0_STAGE_STATUSIN;
|
|
musb->ep0_state = MUSB_EP0_STAGE_STATUSIN;
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
- ERR("SetupEnd came in a wrong ep0stage %s",
|
|
|
|
|
|
+ ERR("SetupEnd came in a wrong ep0stage %s\n",
|
|
decode_ep0stage(musb->ep0_state));
|
|
decode_ep0stage(musb->ep0_state));
|
|
}
|
|
}
|
|
csr = musb_readw(regs, MUSB_CSR0);
|
|
csr = musb_readw(regs, MUSB_CSR0);
|
|
@@ -787,12 +787,18 @@ setup:
|
|
handled = service_zero_data_request(
|
|
handled = service_zero_data_request(
|
|
musb, &setup);
|
|
musb, &setup);
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * We're expecting no data in any case, so
|
|
|
|
+ * always set the DATAEND bit -- doing this
|
|
|
|
+ * here helps avoid SetupEnd interrupt coming
|
|
|
|
+ * in the idle stage when we're stalling...
|
|
|
|
+ */
|
|
|
|
+ musb->ackpend |= MUSB_CSR0_P_DATAEND;
|
|
|
|
+
|
|
/* status stage might be immediate */
|
|
/* status stage might be immediate */
|
|
- if (handled > 0) {
|
|
|
|
- musb->ackpend |= MUSB_CSR0_P_DATAEND;
|
|
|
|
|
|
+ if (handled > 0)
|
|
musb->ep0_state =
|
|
musb->ep0_state =
|
|
MUSB_EP0_STAGE_STATUSIN;
|
|
MUSB_EP0_STAGE_STATUSIN;
|
|
- }
|
|
|
|
break;
|
|
break;
|
|
|
|
|
|
/* sequence #1 (IN to host), includes GET_STATUS
|
|
/* sequence #1 (IN to host), includes GET_STATUS
|