Re: USB reset xhci_hcd for ELAN touchscreen

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jul 07, 2014 at 11:24:42AM +0200, Johan Hovold wrote:
> On Sun, Jun 01, 2014 at 10:43:21AM -0700, Greg Kroah-Hartman wrote:
> > On Sun, Jun 01, 2014 at 12:21:55PM -0400, Alan Stern wrote:
> > > On Sun, 1 Jun 2014, Bjørn Mork wrote:
> > > 
> > > > Greg KH <gregkh@xxxxxxxxxxxxxxxxxxx> writes:
> > > > 
> > > > > Ok, here's the dump for when the device keeps disconnecting itself from
> > > > > the bus (no call to check_highspeed() anymore).
> > > > >
> > > > > Things go better, but then the device just goes quiet, and resets.  Any
> > > > > ideas?  I'll dig further this evening...
> > > > >
> > > > > ffff8800d906a0c0 2610372685 S Ci:2:112:0 s 80 06 0100 0000 0012 18 <
> > > > > ffff8800d906a0c0 2610372929 C Ci:2:112:0 0 18 = 12010002 00000008 f3048900 1300040e 0001
> > > > > ffff8801d684d540 2610372974 S Ci:2:112:0 s 80 06 0200 0000 0009 9 <
> > > > > ffff8801d684d540 2610373139 C Ci:2:112:0 0 9 = 09022900 010100e0 32
> > > > > ffff8801d684d540 2610373167 S Ci:2:112:0 s 80 06 0200 0000 0029 41 <
> > > > > ffff8801d684d540 2610373479 C Ci:2:112:0 0 41 = 09022900 010100e0 32090400 00020300 00000921 10010001 229d0307 05810340
> > > > > ffff8801d684dd80 2610373508 S Ci:2:112:0 s 80 06 0300 0000 00ff 255 <
> > > > > ffff8801d684dd80 2610373612 C Ci:2:112:0 0 4 = 04030904
> > > > > ffff8801d684dd80 2610373636 S Ci:2:112:0 s 80 06 030e 0409 00ff 255 <
> > > > > ffff8801d684dd80 2610373895 C Ci:2:112:0 0 24 = 18035400 6f007500 63006800 73006300 72006500 65006e00
> > > > > ffff8801d684dd80 2610373922 S Ci:2:112:0 s 80 06 0304 0409 00ff 255 <
> > > > > ffff8801d684dd80 2610374066 C Ci:2:112:0 0 10 = 0a034500 4c004100 4e00
> > > > > ffff8800d906a9c0 2610374602 S Co:2:112:0 s 00 09 0001 0000 0000 0
> > > > > ffff8800d906a9c0 2610374645 C Co:2:112:0 0 0
> > > > 
> > > > set config is successful, and then it looks like you are entering
> > > > usbhid_parse(), which is called during hid_add_device(): 
> > > > 
> > > > > ffff8800d906a780 2610374837 S Co:2:112:0 s 21 0a 0000 0000 0000 0
> > > > > ffff8800d906a780 2610374940 C Co:2:112:0 0 0
> > > > 
> > > >         hid_set_idle(dev, interface->desc.bInterfaceNumber, 0, 0);
> > > > 
> > > > > ffff8801d684d0c0 2610374976 S Ci:2:112:0 s 81 06 2200 0000 039d 925 <
> > > > > ffff8801d684d0c0 2610379698 C Ci:2:112:0 0 925 = 050d0904 a1018501 0922a102 09421500 25017501 95018102 75018103 75060951
> > > > 
> > > >         ret = hid_get_class_descriptor(dev, interface->desc.bInterfaceNumber,
> > > >                         HID_DT_REPORT, rdesc, rsize);
> > > > 
> > > > > ffff8801d684d840 2610381285 S Ci:2:001:0 s a3 00 0000 0007 0004 4 <
> > > > > ffff8801d684d840 2610381303 C Ci:2:001:0 0 4 = 03010000
> > > > 
> > > > And there you lost the device? And me with it...
> > > 
> > > Not there exactly.  This is normal; the hub driver checks the hub's 
> > > port status again after the device has been initialized and registered.
> > > 
> > > The real problem happened a couple of seconds later:
> > > 
> > > > ffff880211d106c0 2612480635 C Ii:2:001:1 0:2048 2 = 8000
> > > > ffff880211d106c0 2612480649 S Ii:2:001:1 -115:2048 4 <
> > > > ffff8800739bd240 2612480693 S Ci:2:001:0 s a3 00 0000 0007 0004 4 <
> > > > ffff8800739bd240 2612480711 C Ci:2:001:0 0 4 = 00010100
> > > 
> > > This shows the device disconnected itself from the USB bus.  No obvious 
> > > reason why.  As a wild guess, perhaps the device expected to receive 
> > > some packets from the host and got confused when they didn't arrive.
> > > 
> > > Notice that there was no activity from any HID driver.  Once the report 
> > > descriptor was fetched, nothing more happened.  Did any driver bind to 
> > > the HID device?  What does the dmesg log say?
> > > 
> > > > But if this device really isn't able to cope with the
> > > > USB_DT_DEVICE_QUALIFIER descriptor request, then it might not be
> > > > prepared for anything "out of the ordinary"? Is there any other possible
> > > > explanation for the sudden resets than a firmware crash due to
> > > > unexpected input?
> > > 
> > > There was no unexpected input.  In fact, there was no input at all 
> > > after the kernel read the report descriptor.  Not only was no data sent 
> > > either way, there weren't even any URBs submitted for input or output.
> > > 
> > > > The failure seems to happen before any of the known HID quirks have any
> > > > effect, so who knows what can be done differently here? Maybe you have
> > > > to dump the exact sequence used by Windows and recreate that somehow?
> > > > 
> > > > Or just play with a userspace program to see what kind of requests you
> > > > can send to this device without making it crash (after temporarily
> > > > blacklisting usbhid to avoid the initial crash)?
> > > 
> > > It doesn't look to me like a crash.  It looks more like the driver is 
> > > missing.
> > 
> > Doh, I had based my kernel config on my desktop, and it didn't have the
> > hid multitouch driver enabled.
> > 
> > Turning that on and, wow, it works!  Thanks for pointing out my stupid
> > error.
> > 
> > So, new quirk time, for a device that can't handle the check_highspeed
> > command.  I'll do that late tonight after I go handle some household
> > responsibilities.
> 
> I ended up getting the same laptop so now I'm facing the same problem
> with repeated disconnects (especially during resume, which is really
> annoying as it adds about a minute to resume time), even with a
> hard-coded check-high speed "quirk" and the multitouch driver loaded.
> 
> Did you manage to fix the disconnect issue? Are you seeing something
> similar at resume?

