Re: [RESEND/PATCH 5/6] USB: musb-gadget: complete request only ifdata is transfered over

From: Sergei Shtylyov
Date: Tue Sep 14 2010 - 13:52:01 EST


Hello.

Felipe Balbi wrote:

If a DMA interrupt comes when the whole transfer is not yet complete (and
other Ming Lei's patches are making this possible),

Oh, here I mixed some other patch with Ming Lei's ones...

it will pass due to the

than this is the actual problem, no ? If we're using mode1 dma (as we
are on tx path), we should only get dma interrupt when the whole
transfer has been completed.

The Inventra DMA controller has serious DMA length limitation, so the whole transfer may take more than one DMA.

'ís_dma' condition above the patched code:

if (is_dma || request->actual == request->length) {

and then it will hit the code sending the final ZLP (above this patched code too):

but this was already there before the patch.

Yes, and here lies the problem.

/*
* First, maybe a terminating short packet. Some DMA
* engines might handle this by themselves.
*/
if ((request->zero && request->length
&& request->length % musb_ep->packet_sz == 0)
#ifdef CONFIG_USB_INVENTRA_DMA
|| (is_dma && (!dma->desired_mode ||
(request->actual &
(musb_ep->packet_sz - 1))))
#endif
) {

before the transfer is complete while it should only be hit when and only when
the whole transfer is complete. The current code doesn't look correct as well
though, all due to this 'ís_dma' condition. Surely this needs fixing.

likewise, this was there before the patch. I don't think the real
problem lies with this patch, it's been there for a while, don't you
agree ?

Then what problem this patch fixes, if not this one?

the problem is not on the extra if () added below the quoted code,
it's on the quoted code itself, which wasn't changed in any way.

Let me repeat: in the PIO mode the added check is just duplicate, in the DMA mode it's added too late in the code, after ZLP/short packet send is triggered.
We should modify the check at the top of that code instead.

WBR, Sergei
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/