xhci->event_ring = NULL;
        xhci_dbg(xhci, "Freed event ring\n");
 
+       if (xhci->lpm_command)
+               xhci_free_command(xhci, xhci->lpm_command);
        xhci->cmd_ring_reserved_trbs = 0;
        if (xhci->cmd_ring)
                xhci_ring_free(xhci, xhci->cmd_ring);
        xhci_write_64(xhci, val_64, &xhci->op_regs->cmd_ring);
        xhci_dbg_cmd_ptrs(xhci);
 
+       xhci->lpm_command = xhci_alloc_command(xhci, true, true, flags);
+       if (!xhci->lpm_command)
+               goto fail;
+
+       /* Reserve one command ring TRB for disabling LPM.
+        * Since the USB core grabs the shared usb_bus bandwidth mutex before
+        * disabling LPM, we only need to reserve one TRB for all devices.
+        */
+       xhci->cmd_ring_reserved_trbs++;
+
        val = xhci_readl(xhci, &xhci->cap_regs->db_off);
        val &= DBOFF_MASK;
        xhci_dbg(xhci, "// Doorbell array is located at offset 0x%x"
 
        /* slot enabling and address device helpers */
        struct completion       addr_dev;
        int slot_id;
+       /* For USB 3.0 LPM enable/disable. */
+       struct xhci_command             *lpm_command;
        /* Internal mirror of the HW's dcbaa */
        struct xhci_virt_device *devs[MAX_HC_SLOTS];
        /* For keeping track of bandwidth domains per roothub. */