MODULE_FIRMWARE("isl3886usb");
 MODULE_FIRMWARE("isl3887usb");
 
+static struct usb_driver p54u_driver;
+
 /*
  * Note:
  *
 {
        struct p54u_priv *priv = context;
        struct usb_device *udev = priv->udev;
+       struct usb_interface *intf = priv->intf;
        int err;
 
-       complete(&priv->fw_wait_load);
        if (firmware) {
                priv->fw = firmware;
                err = p54u_start_ops(priv);
                dev_err(&udev->dev, "Firmware not found.\n");
        }
 
-       if (err) {
-               struct device *parent = priv->udev->dev.parent;
-
-               dev_err(&udev->dev, "failed to initialize device (%d)\n", err);
-
-               if (parent)
-                       device_lock(parent);
+       complete(&priv->fw_wait_load);
+       /*
+        * At this point p54u_disconnect may have already freed
+        * the "priv" context. Do not use it anymore!
+        */
+       priv = NULL;
 
-               device_release_driver(&udev->dev);
-               /*
-                * At this point p54u_disconnect has already freed
-                * the "priv" context. Do not use it anymore!
-                */
-               priv = NULL;
+       if (err) {
+               dev_err(&intf->dev, "failed to initialize device (%d)\n", err);
 
-               if (parent)
-                       device_unlock(parent);
+               usb_lock_device(udev);
+               usb_driver_release_interface(&p54u_driver, intf);
+               usb_unlock_device(udev);
        }
 
-       usb_put_dev(udev);
+       usb_put_intf(intf);
 }
 
 static int p54u_load_firmware(struct ieee80211_hw *dev,
        dev_info(&priv->udev->dev, "Loading firmware file %s\n",
               p54u_fwlist[i].fw);
 
-       usb_get_dev(udev);
+       usb_get_intf(intf);
        err = request_firmware_nowait(THIS_MODULE, 1, p54u_fwlist[i].fw,
                                      device, GFP_KERNEL, priv,
                                      p54u_load_firmware_cb);
        if (err) {
                dev_err(&priv->udev->dev, "(p54usb) cannot load firmware %s "
                                          "(%d)!\n", p54u_fwlist[i].fw, err);
-               usb_put_dev(udev);
+               usb_put_intf(intf);
        }
 
        return err;
        skb_queue_head_init(&priv->rx_queue);
        init_usb_anchor(&priv->submitted);
 
-       usb_get_dev(udev);
-
        /* really lazy and simple way of figuring out if we're a 3887 */
        /* TODO: should just stick the identification in the device table */
        i = intf->altsetting->desc.bNumEndpoints;
                priv->upload_fw = p54u_upload_firmware_net2280;
        }
        err = p54u_load_firmware(dev, intf);
-       if (err) {
-               usb_put_dev(udev);
+       if (err)
                p54_free_common(dev);
-       }
        return err;
 }
 
        wait_for_completion(&priv->fw_wait_load);
        p54_unregister_common(dev);
 
-       usb_put_dev(interface_to_usbdev(intf));
        release_firmware(priv->fw);
        p54_free_common(dev);
 }