Am Donnerstag, 12. Oktober 2006 19:10 schrieb Alan Stern:
> On Thu, 12 Oct 2006, Oliver Neukum wrote:
>
> > Hi,
> >
> > I can't boot 2.6.19-rc1, so here's an incomplete version of autosuspend
> > for hid to invite comments on the basic approach.
> >
> > Regards
> > Oliver
> >
> > --- linux-2.6.19-rc1/drivers/usb/input/hid.h 2006-10-05
> > 04:57:05.000000000 +0200
> > +++ gregtree/drivers/usb/input/hid.h 2006-10-09 15:20:21.000000000
> > +0200
> > @@ -384,6 +384,9 @@
> > #define HID_IN_RUNNING 3
> > #define HID_RESET_PENDING 4
> > #define HID_SUSPENDED 5
> > +#define HID_IN_IDLE 6
> > +
> > +#define HID_IDLE_TIME 200*HZ
>
> This will need to be configurable separately for each device.
I'd prefer to read it from sysfs managed by usbcore.
> > int hid_open(struct hid_device *hid)
> > {
> > - ++hid->open;
> > + clear_bit(HID_IN_IDLE, &hid->iofl);
> > + if (!hid->open++)
> > + usb_autopm_get_interface(hid->intf);
> > if (hid_start_in(hid))
> > hid_io_error(hid);
> > return 0;
> > @@ -1375,8 +1383,10 @@
> >
> > void hid_close(struct hid_device *hid)
> > {
> > - if (!--hid->open)
> > + if (!--hid->open) {
> > usb_kill_urb(hid->urbin);
> > + set_bit(HID_IN_IDLE, &hid->iofl);
> > + }
> > }
>
> There needs to be a call to usb_autopm_put_interface() here, to balance
> the call in hid_open().
Why? The device is idle now.
> > +void hid_add_idle_timer(struct hid_device *hid)
> > +{
> > + hid->idle_timer.expires = jiffies + HID_IDLE_TIME;
> > + add_timer(&hid->idle_timer);
> > +}
> > +
> > +static void hid_mod_idle_timer(struct hid_device *hid)
> > +{
> > + unsigned long flags;
> > +
> > + spin_lock_irqsave(&hid->inlock, flags);
> > + if (usb_get_intfdata(hid->intf))
> > + mod_timer(&hid->idle_timer, jiffies + HID_IDLE_TIME);
> > + spin_unlock_irqrestore(&hid->inlock, flags);
> > +}
>
> It's not obvious why you need two separate functions (you can always call
> mod_timer in place of add_timer), or why you need the spinlock.
OK, I'll unify this. It just seemed cleaner.
> usb_get_intfdata() here isn't safe; if the value can be 0 then it can also
> be anything else, since a different driver may be bound to the interface.
> It would be better to have an "unbound" flag in the hid_device structure.
Yes.
> On the other hand, why do you need to check this at all? This routine
> won't get called after the driver is unbound.
But during.
> > +static void __hid_report_idle(void *d)
> > +{
> > + struct usb_interface *intf = d;
> > +
> > + usb_autopm_put_interface(intf);
> > +}
>
> This call needs to be balanced somewhere. Otherwise intf->pm_usage_cnt
> will be decremented at every timeout and never incremented. See below.
Right.
Regards
Oliver
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel