Re: [patch]Re: autosuspend for HID devices, take #2

Oliver Neukum <[email protected]>
Newsgroups gmane.linux.usb.devel
Organization Novell
Message-ID <[email protected]>
Am Freitag, 25. Mai 2007 04:20 schrieb Alan Stern:
> On Thu, 24 May 2007, Greg KH wrote:
> 
> > On Wed, May 23, 2007 at 06:25:36PM +0200, Oliver Neukum wrote:
> > > Am Mittwoch, 23. Mai 2007 17:42 schrieb Alan Stern:
> > > > On Wed, 23 May 2007, Oliver Neukum wrote:
> > > > 
> > > > > That gives me an idea.
> > > > > Resumption of a device has to be done in task context. So if I allocate
> > > > > a private freezable work queue for HID resumption, the freezer would
> > > > > guard against illicit resumptions, wouldn't it?
> > > > 
> > > > You can use the ksuspend_usb_wq workqueue.  It already exists, is 
> > > > freezable, and is used for suspending and resuming USB devices.
> > > 
> > > This adds a clean accessor for the USB core pm workqueue.
> > 
> > But what code is using it?  I don't want to add an api call if no one
> > uses it...

I can assure you that any input driver that has some output (HID,
PID, etc) will use this.

> In fact there's a potential user in hcd.c:usb_hcd_resume_root_hub().  
> If there's to be an accessor, that routine should use it.

Done.
 
> Oliver, you should be careful about what happens when CONFIG_PM is off.  
> Under those conditions the workqueue is not created.

Done

	Regards
		Oliver
Signed-off-by: Oliver Neukum <[email protected]>
-- 

--- a/include/linux/usb.h	2007-05-23 10:20:35.000000000 +0200
+++ b/include/linux/usb.h	2007-05-23 18:08:31.000000000 +0200
@@ -1343,6 +1343,8 @@ extern int usb_set_interface(struct usb_
 /* this request isn't really synchronous, but it belongs with the others */
 extern int usb_driver_set_configuration(struct usb_device *udev, int config);
 
+extern void usb_schedule_power_work(struct work_struct *work);
+
 /*
  * timeouts, in milliseconds, used for sending/receiving control messages
  * they typically complete within a few frames (msec) after they're issued
--- a/drivers/usb/core/message.c	2007-05-22 14:50:32.000000000 +0200
+++ b/drivers/usb/core/message.c	2007-05-25 10:54:03.000000000 +0200
@@ -1648,6 +1648,24 @@ int usb_driver_set_configuration(struct 
 }
 EXPORT_SYMBOL_GPL(usb_driver_set_configuration);
 
+/**
+ * usb_schedule_power_work - allow drivers to execute work in the context of the pm thread
+ * @work: work to be executed
+ *
+ * This allows work to be scheduled which is to be executed under the
+ * same conditions pm's internal works are performed, namely to be
+ * frozen when they are frozen
+ */
+
+void usb_schedule_power_work(struct work_struct *work)
+{
+#ifdef	CONFIG_PM
+	queue_work(ksuspend_usb_wq, work);
+#endif
+}
+
+EXPORT_SYMBOL(usb_schedule_power_work);
+
 // synchronous request completion model
 EXPORT_SYMBOL(usb_control_msg);
 EXPORT_SYMBOL(usb_bulk_msg);
--- a/drivers/usb/core/hcd.c	2007-05-22 14:50:32.000000000 +0200
+++ b/drivers/usb/core/hcd.c	2007-05-25 10:53:56.000000000 +0200
@@ -1326,7 +1326,7 @@ void usb_hcd_resume_root_hub (struct usb
 
 	spin_lock_irqsave (&hcd_root_hub_lock, flags);
 	if (hcd->rh_registered)
-		queue_work(ksuspend_usb_wq, &hcd->wakeup_work);
+		usb_schedule_power_work(&hcd->wakeup_work);
 	spin_unlock_irqrestore (&hcd_root_hub_lock, flags);
 }
 EXPORT_SYMBOL_GPL(usb_hcd_resume_root_hub);

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.