On Mon, Jan 20, 2014 at 11:26:02AM +0100, Matthieu CASTET wrote:
> Le Sat, 18 Jan 2014 09:03:01 +0100,
> Michael Grzeschik <[email protected]> a écrit :
>
> > On Fri, Jan 17, 2014 at 05:15:49PM +0100, Matthieu CASTET wrote:
> > > How many fifo have your controller (hw_ep_max) ?
> >
> > It's MX28. For this hw_ep_max is 16.
> >
> > > When you say fifo on position 8, you mean in software (in ci_hw_ep
> > > array), but not in hardware (ENDPTCTRLx) ?
> >
> > Yes. In the code "i" is the index of the hwep array. AFAIK the array is
> > organized like this;
> >
> > i == [0:7] out endpoints
> > i == [8:15] in endpoints.
> >
> > Therefor index 0 is ep0out and index 8 is ep0in.
> >
> Could you try the attached patch ?
>
> The SETUPSTAT register is only 16 bits. For index 8 (ep_to_bit(8) = 16)
> we shouldn't read it.
The patch helps, but will probably look better like this:
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index 69d20fb..9364184 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -989,6 +989,7 @@ __acquires(ci->lock)
}
if (hwep->type != USB_ENDPOINT_XFER_CONTROL ||
+ (i >= ci->hw_ep_max / 2) ||
!hw_test_and_clear_setup_status(ci, i))
continue;
I think the reason why we see this more likely on our system, is that it is a
running an realtime kernel. Therefor the irq-routine running as threaded
interrupt could be delayed and read the SETUPTSTAT bits in a different order.
> PS : the code for handling ctrl endpoint is a bit messy. We should
> split isr_tr_complete_handler in isr_tr_complete_handler and
> isr_tr_setup_handler.
Ack.
Thanks,
Michael
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html