Am Donnerstag 27 September 2007 schrieb Alan Stern: > 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()?
No, the get is balanced in atp_open() itself. The patch uses the last_busy mechanism the same way the version for generic hid does. In fact, it is only necessary because there's no nice API call for setting needs_remote_wakeup. Regards Oliver