if (oldspeed == USB_SPEED_LOW)
                delay = HUB_LONG_RESET_TIME;
 
-       mutex_lock(hcd->address0_mutex);
-
        /* Reset the device; full speed may morph to high speed */
        /* FIXME a USB 2.0 device may morph into SuperSpeed on reset. */
        retval = hub_port_reset(hub, port1, udev, delay, false);
                hub_port_disable(hub, port1, 0);
                update_devnum(udev, devnum);    /* for disconnect processing */
        }
-       mutex_unlock(hcd->address0_mutex);
        return retval;
 }
 
                unit_load = 100;
 
        status = 0;
+
+       mutex_lock(hcd->address0_mutex);
+
        for (i = 0; i < PORT_INIT_TRIES; i++) {
 
                /* reallocate for each attempt, since references
                if (status < 0)
                        goto loop;
 
+               mutex_unlock(hcd->address0_mutex);
+
                if (udev->quirks & USB_QUIRK_DELAY_INIT)
                        msleep(2000);
 
 
 loop_disable:
                hub_port_disable(hub, port1, 1);
+               mutex_lock(hcd->address0_mutex);
 loop:
                usb_ep0_reinit(udev);
                release_devnum(udev);
        }
 
 done:
+       mutex_unlock(hcd->address0_mutex);
+
        hub_port_disable(hub, port1, 1);
        if (hcd->driver->relinquish_port && !hub->hdev->parent) {
                if (status != -ENOTCONN && status != -ENODEV)
        bos = udev->bos;
        udev->bos = NULL;
 
+       mutex_lock(hcd->address0_mutex);
+
        for (i = 0; i < PORT_INIT_TRIES; ++i) {
 
                /* ep0 maxpacket size may change; let the HCD know about it.
                if (ret >= 0 || ret == -ENOTCONN || ret == -ENODEV)
                        break;
        }
+       mutex_unlock(hcd->address0_mutex);
 
        if (ret < 0)
                goto re_enumerate;