No, it all seems to work for me.  Here's my horrible "hack" I'm running
with on 3.16-rc.

I have seen some issues at times when the touchscreen stops working on
resume, but it just seems "dead".  An unload/load of the xhci-hcd module
always fixes that :)

I'll work on making this a "real" patch this week, when I dig out from
my pending patch queue...

thanks,

greg k-h

------------------------

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 21b99b4b4082..7b4c16b408b6 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -4456,6 +4456,7 @@ check_highspeed (struct usb_hub *hub, struct usb_device *udev, int port1)
 	struct usb_qualifier_descriptor	*qual;
 	int				status;
 
+	return;
 	qual = kmalloc (sizeof *qual, GFP_KERNEL);
 	if (qual == NULL)
 		return;
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index 0c8a7fc4dad8..347c7231b802 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -644,7 +644,8 @@ int usb_get_descriptor(struct usb_device *dev, unsigned char type,
 				USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
 				(type << 8) + index, 0, buf, size,
 				USB_CTRL_GET_TIMEOUT);
-		if (result <= 0 && result != -ETIMEDOUT)
+		if (result == 0 || result == -EPIPE)
+//		if (result <= 0 && result != -ETIMEDOUT)
 			continue;
 		if (result > 1 && ((u8 *)buf)[1] != type) {
 			result = -ENODATA;
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux