
Juha Kuikka wrote:
Hi,
I ran into some issues with the MUSB-UDC support while adding a new Davinci DM850/OMAP-L138 board:
- Move endpoint count into SoC specific musb-header file. This
implementation only has 4 instead of 15 OMAP2/3 has. 2. On DM850 the MUSB interrupts are read from a wrapper, not from MUSB block . Add optional interface function to read-and-clear interrupts. 3. Problem setting FADDR - in udc_irq() the musb_peri_ep0_set_address() gets called on the same run as the ep0 SET_ADDRESS request is handled. This causes the FADDR to change before the status stage interrupt is received and USB session fails. Fixed by removing extra call to musb_peri_ep0() from udc_irq(). It should only be called when EP0 interrupt is present. 4. udc_setup_ep() has a problem when id != 0, epinfo[] is indexed too far, this results in wrong EPs configured.
This is not a final patch, just asking for comments.
I am investigating another issue where rx endpoint stops receiving data when CDC ACM console is used. This happens under heavy inbound data conditions, namely using "loads".
diff --git a/drivers/usb/musb/musb_udc.c b/drivers/usb/musb/musb_udc.c index fc43cf4..b6f9bff 100644 --- a/drivers/usb/musb/musb_udc.c +++ b/drivers/usb/musb/musb_udc.c @@ -65,8 +65,6 @@ /* #define MUSB_DEBUG */ #include "musb_debug.h"
-#define MAX_ENDPOINT 15
#define GET_ENDPOINT(dev,ep) \ (((struct usb_device_instance *)(dev))->bus->endpoint_array + ep)
@@ -157,6 +155,17 @@ static void musb_db_regs(void) #define musb_db_regs() #endif /* DEBUG_MUSB */
+#ifndef CONFIG_MUSB_SOC_IRQ +static void musb_get_interrupts(u8 *usb, u16 *rx, u16 *tx) +{
- *usb = readb(&musbr->intrusb);
- *rx = readw(&musbr->intrrx);
- *tx = readw(&musbr->intrtx);
+} +#else +extern void musb_get_interrupts(u8 *usb, u16 *rx, u16 *tx); +#endif
The reading of INT registers clears them. If all you want in the usb INT's, you will wipe out the rx/tx to get them.
Tom