mirror of https://gitee.com/openkylin/linux.git
usb: interface authorization: Introduces the USB interface authorization
The kernel supports the device authorization because of wireless USB. These is usable for wired USB devices, too. These new interface authorization allows to enable or disable individual interfaces instead a whole device. If a deauthorized interface will be authorized so the driver probing must be triggered manually by writing INTERFACE to /sys/bus/usb/drivers_probe Signed-off-by: Stefan Koch <stefan.koch10@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
8d1f8573a3
commit
b3910cef39
|
@ -1555,6 +1555,44 @@ static void usb_release_interface(struct device *dev)
|
||||||
kfree(intf);
|
kfree(intf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* usb_deauthorize_interface - deauthorize an USB interface
|
||||||
|
*
|
||||||
|
* @intf: USB interface structure
|
||||||
|
*/
|
||||||
|
void usb_deauthorize_interface(struct usb_interface *intf)
|
||||||
|
{
|
||||||
|
struct device *dev = &intf->dev;
|
||||||
|
|
||||||
|
device_lock(dev->parent);
|
||||||
|
|
||||||
|
if (intf->authorized) {
|
||||||
|
device_lock(dev);
|
||||||
|
intf->authorized = 0;
|
||||||
|
device_unlock(dev);
|
||||||
|
|
||||||
|
usb_forced_unbind_intf(intf);
|
||||||
|
}
|
||||||
|
|
||||||
|
device_unlock(dev->parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* usb_authorize_interface - authorize an USB interface
|
||||||
|
*
|
||||||
|
* @intf: USB interface structure
|
||||||
|
*/
|
||||||
|
void usb_authorize_interface(struct usb_interface *intf)
|
||||||
|
{
|
||||||
|
struct device *dev = &intf->dev;
|
||||||
|
|
||||||
|
if (!intf->authorized) {
|
||||||
|
device_lock(dev);
|
||||||
|
intf->authorized = 1; /* authorize interface */
|
||||||
|
device_unlock(dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int usb_if_uevent(struct device *dev, struct kobj_uevent_env *env)
|
static int usb_if_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||||
{
|
{
|
||||||
struct usb_device *usb_dev;
|
struct usb_device *usb_dev;
|
||||||
|
|
|
@ -27,6 +27,8 @@ extern void usb_release_interface_cache(struct kref *ref);
|
||||||
extern void usb_disable_device(struct usb_device *dev, int skip_ep0);
|
extern void usb_disable_device(struct usb_device *dev, int skip_ep0);
|
||||||
extern int usb_deauthorize_device(struct usb_device *);
|
extern int usb_deauthorize_device(struct usb_device *);
|
||||||
extern int usb_authorize_device(struct usb_device *);
|
extern int usb_authorize_device(struct usb_device *);
|
||||||
|
extern void usb_deauthorize_interface(struct usb_interface *);
|
||||||
|
extern void usb_authorize_interface(struct usb_interface *);
|
||||||
extern void usb_detect_quirks(struct usb_device *udev);
|
extern void usb_detect_quirks(struct usb_device *udev);
|
||||||
extern void usb_detect_interface_quirks(struct usb_device *udev);
|
extern void usb_detect_interface_quirks(struct usb_device *udev);
|
||||||
extern int usb_remove_device(struct usb_device *udev);
|
extern int usb_remove_device(struct usb_device *udev);
|
||||||
|
|
Loading…
Reference in New Issue