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/ _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel