From owner-freebsd-usb@FreeBSD.ORG Tue Mar 27 16:50:12 2007 Return-Path: X-Original-To: freebsd-usb@hub.freebsd.org Delivered-To: freebsd-usb@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 76BB816A404 for ; Tue, 27 Mar 2007 16:50:12 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [69.147.83.40]) by mx1.freebsd.org (Postfix) with ESMTP id 6676913C45A for ; Tue, 27 Mar 2007 16:50:12 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.4/8.13.4) with ESMTP id l2RGoBA3029674 for ; Tue, 27 Mar 2007 16:50:11 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.4/8.13.4/Submit) id l2RGoBVm029672; Tue, 27 Mar 2007 16:50:11 GMT (envelope-from gnats) Date: Tue, 27 Mar 2007 16:50:11 GMT Message-Id: <200703271650.l2RGoBVm029672@freefall.freebsd.org> To: freebsd-usb@FreeBSD.org From: Hans Petter Selasky Cc: Subject: Re: usb/110855: ugen: interrupt in msgs are truncated when buffer is full X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Hans Petter Selasky List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 27 Mar 2007 16:50:12 -0000 The following reply was made to PR usb/110855; it has been noted by GNATS. From: Hans Petter Selasky To: Markus Henschel Cc: freebsd-usb@freebsd.org, freebsd-gnats-submit@freebsd.org Subject: Re: usb/110855: ugen: interrupt in msgs are truncated when buffer is full Date: Tue, 27 Mar 2007 18:43:08 +0200 On Tuesday 27 March 2007 11:30, Markus Henschel wrote: > 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@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? Yes, there is a buffer, but the buffer is packet-based, and not a "ring" based, so you will never get problem with packet alignment. > Why isn't O_NONBLOCK working anymore? It is implemented, and it should work. Can you explain more what is not working? --HPS