[sane-devel] libusb - problems with open/close of device in backend?

stef svoltz@wanadoo.fr
Tue, 24 May 2005 14:07:28 +0200

On Tue, May 24, 2005 at 01:18:59PM +0200, stef wrote:
> On Mon, May 23, 2005 at 02:52:27PM -0400, m. allan noah wrote:
> > steven, i see this exact problem with certain fujitsu scanners. the 
> > difficulty is that USB uses a 0/1 toggling bit during the data transmit 
> > phase. when libusb closes the device, the device should reset the toggle 
> > back to 0, the kernel does. subsequent transmissions should start with 
> > toggle set to 0, but if device thinks it should be 1, then device ignores 
> > packets. windows never closes the device (the driver loads at bootup) so 
> > the fujitsu engineers had no idea what i was talking about (though i note 
> > that later usb2.0 fujitsu scanners do not have this problem)
> > 
> > you have three options that i see:
> > 
> > 1. count the number of data packets you 
> > are sending to scanner, and always send an even number. remember that just 
> > cause you sent or read 16 k of data, does not matter, it was busted up by 
> > lower layers. you need this larger number of smaller packets.
> > 
> > 2. get kernel/libusb to keep current toggle instead of trashing it.
> > 
> > 3. call usb_reset(device) as the very last step before you exit. this will 
> > cause the device to re-enumerate, and reset all of its internal data. 
> > while ugly, this works for me everytime. there are other functions like 
> > usb_clearhalt and usb_resetep, but those dont seem to fix my problem.
> > 
> > my advice? write a little prog that uses libusb directly, and try to do 
> > simple things outside the confines of sane.
> > 
> > allan
> > 
> 	Hello,
> 	this is really interesting.  I had an intermittent hangup with the
> genesys backend, depending of tha amount of scan data. I just couldn't 
> figured out why. Now, with your explanation, it does make sense. 
> Dependending on the number of bulk reads, the toggle wasn't set like it 
> should. So I did like you suggest: call usb_reset(device) before closing the
> device in sane_close(). That got rid of the hang (at least on HP2300C, need
> to double check for MD6471).
> 	Now my question is : would it be OK to do it in a backend ? Is there
> any drawback ?
> Regards,
> 	Stef
> -- 


	after some tests I can confirm that genesys hangs are related to the
'toggle' and that usb_reset() fix this. But unfortunately, resetting affects
all devices plugged in the usb ports: if I plug 2 scanners on the same pair
of USB ports, launch 2 xsane, then leave on -> bus is reset, and the left 
xsane can't work since it's device has also been reset.

	Well, I guess it's time to count data packets ....