On 08/24/2012 09:36 AM, Felipe Balbi wrote: > Hi, > > On Thu, Aug 23, 2012 at 07:30:45PM +0200, Marc Kleine-Budde wrote: >> From: Michael Grzeschik <m.grzeschik@xxxxxxxxxxxxxx> >> >> Non control endpoints have an undefined maxpacket size on udc start. Some >> gadget drivers check for the maxpacket size before they enable the endpoint, >> which leads to a wrong state. >> >> Signed-off-by: Michael Grzeschik <m.grzeschik@xxxxxxxxxxxxxx> >> Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> > > which gadget drivers ? This doesn't look right to me. On dwc3 we > initialize endpoints as early as module probe (before gadget->start() is > even close to being called) and we have no issues at all setting ep0's > maxpacket to 512. Or were you setting maxpacket for all endpoints ?? This patch preserves the setting of ep0 to CTRL_PAYLOAD_MAX, but changes all other endpoint to "(unsigned short)~0". Other drivers have a similar ~0: [mkl@dude:usb (upstream/chipidea-fixes)]$ git grep "(unsigned short) ~0" gadget/fsl_qe_udc.c: ep->ep.maxpacket = (unsigned short) ~0; gadget/fsl_udc_core.c: ep->ep.maxpacket = (unsigned short) ~0; gadget/mv_u3d_core.c: ep->ep.maxpacket = (unsigned short) ~0; gadget/mv_udc_core.c: ep->ep.maxpacket = (unsigned short) ~0; > If that was the case, then this is a fix which should even go to stable > ;-) Michael has discovered the issue, he'll return to the office soon. >> drivers/usb/chipidea/udc.c | 8 +++++++- >> 1 file changed, 7 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c >> index e4db7af..75a96ec 100644 >> --- a/drivers/usb/chipidea/udc.c >> +++ b/drivers/usb/chipidea/udc.c >> @@ -1455,7 +1455,12 @@ static int init_eps(struct ci13xxx *ci) >> >> mEp->ep.name = mEp->name; >> mEp->ep.ops = &usb_ep_ops; >> - mEp->ep.maxpacket = CTRL_PAYLOAD_MAX; >> + /* >> + * for ep0: maxP defined in desc, for other >> + * eps, maxP is set by epautoconfig() called >> + * by gadget layer >> + */ >> + mEp->ep.maxpacket = (unsigned short)~0; These are endpoint != 0. >> >> INIT_LIST_HEAD(&mEp->qh.queue); >> mEp->qh.ptr = dma_pool_alloc(ci->qh_pool, GFP_KERNEL, >> @@ -1475,6 +1480,7 @@ static int init_eps(struct ci13xxx *ci) >> else >> ci->ep0in = mEp; >> >> + mEp->ep.maxpacket = CTRL_PAYLOAD_MAX; This is ep0. >> continue; >> } >> >> -- >> 1.7.10.4 >> > Marc -- Pengutronix e.K. | Marc Kleine-Budde | Industrial Linux Solutions | Phone: +49-231-2826-924 | Vertretung West/Dortmund | Fax: +49-5121-206917-5555 | Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
Attachment:
signature.asc
Description: OpenPGP digital signature