Merge "usb: hcd: Add USB atomic notifier callback for HC died error"
This commit is contained in:
commit
c41f5ad099
4 changed files with 36 additions and 0 deletions
|
@ -2513,6 +2513,7 @@ void usb_hc_died (struct usb_hcd *hcd)
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore (&hcd_root_hub_lock, flags);
|
spin_unlock_irqrestore (&hcd_root_hub_lock, flags);
|
||||||
/* Make sure that the other roothub is also deallocated. */
|
/* Make sure that the other roothub is also deallocated. */
|
||||||
|
usb_atomic_notify_dead_bus(&hcd->self);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL (usb_hc_died);
|
EXPORT_SYMBOL_GPL (usb_hc_died);
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
|
|
||||||
static BLOCKING_NOTIFIER_HEAD(usb_notifier_list);
|
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
|
* 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);
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -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_remove_device(struct usb_device *udev);
|
||||||
extern void usb_notify_add_bus(struct usb_bus *ubus);
|
extern void usb_notify_add_bus(struct usb_bus *ubus);
|
||||||
extern void usb_notify_remove_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,
|
extern void usb_hub_adjust_deviceremovable(struct usb_device *hdev,
|
||||||
struct usb_hub_descriptor *desc);
|
struct usb_hub_descriptor *desc);
|
||||||
|
|
||||||
|
|
|
@ -1896,8 +1896,11 @@ static inline int usb_translate_errors(int error_code)
|
||||||
#define USB_DEVICE_REMOVE 0x0002
|
#define USB_DEVICE_REMOVE 0x0002
|
||||||
#define USB_BUS_ADD 0x0003
|
#define USB_BUS_ADD 0x0003
|
||||||
#define USB_BUS_REMOVE 0x0004
|
#define USB_BUS_REMOVE 0x0004
|
||||||
|
#define USB_BUS_DIED 0x0005
|
||||||
extern void usb_register_notify(struct notifier_block *nb);
|
extern void usb_register_notify(struct notifier_block *nb);
|
||||||
extern void usb_unregister_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 */
|
/* debugfs stuff */
|
||||||
extern struct dentry *usb_debug_root;
|
extern struct dentry *usb_debug_root;
|
||||||
|
|
Loading…
Add table
Reference in a new issue