Laurent > > Hi Ravi, > > On Wednesday 27 March 2013 10:43:24 B, Ravi wrote: > > Hi > > > > I am observing issue while streaming video from usb camera connected to > host > > controller based on mentor graphics. The issue is root caused that there > > are huge SOF gaps seen between the two isochronous IN token issued by > host > > controller. This is due to fact, significant amount of time is spent in > uvc > > callback function handler. Due to this next request programmed is > delayed > > leads to this failure of video streaming. I have measured time taken by > uvc > > callback function is in range minimum of 11 microsecond to maximum of > 3318 > > microsecond. Looks like callback handler doing some processing and > takes > > more time to return rather than giveback immediately. Need your help to > > understand why uvc callback handler takes much time, if it does any > > processing can it move to different task context and return immediately, > > this will reduce the latency. > > I'm surprised by that large delay. A quick look at the UVC URB completion > handler (I assume you're talking about the host driver, not the gadget > driver) Thanks for reply, Yes, I am using the musb host controller driver (driver/usb/musb). > doesn't show any significant source of delay. You will likely need to > profile > the code to find out where the problem comes from. I have profiled by adding timestamp before and after the usb_hcd_giveback_urb() @ drivers/usb/musb/musb_host.c and found the microsecond delay is ranging from 11usec to 3318usec while capturing video stream frames of resolution 640x480 from usb camera. static void musb_giveback(struct musb *musb, struct urb *urb, int status) __releases(musb->lock) __acquires(musb->lock) { + struct timeval st, et, t; + int is_isoc; ..... + if (is_isoc) + do_gettimeofday(&st); /* get start time */ usb_hcd_giveback_urb(musb_to_hcd(musb), urb, status); + if (is_isoc) { + do_gettimeofday(&et); /* get end time */ + t.tv_sec = et.tv_sec - st.tv_sec; + t.tv_usec = et.tv_usec - st.tv_usec; + gtime[gIndex++ % MAX_LOG_TIME] = t; /* compute diff time */ + } Anything I miss here? You should also make > sure > that no other IRQ handler on the system keeps IRQs disabled for a long > time. Regards Ravi B -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html