[patch]a lockless method to alter pm count

Oliver Neukum <[email protected]>
Newsgroups gmane.linux.usb.devel
Organization Novell
Message-ID <[email protected]>
Hi,

some drivers'll need a lockless method to alter the pm count in order
to take locks by themselves in correct order.

	Regards
		Oliver

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

--- a/include/linux/usb.h	2007-04-24 14:12:23.000000000 +0200
+++ b/include/linux/usb.h	2007-04-24 14:25:13.000000000 +0200
@@ -424,6 +424,8 @@ extern struct usb_device *usb_find_devic
 extern int usb_autopm_set_interface(struct usb_interface *intf);
 extern int usb_autopm_get_interface(struct usb_interface *intf);
 extern void usb_autopm_put_interface(struct usb_interface *intf);
+extern int usb_autopm_do_interface(struct usb_interface *intf, int inc_usage_cnt);
+extern int __usb_autopm_do_interface(struct usb_interface *intf, int inc_usage_cnt);
 
 static inline void usb_autopm_enable(struct usb_interface *intf)
 {
@@ -451,6 +453,11 @@ static inline void usb_autopm_enable(str
 { }
 static inline void usb_autopm_disable(struct usb_interface *intf)
 { }
+extern int usb_autopm_do_interface(struct usb_interface *intf, int inc_usage_cnt);
+{ return 0; }
+extern int __usb_autopm_do_interface(struct usb_interface *intf, int inc_usage_cnt);
+{ return 0; }
+
 #endif
 
 /*-------------------------------------------------------------------------*/
--- a/drivers/usb/core/driver.c	2007-04-24 13:48:42.000000000 +0200
+++ b/drivers/usb/core/driver.c	2007-04-24 14:20:45.000000000 +0200
@@ -1276,13 +1276,12 @@ int usb_autoresume_device(struct usb_dev
 /* Internal routine to adjust an interface's usage counter and change
  * its device's autosuspend state.
  */
-static int usb_autopm_do_interface(struct usb_interface *intf,
+int __usb_autopm_do_interface(struct usb_interface *intf,
 		int inc_usage_cnt)
 {
 	struct usb_device	*udev = interface_to_usbdev(intf);
 	int			status = 0;
 
-	usb_pm_lock(udev);
 	if (intf->condition == USB_INTERFACE_UNBOUND)
 		status = -ENODEV;
 	else {
@@ -1296,10 +1295,23 @@ static int usb_autopm_do_interface(struc
 			queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend,
 					udev->autosuspend_delay);
 	}
-	usb_pm_unlock(udev);
 	return status;
 }
+EXPORT_SYMBOL_GPL(__usb_autopm_do_interface);
+
+int usb_autopm_do_interface(struct usb_interface *intf,
+		int inc_usage_cnt)
+{
+	int r;
+	struct usb_device	*udev = interface_to_usbdev(intf);
 
+	usb_pm_lock(udev);
+	r = __usb_autopm_do_interface(intf, inc_usage_cnt);
+	usb_pm_unlock(udev);
+
+	return r;
+}
+EXPORT_SYMBOL_GPL(usb_autopm_do_interface);
 /**
  * usb_autopm_put_interface - decrement a USB interface's PM-usage counter
  * @intf: the usb_interface whose counter should be decremented


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