[PATCH] iso pipe support for usbatm

matthieu castet castet.matthieu at free.fr
Sat Mar 19 13:28:04 EST 2005


Hi,

Roman Kagan wrote:
> On Sat, Mar 19, 2005 at 03:37:40PM +0100, matthieu castet wrote:
> 
>>Roman Kagan wrote:
>>
>>>On Sat, Mar 19, 2005 at 12:38:19AM +0100, matthieu castet wrote:
>>>
>>>
>>>>@@ -472,17 +510,44 @@
>>>>	instance = rcv->instance;
>>>>	buf = rcv->buffer;
>>>>
>>>>-	buf->filled_cells = urb->actual_length / (ATM_CELL_SIZE + 
>>>>instance->rx_padding);
>>>>+	if ( urb->actual_length <= 0 && !urb->status) {
>>>>+		int err;
>>>>+		if ((err = usb_submit_urb(rcv->urb, GFP_ATOMIC)) < 0) {
>>>
>>>
>>>Why do you resubmit the failed urb here?  It used to go in the normal
>>>codepath and get resubmitted in receive_tasklet.
>>>
>>
>>the buffer is empty and the urb didn't failed, so we could reuse the 
>>same urb with the same buffer : it avoids to go through receive_tasklet 
>>and locking for releasing/taking buffer.
>>This is needed for performance issue with iso pipe because the urb are 
>>returned every 1ms (or something like that), even if there is nothing 
>>received in order to keep the allocated bandwidth.
> 
> 
> So for bulk this should never happen?
> 
> Anyway it may make more sense to use more urbs in this case, so that
> some urbs are always submitted.  It's for that reason that I've
> increased the default number of urbs in my patch.
> 
Increasing the number of urb won't solve the extra cost of locking 
unlocking : in order to keep the allocated bandwidth, you need to 
resumit it as soon as possible. If you look in the driver/usb driver 
that use iso pipe, you will see that's lot's of them resumit the urb in 
the complete handler (I know this isn't a good argument).
Also the number is limited in iso mode.

> 
>>>>-	if (likely(!urb->status))
>>>>+	if (likely(!urb->status) ||
>>>>+			/* via chipset produce lot's of crc error...*/
>>>>+			(usb_pipeisoc(instance->rx_endpoint) && urb->status 
>>>>== -EILSEQ))
>>>>		tasklet_schedule(&instance->receive_tasklet);
>>>
>>>
>>>Sounds like iso occasionally misses data too?  BTW the condition you add
>>>here is ignored because it's masked by the other one.
>>
>>I don't think so : if urb->status == -EILSEQ and iso pipe, we have "if 
>>(0 || 1 && 1)" which is true
> 
> 
> Ups, you're certainly right.
> 
> BTW do you get -EILSEQ often?  Documentation/usb/error-codes.txt reads:
> 
> (*) Error codes like -EPROTO, -EILSEQ and -EOVERFLOW normally indicate
> hardware problems such as bad devices (including firmware) or cables.
> 
I think this is specific to via controler (someone told me that there 
windows driver have some trick for -EILSEQ error)

> 
>>>What is the typical ->iso_frame_size you're using? 
>>
>>This is given by the modem, I use the maximum : 1007, but others are 
>>also available :
> 
> 
> So this means the buffer size per urb is 1007 * 16 / 53 = 304 ATM cells,
> which is almost 5 times the default 64 for bulk.  Maybe simply
> increasing the buffer size in bulk mode will solve the problem of
> dropped cells?
It make it worse : I increase the size to 304, and I have lot's of 
unknown vpi/vci error and my download rate is about 4Ko/s ...

I thinks that's normal because before we detected errors only after 64 
cells, now we wait 304 cells....

I was using your new algorithm, with 4 urb.


Matthieu



More information about the Usbatm mailing list