Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 31 Mar 2012 15:21:11 -0400
From:      Joe Marcus Clarke <marcus@freebsd.org>
To:        Andriy Gapon <avg@freebsd.org>
Cc:        gnome <gnome@freebsd.org>, Hans Petter Selasky <hselasky@c2i.net>
Subject:   Re: Fwd: Re: calibre: kindle usb connection problem
Message-ID:  <4F775927.1030400@freebsd.org>
In-Reply-To: <4F749FFD.7020707@FreeBSD.org>
References:  <4F749AD1.7020703@FreeBSD.org> <4F749B3B.5080803@FreeBSD.org> <4F749FFD.7020707@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 3/29/12 1:46 PM, Andriy Gapon wrote:

I wonder if this is a conflict between what hal is doing when it probes
the device and interface vs. what USB wants to do to attach the device.
 I'm copying hps to see if he can shed some light on this.  hps, please
see below where I attempt to highlight what hald is doing.  From reading
the USB code, I think hald might be triggering an error on attach and
causing the USB stack to free the device.  Perhaps some USB-level
debugging is required.

Joe

> 
> Not sure if the problem is caused by something in the device or by one of the
> hal's utilities.
> This is what I see in the system log:
> Mar 29 20:37:20 trant kernel: ugen2.2: <Amazon> at usbus2
> Mar 29 20:37:20 trant kernel: umass0: <Mass Storage> on usbus2
> Mar 29 20:37:20 trant kernel: ugen2.2: <Amazon> at usbus2 (disconnected)
> Mar 29 20:37:20 trant kernel: umass0: at uhub2, port 6, addr 2 (disconnected)
> Mar 29 20:37:22 trant kernel: ugen2.2: <Amazon> at usbus2
> Mar 29 20:37:22 trant kernel: umass0: <Mass Storage> on usbus2
> Mar 29 20:37:22 trant kernel: da0 at umass-sim0 bus 0 scbus8 target 0 lun 0
> Mar 29 20:37:22 trant kernel: da0: <Kindle Internal Storage 0100> Removable
> Direct Access SCSI-2 device
> Mar 29 20:37:22 trant kernel: da0: 40.000MB/s transfers
> Mar 29 20:37:22 trant kernel: da0: 3090MB (6328768 512 byte sectors: 255H 63S/T
> 393C)
> 
> Note how the umass driver attaches, then immediately detaches and two seconds
> later attaches again.
> Here's hald output from that period:
> 
> 20:37:17.378 [I] hf-devd.c:316: received devd event: !system=DEVFS
> subsystem=CDEV type=CREATE cdev=usb/2.2.0^M
> 20:37:17.378 [I] hf-devd.c:316: received devd event: !system=DEVFS
> subsystem=CDEV type=CREATE cdev=ugen2.2^M
> 20:37:19.448 [I] hf-devd.c:316: received devd event: !system=DEVFS
> subsystem=CDEV type=CREATE cdev=usb/2.2.1^M
> 20:37:20.576 [I] hf-devd.c:316: received devd event: !system=USB
> subsystem=DEVICE type=ATTACH ugen=ugen2.2 cdev=ugen2.2 vendor=0x1949
> product=0x0004 devclass=0x00 devsubclass=0x00 sernum="B008A0A00527517D"
> release=0x0100 mode=host port=6 parent=ugen2.1^M
> 20:37:20.577 [I] hf-usb2.c:213: received devd attach event, device ugen=ugen2.2^M
> Run started hald-probe-usb2-device (20000) (0) ^M
> !  full path is '/usr/local/libexec/hald-probe-usb2-device', program_dir is
> '/usr/local/libexec'^M

At this point, hald probes the ugen device and calls the following
functions:

libusb20_be_alloc_default
libusb20_be_device_foreach
 libusb20_dev_get_bus_number
 libusb20_dev_get_address
 libusb20_dev_open
 libusb20_dev_get_device_desc
 libusb20_dev_get_config_index
 libusb20_dev_alloc_config
 libusb20_dev_req_string_simple_sync
 libusb20_dev_get_speed
 libusb20_dev_close
