Good morning Alan,

I just finished testing your latest patch on Ubuntu 14.04.4 LTS (4.2.x
kernel) and Ubuntu 16.04 LTS (4.4.x kernel) on x86/x64, and it resolves
the issues I've encountered. May we please have this patch submitted for
review?

Thank you and the linux-usb developers for your time and assistance with
this issue.

============================================================
Matthew Giassa, MASc, BASc, EIT
Security and Embedded Systems Specialist
linkedin: https://ca.linkedin.com/in/giassa
e-mail:   [email protected]
website:  www.giassa.net

> -------- Original Message --------
> Subject: Alan's latest patch
> From: Matthew Giassa <[email protected]>
> Date: Sat, April 23, 2016 7:33 am
> To: Matthew Giassa <[email protected]>
> 
> 
> https://marc.info/?l=linux-usb&m=146134592012790&w=2
> 
> 
> 
> [prev in list] [next in list] [prev in thread] [next in thread]
> 
> List:       linux-usb
> Subject:    RE: [PATCH 1/1] usb: lpm: add boot flag to disable lpm
> From:       Alan Stern <stern () rowland ! harvard ! edu>
> Date:       2016-04-22 17:25:15
> Message-ID: Pine.LNX.4.44L0.1604221321000.2270-100000 () iolanthe ! 
> rowland ! org
> [Download message RAW]
> 
> Please remember to use Reply-To-All so that your messages get sent to
> the mailing list as well as to me.
> 
> On Thu, 21 Apr 2016, Matthew Giassa wrote:
> 
>  > Hi Alan,
>  >
>  > I've tested your latest patch, and here is a subset of the output in
>  > `dmesg':
> 
> ...
>  > [   44.975704] enable LPM
>  > [   44.975707] CPU: 4 PID: 2491 Comm: FlyCap2 Tainted: G            E
>  > 4.5.0-astern-logging+ #11
>  > [   44.975708] Hardware name: ASUS All Series/Z97-PRO(Wi-Fi ac), BIOS
>  > 2012 09/30/2014
>  > [   44.975708]  0000000000000000 ffff880217c9bd50 ffffffff813c2ccc
>  > ffff8802362c5000
>  > [   44.975710]  ffff88023308a000 ffff880217c9bd78 ffffffff815ceadf
>  > ffff88023308a000
>  > [   44.975711]  ffff8802362c5000 ffffffff81ce5860 ffff880217c9bd98
>  > ffffffff815ceb1c
>  > [   44.975713] Call Trace:
>  > [   44.975715]  [<ffffffff813c2ccc>] dump_stack+0x63/0x87
>  > [   44.975717]  [<ffffffff815ceadf>] usb_enable_lpm+0x10f/0x120
>  > [   44.975718]  [<ffffffff815ceb1c>] usb_unlocked_enable_lpm+0x2c/0x40
>  > [   44.975719]  [<ffffffff815dd10e>]
>  > usb_driver_claim_interface+0xbe/0x110
>  > [   44.975720]  [<ffffffff815e386b>] claimintf+0x5b/0x80
>  > [   44.975721]  [<ffffffff815e6960>] usbdev_do_ioctl+0xd10/0x1180
>  > [   44.975723]  [<ffffffff815e6dfe>] usbdev_ioctl+0xe/0x20
>  > [   44.975724]  [<ffffffff812174a6>] do_vfs_ioctl+0x96/0x590
>  > [   44.975725]  [<ffffffff810fb491>] ? SyS_futex+0x71/0x150
>  > [   44.975727]  [<ffffffff81217a19>] SyS_ioctl+0x79/0x90
>  > [   44.975729]  [<ffffffff817e2036>] entry_SYSCALL_64_fastpath+0x16/0x75
> ...
> 
> Now I see the problem.  The patch changed usb_probe_interface, but I
> forgot to change usb_driver_claim_interface also.  Try this version of
> the patch instead.  It also has the extra debugging output, but now it
> shouldn't ever get triggered.
> 
> Alan Stern
> 
> 
> 
> Index: usb-4.x/include/linux/usb.h
> ===================================================================
> --- usb-4.x.orig/include/linux/usb.h
> +++ usb-4.x/include/linux/usb.h
> @@ -1069,7 +1069,7 @@ struct usbdrv_wrap {
>    *  for interfaces bound to this driver.
>    * @soft_unbind: if set to 1, the USB core will not kill URBs and disable
>    *  endpoints before calling the driver's disconnect method.
> - * @disable_hub_initiated_lpm: if set to 0, the USB core will not allow 
> hubs
> + * @disable_hub_initiated_lpm: if set to 1, the USB core will not allow 
> hubs
>    *  to initiate lower power link state transitions when an idle timeout
>    *  occurs.  Device-initiated USB 3.0 link PM will still be allowed.
>    *
> Index: usb-4.x/drivers/usb/core/driver.c
> ===================================================================
> --- usb-4.x.orig/drivers/usb/core/driver.c
> +++ usb-4.x/drivers/usb/core/driver.c
> @@ -284,7 +284,7 @@ static int usb_probe_interface(struct de
>       struct usb_device *udev = interface_to_usbdev(intf);
>       const struct usb_device_id *id;
>       int error = -ENODEV;
> -     int lpm_disable_error;
> +     int lpm_disable_error = -ENODEV;
> 
>       dev_dbg(dev, "%s\n", __func__);
> 
> @@ -336,12 +336,14 @@ static int usb_probe_interface(struct de
>        * setting during probe, that should also be fine.  usb_set_interface()
>        * will attempt to disable LPM, and fail if it can't disable it.
>        */
> -     lpm_disable_error = usb_unlocked_disable_lpm(udev);
> -     if (lpm_disable_error && driver->disable_hub_initiated_lpm) {
> -             dev_err(&intf->dev, "%s Failed to disable LPM for driver %s\n.",
> -                             __func__, driver->name);
> -             error = lpm_disable_error;
> -             goto err;
> +     if (driver->disable_hub_initiated_lpm) {
> +             lpm_disable_error = usb_unlocked_disable_lpm(udev);
> +             if (lpm_disable_error) {
> +                     dev_err(&intf->dev, "%s Failed to disable LPM for 
> driver %s\n.",
> +                                     __func__, driver->name);
> +                     error = lpm_disable_error;
> +                     goto err;
> +             }
>       }
> 
>       /* Carry out a deferred switch to altsetting 0 */
> @@ -391,7 +393,8 @@ static int usb_unbind_interface(struct d
>       struct usb_interface *intf = to_usb_interface(dev);
>       struct usb_host_endpoint *ep, **eps = NULL;
>       struct usb_device *udev;
> -     int i, j, error, r, lpm_disable_error;
> +     int i, j, error, r;
> +     int lpm_disable_error = -ENODEV;
> 
>       intf->condition = USB_INTERFACE_UNBINDING;
> 
> @@ -399,12 +402,13 @@ static int usb_unbind_interface(struct d
>       udev = interface_to_usbdev(intf);
>       error = usb_autoresume_device(udev);
> 
> -     /* Hub-initiated LPM policy may change, so attempt to disable LPM until
> +     /* If hub-initiated LPM policy may change, attempt to disable LPM until
>        * the driver is unbound.  If LPM isn't disabled, that's fine because it
>        * wouldn't be enabled unless all the bound interfaces supported
>        * hub-initiated LPM.
>        */
> -     lpm_disable_error = usb_unlocked_disable_lpm(udev);
> +     if (driver->disable_hub_initiated_lpm)
> +             lpm_disable_error = usb_unlocked_disable_lpm(udev);
> 
>       /*
>        * Terminate all URBs for this interface unless the driver
> @@ -505,7 +509,7 @@ int usb_driver_claim_interface(struct us
>       struct device *dev;
>       struct usb_device *udev;
>       int retval = 0;
> -     int lpm_disable_error;
> +     int lpm_disable_error = -ENODEV;
> 
>       if (!iface)
>               return -ENODEV;
> @@ -526,12 +530,14 @@ int usb_driver_claim_interface(struct us
> 
>       iface->condition = USB_INTERFACE_BOUND;
> 
> -     /* Disable LPM until this driver is bound. */
> -     lpm_disable_error = usb_unlocked_disable_lpm(udev);
> -     if (lpm_disable_error && driver->disable_hub_initiated_lpm) {
> -             dev_err(&iface->dev, "%s Failed to disable LPM for driver 
> %s\n.",
> -                             __func__, driver->name);
> -             return -ENOMEM;
> +     /* See the comment about disabling LPM in usb_probe_interface(). */
> +     if (driver->disable_hub_initiated_lpm) {
> +             lpm_disable_error = usb_unlocked_disable_lpm(udev);
> +             if (lpm_disable_error) {
> +                     dev_err(&iface->dev, "%s Failed to disable LPM for 
> driver %s\n.",
> +                                     __func__, driver->name);
> +                     return -ENOMEM;
> +             }
>       }
> 
>       /* Claimed interfaces are initially inactive (suspended) and
> Index: usb-4.x/drivers/usb/core/devio.c
> ===================================================================
> --- usb-4.x.orig/drivers/usb/core/devio.c
> +++ usb-4.x/drivers/usb/core/devio.c
> @@ -738,6 +738,8 @@ struct usb_driver usbfs_driver = {
>       .resume =       driver_resume,
>   };
> 
> +int alantest;
> +
>   static int claimintf(struct usb_dev_state *ps, unsigned int ifnum)
>   {
>       struct usb_device *dev = ps->dev;
> @@ -757,8 +759,11 @@ static int claimintf(struct usb_dev_stat
>       intf = usb_ifnum_to_if(dev, ifnum);
>       if (!intf)
>               err = -ENOENT;
> -     else
> +     else {
> +             alantest = 1;
>               err = usb_driver_claim_interface(&usbfs_driver, intf, ps);
> +             alantest = 0;
> +     }
>       if (err == 0)
>               set_bit(ifnum, &ps->ifclaimed);
>       return err;
> @@ -778,7 +783,9 @@ static int releaseintf(struct usb_dev_st
>       if (!intf)
>               err = -ENOENT;
>       else if (test_and_clear_bit(ifnum, &ps->ifclaimed)) {
> +             alantest = 1;
>               usb_driver_release_interface(&usbfs_driver, intf);
> +             alantest = 0;
>               err = 0;
>       }
>       return err;
> Index: usb-4.x/drivers/usb/core/hub.c
> ===================================================================
> --- usb-4.x.orig/drivers/usb/core/hub.c
> +++ usb-4.x/drivers/usb/core/hub.c
> @@ -33,6 +33,8 @@
>   #include "hub.h"
>   #include "otg_whitelist.h"
> 
> +extern int alantest;
> +
>   #define USB_VENDOR_GENESYS_LOGIC            0x05e3
>   #define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND    0x01
> 
> @@ -4054,6 +4056,11 @@ int usb_disable_lpm(struct usb_device *u
>       if ((udev->u1_params.timeout == 0 && udev->u2_params.timeout == 0))
>               return 0;
> 
> +     if (alantest) {
> +             pr_info("disable LPM\n");
> +             dump_stack();
> +     }
> +
>       /* If LPM is enabled, attempt to disable it. */
>       if (usb_disable_link_state(hcd, udev, USB3_LPM_U1))
>               goto enable_lpm;
> @@ -4121,6 +4128,11 @@ void usb_enable_lpm(struct usb_device *u
>       if (!hub)
>               return;
> 
> +     if (alantest) {
> +             pr_info("enable LPM\n");
> +             dump_stack();
> +     }
> +
>       port_dev = hub->ports[udev->portnum - 1];
> 
>       if (port_dev->usb3_lpm_u1_permit)
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> [prev in list] [next in list] [prev in thread] [next in thread]
> 
> 
> Configure | About | News | Add a list | Sponsored by KoreLogic
> 
> 
> 
> -- 
> ============================================================
> Matthew Giassa, MASc, BASc, EIT
> Security and Embedded Systems Specialist
> linkedin: https://ca.linkedin.com/in/giassa
> e-mail:   [email protected]
> website:  www.giassa.net
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to