On Thu, 27 Sep 2007, Oliver Neukum wrote:
quoted hunk ↗ jump to hunk
@@ -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