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

Hans Petter Selasky hselasky at c2i.net
Mon Mar 26 15:40:08 UTC 2007


The following reply was made to PR usb/110855; it has been noted by GNATS.

From: Hans Petter Selasky <hselasky at c2i.net>
To: freebsd-usb at freebsd.org
Cc: Markus Henschel <m.henschel at bally-wulff.de>,
 freebsd-gnats-submit at freebsd.org
Subject: Re: usb/110855: ugen: interrupt in msgs are truncated when buffer is full
Date: Mon, 26 Mar 2007 16:30:23 +0200

 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


More information about the freebsd-usb mailing list