[sane-devel] libusb - problems with open/close of device in backend?
stef
svoltz@wanadoo.fr
Tue, 24 May 2005 13:18:59 +0200
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