mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-28 20:02:17 +00:00
![Alan Stern](/assets/img/avatar_default.png)
Currently we rely on intf->dev.power.power_state.event for tracking whether intf is suspended. This is not a reliable technique because that value is owned by the PM core, not by usbcore. This patch (as718b) adds a new flag so that we can accurately tell which interfaces are suspended and which aren't. At first one might think these flags aren't needed, since interfaces will be suspended along with their devices. It turns out there are a couple of intermediate situations where that's not quite true, such as while processing a remote-wakeup request. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
110 lines
3.5 KiB
C
110 lines
3.5 KiB
C
/* Functions local to drivers/usb/core/ */
|
|
|
|
extern void usb_create_sysfs_dev_files (struct usb_device *dev);
|
|
extern void usb_remove_sysfs_dev_files (struct usb_device *dev);
|
|
extern void usb_create_sysfs_intf_files (struct usb_interface *intf);
|
|
extern void usb_remove_sysfs_intf_files (struct usb_interface *intf);
|
|
extern void usb_create_ep_files(struct device *parent, struct usb_host_endpoint *endpoint,
|
|
struct usb_device *udev);
|
|
extern void usb_remove_ep_files(struct usb_host_endpoint *endpoint);
|
|
|
|
extern void usb_disable_endpoint (struct usb_device *dev, unsigned int epaddr);
|
|
extern void usb_disable_interface (struct usb_device *dev,
|
|
struct usb_interface *intf);
|
|
extern void usb_release_interface_cache(struct kref *ref);
|
|
extern void usb_disable_device (struct usb_device *dev, int skip_ep0);
|
|
|
|
extern int usb_get_device_descriptor(struct usb_device *dev,
|
|
unsigned int size);
|
|
extern char *usb_cache_string(struct usb_device *udev, int index);
|
|
extern int usb_set_configuration(struct usb_device *dev, int configuration);
|
|
|
|
extern void usb_kick_khubd(struct usb_device *dev);
|
|
extern void usb_suspend_root_hub(struct usb_device *hdev);
|
|
extern void usb_resume_root_hub(struct usb_device *dev);
|
|
|
|
extern int usb_hub_init(void);
|
|
extern void usb_hub_cleanup(void);
|
|
extern int usb_major_init(void);
|
|
extern void usb_major_cleanup(void);
|
|
extern int usb_host_init(void);
|
|
extern void usb_host_cleanup(void);
|
|
|
|
extern int usb_suspend_both(struct usb_device *udev, pm_message_t msg);
|
|
extern int usb_resume_both(struct usb_device *udev);
|
|
extern int usb_port_suspend(struct usb_device *dev);
|
|
extern int usb_port_resume(struct usb_device *dev);
|
|
|
|
extern struct bus_type usb_bus_type;
|
|
extern struct usb_device_driver usb_generic_driver;
|
|
|
|
/* Here's how we tell apart devices and interfaces. Luckily there's
|
|
* no such thing as a platform USB device, so we can steal the use
|
|
* of the platform_data field. */
|
|
|
|
static inline int is_usb_device(struct device *dev)
|
|
{
|
|
return dev->platform_data == &usb_generic_driver;
|
|
}
|
|
|
|
/* Do the same for device drivers and interface drivers. */
|
|
|
|
static inline int is_usb_device_driver(struct device_driver *drv)
|
|
{
|
|
return container_of(drv, struct usbdrv_wrap, driver)->
|
|
for_devices;
|
|
}
|
|
|
|
/* Interfaces and their "power state" are owned by usbcore */
|
|
|
|
static inline void mark_active(struct usb_interface *f)
|
|
{
|
|
f->is_active = 1;
|
|
}
|
|
|
|
static inline void mark_quiesced(struct usb_interface *f)
|
|
{
|
|
f->is_active = 0;
|
|
}
|
|
|
|
static inline int is_active(struct usb_interface *f)
|
|
{
|
|
return f->is_active;
|
|
}
|
|
|
|
|
|
/* for labeling diagnostics */
|
|
extern const char *usbcore_name;
|
|
|
|
/* usbfs stuff */
|
|
extern struct mutex usbfs_mutex;
|
|
extern struct usb_driver usbfs_driver;
|
|
extern struct file_operations usbfs_devices_fops;
|
|
extern struct file_operations usbfs_device_file_operations;
|
|
extern void usbfs_conn_disc_event(void);
|
|
|
|
extern int usbdev_init(void);
|
|
extern void usbdev_cleanup(void);
|
|
|
|
struct dev_state {
|
|
struct list_head list; /* state list */
|
|
struct usb_device *dev;
|
|
struct file *file;
|
|
spinlock_t lock; /* protects the async urb lists */
|
|
struct list_head async_pending;
|
|
struct list_head async_completed;
|
|
wait_queue_head_t wait; /* wake up if a request completed */
|
|
unsigned int discsignr;
|
|
pid_t disc_pid;
|
|
uid_t disc_uid, disc_euid;
|
|
void __user *disccontext;
|
|
unsigned long ifclaimed;
|
|
u32 secid;
|
|
};
|
|
|
|
/* internal notify stuff */
|
|
extern void usb_notify_add_device(struct usb_device *udev);
|
|
extern void usb_notify_remove_device(struct usb_device *udev);
|
|
extern void usb_notify_add_bus(struct usb_bus *ubus);
|
|
extern void usb_notify_remove_bus(struct usb_bus *ubus);
|
|
|