Merge "usb: hcd: Add USB atomic notifier callback for HC died error"

This commit is contained in:
Linux Build Service Account 2016-08-26 22:22:36 -07:00 committed by Gerrit - the friendly Code Review server
commit c41f5ad099
4 changed files with 36 additions and 0 deletions

View file

@ -2513,6 +2513,7 @@ void usb_hc_died (struct usb_hcd *hcd)
}
spin_unlock_irqrestore (&hcd_root_hub_lock, flags);
/* Make sure that the other roothub is also deallocated. */
usb_atomic_notify_dead_bus(&hcd->self);
}
EXPORT_SYMBOL_GPL (usb_hc_died);

View file

@ -17,6 +17,7 @@
#include "usb.h"
static BLOCKING_NOTIFIER_HEAD(usb_notifier_list);
static ATOMIC_NOTIFIER_HEAD(usb_atomic_notifier_list);
/**
* usb_register_notify - register a notifier callback whenever a usb change happens
@ -67,3 +68,33 @@ void usb_notify_remove_bus(struct usb_bus *ubus)
{
blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_REMOVE, ubus);
}
/**
* usb_register_atomic_notify - register a atomic notifier callback whenever a
* HC dies
* @nb: pointer to the atomic notifier block for the callback events.
*
*/
void usb_register_atomic_notify(struct notifier_block *nb)
{
atomic_notifier_chain_register(&usb_atomic_notifier_list, nb);
}
EXPORT_SYMBOL_GPL(usb_register_atomic_notify);
/**
* usb_unregister_atomic_notify - unregister a atomic notifier callback
* @nb: pointer to the notifier block for the callback events.
*
*/
void usb_unregister_atomic_notify(struct notifier_block *nb)
{
atomic_notifier_chain_unregister(&usb_atomic_notifier_list, nb);
}
EXPORT_SYMBOL_GPL(usb_unregister_atomic_notify);
void usb_atomic_notify_dead_bus(struct usb_bus *ubus)
{
atomic_notifier_call_chain(&usb_atomic_notifier_list, USB_BUS_DIED,
ubus);
}

View file

@ -175,6 +175,7 @@ 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);
extern void usb_atomic_notify_dead_bus(struct usb_bus *ubus);
extern void usb_hub_adjust_deviceremovable(struct usb_device *hdev,
struct usb_hub_descriptor *desc);

View file

@ -1896,8 +1896,11 @@ static inline int usb_translate_errors(int error_code)
#define USB_DEVICE_REMOVE 0x0002
#define USB_BUS_ADD 0x0003
#define USB_BUS_REMOVE 0x0004
#define USB_BUS_DIED 0x0005
extern void usb_register_notify(struct notifier_block *nb);
extern void usb_unregister_notify(struct notifier_block *nb);
extern void usb_register_atomic_notify(struct notifier_block *nb);
extern void usb_unregister_atomic_notify(struct notifier_block *nb);
/* debugfs stuff */
extern struct dentry *usb_debug_root;