libusb20_be_free

> pid 70609: rc=0 signaled=0: /usr/local/libexec/hald-probe-usb2-device^M
> 20:37:22.640 [I] hald.c:108: Added device to GDL;

After the device probe runs, the interface prober will execute.  These
probe helpers run synchronously.

> udi=/org/freedesktop/Hal/devices/usb_device_1949_4_B008A0A00527517D^M
> Run started hald-probe-usb2-interface (20000) (0) ^M

The interface prober runs the following functions:

libusb20_be_alloc_default
libusb20_be_device_foreach
 libusb20_dev_get_bus_number
 libusb20_dev_get_address
 libusb20_dev_get_config_index
 libusb20_dev_get_config_index
 libusb20_dev_req_string_simple_sync
 libusb20_dev_get_iface_desc
libusb20_be_free

> !  full path is '/usr/local/libexec/hald-probe-usb2-interface', program_dir is
> '/usr/local/libexec'^M
> pid 70610: rc=0 signaled=0: /usr/local/libexec/hald-probe-usb2-interface^M
> 20:37:22.665 [I] hald.c:108: Added device to GDL;
> udi=/org/freedesktop/Hal/devices/usb_device_1949_4_B008A0A00527517D_if0^M
> 20:37:22.666 [I] hf-devd.c:316: received devd event: !system=USB
> subsystem=INTERFACE type=ATTACH ugen=ugen2.2 cdev=ugen2.2 vendor=0x1949
> product=0x0004 devclass=0x00 devsubclass=0x00 sernum="B008A0A00527517D"
> release=0x0100 mode=host interface=0 endpoints=2 intclass=0x08 intsubclass=0x06
> intprotocol=0x50^M
> 20:37:22.666 [I] hf-devd.c:316: received devd event: +umass0 at bus=1 hubaddr=6
> port=2 devaddr=2 interface=0 vendor=0x1949 product=0x0004 devclass=0x00
> devsubclass=0x00 sernum="B008A0A00527517D" release=0x0100 mode=host
> intclass=0x08 intsubclass=0x06 intprotocol=0x50  on uhub2^M
> 20:37:22.671 [I] hald.c:108: Added device to GDL;
> udi=/org/freedesktop/Hal/devices/usb_device_1949_4_B008A0A00527517D_if0_scsi_host^M
> 20:37:22.681 [I] hf-devd.c:316: received devd event: !system=USB
> subsystem=DEVICE type=DETACH ugen=ugen2.2 cdev=ugen2.2 vendor=0x1949
> product=0x0004 devclass=0x00 devsubclass=0x00 sernum="B008A0A00527517D"
> release=0x0100 mode=host port=6 parent=ugen2.1^M
> 20:37:22.681 [I] hf-usb2.c:221: received devd detach event, device ugen=ugen2.2^M
> 20:37:22.682 [I] hald.c:143: Removed device from GDL;
> udi=/org/freedesktop/Hal/devices/usb_device_1949_4_B008A0A00527517D_if0_scsi_host^M
> 20:37:22.682 [I] hald.c:143: Removed device from GDL;
> udi=/org/freedesktop/Hal/devices/usb_device_1949_4_B008A0A00527517D_if0^M
> 20:37:22.683 [I] hald.c:143: Removed device from GDL;
> udi=/org/freedesktop/Hal/devices/usb_device_1949_4_B008A0A00527517D^M
> 20:37:22.685 [I] hf-devd.c:316: received devd event: !system=USB
> subsystem=INTERFACE type=DETACH ugen=ugen2.2 cdev=ugen2.2 vendor=0x1949
> product=0x0004 devclass=0x00 devsubclass=0x00 sernum="B008A0A00527517D"
> release=0x0100 mode=host interface=0 endpoints=2 intclass=0x08 intsubclass=0x06
> intprotocol=0x50^M
> 20:37:22.685 [I] hf-devd.c:316: received devd event: !system=DEVFS
> subsystem=CDEV type=DESTROY cdev=ugen2.2^M
> 20:37:23.188 [I] hald.c:108: Added device to GDL;
> udi=/org/freedesktop/Hal/devices/computer_scsi_host_6^M
> 20:37:23.190 [I] hald.c:108: Added device to GDL;
> udi=/org/freedesktop/Hal/devices/computer_scsi_host_6_scsi_device_lun0^M
> Run started hald-probe-scsi (20000) (0) ^M
> 
> 
> Note how computer_scsi_host_6 device is getting inserted when
> usb_device_1949_4_B008A0A00527517D_if0_scsi_host is removed.
> I think that this is where the USB ancestry information is lost.
> 
> 
> on 29/03/2012 20:26 Andriy Gapon said the following:
>>
>>
>> -------- Original Message --------
>> Message-ID: <4F749AD1.7020703@FreeBSD.org>
>> Date: Thu, 29 Mar 2012 20:24:33 +0300
>> From: Andriy Gapon <avg@FreeBSD.org>
>> Subject: Re: calibre: kindle usb connection problem
>> References: <4F749941.8070704@FreeBSD.org>
>>
>> on 29/03/2012 20:17 Andriy Gapon said the following:
>>>
>>> Looks like calibre is no longer able to detect my Kindle via USB (calibre is at
>>> version 0.8.40).
>>> The problem seems to be that the umass<->da relationship is not reflected in the
>>> HAL device hierarchy in the way that calibre expects.
>>>
>>> This is the ancestry line for the Kindle da device:
>>
>> Now even weirder stuff.  I disconnected/reconnected the Kindle and now it is
>> directly under the computer device:
>> udi = '/org/freedesktop/Hal/devices/computer_storage'
>>   block.device = '/dev/da0'  (string)
>>   block.is_volume = false  (bool)
>>   block.major = 0  (0x0)  (int)
>>   block.minor = 232  (0xe8)  (int)
>>   block.storage_device = '/org/freedesktop/Hal/devices/computer_storage'  (string)
>>   freebsd.device_file = '/dev/da0'  (string)
>>   freebsd.driver = 'da'  (string)
>>   freebsd.unit = 0  (0x0)  (int)
>>   info.capabilities = {'block', 'storage'} (string list)
>>   info.category = 'storage'  (string)
>>   info.parent = '/org/freedesktop/Hal/devices/computer'  (string)
>>   info.product = 'Storage Device'  (string)
>>   info.subsystem = 'block'  (string)
>>   info.udi = '/org/freedesktop/Hal/devices/computer_storage'  (string)
>>   storage.automount_enabled_hint = true  (bool)
>>   storage.bus = 'platform'  (string)
>>   storage.drive_type = 'disk'  (string)
>>   storage.hotpluggable = false  (bool)
>>   storage.media_check_enabled = false  (bool)
>>   storage.model = ''  (string)
>>   storage.no_partitions_hint = false  (bool)
>>   storage.originating_device = ''  (string)
>>   storage.removable = false  (bool)
>>   storage.removable.support_async_notification = false  (bool)
>>   storage.requires_eject = false  (bool)
>>   storage.vendor = ''  (string)
>>
>> camcontrol sees it properly:
>> amcontrol devlist -v
>> scbus0 on ahcich0 bus 0:
>> <ST3500410AS CC34>                 at scbus0 target 0 lun 0 (pass0,ada0)
>> <>                                 at scbus0 target -1 lun -1 ()
>> scbus1 on ahcich1 bus 0:
>> <ST3500418AS CC34>                 at scbus1 target 0 lun 0 (pass1,ada1)
>> <>                                 at scbus1 target -1 lun -1 ()
>> scbus2 on ahcich2 bus 0:
>> <WDC WD4000AAKS-00YGA0 12.01C02>   at scbus2 target 0 lun 0 (pass2,ada2)
>> <>                                 at scbus2 target -1 lun -1 ()
>> scbus3 on ahcich3 bus 0:
>> <>                                 at scbus3 target -1 lun -1 ()
>> scbus4 on ahcich4 bus 0:
>> <>                                 at scbus4 target -1 lun -1 ()
>> scbus5 on ahcich5 bus 0:
>> <Optiarc DVD RW AD-7191S 1.02>     at scbus5 target 0 lun 0 (pass3,cd0)
>> <>                                 at scbus5 target -1 lun -1 ()
>> scbus6 on ata0 bus 0:
>> <>                                 at scbus6 target -1 lun -1 ()
>> scbus7 on sbp0 bus 0:
>> <>                                 at scbus7 target -1 lun -1 ()
>> scbus8 on umass-sim0 bus 0:
>> <Kindle Internal Storage 0100>     at scbus8 target 0 lun 0 (da0,pass4)
>> scbus-1 on xpt0 bus 0:
>> <>                                 at scbus-1 target -1 lun -1 (xpt0)
>>
>>
>>> udi = '/org/freedesktop/Hal/devices/computer_scsi_host_6'
>>>   info.parent = '/org/freedesktop/Hal/devices/computer'  (string)
>>>   info.product = 'SCSI Host Adapter'  (string)
>>>   info.subsystem = 'scsi_host'  (string)
>>>   info.udi = '/org/freedesktop/Hal/devices/computer_scsi_host_6'  (string)
>>>   scsi_host.host = 8  (0x8)  (int)
>>>
>>> udi = '/org/freedesktop/Hal/devices/computer_scsi_host_6_scsi_device_lun0'
>>>   info.parent = '/org/freedesktop/Hal/devices/computer_scsi_host_6'  (string)
>>>   info.product = 'SCSI Device'  (string)
>>>   info.subsystem = 'scsi'  (string)
>>>   info.udi =
>>> '/org/freedesktop/Hal/devices/computer_scsi_host_6_scsi_device_lun0'  (string)
>>>   info.vendor = 'Kindle'  (string)
>>>   scsi.bus = 8  (0x8)  (int)
>>>   scsi.host = 8  (0x8)  (int)
>>>   scsi.lun = 0  (0x0)  (int)
>>>   scsi.model = 'Internal Storage'  (string)
>>>   scsi.target = 0  (0x0)  (int)
>>>   scsi.type = 'disk'  (string)
>>>   scsi.vendor = 'Kindle'  (string)
>>>
>>> udi = '/org/freedesktop/Hal/devices/storage_model_Internal_Storage'
>>>   block.device = '/dev/da0'  (string)
>>>   block.freebsd.cam_path = '8,0,0'  (string)
>>>   block.is_volume = false  (bool)
>>>   block.major = 0  (0x0)  (int)
>>>   block.minor = 232  (0xe8)  (int)
>>>   block.storage_device =
>>> '/org/freedesktop/Hal/devices/storage_model_Internal_Storage'  (string)
>>>   freebsd.device_file = '/dev/da0'  (string)
>>>   freebsd.driver = 'da'  (string)
>>>   freebsd.unit = 0  (0x0)  (int)
>>>   info.addons = {'hald-addon-storage'} (string list)
>>>   info.capabilities = {'block', 'storage'} (string list)
>>>   info.category = 'storage'  (string)
>>>   info.interfaces = {'org.freedesktop.Hal.Device.Storage.Removable'} (string list)
>>>   info.parent =
>>> '/org/freedesktop/Hal/devices/computer_scsi_host_6_scsi_device_lun0'  (string)
>>>   info.product = 'Internal Storage'  (string)
>>>   info.subsystem = 'block'  (string)
>>>   info.udi = '/org/freedesktop/Hal/devices/storage_model_Internal_Storage'  (string)
>>>   info.vendor = 'Kindle'  (string)
>>>   storage.automount_enabled_hint = true  (bool)
>>>   storage.bus = 'scsi'  (string)
>>>   storage.drive_type = 'disk'  (string)
>>>   storage.firmware_revision = '0100'  (string)
>>>   storage.hotpluggable = false  (bool)
>>>   storage.lun = 0  (0x0)  (int)
>>>   storage.media_check_enabled = true  (bool)
>>>   storage.model = 'Internal Storage'  (string)
>>>   storage.no_partitions_hint = false  (bool)
>>>   storage.originating_device =
>>> '/org/freedesktop/Hal/devices/computer_scsi_host_6_scsi_device_lun0'  (string)
>>>   storage.removable = true  (bool)
>>>   storage.removable.support_async_notification = false  (bool)
>>>   storage.requires_eject = false  (bool)
>>>   storage.vendor = 'Kindle'  (string)
>>>
>>> Here is the umass device:
>>>
>>> udi = '/org/freedesktop/Hal/devices/usb_device_1949_4_B008A0A00527517D_if0'
>>>   freebsd.driver = 'umass'  (string)
>>>   freebsd.unit = 0  (0x0)  (int)
>>>   info.bus = 'usb'  (string)
>>>   info.parent =
>>> '/org/freedesktop/Hal/devices/usb_device_1949_4_B008A0A00527517D'  (string)
>>>   info.product = 'Amazon Kindle'  (string)
>>>   info.subsystem = 'usb'  (string)
>>>   info.udi =
>>> '/org/freedesktop/Hal/devices/usb_device_1949_4_B008A0A00527517D_if0'  (string)
>>>   info.vendor = 'Amazon'  (string)
>>>   usb.bus_number = 2  (0x2)  (int)
>>>   usb.can_wake_up = false  (bool)
>>>   usb.configuration = 'Self-powered'  (string)
>>>   usb.configuration_value = 1  (0x1)  (int)
>>>   usb.device_class = 0  (0x0)  (int)
>>>   usb.device_protocol = 0  (0x0)  (int)
>>>   usb.device_revision_bcd = 256  (0x100)  (int)
>>>   usb.device_subclass = 0  (0x0)  (int)
>>>   usb.freebsd.devname = 'umass0'  (string)
>>>   usb.interface.class = 8  (0x8)  (int)
>>>   usb.interface.description = 'Mass Storage'  (string)
>>>   usb.interface.number = 0  (0x0)  (int)
>>>   usb.interface.protocol = 80  (0x50)  (int)
>>>   usb.interface.subclass = 6  (0x6)  (int)
>>>   usb.is_self_powered = true  (bool)
>>>   usb.level_number = 1  (0x1)  (int)
>>>   usb.max_power = 0  (0x0)  (int)
>>>   usb.num_configurations = 1  (0x1)  (int)
>>>   usb.num_interfaces = 1  (0x1)  (int)
>>>   usb.num_ports = 0  (0x0)  (int)
>>>   usb.port_number = 2  (0x2)  (int)
>>>   usb.product = 'Amazon Kindle'  (string)
>>>   usb.product_id = 4  (0x4)  (int)
>>>   usb.serial = 'B008A0A00527517D'  (string)
>>>   usb.speed = 480.0 (480) (double)
>>>   usb.speed_bcd = 294912  (0x48000)  (int)
>>>   usb.vendor = 'Amazon'  (string)
>>>   usb.vendor_id = 6473  (0x1949)  (int)
>>>   usb.version = 2.0 (2) (double)
>>>
>>> What do you think?
>>> Is this a FreeBSD HAL problem?
>>>
>>
> 
> 


-- 
Joe Marcus Clarke
FreeBSD GNOME Team	::	gnome@FreeBSD.org
FreeNode / #freebsd-gnome
http://www.FreeBSD.org/gnome



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4F775927.1030400>