Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 21 Dec 2012 15:15:23 +0800
From:      Xiaofan Chen <xiaofanc@gmail.com>
To:        Hans Petter Selasky <hselasky@c2i.net>
Cc:        "Wojciech A. Koszek" <wkoszek@freebsd.org>, freebsd-usb@freebsd.org
Subject:   Re: usb/173666: [USB, LIBUSB] usb_reset() behavior different between GNU/Linux and FreeBSD
Message-ID:  <CAGjSPUAw5P_qJu%2BZVGHn5yQuR33zchjgB7WfQvN=7TDq99N_Fg@mail.gmail.com>
In-Reply-To: <201211171319.34781.hselasky@c2i.net>
References:  <201211162247.qAGMlTm2057387@red.freebsd.org> <201211171319.34781.hselasky@c2i.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Nov 17, 2012 at 8:19 PM, Hans Petter Selasky <hselasky@c2i.net> wrote:
> On Friday 16 November 2012 23:47:29 Wojciech A. Koszek wrote:
>> >Number:         173666
>> >Category:       usb
>> >Synopsis:       [USB, LIBUSB] usb_reset() behavior different between
>> >GNU/Linux and FreeBSD Confidential:   no
>> >Severity:       non-critical
>> >Priority:       low
>> >Responsible:    freebsd-usb
>> >State:          open
>> >Quarter:
>> >Keywords:
>> >Date-Required:
>> >Class:          sw-bug
>> >Submitter-Id:   current-users
>> >Arrival-Date:   Fri Nov 16 22:50:00 UTC 2012
>> >Closed-Date:
>> >Last-Modified:
>> >Originator:     Wojciech A. Koszek
>> >Release:        9.0-RELEASE
>>
>> >Organization:
>> FreeBSD
>>
>> >Environment:
>> FreeBSD seu 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan  3 07:15:25 UTC
>> 2012     root@obrian.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386
>>
>> >Description:
>> I have a driver written for libusb, which works fine under GNU/Linux and
>> libusb. Device:
>>
>> gen0.2: <JSB283 Relay Module J-Works,Inc> at usbus0, cfg=0 md=HOST spd=LOW
>> (1.5Mbps) pwr=ON
>>
>> (I used USB sniffer to uncover traffic based on what Windows was doing)
>>
>> Under Linux usb_reset()+usb_set_configuration() calls works fine. Under
>> FreeBSD I have to disable calling usb_reset(), otherwise
>> usb_set_configuration() fails with I/O error.
>>
>
> According to:
>
> http://libusb.sourceforge.net/doc/function.usbreset.html
>
> What you describe is the expected behaviour.

The above document is really meant for libusb-0.1 but the
behavior of libusb-compat's usb_reset() is different since
it is based on libusb-1.0's libusb_reset_device.

http://git.libusb.org/?p=libusb-compat-0.1.git;a=blob;f=libusb/core.c
 743 API_EXPORTED int usb_reset(usb_dev_handle *dev)
 744 {
 745         usbi_dbg("");
 746         return compat_err(libusb_reset_device(dev->handle));
 747 }

For libusb-1.0 under Linux and Mac OS X, usually
 libusb_reset_device will not cause enumeration.

Reference:
http://libusb.6.n5.nabble.com/PATCH-make-libusb-reset-force-re-enumeration-on-Mac-td4499375.html

http://libusb.sourceforge.net/api-1.0/group__dev.html#ga7321bd8dc28e9a20b411bf18e6d0e9aa

int libusb_reset_device	(	libusb_device_handle * 	dev	)	
Perform a USB port reset to reinitialize a device.

The system will attempt to restore the previous configuration and
alternate settings after the reset has completed.

If the reset fails, the descriptors change, or the previous state
cannot be restored, the device will appear to be disconnected
and reconnected. This means that the device handle is no longer
valid (you should close it) and rediscover the device. A return code
of LIBUSB_ERROR_NOT_FOUND indicates when this is the case.

This is a blocking function which usually incurs a noticeable delay.

Parameters:
   dev	  a handle of the device to reset
Returns:
   0 on success
   LIBUSB_ERROR_NOT_FOUND if re-enumeration is required, or if the
      device has been disconnected
   another LIBUSB_ERROR code on other failure


-- 
Xiaofan



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAGjSPUAw5P_qJu%2BZVGHn5yQuR33zchjgB7WfQvN=7TDq99N_Fg>