On Thu, 27 Sep 2007, Oliver Neukum wrote:

> 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.

I see; I misread the patch.

>  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.

That's okay; even if there were a nice API call for setting 
needs_remote_wakeup you would still have to call
usb_autopm_get_interface().  This is because we don't keep track of 
whether or not remote wakeup is currently enabled on a suspended 
device; we only keep track of whether it should be enabled when the 
next suspend occurs.

Alan Stern

Reply via email to