2010/8/27 Gadiyar, Anand <gadiyar@xxxxxx>: > tom.leiming@xxxxxxxxx wrote: >> From: Ming Lei <tom.leiming@xxxxxxxxx> >> >> This patch fixes one infinite hang of bulk IN transfer in double buffer >> case, the hang can be observed easily by test #6 of usbtest if musb is >> configured as g_zero and fifo mode 3 is taken to enable double fifo. >> >> In fact, the patch only removes the check for non-empty fifo before >> loading data from new request into fifo since the check is >> not correct: >> >> -in double buffer case, fifo may accommodate more than one packet, >> even though it has contained one packet already and is non-empty >> >> -since last DMA is completed before calling musb_g_tx, it is sure >> that fifo may accommodate at least one packet >> >> Without applying the patch, new requst enqueued from .complte may not >> have a chance to be loaded into fifo, then will never be completed and >> cause infinite hangs. >> >> With the patch, on my beagle B5, test#6(queued bulk in) can be passed and >> test result may go beyond 33Mbyte/s if musb is configured as g_zero and >> fifo mode 3 is taken, follows the test command: >> >> #testusb -D DEV_NAME -c 1024 -t 6 -s 32768 -g 8 [1] >> >> [1], >> -source of testusb : tools/usb/testusb.c under linux kernel; >> >> Signed-off-by: Ming Lei <tom.leiming@xxxxxxxxx> >> Cc: Anand Gadiyar <gadiyar@xxxxxx> >> Cc: Mike Frysinger <vapier@xxxxxxxxxx> >> Cc: Sergei Shtylyov <sshtylyov@xxxxxxxxxxxxx> >> > > For OMAPs, > Acked-by: Anand Gadiyar <gadiyar@xxxxxx> > > I sent out this patch a while ago [1]. I've tested it on > OMAP3 and OMAP4 silicon. Oh, I did not see your patch before, you have seen the issue for long time, why not merge into mainline? > > It does look like a logic bug to me, but I'd like the Blackfin > and Davinci guys to take a look at the code as well. > > - Anand > > [1] <http://marc.info/?l=linux-usb&m=127055442703499&w=2> > >> --- >> drivers/usb/musb/musb_gadget.c | 12 ------------ >> 1 files changed, 0 insertions(+), 12 deletions(-) >> >> diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c >> index 550b397..e0bd1c1 100644 >> --- a/drivers/usb/musb/musb_gadget.c >> +++ b/drivers/usb/musb/musb_gadget.c >> @@ -506,18 +506,6 @@ void musb_g_tx(struct musb *musb, u8 epnum) >> /* ... or if not, then complete it. */ >> musb_g_giveback(musb_ep, request, 0); >> >> - /* >> - * Kickstart next transfer if appropriate; >> - * the packet that just completed might not >> - * be transmitted for hours or days. >> - * REVISIT for double buffering... >> - * FIXME revisit for stalls too... >> - */ >> - musb_ep_select(mbase, epnum); >> - csr = musb_readw(epio, MUSB_TXCSR); >> - if (csr & MUSB_TXCSR_FIFONOTEMPTY) >> - return; >> - >> request = musb_ep->desc ? next_request(musb_ep) : NULL; >> if (!request) { >> DBG(4, "%s idle now\n", >> -- >> 1.6.2.5 >> >> -- Lei Ming -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html