usb/110855: ugen: interrupt in msgs are truncated when buffer is full

Markus Henschel m.henschel at bally-wulff.de
Tue Mar 27 09:53:05 UTC 2007


Hans Petter Selasky schrieb:
> On Monday 26 March 2007 16:13, Markus Henschel wrote:
>>> Number:         110855
>>> Category:       usb
>>> Synopsis:       ugen: interrupt in msgs are truncated when buffer is full
>>> Confidential:   no
>>> Severity:       serious
>>> Priority:       medium
>>> Responsible:    freebsd-usb
>>> State:          open
>>> Quarter:
>>> Keywords:
>>> Date-Required:
>>> Class:          change-request
>>> Submitter-Id:   current-users
>>> Arrival-Date:   Mon Mar 26 14:20:04 GMT 2007
>>> Closed-Date:
>>> Last-Modified:
>>> Originator:     Markus Henschel
>>> Release:        6.2 custom kernel
>>> Organization:
>> Bally Wulff Automaten GmbH
>>
>>> Environment:
>> FreeBSD freebsd-1.bally.de 6.2-RELEASE FreeBSD 6.2-RELEASE #11: Fri Mar 23
>> 21:28:38 CET 2007    
>> prog at freebsd-1.bally.de:/usr/obj/usr/src/sys/BALLYWULFF  i386
>>
>>> Description:
>> We use ugen for some user space drivers. When an interrupt in endpoint is
>> used ugen creates a queue that is filled by the kernel. The user space
>> driver is responsible for reading data from the device file. If this
>> happens too slow the queue is full and new msgs arriving from the usb
>> device are lost. This behavior is OK.
>>
>> The problem is that the queue is not a multiple of the interrupt in
>> endpoints msgs size. So it is possible that the last msg in the queue is
>> truncated. This is very hard to detect for a user space driver. The data
>> stream seen by the user space driver will contain an incomplete msgs
>> directly followed by the next message without knowing truncation happened
>> (except when using some data corruption detection mechanism).
>>
>> It would be much better if ugen would fill the queues of interrupt in
>> endpoints until there is no more space for a complete msg. This way the
>> user space driver will not loose sync with the incoming msgs.
> 
> The new USB stack has this fixed already. What I do is that the USB driver 
> stops polling the interrupt endpoint when the user-land application does not 
> read data. When the user-land application has read a packet, the interrupt 
> endpoint is started again. The only problem is that some devices, like a 
> Microsoft mouse I have, stops working immediately when its internal buffer 
> overflows. Bad hardware design. But if your hardware is not like that, the 
> new ugen, which is part of the new USB driver, will work great for you.
> 
> Also packet alignment is kept between reads: Only one packet per read.
> 
> See:
> 
> http://www.turbocat.net/~hselasky/usb4bsd
> 
> --HPS
> 

Thanks,

I gave it a try and it seems to work fine :-). Could you please explain
how reading an interrupt in endpoint works internally with the new ugen?
Is there still a buffer that recieves data from the endpoint or is each
read request from user land synchronously triggering a read data request
on the interrupt endpoint? Why isn't O_NONBLOCK working anymore?



-- 
Regards,


Markus Henschel
Development

BALLY WULFF Automaten GmbH
Maybachufer 48-51
12045 Berlin
Phone:  +49(30)62002 161
FAX:    +49(30)62002 230
http://www.ballywulff.de


More information about the freebsd-usb mailing list