On Thu, 27 Sep 2007, Oliver Neukum wrote:

> @@ -528,12 +537,20 @@ exit:
>  static int atp_open(struct input_dev *input)
>  {
>       struct atp *dev = input_get_drvdata(input);
> +     int rv = 0;
>  
> -     if (usb_submit_urb(dev->urb, GFP_ATOMIC))
> +     if (usb_autopm_get_interface(dev->intf) < 0)
>               return -EIO;
> +     dev->intf->needs_remote_wakeup = 1;
> +     if (usb_submit_urb(dev->urb, GFP_KERNEL)) {
> +             rv = -EIO;
> +             dev->intf->needs_remote_wakeup = 0;
> +             goto err;
>  
>       dev->open = 1;
> -     return 0;
> +err:
> +     usb_autopm_put_interface(dev->intf);
> +     return rv;
>  }
>  
>  static void atp_close(struct input_dev *input)
> @@ -543,6 +560,7 @@ static void atp_close(struct input_dev *
>       usb_kill_urb(dev->urb);
>       cancel_work_sync(&dev->work);
>       dev->open = 0;
> +     dev->intf->needs_remote_wakeup = 0;
>  }

Doesn't atp_close() need to call usb_autopm_put_interface(), to balance 
the usb_autopm_get_interface() call in atp_open()?

Alan Stern

Reply via email to