I'm developing a USB "transport protocol" (for a thin-client
application, that basically allows a remote server to access the USB bus
on a thin-client device, e.g. so you can access your USB thumbdrive
using your thin-client.)  We have this working already for other
platforms, so the protocol is "known good".

However, I'm having trouble with an implementation built on top of
libusb and Linux (specifically, I am using Edgy Eft, kernel
2.6.17-10-386 and libusb-0.1.)

What it appears is that doing a usb_bulk_read() on a USB CF reader can
"hang" if a zero time out is given, or terminate early if a real timeout
is given.  This is the first USB bulk read ever issued against the
device.  Subsequent reads seem to work okay.  (Note that the device
using the exact same operations with a different OS -- proprietary
microkernel -- combination doesn't seem to suffer this problem.  So I
don't think the device is at fault here.)

It looks like the logic in libusb's bulk_read() routine that uses
IOCTL_USB_REAPURBNDELAY is deficient somehow -- it looks like it never
completes.

For the record, here's the code snippet that creates this problem:

    rv = usb_bulk_read(ifp->i_handle, endp->e_addr, data, cmd->val, 0);

The ep addressed is 0x82, the data length is 36 bytes (cmd->val), and
the 0 timeout should wait indefinitely for for this to complete.

This is, btw, in a heavily threaded application, although at this point
only one thread is ever using the handle represented by ifp->i_handle. 
I have used the handle (which is bound to the interface properly with
usb_claim_interface, etc.) for other operations, and as indicated,
retrying this operation seems to succeed (assuming I use a non-zero
value for the timeout.)  I am not happy with that solution though, as
I'm not entirely confident that the read is idempotent.

A little other info that might be relevant:  here is the relevant entry
from the /proc/bus/usb/devices file:

T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 13 Spd=12  MxCh= 0
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=16 #Cfgs=  1
P:  Vendor=04e6 ProdID=0325 Rev= 5.07
S:  Manufacturer=SCM Microsystems Inc.
S:  Product=eUSB ORCA Quad Reader
S:  SerialNumber=000000000A08
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=(none)
E:  Ad=01(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=82(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms


As you can tell, no driver is bound.  My application detects anything
that isn't bound to the usbhid, usbhub, or usbfs drivers, and unbinds
the kernel driver using the non-portable Linux API.

The operation that completes before the read stalls is a USB write of 31
bytes.  It appears to me that this is the embedded SCSI commands in the
Bulk-Only protocol.

Any advice for anything else I can do to eliminate this hang/stall
condition would be greatly appreciated.  (Is this is a sign that the
actual device has stalled?  I wouldn't think so, but I don't know how
the Linux USB stack provides a stall to libusb code.)

Am I wasting my time with the older libusb-0.1?  Should I port my
application to the beta 1.0 stack and try again?

Thanks for any advice!

-- 
Garrett D'Amore, Principal Software Engineer
Tadpole Computer / Computing Technologies Division,
General Dynamics C4 Systems
http://www.tadpolecomputer.com/
Phone: 951 325-2134  Fax: 951 325-2191


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to