Hi,
On 9/17/20 10:09 PM, Alan Stern wrote:
On Thu, Sep 17, 2020 at 07:27:03PM +0200, Hans de Goede wrote:
Hi,
On 9/10/20 5:41 PM, Alan Stern wrote:
On Thu, Sep 10, 2020 at 03:58:49PM +0200, Hans de Goede wrote:
Hi,
On 9/6/20 4:22 AM, Alan Stern wrote:
On Sat, Sep 05, 2020 at 01:37:38PM +0200, Hans de Goede wrote:
Hi All,
I have been debugging an issue with a 2-in-1 which
consists of a tablet + a kbd-dock, where the device
turns into a clamshell when docked into the kbd-dock.
The kbd dock is connected via pogo-pins. This works
fine when docked at boot. But there is an enumeration
issue when hot-docked (and the keyboard looses power
when the lid is closedm so this also triggers after
a suspend/resume):
[ 3498.924190] usb 1-3: new full-speed USB device number 5 using xhci_hcd
[ 3499.041725] usb 1-3: device descriptor read/64, error -71
[ 3515.215890] usb 1-3: device descriptor read/64, error -110
[ 3515.440369] usb 1-3: new full-speed USB device number 6 using xhci_hcd
[ 3515.603544] usb 1-3: New USB device found, idVendor=06cb, idProduct=73f5, bcdDevice= 0.02
[ 3515.603574] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 3515.603596] usb 1-3: Product: ITE Device(8910)
[ 3515.603614] usb 1-3: Manufacturer: ITE Tech. Inc.
Note there is about 6 seconds before the keyboard becomes
usable, which is quite long when trying to unlock the
laptop after opening the lid.
If I set the USB_PORT_QUIRK_OLD_SCHEME on the port used by the kbd-dock:
echo 1 > /sys/devices/pci0000\:00/0000\:00\:14.0/usb1/1-0\:1.0/usb1-port3/quirks
Then this changes to:
[ 4467.875008] usb 1-3: new full-speed USB device number 7 using xhci_hcd
[ 4467.878483] usb 1-3: Device not responding to setup address.
[ 4468.082476] usb 1-3: Device not responding to setup address.
[ 4468.289990] usb 1-3: device not accepting address 7, error -71
[ 4468.614928] usb 1-3: new full-speed USB device number 8 using xhci_hcd
[ 4468.662392] usb 1-3: New USB device found, idVendor=06cb, idProduct=73f5, bcdDevice= 0.02
[ 4468.662423] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 4468.662444] usb 1-3: Product: ITE Device(8910)
[ 4468.662461] usb 1-3: Manufacturer: ITE Tech. Inc.
Which is a lot better wrt making the keyboard available for
use in a timely manner.
So now I'm looking into a way to automatically do this. I would
prefer to keep the handling of this out of the kernel, so I looked into
udev, but it seems that the usb_port_device_type device-s registered by
usb_hub_create_port_device() are not visible to udev?
At least I'm not seeing them, in the output of "udevadm info -e"
My impression is that fixing this would be the simplest approach.
I agree that first trying to fix it is a good idea.
<snip>
Have you tried decreasing the initial_descriptor_timeout module
parameter for usbcore? That would probably help, but it's kind of a
sledgehammer.
So I tried this:
[root@localhost ~]# cat /sys/module/usbcore/parameters/initial_descriptor_timeout
1000
But it does not really seem to help:
[ 1171.435346] usb 1-3: USB disconnect, device number 2
[ 1180.430958] usb 1-3: new full-speed USB device number 3 using xhci_hcd
[ 1180.551543] usb 1-3: device descriptor read/64, error -71
[ 1184.045548] usb 1-3: device descriptor read/64, error -110
[ 1184.270924] usb 1-3: new full-speed USB device number 4 using xhci_hcd
[ 1184.438336] usb 1-3: New USB device found, idVendor=06cb, idProduct=73f5, bcdDevice= 0.02
[ 1184.438371] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 1184.438399] usb 1-3: Product: ITE Device(8910)
[ 1184.438425] usb 1-3: Manufacturer: ITE Tech. Inc.
That part of hub.c is a real mess. Coincidentally, I just posted a
patch to try and fix it up a bit:
https://marc.info/?l=linux-usb&m=159959185227447&w=2
Ok, I've applied the patch and tried again (with initial_descriptor_timeout still set to 1000),
so now the log from the reconnect looks look this:
[ 1157.248439] usb 1-3: new full-speed USB device number 3 using xhci_hcd
[ 1157.254234] usb 1-3: device descriptor read/64, error -71
[ 1157.371442] usb 1-3: new full-speed USB device number 4 using xhci_hcd
[ 1158.377895] usb 1-3: device descriptor read/64, error -110
[ 1158.379646] usb usb1-port3: attempt power cycle
[ 1159.014480] usb 1-3: new full-speed USB device number 5 using xhci_hcd
[ 1159.176112] usb 1-3: New USB device found, idVendor=06cb, idProduct=73f5, bcdDevice= 0.02
[ 1159.176138] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 1159.176156] usb 1-3: Product: ITE Device(8910)
[ 1159.176172] usb 1-3: Manufacturer: ITE Tech. Inc.
Still a bit slower then the old probe method, but much better then the
new probe method with the default initial_descriptor_timeout.
Yeah, okay, it's good to see that the patch helps. But I'm doubtful
that the change it makes will become part of the standard (i.e., not
for embedded systems) kernel.
I still think the udev approach will be best. That will require adding
various *_uevent_* calls in usb_hub_create_port_device, and adding a
.uevent member to usb_port_device_type.
So I tried this and it does not work, the problem is that
dev_uevent_filter() from drivers/base/core.c
filters out uevents for anything which is not either a device
on a bus or a class device:
static int dev_uevent_filter(struct kset *kset, struct kobject *kobj)
{
struct kobj_type *ktype = get_ktype(kobj);
if (ktype == &device_ktype) {
struct device *dev = kobj_to_dev(kobj);
if (dev->bus)
return 1;
if (dev->class)
return 1;
}
return 0;
}
(as mentioned this is a low priority thing for me, so hence
the long time between replies)
Regards,
Hans