diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-01-11 03:41:39 +0100 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-01-11 03:41:39 +0100 | 
| commit | abede81c4fb2e3b85d8760f25e3da39d2c69a134 (patch) | |
| tree | 26c893ec108d837eb9171d678c55a1cea7b22af4 /include/linux/usb.h | |
| parent | c9d557c19f94df42db78d4a5de4d25feee694bad (diff) | |
| parent | c59765042f53a79a7a65585042ff463b69cb248c (diff) | |
Merge commit 'v2.6.29-rc1' into core/urgent
Diffstat (limited to 'include/linux/usb.h')
| -rw-r--r-- | include/linux/usb.h | 30 | 
1 files changed, 23 insertions, 7 deletions
diff --git a/include/linux/usb.h b/include/linux/usb.h index f72aa51f7bcd..85ee9be9361e 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -108,6 +108,7 @@ enum usb_interface_condition {   *	(in probe()), bound to a driver, or unbinding (in disconnect())   * @is_active: flag set when the interface is bound and not suspended.   * @sysfs_files_created: sysfs attributes exist + * @ep_devs_created: endpoint child pseudo-devices exist   * @unregistering: flag set when the interface is being unregistered   * @needs_remote_wakeup: flag set when the driver requires remote-wakeup   *	capability during autosuspend. @@ -120,6 +121,11 @@ enum usb_interface_condition {   *	to the sysfs representation for that device.   * @pm_usage_cnt: PM usage counter for this interface; autosuspend is not   *	allowed unless the counter is 0. + * @reset_ws: Used for scheduling resets from atomic context. + * @reset_running: set to 1 if the interface is currently running a + *      queued reset so that usb_cancel_queued_reset() doesn't try to + *      remove from the workqueue when running inside the worker + *      thread. See __usb_queue_reset_device().   *   * USB device drivers attach to interfaces on a physical device.  Each   * interface encapsulates a single high level function, such as feeding @@ -164,14 +170,17 @@ struct usb_interface {  	enum usb_interface_condition condition;		/* state of binding */  	unsigned is_active:1;		/* the interface is not suspended */  	unsigned sysfs_files_created:1;	/* the sysfs attributes exist */ +	unsigned ep_devs_created:1;	/* endpoint "devices" exist */  	unsigned unregistering:1;	/* unregistration is in progress */  	unsigned needs_remote_wakeup:1;	/* driver requires remote wakeup */  	unsigned needs_altsetting0:1;	/* switch to altsetting 0 is pending */  	unsigned needs_binding:1;	/* needs delayed unbind/rebind */ +	unsigned reset_running:1;  	struct device dev;		/* interface specific device info */  	struct device *usb_dev;  	int pm_usage_cnt;		/* usage counter for autosuspend */ +	struct work_struct reset_ws;	/* for resets in atomic context */  };  #define	to_usb_interface(d) container_of(d, struct usb_interface, dev)  #define	interface_to_usbdev(intf) \ @@ -329,7 +338,7 @@ struct usb_bus {  #endif  	struct device *dev;		/* device for this bus */ -#if defined(CONFIG_USB_MON) +#if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE)  	struct mon_bus *mon_bus;	/* non-null when associated */  	int monitored;			/* non-zero when monitored */  #endif @@ -398,6 +407,7 @@ struct usb_tt;   * @urbnum: number of URBs submitted for the whole device   * @active_duration: total time device is not suspended   * @autosuspend: for delayed autosuspends + * @autoresume: for autoresumes requested while in_interrupt   * @pm_mutex: protects PM operations   * @last_busy: time of last use   * @autosuspend_delay: in jiffies @@ -476,6 +486,7 @@ struct usb_device {  #ifdef CONFIG_PM  	struct delayed_work autosuspend; +	struct work_struct autoresume;  	struct mutex pm_mutex;  	unsigned long last_busy; @@ -505,6 +516,7 @@ extern int usb_lock_device_for_reset(struct usb_device *udev,  /* USB port reset for device reinitialization */  extern int usb_reset_device(struct usb_device *dev); +extern void usb_queue_reset_device(struct usb_interface *dev);  extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id); @@ -513,6 +525,8 @@ extern struct usb_device *usb_find_device(u16 vendor_id, u16 product_id);  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_get_interface_async(struct usb_interface *intf); +extern void usb_autopm_put_interface_async(struct usb_interface *intf);  static inline void usb_autopm_enable(struct usb_interface *intf)  { @@ -539,8 +553,13 @@ static inline int usb_autopm_set_interface(struct usb_interface *intf)  static inline int usb_autopm_get_interface(struct usb_interface *intf)  { return 0; } +static inline int usb_autopm_get_interface_async(struct usb_interface *intf) +{ return 0; } +  static inline void usb_autopm_put_interface(struct usb_interface *intf)  { } +static inline void usb_autopm_put_interface_async(struct usb_interface *intf) +{ }  static inline void usb_autopm_enable(struct usb_interface *intf)  { }  static inline void usb_autopm_disable(struct usb_interface *intf) @@ -1050,7 +1069,7 @@ struct usb_device_driver {  	void (*disconnect) (struct usb_device *udev);  	int (*suspend) (struct usb_device *udev, pm_message_t message); -	int (*resume) (struct usb_device *udev); +	int (*resume) (struct usb_device *udev, pm_message_t message);  	struct usbdrv_wrap drvwrap;  	unsigned int supports_autosuspend:1;  }; @@ -1321,7 +1340,7 @@ struct urb {  	struct kref kref;		/* reference count of the URB */  	void *hcpriv;			/* private data for host controller */  	atomic_t use_count;		/* concurrent submissions counter */ -	u8 reject;			/* submissions will fail */ +	atomic_t reject;		/* submissions will fail */  	int unlinked;			/* unlink error code */  	/* public: documented fields in the urb that can be used by drivers */ @@ -1466,6 +1485,7 @@ extern void usb_poison_urb(struct urb *urb);  extern void usb_unpoison_urb(struct urb *urb);  extern void usb_kill_anchored_urbs(struct usb_anchor *anchor);  extern void usb_poison_anchored_urbs(struct usb_anchor *anchor); +extern void usb_unpoison_anchored_urbs(struct usb_anchor *anchor);  extern void usb_unlink_anchored_urbs(struct usb_anchor *anchor);  extern void usb_anchor_urb(struct urb *urb, struct usb_anchor *anchor);  extern void usb_unanchor_urb(struct urb *urb); @@ -1722,10 +1742,6 @@ extern void usb_unregister_notify(struct notifier_block *nb);  #define err(format, arg...) printk(KERN_ERR KBUILD_MODNAME ": " \  	format "\n" , ## arg) -#define info(format, arg...) printk(KERN_INFO KBUILD_MODNAME ": " \ -	format "\n" , ## arg) -#define warn(format, arg...) printk(KERN_WARNING KBUILD_MODNAME ": " \ -	format "\n" , ## arg)  #endif  /* __KERNEL__ */  | 
