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");
 
        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);
        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");
 
         */
        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;
 
        *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)
        *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)
 {
 
 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);
 
 #endif
 };
 
+struct dev_state;
+
 /* ----------------------------------------------------------------------- */
 
 struct usb_tt;
                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