diff options
-rw-r--r-- | drivers/staging/usbip/stub_dev.c | 22 | ||||
-rw-r--r-- | drivers/usb/core/hub.c | 2 | ||||
-rw-r--r-- | drivers/usb/core/usb.h | 4 | ||||
-rw-r--r-- | include/linux/usb.h | 7 |
4 files changed, 31 insertions, 4 deletions
diff --git a/drivers/staging/usbip/stub_dev.c b/drivers/staging/usbip/stub_dev.c index ee899f01c008..952743c752d7 100644 --- a/drivers/staging/usbip/stub_dev.c +++ b/drivers/staging/usbip/stub_dev.c @@ -339,6 +339,7 @@ static int stub_probe(struct usb_device *udev) const char *udev_busid = dev_name(&udev->dev); int err = 0; struct bus_id_priv *busid_priv; + int rc; dev_dbg(&udev->dev, "Enter\n"); @@ -388,6 +389,18 @@ static int stub_probe(struct usb_device *udev) busid_priv->sdev = sdev; busid_priv->udev = udev; + /* + * Claim this hub port. + * It doesn't matter what value we pass as owner + * (struct dev_state) as long as it is unique. + */ + rc = usb_hub_claim_port(udev->parent, udev->portnum, + (struct dev_state *) udev); + if (rc) { + dev_dbg(&udev->dev, "unable to claim port\n"); + return rc; + } + err = stub_add_files(&udev->dev); if (err) { dev_err(&udev->dev, "stub_add_files for %s\n", udev_busid); @@ -424,6 +437,7 @@ static void stub_disconnect(struct usb_device *udev) struct stub_device *sdev; const char *udev_busid = dev_name(&udev->dev); struct bus_id_priv *busid_priv; + int rc; dev_dbg(&udev->dev, "Enter\n"); @@ -448,6 +462,14 @@ static void stub_disconnect(struct usb_device *udev) */ stub_remove_files(&udev->dev); + /* release port */ + rc = usb_hub_release_port(udev->parent, udev->portnum, + (struct dev_state *) udev); + if (rc) { + dev_dbg(&udev->dev, "unable to release port\n"); + return; + } + /* If usb reset is called from event handler */ if (busid_priv->sdev->ud.eh == current) return; diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 64ea21971be2..e4849333c8de 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -1819,6 +1819,7 @@ int usb_hub_claim_port(struct usb_device *hdev, unsigned port1, *powner = owner; return rc; } +EXPORT_SYMBOL_GPL(usb_hub_claim_port); int usb_hub_release_port(struct usb_device *hdev, unsigned port1, struct dev_state *owner) @@ -1834,6 +1835,7 @@ int usb_hub_release_port(struct usb_device *hdev, unsigned port1, *powner = NULL; return rc; } +EXPORT_SYMBOL_GPL(usb_hub_release_port); void usb_hub_release_all_ports(struct usb_device *hdev, struct dev_state *owner) { diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h index 823857767a16..222bbd2618f1 100644 --- a/drivers/usb/core/usb.h +++ b/drivers/usb/core/usb.h @@ -57,10 +57,6 @@ extern int usb_match_device(struct usb_device *dev, extern void usb_forced_unbind_intf(struct usb_interface *intf); extern void usb_rebind_intf(struct usb_interface *intf); -extern int usb_hub_claim_port(struct usb_device *hdev, unsigned port, - struct dev_state *owner); -extern int usb_hub_release_port(struct usb_device *hdev, unsigned port, - struct dev_state *owner); extern void usb_hub_release_all_ports(struct usb_device *hdev, struct dev_state *owner); extern bool usb_device_is_owned(struct usb_device *udev); diff --git a/include/linux/usb.h b/include/linux/usb.h index 22de4affe9c8..140a6a3e7d56 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -366,6 +366,8 @@ struct usb_bus { #endif }; +struct dev_state; + /* ----------------------------------------------------------------------- */ struct usb_tt; @@ -749,6 +751,11 @@ extern struct usb_host_interface *usb_find_alt_setting( unsigned int iface_num, unsigned int alt_num); +/* port claiming functions */ +int usb_hub_claim_port(struct usb_device *hdev, unsigned port1, + struct dev_state *owner); +int usb_hub_release_port(struct usb_device *hdev, unsigned port1, + struct dev_state *owner); /** * usb_make_path - returns stable device path in the usb tree |