On Tue, 1 Apr 2014, Peter Münster wrote: > On Tue, Apr 01 2014, Alan Stern wrote: > > > Also, I'd like to track down the problem when both devices are plugged > > into front ports. Can you try that as well, again without the new > > diagnostic patch? If the problem in this case is caused by a separate > > bug then we may not learn anything, but it's worth a try. Another thing I'd like to figure out is why 3.9 works okay when CONFIG_USB_SUSPEND is disabled. Below is 0aa2832dd0d9d860 back-ported to 3.9. Please try testing a 3.9 kernel with this patch installed (and also the first diagnostic patch, if it applies with no errors), with CONFIG_USB_SUSPEND _enabled_ and the mouse plugged into the rear port. If this combination works, then maybe you can do yet another git-bisect. Search between 3.9 and 0aa2832dd0d9d860, and at each step merge this patch into the kernel you are testing before you build it. Alan Stern Index: 3.9/drivers/usb/core/hub.c =================================================================== --- 3.9.orig/drivers/usb/core/hub.c +++ 3.9/drivers/usb/core/hub.c @@ -2880,9 +2880,11 @@ static int usb_disable_function_remotewa * Linux (2.6) currently has NO mechanisms to initiate that: no khubd * timer, no SRP, no requests through sysfs. * - * If CONFIG_USB_SUSPEND isn't enabled, devices only really suspend when - * the root hub for their bus goes into global suspend ... so we don't - * (falsely) update the device power state to say it suspended. + * If CONFIG_USB_SUSPEND isn't enabled, non-SuperSpeed devices really get + * suspended only when their bus goes into global suspend (i.e., the root + * hub is suspended). Nevertheless, we change @udev->state to + * USB_STATE_SUSPENDED as this is the device's "logical" state. The actual + * upstream port setting is stored in @udev->port_is_suspended. * * Returns 0 on success, else negative errno. */ @@ -2893,6 +2895,7 @@ int usb_port_suspend(struct usb_device * enum pm_qos_flags_status pm_qos_stat; int port1 = udev->portnum; int status; + bool really_suspend = true; /* enable remote wakeup when appropriate; this lets the device * wake up the upstream hub (including maybe the root hub). @@ -2949,9 +2952,19 @@ int usb_port_suspend(struct usb_device * /* see 7.1.7.6 */ if (hub_is_superspeed(hub->hdev)) status = hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_U3); - else + else if (PMSG_IS_AUTO(msg)) status = set_port_feature(hub->hdev, port1, USB_PORT_FEAT_SUSPEND); + /* + * For system suspend, we do not need to enable the suspend feature + * on individual USB-2 ports. The devices will automatically go + * into suspend a few ms after the root hub stops sending packets. + * The USB 2.0 spec calls this "global suspend". + */ + else { + really_suspend = false; + status = 0; + } if (status) { dev_dbg(hub->intfdev, "can't suspend port %d, status %d\n", port1, status); @@ -2987,8 +3000,10 @@ int usb_port_suspend(struct usb_device * (PMSG_IS_AUTO(msg) ? "auto-" : ""), udev->do_remote_wakeup); usb_set_device_state(udev, USB_STATE_SUSPENDED); - udev->port_is_suspended = 1; - msleep(10); + if (really_suspend) { + udev->port_is_suspended = 1; + msleep(10); + } } /* -- 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