I'm getting occasional timeouts for interrupt OUT writes and IN reads, and I have a theory but I'm looking for some input from people with more experience.
The device is an Atmel AT90USB162 chip running on a STK526 development board. The firmware is a slightly modified version of a generic hid example from Atmel. This is connected to a Linux host running Kernel 2.6.22-12-generic (under Ubuntu 7.10 32bit). The host machine has usb 1.1 only. I have a test program on the host build on libusb. This is what happens: After reseting my device, the a timeout happens on the first read or write if the previous run of the test program ended on an odd number of reads or writes since reset. Lets say I have one read operation per run of my test program. On the first run after device reset it will work, 2nd run will timeout, 3rd will work, 4th timeout, etc. If I change the test program to make two read requests, they never timeout. Same pattern for writes. I'm USB newbie, but my best theory is that the DATA0/DATA1 toggle on the device or the host is getting out of sync when the test program starts or ends, causing the host controller to throw away one good packet until it gets back in sync (meaning the linux driver never sees the data). There is little traffic on the bus, so it is easy to view with usbmon. This is the kernel's output for one run of the test program with two writes and a read just after device reset (all is working): cfc4ea80 2533411848 S Io:073:02 -115 8 = 01010000 00000000 cfc4ea80 2533424482 C Io:073:02 0 8 > cfc4ec00 2534643656 S Io:073:02 -115 8 = 9d050000 00000000 cfc4ec00 2534656329 C Io:073:02 0 8 > d78b5000 2534861031 S Ii:073:01 -115 8 < d78b5000 2534864299 C Ii:073:01 0 8 = 059d0000 00000000 cfc4e840 2535867107 S Co:073:00 s 01 0b 0000 0000 0000 0 cfc4e840 2535868186 C Co:073:00 0 0 Now run again without resetting the device. Two working writes and a read timeout: cb8a2420 2513765604 S Io:073:02 -115 8 = 01010000 00000000 cb8a2420 2513778931 C Io:073:02 0 8 > cb8a2c60 2514993749 S Io:073:02 -115 8 = 11050000 00000000 cb8a2c60 2515010776 C Io:073:02 0 8 > cb8a28a0 2515214664 S Ii:073:01 -115 8 < cb8a28a0 2517219497 C Ii:073:01 -2 0 cb8a2ea0 2518219870 S Co:073:00 s 01 0b 0000 0000 0000 0 cb8a2ea0 2518221382 C Co:073:00 0 0 So does my theory sound reasonable? Any other? Is there a way to tell what the host controller is expecting the DATA0/DATA1 state to be at any given time (I could make the device firmware set a LED to indicate which state it is sending or reading with)? And why is the following sent each time the test program ends: cfc4e840 2535867107 S Co:073:00 s 01 0b 0000 0000 0000 0 cfc4e840 2535868186 C Co:073:00 0 0 I believe this is the kernel telling interface 0 to use alternate setting 0. Would that come from the USBDEVFS_RELEASEINTERFACE IOCTL sent by libusb upon release the interface? Would you expect this to be resetting the host controllers data toggle to 0? I can look into the firmware to see what it is doing in response. Thanks, -Brad ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ Linux-usb-users@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-users