Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b71ee6e2 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

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

parents fea2d257 8d6559d4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2412,6 +2412,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);

+31 −0
Original line number Diff line number Diff line
@@ -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);
}
+1 −0
Original line number Diff line number Diff line
@@ -177,6 +177,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);

+3 −0
Original line number Diff line number Diff line
@@ -1887,8 +1887,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;