USB bulk read & pthreads
Bernd Walter
ticso at cicely12.cicely.de
Thu May 22 08:59:09 PDT 2003
On Thu, May 22, 2003 at 08:38:29AM -0700, Terry Lambert wrote:
> Bernd Walter wrote:
> > On Tue, May 20, 2003 at 09:44:13PM -0700, Terry Lambert wrote:
> > > Or it's a bug in the USB driver, not honoring non-blocking I/O.
> >
> > ugen(4) does not support non-blocking I/O like most other driver also do
> > not.
> >
> > I don't count it as a bug as noone ever told that it does.
> > It's even documented in ugen(4):
> > The bulk transfer mode can be in or out depending on the endpoint. To
> > perform I/O on a bulk endpoint read(2) and write(2) should be used. All
> > I/O operations on a bulk endpoint are unbuffered.
> > non-blocking requires buffered I/O.
>
> Then it should produce an error when someone tries to enable
> non-blocking I/O on it, and *that's* the bug.
Who says it does not?
Non-blocking I/O is used silently inside the threading library.
What shall the library do with the error?
refuse read/write to the application which requested blocking I/O?
Or ignore this error and work with blocking I/O and potentially
block the entire process?
>From the pthread sematics the latter is the correct way and it is
the way it's handled right now.
> > The device gets regulary polled if someone has an outstanding transfer.
> > Implementing nonblocking I/O would require always to have an
> > outstanding read for open devices - similar is done in ucom(4).
>
> The way Vadim Antonov got around this in the BSDI ft(4) driver
> for tape drives on floppy controllers was to provide a buffer
> sufficient for the largest block of data that you could ever
> transfer in one read with the driver, in both the read and write
> directions, and decoupling them from the actual user read/write
> requests in the strategy routine. This avoided him needing to
> do the evil of an outstanding read for open devices.
Yes - that works if you know what to transfer.
But ugen doesn't know anything about what it transfers, therefor
it can't buffer.
See uftdi devices - every read contains 2 extra bytes containing
addition informations - if we buffer the userland driver might get
confused because it might request less data.
More evil - the thread library might aggregate or split at will.
In short: non-blocking I/O won't work for ugen bulk pipes.
--
B.Walter BWCT http://www.bwct.de
ticso at bwct.de info at bwct.de
More information about the freebsd-hackers
mailing list